diff --git a/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/designable.nib b/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/designable.nib
new file mode 100644
index 0000000..caf031e
--- /dev/null
+++ b/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/designable.nib
@@ -0,0 +1,1524 @@
+
+
+
+ 1050
+ 9E17
+ 629
+ 949.33
+ 352.00
+
+
+
+
+
+ YES
+
+
+ contentObject: parameters
+
+
+
+
+
+
+ contentObject
+ parameters
+ 2
+
+
+ 5
+
+
+
+ contentObject: selection.syntax_tree
+
+
+
+
+
+
+
+ selection.syntax_tree
+ 2
+
+
+ 74
+
+
+
+ value: arrangedObjects.class_and_modules
+
+
+
+
+
+
+ value
+ arrangedObjects.class_and_modules
+ 2
+
+
+ 240
+
+
+
+ value: arrangedObjects.offset
+
+
+
+
+
+
+
+ arrangedObjects.offset
+ 2
+
+
+ 242
+
+
+
+ value: arrangedObjects.text_value
+
+
+
+
+
+
+
+ arrangedObjects.text_value
+ 2
+
+
+ 244
+
+
+
+ value: arrangedObjects.methods
+
+
+
+
+
+
+
+ arrangedObjects.methods
+ 2
+
+
+ 245
+
+
+
+ value: selection.input
+
+
+
+
+
+
+ value
+ selection.input
+
+ NSAlwaysPresentsApplicationModalAlerts
+
+
+ 2
+
+
+ 266
+
+
+
+ argument: selection.input
+
+
+
+
+
+
+ argument
+ selection.input
+
+ NSSelectorName
+ returnArgument:
+
+ 2
+
+
+ 271
+
+
+
+ target: selection.controller
+
+
+
+
+
+
+ target
+ selection.controller
+
+
+ returnArgument:
+
+
+ 2
+
+
+ 272
+
+
+
+ selectedLabel: selection.selected_tab
+
+
+
+
+
+
+ selectedLabel
+ selection.selected_tab
+ 2
+
+
+ 274
+
+
+
+
+ YES
+
+ 0
+
+ YES
+
+
+
+
+
+ -2
+
+
+ RmlsZSdzIE93bmVyA
+
+
+ -1
+
+
+ First Responder
+
+
+ -3
+
+
+ Application
+
+
+ 3
+
+
+
+
+ 72
+
+
+
+
+ 210
+
+
+ YES
+
+
+
+
+
+ 211
+
+
+ YES
+
+
+
+
+
+ 212
+
+
+ YES
+
+
+
+
+
+
+ 214
+
+
+ YES
+
+
+
+
+
+ 215
+
+
+ YES
+
+
+
+
+
+
+ 221
+
+
+ YES
+
+
+
+
+
+ 222
+
+
+
+
+ 213
+
+
+ YES
+
+
+
+
+
+ 216
+
+
+ YES
+
+
+
+
+
+ 223
+
+
+ YES
+
+
+
+
+
+
+
+
+ 236
+
+
+
+
+ 226
+
+
+ YES
+
+
+
+
+
+
+
+
+ 234
+
+
+ YES
+
+
+
+
+
+ 235
+
+
+
+
+ 232
+
+
+ YES
+
+
+
+
+
+ 233
+
+
+
+
+ 229
+
+
+ YES
+
+
+
+
+
+ 230
+
+
+
+
+ 228
+
+
+ YES
+
+
+
+
+
+ 231
+
+
+
+
+ 225
+
+
+
+
+ 224
+
+
+
+
+ 257
+
+
+ YES
+
+
+
+
+
+
+
+ 258
+
+
+
+
+ 259
+
+
+
+
+ 260
+
+
+
+
+
+
+ YES
+
+ YES
+ -1.IBPluginDependency
+ -2.IBPluginDependency
+ -3.IBPluginDependency
+ 210.IBPluginDependency
+ 210.IBWindowTemplateEditedContentRect
+ 210.NSWindowTemplate.visibleAtLaunch
+ 210.editorWindowContentRectSynchronizationRect
+ 211.IBPluginDependency
+ 212.IBPluginDependency
+ 213.IBPluginDependency
+ 214.IBPluginDependency
+ 215.IBPluginDependency
+ 216.IBPluginDependency
+ 221.IBPluginDependency
+ 222.IBPluginDependency
+ 223.IBPluginDependency
+ 224.IBPluginDependency
+ 225.IBPluginDependency
+ 226.IBPluginDependency
+ 228.IBPluginDependency
+ 229.IBPluginDependency
+ 230.IBPluginDependency
+ 231.IBPluginDependency
+ 257.IBPluginDependency
+ 258.IBPluginDependency
+ 259.IBPluginDependency
+ 260.IBPluginDependency
+ 3.IBPluginDependency
+ 72.IBPluginDependency
+
+
+ YES
+
+
+
+
+ {{82, 256}, {1112, 670}}
+
+ {{82, 256}, {1112, 670}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.apple.InterfaceBuilder.CocoaPlugin
+
+
+
+
+
+
+
+
+ YES
+
+ YES
+
+
+ YES
+
+
+
+
+ YES
+
+ YES
+
+
+ YES
+
+
+
+ 274
+
+
+
+ YES
+
+
+ 0
+
+ 3
+
+ YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA
+AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBdgALAAwAMQA1ADYAOwA8
+AEEAVQBWAFcAWAALAGUAaQB+AIIAiQCOAJkAmgCyALMAuwC8AL4AvwDAAMQAygDYAN4A7gDyAQcBGwEc
+AR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBMAExATsBQwFMAVABUwFYAWEAbQFiAWgBiwGP
+AZIBlQGYAZsBngGhAaQBpwGqAa0BsAGzAbYBuQG8Ab8BwgHFAcgBywHOAdEB1AHXAdoB3QHgAeMB5gHp
+AewB7wHyAfQB+QH8AgQCBwIqAi4CLwIyAjYCOgI+AkICRAJGAlYCWwJeAmECSgJdAmkCcAJxAnICdQJ6
+AnsCgwE2AoQCiAKLAowCjQKQApEClgKXApkCnAKoAqkCqgKtArgCuQK6Ar0CvgLAAsECxgLQAtEC1gLa
+AusC8wL7Av8DGwMcAyMDKwMsAy8DNAM1AzgDPwNOA1YDVwNcA18DZANlA2kDcgNzA3gDeQN+A38DgQOE
+A4wDkgOTA5oDogOoA6kDrgOvA7YDvQPDA8QDywPQA9ED1APXA9gD4APhA+kD6gPuA+8CvQPwA/ED9gP3
+A/oEAQQCBAMEBQALBAYEBwQKBBcEIwQzBD0EPgQ/BEAEQQRCBEMERQRHBEgETQROBE8EUARUBFsEYARn
+BGgEaQRqBGwEbgRvBHAEcQR4BHkEegSBBIIEgwSKBIsEjASTBJQElQSeBJ8EoAShBKcEqASpBLMEtAS1
+BLYEqAS8BMQETgSgBMUEywB6BM0E1ATVBNYE1wT3BPoE+wUbBTwFXQVeBV8FYAVhBWIFYwVkBWUFZgVn
+BWgFaQVqBWsFbAVtBW4FbwVwBXEFcgVzBXQFdQV2BXcFeAV5BXoFewV+BYEFrAXXBdgF2QXaBdsF3AXd
+Bd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1AucF9gX3AWcF+AX5
+BfoF+wX8Bf0GAAYDBgZVJG51bGzfEBIADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4A
+HwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADBWTlNSb290ViRjbGFzc11OU09iamVjdHNL
+ZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5T2lkc1ZhbHVlc11OU0Nvbm5lY3Rp
+b25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xhc3Nlc0tleXNaTlNPaWRzS2V5c11OU05hbWVz
+VmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9yc11OU0ZvbnRNYW5hZ2VyXxAQTlNWaXNpYmxl
+V2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNjZXNzaWJpbGl0eU9pZHNLZXlzWU5TTmV4dE9p
+ZFxOU09pZHNWYWx1ZXOAAoEBdYEBIoEBR4EBdIDhgQEmgAWBAUaBAUiBASeBAXKAAIAGgQElgQFzEQEU
+gQFJ0gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA1hOU09iamVjdNIANwA4ADkAOlgkY2xhc3Nlc1okY2xh
+c3NuYW1logA6ADVeTlNDdXN0b21PYmplY3RfEBBJQkNvY29hRnJhbWV3b3Jr0gAOAD0APgA/Wk5TLm9i
+amVjdHOANKEAQIAH2gBCAA4AQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTACtcTlNXaW5k
+b3dWaWV3XE5TU2NyZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFnc11OU1dpbmRvd0NsYXNzXE5T
+V2luZG93UmVjdF8QD05TV2luZG93QmFja2luZ18QEU5TV2luZG93U3R5bGVNYXNrW05TVmlld0NsYXNz
+gAuA4IDfgAkSJAAAAIAKgAgQAhAPgABfEBh7ezgzLCAyMjJ9LCB7MTExMiwgNjcwfX1WV2luZG93WE5T
+V2luZG931wBZAA4AWgBbAFwAVwBdAF4AXwBgAGEAYgBeAGRfEA9OU05leHRSZXNwb25kZXJaTlNTdWJ2
+aWV3c1hOU3ZGbGFnc1tOU0ZyYW1lU2l6ZVtOU1N1cGVydmlld4AMgJWADREBAIDdgAyA3tIADgA9AGYA
+Z4BroQBogA7dAFkADgBqAGsAbABtAFoAWwBXAG4AXQBvAHAASwByAHMAdAB1AHYAdwB4AF4AegBLAHoA
+fV5OU1RhYlZpZXdJdGVtc1lOU1R2RmxhZ3NXTlNGcmFtZVZOU0ZvbnRfEBFOU0RyYXdzQmFja2dyb3Vu
+ZF8QFk5TQWxsb3dUcnVuY2F0ZWRMYWJlbHNfEBVOU1NlbGVjdGVkVGFiVmlld0l0ZW2AC4DcgJcQAICW
+gBaADxASgAwJgAsJgNnSAA4APQBmAICAa6EAgYAQ1wBZAA4AbABaAFsAVwBdAGgAXwCFAIYAYQBeAGiA
+DoCVgJSAEYAMgA7SAA4APQBmAIuAa6IAjACNgBKAHdgAWQAOAGwAjwBbAJAAVwBdAIEAkgCTAJQAlQB6
+AF4AgVZOU0NlbGxZTlNFbmFibGVkgBCAHIATgBQRASEJgAyAEF8QFXt7MTAwMSwgOX0sIHs5NiwgMzJ9
+fdwAmwAOAJwAnQCeAJ8AoAChAKIAowCkAKUApgCnAKgAqQCqAKsArAB2AIwArwCwALFbTlNDZWxsRmxh
+Z3NfEBNOU0FsdGVybmF0ZUNvbnRlbnRzXxASTlNQZXJpb2RpY0ludGVydmFsXk5TQnV0dG9uRmxhZ3My
+XxAPTlNLZXlFcXVpdmFsZW50Wk5TQ29udGVudHNZTlNTdXBwb3J0XU5TQ29udHJvbFZpZXdfEA9OU1Bl
+cmlvZGljRGVsYXlcTlNDZWxsRmxhZ3MyXU5TQnV0dG9uRmxhZ3MSBAH+AIAbgBkQGRIQAACBgBqAFYAW
+gBIQyBIIAAAAE/////+GgkD/U1J1btQADgC0ALUAtgC3ALgAuQC6Vk5TU2l6ZVZOU05hbWVYTlNmRmxh
+Z3OAGCNAKgAAAAAAAIAXEQQUXEx1Y2lkYUdyYW5kZdIANwA4AL0AbaIAbQA1UFEN0gA3ADgAwQDCpADC
+AMMAjwA1XE5TQnV0dG9uQ2VsbFxOU0FjdGlvbkNlbGzSADcAOADFAMalAMYAxwDIAMkANVhOU0J1dHRv
+bllOU0NvbnRyb2xWTlNWaWV3W05TUmVzcG9uZGVy2wBZAMsADgBsAMwAWgBbAFcAXQDNAM4AgQDQANEA
+0gB4ANMAYQBeAIEA1gDXW05TSFNjcm9sbGVyWE5Tc0ZsYWdzW05TVlNjcm9sbGVyXU5TQ29udGVudFZp
+ZXeAEICQgJOAkoAegAyAEICMgB/SAA4APQBmANqAa6MA1wDWANCAH4CMgJDbAFkADgBsAN8A4ABaAFsA
+4QBXAOIAXQCNAOQA5QDmAOcA6ADpAOoAXgDsAI1YTlNDdXJzb3JZTlNjdkZsYWdzWU5TRG9jVmlld1lO
+U0JHQ29sb3KAHYCLgIeAiBAEgCARCQCAIYAMgHOAHdIADgA9AGYA8IBroQDqgCHdAFkADgDzAPQA9QD2
+AFsAXAD3AFcA+ABdAPkA1wD7APwA/QD+AP8BAAEBAQIAXgEEANcAK18QD05TVGV4dENvbnRhaW5lcllO
+U1RWRmxhZ3NcTlNTaGFyZWREYXRhW05TRHJhZ1R5cGVzWU5TTWF4U2l6ZVhOU01pbml6ZVpOU0RlbGVn
+YXRlgB+AhoA2EAaAcoAiEQkSgDWAhIAMgIWAH4AA0gAOAD0APgEJgDSvEBEBCgELAQwBDQEOAQ8BEAER
+ARIBEwEUARUBFgEXARgBGQEagCOAJIAlgCaAJ4AogCmAKoArgCyALYAugC+AMIAxgDKAM18QGU5lWFQg
+UlRGRCBwYXN0ZWJvYXJkIHR5cGVfEBJOU1N0cmluZ1Bib2FyZFR5cGVfEBpOZVhUIHJ1bGVyIHBhc3Rl
+Ym9hcmQgdHlwZV8QHk5lWFQgVElGRiB2NC4wIHBhc3RlYm9hcmQgdHlwZV8QGUFwcGxlIFVSTCBwYXN0
+ZWJvYXJkIHR5cGVfECNDb3JlUGFzdGVib2FyZEZsYXZvclR5cGUgMHg2RDZGNkY3Nl8QG1dlYlVSTHNX
+aXRoVGl0bGVzUGJvYXJkVHlwZV8QI0NvcmVQYXN0ZWJvYXJkRmxhdm9yVHlwZSAweDc1NzI2QzIwXxAZ
+QXBwbGUgUERGIHBhc3RlYm9hcmQgdHlwZV8QGUFwcGxlIFBORyBwYXN0ZWJvYXJkIHR5cGVfEBpBcHBs
+ZSBIVE1MIHBhc3RlYm9hcmQgdHlwZV8QFU5TRmlsZW5hbWVzUGJvYXJkVHlwZV8QMU5lWFQgRW5jYXBz
+dWxhdGVkIFBvc3RTY3JpcHQgdjEuMiBwYXN0ZWJvYXJkIHR5cGVfEBdOU0NvbG9yIHBhc3RlYm9hcmQg
+dHlwZV8QGkFwcGxlIFBJQ1QgcGFzdGVib2FyZCB0eXBlXxAZTmVYVCBmb250IHBhc3RlYm9hcmQgdHlw
+ZV8QKk5lWFQgUmljaCBUZXh0IEZvcm1hdCB2MS4wIHBhc3RlYm9hcmQgdHlwZdIANwA4AS0BLqMBLgEv
+ADVcTlNNdXRhYmxlU2V0VU5TU2V0WnsxMDk3LCAzNn3VATIADgEzATQBNQE2ATcA6gE5ATpZTlNUQ0Zs
+YWdzWk5TVGV4dFZpZXdXTlNXaWR0aF8QD05TTGF5b3V0TWFuYWdlchABgHGAISNAkSQAAAAAAIA31QAO
+ATwBPQE+APkBPwFAAUEA/QArXxAQTlNUZXh0Q29udGFpbmVyc11OU1RleHRTdG9yYWdlWU5TTE1GbGFn
+c4BwgG+AOIAA1QAOAUQBRQFGAPkBRwFIAUkBSgArXE5TQXR0cmlidXRlc1hOU1N0cmluZ18QD05TQXR0
+cmlidXRlSW5mb4BugDuAOYBsgADSAA4BTQFOAU9ZTlMuc3RyaW5ngDpfEQJeTG9yZW0gaXBzdW0gZG9s
+b3Igc2l0IGVyIGVsaXQgbGFtZXQsIGNvbnNlY3RldGF1ciBjaWxsaXVtIGFkaXBpc2ljaW5nIHBlY3Us
+IHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEg
+YWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1
+bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlz
+IGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBj
+aWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVj
+YXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVu
+dCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bSBFdCBoYXJ1bWQgdW5kIGxvb2t1bSBsaWtlIEdyZWVr
+IHRvIG1lLCBkZXJldWQgZmFjaWxpcyBlc3QgZXIgZXhwZWRpdCBkaXN0aW5jdC4gTmFtIGxpYmVyIHRl
+IGNvbnNjaWVudCB0byBmYWN0b3IgdHVtIHBvZW4gbGVndW0gb2Rpb3F1ZSBjaXZpdWRh0gA3ADgBUQFS
+owFSAUUANV8QD05TTXV0YWJsZVN0cmluZ9IADgA9AGYBVYBrogFWAVeAPIBm0wAOAVkAPQFaAVsBXldO
+Uy5rZXlzgGWiAVwBXYA9gD6iAV8BYIA/gGRfEBBOU1BhcmFncmFwaFN0eWxl0wFjAA4BZAFlAWYBZ1pO
+U1RhYlN0b3BzW05TQWxpZ25tZW50gECAYxAD0gAOAD0BaQFqgGKvECABawFsAW0BbgFvAXABcQFyAXMB
+dAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKgEGAQ4BEgEWARoBHgEiA
+SYBKgEuATIBNgE6AT4BQgFGAUoBTgFSAVYBWgFeAWIBZgFqAW4BcgF2AXoBfgGCAYdIADgGMAY0BjlpO
+U0xvY2F0aW9ugEIjAAAAAAAAAADSADcAOAGQAZGiAZEANVlOU1RleHRUYWLSAA4BjAGNAZSAQiNATAAA
+AAAAANIADgGMAY0Bl4BCI0BcAAAAAAAA0gAOAYwBjQGagEIjQGUAAAAAAADSAA4BjAGNAZ2AQiNAbAAA
+AAAAANIADgGMAY0BoIBCI0BxgAAAAAAA0gAOAYwBjQGjgEIjQHUAAAAAAADSAA4BjAGNAaaAQiNAeIAA
+AAAAANIADgGMAY0BqYBCI0B8AAAAAAAA0gAOAYwBjQGsgEIjQH+AAAAAAADSAA4BjAGNAa+AQiNAgYAA
+AAAAANIADgGMAY0BsoBCI0CDQAAAAAAA0gAOAYwBjQG1gEIjQIUAAAAAAADSAA4BjAGNAbiAQiNAhsAA
+AAAAANIADgGMAY0Bu4BCI0CIgAAAAAAA0gAOAYwBjQG+gEIjQIpAAAAAAADSAA4BjAGNAcGAQiNAjAAA
+AAAAANIADgGMAY0BxIBCI0CNwAAAAAAA0gAOAYwBjQHHgEIjQI+AAAAAAADSAA4BjAGNAcqAQiNAkKAA
+AAAAANIADgGMAY0BzYBCI0CRgAAAAAAA0gAOAYwBjQHQgEIjQJJgAAAAAADSAA4BjAGNAdOAQiNAk0AA
+AAAAANIADgGMAY0B1oBCI0CUIAAAAAAA0gAOAYwBjQHZgEIjQJUAAAAAAADSAA4BjAGNAdyAQiNAleAA
+AAAAANIADgGMAY0B34BCI0CWwAAAAAAA0gAOAYwBjQHigEIjQJegAAAAAADSAA4BjAGNAeWAQiNAmIAA
+AAAAANIADgGMAY0B6IBCI0CZYAAAAAAA0gAOAYwBjQHrgEIjQJpAAAAAAADSAA4BjAGNAe6AQiNAmyAA
+AAAAANIANwA4AfAB8aIB8QA1V05TQXJyYXnSADcAOAHzAWGiAWEANdQADgC0ALUAtgC3AfYAuQH4gBgj
+QCQAAAAAAACAFxELG9IANwA4AfoB+6IB+wA1XE5TRGljdGlvbmFyedMADgFZAD0BWgH+AgGAZaIBXAFd
+gD2APqICAgIDgGeAadMBYwAOAWQCBQFmAWeAaIBj0gAOAD0BaQIJgGKvECABawFsAW0BbgFvAXABcQFy
+AXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKgEGAQ4BEgEWARoBH
+gEiASYBKgEuATIBNgE6AT4BQgFGAUoBTgFSAVYBWgFeAWIBZgFqAW4BcgF2AXoBfgGCAYdQADgC0ALUA
+tgC3AfYCLAItgBiAahAQXxARTHVjaWRhR3JhbmRlLUJvbGTSADcAOAIwAjGjAjEB8QA1Xk5TTXV0YWJs
+ZUFycmF50gAOAjMCNAI1V05TLmRhdGGAbU8QDxkABAEIAAwBIgAHAYQEANIANwA4AjcCOKMCOAI5ADVd
+TlNNdXRhYmxlRGF0YVZOU0RhdGHSADcAOAI7AT2kAT0CPAI9ADVfEBlOU011dGFibGVBdHRyaWJ1dGVk
+U3RyaW5nXxASTlNBdHRyaWJ1dGVkU3RyaW5n0gAOAD0AZgJAgGuhAPyANtIANwA4AkMBNaIBNQA10gA3
+ADgCRQDzogDzADXYAA4CRwJIAkkCSgJLAkwCTQJOAk8AKwJRAOwCUwArAlVXTlNGbGFnc18QF05TRGVm
+YXVsdFBhcmFncmFwaFN0eWxlXxAQTlNJbnNlcnRpb25Db2xvcl8QEU5TQmFja2dyb3VuZENvbG9yXxAU
+TlNTZWxlY3RlZEF0dHJpYnV0ZXNfEBJOU01hcmtlZEF0dHJpYnV0ZXNfEBBOU0xpbmtBdHRyaWJ1dGVz
+gIMRLwOAAIB1gHOAdoAAgH/TAA4CVwJYAlkBZwJaXE5TQ29sb3JTcGFjZVdOU1doaXRlgHRCMQDSADcA
+OAJcAl2iAl0ANVdOU0NvbG9y0wAOAlcCWAJZAWcCYIB0QjAA0wAOAVkAPQFaAmMCZoBlogJkAmWAd4B4
+ogJnAmiAeYB91QAOAl0CVwJqAmsCWQJtAP0CbgJvW05TQ29sb3JOYW1lXU5TQ2F0YWxvZ05hbWWAdIB8
+gHuAelZTeXN0ZW1fEBtzZWxlY3RlZFRleHRCYWNrZ3JvdW5kQ29sb3LTAA4CVwJYAlkBZwJ0gHRLMC42
+NjY2NjY2OQDVAA4CXQJXAmoCawJZAlEA/QJ4Am+AdIB1gH6Ael8QEXNlbGVjdGVkVGV4dENvbG9y0wAO
+AVkAPQFaAn0CgIBlogJ+AmWAgIB4ogKBAoKAgYCCW05TVW5kZXJsaW5l0wAOAlcChQJZATYCh1VOU1JH
+QoB0RjAgMCAxANIANwA4AokCiqICigA1XxAUTlNUZXh0Vmlld1NoYXJlZERhdGFdezExMDQsIDFlKzA3
+fVl7MjIzLCAyOX3SADcAOAKOATOlATMCjwDIAMkANVZOU1RleHRfEBV7ezEsIDF9LCB7MTA5NywgNTY2
+fX3TAA4CkgKTApQClQE2WU5TSG90U3BvdFxOU0N1cnNvclR5cGWAioCJV3s0LCAtNX3SADcAOAKYAN+i
+AN8ANdIANwA4ApoCm6QCmwDIAMkANVpOU0NsaXBWaWV32QBZAp0ADgBsAFsAVwKeAF0CnwCNAI0CogKj
+AGEAXgKlAI0Cp1hOU1RhcmdldFhOU0FjdGlvbllOU1BlcmNlbnSAHYAdgI+AjYAMgI6AHSM/7EmMAAAA
+AF8QFnt7MTA5OCwgMX0sIHsxNSwgNTY2fX1cX2RvU2Nyb2xsZXI60gA3ADgCqwKspQKsAMcAyADJADVa
+TlNTY3JvbGxlctsAWQKdAA4AbADMAFsAVwKeAF0CrgKfAI0AjQKiArIBNgBhAF4CpQCNArYCt1pOU0N1
+clZhbHVlgB2AHYCPgJGADICOgB0jP/AAAAAAAAAjP+5CyGAAAABfEBh7ey0xMDAsIC0xMDB9LCB7ODcs
+IDE4fX1fEBd7ey0zLCA1N30sIHsxMTE0LCA1Njh9fdIANwA4ArsCvKQCvADIAMkANVxOU1Njcm9sbFZp
+ZXdfEBd7ezEwLCAzM30sIHsxMTA4LCA2Mjh9fdIANwA4Ar8AyKMAyADJADVfEBh7ey04LCAtMTB9LCB7
+MTEyOCwgNjc0fX3SAA4APQBmAsOAa6ICxAB9gJiA2dYADgLHAMgCyAJdAskCygLLAswAaALOAs9cTlNJ
+ZGVudGlmaWVyWU5TVGFiVmlld1dOU0xhYmVsgNiAmYCagA6A1oDVUTHVAFkADgBsAFoAWwArAF8C1ALV
+AGGAAICVgNSAm9IADgA9AGYC2IBroQLZgJzdAFkAywAOAGwAzALbAtwAWgLdAFsAXQDNAM4CzALfANEC
+4QLiAuMC5ALlAuYC5wLMAukC6lxOU0Nvcm5lclZpZXdfEBBOU0hlYWRlckNsaXBWaWV3XE5TU2Nyb2xs
+QW10c4CagM+Ak4DTEDKApoCjgJ1PEBBBIAAAQSAAAEGYAABBmAAAEQESgJqAzYCe0gAOAD0AZgLtgGul
+AuoC6QLfAuQC44CegM2Az4CjgKbZAFkADgBsAOAAWgBbAOEA4gBdAtkA5AL2AOcC9wDpAvgC+QLZgJyA
+i4DMgJ+AoIC0gJzSAA4APQBmAv2Aa6EC+ICg3xAUAFkDAAAOAGsDAQJKAwIC2wMDAwQDBQBbAFwAkAMG
+AwcDCABdAwkDCgLqAHQDDAMNAw4A7AB6AuMDEgE2AxMAYQMUAHoAegMXAFMC6gMZAxpfEB9OU0RyYWdn
+aW5nU291cmNlTWFza0Zvck5vbkxvY2FsXE5TSGVhZGVyVmlld18QEk5TQWxsb3dzVHlwZVNlbGVjdF8Q
+F05TSW50ZXJjZWxsU3BhY2luZ1dpZHRoXxAZTlNDb2x1bW5BdXRvcmVzaXppbmdTdHlsZV8QGE5TSW50
+ZXJjZWxsU3BhY2luZ0hlaWdodF8QJU5TT3V0bGluZVZpZXdBdXRvc2F2ZUV4cGFuZGVkSXRlbXNLZXlb
+TlNHcmlkQ29sb3JfEBxOU0RyYWdnaW5nU291cmNlTWFza0ZvckxvY2FsXk5TVGFibGVDb2x1bW5zW05T
+Um93SGVpZ2h0gJ6AyxP/////0sCAAICigHMJgKYjQAgAAAAAAAAjQAAAAAAAAACAoQkJgMiAnoCpI0Ax
+AAAAAAAAW3sxMDk3LCA1OTV91gBZAA4AWwBcAF0DHQLkAx8AYQMgAuQC+FtOU1RhYmxlVmlld4CjgKWA
+pICjgKDZAFkADgBsAOAAWgBbAOEA4gBdAtkA5AMmAOcDJwDpAw4C+QLZgJyAi4DSgNGAooC0gJxaezEw
+OTcsIDE3fdIANwA4Ay0DLqQDLgDIAMkANV8QEU5TVGFibGVIZWFkZXJWaWV31QBZAA4AbABbAF0C2QMx
+AzIAYQLZgJyAqICngJxfEBV7ezEwOTgsIDB9LCB7MTYsIDE3fX3SADcAOAM2AzekAzcAyADJADVdX05T
+Q29ybmVyVmlld9IADgA9AGYDOoBrpAM7AzwDPQM+gKqAuoC+gMTZA0AADgNBATQDQgNDA0QDRQMdAHoD
+RwNIA0kDSgBSA0sDTAL4Xk5TSXNSZXNpemVhYmxlXE5TSGVhZGVyQ2VsbFpOU0RhdGFDZWxsXk5TUmVz
+aXppbmdNYXNrWk5TTWluV2lkdGhaTlNNYXhXaWR0aAmAuYCrI0Bu4AAAAAAAgLIjQDAAAAAAAAAjQI9A
+AAAAAACAoNcAmwAOAkoAoAChAKQDTwNQA1EDUgNTA1QAdANVW05TVGV4dENvbG9yEgSB/gCAsYCugKyA
+rYCvXxAPQ2xhc3MgKyBNb2R1bGVz1AAOALQAtQC2ALcDWQC5A1uAGCNAJgAAAAAAAIAXEQwc0wAOAlcC
+WAJZAWcDXoB0SzAuMzMzMzMyOTkA1QAOAl0CVwJqAmsCWQJRAP0DYgJvgHSAdYCwgHpfEA9oZWFkZXJU
+ZXh0Q29sb3LSADcAOANmA2elA2cDaADDAI8ANV8QEU5TVGFibGVIZWFkZXJDZWxsXxAPTlNUZXh0Rmll
+bGRDZWxs2ACbAA4CSgCgAKEAogCkA08DagNrAvkDbQB2AvgDcANxEhQh/kCAuIC0gLOAFoCgEQgAgLZZ
+VGV4dCBDZWxs1QAOAl0CVwJqAmsCWQJtAP0DdgJvgHSAfIC1gHpfEBZjb250cm9sQmFja2dyb3VuZENv
+bG9y1QAOAl0CVwJqAmsCWQJRAP0DfAJvgHSAdYC3gHpfEBBjb250cm9sVGV4dENvbG9y0gA3ADgDgANo
+pANoAMMAjwA10gA3ADgDggODogODADVdTlNUYWJsZUNvbHVtbtkDQAAOA0EBNANCA0MDRANFAx0AegNH
+A4cDiAOJAFIDigNMAvgJgLmAuyNASIAAAAAAAIC9I0BEAAAAAAAAgKDXAJsADgJKAKAAoQCkA08DUANR
+A1IDjwNUAHQDVYCxgK6AvICtgK9WT2Zmc2V02ACbAA4CSgCgAKEAogCkA08DagNrAvkDbQB2AvgDcANx
+gLiAtICzgBaAoIC22QNAAA4DQQE0A0IDQwNEA0UDHQB6A0cDnQOeA58BZwH2A6AC+AmAuYC/I0B8MAAA
+AAAAgMMjR+///6AAAACAoNcAmwAOAkoAoAChAKQDTwNQA1EDpAOlA1QAdANVgLGAwYDAgK2Ar1RUZXh0
+1QAOAl0CVwJqAmsCWQDsAP0DrAJvgHSAc4DCgHpbaGVhZGVyQ29sb3LYAJsADgJKAKAAoQCiAKQDTwNq
+A2sC+QNtAHYC+ANwA3GAuIC0gLOAFoCggLbZA0AADgNBATQDQgNDA0QDRQMdAHoDRwO5A7oDuwFnAfYD
+oAL4CYC5gMUjQHUgAAAAAACAx4Cg1wCbAA4CSgCgAKEApANPA1ADUQOkA8ADVAB0A1WAsYDBgMaArYCv
+V01ldGhvZHPYAJsADgJKAKAAoQCiAKQDTwNqA2sC+QNtAHYC+ANwA3GAuIC0gLOAFoCggLbVAA4CXQJX
+AmoCawJZA80A/QPOAm+AdIDKgMmAellncmlkQ29sb3LTAA4CVwJYAlkBZwPTgHREMC41ANIANwA4A9UD
+1qYD1gMdAMcAyADJADVdTlNPdXRsaW5lVmlld18QFnt7MSwgMTd9LCB7MTA5NywgNTk1fX3YAFkCnQAO
+AGwAWwKeAF0CnwLZAtkCogPcAGECpQLZA9+AnICcgI+AzoCOgJwjP+/yO2AAAABfEBd7ezEwOTgsIDE3
+fSwgezE1LCA1OTV9fdkAWQKdAA4AbADMAFsCngBdAp8C2QLZAqID5QE2AGECpQLZA+iAnICcgI+A0ICO
+gJwjP+/4igAAAABfEBZ7ezEsIDYxMn0sIHsxMDk3LCAxNX190gAOAD0AZgPsgGuhAw6Aol8QFHt7MSwg
+MH0sIHsxMDk3LCAxN319XxAXe3stMywgLTN9LCB7MTExNCwgNjI4fX1bU3ludGF4IFRyZWXVAA4CXQJX
+AmoCawJZAm0A/QP0Am+AdIB8gNeAelxjb250cm9sQ29sb3LSADcAOAP4A/miA/kANV1OU1RhYlZpZXdJ
+dGVt1gAOAscAyALIAl0CyQLKA/wAgQBoAs4EAIDYgNqAEIAOgNaA21EyVUlucHV00gA3ADgEBALIpALI
+AMgAyQA1W3sxMTEyLCA2NzB9XxAWe3swLCAwfSwgezE2ODAsIDEwMjh9fdIANwA4BAgECaIECQA1XxAQ
+TlNXaW5kb3dUZW1wbGF0ZdIADgA9AGYEDIBrqgQNBA4EDwQQBBEEEgQTBBQEFQQWgOKA84D+gQEBgQEE
+gQEHgQEKgQERgQEXgQEe1wAOBBgEGQQaBBsCyQQcBB0EHgQfBCADPQQiAFJdTlNEZXN0aW5hdGlvbllO
+U0tleVBhdGhZTlNCaW5kaW5nWE5TU291cmNlXxAcTlNOaWJCaW5kaW5nQ29ubmVjdG9yVmVyc2lvboDy
+gOOA8YDwgL6A79gADgQkBCUEJgQnBCgEKQQqBCsAegQtAHoELwB6BDEAel8QFE5TUHJlc2VydmVzU2Vs
+ZWN0aW9uXxAPX05TTWFuYWdlZFByb3h5Wk5TRWRpdGFibGVeTlNEZWNsYXJlZEtleXNfEBhOU1NlbGVj
+dHNJbnNlcnRlZE9iamVjdHNfEBhOU1RyZWVDb250ZW50Q2hpbGRyZW5LZXlfEBZOU0F2b2lkc0VtcHR5
+U2VsZWN0aW9ugO4JgOsJgOQJgO0J0gAOAD0AZgQ1gGunBDYENwQ4BDkEOgCoBDyA5YDmgOeA6IDpgBmA
+6l8QEWNsYXNzX2FuZF9tb2R1bGVzVm9mZnNldFp0ZXh0X3ZhbHVlV21ldGhvZHNaY29udHJvbGxlclpn
+ZXRJbmRleGVz0QAOBESA7NIANwA4BEYEJaIEJQA1WGVsZW1lbnRz0gA3ADgESQRKpARKBEsETAA1XxAQ
+TlNUcmVlQ29udHJvbGxlcl8QEk5TT2JqZWN0Q29udHJvbGxlclxOU0NvbnRyb2xsZXJfECF2YWx1ZTog
+YXJyYW5nZWRPYmplY3RzLnRleHRfdmFsdWVVdmFsdWVfEBphcnJhbmdlZE9iamVjdHMudGV4dF92YWx1
+ZdIANwA4BFEEUqMEUgRTADVfEBVOU05pYkJpbmRpbmdDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LXAA4E
+GAQZBBoEGwLJBBwEHQAfBFcEWARZBFoAUoDygAKA/YD8gPSA+9QADgQlBCYEJwRcBF0AegRfgPqA+QmA
+9dIADgA9AGYEYoBrpARjBGQEOgRmgPaA94DpgPhVaW5wdXRbc3ludGF4X3RyZWVcc2VsZWN0ZWRfdGFi
+0QAOBESA7NIANwA4BG0ES6MESwRMADVfEBljb250ZW50T2JqZWN0OiBwYXJhbWV0ZXJzXWNvbnRlbnRP
+YmplY3RacGFyYW1ldGVyc9cADgQYBBkEGgQbAskEHAQdBB4EdAQgAzwEdwBSgPKA44EBAIDwgLqA/18Q
+HXZhbHVlOiBhcnJhbmdlZE9iamVjdHMub2Zmc2V0XxAWYXJyYW5nZWRPYmplY3RzLm9mZnNldNcADgQY
+BBkEGgQbAskEHAQdBB4EfQQgAzsEgABSgPKA44EBA4DwgKqBAQJfECh2YWx1ZTogYXJyYW5nZWRPYmpl
+Y3RzLmNsYXNzX2FuZF9tb2R1bGVzXxAhYXJyYW5nZWRPYmplY3RzLmNsYXNzX2FuZF9tb2R1bGVz1wAO
+BBgEGQQaBBsCyQQcBB0EWQSGBFgEHgSJAFKA8oD0gQEGgPyA44EBBV8QJGNvbnRlbnRPYmplY3Q6IHNl
+bGVjdGlvbi5zeW50YXhfdHJlZV8QFXNlbGVjdGlvbi5zeW50YXhfdHJlZdcADgQYBBkEGgQbAskEHAQd
+BB4EjwQgAz4EkgBSgPKA44EBCYDwgMSBAQhfEB52YWx1ZTogYXJyYW5nZWRPYmplY3RzLm1ldGhvZHNf
+EBdhcnJhbmdlZE9iamVjdHMubWV0aG9kc9gADgQYBBkEGgQbAskElgQcBB0EWQSZBJoAjAScBJ0AUllO
+U09wdGlvbnOA8oD0gQENgQEMgBKBAQuBAQ5fEBlhcmd1bWVudDogc2VsZWN0aW9uLmlucHV0WGFyZ3Vt
+ZW50XxAPc2VsZWN0aW9uLmlucHV00wAOAVkAPQFaBKMEpYBloQSkgQEPoQSmgQEQXk5TU2VsZWN0b3JO
+YW1lXxAPcmV0dXJuQXJndW1lbnQ62QAOBBgEGQQaBKoEGwLJBJYEHAQdBFkErQSuBBMAjASxBLIAUl8Q
+E05TUHJldmlvdXNDb25uZWN0b3KA8oD0gQEUgQETgQEKgBKBARKBARVfEBx0YXJnZXQ6IHNlbGVjdGlv
+bi5jb250cm9sbGVyVnRhcmdldF8QFHNlbGVjdGlvbi5jb250cm9sbGVy0wAOAVkAPQFaBLgEuoBloQSk
+gQEPoQS7gQEW2AAOBBgEGQQaBBsCyQSWBBwEHQRZBL8EwADqBMIEwwBSgPKA9IEBGoEBGYAhgQEYgQEb
+XxAWdmFsdWU6IHNlbGVjdGlvbi5pbnB1dNMADgFZAD0BWgTHBMmAZaEEyIEBHKEEyoEBHV8QJk5TQWx3
+YXlzUHJlc2VudHNBcHBsaWNhdGlvbk1vZGFsQWxlcnRzCdcADgQYBBkEGgQbAskEHAQdBFkE0ATRAGgE
+0wBSgPKA9IEBIYEBIIAOgQEfXxAlc2VsZWN0ZWRMYWJlbDogc2VsZWN0aW9uLnNlbGVjdGVkX3RhYl1z
+ZWxlY3RlZExhYmVsXxAWc2VsZWN0aW9uLnNlbGVjdGVkX3RhYtIADgA9AWkE2YBirxAdA7sDPALMAtkA
+SwCMAzsCxATiAz4AfQM9A4kAaACBAvgAjQOfANYDSgMOAOoC3wLpAEAEWQCUANAEHoDHgLqAmoCcgAuA
+EoCqgJiBASOAxIDZgL6AvYAOgBCAoIAdgMOAjICygKKAIYDPgM2AB4D0gBSAkIDj0gAOADIAMwT5gASB
+ASRdTlNBcHBsaWNhdGlvbtIADgA9AWkE/YBirxAdAz4C+ALEAswAQACBAvgAaAAfAvgAaAL4AzwASwB9
+AtkAgQM9AI0DOwLZAI0C2QLZAB8AHwCMAI0AH4DEgKCAmICagAeAEICggA6AAoCggA6AoIC6gAuA2YCc
+gBCAvoAdgKqAnIAdgJyAnIACgAKAEoAdgALSAA4APQFpBR2AYq8QHgAfAzwDuwLMAtkASwCMAzsCxATi
+Az4AfQM9A4kAaACBAvgAjQNKANYDnwMOAt8C6QDqAEAEWQCUANAEHoACgLqAx4CagJyAC4ASgKqAmIEB
+I4DEgNmAvoC9gA6AEICggB2AsoCMgMOAooDPgM2AIYAHgPSAFICQgOPSAA4APQFpBT6AYq8QHgU/BUAF
+QQVCBUMFRAVFBUYFRwVIBUkFSgVLBUwFTQVOBU8FUAVRBVIFUwVUBVUFVgVXBVgFWQVaBVsFXIEBKIEB
+KYEBKoEBK4EBLIEBLYEBLoEBL4EBMIEBMYEBMoEBM4EBNIEBNYEBNoEBN4EBOIEBOYEBOoEBO4EBPIEB
+PYEBPoEBP4EBQIEBQYEBQoEBQ4EBRIEBRVxGaWxlJ3MgT3duZXJfEBVUYWJsZSBDb2x1bW4gKE9mZnNl
+dClfEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMlRWaWV3W1Njcm9sbCBWaWV3XENvbnRlbnQg
+Vmlld18QEVB1c2ggQnV0dG9uIChSdW4pXxAeVGFibGUgQ29sdW1uIChDbGFzcyArIE1vZHVsZXMpXxAb
+VGFiIFZpZXcgSXRlbSAoU3ludGF4IFRyZWUpW0FwcGxpY2F0aW9uXxAWVGFibGUgQ29sdW1uIChNZXRo
+b2RzKV8QFVRhYiBWaWV3IEl0ZW0gKElucHV0KV8QE1RhYmxlIENvbHVtbiAoVGV4dClfEBtUZXh0IEZp
+ZWxkIENlbGwgKFRleHQgQ2VsbClfECFUb3AgVGFiIFZpZXcgKFN5bnRheCBUcmVlLCBJbnB1dClWVmll
+dy0xXxA1T3V0bGluZSBWaWV3IChDbGFzcyArIE1vZHVsZXMsIE9mZnNldCwgVGV4dCwgTWV0aG9kcyld
+U2Nyb2xsIFZpZXctMV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0xXxATVmVydGljYWwgU2Ny
+b2xsZXItMV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0zXxARVGFibGUgSGVhZGVyIFZpZXdf
+EBNIb3Jpem9udGFsIFNjcm9sbGVyXxARVmVydGljYWwgU2Nyb2xsZXJZVGV4dCBWaWV3XxAPV2luZG93
+IChXaW5kb3cpXxART2JqZWN0IENvbnRyb2xsZXJfEBFCdXR0b24gQ2VsbCAoUnVuKV8QFUhvcml6b250
+YWwgU2Nyb2xsZXItMV8QD1RyZWUgQ29udHJvbGxlctIADgA9AWkFfYBioNIADgA9AWkFgIBioNIADgA9
+AWkFg4BirxAoBA0AHwO7AzwCzALZAEsAjAM7BBUCxATiAz4EFAB9Az0DiQBoAIEEEgL4AI0DnwDWA0oE
+EAQPAw4A6gLfAukEFgBABBEEWQCUBBMA0AQOBB6A4oACgMeAuoCagJyAC4ASgKqBAReAmIEBI4DEgQER
+gNmAvoC9gA6AEIEBB4CggB2Aw4CMgLKBAQGA/oCigCGAz4DNgQEegAeBAQSA9IAUgQEKgJCA84Dj0gAO
+AD0BaQWugGKvECgFrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYF
+xwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1oEBSoEBS4EBTIEBTYEBToEBT4EBUIEBUYEBUoEB
+U4EBVIEBVYEBVoEBV4EBWIEBWYEBWoEBW4EBXIEBXYEBXoEBX4EBYIEBYYEBYoEBY4EBZIEBZYEBZoEB
+Z4EBaIEBaYEBaoEBa4EBbIEBbYEBboEBb4EBcIEBcRD0EQETEOsQ5RDYEN8Q0xDdEOQRAQoQ1RP/////
+/////RDqEQEQENYQ6BDmENQQ1xD1EOIRAQEQ6REBAhDnEPAQ8hDsEQEEEOEQ4BDSEEoQ3hEBDxEBAxAF
+EEjSAA4APQBmBf+Aa6DSAA4APQFpBgKAYqDSAA4APQFpBgWAYqDSADcAOAYHBgiiBggANV5OU0lCT2Jq
+ZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBUAGYDVgNcA6cDrgO1A8MD1QPxA/8ECwQXBCUEMAQ+BFoE
+aAR7BI0EpwSxBL4EwATDBMYEyQTMBM4E0QTTBNYE2QTcBN8E4QTjBOYE6QTsBO8E+AUEBQYFCAURBRoF
+IwUuBTMFQgVVBV4FaQVrBW4FcAWZBaYFswXBBcsF2QXmBfgGDAYYBhoGHAYeBiAGJQYnBikGKwYtBi8G
+SgZRBloGdwaJBpQGnQapBrUGtwa5BrsGvgbABsIGxAbNBs8G0gbUBwkHGAciByoHMQdFB14Hdgd4B3oH
+fAd+B4AHggeEB4YHiAeJB4sHjAeOB5cHmQecB54Huwe9B78HwQfDB8UHxwfQB9IH1wfZB9sH/AgDCA0I
+DwgRCBMIFQgYCBkIGwgdCDUIZghyCIgInQisCL4IyQjTCOEI8wkACQ4JEwkVCRcJGQkeCSAJIgkkCSYJ
+KAktCTYJOglLCVIJWQliCWQJbQlvCXIJfwmICY0JjgmQCZkJogmvCbwJxQnQCdkJ4wnqCfYKIwovCjgK
+RApSClQKVgpYCloKXApeCmAKYgpkCm0Kbwp2CngKegp8CqkKsgq8CsYK0ArSCtQK1grYCtoK3ArfCuEK
+4wrlCucK8AryCvUK9wssCz4LSAtVC2ELawt0C38LgQuDC4ULhwuJC4sLjguQC5ILlAuWC5gLmgujC6UL
+ygvMC84L0AvSC9QL1gvYC9oL3AveC+AL4gvkC+YL6AvqC+wMCAwdDDoMWwx3DJ0MuwzhDP0NGQ02DU4N
+gg2cDbkN1Q4CDgsOEg4fDiUOMA5FDk8OWg5iDnQOdg54DnoOgw6FDpoOrQ67DsUOxw7JDssOzQ7iDu8O
++A8KDwwPDg8QDxIPFA8dDycPKRGLEZQRmxGtEbYRuBG9Eb8RwRHOEdYR2BHdEd8R4RHmEegR6hH9EgoS
+FRIhEiMSJRInEjASMhJ1EncSeRJ7En0SfxKBEoMShRKHEokSixKNEo8SkRKTEpUSlxKZEpsSnRKfEqES
+oxKlEqcSqRKrEq0SrxKxErMStRK+EskSyxLUEt0S4hLsEvUS9xMAEwkTCxMUEx0THxMoEzETMxM8E0UT
+RxNQE1kTWxNkE20TbxN4E4ETgxOME5UTlxOgE6kTqxO0E70TvxPIE9ET0xPcE+UT5xPwE/kT+xQEFA0U
+DxQYFCEUIxQsFDUUNxRAFEkUSxRUFF0UXxRoFHEUcxR8FIUUhxSQFJkUmxSkFK0UrxS4FMEUwxTMFNUU
+1xTgFOkU6xT0FP0U/xUIFREVExUcFSUVJxUwFTkVOxVEFU0VTxVYFWEVZhVuFXcVfBWNFY8VmBWaFZ0V
+phWrFbgVxRXHFcwVzhXQFdUV1xXZFeYV6BXqFfMV9RY4FjoWPBY+FkAWQhZEFkYWSBZKFkwWThZQFlIW
+VBZWFlgWWhZcFl4WYBZiFmQWZhZoFmoWbBZuFnAWchZ0FnYWeBaJFosWjRaPFqMWrBazFsIWyxbTFtUW
+5xbwFvcXBRcMFxUXHhc6F08XWBdaF10XXxdoF20Xdhd7F5wXpBe+F9EX5Rf8GBEYJBgmGCkYKxgtGC8Y
+MRgzGDUYQhhPGFcYWRhcGGUYahhyGH8YgRiEGJEYkxiYGJoYnBihGKMYpRi6GMYY1BjWGNgY2hjcGOMZ
+ARkOGRAZHBkxGTMZNRk3GTkZTRlaGVwZYRljGWUZahlsGW4ZehmHGY0ZjxmWGZ8ZpBm7GckZ0xncGecZ
+7hoGGhMaHRoqGiwaLho2Gj8aRBpNGlYaYRqGGo8amBqiGqQaphqoGqoarBquGrAauRrSGt8a6BrzGv4b
+Kxs2GzgbOhs8Gz4bQBtCG0QbTRtWG3EbixuUG50bqhvEG80b1BvvG/gb+hv/HAEcAxwcHCkcMxw7HD0c
+PxxBHEMcRRxHHEkcXhxgHGIcZBxmHG8ccRx0HHYcqxy4HMsc2BzaHNwc3hzgHOIc5BzmHOgc+xz+HQAd
+Ah0EHQ0dDx0aHRwdHh0gHSIdJB1JHUsdTR1PHVEdUx1VHVcdYB1iHWUdZx26Hdwd6R3+HhgeNB5PHnce
+gx6iHrEevR6/HsEeyh7MHs4ezx7RHtoe4x7lHuYe5x7pHuse7R72HwIfGx8nHykfKx8tHy8fMR9WH1gf
+Wh9cH14fYB9iH2Qfbx94H4EflR+qH6wfrh+wH7Ifyh/TH9wf6h/zH/Uf/iAAIAIgBCAGICsgOiBHIFIg
+YSBsIHcgeCB6IHwghSCHIJAgmSCbILggxCDJIMsgzSDPINEg0yDlIPYg+CEBIQMhBiETIRUhISE2ITgh
+OiE8IT4hUCFZIWQheCGKIashsCGyIbQhtiG4IbohvSG/Ickh3iHgIeIh5CHmIf8iFCIWIhgiGiIcIi8i
+OCJBIkoiTyJdIoIigyKFIocikCKSIpsinSK6IrwiviLAIsIixCLLIuwi7iLwIvIi9CL2IvgjHSMeIyAj
+IiMrIy0jNiM4I1UjVyNZI1sjXSNfI2QjeSN7I30jfyOBI40jriOwI7IjtCO2I7gjuiPfI+Aj4iPkI+0j
+7yPxJA4kECQSJBQkFiQYJCAkQSRDJEUkRyRJJEskTSRiJGQkZiRoJGokdCSBJIMkiCSRJJ4krCTFJOYk
+6CTqJOwk7iTwJPIk+yUVJTolPCU+JUAlQiVEJUYlTyVoJXElcyV2JXgljyWpJbUlyiXMJc4l0CXSJd8l
+6CXtJfsmFCYWJhgmGiYcJh4mICYiJigmMSY6JkYmXyZoJm0mgCaJJosmoCaiJqQmpiapJqwmryayJrUm
+uCa7Jtgm5ibwJvonAyciJyQnJicoJyonLCcuJ08nZid4J4MnkietJ8gn4SfjJ+Qn5ifnJ+kn6ifsJ+0n
+9if4KAcoCSgLKA0oDygRKBMoFSgpKDAoOyhDKE4oWSheKGAoaShuKHcogCiJKJwosSi+KOIo6CkFKQ4p
+FSktKTwpWSlbKV0pXylhKWMpZSl2KXgpeil7KX0phimIKZEpkymVKZcpmSmfKaspuCm9Kb8pyCnPKesp
++SoEKiEqIyolKigqKiosKi4qTipnKoQqhiqIKosqjSqPKpIqvSrhKv4rACsCKwUrBysJKwwrMytLK2gr
+aitsK28rcStzK3YrlyuxK9Ir3CveK+Ar4yvmK+gr6yvuLAosEywlLDIsNCw3LDosPSxALE8sYSyGLJws
+niygLKMspiypLKssriyxLNAs1yzuLPss/S0ALQMtBi0JLSotLC0uLTEtNC02LTktPC1VLWItZC1nLWot
+bS1wLZktmi23Lbktuy2+LcEtwy3GLe4t/C4VLh4uIC5dLl8uYS5jLmUuZy5pLmsubS5wLnIudC52Lngu
+ei58Ln4ugC6CLoQuhi6ILooujC6OLpAuki6ULpYumC6hLqMupi60Lr0uvy78Lv4vAC8CLwQvBi8ILwov
+DC8OLxAvEi8ULxYvGC8aLxwvHi8gLyIvJC8mLygvKi8sLy4vMC8yLzQvNi8/L0EvgC+CL4Qvhi+IL4ov
+jC+OL5Avki+VL5cvmS+bL50vny+hL6MvpS+nL6kvqy+tL68vsS+zL7Uvty+5L7svvS/GL8gwBzAKMA0w
+EDATMBYwGTAcMB8wIjAlMCgwKzAuMDEwNDA3MDowPTBAMEMwRjBJMEwwTzBSMFUwWDBbMF4wYTBuMIYw
+pjCrMLcwxDDYMPkxFzEjMTwxVDFqMYgxrDGzMesx+TIZMi8yTzJjMnkyjTKXMqkyvTLRMuky+zMEMwYz
+BzMQMxIzEzMcMx4zcTNzM3UzdzN5M3szfTN/M4EzgzOGM4gzizONM5AzkjOUM5YzmDOaM50znzOhM6Mz
+pTOnM6ozrDOuM7AzsjO0M7czuTO8M74zwDPDM8UzxzPJM9Iz1DQnNCo0LTQwNDM0NjQ5NDw0PzRCNEU0
+SDRLNE40UTRUNFc0WjRdNGA0YzRmNGk0bDRvNHI0dTR4NHs0fjSBNIQ0hzSKNI00kDSTNJY0mTScNJ80
+oTSkNKY0qDSqNKw0rjSwNLI0tTS3NMA0wjTFNMc0yTTLNM00zzTRNNM01jTYNNs03TTfNOE04zTmNOg0
+6jTsNO408DTzNPY0+DT6NQM1BTUGNQ81ETUSNRs1HTUeNSc1LAAAAAAAAAICAAAAAAAABgkAAAAAAAAA
+AAAAAAAAADU7A
+
+
+
diff --git a/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/keyedobjects.nib b/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/keyedobjects.nib
new file mode 100644
index 0000000..577bcb0
Binary files /dev/null and b/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/keyedobjects.nib differ
diff --git a/Treetop.tmbundle/Support/syntax_tree_viewer.rb b/Treetop.tmbundle/Support/syntax_tree_viewer.rb
new file mode 100644
index 0000000..0fd58c1
--- /dev/null
+++ b/Treetop.tmbundle/Support/syntax_tree_viewer.rb
@@ -0,0 +1,117 @@
+#!/usr/bin/env ruby
+require 'rubygems'
+require 'treetop'
+require "#{ENV["TM_SUPPORT_PATH"]}/lib/ui"
+
+# Monkey-patch SyntaxNode in a gross violation of its privacy.
+module Treetop
+ module Runtime
+ class SyntaxNode
+ def interesting_methods
+ # Copied from SyntaxNode#inspect
+ methods-[extension_modules.last ? extension_modules.last.methods : nil]-self.class.instance_methods
+ end
+
+ def to_hash
+ {
+ "class_and_modules" => self.class.to_s.sub(/.*:/,'') + extension_modules.map{|m| "+"+m.to_s.sub(/.*:/,'')}*"",
+ "offset" => interval.first,
+ "text_value" => text_value,
+ "methods" => interesting_methods * ", ",
+ "elements" => elements ? elements.map {|e| e.to_hash} : []
+ }
+ end
+ end
+ end
+end
+
+class SyntaxTreeViewer
+ def self.nib_path
+ File.dirname(__FILE__) + "/SyntaxTreeViewer.nib"
+ end
+
+ def self.new_with_unknown_grammar
+ parser = if ENV['TM_SCOPE'] =~ /source\.ruby/ && ENV['TM_SELECTED_TEXT']
+ eval(ENV['TM_SELECTED_TEXT'])
+ else
+ parser_file = if ENV['TM_SCOPE'] =~ /source\.treetop/
+ ENV['TM_FILEPATH']
+ else
+ ask_for_grammar
+ end
+ return unless parser_file
+ Treetop.load(parser_file)
+ end
+ new(parser.new)
+ end
+
+ def self.ask_for_grammar
+ files = TextMate::UI.request_file("title" => "Select a Grammar File")
+ if files.nil? || files.empty?
+ nil
+ else
+ files[0]
+ end
+ end
+
+ def self.nib_path
+ File.dirname(__FILE__) + "/nibs/SyntaxTreeViewer.nib"
+ end
+
+ def initialize(_parser)
+ @parser = _parser
+ run_parser!
+ end
+
+ def dialog
+ TextMate::UI.dialog(
+ :nib => self.class.nib_path,
+ :parameters => parameters
+ ) do |d|
+ d.wait_for_input do |params|
+ if params["returnArgument"]
+ self.input = params["returnArgument"]
+ run_parser!
+ d.parameters = parameters
+ true
+ else
+ false
+ end
+ end
+ end
+ end
+
+ def input
+ ENV['TM_TREETOP_SYNTAX_VIEWER_INPUT'] ||= ""
+ end
+
+ def input=(new_input)
+ ENV['TM_TREETOP_SYNTAX_VIEWER_INPUT'] = new_input
+ end
+
+ private
+ def run_parser!
+ if input && !input.empty?
+ @syntax_tree = @parser.parse(input)
+ TextMate::UI.alert(:warning, "Parse error", @parser.failure_reason) unless @syntax_tree
+ end
+ end
+
+ def parameters
+ p = {
+ "input" => input,
+ "syntax_tree" => @syntax_tree ? @syntax_tree.to_hash : {},
+ "selected_tab" => !input.empty? && @syntax_tree ? "Syntax Tree" : "Input"
+ }
+ puts p
+ p
+ end
+end
+
+if __FILE__ == $0
+ Dir.chdir("/Users/aobrien/Work/canopy/play/sparql/")
+ require "/Users/aobrien/Work/canopy/play/sparql/lib/sparql"
+ v = SyntaxTreeViewer.new(SparqlParser.new)
+ v.input = %{PREFIX foaf: SELECT ?foo WHERE { ?x foaf:knows ?y . ?z foaf:knows ?x .}}
+ v.dialog
+end