home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyo (Python 2.5) import wx import wx.py as wx import wx.stc as wx import wx.aui as wx import sys class InspectionTool: __shared_state = { } def __init__(self): self.__dict__ = self._InspectionTool__shared_state if not hasattr(self, 'initialized'): self.initialized = False def Init(self, pos = wx.DefaultPosition, size = wx.Size(850, 700), config = None, locals = None, app = None): self._frame = None self._pos = pos self._size = size self._config = config self._locals = locals self._app = app if not self._app: self._app = wx.GetApp() self.initialized = True def Show(self, selectObj = None, refreshTree = False): if not self.initialized: self.Init() parent = self._app.GetTopWindow() if not selectObj: selectObj = parent if not self._frame: self._frame = InspectionFrame(parent = parent, pos = self._pos, size = self._size, config = self._config, locals = self._locals, app = self._app) if selectObj: self._frame.SetObj(selectObj) if refreshTree: self._frame.RefreshTree() self._frame.Show() if self._frame.IsIconized(): self._frame.Iconize(False) self._frame.Raise() class InspectionFrame(wx.Frame): def __init__(self, wnd = None, locals = None, config = None, app = None, title = 'wxPython Widget Inspection Tool', *args, **kw): kw['title'] = title wx.Frame.__init__(self, *args, **kw) self.includeSizers = False self.started = False self.SetIcon(Icon.GetIcon()) self.MakeToolBar() panel = wx.Panel(self, size = self.GetClientSize()) self.mgr = wx.aui.AuiManager(panel, wx.aui.AUI_MGR_DEFAULT | wx.aui.AUI_MGR_TRANSPARENT_DRAG | wx.aui.AUI_MGR_ALLOW_ACTIVE_PANE) self.tree = InspectionTree(panel) self.info = InspectionInfoPanel(panel, style = wx.NO_BORDER) if not locals: locals = { } myIntroText = "Python %s on %s\nNOTE: The 'obj' variable refers to the object selected in the tree." % (sys.version.split()[0], sys.platform) self.crust = wx.py.crust.Crust(panel, locals = locals, intro = myIntroText, showInterpIntro = False, style = wx.NO_BORDER) self.locals = self.crust.shell.interp.locals self.crust.shell.interp.introText = '' self.locals['obj'] = self.obj = wnd self.locals['app'] = app self.locals['wx'] = wx wx.CallAfter(self._postStartup) self.mgr.AddPane(self.info, wx.aui.AuiPaneInfo().Name('info').Caption('Object Info').CenterPane().CaptionVisible(True).CloseButton(False).MaximizeButton(True)) self.mgr.AddPane(self.tree, wx.aui.AuiPaneInfo().Name('tree').Caption('Widget Tree').CaptionVisible(True).Left().Dockable(True).Floatable(True).BestSize((280, 200)).CloseButton(False).MaximizeButton(True)) self.mgr.AddPane(self.crust, wx.aui.AuiPaneInfo().Name('crust').Caption('PyCrust').CaptionVisible(True).Bottom().Dockable(True).Floatable(True).BestSize((400, 200)).CloseButton(False).MaximizeButton(True)) self.mgr.Update() if config is None: config = wx.Config('wxpyinspector') self.config = config self.Bind(wx.EVT_CLOSE, self.OnClose) self.LoadSettings(self.config) self.crust.shell.lineNumbers = False self.crust.shell.setDisplayLineNumbers(False) self.crust.shell.SetMarginWidth(1, 0) def MakeToolBar(self): tbar = self.CreateToolBar(wx.TB_HORIZONTAL | wx.TB_FLAT | wx.TB_TEXT | wx.NO_BORDER) tbar.SetToolBitmapSize((24, 24)) refreshBmp = Refresh.GetBitmap() findWidgetBmp = Find.GetBitmap() showSizersBmp = ShowSizers.GetBitmap() toggleFillingBmp = ShowFilling.GetBitmap() refreshTool = tbar.AddLabelTool(-1, 'Refresh', refreshBmp, shortHelp = 'Refresh widget tree') findWidgetTool = tbar.AddLabelTool(-1, 'Find', findWidgetBmp, shortHelp = 'Find new target widget. Click here and\nthen on another widget in the app.') showSizersTool = tbar.AddLabelTool(-1, 'Sizers', showSizersBmp, shortHelp = 'Include sizers in widget tree', kind = wx.ITEM_CHECK) toggleFillingTool = tbar.AddLabelTool(-1, 'Filling', toggleFillingBmp, shortHelp = "Show PyCrust 'filling'", kind = wx.ITEM_CHECK) tbar.Realize() self.Bind(wx.EVT_TOOL, self.OnRefreshTree, refreshTool) self.Bind(wx.EVT_TOOL, self.OnFindWidget, findWidgetTool) self.Bind(wx.EVT_TOOL, self.OnShowSizers, showSizersTool) self.Bind(wx.EVT_TOOL, self.OnToggleFilling, toggleFillingTool) self.Bind(wx.EVT_UPDATE_UI, self.OnShowSizersUI, showSizersTool) self.Bind(wx.EVT_UPDATE_UI, self.OnToggleFillingUI, toggleFillingTool) def _postStartup(self): if self.crust.ToolsShown(): self.crust.ToggleTools() self.UpdateInfo() self.started = True def OnClose(self, evt): self.SaveSettings(self.config) self.mgr.UnInit() del self.mgr evt.Skip() def UpdateInfo(self): self.info.Update(self.obj) def SetObj(self, obj): if self.obj is obj: return None self.locals['obj'] = self.obj = obj self.UpdateInfo() if not self.tree.built: self.tree.BuildTree(obj, includeSizers = self.includeSizers) else: self.tree.SelectObj(obj) def RefreshTree(self): self.tree.BuildTree(self.obj, includeSizers = self.includeSizers) def OnRefreshTree(self, evt): self.RefreshTree() self.UpdateInfo() def OnFindWidget(self, evt): self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnCaptureLost) self.CaptureMouse() self.finding = wx.BusyInfo('Click on any widget in the app...') def OnCaptureLost(self, evt): self.Unbind(wx.EVT_LEFT_DOWN) self.Unbind(wx.EVT_MOUSE_CAPTURE_LOST) del self.finding def OnLeftDown(self, evt): self.ReleaseMouse() wnd = wx.FindWindowAtPointer() if wnd is not None: self.SetObj(wnd) else: wx.Bell() self.OnCaptureLost(evt) def OnShowSizers(self, evt): self.includeSizers = not (self.includeSizers) self.RefreshTree() def OnToggleFilling(self, evt): self.crust.ToggleTools() def OnShowSizersUI(self, evt): evt.Check(self.includeSizers) def OnToggleFillingUI(self, evt): if self.started: evt.Check(self.crust.ToolsShown()) def LoadSettings(self, config): self.crust.LoadSettings(config) self.info.LoadSettings(config) pos = wx.Point(config.ReadInt('Window/PosX', -1), config.ReadInt('Window/PosY', -1)) size = wx.Size(config.ReadInt('Window/Width', -1), config.ReadInt('Window/Height', -1)) self.SetSize(size) self.Move(pos) perspective = config.Read('perspective', '') if perspective: self.mgr.LoadPerspective(perspective) self.includeSizers = config.ReadBool('includeSizers', False) def SaveSettings(self, config): self.crust.SaveSettings(config) self.info.SaveSettings(config) if not self.IsIconized() and not self.IsMaximized(): (w, h) = self.GetSize() config.WriteInt('Window/Width', w) config.WriteInt('Window/Height', h) (px, py) = self.GetPosition() config.WriteInt('Window/PosX', px) config.WriteInt('Window/PosY', py) perspective = self.mgr.SavePerspective() config.Write('perspective', perspective) config.WriteBool('includeSizers', self.includeSizers) INCLUDE_INSPECTOR = True class InspectionTree(wx.TreeCtrl): def __init__(self, *args, **kw): wx.TreeCtrl.__init__(self, *args, **kw) self.roots = [] self.built = False self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelectionChanged) self.toolFrame = wx.GetTopLevelParent(self) if 'wxMac' in wx.PlatformInfo: self.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) def BuildTree(self, startWidget, includeSizers = False): if self.GetCount(): self.DeleteAllItems() self.roots = [] self.built = False realRoot = self.AddRoot('Top-level Windows') for w in wx.GetTopLevelWindows(): if w is wx.GetTopLevelParent(self) and not INCLUDE_INSPECTOR: continue root = self._AddWidget(realRoot, w, includeSizers) self.roots.append(root) if not startWidget or not isinstance(startWidget, wx.Window): startWidget = wx.GetApp().GetTopWindow() top = wx.GetTopLevelParent(startWidget) topItem = self.FindWidgetItem(top) if topItem: self.ExpandAllChildren(topItem) self.SelectObj(startWidget) self.built = True def _AddWidget(self, parentItem, widget, includeSizers): text = self.GetTextForWidget(widget) item = self.AppendItem(parentItem, text) self.SetItemPyData(item, widget) widgetsInSizer = [] if includeSizers and widget.GetSizer() is not None: widgetsInSizer = self._AddSizer(item, widget.GetSizer()) for child in widget.GetChildren(): if child not in widgetsInSizer and not child.IsTopLevel(): self._AddWidget(item, child, includeSizers) continue return item def _AddSizer(self, parentItem, sizer): widgets = [] text = self.GetTextForSizer(sizer) item = self.AppendItem(parentItem, text) self.SetItemPyData(item, sizer) self.SetItemTextColour(item, 'blue') for si in sizer.GetChildren(): if si.IsWindow(): w = si.GetWindow() self._AddWidget(item, w, True) widgets.append(w) continue if si.IsSizer(): widgets += self._AddSizer(item, si.GetSizer()) continue i = self.AppendItem(item, 'Spacer') self.SetItemPyData(i, si) self.SetItemTextColour(i, 'blue') return widgets def FindWidgetItem(self, widget): for item in self.roots: found = self._FindWidgetItem(widget, item) if found: return found continue def _FindWidgetItem(self, widget, item): if self.GetItemPyData(item) is widget: return item (child, cookie) = self.GetFirstChild(item) while child: found = self._FindWidgetItem(widget, child) if found: return found (child, cookie) = self.GetNextChild(item, cookie) def GetTextForWidget(self, widget): return '%s ("%s")' % (widget.__class__.__name__, widget.GetName()) def GetTextForSizer(self, sizer): return '%s' % sizer.__class__.__name__ def SelectObj(self, obj): item = self.FindWidgetItem(obj) if item: self.EnsureVisible(item) self.SelectItem(item) def OnSelectionChanged(self, evt): obj = self.GetItemPyData(evt.GetItem()) self.toolFrame.SetObj(obj) class InspectionInfoPanel(wx.stc.StyledTextCtrl): def __init__(self, *args, **kw): wx.stc.StyledTextCtrl.__init__(self, *args, **kw) FACES = FACES import wx.py.editwindow self.StyleSetSpec(wx.stc.STC_STYLE_DEFAULT, 'face:%(mono)s,size:%(size)d,back:%(backcol)s' % FACES) self.StyleClearAll() self.SetReadOnly(True) self.SetMarginType(1, 0) self.SetMarginWidth(1, 0) self.SetSelForeground(True, wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT)) self.SetSelBackground(True, wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)) def LoadSettings(self, config): zoom = config.ReadInt('View/Zoom/Info', 0) self.SetZoom(zoom) def SaveSettings(self, config): config.WriteInt('View/Zoom/Info', self.GetZoom()) def Update(self, obj): st = [] if not obj: st.append('Item is None or has been destroyed.') elif isinstance(obj, wx.Window): st += self.FmtWidget(obj) elif isinstance(obj, wx.Sizer): st += self.FmtSizer(obj) elif isinstance(obj, wx.SizerItem): st += self.FmtSizerItem(obj) self.SetReadOnly(False) self.SetText('\n'.join(st)) self.SetReadOnly(True) def Fmt(self, name, value): if isinstance(value, (str, unicode)): return " %s = '%s'" % (name, value) else: return ' %s = %s' % (name, value) def FmtWidget(self, obj): st = [ 'Widget:'] st.append(self.Fmt('name', obj.GetName())) st.append(self.Fmt('class', obj.__class__)) st.append(self.Fmt('bases', obj.__class__.__bases__)) if hasattr(obj, 'this'): st.append(self.Fmt('this', repr(obj.this))) st.append(self.Fmt('id', obj.GetId())) st.append(self.Fmt('style', obj.GetWindowStyle())) st.append(self.Fmt('pos', obj.GetPosition())) st.append(self.Fmt('size', obj.GetSize())) st.append(self.Fmt('minsize', obj.GetMinSize())) st.append(self.Fmt('bestsize', obj.GetBestSize())) st.append(self.Fmt('client size', obj.GetClientSize())) st.append(self.Fmt('IsEnabled', obj.IsEnabled())) st.append(self.Fmt('IsShown', obj.IsShown())) st.append(self.Fmt('fg color', obj.GetForegroundColour())) st.append(self.Fmt('bg color', obj.GetBackgroundColour())) st.append(self.Fmt('label', obj.GetLabel())) if hasattr(obj, 'GetTitle'): st.append(self.Fmt('title', obj.GetTitle())) if hasattr(obj, 'GetValue'): st.append(self.Fmt('value', obj.GetValue())) if obj.GetContainingSizer() is not None: st.append('') sizer = obj.GetContainingSizer() st += self.FmtSizerItem(sizer.GetItem(obj)) return st def FmtSizerItem(self, obj): if obj is None: return [ 'SizerItem: None'] st = [ 'SizerItem:'] st.append(self.Fmt('proportion', obj.GetProportion())) st.append(self.Fmt('flag', FlagsFormatter(itemFlags, obj.GetFlag()))) st.append(self.Fmt('border', obj.GetBorder())) st.append(self.Fmt('pos', obj.GetPosition())) st.append(self.Fmt('size', obj.GetSize())) st.append(self.Fmt('minsize', obj.GetMinSize())) st.append(self.Fmt('ratio', obj.GetRatio())) st.append(self.Fmt('IsWindow', obj.IsWindow())) st.append(self.Fmt('IsSizer', obj.IsSizer())) st.append(self.Fmt('IsSpacer', obj.IsSpacer())) st.append(self.Fmt('IsShown', obj.IsShown())) if isinstance(obj, wx.GBSizerItem): st.append(self.Fmt('cellpos', obj.GetPos())) st.append(self.Fmt('cellspan', obj.GetSpan())) st.append(self.Fmt('endpos', obj.GetEndPos())) return st def FmtSizer(self, obj): st = [ 'Sizer:'] st.append(self.Fmt('class', obj.__class__)) if hasattr(obj, 'this'): st.append(self.Fmt('this', repr(obj.this))) st.append(self.Fmt('pos', obj.GetPosition())) st.append(self.Fmt('size', obj.GetSize())) st.append(self.Fmt('minsize', obj.GetMinSize())) if isinstance(obj, wx.BoxSizer): st.append(self.Fmt('orientation', FlagsFormatter(orientFlags, obj.GetOrientation()))) if isinstance(obj, wx.GridSizer): st.append(self.Fmt('cols', obj.GetCols())) st.append(self.Fmt('rows', obj.GetRows())) st.append(self.Fmt('vgap', obj.GetVGap())) st.append(self.Fmt('hgap', obj.GetHGap())) if isinstance(obj, wx.FlexGridSizer): st.append(self.Fmt('rowheights', obj.GetRowHeights())) st.append(self.Fmt('colwidths', obj.GetColWidths())) st.append(self.Fmt('flexdir', FlagsFormatter(orientFlags, obj.GetFlexibleDirection()))) st.append(self.Fmt('nonflexmode', FlagsFormatter(flexmodeFlags, obj.GetNonFlexibleGrowMode()))) if isinstance(obj, wx.GridBagSizer): st.append(self.Fmt('emptycell', obj.GetEmptyCellSize())) if obj.GetContainingWindow(): si = obj.GetContainingWindow().GetSizer().GetItem(obj) if si: st.append('') st += self.FmtSizerItem(si) return st class FlagsFormatter(object): def __init__(self, d, val): self.d = d self.val = val def __str__(self): st = [] for k in self.d.keys(): if self.val & k: st.append(self.d[k]) continue if st: return '|'.join(st) else: return '0' orientFlags = { wx.HORIZONTAL: 'wx.HORIZONTAL', wx.VERTICAL: 'wx.VERTICAL' } itemFlags = { wx.TOP: 'wx.TOP', wx.BOTTOM: 'wx.BOTTOM', wx.LEFT: 'wx.LEFT', wx.RIGHT: 'wx.RIGHT', wx.EXPAND: 'wx.EXPAND', wx.SHAPED: 'wx.SHAPED', wx.STRETCH_NOT: 'wx.STRETCH_NOT', wx.ALIGN_CENTER: 'wx.ALIGN_CENTER', wx.ALIGN_LEFT: 'wx.ALIGN_LEFT', wx.ALIGN_RIGHT: 'wx.ALIGN_RIGHT', wx.ALIGN_TOP: 'wx.ALIGN_TOP', wx.ALIGN_BOTTOM: 'wx.ALIGN_BOTTOM', wx.ALIGN_CENTER_VERTICAL: 'wx.ALIGN_CENTER_VERTICAL', wx.ALIGN_CENTER_HORIZONTAL: 'wx.ALIGN_CENTER_HORIZONTAL', wx.ADJUST_MINSIZE: 'wx.ADJUST_MINSIZE', wx.FIXED_MINSIZE: 'wx.FIXED_MINSIZE' } flexmodeFlags = { wx.FLEX_GROWMODE_NONE: 'wx.FLEX_GROWMODE_NONE', wx.FLEX_GROWMODE_SPECIFIED: 'wx.FLEX_GROWMODE_SPECIFIED', wx.FLEX_GROWMODE_ALL: 'wx.FLEX_GROWMODE_ALL' } from wx.lib.embeddedimage import PyEmbeddedImage Refresh = PyEmbeddedImage('iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAABehJREFUSImdll1olNkZx3/vRzIxk5lJbMwmGHccP+JHS6VrYo3TKCvL0i0LLTRB8cbLitp6p9ibelHohVLT0BqXBnetqBQveiWF0oXiF+1FS4PUxFgbm0yYTN/JZL4nmcl7/r3IJMRlodAHDhwOz8d5/uf/PM+x+N9yADgDfAtwAAvwgafAJ8DfvsxIq3q4G86cuiHAB8C/gZLjOO/4vv8u8LWurq4lgGQy2dTQ0JDZuXPn9snJyXmgGYgBnwMGcCzwBZb7BedbgJ+5rntk69atJdd1f/D69evXtm1bAwMDDA4ONlmWxYMHD5iYmGj0fT8BhGOx2Cezs7MdKysrfwZ+DCTXgmzMaovjOPdXs1tfnwJXgX8ODQ0plUqpXC7r9OnTAmZDodDNtra2zzba2Lb9AOj8MtjGAIVCIfX29ppDhw6Z1tZWAWpvb9fNmzf9dDqtUqmksbExPxQKCdC+ffvU29ur3t5eEw6H1wL9po7KunzgOM4/AB08eNBMTU3J8zxdunRJtm3r4sWLkqRCoaBkMilJunz5smzb1oULFzQ/P6/p6Wn19/cbQK7rvgQ+2higZ/v27c8A9fX1yfM8JRIJJZNJzczMKJVKqVQqKZ/PK5fLqVgsKpVKaWZmRslkUolEQouLixoYGDCAotHo34H9bEijMZvNft7W1hYJBAJf9zyPeDxOR0cHoVCIxsZGarUalmVhWRbGGILBIJFIhGAwSK1WY3h4mIcPH1qVSuVue3v75cXFxQyQBzjQ09Pz3V27dn0jEon8qv5QmpmZ0crKirLZrMrlsr4olUpF2WxW1WpVnucpGAyu4f8LYKfjOB8CBxzgSqFQ+NhxnI8zmUxfMBiMnD9/nmPHjtHY2Iht2xSLRcbHx3ny5AnPnz8nn88TCoXYtGkTxhh8f5WNExMTlMvlDtu2+4wx/cBugOeA4vG4Tp48qdHRUV+SisWicrmcJOnp06d6//331dDQINu2dfToUT169EiSlMvlVCgUJEm3bt3yBwcHdfz4cdm2rbpvXnR1dVVGRkaUy+WUz+eVTCbX95J07949NTQ0bOS6bt++LUnK5/PK5/MqFApKp9NKpVIaHR1Vd3f3MvDCZa1nuC6+72NZFsFg8K0CkbQOA4AxBmPMWzrFYpFwOIxlWdi2jWVZAJYD/KhUKr2ztLTE48ePWVpaMocPH7Z838cYQyAQIJ/P8+rVK2ZnZ5HEkSNHGBoaIhqNsry8jG3bbN68mfv375uRkRHr2bNnjI+PO0DKAq4AvbZtNxljdnR0dMTOnDnDuXPnCIfDABQKBSYnJ5mensYYw44dO9i7dy/hcBhJVCoVRkZGGB4eJpfLzXV2ds5mMpmVarX6AqDDcZzj9cL4+f9L0+bmZgEKh8O3enp6+vbs2fN94D0HKEmqxWKxYDabPRqJRN47e/YsAwMDBINBXNfFGEOlUqFarVKtVtdhCQQCACwvL1Or1VhcXKRUKk3Ozc39cWFh4V/Ay7U32rWxVczPzyuRSMjzPHmep4WFBRUKhbcYk8lk5Hme0um0EomE0um04vG4AMVisWfAPoFl1wNsT8zNbV4jTaVSIRgMcv36daLRKFevXqWlpYVyuQxAS0sLN27cIBqNcu3aNZqamlhaWkKSABKJxBYgZoEQWEOrPenTOobq7+838Xjc7N+/X4BaWlo0Njbm5/N5ZbNZ3blzx+/s7BSg1tZWxeNxxePx9fYO3AUaV69brwOgqz4s1guqtbX1t+Fw+NfA7IkTJ5TL5ZTJZHTq1CkBb4BfAp9ttHFd93dA95pvF+AgNPwVksaYHwIV13W/2d3dnX/z5s1Pd+/e7TQ3N+9LJpPdd+/exXVdPM/Dtu2XxpiRWCzWJOmrc3NzbbVa7S8rKyuXgASrqBh+AnY9i43z+aM6bbf29PR8LxAI/AlQd3f38rZt25YdxxHwB8dxvg28C+wFvrMOS30MrGdwBSytDmgLMBb8fo1eU1NT7cAE8JVEIrHx2zLt+/5/gJm66mT9oharPwsL4L/1GXlKb/xX4wAAAABJRU5ErkJggg==') Find = PyEmbeddedImage('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') ShowSizers = PyEmbeddedImage('iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAABChJREFUSIm1lU1oXFUUx3/33nn3zbx5mcm0M5OZxGlNAn6XUqlRKIIWKrXqRlCLOwvitrooqKDgRhcirkSpigSECl0WBa104UKoSIoLS8TWlja1NTOTyUzz5s37uNdFWpumJSktHriry//8zj38z7nwP4dY5/7BUqn0quu62621i9cJhSjGcTzTarUOAr/dFn1sbGy/N+SdksgoQ2bh2mFBQpTzvdP1ev3AWjkya10qpe4yPbPZ3GeUecEMswQoYK4I3w+wzWiz3qgbtw0AQoHoswWfNxyYLYE28GcVfr8IzU5gjOnfCWA5YuCvHPw0CRkLhGDjW5LeGiAFWjGcaYKyUHLAwvoeWQcgpczZjM3zA3CiD5fPAlikFXRicNy8lNJbK4das/A0VdKVJd/4oWqJZhSGVcJUeH3n5JA/NGe1OhEG/W+iKJq9LUAURe1KuVJQrrqnn4YVrXXkOE5gFCpf8NteLvdts9k8AgRXJDf0bC1ArlgsTiVJsqfX6+1K03RQLpenfd//tdvtbh0MBvdaaxe01pcGg8FFlq1wU8jNoqiUeq5Wqx3SWlutdWvTpk3vANuBbY1G423Xdecdx7EjIyOHlVLPA6X1kl4lK6XU7rGxsU+UUkue54XlcvlL4LEVL36kUql8ns/nl6SUwejo6EGl1DNcM81/r7ihRfl8fmehUHil2Wzu1Vr3Xdc9lCTJZ4PB4DhXzAlcAOa01koIMdntdqdKpZInhGjHcXx6ZT4FjDQajR21Wm2L7/sPJ0nyYr/ff1ZKOV8ul2eTJDnS6XSOsjwN4mp1cRw3s9lssVQq1cIwVEmSbNVa+9VqNTsyMjLh+/744uJiT3ied8BxnJcx6QMS0wkHUaEfJe6w4mc8v5AINWOS+KMgCGZWVuZ53taMlPtRaqovTRAv9LaTdQIn5y0oYzZkkaejOJ6mXq8fk0IkCGVxci2UnsfNz1MatSDtUN7rT0xMvLa6lePj4/v8wlAfsCVUuJFMZxh1eQMqyIFFirRerx/LGGMCYa3ioV1f8el30/w4k8V178bNfMjHL3mcPREA0U1MES3ZNK2R6Z9katpgkpBUjFLovcnJRz8QF54wxgTXVoUQl9iBzz/bniQlT39JIdecQywICfEwQwFkd4KqdAmDS8gKEMLKXZTaOVImsbyOpM1QXiPkmgBAZBApeOEsS5OSjD8gJYsG6AFkhBA5C3D6+G72vudTGYXg8gYQ0J6DDB4sK67LLISjhXQ6xLm3+OXxU6RuBGxEM0sPLFkhRC5jjDmntD5D2N4jDr8LsMCV+bCQt8Xhs0mStFYD4jhu55B/LEpx//vi/A5gieWdJLBoV+m2MeacAJ6uVqt7pZQNa+11v5MQohAEwdFut/sFcH4VY9T3/X2+7z9lre2t0mXTNP17fn7+6/V6fMfxL1klnkaQRVDaAAAAAElFTkSuQmCC') ShowFilling = PyEmbeddedImage('iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAZ5JREFUSIntlc9KAkEcxz+tu7OxLRSuGUXtIfUpukW9QJcO3nqELoLXLr2Bt47dRBAqgxJ6BqMwPJe0FEliaLNrFxV1zXatY9/TMDPf72eG3/yBf/2guaH2DrALrADtGfME8AKUgCsAdWhwX1XVbSnlMtCZEaApivrqeXJxEmBDSrl+dHQoNjf3OD9/xjSDJ5vmMre3Z1xeHi8AG/3+YcAH8GEYSbG6uoVtP2IYwQFLS2s8PT0MciYBALi5uUfTrrEsB88LDtB1C027A+h+N6cAvBUK+e6surg46wLvvSwAlHFKu/0ZfNkBvD6AEGJmwCSvrwaNRgOAZrMZKtw0zYF3KiCXy1Eul2m1WqEAhmFQq9VgrMg+QKVSoVqt4oU5QoCiKHQ6/vvpA2QyGdLpNPV6PRQgHo+Tz+fJZrPTAYlEgmQyiW3boQBCCFKpFIy+b36ArusDQ1j1vCM18B3TaDQaOrgvy7Jgyg7mgflisQiA4zihwmOxGKVSCUDvZTFOO/mL5zoSiby6rnsFHMDoDk6llA6//HBc1+1/OP8Kpi8497f1tG0HzQAAAABJRU5ErkJggg==') Icon = PyEmbeddedImage('iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAALhJREFUWIXtl80SgyAMhHeR99Y+eJseLAdHbJM0TjiwN2dI+MgfQpYFmSqpu0+AEQDqrwXyeorHMcvCEIBdm3F7/fr0FKgBRFaIrHkAdykdQFmEGm2HL233BAIAYmxYEqjePo9SBYBvBKppclDzprMcqAhbAtknJx+3AKRHgGhnv4iApQY+jtSWpOY27BnifNt5uyk9BekAoZNwl21yDBSBi/63yOMiLAXaf8AuwP9n94vzaTYBsgHeht4lXXmb7yQAAAAASUVORK5CYII=')