From 7d6affca746f49f5ffb2818b8a9ccf9d91388e8f Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes Date: Wed, 25 Aug 2010 00:31:27 +0000 Subject: revised help docs that conform to the PDDP template svn path=/trunk/; revision=13942 --- doc/pddp/route-help.pd | 522 +++++++++++++++++++++++-------------------------- 1 file changed, 246 insertions(+), 276 deletions(-) (limited to 'doc/pddp/route-help.pd') diff --git a/doc/pddp/route-help.pd b/doc/pddp/route-help.pd index b4dcca5f..627734dc 100644 --- a/doc/pddp/route-help.pd +++ b/doc/pddp/route-help.pd @@ -1,289 +1,259 @@ -#N canvas 190 100 1023 661 10; -#X obj 82 273 route 23 54 1; -#X msg 170 239 54 43; -#X msg 212 239 1 foo bar; -#X obj 141 418 route big apple; -#X msg 351 376 1 2 3; -#X msg 248 376 big apple pie; -#X msg 320 238 walk the dog; -#X text 8 217 numeric arguments:; -#X text 16 356 symbolic arguments:; -#X msg 590 287 bang; -#X msg 621 380 list; -#X msg 622 413 list 5; -#X msg 593 307 symbol pie; -#X msg 596 327 pie; -#X msg 584 248 1 2 3; -#X obj 26 13 route; -#X text 67 13 - route messages according to their first element; -#X text 25 108 If a match is found \, and the message contains only -ONE element \, then a bang is sent out the corresponding outlet. If -a match if found \, and the message contains multiple elements (a list) -\, then all the list elements except the first element is sent out -the corresponding outlet. If no match is found \, then the entire message -is sent out the right-most outlet - the "rejection" outlet. The number -of outlets is the number of arguments plus one.; -#X msg 18 239 23 345 456; -#X msg 96 239 420 34 45; -#X msg 32 376 apple pie; -#X msg 105 376 impeach ringo starr; -#X text 34 490 In this case \, the data type 'symbol' is implied by -the creation arguments and therefore this [route] object will match -symbols only. Symbolic messages that do not match any of the arguments -\, and all numbers \, will be output through the right-most outlet. +#N canvas 0 0 555 619 10; +#X obj 0 595 cnv 15 552 21 empty \$0-pddp.cnv.footer empty 20 12 0 +14 -228856 -66577 0; +#X obj 0 0 cnv 15 552 40 empty \$0-pddp.cnv.header route 3 12 0 18 +-204280 -1 0; +#X obj 0 240 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 +-228856 -1 0; +#N canvas 52 220 494 392 META 0; +#X text 12 115 PLATFORM windows macosx gnulinux; +#X text 12 195 LIBRARY internal; +#X text 12 235 WEBSITE http://crca.ucsd.edu/~msp/; +#X text 12 75 LICENSE SIBSD; +#X text 12 215 AUTHOR Miller Puckette; +#X text 12 295 HELP_PATCH_AUTHORS This help patch was updated for Pd +version 0.38.4 by Dave Sabine and Hans-Christoph Steiner as part of +a project called pddp proposed by Krzysztof Czaja to build comprehensive +documentation for Pd. Jonathan Wilkes revised the patch to conform +to the PDDP template for Pd version 0.42.; +#X text 12 5 GENRE help; +#X text 12 95 DESCRIPTION route message according to their first element ; -#X text 565 21 If necessary \, messages of different data types can -be matched by the [route] object if the data type is explictly defined -in the creation arguments.; -#X text 564 71 In the example below \, instead of matching the 'value' -of a message \, the [route] object will match 'data type': i.e. lists -will be sent through the first outlet \, floats will be sent through -the second outlet \, symbols through the third outlet \, bangs through -the fourth outlet. The fifth outlet will then output anything that -does not match one of the previously defined data types (i.e. the "pie" -message below is a text message that hasn't been defined as a 'symbol' -- hence \, Pd cannot determine which data type it is and it will be -output through the right-most outlet).; -#X text 608 208 a float; -#X text 632 247 a list (of floats); -#X text 627 287 a bang; -#X text 672 307 a symbol; -#X text 630 328 none of the above!; -#X text 702 268 a list of symbols; -#X text 599 349 SPECIAL CASES OF LISTS.; -#X text 17 583 RELATED OBJECTS; -#X obj 21 604 select; -#X obj 68 604 trigger; -#X obj 122 604 moses; -#X text 26 36 Route checks the first element of a message against each -of its creation arguments \, which may be numbers or symbols (but not -a mixture of the two unless the data types are defined explicitly) -\, then sends the messages through the appropriate outlets.; -#N canvas 0 22 466 316 related_objects_from_other_libraries 0; -#X obj 26 33 segregate; -#X obj 104 34 multiselect; -#X text 18 86 These objects are offered in Pd only if you have downloaded -and properly installed the appropriate library. These objects may or -may not exist in a single library.; -#X text 17 135 The best places to find information about Pd's libraries -is:; -#X text 14 157 www.pure-data.org and click on "Downloads" then "Software" -; -#X text 15 173 or; -#X text 16 187 iem.kug.ac.at/pdb/; -#X obj 193 34 demux; -#X obj 245 34 gate; -#X restore 21 627 pd related_objects_from_other_libraries; -#X floatatom 625 498 5 0 0 0 - - -; -#X symbolatom 673 497 10 0 0 0 - - -; -#X obj 578 518 bng 15 250 50 0 empty empty bang -6 23 1 12 -262144 +#X text 12 25 NAME route; +#X text 12 135 INLET_0 anything; +#X text 12 155 OUTLET_N anything; +#X text 12 175 OUTLET_R anything; +#X text 12 45 KEYWORDS control needs_work list_op symbol_op list_op +anything_op; +#X text 12 255 RELEASE_DATE 1997; +#X text 12 275 RELEASE_VERSION; +#X restore 500 597 pd META; +#X obj 0 362 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0 +13 -228856 -1 0; +#X obj 0 471 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12 +0 13 -228856 -1 0; +#X obj 0 567 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 +0 13 -228856 -1 0; +#N canvas 74 482 428 109 Related_objects 0; +#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0 +14 -204280 -1 0; +#X text 8 2 [route] Related Objects; +#X obj 22 43 select; +#X obj 72 43 spigot; +#X obj 123 43 moses; +#X restore 102 597 pd Related_objects; +#X obj 78 249 cnv 17 3 105 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 +-162280 0; +#X obj 78 371 cnv 17 3 17 empty \$0-pddp.cnv.let.0 n 5 9 0 16 -228856 +-162280 0; +#X obj 482 3 route; +#X obj 455 20 pddp/pddplink http://wiki.puredata.info/en/route -text +pdpedia: route; +#X obj 187 113 route 0 1; +#X msg 187 61 0 12; +#X msg 225 61 1 13; +#X msg 263 61 2 14; +#X obj 238 156 print rejection_outlet; +#X obj 187 200 print left_outlet; +#X obj 238 136 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X obj 212 178 print middle_outlet; +#X obj 212 136 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X msg 622 450 list not-a-list; -#X msg 578 208 89; -#X msg 581 228 float 7; -#X obj 578 474 route bang float symbol list; -#X obj 625 518 bng 15 250 50 0 empty empty float -4 23 1 12 -262144 +#X obj 187 136 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X obj 673 518 bng 15 250 50 0 empty empty symbol -12 23 1 12 -262144 +#X msg 300 61 7 17; +#X text 11 23 route messages according to their first element; +#N canvas 11 63 516 509 float_mode 0; +#X text 89 271 float; +#X text 89 365 list; +#X text 89 325 symbol; +#X text 89 455 pointer; +#X text 139 455 - a pointer is always sent to the rightmost outlet. +; +#X text 89 438 bang; +#X text 139 271 - the incoming value is compared to the creation argument(s). +If there is a match \, a bang is sent to the outlet corresponding to +the matching creation argument. If there is no match the input is sent +to the rightmost outlet.; +#X obj 1 1 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0 +14 -204280 -1 0; +#X text 8 2 [route] Message Handling in "Float Mode"; +#X obj 1 261 cnv 3 500 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 +-228856 -1 0; +#X obj 70 270 cnv 17 3 225 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 +-162280 0; +#X text 138 438 - a bang will be sent to the rightmost inlet.; +#X text 88 481 All other messages will be sent to the rightmost outlet. +; +#X msg 141 50 2; +#X msg 148 72 1 2 3; +#X obj 141 167 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X obj 721 518 bng 15 250 50 0 empty empty list -2 23 1 12 -262144 +#X obj 162 167 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X obj 769 518 bng 15 250 50 0 empty empty undefined -18 23 1 12 -262144 +#X msg 169 116 something else; +#X obj 204 167 print rejection_outlet; +#X obj 141 233 print out0; +#X obj 162 211 print out1; +#X text 50 26 For "float mode" \, the first argument must be a float. +; +#X obj 141 142 route 1 2 3; +#X obj 183 189 print out2; +#X obj 183 167 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X msg 587 268 list moon earth; -#X text 636 228 definitely a float!; -#X text 620 366 An empty list is translated into a bang; -#X text 620 399 A list with only one float is translated to a float +#X msg 158 94 3 dog night; +#X text 139 325 - the symbol is compared to the creation arguments +\, and a bang is sent to the corresponding outlet if there is a match. ; -#X text 620 435 A list with only one symbol is translated to a symbol +#X text 139 365 - the first element of the list is compared to the +creation argument(s). If there is a match \, the first element is removed +from the list \, and the remaining list is sent to the outlet corresponding +to the matching creation argument. If there is no match the input is +sent to the rightmost outlet.; +#X connect 13 0 22 0; +#X connect 14 0 22 0; +#X connect 17 0 22 0; +#X connect 22 0 15 0; +#X connect 22 0 19 0; +#X connect 22 1 16 0; +#X connect 22 1 20 0; +#X connect 22 2 23 0; +#X connect 22 2 24 0; +#X connect 22 3 18 0; +#X connect 25 0 22 0; +#X restore 171 306 pd float_mode; +#X text 98 249 anything; +#X text 168 249 - [route] handles its input in 3 different "modes" +\, depending on what the creation arguments are. Click the subpatches +below to see how message types are handled under each mode.; +#X text 261 306 match float arguments; +#N canvas 15 11 516 599 selector_mode 0; +#X text 88 548 pointer; +#X text 138 548 - a pointer is always sent to the rightmost outlet. ; -#X obj 141 439 bng 15 250 50 0 empty empty big -4 23 1 12 -262144 -1 +#X obj 0 0 cnv 15 425 20 empty \$0-pddp.cnv.subheading empty 3 12 0 +14 -204280 -1 0; +#X obj 0 389 cnv 3 500 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 +-228856 -1 0; +#X obj 69 398 cnv 17 3 255 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 +-162280 0; +#X obj 68 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X obj 189 439 bng 15 250 50 0 empty empty apple -7 23 1 12 -262144 +#X obj 101 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X obj 237 439 bng 15 250 50 0 empty empty everything_else -2 23 1 -12 -262144 -1 -1; -#X obj 129 469 print x1; -#X obj 189 469 print x2; -#X obj 249 469 print x3; -#X text 565 555 [trigger]-style shortcuts don't work:; -#X text 678 574 !=; -#X obj 579 575 route b f s l; -#X obj 700 575 route bang float symbol list; -#X obj 7 331 print x23; -#X obj 75 331 print x54; -#X obj 143 331 print x1; -#X obj 204 331 print other; -#X obj 82 293 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 109 293 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 137 293 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 161 293 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X text 176 265 In this case \, the creation arguments are all numbers -and [route] will therefore assume that it should attempt to match messages -that are data type "float". All messages that are not numbers will -be output through the right-most outlet.; -#N canvas 0 22 466 633 routing_data_types 0; -#X obj 334 314 route symbol; -#X obj 336 334 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 413 335 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 331 361 route symbol; -#X obj 333 381 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 410 382 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X msg 318 269 test; -#X msg 357 269 symbol test; -#X obj 58 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 135 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 55 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 132 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X msg 89 266 bang; -#X obj 56 311 route bang; -#X obj 53 358 route bang; -#X text 14 5 routing based on reserved words:; -#X obj 188 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 265 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 185 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 262 378 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 186 311 route float; -#X obj 183 358 route float; -#X msg 170 266 1; -#X msg 209 266 float 12; -#X obj 181 542 route list; -#X obj 181 561 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 249 562 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 168 580 route list; -#X obj 168 599 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 236 600 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X msg 184 493 list 1 two 3; -#X msg 167 473 1 two 3; -#X msg 200 513 list one 2 three; -#X msg 365 289 symbol; -#X msg 113 484 list; -#X msg 224 287 float test; -#X text 26 245 These all output the as same atom type that is routed: +#X obj 203 262 print rejection_outlet; +#X msg 68 59 der; +#X obj 68 349 print out0; +#X obj 101 327 print out1; +#X text 7 1 [route] Message Handling in "Selector Mode"; +#X msg 92 690 foo; +#X msg 101 718 symbol foo; +#X obj 169 283 print out3; +#X obj 92 840 print out0; +#X obj 133 818 print out1; +#X text 120 690 the selector "foo" matches the first argument; +#X text 171 718 the selector "symbol" matches the second argument; +#X text 88 398 bang; +#X text 138 398 - if one of the creation arguments is "bang" \, then +a bang will be sent out the corresponding outlet.; +#X text 138 428 - if one of the creation arguments is "float" \, then +an incoming float will be sent out the corresponding outlet.; +#X text 88 428 float; +#X text 88 458 list; +#X text 138 458 - if one of the creation arguments is "list" \, then +two behaviors are possible:; +#X text 138 484 a) if the first element is a float \, the list is sent +out the corresponding outlet.; +#X text 138 509 b) if the first element is a symbol \, the "list" selector +is removed \, and the remaining message is sent out the corresponding +outlet.; +#X text 88 568 symbol; +#X text 138 568 - if one of the creation arguments is "symbol" \, then +an incoming symbol will be sent out the corresponding outlet.; +#X text 87 596 All other messages - the selector of the incoming message +is compared to the creation argument(s). If there is a match \, the +selector is stripped and the remaining message is sent to the corresponding +outlet. If there is no match the input is sent to the rightmost outlet. ; -#X msg 15 266 bang test; -#X obj 71 131 route 1; -#X msg 71 183 2 3 4; -#X obj 71 164 prepend set; -#X msg 71 100 1 2 3 4; -#X msg 218 183 is not a list; -#X obj 218 164 prepend set; -#X obj 218 131 route this; -#X msg 218 100 this is not a list; -#X text 21 50 [route] has three modes \, first is float \, second is -symbol \, and third is data type. In the first two modes \, the first -element of the set is stripped off by [route].; -#X text 26 206 In the third mode \, [route] outputs the same atom type -(bang->bang \, float->float \, symbol->symbol).; -#X text 26 419 Lists do not behave the same with [route list] even -though it is interpreting incoming lists \, not just routing by keyword -\, as in the second symbol mode.; -#X msg 174 164 set; -#X text 157 164 re; -#X text 164 24 "bang" \, "float" \, "symbol" \, and "list"; -#X connect 0 0 1 0; -#X connect 0 0 3 0; -#X connect 0 1 2 0; -#X connect 3 0 4 0; -#X connect 3 1 5 0; -#X connect 6 0 0 0; -#X connect 7 0 0 0; -#X connect 12 0 13 0; -#X connect 13 0 8 0; -#X connect 13 0 14 0; -#X connect 13 1 9 0; -#X connect 14 0 10 0; -#X connect 14 1 11 0; -#X connect 20 0 16 0; -#X connect 20 0 21 0; -#X connect 20 1 17 0; -#X connect 21 0 18 0; -#X connect 21 1 19 0; -#X connect 22 0 20 0; -#X connect 23 0 20 0; -#X connect 24 0 25 0; -#X connect 24 0 27 0; -#X connect 24 1 26 0; -#X connect 27 0 28 0; -#X connect 27 1 29 0; -#X connect 30 0 24 0; -#X connect 31 0 24 0; -#X connect 32 0 24 0; -#X connect 33 0 0 0; -#X connect 34 0 24 0; -#X connect 35 0 20 0; -#X connect 37 0 13 0; -#X connect 38 0 40 0; -#X connect 40 0 39 0; -#X connect 41 0 38 0; -#X connect 43 0 42 0; -#X connect 44 0 43 0; -#X connect 45 0 44 0; -#X connect 49 0 42 0; -#X connect 49 0 39 0; -#X restore 838 496 pd routing_data_types; -#X text 580 601 This document was updated for Pd version 0.38.4 by -Dave Sabine and Hans-Christoph Steiner as part of a project called -pddp proposed by Krzysztof Czaja to build comprehensive documentation -for Pd.; -#X text 832 475 More info:; -#X connect 0 0 64 0; -#X connect 0 0 68 0; -#X connect 0 1 65 0; -#X connect 0 1 69 0; -#X connect 0 2 66 0; -#X connect 0 2 70 0; -#X connect 0 3 67 0; -#X connect 0 3 71 0; -#X connect 1 0 0 0; -#X connect 2 0 0 0; -#X connect 3 0 54 0; -#X connect 3 0 57 0; -#X connect 3 1 55 0; -#X connect 3 1 58 0; -#X connect 3 2 56 0; -#X connect 3 2 59 0; -#X connect 4 0 3 0; -#X connect 5 0 3 0; -#X connect 6 0 0 0; -#X connect 9 0 44 0; -#X connect 10 0 44 0; -#X connect 11 0 44 0; +#X text 91 667 Beware! All this can be confusing at times...; +#X msg 84 103 das; +#X obj 135 305 print out2; +#X obj 135 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X obj 169 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X msg 108 182 doh; +#X obj 203 244 bng 12 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X msg 74 81 die 41; +#X text 49 36 In selector mode \, all creation arguments should be +symbols.; +#X obj 68 221 route der die das float; +#X msg 93 125 float 41; +#X msg 103 153 41; +#X text 135 147 (Remember: a single float "n" in a message or object +box is shorthand for "float n"); +#X text 134 181 sent to the rightmost outlet (the "rejection outlet") +; +#X obj 92 774 route foo symbol list; +#X obj 174 796 print out2; +#X msg 128 744 2 3 four; +#X text 189 744 an implicit list-- matches the third argument; +#X connect 8 0 39 0; #X connect 12 0 44 0; #X connect 13 0 44 0; -#X connect 14 0 44 0; -#X connect 18 0 0 0; -#X connect 19 0 0 0; -#X connect 20 0 3 0; -#X connect 21 0 3 0; -#X connect 38 0 45 0; -#X connect 39 0 46 0; -#X connect 41 0 44 0; -#X connect 42 0 44 0; -#X connect 43 0 44 0; -#X connect 44 0 40 0; -#X connect 44 1 38 0; -#X connect 44 2 39 0; -#X connect 44 3 47 0; -#X connect 44 4 48 0; -#X connect 49 0 44 0; +#X connect 31 0 39 0; +#X connect 35 0 39 0; +#X connect 37 0 39 0; +#X connect 39 0 5 0; +#X connect 39 0 9 0; +#X connect 39 1 6 0; +#X connect 39 1 10 0; +#X connect 39 2 32 0; +#X connect 39 2 33 0; +#X connect 39 3 14 0; +#X connect 39 3 34 0; +#X connect 39 4 7 0; +#X connect 39 4 36 0; +#X connect 40 0 39 0; +#X connect 41 0 39 0; +#X connect 44 0 15 0; +#X connect 44 1 16 0; +#X connect 44 2 45 0; +#X connect 46 0 44 0; +#X restore 171 334 pd selector_mode; +#X text 277 334 match the selector of the message; +#X obj 78 397 cnv 17 3 17 empty \$0-pddp.cnv.let.0 r 5 9 0 16 -228856 +-162280 0; +#X text 98 398 anything; +#X text 168 398 - the rightmost outlet of [route] is always the "rejection +outlet." That is \, incoming messages which do not match any of the +creation arguments are sent to the rightmost outlet.; +#X text 168 372 - an outlet is added for each creation argument specified. +; +#X text 82 437 * An incoming pointer will never match and so will always +be sent to the rejection outlet.; +#X text 98 372 anything *; +#X text 80 489 1) float; +#X text 97 503 symbol atom; +#X text 168 489 - [route] can take symbols or floats as arguments. +(Note: the first argument determines which "mode" below.) If floats +are used \, [route] operates in "float mode"-- if symbols are used +\, float operates in "selector mode." See the subpatches above to see +how incoming data is handled in each mode.; +#X obj 4 597 pddp/pddplink pddp/help.pd -text help; +#X obj 100 572 pddp/pddplink ../2.control.examples/18.conditional.pd +-text doc/2.control.examples/18.conditional.pd; +#X msg 300 85 Grizabella; +#X connect 12 0 17 0; +#X connect 12 0 21 0; +#X connect 12 1 19 0; +#X connect 12 1 20 0; +#X connect 12 2 16 0; +#X connect 12 2 18 0; +#X connect 13 0 12 0; +#X connect 14 0 12 0; +#X connect 15 0 12 0; +#X connect 22 0 12 0; +#X connect 41 0 12 0; -- cgit v1.2.1