]> git.ipfire.org Git - thirdparty/cups.git/blob - standards/rfc3391.txt
Merge fixes from CUPS 1.4.0 (r8739).
[thirdparty/cups.git] / standards / rfc3391.txt
1
2
3
4
5
6
7 Network Working Group R. Herriot
8 Request for Comments: 3391 December 2002
9 Category: Informational
10
11
12 The MIME Application/Vnd.pwg-multiplexed Content-Type
13
14 Status of this Memo
15
16 This memo provides information for the Internet community. It does
17 not specify an Internet standard of any kind. Distribution of this
18 memo is unlimited.
19
20 Copyright Notice
21
22 Copyright (C) The Internet Society (2002). All Rights Reserved.
23
24 IESG Note
25
26 The IESG believes use of this media type is only appropriate in
27 situations where the producer is fully aware of the capabilities and
28 limitations of the consumer. In particular, this mechanism is very
29 dependent on the producer knowing when the consumer will need a
30 particular component of a multipart object. But consumers
31 potentially work in many different ways and different consumers may
32 need different things at different times. This mechanism provides no
33 means for a producer to determine the needs of a particular consumer
34 and how they are to be accommodated.
35
36 Alternative mechanisms, such as a protocol based on BEEP which is
37 capable of bidirectional communication between the producer and
38 consumer, should be considered when the capabilities of the consumer
39 are not known by the producer.
40
41 Abstract
42
43 The Application/Vnd.pwg-multiplexed content-type, like the
44 Multipart/Related content-type, provides a mechanism for representing
45 objects that consist of multiple components. An
46 Application/Vnd.pwg-multiplexed entity contains a sequence of chunks.
47 Each chunk contains a MIME message or a part of a MIME message. Each
48 MIME message represents a component of the compound object, just as a
49 body part of a Multipart/Related entity represents a component. With
50 a Multipart/Related entity, a body part and its reference in some
51 other body part may be separated by many octets. With an
52 Application/Vnd.pwg-multiplexed entity, a message and its reference
53 in some other message can be made quite close by chunking the message
54 containing the reference. For example, if a long message contains
55
56
57
58 Herriot Informational [Page 1]
59 \f
60 RFC 3391 Application/Multiplexed December 2002
61
62
63 references to images and the producer does not know of the need for
64 each image until it generates the reference, then
65 Application/Vnd.pwg-multiplexed allows the consumer to process the
66 reference to the image and the image before it consumes the entire
67 long message. This ability is important in printing and scanning
68 applications. This document defines the Application/Vnd.pwg-
69 multiplexed content-type. It also provides examples of its use.
70
71 Table of Contents
72
73 1. Introduction....................................................2
74 2. Terminology.....................................................7
75 3. Details.........................................................9
76 3.1 Syntax of Application/Vnd.pwg-multiplexed Contents...........10
77 3.2 Parameters for Application/Vnd.pwg-multiplexed...............12
78 3.2.1 The "type" Parameter.......................................12
79 3.2.2 Syntax.....................................................12
80 4. Handling Application/Vnd.pwg-multiplexed Entities..............12
81 5. Examples.......................................................13
82 5.1 Example With Multipart/Related...............................14
83 5.2 Examples with Application/Vnd.pwg-multiplexed................15
84 5.2.1 Example Where Each Chunk Has a Complete Message............15
85 5.2.2 Example of Chunking the Root Message.......................17
86 5.2.3 Example of Chunking the Several Messages...................18
87 5.2.4 Example of Chunks with Empty Payloads......................20
88 6. Security Considerations........................................22
89 7. Registration Information for Application/Vnd.pwg-multiplexed...22
90 8. Acknowledgments................................................23
91 9. References.....................................................23
92 10. Author's Address..............................................24
93 11. Full Copyright Statement......................................25
94
95 1. Introduction
96
97 The simple MIME content-types, such as "text/plain" provide a
98 mechanism for representing a simple object, such as a text document.
99 The Multipart/Related [RFC2387] content-type provides a mechanism for
100 representing a compound object, such as a text document with two gif
101 images.
102
103 A compound object consists of multiple components. One such
104 component is the root component, which contains references to other
105 components of the compound object. These components may, in turn,
106 contain references to other components of the compound object. For
107 example, a compound object could consist of a root html text
108 component and two gif image components -- each referenced by the root
109 component.
110
111
112
113
114 Herriot Informational [Page 2]
115 \f
116 RFC 3391 Application/Multiplexed December 2002
117
118
119 A compound object and a component are both abstractions. For
120 transmission over the wire or writing to storage, each needs a
121 representation. A "Multipart/Related entity" is one possible
122 representation of a compound object, and a "body part" is one
123 possible representation of a component.
124
125 However, the Multipart/Related content-type is not a good solution
126 for applications that require each component to be close to its
127 corresponding reference in the root component. This document defines
128 a new MIME content-type Application/Vnd.pwg-multiplexed that provides
129 a better solution for some applications. The Application/Vnd.pwg-
130 multiplexed content-type, like the Multipart/Related content-type,
131 provides a common mechanism for representing a compound object. A
132 Multipart/Related entity consists of a sequence of body parts
133 separated by boundary strings. Each body part represents a component
134 of the compound object. An Application/Vnd.pwg-multiplexed entity
135 consists of a sequence of chunks, each of whose length is specified
136 in the chunk header. Each chunk contains a message or a part of a
137 message. Each message represents a component of the compound object.
138 Chunks from different messages can be interleaved. HTTP is the
139 typical transport for an Application/Vnd.pwg-multiplexed entity over
140 the wire. An Application/Vnd.pwg-multiplexed entity could be stored
141 in a Microsoft HTML (message/rfc822) file whose suffix is .mht.
142
143 The following paragraphs contain three examples of applications. For
144 each application, there is a discussion of its solution with the
145 Application/Vnd.pwg-multiplexed content-type, the Multipart/Related
146 content-type and BEEP [RFC3080].
147
148 Example 1: a printing application. A Producer creates a print stream
149 that consists of a very long series of page descriptions, each of
150 which references one or more images. The root component is the long
151 series of page descriptions. An image may be referenced from
152 multiple pages descriptions, and there is a mechanism to indicate
153 when there are no additional references to an image (i.e., the image
154 is out of scope). The Producer does not know what images to include
155 with a page until it generates that page. The Consumer is presumed
156 to have enough storage to hold all in-scope images and enough of the
157 root component to process at least one page. The Producer doesn't
158 need any knowledge of the Consumer's storage capabilities in order to
159 create an entity that the Consumer can successfully process.
160 However, the Producer needs to be prudent about the number of images
161 that are in-scope at any time. Of course, a malicious Producer may
162 try to exceed the storage capabilities of the Consumer, and the
163 Consumer must guard against such entities (see section 6). Here are
164 ways to represent this compound object.
165
166
167
168
169
170 Herriot Informational [Page 3]
171 \f
172 RFC 3391 Application/Multiplexed December 2002
173
174
175 With the Application/Vnd.pwg-multiplexed content-type, each image
176 is a message and the root component is a message. The Producer
177 breaks the root component message into chunks with each image
178 message occurring shortly before its first reference. When the
179 Consumer encounters a reference, it can assume that it has already
180 received the referenced image in an earlier chunk.
181
182 With the Multipart/Related content-type, each image must either
183 precede or follow the root component.
184
185 If images follow the root component, the Consumer must read all
186 remaining pages of the root component before it can print the
187 first page that references such images. The Consumer must wait
188 to print such a page until it has received the entire root
189 component, and the Consumer may not have the space to hold the
190 remaining pages.
191
192 If images precede the root component, the Producer must
193 determine and send all such images before it sends the root
194 component. The Consumer must, in the best case, wait some
195 additional time before it receives the first page of the root
196 component. In the worse case, the Consumer may not have enough
197 storage for all the images.
198
199 The Multipart/Related solution is not a good solution because
200 of the wait time and because, in some cases, the Consumer may
201 not have sufficient storage for all of the images.
202
203 With BEEP, the images and root component can be sent in separate
204 channels. The Producer can push each image when it encounters the
205 first reference or the Consumer can request it when it encounters
206 the first reference. The over-the-wire stream of octets is
207 similar to an Application/Vnd.pwg-multiplexed entity. However,
208 there is a substantial difference in behavior for a printing
209 application. With the Application/Vnd.pwg-multiplexed content-
210 type, the Producer puts each image message before its first
211 reference so that when the Consumer encounters a reference, the
212 image is guaranteed to be present on the printer. With BEEP, if
213 the Consumer pulls the image, the Consumer has to wait while the
214 image comes over the network. If the Producer pushes the image,
215 BEEP may put the image message after its first reference and the
216 Consumer may still have to wait for the image. A high-speed
217 printer should not have to risk waiting for images; otherwise it
218 cannot run at full speed.
219
220 Example 2: a scanning (fax-like) application. The Producer is a
221 scanner, which scans pages and sends them along with a vnd.pwg-
222 xhtml-print+xml root component that contains references to each page
223
224
225
226 Herriot Informational [Page 4]
227 \f
228 RFC 3391 Application/Multiplexed December 2002
229
230
231 image. Each page is referenced exactly once in the root-component.
232 The Consumer is a printer that consumes vnd.pwg-xhtml-print+xml
233 entities and their attachments. That is, the Consumer is not limited
234 to print jobs that come from scanners. A Producer and Consumer are
235 each presumed to have enough storage to hold a few page images and
236 most if not all of the root component. The Producer doesn't need any
237 additional knowledge of the Consumer's storage capabilities in order
238 to create an entity that the Consumer can successfully process. Of
239 course, a malicious Producer may try to exceed the storage
240 capabilities of the Consumer and the Consumer must guard against such
241 entities (see section 6). Here are ways to represent this compound
242 object.
243
244 With the Application/Vnd.pwg-multiplexed content-type, each page
245 image is a message and the root component is a message. The
246 Producer breaks the root component message into chunks with each
247 image message just before or just after its reference.
248
249 With the Multipart/Related content-type, the images cannot precede
250 the root component because the Consumer might not have enough
251 space to store them until the root component arrived. In this
252 case, the printer could fail to print the job correctly and the
253 Producer might not know. Therefore the images must follow the
254 root component, and the Producer must scan all pages before it can
255 send the first page. At the very least, this solution delays the
256 printing of the pages until all have been scanned. In the worst
257 case, the Producer does not have sufficient memory to buffer the
258 images, and the job fails.
259
260 With BEEP, the issues are the same as in the previous example,
261 except that speed is not as important in this case. So BEEP is a
262 viable alternative for this example.
263
264 Example 3: a printing application. A Producer creates a print stream
265 that consists of a series of pages, each of which references zero or
266 more images. Each image is referenced exactly once. The Producer
267 does not know what images to include with a page until it generates
268 that page, and the Producer doesn't know the layout details; the
269 Consumer handles layout. The Producer has enough storage to send the
270 root component and all images. However, it may not have enough
271 storage to hold the entire root component or all octets of any of the
272 images. The Consumer is presumed to have enough storage to render
273 the root component and to render each image. It may not have enough
274 storage to hold the entire root component or all octets of any of the
275 images. The Producer doesn't determine the Consumer's storage
276 capabilities. Rather it arranges the components so that the Consumer
277 is mostly likely to succeed. Of course, a malicious Producer may try
278
279
280
281
282 Herriot Informational [Page 5]
283 \f
284 RFC 3391 Application/Multiplexed December 2002
285
286
287 to exceed the storage capabilities of the Consumer, and the Consumer
288 must guard against such entities (see section 6). Here are ways to
289 represent this compound object.
290
291 With the Application/Vnd.pwg-multiplexed content-type, each image
292 is a message and the root component is a message. The Producer
293 breaks the root component message into chunks with each image
294 message just after its reference. The references appear first so
295 that the Consumer knows the location of each image before it
296 processes the image. This strategy minimizes storage needs for
297 Producer and Consumer and provides a good strategy in case of
298 failure. Here are the cases to consider.
299
300 a) When the document consists of vertically aligned blocks where
301 each block contains either lines of text or a single image, the
302 sequence of chunks is the same as the sequence of printable
303 blocks, thus minimizing Consumer buffering needs.
304
305 b) When a block can contain N side-by-side images, the Consumer
306 must buffer N-1 images unless the Producer interleaves the
307 images. If the Producer doesn't interleave the images, and the
308 Consumer runs out of storage before it has received N-1,
309 images, it can print what it has and print the remaining images
310 below; not what the Producer intended, but better than nothing.
311 If the Producer interleaves images, and the Consumer runs out
312 of storage before it has received the bands of N images, the
313 Consumer would print portions of images interleaved with
314 portions of other images. So, a Producer should not interleave
315 images.
316
317 c) When a block contains text and image side-by-side (i.e., run-
318 around text), there are additional buffering requirements.
319 When the Consumer processes the text that follows the
320 reference, it will place some of it next to the image (run-
321 around text) and will place the remaining text after the image.
322 The Producer doesn't know where the run-around ends, and thus
323 doesn't know where to end the text chunk and start the image
324 chunk. If the Producer ends the text too soon, then the
325 Consumer either has to process the entire image (if it has
326 enough storage) in order to get the remaining run-around text,
327 or it ends the run-around text prematurely. If the Producer
328 ends the text too late, then the Consumer may have to store too
329 much text and possibly put the image later than the Producer
330 requested. Because text data requires significantly less
331 storage than image data, a good strategy for Producer is to err
332 on the side of sending too much rather than too little text
333 before the image data.
334
335
336
337
338 Herriot Informational [Page 6]
339 \f
340 RFC 3391 Application/Multiplexed December 2002
341
342
343 d) When a block contains text and multiple side-by-side images,
344 the problem becomes a combination of items b) and c) above.
345
346 The Application/Vnd.pwg-multiplexed content-type can be made to
347 work in this example, but a Consumer must have failure strategies
348 and the result may not be quite what the producer intended. With
349 the Multipart/Related content-type, the images cannot precede the
350 root component because the Consumer might not have enough space to
351 store them until the root component arrived. Also, the images
352 cannot follow the root component because the Consumer might not
353 have enough storage for the root component before the first image
354 arrives. So the Multipart/Related content-type is not an
355 acceptable solution for this example.
356
357 With BEEP, the Producer can send the root component on channel 1
358 and the Consumer can request images on even numbered channels when
359 it encounters a reference. This solution allows more flexibility
360 than the Application/Vnd.pwg-multiplexed content-type. If there
361 are side-by-side images and/or run-around text, the Consumer can
362 request bands of each image or run-around text over separate
363 channels.
364
365 In all of these examples, the Application/Vnd.pwg-multiplexed
366 content-type provides a much better solution than Multipart/Related.
367 However, it is evenly matched with BEEP. For applications where
368 speed is important and ordering of the chunks is important in order
369 to avoid printing delays, the Application/Vnd.pwg-multiplexed
370 content-type is best. For applications, where the Consumer needs
371 more control over the ordering of received octets, BEEP is best.
372
373 2. Terminology
374
375 This document uses some of the MIME terms that are defined in
376 [RFC2045]. The following are the terms used in this document:
377
378 Entity: the headers and the content. In this document, the term
379 "entity" describes all the octets that represent a compound
380 object.
381
382 Message: an entity as in [RFC2045]. In this document, the term
383 "message" describes all octets that represent one component of a
384 compound object. That is, it has MIME headers and content.
385
386 Body Part: an entity inside a multipart. That is, a body part is
387 the headers and content (i.e., octets) between the multipart
388 boundary strings not including the CRLF at the beginning and end.
389 This document never uses "entity" to mean "body part".
390
391
392
393
394 Herriot Informational [Page 7]
395 \f
396 RFC 3391 Application/Multiplexed December 2002
397
398
399 Headers: the initial lines of an entity, message or body part. An
400 empty line (i.e., two adjacent CRLFs) terminates the headers.
401 Sometimes the term "MIME header" is used instead of just "header".
402
403 Content: the part of an entity, message or body part that follows
404 the headers (i.e., follows the two adjacent CRLFs). The content
405 of a body part ends at the octet preceding the CRLF before the
406 multipart boundary string. The content of a message ends at the
407 octets specified by the length field in the Chunk Header.
408
409 This document uses the following additional terms.
410
411 Chunk: a chunk of data, consisting of a chunk header, a chunk
412 payload and a CRLF.
413
414 Chunk Header: the first line of a chunk. The line consists of the
415 "CHK" keyword, the message number, the length and the continuation
416 indicator, each separated by a single space character (ASCII 32).
417 A CRLF terminates the line. Each message in an
418 Application/Vnd.pwg-multiplexed entity has a message number that
419 normally differs from the message numbers of all other messages in
420 the Application/Vnd.pwg-multiplexed entity. The message number 0
421 is reserved for final Chunk Header in the Application/Vnd.pwg-
422 multiplexed entity.
423
424 Chunk Payload: the octets between the Chunk Header and the Chunk
425 Header of the next chunk. The length field in the header's length
426 field specifies the number of octets in the Chunk Payload. The
427 Chunk Payload is either a complete message or a part of a message.
428 The continuation field in the header specifies whether the chunk
429 is the last chunk of the message.
430
431 CRLF: the sequence of octets corresponding to the two US-ASCII
432 characters CR (decimal value 13) and LF (decimal value 10) which,
433 taken together, in this order, denote a line break. A CRLF
434 terminates each chunk in order to provide visual separation from
435 the next chunk header.
436
437 Consumer: the software that receives and processes a MIME entity,
438 e.g., software in a printer or software that reads a file.
439
440 Producer: the software that creates and sends a MIME entity, e.g.,
441 software in a scanner or software that writes a file.
442
443
444
445
446
447
448
449
450 Herriot Informational [Page 8]
451 \f
452 RFC 3391 Application/Multiplexed December 2002
453
454
455 3. Details
456
457 The Application/Vnd.pwg-multiplexed content-type, like
458 Multipart/Related, is intended to represent a compound object
459 consisting of several inter-related components. This document does
460 not specify the representation of these relationships, but [RFC2557]
461 contains examples of Multipart/Related entities that use the
462 Content-ID and Content-Location headers to identify body parts and
463 URLs (including the "cid" URL) to reference body parts. It is
464 expected that Application/Vnd.pwg-multiplexed entities would use the
465 patterns described in [RFC2557].
466
467 For an Application/Vnd.pwg-multiplexed entity, there is one parameter
468 for the Content-Type header. It is a "type" parameter, and it is
469 like the "type" parameter for the Multipart/Related content-type.
470 The value of the "type" parameter must be the content-type of the
471 root message and it effectively specifies the type of the compound
472 object.
473
474 An Application/Vnd.pwg-multiplexed entity contains a sequence of
475 chunks. Each chunk consists of a chunk header, a chunk payload and a
476 CRLF.
477
478 - The chunk header consists of a "CHK" keyword followed by the
479 message number, the chunk payload length, whether the chunk is
480 the last chunk of a message and, finally, a CRLF. The length
481 field removes the need for boundary strings that Multipart uses.
482 (See section 3.1 for the syntax of a chunk header).
483
484 - The chunk payload is a sequence of octets that is either a
485 complete message or a part of a message.
486
487 - The CRLF provides visual separation from the following chunk.
488
489 Each message represents a component of the compound object, and a
490 message is intended to have exactly the same representation, octet
491 for octet, as a body part of a Multipart/Related entity that
492 represents the same component. When a message is split across
493 multiple chunks, the chunks need not be contiguous.
494
495 The contents of an Application/Vnd.pwg-multiplexed entity have the
496 following properties:
497
498 1) The first chunk contains a complete or partial message that (in
499 either case) represents the root component of the compound
500 object.
501
502
503
504
505
506 Herriot Informational [Page 9]
507 \f
508 RFC 3391 Application/Multiplexed December 2002
509
510
511 2) Additional chunks contain messages or partial messages that
512 represent some component of the compound object.
513
514 3) The final chunk's header contains a message number of 0, a
515 length of 0 and a last-chunk-of-message mark (i.e., the chunk
516 header line is "CHK 0 0 LAST"). The final chunk contains no
517 chunk payload.
518
519 4) A message can be broken into multiple parts and each break can
520 occur anywhere within the message. Each part of the message is
521 zero or more bytes in length and each part of the message is
522 the contents of its own chunk. The order of the chunks within
523 the Application/Vnd.pwg-multiplexed entity must be the same as
524 the order of the parts within the message.
525
526 5) A message represents a component of a compound object, and it
527 is intended that it have exactly the same representation, octet
528 for octet, as a body part of a Multipart/Related entity that
529 represents the same component. In particular, the message may
530 contain a Content-Type header to specify the content-type of
531 the message content. Also, the message may contain a Content-
532 ID header and/or Content-Location header to identify a message
533 that is referenced from within another message. If a message
534 contains no Content-Type header, then the message has an
535 implicit content-type of "text/plain; charset=us-ascii", cf.
536 [RFC2045].
537
538 See section 4 for a discussion displaying an Application/Vnd.pwg-
539 multiplexed entity.
540
541 3.1 Syntax of Application/Vnd.pwg-multiplexed Contents
542
543 The ABNF [RFC2234] for the contents of an Application/Vnd.pwg-
544 multiplexed entity is:
545
546 contents = *chunk finalChunk
547 chunk = header payload CRLF
548 header = "CHK" SP messageNumber SP length SP isMore CRLF
549 messageNumber = 1..2147483647
550 length = 0..2147483647
551 isMore = "MORE" / "LAST"
552 payload = *OCTET
553 finalChunk = finalHeader CRLF
554 finalHeader = "CHK" SP "0" SP "0" SP "LAST" CRLF
555
556
557
558
559
560
561
562 Herriot Informational [Page 10]
563 \f
564 RFC 3391 Application/Multiplexed December 2002
565
566
567 The messageNumber field specifies the message that the chunk is
568 associated with. See the end of this section for more details.
569
570 The length field specifies the number of octets in the chunk payload
571 (represented in ABNF as "payload"). The first octet of the chunk
572 payload is the one immediately following the LF (i.e., final octet)
573 of the chunk header. The last octet of the chunk payload is the one
574 immediately preceding the two octets CRLF that end the chunk.
575
576 The isMore field has a value of "LAST" for the last chunk of a
577 message and "MORE" for all other chunks of a message.
578
579 Normally each message in an Application/Vnd.pwg-multiplexed entity
580 has a unique message number, and a message consists of the
581 concatenation of all the octets from the one or more chunks with the
582 same message number. The isMore field of the chunk header of the
583 last chunk of each message must have a value of "LAST" and the isMore
584 field of the chunk header of all other chunks must have a value of
585 "MORE".
586
587 Two or more messages may have the same message number, though such
588 reuse of message numbers is not recommended. The chunks with the
589 same message number represent a sequence of one or more messages
590 where the isMore field of the chunk header of the last chunk of each
591 message has a value of "LAST". All chunks whose isMore field of the
592 chunk header has the value of "MORE" belong to the same message as
593 the next chunk (in sequence) whose isMore field of the chunk header
594 has the value of "LAST". In other words, if two messages have the
595 same message number, the last chunk of the first message must occur
596 before the first chunk of the second message.
597
598 The behavior of the Consumer is undefined if the final Chunk (i.e.,
599 the Chunk whose chunk header is "CHK 0 0 LAST") occurs before the
600 last chunk of every message occurs.
601
602 Two adjacent chunks usually have different message numbers. However,
603 they may have the same message number. If two adjacent chunks have
604 the same message number, the two chunks could be combined into a
605 single chunk, but they need not be combined.
606
607 The number of octets in a chunk payload may be zero, and an
608 Application/Vnd.pwg-multiplexed entity may contain any number of
609 chunks with zero octets of chunk payload. For example, the last
610 chunk of each message may contain zero octets for programming
611 convenience. As another example, suppose that a particular compound
612 object format requires that referenced messages occur before the root
613 message. This document requires that the first chunk of an
614 Application/Vnd.pwg-multiplexed entity contain the root message or a
615
616
617
618 Herriot Informational [Page 11]
619 \f
620 RFC 3391 Application/Multiplexed December 2002
621
622
623 part of it. So, the first chunk contains a chunk payload of zero
624 octets with the first octet of the root message in the second chunk.
625 That is, all of the message headers of the root message are in the
626 second chunk. As an extreme but unlikely example, it would be
627 possible to have a message broken into ten chunks with zero octet
628 chunk payloads in all chunks except for chunks 4 and 7.
629
630 3.2 Parameters for Application/Vnd.pwg-multiplexed
631
632 This section defines additional parameters for Application/Vnd.pwg-
633 multiplexed.
634
635 3.2.1 The "type" Parameter
636
637 The type parameter must be specified. Its value is the content-type
638 of the "root" message. It permits a Consumer to determine the
639 content-type without reference to the enclosed message. If the value
640 of the type parameter differs from the content-type of the root
641 message, the Consumer's behavior is undefined.
642
643 3.2.2 Syntax
644
645 The syntax for "parameter" is:
646
647 parameter := "type" "=" type "/" subtype ; cf. [RFC2045]
648
649 4. Handling Application/Vnd.pwg-multiplexed Entities
650
651 The application that handles the Application/Vnd.pwg-multiplexed
652 entity has the responsibility for displaying the entity. However,
653 Application/Vnd.pwg-multiplexed messages may contain Content-
654 Disposition headers that provide suggestions for the display and
655 storage of a message, and in some cases the application may pay
656 attention to such headers.
657
658 As a reminder, Content-Disposition headers [RFC1806] allow the sender
659 to suggest presentation styles for MIME messages. There are two
660 presentation styles, 'inline' and 'attachment'. Content-Disposition
661 headers have a parameter for specifying a suggested file name for
662 storage.
663
664 There are three cases to consider for handling Application/Vnd.pwg-
665 multiplexed entities:
666
667 a) The Consumer recognizes Application/Vnd.pwg-multiplexed and the
668 content-type of the root. The Consumer determines the
669 presentation style for the compound object; it handles the
670 display of the components of the compound object in the context
671
672
673
674 Herriot Informational [Page 12]
675 \f
676 RFC 3391 Application/Multiplexed December 2002
677
678
679 of the compound object. In this case, the Content-Disposition
680 header information is redundant or even misleading, and the
681 Consumer shall ignore them for purposes of display. The
682 Consumer may use the suggested file name if the entity is
683 stored.
684
685 b) The Consumer recognizes Application/Vnd.pwg-multiplexed, but
686 not the content-type of the root. The Consumer will give the
687 user the choice of suppressing the entire Application/Vnd.pwg-
688 multiplexed entity or treating the Application/Vnd.pwg-
689 multiplexed entity as a Multipart/Mixed entity where each
690 message is a body part of the Multipart/Mixed entity. In this
691 case (where the entity is not suppressed), the Consumer may
692 find the Content-Disposition information useful for displaying
693 each body part of the resulting Multipart/Mixed entity. If a
694 body part has no Content-Disposition header, the Consumer
695 should display the body part as an attachment.
696
697 c) The Consumer does not recognize Application/Vnd.pwg-
698 multiplexed. The Consumer treats the Application/Vnd.pwg-
699 multiplexed entity as opaque and can do nothing with it.
700
701 5. Examples
702
703 This section contains five examples. Each example is a different
704 representation of the same compound object. The compound object has
705 four components: an XHTML text component and three image components.
706 The images are encoded in binary. The string "<<binary data>>" and
707 "<<part of binary data>>" in each example represents all or part of
708 the binary data of each image. Two of the images are potentially
709 side by side and the third image is displayed later in the document.
710 All of the images are identified by Content-Id and two of the images
711 are also identified by a Content-Location. One of the images
712 references the Content-Location.
713
714 The first example shows a Multipart/Related representation of the
715 compound object in order to provide a representation that the reader
716 is familiar with. The remaining examples show Application/Vnd.pwg-
717 multiplexed representations of the same compound object. In the
718 second example, each chunk contains a whole message. In the third
719 example, the XHTML message is split across 3 chunks, and these chunks
720 are interleaved among the three image messages. In the fourth
721 example, the XHTML message is split across 4 chunks, and the two
722 side-by-side images are each split across two chunks. The XHTML
723 chunks are interleaved among the image chunks. In the fifth example,
724 there are chunks with empty payloads and adjacent chunks with the
725 same message number.
726
727
728
729
730 Herriot Informational [Page 13]
731 \f
732 RFC 3391 Application/Multiplexed December 2002
733
734
735 The last example may seem to address useless cases, but sometimes it
736 is easier to write software if these cases are allowed. For example,
737 when a buffer fills, it may be easiest to write a chunk and not worry
738 if the previous chunk had the same message number. Likewise, it may
739 be easiest to end a message with an empty chunk. Finally, the
740 Application/Vnd.pwg-multiplexed content-type requires that the first
741 chunk be part of the root message. Sometimes, it is more convenient
742 for the Producer if the root message starts after the occurrence of
743 some attachments. Since a chunk can be empty, the first chunk of the
744 root message can be empty, i.e., it doesn't even contain any headers.
745 Then the first chunk contains a part of the root message, but the
746 Producer doesn't generate any octets for that chunk.
747
748 Each body part of the Multipart/Related entity and each message of
749 the Application/Vnd.pwg-multiplexed entity contain a content-
750 disposition, which the Consumer uses according to the rules in
751 section 4. Note the location of the content-disposition headers in
752 the examples.
753
754 5.1 Example With Multipart/Related
755
756 In this example, the compound object is represented as a
757 Multipart/Related entity so that the reader can compare it with the
758 Application/Vnd.pwg-multiplexed entities.
759
760 Content-Type: multipart/related; boundary="boundary-example";
761 type="text/xhtml+xml"
762
763 --boundary-example
764 Content-ID: <49568.44343xxx@foo.com>
765 Content-Type: application/vnd.pwg-xhtml-print+xml
766 Content-Disposition: inline
767
768 <?xml version="1.0"?>
769 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
770 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
771 <html xmlns="http://www.w3.org/TR/xhtml1">
772 <body>
773 <p>some text
774 <img src="cid:49568.45876xxx@foo.com"/>
775 <img src="http://foo.com/images/image2.gif"/>
776 some more text after the images
777 </p>
778 <p>some more text without images
779 </p>
780 <p>some more text
781 <img src="cid:49568.47333xxx@foo.com"/>
782 </p>
783
784
785
786 Herriot Informational [Page 14]
787 \f
788 RFC 3391 Application/Multiplexed December 2002
789
790
791 <p>some final text
792 </p>
793 </body>
794 </html>
795 --boundary-example
796 Content-ID: <49568.45876xxx@foo.com>
797 Content-Location: http://foo.com/images/image1.gif
798 Content-Type: image/gif
799 Content-Disposition: attachment
800
801 <<binary data>>
802 --boundary-example
803 Content-ID: <49568.46000xxx@foo.com>
804 Content-Location: http://foo.com/images/image2.gif
805 Content-Type: image/gif
806 Content-Disposition: attachment
807
808 <<binary data>>
809 --boundary-example
810 Content-ID: <49568.47333xxx@foo.com>
811 Content-Type: image/gif
812 Content-Disposition: attachment
813
814 <<binary data>>
815 --boundary-example--
816
817 5.2 Examples with Application/Vnd.pwg-multiplexed
818
819 The four examples in this section show Application/Vnd.pwg-
820 multiplexed representations of the same compound object. Note that
821 each CRLF is represented by a visual line break.
822
823 5.2.1 Example Where Each Chunk Has a Complete Message
824
825 In this example, the compound object is represented as an
826 Application/Vnd.pwg-multiplexed entity. Each chunk contains an
827 entire message, i.e., none of the messages are split across multiple
828 chunks. Each message in this example is identical to the
829 corresponding body part in the preceding Multipart/Relate example.
830
831 Content-Type: application/vnd.pwg-multiplexed;
832 type="application/vnd.pwg-xhtml-print+xml"
833
834 CHK 1 550 LAST
835 Content-ID: <49568.44343xxx@foo.com>
836 Content-Type: application/vnd.pwg-xhtml-print+xml
837 Content-Disposition: inline
838
839
840
841
842 Herriot Informational [Page 15]
843 \f
844 RFC 3391 Application/Multiplexed December 2002
845
846
847 <?xml version="1.0"?>
848 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
849 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
850 <html xmlns="http://www.w3.org/TR/xhtml1">
851 <body>
852 <p>some text
853 <img src="cid:49568.45876xxx@foo.com"/>
854 <img src="http://foo.com/images/image2.gif"/>
855 some more text after the images
856 </p>
857 <p>some more text without images
858 </p>
859 <p>some more text
860 <img src="cid:49568.47333xxx@foo.com"/>
861 </p>
862 <p>some final text
863 </p>
864 </body>
865 </html>
866
867 CHK 2 6346 LAST
868 Content-ID: <49568.45876xxx@foo.com>
869 Content-Location: http://foo.com/images/image1.gif
870 Content-Type: image/gif
871 Content-Disposition: attachment
872
873 <<binary data>>
874 CHK 3 6401 LAST
875 Content-ID: <49568.46000xxx@foo.com>
876 Content-Location: http://foo.com/images/image2.gif
877 Content-Type: image/gif
878 Content-Disposition: attachment
879
880 <<binary data>>
881 CHK 4 7603 LAST
882 Content-ID: <49568.47333xxx@foo.com>
883 Content-Type: image/gif
884 Content-Disposition: attachment
885
886 <<binary data>>
887 CHK 0 0 LAST
888
889
890
891
892
893
894
895
896
897
898 Herriot Informational [Page 16]
899 \f
900 RFC 3391 Application/Multiplexed December 2002
901
902
903 5.2.2 Example of Chunking the Root Message
904
905 In this example, the compound object is represented as an
906 Application/Vnd.pwg-multiplexed entity. The message containing the
907 XHTML component is split into 3 pieces so that the reference to an
908 image is as close as possible to the beginning of the chunk. The
909 chunk containing the referenced image message occurs just before the
910 chunk with the reference. This minimizes the distance between
911 reference and referenced message.
912
913 Note that there are other possible arrangements (see the third
914 example in section 5.2.3). For example, a sender could split the
915 XHTML message so that the reference to an image is as close as
916 possible to the end of the chunk. Then the chunk containing the
917 referenced image message should occur just after the chunk with the
918 reference. The sender could mix this strategy with the one used in
919 this example.
920
921 Content-Type: application/vnd.pwg-multiplexed;
922 type=" application/vnd.pwg-xhtml-print+xml"
923
924 CHK 1 267 MORE
925 Content-ID: <49568.44343xxx@foo.com>
926 Content-Type: application/vnd.pwg-xhtml-print+xml
927 Content-Disposition: inline
928
929 <?xml version="1.0"?>
930 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
931 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
932 <html xmlns="http://www.w3.org/TR/xhtml1">
933 <body>
934 <p>some text
935
936 CHK 2 6346 LAST
937 Content-ID: <49568.45876xxx@foo.com>
938 Content-Location: http://foo.com/images/image1.gif
939 Content-Type: image/gif
940 Content-Disposition: attachment
941
942 <<binary data>>
943 CHK 3 6401 LAST
944 Content-ID: <49568.46000xxx@foo.com>
945 Content-Location: http://foo.com/images/image2.gif
946 Content-Type: image/gif
947 Content-Disposition: attachment
948
949
950
951
952
953
954 Herriot Informational [Page 17]
955 \f
956 RFC 3391 Application/Multiplexed December 2002
957
958
959 <<binary data>>
960 CHK 1 166 MORE
961 <img src="cid:49568.45876xxx@foo.com"/>
962 <img src="http://foo.com/images/image2.gif"/>
963 some more text after the images
964 </p>
965 <p>some more text without images
966 </p>
967 <p>some more text
968
969 CHK 4 7603 LAST
970 Content-ID: <49568.47333xxx@foo.com>
971 Content-Type: image/gif
972 Content-Disposition: attachment
973
974 <<binary data>>
975 CHK 1 80 LAST
976 <img src="cid:49568.47333xxx@foo.com"/>
977 </p>
978 <p>some final text
979 </p>
980 </body>
981 </html>
982
983 CHK 0 0 LAST
984
985 5.2.3 Example of Chunking the Several Messages
986
987 In this example, the compound object is represented as an
988 Application/Vnd.pwg-multiplexed entity. The message containing the
989 XHTML component is split into 4 pieces so that the reference to an
990 image is as close as possible to either the beginning or the end of
991 the chunk. The references to the first and second images closely
992 follow the referenced images. The reference to the third image
993 closely precedes the referenced image. This minimizes the distance
994 between reference and referenced message. In addition, the first two
995 image messages are split into two chunks each.
996
997 Content-Type: application/vnd.pwg-multiplexed;
998 type=" application/vnd.pwg-xhtml-print+xml"
999
1000 CHK 1 303 MORE
1001 Content-ID: <49568.44343xxx@foo.com>
1002 Content-Type: application/vnd.pwg-xhtml-print+xml
1003 Content-Disposition: inline
1004
1005
1006
1007
1008
1009
1010 Herriot Informational [Page 18]
1011 \f
1012 RFC 3391 Application/Multiplexed December 2002
1013
1014
1015 <?xml version="1.0"?>
1016 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
1017 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1018 <html xmlns="http://www.w3.org/TR/xhtml1">
1019 <body>
1020 <p>some text
1021
1022 CHK 2 184 MORE
1023 Content-ID: <49568.45876xxx@foo.com>
1024 Content-Location: http://foo.com/images/image1.gif
1025 Content-Type: image/gif
1026 Content-Disposition: attachment
1027
1028 <<part of binary data>>
1029 CHK 3 200 MORE
1030 Content-ID: <49568.46000xxx@foo.com>
1031 Content-Location: http://foo.com/images/image2.gif
1032 Content-Type: image/gif
1033 Content-Disposition: attachment
1034
1035 <<part of binary data>>
1036 CHK 1 78 MORE
1037 <img src="cid:49568.45876xxx@foo.com"/>
1038 <img src="http://foo.com/images/image2.gif"/>
1039
1040 CHK 2 6162 LAST
1041 <<part of binary data>>
1042 CHK 3 6201 LAST
1043 <<part of binary data>>
1044 CHK 1 127 MORE
1045 some more text after the images
1046 </p>
1047 <p>some more text without images
1048 </p>
1049 <p>some more text
1050 <img src="cid:49568.47333xxx@foo.com"/>
1051
1052 CHK 4 7603 LAST
1053 Content-ID: <49568.47333xxx@foo.com>
1054 Content-Type: image/gif
1055 Content-Disposition: attachment
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066 Herriot Informational [Page 19]
1067 \f
1068 RFC 3391 Application/Multiplexed December 2002
1069
1070
1071 <<binary data>>
1072 CHK 1 41 LAST
1073 </p>
1074 <p>some final text
1075 </p>
1076 </body>
1077 </html>
1078
1079 CHK 0 0 LAST
1080
1081 5.2.4 Example of Chunks with Empty Payloads
1082
1083 This example is identical to the previous one, except that some
1084 chunks have a chunk payload of zero octets. The root message starts
1085 with a chunk whose payload is empty and every message ends with a
1086 chunk whose payload is empty. This example also shows two adjacent
1087 chunks that are from the same message. These two chunks could be
1088 coalesced into a single chunk, but they might be kept separate for
1089 programming convenience.
1090
1091 Content-Type: application/vnd.pwg-multiplexed;
1092 type=" application/vnd.pwg-xhtml-print+xml"
1093
1094 CHK 1 0 MORE
1095
1096 CHK 2 184 MORE
1097 Content-ID: <49568.45876xxx@foo.com>
1098 Content-Location: http://foo.com/images/image1.gif
1099 Content-Type: image/gif
1100 Content-Disposition: attachment
1101
1102 <<part of binary data>>
1103 CHK 3 200 MORE
1104 Content-ID: <49568.46000xxx@foo.com>
1105 Content-Location: http://foo.com/images/image2.gif
1106 Content-Type: image/gif
1107 Content-Disposition: attachment
1108
1109 <<part of binary data>>
1110 CHK 1 303 MORE
1111 Content-ID: <49568.44343xxx@foo.com>
1112 Content-Type: application/vnd.pwg-xhtml-print+xml
1113 Content-Disposition: inline
1114
1115
1116
1117
1118
1119
1120
1121
1122 Herriot Informational [Page 20]
1123 \f
1124 RFC 3391 Application/Multiplexed December 2002
1125
1126
1127 <?xml version="1.0"?>
1128 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
1129 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1130 <html xmlns="http://www.w3.org/TR/xhtml1">
1131 <body>
1132 <p>some text
1133
1134 CHK 2 6162 MORE
1135 <<part of binary data>>
1136 CHK 3 6201 MORE
1137 <<part of binary data>>
1138 CHK 2 0 LAST
1139
1140 CHK 3 0 LAST
1141
1142 CHK 1 78 MORE
1143 <img src="cid:49568.45876xxx@foo.com"/>
1144 <img src="http://foo.com/images/image2.gif"/>
1145
1146 CHK 4 7603 MORE
1147 Content-ID: <49568.47333xxx@foo.com>
1148 Content-Type: image/gif
1149 Content-Disposition: attachment
1150
1151 <<binary data>>
1152 CHK 4 0 LAST
1153
1154 CHK 1 127 MORE
1155 some more text after the images
1156 </p>
1157 <p>some more text without images
1158 </p>
1159 <p>some more text
1160 <img src="cid:49568.47333xxx@foo.com"/>
1161
1162 CHK 1 41 MORE
1163 </p>
1164 <p>some final text
1165 </p>
1166 </body>
1167 </html>
1168
1169 CHK 1 0 LAST
1170
1171 CHK 0 0 LAST
1172
1173
1174
1175
1176
1177
1178 Herriot Informational [Page 21]
1179 \f
1180 RFC 3391 Application/Multiplexed December 2002
1181
1182
1183 6. Security Considerations
1184
1185 There are security considerations that pertain to each message of an
1186 Application/Vnd.pwg-multiplexed entity. Those security
1187 considerations are described by the document that defines the
1188 content-type of the message. They are not addressed in this
1189 document.
1190
1191 There are also security considerations that pertain to the
1192 Application/Vnd.pwg-multiplexed entity as a whole. A Producer that
1193 is buggy or malicious may send an Application/Vnd.pwg-multiplexed
1194 entity that could cause a Consumer to request more storage than it
1195 has, even if it has a large amount of storage. A Consumer must be
1196 able to deal gracefully with the following scenarios and combinations
1197 of them:
1198
1199 - The chunks of one or more messages are separated by a very large
1200 number of octets. In the extreme case some or all of the
1201 messages don't terminate, i.e., they don't contain a closing
1202 chunk.
1203 - A very large number of messages are started and interleaved
1204 before their final chunk occurs.
1205 - A message contains one or more references to other messages that
1206 never occur or don't occur for a large number of octets.
1207 - A very large number of referenced messages occur before the
1208 Consumer knows that it can discard them.
1209
1210 7. Registration Information for Application/Vnd.pwg-multiplexed
1211
1212 The following form is copied from RFC 1590, Appendix A.
1213
1214 To: iana@iana.org
1215
1216 Subject: Registration of new Media Type
1217 application/Vnd.pwg-multiplexed
1218 Media Type name: Application
1219 Media subtype name: Vendor Tree - vnd.pwg-multiplexed
1220 Required parameters: Type, a media type/subtype.
1221 Optional parameters: No optional parameters
1222 Encoding considerations: Each message of an
1223 Application/Vnd.pwg-multiplexed entity can be
1224 encoded in any manner allowed by the Content-
1225 Type of the message. However, using the
1226 reasoning of Multipart, the
1227 Application/Vnd.pwg-multiplexed entity cannot
1228 be encoded. Otherwise, a message would be
1229
1230
1231
1232
1233
1234 Herriot Informational [Page 22]
1235 \f
1236 RFC 3391 Application/Multiplexed December 2002
1237
1238
1239 encoded twice, once at the message level and
1240 once at the Application/Vnd.pwg-multiplexed
1241 level.
1242 Security considerations: See section 6 (Security
1243 Considerations) of RFC 3391.
1244 Published specification: RFC 3391.
1245 Person & email address to contact for further information:
1246
1247 Robert Herriot
1248 706 Colorado Ave.
1249 Palo Alto, CA 94303
1250 USA
1251 Phone: 1-650-327-4466
1252 Fax: 1-650-327-4466
1253 EMail: bob@herriot.com
1254
1255 8. Acknowledgments
1256
1257 The author gratefully acknowledges the contributions of: Ugo Corda,
1258 Dave Crocker, Melinda Sue Grant, Graham Klyne, Carl-Uno Manros, Larry
1259 Masinter, Ira McDonald, Chris Newman, Henrik Frystyk Nielsen and Dale
1260 R. Worley. In particular, Chris Newman provided invaluable help.
1261
1262 9. References
1263
1264 [RFC1806] Troost, R. and S. Dorner, "Communicating Presentation
1265 Information in Internet Messages: The Content-Disposition
1266 Header", RFC 1806, June 1995.
1267
1268 [RFC1873] Levinson, E. and J. Clark, "Message/External-Body Content-
1269 ID Access Type", RFC 1873, December 1995.
1270 Levinson, E., "Message/External-Body Content-ID Access
1271 Type", Work in Progress.
1272
1273 [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
1274 Extensions (MIME) Part One: Format of Internet Message
1275 Bodies", RFC 2045, November 1996.
1276
1277 [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
1278 Extensions (MIME) Part Two: Media Types", RFC 2046,
1279 November 1996.
1280
1281 [RFC2234] Crocker, D. and P. Overell, "Augmented BNF for
1282 SyntaxSpecifications: ABNF", RFC 2234, November 1997.
1283
1284 [RFC2387] Levinson, E., "The MIME Multipart/Related Content-type",
1285 RFC 2387, August 1998.
1286
1287
1288
1289
1290 Herriot Informational [Page 23]
1291 \f
1292 RFC 3391 Application/Multiplexed December 2002
1293
1294
1295 [RFC2392] Levinson, E., "Content-ID and Message-ID Uniform Resource
1296 Locators", RFC 2392, August 1998.
1297
1298 [RFC2557] Palme, J., "MIME Encapsulation of Aggregate Documents, such
1299 as HTML (MHTML", RFC 2557, March 1999.
1300
1301 [RFC2822] Resnick, P., Editor, "Internet Message Format", RFC 2822,
1302 April 2001.
1303
1304 [RFC3080] Rose, M., "The Blocks Extensible Exchange Protocol Core",
1305 RFC 3080, March 2001.
1306
1307 10. Author's Address
1308
1309 Robert Herriot
1310 706 Colorado Ave.
1311 Palo Alto, CA 94303
1312 USA
1313
1314 Phone: 1-650-327-4466
1315 Fax: 1-650-327-4466
1316 EMail: bob@herriot.com
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346 Herriot Informational [Page 24]
1347 \f
1348 RFC 3391 Application/Multiplexed December 2002
1349
1350
1351 11. Full Copyright Statement
1352
1353 Copyright (C) The Internet Society (2002). All Rights Reserved.
1354
1355 This document and translations of it may be copied and furnished to
1356 others, and derivative works that comment on or otherwise explain it
1357 or assist in its implementation may be prepared, copied, published
1358 and distributed, in whole or in part, without restriction of any
1359 kind, provided that the above copyright notice and this paragraph are
1360 included on all such copies and derivative works. However, this
1361 document itself may not be modified in any way, such as by removing
1362 the copyright notice or references to the Internet Society or other
1363 Internet organizations, except as needed for the purpose of
1364 developing Internet standards in which case the procedures for
1365 copyrights defined in the Internet Standards process must be
1366 followed, or as required to translate it into languages other than
1367 English.
1368
1369 The limited permissions granted above are perpetual and will not be
1370 revoked by the Internet Society or its successors or assigns.
1371
1372 This document and the information contained herein is provided on an
1373 "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
1374 TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
1375 BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
1376 HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
1377 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1378
1379 Acknowledgement
1380
1381 Funding for the RFC Editor function is currently provided by the
1382 Internet Society.
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402 Herriot Informational [Page 25]
1403 \f