pax_global_header 0000666 0000000 0000000 00000000064 14337774710 0014527 g ustar 00root root 0000000 0000000 52 comment=b6a60e16e80f288dd25d45e372e5249f190f4561
treetop-1.6.12/ 0000775 0000000 0000000 00000000000 14337774710 0013300 5 ustar 00root root 0000000 0000000 treetop-1.6.12/.github/ 0000775 0000000 0000000 00000000000 14337774710 0014640 5 ustar 00root root 0000000 0000000 treetop-1.6.12/.github/workflows/ 0000775 0000000 0000000 00000000000 14337774710 0016675 5 ustar 00root root 0000000 0000000 treetop-1.6.12/.github/workflows/ci.yml 0000664 0000000 0000000 00000001543 14337774710 0020016 0 ustar 00root root 0000000 0000000 # This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
name: build
on: [pull_request, push]
jobs:
test:
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
ruby:
- '3.1'
- '3.0'
- '2.7'
- '2.6'
- '2.5'
- '2.4'
- '2.3'
- '2.2'
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
- run: bundle exec rspec
treetop-1.6.12/.gitignore 0000664 0000000 0000000 00000000173 14337774710 0015271 0 ustar 00root root 0000000 0000000 *.gem
*.iml
*.iws
*.ipr
website/*.html
benchmark/*.dat
benchmark/*.log
*~
.DS_Store
pkg
.bundle
Gemfile.lock
.ruby-version
treetop-1.6.12/.travis.yml 0000664 0000000 0000000 00000000103 14337774710 0015403 0 ustar 00root root 0000000 0000000 language: ruby
rvm:
- 2.1
- 2.0
- 1.9.3
- rbx-2
- jruby
treetop-1.6.12/Gemfile 0000664 0000000 0000000 00000000253 14337774710 0014573 0 ustar 00root root 0000000 0000000 source 'https://rubygems.org'
gem "polyglot", "~> 0.3"
gemspec
group :website do
platforms :ruby do
gem "bluecloth", "~> 2"
gem "erector", "~> 0.8"
end
end
treetop-1.6.12/History.txt 0000664 0000000 0000000 00000000702 14337774710 0015501 0 ustar 00root root 0000000 0000000 == 1.4.1 2009-09-04
* several enhancements:
* Many small-to-medium performance improvements
* Semantic predicates
* Support for UTF-8 characters
* Generation of graphvis DOT files for visualising parse results
* Commandline revamped with help
== 1.2.5 2009-03-10
* 1 minor enhancement:
* Extensions may always be modules, instead of sometimes modules, sometimes classes
== 0.0.1 2008-05-21
* 1 major enhancement:
* Initial release
treetop-1.6.12/LICENSE 0000664 0000000 0000000 00000002040 14337774710 0014301 0 ustar 00root root 0000000 0000000 Copyright (c) 2007 Nathan Sobo.
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.
treetop-1.6.12/README.md 0000664 0000000 0000000 00000027705 14337774710 0014572 0 ustar 00root root 0000000 0000000 [](https://travis-ci.org/cjheath/treetop)
Support
=======
Support for Treetop is provided through the mailing list you can join or browse here:
http://groups.google.com/group/treetop-dev
The gem is released from https://cjheath.github.io/treetop/ so you should check there as well.
Tutorial
========
Languages can be split into two components, their *syntax* and their *semantics*. It's your understanding of English syntax that tells you the stream of words "Sleep furiously green ideas colorless" is not a valid sentence. Semantics is deeper. Even if we rearrange the above sentence to be "Colorless green ideas sleep furiously", which is syntactically correct, it remains nonsensical on a semantic level. With Treetop, you'll be dealing with languages that are much simpler than English, but these basic concepts apply. Your programs will need to address both the syntax and the semantics of the languages they interpret.
Treetop equips you with powerful tools for each of these two aspects of interpreter writing. You'll describe the syntax of your language with a *parsing expression grammar*. From this description, Treetop will generate a Ruby parser that transforms streams of characters written into your language into *abstract syntax trees* representing their structure. You'll then describe the semantics of your language in Ruby by defining methods on the syntax trees the parser generates.
Parsing Expression Grammars, The Basics
=======================================
The first step in using Treetop is defining a grammar in a file with the `.treetop` extension. Here's a grammar that's useless because it's empty:
# my_grammar.treetop
grammar MyGrammar
end
Next, you start filling your grammar with rules. Each rule associates a name with a parsing expression, like the following:
# my_grammar.treetop
# You can use a .tt extension instead if you wish
grammar MyGrammar
rule hello
'hello chomsky'
end
end
The first rule becomes the *root* of the grammar, causing its expression to be matched when a parser for the grammar is fed a string. The above grammar can now be used in a Ruby program. Notice how a string matching the first rule parses successfully, but a second nonmatching string does not.
```ruby
# use_grammar.rb
require 'rubygems'
require 'treetop'
Treetop.load 'my_grammar'
# or just:
# require 'my_grammar' # This works because Polyglot hooks "require" to find and load Treetop files
parser = MyGrammarParser.new
puts parser.parse('hello chomsky') # => Treetop::Runtime::SyntaxNode
puts parser.parse('silly generativists!') # => nil
```
Users of *regular expressions* will find parsing expressions familiar. They share the same basic purpose, matching strings against patterns. However, parsing expressions can recognize a broader category of languages than their less expressive brethren. Before we get into demonstrating that, lets cover some basics. At first parsing expressions won't seem much different. Trust that they are.
Terminal Symbols
----------------
The expression in the grammar above is a terminal symbol. It will only match a string that matches it exactly. There are two other kinds of terminal symbols, which we'll revisit later. Terminals are called *atomic expressions* because they aren't composed of smaller expressions. A terminal symbol may use either double or single quotes. If the closing quote is immediately followed by the modifier 'i', the string is matched without case-sensitivity, that is, the input.downcase matches the terminal.downcase
Treetop now also supports regular expressions as terminals. Use a string as before, but append the modifier character 'r' (you can combine this with 'i' to get case-insensitive regular expressions). Regular expressions are generally faster than the equivalent parsing expressions, but may have polynomial worst-case behaviour, which is worse than parsing expressions. Your regular expression will always be anchored (by prepending \A) to test the current location of the input, so some special expressions like \b for word boundaries may give unexpected results.
Ordered Choices
---------------
Ordered choices are *composite expressions*, which allow for any of several subexpressions to be matched. These should be familiar from regular expressions, but in parsing expressions, they are delimited by the `/` character. Its important to note that the choices are prioritized in the order they appear. If an earlier expression is matched, no subsequent expressions are tried. Here's an example:
# my_grammar.treetop
grammar MyGrammar
rule hello
'hello chomsky' / 'hello lambek'
end
end
```ruby
# fragment of use_grammar.rb
puts parser.parse('hello chomsky') # => Treetop::Runtime::SyntaxNode
puts parser.parse('hello lambek') # => Treetop::Runtime::SyntaxNode
puts parser.parse('silly generativists!') # => nil
```
Note that once a choice rule has matched the text using a particular alternative at a particular location in the input and hence has succeeded, that choice will never be reconsidered, even if the chosen alternative causes another rule to fail where a later alternative wouldn't have. It's always a later alternative, since the first to succeed is final - why keep looking when you've found what you wanted? This is a feature of PEG parsers that you need to understand if you're going to succeed in using Treetop. In order to memoize success and failures, such decisions cannot be reversed. Luckily Treetop provides a variety of clever ways you can tell it to avoid making the wrong decisions. But more on that later.
Sequences
---------
Sequences are composed of other parsing expressions separated by spaces. Using sequences, we can tighten up the above grammar.
# my_grammar.treetop
grammar MyGrammar
rule hello
'hello ' ('chomsky' / 'lambek')
end
end
Note the use of parentheses to override the default precedence rules, which bind sequences more tightly than choices.
Once the whole sequence has been matched, the result is memoized and the details of the match will not be reconsidered for that location in the input.
Nonterminal Symbols
-------------------
Here we leave regular expressions behind. Nonterminals allow expressions to refer to other expressions by name. A trivial use of this facility would allow us to make the above grammar more readable should the list of names grow longer.
# my_grammar.treetop
grammar MyGrammar
rule hello
'hello ' linguist
end
rule linguist
'chomsky' / 'lambek' / 'jacobsen' / 'frege'
end
end
The true power of this facility, however, is unleashed when writing *recursive expressions*. Here is a self-referential expression that can match any number of open parentheses followed by any number of closed parentheses. This is theoretically impossible with regular expressions due to the *pumping lemma*.
# parentheses.treetop
grammar Parentheses
rule parens
'(' parens ')' / ''
end
end
The `parens` expression simply states that a `parens` is a set of parentheses surrounding another `parens` expression or, if that doesn't match, the empty string. If you are uncomfortable with recursion, its time to get comfortable, because it is the basis of language. Here's a tip: Don't try and imagine the parser circling round and round through the same rule. Instead, imagine the rule is *already* defined while you are defining it. If you imagine that `parens` already matches a string of matching parentheses, then its easy to think of `parens` as an open and closing parentheses around another set of matching parentheses, which conveniently, you happen to be defining. You know that `parens` is supposed to represent a string of matched parentheses, so trust in that meaning, even if you haven't fully implemented it yet.
Repetition
----------
Any item in a rule may be followed by a '+' or a '*' character, signifying one-or-more and zero-or-more occurrences of that item. Beware though; the match is greedy, and if it matches too many items and causes subsequent items in the sequence to fail, the number matched will never be reconsidered. Here's a simple example of a rule that will never succeed:
# toogreedy.treetop
grammar TooGreedy
rule a_s
'a'* 'a'
end
end
The 'a'* will always eat up any 'a's that follow, and the subsequent 'a' will find none there, so the whole rule will fail. You might need to use lookahead to avoid matching too much. Alternatively, you can use an occurrence range:
# toogreedy.treetop
grammar TooGreedy
rule two_to_four_as
'a' 2..4
end
end
In an occurrence range, you may omit either the minimum count or the maximum count, so that "0.. " works like "*" and "1.. " works like '+'.
Negative Lookahead
------------------
When you need to ensure that the following item *doesn't* match in some case where it might otherwise, you can use negat!ve lookahead, which is an item preceeded by a ! - here's an example:
# postcondition.treetop
grammar PostCondition
rule conditional_sentence
( !conditional_keyword word )+ conditional_keyword [ \t]+ word*
end
rule word
([a-zA-Z]+ [ \t]+)
end
rule conditional_keyword
'if' / 'while' / 'until'
end
end
Even though the rule `word` would match any of the conditional keywords, the first words of a conditional_sentence must not be conditional_keywords. The negative lookahead prevents that matching, and prevents the repetition from matching too much input. Note that the lookahead may be a grammar rule of any complexity, including one that isn't used elsewhere in your grammar.
Positive lookahead
------------------
Sometimes you want an item to match, but only if the *following* text would match some pattern. You don't want to consume that following text, but if it's not there, you want this rule to fail. You can append a positive lookahead like this to a rule by appending the lookahead rule preceeded by an & character.
Semantic predicates
-------------------
Warning: This is an advanced feature. You need to understand the way a packrat parser operates to use it correctly. The result of computing a rule containing a semantic predicate will be memoized, even if the same rule, applied later at the same location in the input, would work differently due to a semantic predicate returning a different value. If you don't understand the previous sentence yet still use this feature, you're on your own, so test carefully!
Sometimes, you need to run external Ruby code to decide whether this syntax rule should continue or should fail. You can do this using either positive or negative semantic predicates. These are Ruby code blocks (lambdas) which are called when the parser reaches that location. For this rule to succeed, the value must be true for a positive predicate (a block like &{ ... }), or false for a negative predicate (a block like !{ ... }).
The block is called with one argument, the array containing the preceding syntax nodes in the current sequence. Within the block, you cannot use node names or labels for the preceding nodes, as the node for the current rule does not yet exist. You must refer to preceding nodes using their position in the sequence.
grammar Keywords
rule sequence_of_reserved_and_nonreserved_words
( reserved / word )*
end
rule reserved
word &{ |s| symbol_reserved?(s[0].text_value) }
end
rule word
([a-zA-Z]+ [ \t]+)
end
end
One case where it is always safe to use a semantic predicate is to invoke the Ruby debugger, but don't forget to return true so the rule succeeds! Assuming you have required the 'ruby-debug' module somewhere, it looks like this:
rule problems
word &{ |s| debugger; true }
end
When the debugger stops here, you can inspect the contents of the SyntaxNode for "word" by looking at s[0], and the stack trace will show how you got there.
treetop-1.6.12/Rakefile 0000664 0000000 0000000 00000002234 14337774710 0014746 0 ustar 00root root 0000000 0000000 require 'bundler/gem_tasks'
require 'rspec/core/rake_task'
require File.expand_path("../lib/treetop/version", __FILE__)
task :default => :spec
RSpec::Core::RakeTask.new do |t|
t.pattern = 'spec/**/*spec.rb'
# t.libs << 'spec' # @todo not sure what this did in the original rspec 1.3
end
task :spec => 'lib/treetop/compiler/metagrammar.treetop'
file 'lib/treetop/compiler/metagrammar.treetop' do |t|
unless $bootstrapped_gen_1_metagrammar
load File.expand_path('../lib/treetop/bootstrap_gen_1_metagrammar.rb', __FILE__)
end
Treetop::Compiler::GrammarCompiler.new.compile(METAGRAMMAR_PATH)
end
task :rebuild do
$:.unshift "lib"
require './lib/treetop'
load File.expand_path('../lib/treetop/compiler/metagrammar.rb', __FILE__)
Treetop::Compiler::GrammarCompiler.new.compile('lib/treetop/compiler/metagrammar.treetop')
end
task :version do
puts 'Ruby is '+RUBY_VERSION
puts 'Treetop is '+Treetop::VERSION::STRING
end
desc 'Generate and upload website files'
task :website do
system <<-END
rm -rf .doc-tmp
cp -r doc .doc-tmp
git checkout gh-pages
rm -r doc
mv .doc-tmp doc
rake website upload
git checkout master
END
end
treetop-1.6.12/Treetop.tmbundle/ 0000775 0000000 0000000 00000000000 14337774710 0016533 5 ustar 00root root 0000000 0000000 treetop-1.6.12/Treetop.tmbundle/Preferences/ 0000775 0000000 0000000 00000000000 14337774710 0020774 5 ustar 00root root 0000000 0000000 treetop-1.6.12/Treetop.tmbundle/Preferences/Comments.tmPreferences 0000664 0000000 0000000 00000001307 14337774710 0025306 0 ustar 00root root 0000000 0000000
nameMiscscopesource.treetopsettingsdecreaseIndentPattern^\s*end\s*$increaseIndentPattern^\s*(grammar|rule)\s+\w+\s*$shellVariablesnameTM_COMMENT_STARTvalue# uuid1BC307B6-CE08-449E-9074-1AEAA5CE99F4
treetop-1.6.12/Treetop.tmbundle/Snippets/ 0000775 0000000 0000000 00000000000 14337774710 0020340 5 ustar 00root root 0000000 0000000 treetop-1.6.12/Treetop.tmbundle/Snippets/grammar ___ end.tmSnippet 0000664 0000000 0000000 00000000773 14337774710 0025126 0 ustar 00root root 0000000 0000000
contentgrammar ${1:GrammarName}
rule ${2:rule_name}
$0
end
endnamegrammar ... endscopesource.treetoptabTriggerguuid2AE73FBB-88B9-4049-B208-D2440A146164
treetop-1.6.12/Treetop.tmbundle/Snippets/rule ___ end.tmSnippet 0000664 0000000 0000000 00000000732 14337774710 0024442 0 ustar 00root root 0000000 0000000
contentrule ${1:rule_name}
$0
endnamerule ... endscopemeta.grammar.treetoptabTriggerruuid498A1881-498E-4BDA-9303-7E42B425C5EE
treetop-1.6.12/Treetop.tmbundle/Support/ 0000775 0000000 0000000 00000000000 14337774710 0020207 5 ustar 00root root 0000000 0000000 treetop-1.6.12/Treetop.tmbundle/Support/nibs/ 0000775 0000000 0000000 00000000000 14337774710 0021142 5 ustar 00root root 0000000 0000000 treetop-1.6.12/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/ 0000775 0000000 0000000 00000000000 14337774710 0025201 5 ustar 00root root 0000000 0000000 treetop-1.6.12/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/designable.nib 0000664 0000000 0000000 00000241611 14337774710 0027775 0 ustar 00root root 0000000 0000000
10509E17629949.33352.00YEScontentObject: parameterscontentObjectparameters25contentObject: selection.syntax_treeselection.syntax_tree274value: arrangedObjects.class_and_modulesvaluearrangedObjects.class_and_modules2240value: arrangedObjects.offsetarrangedObjects.offset2242value: arrangedObjects.text_valuearrangedObjects.text_value2244value: arrangedObjects.methodsarrangedObjects.methods2245value: selection.inputvalueselection.inputNSAlwaysPresentsApplicationModalAlerts2266argument: selection.inputargumentselection.inputNSSelectorNamereturnArgument:2271target: selection.controllertargetselection.controllerreturnArgument:2272selectedLabel: selection.selected_tabselectedLabelselection.selected_tab2274YES0YES-2RmlsZSdzIE93bmVyA-1First Responder-3Application372210YES211YES212YES214YES215YES221YES222213YES216YES223YES236226YES234YES235232YES233229YES230228YES231225224257YES258259260YESYES-1.IBPluginDependency-2.IBPluginDependency-3.IBPluginDependency210.IBPluginDependency210.IBWindowTemplateEditedContentRect210.NSWindowTemplate.visibleAtLaunch210.editorWindowContentRectSynchronizationRect211.IBPluginDependency212.IBPluginDependency213.IBPluginDependency214.IBPluginDependency215.IBPluginDependency216.IBPluginDependency221.IBPluginDependency222.IBPluginDependency223.IBPluginDependency224.IBPluginDependency225.IBPluginDependency226.IBPluginDependency228.IBPluginDependency229.IBPluginDependency230.IBPluginDependency231.IBPluginDependency257.IBPluginDependency258.IBPluginDependency259.IBPluginDependency260.IBPluginDependency3.IBPluginDependency72.IBPluginDependencyYES{{82, 256}, {1112, 670}}{{82, 256}, {1112, 670}}com.apple.InterfaceBuilder.CocoaPluginYESYESYESYESYESYES274YES03YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA
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
treetop-1.6.12/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/keyedobjects.nib 0000664 0000000 0000000 00000040570 14337774710 0030354 0 ustar 00root root 0000000 0000000 bplist00Ô
X$versionT$topY$archiverX$objects † Ñ ]IB.objectdata€_NSKeyedArchiver¯w 1 5 6 ; <