From ff17d5f9badab33cef99dd8934df24591a15d452 Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Sun, 8 Mar 2015 22:24:15 -0700 Subject: [PATCH] Show markdown description text on item detail page * Update build process to *not* copy over prerendered pages during a regular build (only during a `dist` build) * Add dependency on npm "markdown" package and include it in the scripts loaded in the default layout * Update the Item model to be able to load from a *.cg file * Add an ItemParser to process the `item.cg` file * Update the general parser to be able to work with HereDoc-style text blocks * Add a markdown-specific stylesheet * Add a sample of the `item.cg` file format (Advanced Crafting Table) --- Gruntfile.coffee | 22 +++++- package.json | 1 + src/coffee/constants.coffee | 17 ++--- src/coffee/controllers/item_controller.coffee | 8 +-- .../controllers/item_group_controller.coffee | 1 - .../controllers/item_page_controller.coffee | 66 ++++++++++++------ src/coffee/models/item.coffee | 13 ++++ src/coffee/models/item_page.coffee | 4 ++ src/coffee/models/item_parser.coffee | 19 +++++ src/coffee/models/mod_version.coffee | 2 +- .../command_parser_version_base.coffee | 20 +++--- .../parser_versions/item_parser_v1.coffee | 13 ++-- .../command_parser_version_base.test.coffee | 11 +-- src/coffee/views.js | 2 +- src/jade/layouts/basic.jade | 1 + src/jade/templates/item_page.jade | 5 +- src/scss/main.scss | 1 + src/scss/markdown.scss | 22 ++++++ src/scss/templates/item_page.scss | 9 --- .../advanced_crafting_table/gui.png | Bin 0 -> 40340 bytes .../advanced_crafting_table/item.cg | 15 ++++ 21 files changed, 183 insertions(+), 69 deletions(-) create mode 100644 src/coffee/models/item_parser.coffee create mode 100644 src/scss/markdown.scss create mode 100644 static/browse/buildcraft/advanced_crafting_table/gui.png create mode 100644 static/browse/buildcraft/advanced_crafting_table/item.cg diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 1ae4f6c8b..cda277c2c 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -22,6 +22,7 @@ module.exports = (grunt)-> extensions: ['.coffee'] files: './dist/js/main.js': ['./src/coffee/main.coffee'] + test: options: transform: ['coffeeify'] @@ -30,6 +31,15 @@ module.exports = (grunt)-> extensions: ['.coffee'] files: './dist/js/test.js': ['./src/coffee/test/test.coffee'] + + markdown: + options: + browserifyOptions: + debug: false + standalone: 'markdown' + files: + './dist/js/markdown.js': ['./node_modules/markdown/lib/index.js'] + when: options: browserifyOptions: @@ -102,6 +112,12 @@ module.exports = (grunt)-> src: './static/' dest: './dist/' recursive: true + non_html: + options: + src: './static/' + dest: './dist/' + exclude: '*.html' + recursive: true sass: build: @@ -134,7 +150,7 @@ module.exports = (grunt)-> tasks: ['browserify:main'] jade: files: ['./src/**/*.jade'] - tasks: ['jade:pages', 'jade:templates'] + tasks: ['jade:pages', 'jade:templates', 'browserify:main'] sass: files: ['./src/**/*.scss'] tasks: ['sass', 'copy:styles'] @@ -144,8 +160,8 @@ module.exports = (grunt)-> grunt.registerTask 'default', 'build' - grunt.registerTask 'build', [ 'rsync', 'copy', 'sass:build', 'jade', 'browserify', 'exorcise' ] + grunt.registerTask 'build', [ 'rsync:non_html', 'copy', 'sass:build', 'jade', 'browserify', 'exorcise' ] - grunt.registerTask 'dist', ['clean', 'build', 'copy:index_prerender', 'sass:dist', 'uglify'] + grunt.registerTask 'dist', ['clean', 'build', 'rsync:static', 'copy:index_prerender', 'sass:dist', 'uglify'] grunt.registerTask 'clean-watch', ['clean', 'build', 'watch'] diff --git a/package.json b/package.json index e05b1095e..be459bc64 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "chai": "^1.10.0", "jade": "^1.8.2", "jquery": "^2.1.3", + "markdown": "^0.5.0", "mocha": "^2.0.1", "sinon": "^1.12.2", "sinon-chai": "^2.6.0", diff --git a/src/coffee/constants.coffee b/src/coffee/constants.coffee index 7faac4801..f69892e5e 100644 --- a/src/coffee/constants.coffee +++ b/src/coffee/constants.coffee @@ -56,14 +56,15 @@ ModelState.failed = 'failed' exports.Text = Text = {} Text.title = 'Crafting Guide for Minecraft | The Ultimate Step-by-Step Tutorial for Making Anything in Minecraft' -exports.Url = Url = {} -Url.crafting = _.template "/craft/<%= inventoryText %>" -Url.itemIcon = _.template "/browse/<%= modSlug %>/<%= itemSlug %>/icon.png" -Url.item = _.template "/browse/<%= modSlug %>/<%= itemSlug %>/" -Url.mod = _.template "/browse/<%= modSlug %>/" -Url.modData = _.template "/data/<%= modSlug %>/mod.cg" -Url.modIcon = _.template "/browse/<%= modSlug %>/icon.png" -Url.modVersion = _.template "/data/<%= modSlug %>/<%= modVersion %>/mod-version.cg" +exports.Url = Url = {} +Url.crafting = _.template "/craft/<%= inventoryText %>" +Url.item = _.template "/browse/<%= modSlug %>/<%= itemSlug %>/" +Url.itemData = _.template "/browse/<%= modSlug %>/<%= itemSlug %>/item.cg" +Url.itemIcon = _.template "/browse/<%= modSlug %>/<%= itemSlug %>/icon.png" +Url.mod = _.template "/browse/<%= modSlug %>/" +Url.modData = _.template "/data/<%= modSlug %>/mod.cg" +Url.modIcon = _.template "/browse/<%= modSlug %>/icon.png" +Url.modVersionData = _.template "/data/<%= modSlug %>/<%= modVersion %>/mod-version.cg" exports.UrlParam = UrlParam = {} UrlParam.quantity = 'count' diff --git a/src/coffee/controllers/item_controller.coffee b/src/coffee/controllers/item_controller.coffee index 4cc196d26..e05056db6 100644 --- a/src/coffee/controllers/item_controller.coffee +++ b/src/coffee/controllers/item_controller.coffee @@ -18,8 +18,8 @@ module.exports = class ItemController extends BaseController options.templateName = 'item' super options - @_imageLoader = options.imageLoader - @_modPack = options.modPack + @imageLoader = options.imageLoader + @modPack = options.modPack # BaseController Overrides ##################################################################### @@ -30,9 +30,9 @@ module.exports = class ItemController extends BaseController super refresh: -> - display = @_modPack.findItemDisplay @model.slug + display = @modPack.findItemDisplay @model.slug - @_imageLoader.load display.iconUrl, @$icon + @imageLoader.load display.iconUrl, @$icon @$name.html display.itemName @$nameLink.attr 'href', display.itemUrl diff --git a/src/coffee/controllers/item_group_controller.coffee b/src/coffee/controllers/item_group_controller.coffee index e0383506d..52450b8a7 100644 --- a/src/coffee/controllers/item_group_controller.coffee +++ b/src/coffee/controllers/item_group_controller.coffee @@ -76,7 +76,6 @@ module.exports = class ItemGroupController extends BaseController delay += @_delayStep else controller.model = item - controller.refresh() controllerIndex += 1 while @_itemControllers.length > controllerIndex diff --git a/src/coffee/controllers/item_page_controller.coffee b/src/coffee/controllers/item_page_controller.coffee index e0de87e89..030872a94 100644 --- a/src/coffee/controllers/item_page_controller.coffee +++ b/src/coffee/controllers/item_page_controller.coffee @@ -57,15 +57,17 @@ module.exports = class ItemPageController extends PageController imageLoader: @imageLoader modPack: @modPack - @$usedAsToolToMakeSection = @$('.usedAsToolToMake') @$byline = @$('.byline') @$bylineLink = @$('.byline a') @$craftingPlanLink = @$('a.craftingPlan') + @$descriptionPanel = @$('.description .panel') + @$descriptionSection = @$('.description') @$name = @$('h1.name') @$recipeContainer = @$('.recipes .panel') @$recipesSection = @$('.recipes') @$similarSection = @$('.similar') @$titleImage = @$('.titleImage img') + @$usedAsToolToMakeSection = @$('.usedAsToolToMake') @$usedToMakeSection = @$('.usedToMake') super @@ -84,6 +86,7 @@ module.exports = class ItemPageController extends PageController @$el.slideUp duration:Duration.normal @_refreshByline() + @_refreshDescription() @_refreshRecipes() @_refreshSimilarItems() @_refreshUsedAsToolToMake() @@ -100,15 +103,6 @@ module.exports = class ItemPageController extends PageController # Private Methods ############################################################################## - _refreshUsedAsToolToMake: -> - @_usedAsToolToMakeController.title = 'Used as Tool to Make' - - @_usedAsToolToMakeController.model = @model.findToolForRecipes() - if @_usedAsToolToMakeController.model? - @$usedAsToolToMakeSection.slideDown duration:Duration.normal - else - @$usedAsToolToMakeSection.slideUp duration:Duration.normal - _refreshByline: -> mod = @model.item?.modVersion?.mod if mod?.name?.length > 0 @@ -118,14 +112,15 @@ module.exports = class ItemPageController extends PageController else @$byline.fadeOut duration:Duration.fast - _refreshUsedToMake: -> - @_usedToMakeController.title = 'Used to Make' - - @_usedToMakeController.model = @model.findComponentInItems() - if @_usedToMakeController.model? - @$usedToMakeSection.slideDown duration:Duration.normal + _refreshDescription: -> + logger.debug "refreshing description" + logger.debug "item.description: #{@model?.item?.description}" + description = @model.compileDescription() + if description? + @$descriptionPanel.html description + @$descriptionSection.slideDown duration:Duration.normal else - @$usedToMakeSection.slideUp duration:Duration.normal + @$descriptionSection.slideUp duration:Duration.normal _refreshRecipes: -> @_recipeControllers ?= [] @@ -165,10 +160,35 @@ module.exports = class ItemPageController extends PageController else @$similarSection.slideUp duration:Duration.normal - _resolveItemSlug: -> - item = @modPack.findItem @_itemSlug, includeDisabled:false - if item? and not ItemSlug.equal item.slug, @_itemSlug - router.navigate Url.item(modSlug:item.slug.mod, itemSlug:item.slug.item), trigger:true - return + _refreshUsedAsToolToMake: -> + @_usedAsToolToMakeController.title = 'Used as Tool to Make' - @model.item = item + @_usedAsToolToMakeController.model = @model.findToolForRecipes() + if @_usedAsToolToMakeController.model? + @$usedAsToolToMakeSection.slideDown duration:Duration.normal + else + @$usedAsToolToMakeSection.slideUp duration:Duration.normal + + _refreshUsedToMake: -> + @_usedToMakeController.title = 'Used to Make' + + @_usedToMakeController.model = @model.findComponentInItems() + if @_usedToMakeController.model? + @$usedToMakeSection.slideDown duration:Duration.normal + else + @$usedToMakeSection.slideUp duration:Duration.normal + + _resolveItemSlug: -> + return if @model.item? + + item = @modPack.findItem @_itemSlug, includeDisabled:false + if item? + if not ItemSlug.equal item.slug, @_itemSlug + router.navigate Url.item(modSlug:item.slug.mod, itemSlug:item.slug.item), trigger:true + return + + @model.item = item + item.fetch() + item.on Event.sync, => + logger.debug "item loaded" + @refresh() diff --git a/src/coffee/models/item.coffee b/src/coffee/models/item.coffee index ad77fe109..ee0cdf387 100644 --- a/src/coffee/models/item.coffee +++ b/src/coffee/models/item.coffee @@ -10,6 +10,7 @@ BaseModel = require './base_model' ItemSlug = require './item_slug' Recipe = require './recipe' StringBuilder = require './string_builder' +{Url} = require '../constants' ######################################################################################################################## @@ -57,6 +58,18 @@ module.exports = class Item extends BaseModel Object.defineProperties @prototype, isCraftable: {get:@prototype.getIsCraftable} + # Backbone.Model Overrides ##################################################################### + + parse: (text)-> + ItemParser = require './item_parser' # to avoid require cycles + @_parser ?= new ItemParser model:this + @_parser.parse text + + return null # prevent calling `set` + + url: -> + return Url.itemData modSlug:@slug.mod, itemSlug:@slug.item + # Object Overrides ############################################################################# toString: -> diff --git a/src/coffee/models/item_page.coffee b/src/coffee/models/item_page.coffee index c6885b6fe..264976e94 100644 --- a/src/coffee/models/item_page.coffee +++ b/src/coffee/models/item_page.coffee @@ -20,6 +20,10 @@ module.exports = class ItemPage extends BaseModel # Property Methods ############################################################################# + compileDescription: -> + return null unless @item?.description? + return markdown.parse @item.description + findComponentInItems: -> return @_findRecipesMatching (recipe)=> recipe.requires @item.slug diff --git a/src/coffee/models/item_parser.coffee b/src/coffee/models/item_parser.coffee new file mode 100644 index 000000000..f3cc5be07 --- /dev/null +++ b/src/coffee/models/item_parser.coffee @@ -0,0 +1,19 @@ +### +Crafting Guide - item_parser.coffee + +Copyright (c) 2014-2015 by Redwood Labs +All rights reserved. +### + +VersionedParserBase = require './versioned_parser_base' +ItemParserV1 = require './parser_versions/item_parser_v1' + +######################################################################################################################## + +module.exports = class ItemParser extends VersionedParserBase + + # VersionedParserBase Overrides ################################################################ + + _createParsers: (options)-> + return result = + '1': new ItemParserV1 options diff --git a/src/coffee/models/mod_version.coffee b/src/coffee/models/mod_version.coffee index e4acb95eb..3dd5bd298 100644 --- a/src/coffee/models/mod_version.coffee +++ b/src/coffee/models/mod_version.coffee @@ -171,7 +171,7 @@ module.exports = class ModVersion extends BaseModel return null # prevent calling `set` url: -> - return Url.modVersion modSlug:@modSlug, modVersion:@version + return Url.modVersionData modSlug:@modSlug, modVersion:@version # Object Overrides ############################################################################# diff --git a/src/coffee/models/parser_versions/command_parser_version_base.coffee b/src/coffee/models/parser_versions/command_parser_version_base.coffee index c286b1fda..c9b29050d 100644 --- a/src/coffee/models/parser_versions/command_parser_version_base.coffee +++ b/src/coffee/models/parser_versions/command_parser_version_base.coffee @@ -78,7 +78,7 @@ module.exports = class CommandParserVersionBase line = line.trim() return [] if line.length is 0 - hereDoc = @_parseHereDoc line + [line, hereDoc] = @_parseHereDoc line lineParts = (part.trim() for part in line.split(';')) commands = [] @@ -89,8 +89,10 @@ module.exports = class CommandParserVersionBase if not match? then throw new Error "Expected : , but found: \"#{linePart}\"" args = [] - args = (s.trim() for s in match[2].split(',')) if match[2]? - args.push hereDoc if hereDoc + args = (s for s in match[2].split(',') when s.length > 0) if match[2]? + args = (s.trim() for s in args) + args = (s for s in args when s.length > 0) + args.push hereDoc if hereDoc? commands.push name:match[1], args:args return commands @@ -107,9 +109,11 @@ module.exports = class CommandParserVersionBase _parseHereDoc: (line)-> hereDocIndex = line.indexOf '<<-' - return null unless hereDocIndex isnt -1 + return [line, null] unless hereDocIndex isnt -1 hereDocStopText = line[hereDocIndex+3...line.length] + line = line[0...hereDocIndex] + hereDocLines = [] while true @_lineNumber += 1 @@ -120,11 +124,11 @@ module.exports = class CommandParserVersionBase hereDocLines.push nextLine shortestIndent = Number.MAX_VALUE - for line in hereDocLines - shortestIndent = Math.min line.match(/( *).*/)[1].length, shortestIndent + for hereDocLine in hereDocLines + shortestIndent = Math.min hereDocLine.match(/( *).*/)[1].length, shortestIndent for i in [0...hereDocLines.length] hereDocLines[i] = hereDocLines[i][shortestIndent..] - return null unless hereDocLines.length > 0 - return hereDocLines.join '\n' + return [line, null] unless hereDocLines.length > 0 + return [line, hereDocLines.join('\n')] diff --git a/src/coffee/models/parser_versions/item_parser_v1.coffee b/src/coffee/models/parser_versions/item_parser_v1.coffee index b658df195..251bce482 100644 --- a/src/coffee/models/parser_versions/item_parser_v1.coffee +++ b/src/coffee/models/parser_versions/item_parser_v1.coffee @@ -22,16 +22,17 @@ module.exports = class ItemParserV1 extends CommandParserVersionBase # Command Methods ############################################################################## _command_description: (textParts...)-> - @_rawData.text ?= '' - @_rawData.text += textParts.join ', ' + @_rawData.description ?= '' + @_rawData.description += textParts.join ', ' _command_officialUrl: (officialUrl)-> if @_rawData.officialUrl? then throw new Error 'duplicate declaration of "officialUrl"' if officialUrl.length is 0 then throw new Error 'officialUrl cannot be empty' @_rawData.officialUrl = officialUrl - _command_video: (youTubeId, name)-> + _command_video: (youTubeId, nameParts...)-> if not youTubeId?.length then throw new Error 'video declaration requires a YouTubeID' + name = nameParts.join ', ' if not name?.length then throw new Error 'video declaration requires a name' @_rawData.videos ?= [] @@ -40,6 +41,6 @@ module.exports = class ItemParserV1 extends CommandParserVersionBase # Object Building Methods ###################################################################### _buildItem: (rawData, model)-> - item.description = rawData.description if rawData.description - item.officialUrl = rawData.officialUrl if rawData.officialUrl - item.videos = rawData.videos if rawData.videos + model.description = rawData.description if rawData.description + model.officialUrl = rawData.officialUrl if rawData.officialUrl + model.videos = rawData.videos if rawData.videos diff --git a/src/coffee/test/parser_versions/command_parser_version_base.test.coffee b/src/coffee/test/parser_versions/command_parser_version_base.test.coffee index 48e09df7c..6cfe148a7 100644 --- a/src/coffee/test/parser_versions/command_parser_version_base.test.coffee +++ b/src/coffee/test/parser_versions/command_parser_version_base.test.coffee @@ -21,25 +21,28 @@ describe 'command_parser_version_base.coffee', -> it 'returns null for non-heredoc lines', -> result = parser._parseHereDoc 'foobar: baz' - expect(result).to.be.null + expect(result[1]).to.be.null it 'identifies the right text for a real heredoc', -> parser._lines = ['command: <<-END', 'alpha', 'bravo', 'charlie', 'END', 'command1: arg2'] parser._lineNumber = 1 result = parser._parseHereDoc parser._lines[0] - result.should.equal 'alpha\nbravo\ncharlie' + result[0].should.equal 'command: ' + result[1].should.equal 'alpha\nbravo\ncharlie' it 'identifies an empty heredoc', -> parser._lines = ['command: <<-END', 'END'] parser._lineNumber = 1 result = parser._parseHereDoc parser._lines[0] - expect(result).to.be.null + result[0].should.equal 'command: ' + expect(result[1]).to.be.null it 'trims smallest leading whitespace', -> parser._lines = ['command: <<-END', ' alpha', ' bravo', ' charlie', 'END', 'command1: arg2'] parser._lineNumber = 1 result = parser._parseHereDoc parser._lines[0] - result.should.equal 'alpha\n bravo\ncharlie' + result[0].should.equal 'command: ' + result[1].should.equal 'alpha\n bravo\ncharlie' diff --git a/src/coffee/views.js b/src/coffee/views.js index 976afc0aa..11389a338 100644 --- a/src/coffee/views.js +++ b/src/coffee/views.js @@ -103,7 +103,7 @@ var buf = []; var jade_mixins = {}; var jade_interp; -buf.push("

See Crafting Plan

\n\n\n\n

from

Recipes

");;return buf.join(""); +buf.push("

See Crafting Plan

\n\n\n\n

from

Description

Recipes

");;return buf.join(""); }; this["JST"]["minimal_recipe"] = function template(locals) { diff --git a/src/jade/layouts/basic.jade b/src/jade/layouts/basic.jade index 1f685b817..610864710 100644 --- a/src/jade/layouts/basic.jade +++ b/src/jade/layouts/basic.jade @@ -34,4 +34,5 @@ html script(src="/js/jquery.js") script(src="/js/backbone.js") script(src="/js/jade.js") + script(src="/js/markdown.js") script(src="/js/when.js") diff --git a/src/jade/templates/item_page.jade b/src/jade/templates/item_page.jade index e782fd9e6..753e58349 100644 --- a/src/jade/templates/item_page.jade +++ b/src/jade/templates/item_page.jade @@ -15,7 +15,10 @@ .mainBody h1.name .byline: p from - .description: p + + .description.section + h2 Description + .panel.markdown .recipes.section h2 Recipes diff --git a/src/scss/main.scss b/src/scss/main.scss index 5cd269330..02618d70c 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -86,6 +86,7 @@ $layer-dialog: 1000; // Child Stylesheets /////////////////////////////////////////////////////////////////////////////////////////////////// @import 'classes'; +@import 'markdown'; @import 'tags'; @import 'views'; diff --git a/src/scss/markdown.scss b/src/scss/markdown.scss new file mode 100644 index 000000000..01cd3fd7e --- /dev/null +++ b/src/scss/markdown.scss @@ -0,0 +1,22 @@ +/* +Crafting Guide - markdown.scss + +Copyright (C) 2015 by Redwood Labs +All rights reserved. +*/ + +.markdown { + + p { + font-family: $font-family-normal; + font-size: $font-size-normal; + line-height: $font-size-normal + 0.25em; + } + + img { + position: relative; left: 50%; + @include transform(translateX(-50%)); + margin: 2em 0; + text-align: center; + } +} diff --git a/src/scss/templates/item_page.scss b/src/scss/templates/item_page.scss index cfb35e203..5903b096c 100644 --- a/src/scss/templates/item_page.scss +++ b/src/scss/templates/item_page.scss @@ -31,15 +31,6 @@ All rights reserved. } } - .description { - margin-bottom: 4em; - - p { - font-family: $font-family-normal; - font-size: $font-size-large; - } - } - .recipes { display: none; diff --git a/static/browse/buildcraft/advanced_crafting_table/gui.png b/static/browse/buildcraft/advanced_crafting_table/gui.png new file mode 100644 index 0000000000000000000000000000000000000000..1001ce3d216d6515c5c9d9f4d2653746bb961650 GIT binary patch literal 40340 zcmbSzbyU>R+vm^&j4*UJNJvX}gLFwsr_xGycZrnJD4jzp-5?;{9n#$m`^DeB`<~si zXaCr9fElK~H=g@EpSX7-RF!34pb?{iK%f_IwoR}72{JdzN=vHC-1KMRG`|F5qnN z1#&&AO#LU`Mif3b6bg1M$63nikv3#|ORLqdB+}xf?hZ+%WJea9A8GXy$*gQ6>KN2N zOMmmU`ts+{vUOtbLCs+D?c`g7$v^f9EFu)yR9eErXI_~f)Q9VRhmSm{Bz=VCS&h1m zd=K`rRT=hz{BCztR;>sfnbEN?B~6I>s?@6?aFp_#AThWA#qi90_ULc2$?bg~-|B`? zsq&T273TVfV~497@D4!PAw>;ruh3|VT=mP?A#i)fQ3SM5ExR=8-(YEKV}1;@2`gkO z$_*7Kev}p+kO`r4*V>BrqdZx#KcgRg*J%a37!@KSsFVE|R%)oMj!T#oN;r@-UgH%> z#|C2GXy8sfm8BUQ4RB}PJc#-L|M6xWIqLLEAE7F*QR5eXR;cM2ibRg;6tV=kAxPZ0 zOHhmtzp8WwJ-qYD@lB#qMq;juaipof)TT~0Gv_8EQ8dG>)wHW@rYOS1zOR;XYLeJ z1KOFXbNV|J#RAM>U{g88$us=RV*p?H=mRC(TM4VMKd(YiEuUJiiSaPeEHX|G8;?wv zwOaxk75K#hs;_cp{BQ?e$w>{}okM3MD+6oY zm868plI+;9KlB5fh%G9|qU8U>`2DRHBY zQGz^mU%bJkilPQlLechQ@DxOB2GaG4K~P%MXcLA3^Ins}{+ZuiJK5Y);$oIgSO$xW zu^u(c#VI*-X1)ck?1kjY)!((qzxbP1>;6z@1b#68d{<>CGxhW&4iE$VHpea!Tr%3m zm4^8YlvBWW@IeaY0%r#(ll*j&;Rdwabh{I*jiQ3+Y2-N(->}w8#;}NKQ63BFWMM)E ziq}+G_1_J_g96F0uHnTONk&3{LjG`>5Tm`?qAPUAiDce8Nzz+F(NMO6liT2|T_gA8 zUw@4bkH58rb+ikwkI&l3iQNgwl1jlA;$Q@6t>puYHy2!l$&+Q^ z?m$CUDB83;1N;;NB6*93ZgM+2gizAEkBJ;{lagO@UwRZ>XxPlj1TM|fbK;il^et)@ z0<$VN#H!1BdFYdiC&s~@W7KC=hD2^DwFzE5!BU6r505Y3fK6=euypGVYQQi81Zg$f z(3%OGP?P=>;_pPfwHw+^eThDc0g369E)mTGB*sTPuBd6N*MzxV`by_? z+rp-c2N>`Rk-<&oRva6j4bRf$q zp_R<&Z#V~H#+Sb&J1m0xF#WD2$1kdfMfSe=Jv}}Ul9Jk5RO^MNTxJP-;a68z-@3fY zbaQpZw;IkYt8%b2Drt4tJ2EnJbcEhr9bIX*Xx+^{9Cc$f4h^Cn#EjZ_OQrGXyBNXz zvMj(b7r%+@hR);g#XqOPaG_9ti-{rax-2AQkT(o0_9DGHotTd;8L9hkj814`I?$<_ zcW0jpGs7=*OEYT!tj~CcxUQLy%B*>iGX~MG1;?3C_H7cmCFEvLDIynKVoS8KD;jXr zc&-Vtn7n_FO2B4V+TeGxCe6&k!k?U$np*g^Wy#5=b@6O?Xy_ZFMczbJz1H&4*ckT9 zmoIl&x2Bd{AH7bnw@Z;a*>8!#u@-isJx;zIA63nZ?u(pXO4Y@gfrc^?j9()WI+AaG z9w7Tke5Sgm%}l1phYd%Cm_RF$Ji&7VFV4+MtpJs$3(w2_bx`O$r*+ghhh{3zs&baJ z(GcqX!9*}-F28eH>PJ3{#0oED%R}7jq|!G%6NYbd7%(_AwD$M+7e3eh)SbsDww7=j z*;wPFrDmIns@e_UiMPW~ofMByU>eGozG`y~cSbc^PVQJft#wE7d7PRL?AgeEh>$D8 z=n}Fv%hJ%N$YDUE{mpctW-E7jJw@QQ#lkxVvb8K;Y-uDen`PhkSb?*hYnpWi;x~MX|GjmFKaWgB z9vd+4u_@DLMkF{_3HGIac{?$6%dyo~!={dos`bKxf>C*Sbj?c-cUNfwQf9ZGX=D{) zm>^H@mA=n3z-ZEv`<$!wV$?1jbt*gmYsi`^lp^~*nILC~Bd2{rzjknF3aIc|Cjrfg ziPdn})eo%!BYry)4>P;cYgxLDBjq=ZB$}C>o+9H?Z@m-CjQ_E7gTZ|#`V(?o9LPYQSOtqED5)Rk!S1b;01|?0?M+5H-;`F_^)AxB#eF(?PHV*dH7!q$O zRYV_ZPS+`(2tn-J+|pMaxuxKW@m$8*n}ODQ1(1KGJI;+wYrEgm&7`1XxCHFg$XPN~d zpi+iCyVugZBDdQ#wAiS@o!oUc_Wp9Tf##gEmzRu*mSe)imCZ)|{e4SNtzX=U7xMF9 zFeo}Y+Su4Qdxr;;Od!~-H@3F+;nUU-_av)@S@oW3!NJ4LfV5)fhhZf~#yRFxpM$>@to_`(^OH zaJcYcjMm8-=JA=%;VXaA6R!XMq+p`50Y~{svMt7F>*93k9_0AlHf2nprtGQ6UzNd5 zit)w5gH`SLk%wx#X(763s~{q1CbJ>3Jn+|dBZ$k|hmVbRo}1qSi+=N!zpP)6x{k3~ zObcSpO=r?u{4TC&z(QTCbMj8WQ&$Sk+yT5z{(=%}5szoFz|_yPBc51=Ew9UMCqUnj zOfgH2h-IO;g}6`gVr@-!AeBvi23u3O3cww+A8#GIn1vFj#E^m|-kSlJS*_@O1cQ$0 z*PpPA((hvEd;}jo_u~x4pN_J;OZqSU9(rrugZK8D#ieMX&2C$7*8dQaLyS)+uwBV^ zyZ#n&4f(`(4jnT8?QS$FuJ7Kr44^t#EKFdtRiVW8UVpV_witA50La3!MTE6ho{mS@#QKR6!Vk2(+Y z{Y3($AwWbZD$?uf`TN#@;Zn?$UoUCwJQgLL3@gm_5iyo$IZ9U6B`f?F3DavV-mAP0 z#iC&jIj?+hjIRH%Icuk?_TGx<}>tC5}UC5{R(bj3lZnb^&+D&%}du8uyDy< z<^v+#*6147kMogYGV7>f34Jovu=@Vf;nT&_WNYcAVpBQ7SE1VA3i8PBUR*P(9%30v z+y>-h@Jt-gik-wM$>(69*`EryA2Q;uE2{OHZDSgwaL{oP?p}D3184oHDb{VDNTibAT& zSt{Gt?y6U9rhIFklnP2QfXT$|Z}{7;Y=zmaAdq)adJ_?hiw1BBHl4yK)aSUvMayFa zYhvX{>Hzo9IIrVgn~Zy%&ezcrNZyytTz|Sj7A6mo`7rDp9+?*T6Fj(txF3N2WE^<68H$0>_&R?4ZrfDnyJOI}L- z=JY-vN2Lo?Mf9x6mu%xmLgH!Lgp0tKHYFr*smMr#6V23GbE`XpiW4@HWnJKAd)&xLX)k*sTF_YF@zol&t{q} zNPbjT_Ohq)*l}pec|AX!TOVleRN|AO<|le;U4GJF7$lDpsA(u#p1Bb+Y7!-R=0E4 z3;ppc?(2Ky9kz$=tBFW^qmlW-!QKz|u4$6<;J($)FsI`c@#xrC^*h{tCYYdJmj(in z%8qS~4pC4Tarp8TVdZfA(|QEDrzc&HdMv8xE1oV_k>62tIbEvu9* z>sMQoz!6bU^bQU}a!0K-4qkqF1Hr_sZ+^(k%*>z5Q`PGK<>nhQERx2(IKcchZs7nE z)t&Y;uYu@fE8@xE03pdN(&>#TB8fV$HSMBcz&R2ppo0FSrKsZ^lh8J+6p#^F8pdu(pMAXKltYlRn{;KDF*N4;m8OyG%Rd>>G8vB zQPDVSu1GP;%3T)?t*|nEl$>Bhs3gjk%VMz5S*Adb169xO88Q~)aypGB>dh}$XGz(E zEpd+qsOCNy4bvPWy1G~U$xGn=#aF7=KkeoYt+76zNmw!;93>+#E3sgRBE))+;nykuq83cewB?f6it7bYp;!j4TiSBj(wLY%AJINxqli zw2~Z<9%ddL_)8nFV1uave-{@ zB7DUJa=AB(f(y4YWbK8lmG8Lf%%c=$MmHe;n09_xtP&%fzt?<9IAqZ=W6<)N+=$W0 zS%<#MG_t8!zpB4ej&XLcT87LSighTGQ|$=+*jECRhLN~cQAS5+4uKDsm!dWngzyi2 zBLnVaggj^yZ~H8(Q`6IbP=CZcb)+`>B(UGvlT*go!{OcdTp@srd9oxy_$j1+YQKN6 zF&s@qSVsNTB5J|q^GbeeBROL z`MPJyG9~45eD;F6>@RrSFWB1}kaW5=xW1|Y5;!J59#e%G`wV6g2SU9wefpdk%en{I z8(*yc{ks{m7^?oaLobUKk-7gU*yc`MZ6z;7&V(h^;Xqk>+S%)!8dcl6CP_P}C~k3_ zY$>*TE^fHW7j@bm=DoxTT}H<OcM_LXd0C>4(wO$=`!b5H%)lNghQye538oNtE2}$HFbMGh zZgAZ056!4+dbn*0&e9`qf70TsS{D39aQC)Bej4_x_4 zv#%r}03&E=X$kFL`svi^lEpxblcRd*gD5WcGQ(aJ?)Qd=qG4l5Y&>QYWq<`Lt!~ej z?47tdeo6(4X<-G6k$9={ zcw9xa`~KehkB|)>j!7amAAeAYGhDkI?@zH$)AP1mL&JD>NAwbq&@a1cRpX50=t#OM z^Iwmth|1GH9VQ!=w8$cVsNfS7)vhVS^j{KrWxtbnyMmPSfJjSd4ExoHFl#|x1cYxZ zW>v27T0hIRkBGPZou#vk7#S$_$ZG1A$`50b19B&FH<#9TwH;ZZ+ZB4vyAc`;;pSnK9S6F zY)F|mi^|_?cjD(Z--6tRL&n|#EdxvJQO|p4o=c9m-0ZHic--0Aa<7;Y?TWR7`epkrc)qVlCzGSK8ZvX zef4l;4)aUD$E_#$2)>;^9rj#2>6xhd9pwIzZ~ywz*IOuN2Y1=Ap~pFLS{R8plN5sn z%hbi;Z%mPe$_B%q?+1?sSjcicK@7>XiuafJbtO6rC`b$!Z;%b&as3b*UL1ck zn*weqEKdT?Lk(nvjTME6wdQS1Skl4{SB@S8T__m9lhw^9;t zw(|*HcND{`Lu;JKo`P7><+eeBkq>G2&hi=Frnmu`h8;;rTW=WccP#Ik48sUQzxdKh zK+2iH?&g%+g!MT!vB3I|wGbCuIm3e3?MSus(HJFAg0Vdts41fZAD8%&qp0z#JscrH z&UGNQWUTW~$1n&kgDOw<6&y%dSok_)`6dHz-eW7n?L&UW6f-mH1nOt>@AO#6;P$>C z6zE>@l1!jFMUTnLnDzDd?{uMx@EX__i{P@m}y?r#yZIL z>beW^7N6Ph+AG^sjR-*8GV07l1J^hiCWr_k;Dm4qH7Uzqh|s`t9WY$hLo`$#kZ&%y zn|gw)T1HIqYk{ecrVq;~P?(mlp99uPL-IC1lm~VgodqGU8MDt^y_`!k?hoH3l z!D&TwQj)%id~nRKXh>sObslk`B zBlE2Y)A=G@9UY`Pzrx8L-h?M08mh+YF&Uc_`2$yU&_)3nQ#C@27y|4X$=k|>joz&n z{B+YfNJX)@s6_w4`+8BXInX3!S=@)i;iIEdr0|o6myEb*7PY|R{|l9Fdg20p z4M3Uf99j#)h8O@Jr$hmO&I=2qr#C_!tDBi;>|9*ItE;PZ^(r}BBmnyZ>tEsxu!((r zvZEs#shAFSB#^sOW~e@@Fd*TflowQ9CnF+iZxj2(TL#!u?KzTRj{7sPy1M^>w>(vV zEcp|8&N!=NdSH&tYM(oUZZGu28r%Y(`GRs&rKR0WAArIDn`E;6YN6zrLI5}lzrrX^ zU)}2@W6=!+N~sbDp!dgSE$=IJwoKnmkNsHuY0VKHVu0lC1;St)LXX$$GXQM-R-02% zfhnYNr2-EE05#>JAp7+-VJ2(g9`|1b(dn>~nTKWgou!BXW#nfReLRW@D(uwzW(8l^ zsSn^s5EJ<`as*yfEbsQpL5X*1`lsRX>f$fLOya)MdxdPiTswGaq~I!6_mu#YN|!w? zXE(PBT@nE1@T9p6|AbSuTt-2q2l-ii>}i{#k}{*4PwfR5EP{R*^k^yH&}!0!Tx~3> zr9Dj3YaTtR*p6M-8qw9eLYs#7T zCP3o*zBriheA1)n@Vx!H1@ju<0WffY^Ce#8U2DiMTWH0@HU+5bS>dDuQ?jbC|D78S?}>!jQ-WjBB9Kjn+W^w#Yx!sp|4DyAK&^ z_R6P9dlnJ8xY}377Lkqg}A5TQ>OWEbi$_O@hsy#&2MeH3p9x@=RchWTKoZ zC1uaO06U_}%qLAlmG9wGZ-~Mr z8+tARF@d-oHz~#MgpU^!hN6Y6`8!`G6}wP2euvYzm;CBO@jSkZ3LB}Rs|^x#mQIW~ zVr7)|ruv4ptG2BRORw2d{Bp(5wIsoCvS7UD_X8q8o5sc}H7NXJf}KcXYAAu1^2~-) zbw!>ROy&JQ87Gp4BP%*}SUA&|VB9*t*>kLUrhqFfDML>s2N>2D=+B=ck;8@fU$-#< zfViWduOWnwR^{9LdR3BhaBfprR2vZl6w}ZzkD&uLKQq4i`j+chI0)p~2Nz8`TnW{V zF!-Zltnp@7@RQPY1{de6X&F6-hxT#SY`Ot zWaT0XCP4bmi`?@4hz_JdT0ziwK&s~=CNkhR(&zDXUT8Yxbm?nG|6x<9`{hmQrI9MG559~8@kJ0SmJfJ^~>G-!_FEjasGMd^NO%>@i-!>PtMg?V?% zFieV`_8=4v0Ri~~4Tchb{BcJ#Ykh=ee}3egZiWT;HUD}b^FNI8z;g-+%#Gpf%`J+A zj41*afxTYsbgaTg88w9f7pnBxtM8!%aG4-l$H@s7aA$AY(3JHed$!|=>w>7$g zChR?w=J)xAD$4B>Y!*8@#R9}}0bH|(#LW>NAPo@y^1i7$ zc(CQMkym*6MN^FU@1Gs-$!LZG7gDX*SeN4QPi*E&SEU`V)6dQLcBTtfKe!WJevo-c zOaipRv1Fm!?eD;(mhOzk#Kz_}HhSUdyBv+kq1cm671RGTaPV=x(N-7D<0$l>0Kiat z3<)m? z$S6$%A?u=w*+m2RVX+4fnoJ>XOCBh3fGxvRA8s1#`-I!SD=7>m;QSihGOW(>lAiwa zZ*#32X+T1)63HeHmjzHQ$R$IZr$qThw9NP8yB!I-{$>;+?>-T#R*=PGeaU?4OYsIb z&}#6FW%Dr3Ay9TuEiNB6dCHY?;MXLW@n0kT-rCx_a6txo%%!97i++{-uI|9cV^bJN z>be_KTqu^)IDq!VvsiNF0aRSaI3E%qxqMq_xD5V}7}qO$i{j1c)c!J$V0qTZYI1%Y zB9i&jf7vA=1xLL2B@?X*1HR?FjDY6vdydDu|;d>T`BUy|d`^}yOE)ZyE za3G({^{Kx2bl{7_*U%uKW*2tK@a*hAI*4a_D-3Vt34s{ST0?|xk`0%>8C9=$wM~gX zYk#*ciLK~BrFHjV4GqKbuq7iMJ0RQ}pVuIt^Lj2(8*{_{d5rT%ox79Pmna>%X7h7c z&*`EY=Ya~2Bdehv7tl6E(lW$fR{tot`hRMlpm+Vq1_PM3WWm%`fY8&^k`s0^yMaly zWp%Fn)%i#)KmBl%=%*87Nx4Qug5miK5p$BWpN1v}!f66P|)l5BArUy|q&Jz)k z`?d2BK#g~Mo{+U#h33qD1d%3R;aDHg5L<8#b1(f#e&c}eV*Z2CUhyw$iL%HYBdeo8S>l)s30jxl@xb!(c zlBe9;n`n*=80v4Zsy|Owi+%qLaZFE<9_C_!W(6EFq~?Tiob)VzGnKnS`%k3rrq$mZ z%cd+@AihDGCq56JE|48V|9?0_g6{<0kQXuJ4`5=@8~SrvErsX_+@bwY1c|+C&2(RP z_~-m!8U2!63X_LO3!Q!Bx5Rc+s_&c=5xX#-;3jU)-#aoaCOe;Mp%9C4;`1?T{NDZ1 zKNES>=Gi>v8AyyU=ZsigHHnUk)3~#-UbYXLA1_c@pR2WDDRQ&5g^Z7nvk1bwbMM#R zd2nFTpK=#;ilp~xFOHiMDo@*QaCg0CTW=0w-$YA#Et%NphK1+t8T~`60Y~}31DNcG z4V_3=JMB8HyMvYr2Kw1K2e)s&FK=Zje1fH@104Aln7@GjV@kg{sDSwh0`7HaQ4wSB zc~ZRM%ahA_2Qy2{e7ggit?rsvySHdtF6gdNYc+(Sw8z?U4=;{O(b1TMUKd&l`iwYe4rMYX$t8m>&b^o|aG%31L4n?b?3US=Qg7*L4U zfDIU#cfVOchnZ10hP&T2Rr{aD2%nMa^E0k5y}8c-Y!khM>wt~Ro3GLI#u|9cC5iX+ zuOlJQwM7yq8wX(kVVMbZYuBcjhI&#az70^5U-=8cA45WwGor!I= zKd=GB`j4ec$^d{she1v*SZCPb;6s?Lp<)W8`j$PBWAn663>u+&a5WEro(O0V0D^#a zYIUnMWdmN>EyE;$v1-!EjnH-`-u}?2hcPa}={5yPtSHzlGDo5SEdQ3|r&GAB*ItEH zpKKH(VHi;Uzkz>ti#-D+yl#e?t?DT^U~tbDaJ>LppciSB-aGMEa9c^Lk`AjgthG5J zVkge&7_-p72H{yM8=53WfRW5OVdK^l1{n7&!B z#)4rV)pmiO>t4n)!sI7)^=_=++g?u9D`#>TbRhVis(j-9Nx&%SQ0qy49)Q;8ew=xE z{})Z_W$|fDbTkN5HOp+j)bwla&yN}Q3~a?cv1kscph^c}5HPP3>u7pQuh0X@RYu1E zl$|-9TD}NK8^gnRO4F|Uir1B@@!!Uhy<+km^5t@7+Cv1WKAN1Zn+nQ!aLiG!tZg*uf;Rw$BepzP_CA50mclW zSrJMj=hQ99`?w^T`Fb@V+v>hCtW-Q#4~ z!(pOKFKfZRCxNC@{!?4ONu5@+1-f zEzVCD@gZhwK2PxVS!shC=MIt36)ev~y5IeFmSgabtFw8pqJ#YH=Ih`#!8CPtuF-v2^x$H?91G|Pv|ru`gIcgLNcoH# zM1X54X9ysHlwc0MGc$yMm#t^nN`#9@#9KveZ(f8Vp{tKvXD`i3j-tws`Qtr2r-(@G z*RMoU-$yOK0+j2Y2MFYF+tz}D0wz0P&#Xi10}rq(Nc$b;@LB$zMuGAwpySFgC4GqW zd1Yp1#!^oa)eQwBYMF;w=pqKiC`DMP@*m5x`psp;TTpO^QW+B=SLKQ&OwiN1BH2+w z;25`(@$MYLsFGNgh*(;ckeZC~-9t@m=X1pZn6=l?5dAwURX^0|eWq(06B*i)WnWm; z$yd)3Mg)O5j2fY6X>rEZyAi>kK7H!jIs=ELc@1^`$2Tl`;I4B344e+Y&;0mnA#x8E z<-#@Ik_3anlII0#V`Y-G!Tu&pzi_1k zN>dy4L!nU9y1!;b8c313{sgp@r5-9Q$z|X;OK~+^xvF0nEJ~IKei~J@ppO^hjv^G) zpTUGvzHDsLP6-&2i@~WOn8Y1AeL zI6#s~rfUdyMoiak$ASOiK4U^p?s^=EIGbOQY$07C2?ruMag_WlC6;VEE+y{IaC}^y zv-^>}OLCw$o zLMlQ5TKE4t%8RoqL|a8%Ns5wX=9}bpP6+LrP=?=iYjA}b)wzYPc-=y_7X1a2Y*DI&wSrpaM3G(d zo4g77dQ#LnSWpALeZ(#$$P0@PkFhMBhAaf}>|bQ%8Za2WaNv7adoq~8G~Wwe2j10R zney|-g*0ZFuC!pOkfQ>tSeQCAOIouD2TQC-z)N8@O4>jy8WF-lt(#00kpw632DhC+ zVFk_^(dW2q zx^7_FSpy+l>9XMg_EbYr-0*~z%u$dLQyT%~Ti^r63-zbk8d8PTXORePNGMr1K~ZPCgwozd}k=uw$*uT44;=9{JVtlU3yE1t$3T9qegX_ zED&|kPKHpFHoniltgnAzsnBH&P?1LbwBo8OV5amJxbK1)3cYw8teJn#2~i_)2y)3! zVjd{ZjA0_*;Pp%n*miPPq{({IxvX(Fh%G#o%cGvwtFJ9QDU&n>F+uwOaXM{ohJdxO z8xl}It8cSfgcvBEc)A`}^aCrm-%ZTnw-GclXj@ zQ{UOM259bse;t$>q}EW8^* z_0Rhqq4FV?mANu$7nz`3v1EVmH>$nNjJWch&P2YfxmAynB*l6PI+{xXG1aZ^nsb&J zTBUte1@*VZ4SZ7?knYF^%?{tGuFtndN2cP!E=^6lwkdQ%${FP2 zrABcXuFPK(N>SBAU_uX51MJBe?$(Ck0{RLEeiph#{BZK0@!Fv1PWoZFk#at*SZ{DC zBjNAK5fLjf-shB$macuo@Gb(YLBFw4Mnc#j=*bo^ZY=3H@lI|WDB_6bx@~_8+>VD+ z6t4HRFal|*Ggzp%w^SJ-z)1Xv2+UwAXx>~aU@y>!39(v#lJI}%qCrlIotwe4(Qv6f zbSVqz{z-D-QjWT=MasB#aQ>$Aa@s}LEYz*NRy1Ve0t zJ4P2{=~2HFh~$UMS%?N!!8aKbo;5oBHQQm|444WwzUMvv-<|#<*!En7F zL9~$b9w#pj1aZ}P%d0teEj%e`n?k6>p&w)51-3Cr{{nihJw zG*1in0@w8#;8chzu8U0aiA8p@N3sQFIDm)Ok6M`HLc!|zVibnRhW&I%oBL8Kyj*L%Ht zBvMphGw-1R?7$9Lv@NzM%xw1*H1FFkvc~nm5+4|9F%+T#>eBQpa_%*3Wkc`)6iN|g z`g^?}8k8eL(<_4oN423N+fGfs+5e3^Z-~JCUF#Qd7y}jVF%3DYu?BVI^kb{a@!`C~ z>THlvPXGdnBY-2l53aJ>>z}5N#6zQvd>mi2-fsAH^I~`#s>F4h?%kFm11Z-NQBRv$ zd~r?cPA)WVywRD)P{E93K^w{<$q}ocN=RJbL2fv|XQq42KQviBN=_xU_&cT0%WV>& z_XZj(g$34fsNBXw0*ZN`RZ9G@g>6@7YBkcHm;@XJ&y|$wngw9JQpv*$n2FzCU_O$S zziSS)#o9jIikIJN7x&-C3_$dP17YJJv3&w_yq8Nr#1|5Iyf$mPoU{33|9pOn(?s(q z&cfSoYG@Ss!y!Wz6QPw^ZO0jKlx{D!Ri;9Gu?yzuir?!I74i&zPFQ{PJu3D-mWIQ} zZ732)h8^hn47wtT_ zf#C8)8$F!9I6t>b1#*I7E9QU8DvyNLIx{XYp0=_qtJtN`i)<>7>G`SpGLRt_~XYF+Ri-H$; z`T?V_Pv%x(8!9E3w|G*s)$Wzi0=3iC?u7mP6`EFUiS=>yG}uQ~i#deHtd-sOoWbfa z`xB7fF)ubm`q}w4@;HqXU+dIixUPJMTlrly;?E-1yIdB5|g^^vU=R>o-=JJv+R9!8Y2gxol8rPggi8R&jGabBha7 z2ctrqW}o?y$-D-$jEoE}WQm*_@OO8@<-ZTsO=jTs{Sz)6Gq*x9JF5~QXiiV%XFQ1} zr6+FnVR9X`L0G);PlOx{2NHQs2DbE?2|6?(`4FLC_0g7WSv`?;R>IiAtRdg)FElg# zGL`&9lFM?)Rm|&~W%DaZAXcN6XkhOk3b{LIzTN=^6rLNdB61V#3DCYMEEZ84p8}^h z#3)x(=oG{_@t$FW;N7^ina{6|Z#N^+ChXos-|7A8#;##ei!S-257*01DS|OtE@j{X zl~9z_t)dmjMf&@CN3Xl7zJyUr=y*Kq5f=rMyldNfBO22zx|0QvcS=PDLbG%=1w1fb zWy#w}1$!tY)ruwjJvC9=#LyE=o{F4Lrmc;~L$W24$OeH!Cuy2?@t6Ypo$6x{`)x+K zo?UUrB+!i0?fLtr^D%|n3m~&7l80*CUbQ~?s9chC+uZRM`v?Ne4v@F>>$I!@fej#H zb~b*(*=6n4J@XBg=&E5YTq-o6yD}B6Aj-j#wY?AmI)D{~2AE9N>*9z1>Cx=rCcaHR zkAxrEt4z#|44)rKX(;YN*Fd3;IsSHO|@ap-WBF$pEgI-e(M0mKXLA%&GYpANA#&?~v3(IK3$}@pd z>rOF4fqTz&DrImkqFV7F{44y^?eLxt$)my2IM@MOYJ+S+Mkb}5a+DKre(d0(Et|~$ z-cQ=Nd9b(l+CW7~i9g>4?!t3_`oDOh55b))a4K|gaF8-(fV);%?7)A1(N}PMn;6~n zM%zoJLSVX6y2D`V2wCKlA(gWtikd0e?C z%G&b@KwP;0O|~^9Bfna&>i8(qg}s>Xr4$qJKaawEeaQiELCG+TRlxV3cqE?tUySdK z)iW0abW@s?f!eYMK(+)7!Tfo9+0yx{f#fU_JpZXO6b?+Y8@{^D9JL5k)(|1um}o)d4clg* zys<@=W|>+=B5>#;08V|6 zYJYZ!nZU1j3$S^kSsjbK+A!pmivk`Jop`Z;O($xjPB_Cc!{(V%luKngX1gQGJuAs; zb->!-0rdpsMw|GQHL8uwYnee#z@!brgHqNUtpondSm|r>${KE$I|xy^HqZ zMKEmqL-O(ONKbd10W6;<##d;XY(J&~G(8P5ZMe;)1Jv6C9e)rY>LL#xs zv6Qxj2955=;X?6ba06I67wow}-u)jR9gJ{>=46K`D`PX|4z?bO*OYV-+;_JLrrKp* z6mWIp&0&Zp93YYS ztwRdD!n;2>z-}&WI)!yqnx0|Lz2=17=9#_<5U_7@XH%4d>%89Hs>_Pn8e-noLyTee zU@l+UvqF8|GaOU9GZT2eqDtnh9il9vqfTJp zLs_Y%Au-4X4t&UyVC@!`CdNytQSh>D?&%2CA?sjq02}gV+3QCCUC8c$0=BTR0tAmd z9Nh?=TV|uGG?OC-^-G9<_b=VlrII!bUe?wZ4mJs{dqhHda&E@nF3t1AMjr{YM zZgt;THL-NG5-+=F>+kTrx9>%>P#Q{&csV7LBqrqB+2)chZfXIlja3{wJ7$_rz&wWdccM zhN&{;CRQLWKR25MVy11mA0MQXWojxVW6{s9iUlpHEKQ_lqu#Et`^<3|^A;a78-|1M zCdu8}Jq`M2n?%Gj)zH=qmN*<#f`txbqydHZ4ERoY|5jc!SryETr~FM_xw_GdrgECk zkSDYaKW$GDFlfG-uN3%t2VDGMmm?X}y&&qhz26DfeC3k%>T?Pk&!?*CA}4b-n1k7h z$-~Auem?tS@_0QobrX&bj6 znUWBr(Mk_a;zlEQH}6NzQ2LlwGVfYM>EG0O%lKDXxe}4NVu|KDW)p@2w$jN|3h>!| zZ`b|@QSTgGN%MUV$F?W7ZQHi(Ozeqmo0CjDu_m^SiS1-!o4o4<)HD)AGy>fAngCw zg{;x1EPV1d{0~S56a)ZzzQFqSzf_}Vbu<}5Ct1F7f@3DwWV9U%bH5#_h|4s#h~2eW z3uS6moHd1s1fN;Sq1ofl;E^4&gbIkv?`UgVsTFU6Vbzd>hn9}Ki(Q3>0zp)pHKPpx zvUh32FD)(2wn$zxl6t&2{-2`4TIXkdruU_5$J&gg?ToPv)Ec37s5(S3fR6Q^m*8+2 z=$~=RZjL6mKVgDMpiR^#r72LRlYev3vHK1iZ!j)fNdFKiJ^wl0-qF!_$FEwh-YBp7 zb~f5gpbNcG!3!QFtha8YfFbc$0G$t6B6;bJu;oagaoL zce)2!rs7UYgCubc`R~7|n-bO&Er$LeNvL4d*JxQ2tN&ZksqI5l zQ2xyRVWC!8)QM8|$PVA)y7XVT zrZ!9Fh$3V{nl~*|FEqhzFvn8JG`uOc6NX%AqS~-$UWOS{%l{{q+Tf#R_M!Q!_>i00 z?_xo%gf`T!X$wv`Ei2^}^h>HE8caI*)SVsg4yotTs@kUs_IHGqv!D>^jUvbb`2TbV zX?X{uG0D||>d^CD(3gk2fUAft^!!g_n4mwZkTmE~p4rWQPxQo0-Oq(5uRyA!U^6S* z_Tz?BF^|8^VNDEhR6!0q?3CdT99DE$c49LaCy$4RnrKZG^#zh>4&n`O{M3XR4 z!WRe_9NDqZqK5ije2od3tALUG*CRd@gZ+>XY7AII$jQl-`riD&4+#nJ<^}n{1xZg& zXXfLpT%WD^Io`3lJZ{+e0~Poupay>hnwFPd;~p>O;5%mytv+UU&m6YoDW7(H*5Y<23EX2UT)gb zI%YTweh2!ns{+hrg2`o#-|6yGhGLTUX~Ks6+qM`M@k$}@Jjm*~xu>DSo1Xqu%{1*1 zx7Uk7FK|6z8~OfKli!OFdM5#K4N32u%H^TqRaRVPLiEhymnbX3UgKj0a(a){-yQ()oE6BRNP#c$MzZ zf5rr2wrfq!+;Kp0C*)ghj+3lgz!0&jjk^XL^w0`LcdLDRFIpwyAAd)J7Q^R_@9;-m z7z!G?{?DJ#7;L6&QzW0qb7y+=gb^)@X=8%uxtjeOZomUT4HK9u)E80o)#v)+=@yli z06qv4;SX)-^XR>lV4bmC_Nsre}^Yyfjy*+de{$AFm#*d?5a$?8smGLMJ@_fS~2 zjawo-`(pt}pjd98!Ku>{yweU&8|N(Cv!0_*e|r{I6Ur}#H=Lp*8B@nPk?R_P6Ifdl zL@wh%|LR`7+U(FuV8PjbZ^8*Tu#TgTdmR{`Za9M zt~4h1Mw6L3dkT)eu9a1$8q@F3C!!I#_t14o(<*M z4OxRT;VPg}`sT+5XYKsGR@pmU)3&r<)313?nll2vf`Ysn>xt8?g!$oyqhmlN+ zVxpAyNK(0iupu>swbR3daDHpZPyI&I^<4rH`T#KUOKm? zqDz1l5(8+u9ZD<6@UC!ngcrF?@@kq z3u5KQ{9P*WiEm*3GlbC@8Yh}Cpg8@3)hvjuf74EI4JT+D5W3YN{@u0ZB_4-TUvB{^ ztdJU;*Za*#l57dHprGP~+8f^7=Tfy^(!^o5!}|Ze@?QZ+8r#taXb&U*8mMxWMGQun z<(2ysxgjHKmJ|vJXJ&B(I>rvFSmkj9e1zycw~H zi}EnFox_k$lJ~SnTFhhB=0lO8BT8Oc)8UGasF6ihEj$#P%0x^97;EU)$XE&oAfeYQekkyo6$pn zw4hH2N+?sMk za5n|PZ7$^zj9@=>aH}r4hkr-Y@<$418a-_dH=f_SX z-t%|wRo4zdxy_;Hd-BiEj_pd>w}7wp8E1!6v~K=}jwGp4JLBBuWkdVl5qohDPU(^8 z!`hMIDI+E&7m&r7GsG$FpcGFuvVvfYD1FU8ANLo(loEHA{J@`2o8PX}GQCT$etzY5 zaUmz{cV6)eUFj`S;c^M15yK>6NXQmT%cjz+VM)w4Fz`hUjjfcL>ZvYmWtm$h|2T3^ z{yBBD(r2D0@4*(GHnQcO+=egLkerq~T8d$W%AlJ{p^8P5mkbjH4TA#W%!w;Z*qrjebx+O>2c;=krc^J_?PXYcbBJ$fEpp3szO7;L!E;cR&iaUh)eK9aLeqS+7Eb zh|-~a%%Lg=97QU?nXsFh2d=t9(68?X13uXdISbhcGtS9Bl`c(hFByFQU2lv(!O?2N z9C1E%a9*<})HId+$(-eo>8&l0(Ya3*DjA6{?c+CG!*`nMK9qJ8psi`-nyBZ_KJPh2XrGMe1%_(sgnbH$VbmdjpoiTXEjamA zngblZ8x2!E5pQBjR0pY86A8kBqn%56+!>=;U=zLaH_stOZbzvM`@d7j`H3NSIby>} zF-@D?HtxRvh8L|7rp6$qY6||u$Cf=O2D0+fRw0u4oxupC zLCJ(6VD=?%sDgNV!8%bUQD!&(if9;Y24kHM@l!@@1A|{7l`k%L_n#nx2MfC3hA1g! zKq+2T+1RDt`tkY3zqBN)j?K&>bCG~FOIThyOe72i#tm0R+R!+%uXZ1gbT@PL#r;|8 zT{vE-cuJlo1}CAv8oP=`$1XH&jiDzz??<$AznpLEs#l_82C0QTK`~&KEdZ+YETiK3Y_e9H|iGBmeDaFzjHA zms=H_^U)qeQt8q=O9H-AD(Nn_G-!L`F_?VG3R;D!uT!WNV{VbNbtd9N+;eCzm3TG; zrfNxy?@`;wF#*95Uxbm#-gQo=o%lBod5^cV=ezPep0~V!H~N%#k@YUm3||7;-^S&M zA0IV|QOj_C&gN;^aV55Bm4lz!TId$gf5n86nc?gp<$p1KY(ZS3>+j75&G&j67fgjH z^*jpHbl!ZrC*Z#gJ@Ycik~Fpc~ZHc!C!H!!YW!4$)8d`?YvV0T)0;Tq3RhU4xu7DjE8 zu$^}By?Zz8F;b>bQ ze``~_s>q9pW=%`dm0WbB79K#wunLeoeOLBdh1gr~?mBizEpS2ZcbhcZFIDi}5hE)2 zcMI}?9xxzfHN?;9up#a4&JiUZ3@G3MWmc59>7{OQcsai2v+tl?4(bFsIRz+*bLyL8 zS|Aj8YQH*CI|{$k@}?U*2dWExzf4H}VN!k^>c~N7+CeH$)YV=X&-y-^=F&n#8u4&1 zGs%D?oBZqB8{0oM5y**eT(Ss&=i$3|^MEBK;*S(KtNe~Y9-GN=m70kn7#Nc1Z1g=s zs<*Wn0@5Z7?MEGL!^!oKtZF{Cl6p0Aa($i72~a}hH~F+Z(PbQ zM-Kyu#N{it#&Z#yvbAC)hHGsT3Yf~EeqxxZ4!X3*&yi{ZRKl-ebcjk^%kxI(eMz8z zm@rEa82(!%1^T>DCI~4kCkNlv)iuvYCrt|-L`)6Asa*EO&Xn1`B}oZR2w zw!TBK_v-7l_AbfjD}&n)oV&Dd!X5R~ZaJ^*Hi*HV!0yEkdXevHXX$I7>!#YS@GT6x z{Ocavb=vWE6t+}SUONDrVCFp(@D7>vesdG)h>>rzsh z=0$R=Zu9hmGivfFYSp2t4ND4%-dWE`VL5{-=%D6KTg;Bslc)j^3No{ab#-?OdLoGM z;OF32sc{D{xM3KVz*3NN;JOhJ&jOK8(Ong=LiF+46D*FV#xuw+^JFUpmp5R}8pOoY zlXJEr%+&KzbTzxWDq~^_bz1|Zb1T->0Ca8!&V$ut2$lksPD2Xb&t$RoTLWJ9w z*yM8_k~aEy{X|h?CeWz25E8e1WQ8XNA+W5?b=r>UB3jjy3}Ik?S#?fhiv3{M7i+P& zy&YxVb;7I!1N9YUHPO?TrkD+dSQkw;U;(ylnWt9JU#s=77?CP=4z^Ye9SKo4IHWV9 z^1DwYskYh8fBrCYa!Rt}{!Fj;VpElkClV68;;8%;43|zAuWIe8-YH6)Xk$s!PP@5| zZCO9OF~b`#S|Cen{74)o=L;W}h-UDFsyKsmQ+EynteodqL^FhfgMpT6 zce@+zgt{7;9c#KT0YW#cvGCJmqDr3t8$}DD3Pcr1bJ4X$n$rP7Vg~yvlfA2X79p*I zG$H*&cd5W1b^|IDII?0+0XA~@iFo1CWKL|TJ^g2qPAA7o9RL}SqKv~nN+7X&f?T{AGt=KIozgZ_k(P`~IHU8mapRP5~AQy6?`u!QKuX8>ZRs8!9^5=U=71}Bj-4XFLIjvaGVz7a7M!?+lG-i$b>?R7 zB`>sQ;#gg+>Q9L(c` z1&ECsHCiI3q=ezTxkAh@ri53FlMcTLnrwVoI$?Suc-YeQbdH~M zIfk}j!s$2zVp_}*N+^-}|1K#-lpA51VXJQPS-(}6O=yn{>j9l&7Mj2qVn9^Pg?%}r z-ObX-Q`&0ilbYi2*Wvr5DfPi**vx?Mfg$_&_w7tzV2VS4T@yBvdM{oSJvlrv+@#d{ z5mBWq!R36%_RsdCv-%In-Rs+WX>m_3kcuMkvq4yMDQGO_)lG$g$BWqF7A{6(Wo^j2 z0o$}2|5H1kE-^S3D&aia>9!g<`Nr0hl9!{X$(C?a-P}paq%f#?1+uU#*XowPO_y3)x|tPQ+NVbHKJ(8z!5w4qhJpK5-`Q5UDg|UveMqTu$Op4YF zTsw4`G`VUOg3iRa1`C}2$))A{7?ll#q@n*e^hi+bJl|w(PcA5@lQF87g`xz*`KIoC z6I`ft8^be;4X0U-D9WKujejvwt3rM>;+B-&g4U|0n9gP_>uF81oL5oL7}=?qU^>1q z-@%oMINRF(7TR);dM0GEFFv=rmzcl35@$$~mnn_#xQ>Zy(PUR((4AqXS4T3Df&Jy< zWiC`<{K+qa$n1ZD21|?tp_n%ap(?z0aO>RBwQa12WjWruG|^f>97cScZ^VIRmz}w^ zq6+7kCzT{*JJXQWGEM#lLLt7@C}V!9oC5#z9C@*8y2&Stf(Of#={{(Uis ziHUXIDt!r?i5sTrUz?f;ypVgWwP!+b?xKx)8Oyy2Y&YApYiwv?>W?If?#x^8?j!oD zn(`f5(N0Nr)AN#SnAz$qNzz>GG#+Bx?wOD9|8cW;)ek}o6&~FX@pkl6ebQ*C!y*b^ zV`dMxb8rYBOZ{al?c%R)HV!i4A)Sd-U;N8c-|2FLXZk0fl$kc_4WC?AuL>)avrHjD zU0_GgEvDdgT5TeTA~=$5BeIRA~MpKPhOVqH_0odD^YNQ;F8m`r#mKRt`ynXmUjsJD~*=@HZ zED889=j5<}8u{=oEV2H$B?oMD%zc(nIa_nrYiooYLN%O-+t$WG+{1NrVWdcNBTD{RxbM)Tw`Q>5P*a zW@>>t5Nmi~Ffc(V$$>^_2-fTp5DF$aIoTUb)@C@k14yVnA?SYC49>7l)hUO?IGPt* z3j3FvgMr(AN8dO%U6B_SesMZl3ZSfZ;kEg2f&S-w4AfX?agsb9=PMkBFK^gj8RDH% zhtT@`ZU!S)Py0`Af8C=3B=sJ%boC~=MRDDP~HE)|~{XbrmUp^Ul zA<}1^(R2Ne-W@WD&)@dq17QJi`vIj>jD5}W~m zeDck3?^oHZrDLt}3ClX~4T}Oj=46lKw?|-y^pCuB9?&@V<85V0U-dEo8@Sq*kL}`oR6X6I&0G5CzV7 z0_DgJX$lACI%KwxXW667R_`v=RF@VI(6Yv;8(&It?dT0sishd?3KmF3N^+C;h_cMm z-=pB*Oh*hn+3HWQUf&p94|e>Qs;|j{;YcXJf)b-?xdrv#i_qyqv1jy^s={ejZR#=#-a^DPV> zJALNCDEwAVqWMnZ=*M=WBERVj5TN0V;~%`=`?GWRL$zaC zQ>N$&aC;DdCa)Q-9ql1GblmR#sprsUG2J{u1PDrYgFxHkiKH5?U*pN=mj+F}RAT>B zmAH6%c|OGO91$NcvtdPYU6G9>vDMPA)0{p#ID5frX&!u-#c#ZP=XW77NzLkHAXlXm zY*4w++e)xuxdF^bnORx;0mDeTTe@3E=@;9jDiaqM)+<4zn!P7D&b}rXSqgOcmWR*t zj`c7ok&j98M7xY-(SkQ$>-G*&r69bqgWyBlbOZ5@`^rGCId5z@0i&Y9U|Sbi*%OA> zxA|rW(CzsKxZqj(E%oK7~^_JWUN$PM1^bQ~Nn9}5#UADA!8W$&e> zl9aF=Io@uS|;HT*MAuAYH3mbx&j--qD4|HV{KM%cM)QG2LX(V~kIbHoWVXS#L} zMu8ZwbEexA;+GxB#I0s&4=v~&XAjaVBR6o5Dv-w0`XN-Odzht}wM^yASzlHbh-UJ*}wjqUyy3LAS5#`d;Jvf#b2pez0*H+68NMB9GI?deHe}LNp$C+*5VS*6wIhKG45BvZm333agH;G{pQ9BT1Q{Xx}eV zor9^zEfd>_f7D9w&R8U-IQU6OF_*hfO-VrG@n4Jm`fyPUzt9kTI=FmszMp(Ym26l> zUz!3r{0Yc;k{&06xg|Xu=$$q`q=j6R{4(RQjb}!d1bK7XdO~-_JQ!X~57bK1ud4m+ETbG&bj}vox(OwdA4PH3u8Z zYbyOWr}#2?slj{prgQtrG8nZmp;HLzsAu<`z?T0T0se@I#s{zD@LQcdvqFeF!+KU^ z0!j|92`xvMeHje&_rDL!X6PXxEBjboT}-zjM4h7n&&Xe&xcLf@%ec1A29oH)3=SME z8GE=&LOy;KudXrFFtz(NWoYn==95ceZS>GHCG7bwDU)t-3|L-2rU=;1wBYC`>=#X2 zJ)$n}NH`E_EXLCQg2dYwrDpHWxlmoVrHFpCYqs|@x_p@$NV=LbeSg$su?mnXPu?^P zi-r@JqxQraN0cCLwl`hJlI=^g=2GQ_*-gJP`qmL>LZNa}+nmZPtF!YAV@;y^2$7!V z)^VDiWoFR#2JaKdxkF$~$0#%ClxD8d!GmW$8yKEhJRN`&iXh;=^iQ z=pa-KMkN&u+TFUOj*#1D1Zwt$VLAMTy^q>4 zEOeNLcA&^mpcTF!XXmG$w3p+LNY1nSc7rH1(PhfVqRv*zWIEgNMOkF6G|S8q^{H@* zM#iS8_Ql1i=pW*YP$0u|aldn3BHO}wmcEM%g2D$bt1O3<;f|A_IjTD}PmGhHNq9*F zmuTac^pZsb5VHu}Q;iRaYyX{yY>>T?0(`OWZNprB!sPia#rQMuki=mSrF6*SaCUZ{ z!paeA$+3tiEy!{3&m?6LOY9H^E|h3X5>B1KqZY{H_l;>oo|MQU;IM+pFAX}DaW{u4 z61g1)#8Ser7j;_64|tq9DWhK!Ae24n zz;-tEnt37NWrIGBk6Z_21dd^Ow{@(*j?raMnU1!hao(6q7) zB>KbGBd8$U$DgK#&{>)W1*RW#`#yM%y3~|EUu{$&9+ev&=Smj|POD$Z^Xx%2Bx8Q% z3@=)^R|F=m+#JK;753P~VY@zzDd43gQFM=*>O;vTQFZ@jgy>(j+Eo(kzVBJo7bsk4 zD)ph$ZvTs|A1kK58N!|}@kQ(SMobiW;QYxG#|H76YM*OzzKHw_2U9^k?&AJ%>#Q;bLA<;vMfeKf$glFC@&)0A?ul{b4FqdC!iA;hEvN z0Hs6py3y-Pxh`5qCgw|xWb8MuoUHV4DSE6+uM#Y?dI@2e77w#}T%rngk=D=x%kqPb zJMJ2&2D)7JK#AK%TJnBAHiTU;C> z$hUs4w~LnA;eI;p@XSGqB-&D|6dyPr0Vgaja9fg=Z>lNJVxaiz!?g7hEk7Tw@1^UT zwpOR`Am?F0wFc&EO5V6-9J%LwGfT)zQ0|7ob1gDKiZYRcnR*td67b@M?bgYUD=94$ zcc|gh9=)cUg-^e0CbLu8*c*WNMhM=EZ23I#Uv>K+UE!^-u8sldaLo~{dR=TCmUb8( zcw3-tlpUBLa%U8tz81Y*d<06rJ@fCgXK>IK`08EW_*~L|>gGO^U90~HlO|g@neM*V zuQkpwVt4C)&pS~#RNSAiEVMNZo4osUX%=;02CHYO;)Xe~G?D46FB*9<>bbAA zxzgq^oB6t#>N&7AdgGOf$KSon|KbPQPUIDbWlEB%ApumkthV+F_oo!(1SpkLbu78V zX-#;J*8?GnMSIhjsn@OW=oDWKwt*OnJEWZB#KbJ@+hl4vNaUDf~)P zF598zh$iC1nutm8mZDYNI@!I z=Z+V%vZ50Dyh*@G7zXJZ9i>i^4wW8sHyJWz;dI=JO-Gb@8Xi|&MPY0SH*S|S;DR+dY>AS)K1=WsL9{m|C@rWulbGpG0; z;@qDCdPhjxW1)tGRSA0Na?}Y#706PRjoDN-=YP9>Wi4T8ttZGlC%5M%DJy~bla0fw zCQu#pyw4C714Ipz|BW01k|7Cj>dQQ1EkN6-!xRTwfNqwBIF{N@$bW+rJnSbzm_8OL zNjIJjFFli1C{0KqXiYTE$bhjcedA~FAQ%))ZI&_?#rUnzmaPqjl`OjP17go)B3*B_ z;ZPI6y+?r~Ps*zuhF$a{#KvQ1R)G_O-~mQ0WNB$>(kBgPG%n&|y`|Cb?a{U?wrzB2 zL`O$1`!YV0H5p1Y@MlfRwQi6!&0p6)D%d(F4O`ke3DTBabh!ZrU^En;JN&zEXfT6( z4&(ZT<0D9f^T;6mFC)Gh*da5@lZV~P%~Ca{BI{|EN}%h`T)419vr zU^B)4Z#Q0Y=4VD-BR4BiG36FeL3jRj8-K*Ew^!2MlX8V39zus?Pd7Z)caKg)zZCICo3 zyr6)jmm>1$$TB-82NXCK2H9#lx1eYH=eZML2oGESAr>Qu5{g%w7hOO09AHx^{Df2eSg`sZ0 zw*|HtesEzet>r?$0=nP7f^To0_Y=UG+4%?cthTePl)~(Bev9_4xlM{$>!x?ePOU-< zmxNre>KJ?muER6#H=sGx=QAm{ve*BH3Xe}=LsG3dt5|s1-Kr-x=pZ}PUtXvZg17W3 zG2yGAm-{Z5>gKT}om%z4xIl5-er-+x1+ZAlY|)A>8gL^Gz0J;ZjI=X9)4GroNs_a4 z43N@o+T8I3H>X&2hXH^NJhjtb8&XKfD%!-khE*Y2f+|rIW$O>KOG>WxFO36^peht; zfJ?N3*@fy6NFHSjaKb*AkVCs(`=4wu*aVlm(Fr_j`{=t{Z*0UVp!%W ze%?|e3cE7!=!&yLoOB>&GPjvM?i9y#^42a5do4wSr{Te+VXqIge^@ zuH8aL1Vn$IoENaC?wcQ&kH|NK?2vAX3heK-jeE{7gUOal5P<9bmRc5dUWCP6maY76 zaQadxqB|>`9^XInTJyFA^y+^Q7!s`GxsJ!OtIuFsu5)q{y9?N-jmn2(21>u#M_&vz zp`>1X*P->}U60c^5ErS}wm9)hPxd5$q_1z#izrb^6b8=5%4}SGG3}L$J3l?G_`ibK z)6K2U`{A@uXn%!Mvw`~-fGI2<2`W_K96MXc)Tc$csRUR#^DP>FC(d!CVM$AG(dftU z-M$bH?lp1Jd|Ph7)?~*$9E?K$)6~T9+V|lvbn~N=`bBXbs+jWc#uaNbBJCP<`ItnK z5fUv>4`b8zr0SxKG}oiG!9TIS{oZIopBFC-xekf8vcIFeRp@B7G(Vp-%c75lEWGUu zFT^w|*U=i%=Je|LoUYJhq8ug*1t~}$gd6K*BwPA3YwZ1(u?k?Tur|t8xkS^_jY*S? z#W(bwzWyVewzdrOd@kF9Z{s$<(v6j=b~2vbGNVIWO@&TnKRX6g4>Cf4Ad&M2(2}O6 zCXoN=yT6AS|1~290^;^U2K*6v{x7BRlN*)zlz}1gcWEQGagPywo~7&9DY)feXCEGg zj`jvjwPuSwnVA|68a#?)7H3TQIDLZvSJO63tJKJ_)_SaWqbFGO&8Ye{&m{3VV_L}i zC~p4?G(?6Lw8pbYzTMH#c^C+=g~i2sj|<%z{kDFso(B!V$G(Jm_d8950b?hpL~Xm5nbsE7 za`^%y|JF+irkzWHb;CZRY<`eXO~}A>e-HT<@DP_hohGmv_2tEqIn6OQNiC1px_!vK zM%MO*B!d8E=sZWN3`({6RZ$5IeG!ylk(mEVrS$QGNb~y$I z!KhkjFFvE!P?U{gp;C!pA<9vpRBhUZU#^Yj5!pG+=*aCQ~ z_1_n1v$M0GKc9MLgt}i6v|IFiALg`Hu{MWC`iabzYYYZW>kH|VZ6Vj0t<*FB1zXVd zdYFA{^j5OT4&OiKuD}}kgR-`vNkLe@GAypUj1#Fd@WVh$D_gwt-)ae(&6&6tIp+jx zR)#dYJ+DQqj;3VLtQ?P|FbfOpy0goS@eJ>;f&TDt26%Jn&OZrh^2Dko%zI?)+y?5) zq2H8ntwqg9^Y)e=rV!#3oC|FerJZ8a;y4y0?2>Ol`^OB$A9!nO5 z#C{_A&-yiq_nX+|D^3Q|pwoi~`y=9N?$2W&F5)7(C(9vL)Y!x2dr@1RaREQ7Sp-NiMU=^A3fY92*ULq#XsRhb277UDJNH1 zvyTG;cN@b^Q9HL-b)pPMeAGKP;$ic&yvoZFPF-=#s}y^$ zCG8r#N^&rp$2et%qReS(0Wlh=a4MS$_(n?!hF#@Awtt(FAzalqzuIL-*fBC*DI-JQ z)x&(Nen+vO;T1i(L=U^)y`@Sapzu~X%xN!H+!Uz=LKc98iX}#dU@eqa1|ixzQ6SNb zT!d&M82VgrfPgjOmFvCHynnV0qC~5kP`00(zJl&pPNm8c6YYasDCHdmTz+`6Z3R^N zfamky7=XlIZW*v9*>%4uZh3!Di)FmYtp&90o|NU6c6I$U=Nrd~P2jonxSwMD_uTtm?(l!yNPK==eGu9%*H}pSLi$W!?Y0%okeEX=ea^+aKRX6Y zzAi7{r5U}z={4KwJYvakb}nqRUD4UCpLODimbW>WTa;0S`tX$I;n_gF3xgXMg@&O( z{mzP_`^IXLEpI7zv&S`Vt3_&|xi4ku-x^#pd2*6=@Y@|qr2RTM zn#{C8;QG3-uG2ODMk8kXn~5))Ji3D}G6(M<<<8O_YYl2encHc<{U3YhO-HE&A&I8i7-YX=F$tr_)_ifnEq_a?+;C7I&K{%IgZF%>NM86>oe_TR> z=;G$c@y16)t#EH{W~_W|ux)rf3D|A6r!6hojwh!fULjpGecdvxHrZn9wKyEkmB?j{ z*tcu~3L%DQ;pu##8Nl=EY^i!5J^vX(=yey_>)18l%+xd(@I&0bDyyl97bfm?y!=oA zNWl@ScA=0Dk(`;$H=ftmS8l*_T`Gal0?@d_3$~Pm7pbFqHj1QHSZ>`@9wuhx)^ysR zNJ$ph5`Pd^C@+M_24#a-kYzR}h9=INDrafsrOIy%I@dAK{Ukhx`uukWq95B~Q@^R5 zN1-k+V)9oaLT)l)$TDmyy!S!QThpTcjD9sNO?nLn;IpZPS#4astiebyTecQLDIrF- zP6n>9ftPD-Q(^YQH@R_>Ecd)!l;6g5{Vo6z|Ij!SY7w=S-82Nez4T^<%ZT)#vb4K2 zC_RntC6EBgDtM2i@bG6AYIsa#-aouA~=VBM=k8X3XtR_&i zUgDY*6MRo7PjqGE`;sRe>y^vn8KeE`mJV*8f}g3cXwX~N&U?>lb}M!9N&%0q@Tr%& zcpMxYy?-PMQ}?!ft}J|gJIQtaTBmYt`=$Vt$YtjlqiQ)u{JyfrVY>o)lsKhi9U#-= zts!kDPIZI(4m4qUOVq%^E1vNYdoWSB&jtv)%$d;O^4!$4`n zlpAY*N{Q2oQM=x&YC@ZkP>7aqutZb_+C60%*DzAUL8jKO|Mc{l;=EB-ly#JWU}fg- zyY6K!_?5?_O#Hjv%K%=C%$X9Ma-Fjc?&a1vRV&`W{0IH?VG@q2H2uVIGp1xbuw5v_ zXO|Xy*Hl$QA7q!O+}qKHQ{dv6=NNrGHL1W2m)21kE>xLDrn1&v9Gz+@)}H^JB-@ut zNNPB*2)M8%y6UOeW=nG8TMmRhI7+}|zW|5T3>mKdsyN~xi?D!5POi8Jtrza;R z1wAA5#ZO>Cj*ozVz|71n49Ee2C=yeGcI^r>-a$e?J3ZYy{(JaujV?6!fP~#GfNf`> ze#31mmqEH%+*&X-t(kP;d>s*TPUH!etE#~AWjqY&n7E(%v_36pa!{UsLfkx$VO^5h zFM_|LI$Dp$(F$mfpF^@6=aQ+jE`}}I;QK1+?LR6gRw@2(ky}`Vs4E34me2XzmBIZk z7CVeap3=p>Aim<^3ja5X8~as~=i?G3{KQzBGpabuo-R3D#>_s`*y+;5C+CtB17U7O zdur_w3aZ^K^h3mMos<{9sJbmHZrV#z(PQA?nYVzx#FccP1iRQio7(t0orR zrer!YG5HtUyS#~vo_CAx&xhK(*RufVK!dx%T)*4`Y~^|~kPYu`zs`@x^%8wXkawY& zy$w&e&AgXwY550K0^V?Z&O|Y&g*5tXl?@at{AIZMKyv29Eynrva94j`q4>{tj%kmd z`_-PBrndQFOIz}zzQOC1GuL#$F4;$HB$rEk@`dqG84#1wb>(t9*iWAfSR*)Z`#o70 z0uKCf|NU{gP~HGzZg;OCx|q(|+O-Y6aA%{b+Ea_!a?tW-6%>w(fd=Ht}%n z7G~(pZVmUw+uQ3-+)|^p_M!-H`0?=ON4n96o|MnCvl9IZgyfz->8buis$DVaTErK|F-QbO zHD1tv`JkP$;b+uGArWD~I9eSl=~~H~^AG7jKnUn$#6{Hipf&fy>9f zl5xn}y%U5(8ByWrOWck7e8X|7PS&O$KAgw^t*eqLEoEfkxnayE6rC46PCAqzmR0e- z5Y_}Z28NSnqYUZmkSul;Q-=+u(R-h*Mz)~DMm1+p(7b6+e0|k%4^VhS2^bg?HTZE5 zs&F4YHUhSr)O64IJPzgo)+`C$Rr6$}8>{rBF&sK66D8YOFL#@COjQI#8Irn;)^eE| zyQ7+@&~n(VE8IUS7B&2f7jU8!Sy^ke7mwRL-`l5mjv|s2YY+$X0UVdf^sIQ`b1zktdwDq=JMvPYitsEbs=6hX1{m8g zp(lcK%ifIBMMP7gAR`OCGjDEg0&C~CF_0ee1D>lOx%^%Y zhK8k|&4lLOy&9IAS$C-4gE8helQZC^t1!B9SG`aEi5_GkQ=mqc_MIN# zh8H86$ZR}@=H}ZPAPHyIOK;BDN~qGuU|m=#7UzpR<$jor&=~96fMedU@{L6x}k1Qoku>c3>VpSQiPY^o1vmaXOe+izJ7_WlH4?0F=j$!Vfsc*wR~GMMVP{AnvaWh;HfhQF3P_NSLPX~}YQv^i}~*cH$q-<+`UvBl8h~8kdc`pr+7we<&#`Sjdl1Ff_5X4c`e(|Eq+a^rVv^ z%;xof#u(W-oDCMs7rqaU+a|2ICA28Uem>Aw2)#*3v|G64Bze+KdQ;wt@4k^2IS^mB z8CN^Vz)E|MbdL@L1rQxm*E_^$TxlG5i;IhPYk#83^8K^_^9IhM^fG!~fxu?c6)$3Y zQld-&(u(V8zAL90fu}l41)HF~(Rr#m!p-n3DH_VpT?x_-&zY>Y4?x6)nJN(Z#%4Ey z_&Z_u6C$P8W`|M#tO)wq#@o)BfxZfm38F z^cip_-E0lvN1)-RZ1{2?kaX&9E;9(+OfJpM=5no))SNmKD9$pm9fj?+TtT2qiIi?Z zrITY^ZgD6fr&WPNRyuDvdBp`Vo9IM3K6I^65`hejO)@@~peh`ozB=rt+lK2I9-HJZ zzWo~i?W@1fU;N*H#HDBes@8IO^fD`ILupe=@hAV~uSgjdyYA@Vl{dTT?Cj*gfdey+ z@$=KY{Ffuo@Hc<*5HGyq`l>&*tBL>mw{I~pGDff}%-W82PQP=OKm7FvsH>^wcfR@( zfBxGa;Tzw5lfJWOS@-U#Q>IG$^iD5!w40HTv1Ogf;NEjBjBaprZELD%JUJD9@8Y=qwT)K3LLx&F0 z-rhdL@`y>)K3LZ-4vSJpAy(Mau(788tYL;LT&-WZn9YVB03CkZf=FlieK2d_m{=|50!xs0$q2zA-DyLK9uq? z!*N>F?Y#yf>^^4InUo$gaTA9P+s@oUdP;qv8C?ZAp-9q@(j720r}fvYH@x_d05q?2 zK#`CoRK1t$$|{LK8f!v`R1n*O^SvWPs&qDQy@Ox}GR)KT6$+eNr8e{U(%G>OGx>_61Qy5=w-c;S`HoO$m(Y9bM;LLml* zhiPkV<@-PDLP|+2fx;mSI{OWrhPdJ#M^^wnVg)Yo&_*S8d6=M`lmleo*JZ| z1K90Bf>o`YfAu*w zf=ezJUVDxI>!F9(ym>RRSd368l<9?)OTHaHLAY)^ld%Yd_h8FjFiwz&UnXftszN@J zhE2+_+y-}n?bxy&p>zabTTzsnWyZ||uU*NdOP6@%l~({}5X$Td^sLvujP}&%{~+QzGlQ*`$$A-Mg;3+?R5`)fH2K zxe$~@APK`w$@Tj*+FNQFizU#5_1v-ZqZ~hSfDN~7W$lLBkj?}@d+7&&AQ)+2uesnNW;1!HuK!99$9ZqU2|xPWV+ zqE@f+xM2gkckj+CU!;yO+4mZRKaOoQ;g77wP;CSnhe*awVB5VY z89@uJMAz0}Bph@E!O$>M(Qbr_B7CLAKsq`)7#|y@0ugFNr`xjq3@Tg8qxA zxn=Dts;g|8>)f=*Fa5j!JY(NoceEoU+`DHdfA}X~WAC0@m~v{UZEB~zttFRu08G;$ z7LBv_zBO4ctkt}BvW3C^e!_k~TQ+RqM=$-9wse==-o8GfQ*nkzhKYm?+zkYCdh3ddT$sAR!FS%_p@$wS_A<>teEp|z#LB$en?Cs~_`@yS zdFMtx{_&5qY11aajZx%UlZSl0ur30x=Ggzkkr2QAyT8kx5ADh;|L&b1qAF6ut3P{% zc>JI6`CF+C+(t~UBNdCFRec;%-y~eSmT0sQWhu`H}dr3(PdRDb`e6pIGZuVn3Q;a2Ss%vH@Dd@gxe7<^wGO3P) zxX>FUm4d3ODpssmQS>pdInsCPo|4FP%guGC>X7MFB2WnFruSyUF@|R-=Io}7*$AZx z#IF>VaN8^Im%Wh2Vkz+X=94UzjZ~_Ot|S7fZCFWd!%Eg~-pR=$KL#UCDxHC` zXV0D)`@Zt#B_8|Z-_HEK|KK}C9b&eFbP2WImM zUVifgmyRD}cW3~F;MLPtK-YQXt|qp(=I`{I3xk7${NyJ;;r{#Y2f#24Mn^{re5!a@ z^_w!UjgAiBH2$o+>Z+S>1K@Xm_jlR9e?Ncy*MH5iW5)pK?Ciw0ZT{d7{$P&WpQd|T z6^n!a@H`Ja^bimI@~7Fnd2>$rZEfwewYBq!PyQnR@SVTo-1&Mvq8*Ooz-hKvRkU5V37cAR#3VkZsQkY*4O?3pqpWtk{7-6cbic5`L+o2faS*=jcJ z3v_2|*wY1>ne$(IuW0>*Yi;Tu{-@L49f>n*H2sdn_y<@|Ik9jrVSp*6nj+nn4j(g{;^4`sp z-ki~O&irlcy)3ZMJiZo+!S)JQ^ITr3~)wV%LG44_z_yo-2JjFliBf`8T(~f zCdzg#6P&r0i6Sd*GLL1V$l>M^0-@>N0q0qZHitm+K?+fl8!PX8l6kPGZmd~Y&_JoW z##IPC%-OSN*|TR4Ew!LyGB%Om?Af!7O(YqcNYd5S#o4oGOOn04ZI+oE3=kiWfdaqJ z2f+YnlDe=?UAVmJ;p*yYQmGV{W#x4j1pgwwL|MsqBH;N>So_J(d;kLmBk47W0V!_s$!3)-`N34J^VL$u< zzcB0Z4!(d5d;uGfX55R$sD)?R4{TRfMBG_KL{?^GL}r$;u`R`skSTXmWMmb6Z=U-& z7whZebx$5Xe2Aw{pW@A%H}zQ7zWtjB8Ogu@^D9oj0|E#5+xB12#W;p=p3d_Wc)5w~ z?M-ZNZ=DHJ%AnqG1hRH|2c-xkE#1J1OY%YRx2e` zL^y#hF>jww0Z;&)fXp8@%*Ahm@peU=Eyr!VjZ*h40q&TIu*}3dlJhYWU=ijrL|`-r z7ZM;74eh0p@fQ|i8u&g_EM!>^GM0t>@JQRey*<2r`?kX|rjzkwvAMa4&CPBY;AbQ30|9`Yot;jZ^HuHd8OhpD9aKX8ymxKx~3qk0<7)$qE%PR7>$vYSLZEsE*V1!;LM#VS*J%8pud6K7;Glv z|8M#{Pc!!uUB@SY&zblR_#a^=M9|6x=M3jyj6(?7Sp&w=6{d{c$8sSi-!!>wIr61c zW6=l)a{vB)JbU&GFJHbK-0#(^S9O1Ze;wvVV*5XO^k{JZ5tmP5?D?;9|J3I+_Vc;w z{rhkeKL4xQe}BJUBgan|tY2daVz+_BlkUQim`2G}PsoEbK;v|J?!bnqhQtR2Y)_IV z0tM@)?zPV}{nuIk83K?Ee9_!atK{V-j0U)9yRdK)qA|26M{Zo3H9O!%v(H3<%=ws! zRSz~WTG`N|b0mye$3lSvxv*m3fsNuUWce`GnDY)g5FcV0BdxKuwbhy*E~V^!-`3U^ z9z1w}jg5`b(jCj<`1pAA`LA++Kgu=4bUM9|&*!rDPvNF~{#UjCY}PTI9dwL!{nSmJ zDykZK7B~)R7V$Y$nc|>tc>%;?^p+t^%MV>kLs{aqmN0sVt1Hti+IU z4n&l3W@0o(eLjp&AcV`AmVe{0NatjySt0;-@oJZ^b|@L0FM~Y`bpeY0YP`N z4Hn!rOS=3Cr{AK>!Unfhq(@WLM_>#E(qXO{tW)vM#JKq%Ax>Z`xaJrhhQ^&E@ytY3 zsaV$HjKD${EQIlnB*IKOTe^Ol<{+x*8T~q>JK>j|lU{`5fMe$iUSF6tRs%nr1Ift9 zxCW@7y0v8=DR`sEG=Q^YjKWXn^iJfL5l_fOgwnn_`rkb>(M0v^ni#wTn!_rQoWMGs z7>r{kREM_iB@VYZBLHw2KO^T8@N$@$*u9!e%*v<79EovlVeY(5$CVvOM#hZ-+1v)P zZp%4abe1zNY(Ijw&+eq!tVBxH_`9r=_07gX0FbWZ99S5`lp~2Li494jNXD=VYg85N zIOY_Z%wz^T!Z`+pV^?)l0wi43T3qL>HDwV!_I0E-m)~P7Gx1J?If`_d<9qFOx_OOM z8m;5}S@%A&1Ifs^k#LO=1e+vpIFBZL;~Ntaq~;*f;85Va{pj6P{gqPIx^PpiJMtN= zr|Q}Ob_CtqrwuG~%s4sD00204>tk66pU_{0btb2<>?LF{ekMD^sq3e-%!Kh0q3P>Z zbJ?FdjGYDATo=JifQ3=lKEzg^D{kF=l~^pHAMV>+F|@vSuSoS>b|4uUHyy5ImxzHC zX*14bVJ)LRf>PE|q)@nhrb<~OlnR---%Fy=#zZ*HGTk#>anG)D9ubRnXGgWBWKxx zWMo`pgw;@qMevNo%w~WP)-dtz{0K59ATx(CR{5H94k=}4<_IIgw5s5Cu9LtFacA;N zc%8(VxezEy%QIwAz!(Fq?DSBIBqU0=?_Jm?MAx_8$$|J;I1?hQHXO+;7CLf821eUn z6Cu~Y!~~p|9oc{X#O{mNl(P3lovJATFgpVteg-^_VR_NTF%#LyKlG%+qI>jVtS_=9 z#5o6&k#RHO977#rAwtKTYVA~aofBy?jX=597=x;+AcTOFvNjIF7zopCgd=pHieuS@ zu}OE%Ie1ytIT%%?OJ{u(q9THUt>W^;AT)plfPx4!cZS2BiY2X%0Cfb$OK`aYS#&kI zJf!p`$o{?l9)o*jC4jq)(ALE;6V>=mIAh=!q#%4=WCxOwaiicG1BG`YI{k=A1kxI$ zHJIceo$m3{TGz>QDJ9li=qkFce~*(FFM#NyaOY{7sAeCrwL%C8H*;t197${xt!y|h zU&Te}=0Jc&1=pXP;XQC`V};ISD(I?$uKobyB}8!>fUt5X0T#@}IkmZQ^$npT@gsi& zX2LW=Z7!hAOj_4TNYNW2C}Y5wWhV^rM#mxeQxCnYZoeVcdT8B*g^VAOhyv zsRtX|XYwI^88;Ml%$x})cO|WyM%36IM1I!=hwabsozq|p0*lZ|7?ujPjC*@P zny(vKuAn9(6K(ZEcMJ;OOWGj~_q2(CK>_85!rthYug{_3KyMa+OH{Y_9?D3I^5^CJjSm zQVOr;$U2n3nF!xM(tsqw3c6DWQ%brk&Y?8T(xRrQ4Iu=C5K(6mHK>t%iPkz^`kQbl z-(q@SSQz}~RS(dgkZ+yQF_7fi;I(%k?fse^@s00s{%y1aVJscaieXx$`Qwlq;*5d) z7NXNbp;YC?-5NY?f}1p~k&*sM<& zTu|46q~K?~FN07@#Uv`UVpmV8z1Mp;{_b-k>2ow+2_TYGPoAph94tJDnOT+P5g7U& hL-c8H4er8#{{tGZN5d@Xj4}WK002ovPDHLkV1l`Q#SZ`g literal 0 HcmV?d00001 diff --git a/static/browse/buildcraft/advanced_crafting_table/item.cg b/static/browse/buildcraft/advanced_crafting_table/item.cg new file mode 100644 index 000000000..769b5fb41 --- /dev/null +++ b/static/browse/buildcraft/advanced_crafting_table/item.cg @@ -0,0 +1,15 @@ +schema: 1 + +officialUrl: http://www.mod-buildcraft.com/wiki/doku.php?id=advanced_crafting_table + +video: Z-Kl3IRjxE, Tutorial + +description:<<-END +The advanced crafting table is an improved version of the basic automatic crafting table. It contains an inventory +for storing the input and an inventory for storing the outputs of the crafting process, making it potentially more +easy and seamless to create large automatic crafting systems. The advanced crafting table requires 500 MJ to craft +any recipe. + +![GUI](./gui.png) + +END