├── README.md ├── by-sa.eps ├── intro_to_distributed.pdf └── intro_to_distributed.tex /README.md: -------------------------------------------------------------------------------- 1 | ## Intro to Distributed System 2 | 3 | This little booklet has been written hoping to serve as a short, and definitely not complete nor exhaustive, introduction to the problem and possible solution faced during the design of distributed, highly scalable, fault tolerant systems. 4 | 5 | Following the Open Source principles, this work is released under the Creative Commons. Contributions and suggestions are extremely welcome. 6 | 7 | The complete source of the project can be found at https://github.com/siscia/intro-to-distributed-system where contributions are encouraged. 8 | 9 | To contact the author, ping him on @siscia_ on Twitter or via email at simone at mweb dot biz 10 | 11 | ## License 12 | 13 | This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ 14 | -------------------------------------------------------------------------------- /by-sa.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 8.0 %%AI8_CreatorVersion: 13.0.1 %%For: (Alex Roberts) () %%Title: (by-sa.eps) %%CreationDate: 3/27/08 4:27 PM %%BoundingBox: 340 278 461 321 %%HiResBoundingBox: 340.5 278.5 460.5 320.5 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 4.0 %AI3_ColorUsage: Color %AI3_IncludePlacedImages %AI7_ImageSettings: 1 %%CMYKProcessColor: 0.74902 0.678431 0.670588 0.901961 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 -1 -1 () %AI3_Cropmarks: 340.5 278.5 460.5 320.5 %AI3_TemplateBox: 400.5 299.5 400.5 299.5 %AI3_TileBox: 112 -56 688 678 %AI3_DocumentPreview: Macintosh_ColorPic %AI5_ArtSize: 800 600 %AI5_RulerUnits: 6 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI8_OpenToView: -381 756 1 1566 923 26 0 0 73 75 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 48 8 48 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %AI7_Thumbnail: 128 48 8 %%BeginData: 8722 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45A8FD7DF827A8F8275258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527DF8F8F852A87D837DA87D837DA87D83 %7DA87D837DA87D847DA87D837DA87D837DA87D837DA87D837DA87D837DA8 %7D837DA87D837DA87D837DA87D837DA87D837DA87DA87DA883A87DA87D83 %7DA87D837DA87D837DA87D837DA87D837DA87D837DA87DA87DA883A87DA8 %7D837DA87D837DA87D837DA87D837DA87D837DA87D837D7DF8F8FD127D83 %FD2C7D58FD0652FD177D587D52522E5252FD197D52F8F852A87D837D837D %837D837D837DA87D83587D2DFD042752527D7DA87D847D837D837D837D83 %7D837D837D837D837D837D837D837D837D837D837DA87D7D2727FD05F827 %27527DA87D837D837D837D837D837D837D837DA87D7D2727FD05F8040452 %7DA87D837D837D837D837D837D837D837D837D837D837D7DF8F8FD0E7D52 %27FD0AF827277D7D83FD1B7D845227FD0BF8275284FD0F7D52FD0CF82DFD %157D52F8F858837D837D7D7D837D7D7DA85227FD0FF82D7DA87D7D7D837D %7D7D837D7D7D837D7D7D837D7D7D837D7D7D837DA852FD04F8527DA8A8A8 %7D52FD04F827A87D7D7D837D7D7D837D7D7DA87D27F8F8F85252A8A8A87D %7D27F8F8F8277D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7DF8F8FD %0B7D27FD06F827275252522727FD06F85283FD177D8352F8F8F827A8FD08 %FF52F8F8F82783FD0A7D5227F8F8F8A8FD08FF7DF8F8F804FD137D52F8F8 %58A87D837D837D837D8327FD04F8277DA8FD07FFA852FD05F852A87D837D %837D837D837D837D837D837D837D837D837DA858F8F8F87DFD04FF7D277D %FD04FFA827F8F852A87D837D837D837D837D27F8F852FD0BFFA852F8F827 %A87D837D837D837D837D837D837D837D837D7DF8F8FD087D8327FD04F87D %A8FD0BFFA852FD04F85283FD157D27F8F87DFD04FFA8F8F8F8A8FD04FFA8 %F8F8F858FD087D27F8F852FD05FFA8A8A8FD05FFA827F8F85284FD0F7D83 %52F8F852A87D7D7D837DA827FD04F8A8FD0FFF7DFD04F852A87D837D7D7D %837D7D7D837D7D7D837D7D7D837D52F8F852FD05FF7DF8F8F87DFD05FF7D %F8F8527D7D7D83FD047DF8F827FD04FFA827FD04F852A8FFFFFFA827F827 %7D837D7D7D837D7D7D837D7D7D83FD047DF8F859FD057D8352FD04F8A8FD %11FF7DF8F8F804FD147DF8F8F8FD07FF522752FD07FF27F8F8FD077D27F8 %F8A8FFFFFFA8FD08F87DFFFFFF7DF8F852FD107D52F8F852A87D837DA87D %27F8F8F8A8FD13FF7DF8F8F8527D847D837D837D837D837D837D837D837D %A852F8F8A8FD06FF527D527D52A8FD05FFA8F8F852A87D837D837D27F852 %FD04FFF8F8F8272752F8F8F827A8FFFFFF27F827A87D837D837D837D837D %837D837D837D7DF8F8FD067D52F8F8F87DFD15FF52F8F8F8FD127D52F8F8 %A8FD05FF27FD06F8FD06FF27F827FD057D52F8F87DFFFFFF7DF8F827A8FF %FFFFF8F8F852FFFFFF7DF8F858FD0F7D52F8F858837D837D7DF8F8F852FD %17FF27F8F827A87D837D7D7D837D7D7D837D7D7D837D8327F827FD06FF27 %FD06F8A8FD05FF52F8F8837D7D7DA852F8F8FFFFFFA827F8F827FD04FF7D %F8F8F8FFFFFF7DF8F87D7D837D7D7D837D7D7D837D7D7D837D7DF8F8FD04 %7D8327F8F8F8A8FD17FF52F8F8F858FD107D27F852FD06FFFD07F8FD06FF %7DF8F858FD047D52F827A8FFFFA8F8F8F827A8FFFFFF7DF8F8F87DFFFFA8 %F8F852FD0F7D52F8F858A87DA87D27F8F827FD05FF7D5227527DFD05FF7D %5227527DFD05FFF8F8F8527D837D837D837D837D837D837D837D7DF8F87D %FD06FF27FD05F827FD06FF7DF8F87D7D837DA82DF827FD04FFA8F827FD06 %FFF8F8F8A8FFFFFF27F8587D837D837D837D837D837D837D837D7DF8F8FD %057DF8F8F87DFD04FF52FD06F8A8FFFFFD06F827FD04FF27F8F82783FD0F %7D27F87DFD06FFFD07F8FD06FF7DF8F858FD047D52F827FD05FFA8A8FD05 %FFA8F8F8F87DFFFFA8F8F852FD0E7D8352F8F852A87D8352F8F8F8A8FFFF %FF7DF8F8F82727F8F8F8FF27F8F8272727F8F852FFFFFF7DF8F8277D7D7D %837D7D7D837D7D7D837D7D7D8327F827FD06FF52FD05F852FD06FF52F8F8 %7D7D837DA827F8F8FD04FFA87D7DA8FD04FFA8F8F8F8FFFFFFA8F8F8FD04 %7D837D7D7D837D7D7D83FD047DF8F8597D7D7D52F8F8F8FD04FF27F8F852 %FFFF52F87D7DF8F8F8A8FFA82727A8FFFFFF7DF8F8F8FD107D27F827A8FD %06FF7DF8F8F87DFD07FF27F827FD057D52F8F8A8FFFFFF27F8F852FD04FF %27F8F827FFFFFF7DF8F852FD0F7D52F8F852A87DA852F8F852FFFFFFA8F8 %F8F8FD06FF7DF8F852FFFFFFA8FD05FFA8F8F8277D837D837D837D837D83 %7D837D837DA852F8F8A8FD06FF7DF8F8F852FD07FFF8F827A87D837D837D %27F87DFFFFFF7DF8F8F87DA8FF52F8F8F87DFFFFFF27F8F8837D837D837D %837D837D837D837D837D7DF8F8FD047D52F8F827FFFFFF7DF8F827FD06FF %27F8F87DFD09FFA8F8F8F8FD117DF8F827FD06FF7DF8F8F87DFD06FF52F8 %F8FD077DF8F8F8FD04FF27FD08F827FFFFFFA8F8F82DFD107D52F8F85883 %7DA852F8F852FFFFFFA8F8F8F8FD06FF52F8F852FD09FFA8F8F8F87D837D %7D7D837D7D7D837D7D7D837D7D7D52F8F87DFD05FF7DF8F8F852FD05FFA8 %27F8277D837D7D7D837D52F8F852FFFFFFA827FD06F827FD04FF52F8F858 %837D837D7D7D837D7D7D837D7D7D837D7DF8F8FD047D52F8F827FFFFFFA8 %F8F8F87DFFFFA852FF52F8F827FFFFFF7D7DFD04FFA8F8F8F8FD117D52F8 %F8F8A8FD04FF7DF8F8F87DFD04FFA827F8F852FD087D27F8F87DFD04FF7D %272727527DFD04FF52F8F82783FD107D52F8F858A87DA852F8F827FD04FF %27F8F8277DA827F827A8F8F8F852A87DF8F852FFFFFF7DF8F8277DA87D83 %7D837D837D837D837D837D837DA852F8F827A8FFFFFF7DF8F8F87DFD04FF %27F8F827A87D837D837D837DA87D27F8F87DFD0CFF7DF8F8F8837D837D83 %7D837D837D837D837D837D837D7DF8F8FD057DF8F8F8A8FFFFFFA8FD07F8 %52FF7DFD07F87DFFFFFF52F8F827FD127D8327F8F8F87DFFFFFFA8FFA8FF %FFFF7D27F8F8F8FD0A7D8352F8F8F852FD09FFA852F8F8F8FD127D8352F8 %F852A87D837D27F8F852FD04FFA827FD04F87DFFFFFF7DFD04F827A8FD04 %FF27F8F8527D7D7D837D7D7D837D7D7D837D7D7D837D7D7DA827F8F8F827 %7DA8FFFFFFA8A827F8F8F8277D7D837D7D7D837D7D7D837DA852FD04F87D %A8FD04FFA85227F8F8F8FD047D837D7D7D837D7D7D837D7D7D83FD047DF8 %F859FD047D27F8F827A8FD05FFA87D7DFFFFFFA8FFFFFF7DA8A8FD05FF7D %F8F8F85283FD137D8352FD06F827FD06F827FD0E7D835227FD05F827F827 %FD04F827FD157D52F8F852A87D837D7DF8F8F87DFD17FF52F8F8F8847D83 %7D837D837D837D837D837D837D837D837D837DA87D52FD09F82D58A87D83 %7D837D837D837D837D837D837DA87D52FD09F82752A87D837D837D837D83 %7D837D837D837D837D837D837D7DF8F8FD067D27F8F8F8FD16FF7DF8F8F8 %52FD1A7D52522727272D52FD177D525227272752527D7D84FD167D52F8F8 %58837D837D8452F8F8F827FD15FFF8F8F8277D837D837D7D7D837D7D7D83 %7D7D7D837D7D7D837D7D7D837D7D7DA87D847DA87D847D837D7D7D837D7D %7D837D7D7D837D7D7D837D7D7D837D837DA87D847DA87D7D7D837D7D7D83 %7D7D7D837D7D7D837D7D7D837D7D7D837D7DF8F8FD047D837D7D27F8F8F8 %52FD13FFFD04F852837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D %7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D %837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D %7D7D837D7D7DA852F8F8527D527D52837D83FD04F852FD11FF27F8F8F827 %A87D7D527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %52FD07F8527D7D7DFD04F827FD0EFFA8FD05F87D7D8327FD5FF8277D837D %7DFD05F87DA8FD09FFA852FD05F87D7DA852FD61F852FD047DFD05F82727 %7D7DA8A8A87D7D27FD05F8277D7D8358FD63F8527D847D7D27FD08F827FD %07F82752A87DA87D27FD17F8277DA87D7D27277D7DF8F827A827FD11F827 %A8A8A827F8F8277D7DFD24F852FD047D5227FD0DF82752A87D7D7D27FD18 %F852FFA8A8FFFFF8A8FF27F8A8FF27FD10F827FFA87DFFFFF8F827FFFF27 %FD24F8527DA87DA87D7D2727FD07F827277D7D837DA87D27FD19F852FF27 %F87DFF27F8FFA852FF7DFD11F87DFF52F8527D27F8A8FFFF7DFD25F82758 %837D7D7D837D7DFD05527D7D83FD047D52FD1BF827FF7D7DA8A8F8F852FF %FFFFFD13F8FFFFA852F8F827FF7D52FFFD26F82752837DA87D837DA87DA8 %7DA87D837DA87D7D27FD1CF852FFA87DFFFF52F8F8A8FF52FD14F87DA8FF %A82752FF2752FF52FD28F85258837D7D7D837D7D7D837D7D522DFD1EF852 %FFF8F8F8FF7DF8F87DFF27FD12F8527DF8F852FF277DFFFFA8FF7DFD29F8 %042752527D527D587D525227FD20F852FFA852A8FF7DF8F87DFF27FD12F8 %7DFFA827A8FF52FFA82727A8FFFD55F827A8A8FFA87DF8F8F852A827FD13 %F87DA8FFA85227FFF8F8F852A852FD74F827F827FDA1F852FD7F27FD7FFF %FF %%EndData %%EndComments %%BeginProlog %%BeginResource: procset Adobe_level2_AI5 1.2 0 2 | %%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) 3 | %%Version: 1.2 0 4 | %%CreationDate: (04/10/93) () 5 | %%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) 6 | userdict /Adobe_level2_AI5 26 dict dup begin 7 | put 8 | /packedarray where not 9 | { 10 | userdict begin 11 | /packedarray 12 | { 13 | array astore readonly 14 | } bind def 15 | /setpacking /pop load def 16 | /currentpacking false def 17 | end 18 | 0 19 | } if 20 | pop 21 | userdict /defaultpacking currentpacking put true setpacking 22 | /initialize 23 | { 24 | Adobe_level2_AI5 begin 25 | } bind def 26 | /terminate 27 | { 28 | currentdict Adobe_level2_AI5 eq 29 | { 30 | end 31 | } if 32 | } bind def 33 | mark 34 | /setcustomcolor where not 35 | { 36 | /findcmykcustomcolor 37 | { 38 | (AI8_CMYK_CustomColor) 39 | 6 packedarray 40 | } bind def 41 | /findrgbcustomcolor 42 | { 43 | (AI8_RGB_CustomColor) 44 | 5 packedarray 45 | } bind def 46 | /setcustomcolor 47 | { 48 | exch 49 | aload pop dup 50 | (AI8_CMYK_CustomColor) eq 51 | { 52 | pop pop 53 | 4 54 | { 55 | 4 index mul 56 | 4 1 roll 57 | } repeat 58 | 5 -1 roll pop 59 | setcmykcolor 60 | } 61 | { 62 | dup (AI8_RGB_CustomColor) eq 63 | { 64 | pop pop 65 | 3 66 | { 67 | 1 exch sub 68 | 3 index mul 69 | 1 exch sub 70 | 3 1 roll 71 | } repeat 72 | 4 -1 roll pop 73 | setrgbcolor 74 | } 75 | { 76 | pop 77 | 4 78 | { 79 | 4 index mul 4 1 roll 80 | } repeat 81 | 5 -1 roll pop 82 | setcmykcolor 83 | } ifelse 84 | } ifelse 85 | } 86 | def 87 | } if 88 | /setAIseparationgray 89 | { 90 | false setoverprint 91 | 0 setgray 92 | /setseparationgray where{ 93 | pop setseparationgray 94 | }{ 95 | /setcolorspace where{ 96 | pop 97 | [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace 98 | 1 exch sub setcolor 99 | }{ 100 | setgray 101 | }ifelse 102 | }ifelse 103 | } def 104 | 105 | /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def 106 | userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put 107 | userdict /level2? 108 | systemdict /languagelevel known dup 109 | { 110 | pop systemdict /languagelevel get 2 ge 111 | } if 112 | put 113 | /level2ScreenFreq 114 | { 115 | begin 116 | 60 117 | HalftoneType 1 eq 118 | { 119 | pop Frequency 120 | } if 121 | HalftoneType 2 eq 122 | { 123 | pop GrayFrequency 124 | } if 125 | HalftoneType 5 eq 126 | { 127 | pop Default level2ScreenFreq 128 | } if 129 | end 130 | } bind def 131 | userdict /currentScreenFreq 132 | level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put 133 | level2? not 134 | { 135 | /setcmykcolor where not 136 | { 137 | /setcmykcolor 138 | { 139 | exch .11 mul add exch .59 mul add exch .3 mul add 140 | 1 exch sub setgray 141 | } def 142 | } if 143 | /currentcmykcolor where not 144 | { 145 | /currentcmykcolor 146 | { 147 | 0 0 0 1 currentgray sub 148 | } def 149 | } if 150 | /setoverprint where not 151 | { 152 | /setoverprint /pop load def 153 | } if 154 | /selectfont where not 155 | { 156 | /selectfont 157 | { 158 | exch findfont exch 159 | dup type /arraytype eq 160 | { 161 | makefont 162 | } 163 | { 164 | scalefont 165 | } ifelse 166 | setfont 167 | } bind def 168 | } if 169 | /cshow where not 170 | { 171 | /cshow 172 | { 173 | [ 174 | 0 0 5 -1 roll aload pop 175 | ] cvx bind forall 176 | } bind def 177 | } if 178 | } if 179 | cleartomark 180 | /anyColor? 181 | { 182 | add add add 0 ne 183 | } bind def 184 | /testColor 185 | { 186 | gsave 187 | setcmykcolor currentcmykcolor 188 | grestore 189 | } bind def 190 | /testCMYKColorThrough 191 | { 192 | testColor anyColor? 193 | } bind def 194 | userdict /composite? 195 | 1 0 0 0 testCMYKColorThrough 196 | 0 1 0 0 testCMYKColorThrough 197 | 0 0 1 0 testCMYKColorThrough 198 | 0 0 0 1 testCMYKColorThrough 199 | and and and 200 | put 201 | composite? not 202 | { 203 | userdict begin 204 | gsave 205 | /cyan? 1 0 0 0 testCMYKColorThrough def 206 | /magenta? 0 1 0 0 testCMYKColorThrough def 207 | /yellow? 0 0 1 0 testCMYKColorThrough def 208 | /black? 0 0 0 1 testCMYKColorThrough def 209 | grestore 210 | /isCMYKSep? cyan? magenta? yellow? black? or or or def 211 | /customColor? isCMYKSep? not def 212 | end 213 | } if 214 | end defaultpacking setpacking 215 | %%EndResource 216 | %%BeginProcSet: Adobe_ColorImage_AI6 1.3 0 217 | userdict /Adobe_ColorImage_AI6 known not 218 | { 219 | userdict /Adobe_ColorImage_AI6 53 dict put 220 | } if 221 | userdict /Adobe_ColorImage_AI6 get begin 222 | /initialize { 223 | Adobe_ColorImage_AI6 begin 224 | Adobe_ColorImage_AI6 { 225 | dup type /arraytype eq { 226 | dup xcheck { 227 | bind 228 | } if 229 | } if 230 | pop pop 231 | } forall 232 | } def 233 | /terminate { end } def 234 | currentdict /Adobe_ColorImage_AI6_Vars known not { 235 | /Adobe_ColorImage_AI6_Vars 41 dict def 236 | } if 237 | Adobe_ColorImage_AI6_Vars begin 238 | /plateindex -1 def 239 | /_newproc null def 240 | /_proc1 null def 241 | /_proc2 null def 242 | /sourcearray 4 array def 243 | /_ptispace null def 244 | /_ptiname null def 245 | /_pti0 0 def 246 | /_pti1 0 def 247 | /_ptiproc null def 248 | /_ptiscale 0 def 249 | /_pticomps 0 def 250 | /_ptibuf 0 string def 251 | /_gtigray 0 def 252 | /_cticmyk null def 253 | /_rtirgb null def 254 | /XIEnable true def 255 | /XIType 0 def 256 | /XIEncoding 0 def 257 | /XICompression 0 def 258 | /XIChannelCount 0 def 259 | /XIBitsPerPixel 0 def 260 | /XIImageHeight 0 def 261 | /XIImageWidth 0 def 262 | /XIImageMatrix null def 263 | /XIRowBytes 0 def 264 | /XIFile null def 265 | /XIBuffer1 null def 266 | /XIBuffer2 null def 267 | /XIBuffer3 null def 268 | /XIDataProc null def 269 | /XIColorSpace /DeviceGray def 270 | /XIColorValues 0 def 271 | /XIPlateList false def 272 | end 273 | /ci6colorimage /colorimage where {/colorimage get}{null} ifelse def 274 | /ci6image systemdict /image get def 275 | /ci6curtransfer systemdict /currenttransfer get def 276 | /ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def 277 | /ci6foureq { 278 | 4 index ne { 279 | pop pop pop false 280 | }{ 281 | 4 index ne { 282 | pop pop false 283 | }{ 284 | 4 index ne { 285 | pop false 286 | }{ 287 | 4 index eq 288 | } ifelse 289 | } ifelse 290 | } ifelse 291 | } def 292 | /ci6testplate { 293 | Adobe_ColorImage_AI6_Vars begin 294 | /plateindex -1 def 295 | /setcmykcolor where { 296 | pop 297 | gsave 298 | 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub 299 | 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub 300 | 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub 301 | 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub 302 | grestore 303 | 1 0 0 0 ci6foureq { 304 | /plateindex 0 def 305 | }{ 306 | 0 1 0 0 ci6foureq { 307 | /plateindex 1 def 308 | }{ 309 | 0 0 1 0 ci6foureq { 310 | /plateindex 2 def 311 | }{ 312 | 0 0 0 1 ci6foureq { 313 | /plateindex 3 def 314 | }{ 315 | 0 0 0 0 ci6foureq { 316 | /plateindex 5 def 317 | } if 318 | } ifelse 319 | } ifelse 320 | } ifelse 321 | } ifelse 322 | pop pop pop pop 323 | } if 324 | plateindex 325 | end 326 | } def 327 | /ci6concatprocs { 328 | /packedarray where { 329 | pop dup type /packedarraytype eq 2 index type 330 | /packedarraytype eq or 331 | }{ 332 | false 333 | } ifelse 334 | { 335 | /_proc2 exch cvlit def 336 | /_proc1 exch cvlit def 337 | _proc1 aload pop 338 | _proc2 aload pop 339 | _proc1 length 340 | _proc2 length add 341 | packedarray cvx 342 | }{ 343 | /_proc2 exch cvlit def 344 | /_proc1 exch cvlit def 345 | /_newproc _proc1 length _proc2 length add array def 346 | _newproc 0 _proc1 putinterval 347 | _newproc _proc1 length _proc2 putinterval 348 | _newproc cvx 349 | } ifelse 350 | } def 351 | /ci6istint { 352 | type /arraytype eq 353 | } def 354 | /ci6isspot { 355 | dup type /arraytype eq { 356 | dup length 1 sub get /Separation eq 357 | }{ 358 | pop false 359 | } ifelse 360 | } def 361 | /ci6spotname { 362 | dup ci6isspot {dup length 2 sub get}{pop ()} ifelse 363 | } def 364 | /ci6altspace { 365 | aload pop pop pop ci6colormake 366 | } def 367 | /ci6numcomps { 368 | dup /DeviceGray eq { 369 | pop 1 370 | }{ 371 | dup /DeviceRGB eq { 372 | pop 3 373 | }{ 374 | /DeviceCMYK eq { 375 | 4 376 | }{ 377 | 1 378 | } ifelse 379 | } ifelse 380 | } ifelse 381 | } def 382 | /ci6marksplate { 383 | dup /DeviceGray eq { 384 | pop plateindex 3 eq 385 | }{ 386 | dup /DeviceRGB eq { 387 | pop plateindex 5 ne 388 | }{ 389 | dup /DeviceCMYK eq { 390 | pop plateindex 5 ne 391 | }{ 392 | dup ci6isspot { 393 | /findcmykcustomcolor where { 394 | pop 395 | dup length 2 sub get 396 | 0.1 0.1 0.1 0.1 5 -1 roll 397 | findcmykcustomcolor 1 setcustomcolor 398 | systemdict /currentgray get exec 399 | 1 ne 400 | }{ 401 | pop plateindex 5 ne 402 | } ifelse 403 | }{ 404 | pop plateindex 5 ne 405 | } ifelse 406 | } ifelse 407 | } ifelse 408 | } ifelse 409 | } def 410 | /ci6colormake { 411 | dup ci6numcomps 412 | exch 1 index 2 add 1 roll 413 | dup 1 eq {pop}{array astore} ifelse 414 | exch 415 | } def 416 | /ci6colorexpand { 417 | dup ci6spotname exch 418 | dup ci6istint { 419 | ci6altspace 420 | exch 4 1 roll 421 | }{ 422 | 1 3 1 roll 423 | } ifelse 424 | } def 425 | /ci6colortint { 426 | dup /DeviceGray eq { 427 | 3 1 roll 1 exch sub mul 1 exch sub exch 428 | }{ 429 | dup /DeviceRGB eq { 430 | 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch 431 | }{ 432 | dup /DeviceCMYK eq { 433 | 3 1 roll {1 index mul exch} forall pop 4 array astore exch 434 | }{ 435 | 3 1 roll mul exch 436 | } ifelse 437 | } ifelse 438 | } ifelse 439 | } def 440 | /ci6colortocmyk { 441 | dup /DeviceGray eq { 442 | pop 1 exch sub 0 0 0 4 -1 roll 4 array astore 443 | }{ 444 | dup /DeviceRGB eq { 445 | pop aload pop _rgbtocmyk 4 array astore 446 | }{ 447 | dup /DeviceCMYK eq { 448 | pop 449 | }{ 450 | ci6altspace ci6colortint ci6colortocmyk 451 | } ifelse 452 | } ifelse 453 | } ifelse 454 | } def 455 | /ci6makeimagedict { 456 | 7 dict begin 457 | /ImageType 1 def 458 | /Decode exch def 459 | /DataSource exch def 460 | /ImageMatrix exch def 461 | /BitsPerComponent exch def 462 | /Height exch def 463 | /Width exch def 464 | currentdict end 465 | } def 466 | /ci6stringinvert { 467 | 0 1 2 index length 1 sub { 468 | dup 2 index exch get 255 exch sub 2 index 3 1 roll put 469 | } for 470 | } def 471 | /ci6stringknockout { 472 | 0 1 2 index length 1 sub { 473 | 255 2 index 3 1 roll put 474 | } for 475 | } def 476 | /ci6stringapply { 477 | 0 1 4 index length 1 sub { 478 | dup 479 | 4 index exch get 480 | 3 index 3 1 roll 481 | 3 index exec 482 | } for 483 | pop exch pop 484 | } def 485 | /ci6walkrgbstring { 486 | 0 3 index 487 | dup length 1 sub 0 3 3 -1 roll { 488 | 3 getinterval {} forall 489 | 5 index exec 490 | 3 index 491 | } for 492 | 493 | 5 {pop} repeat 494 | } def 495 | /ci6walkcmykstring 496 | { 497 | 0 3 index 498 | dup length 1 sub 0 4 3 -1 roll { 499 | 4 getinterval {} forall 500 | 501 | 6 index exec 502 | 503 | 3 index 504 | 505 | } for 506 | 507 | 5 { pop } repeat 508 | 509 | } def 510 | /ci6putrgbtograystr 511 | { 512 | .11 mul exch 513 | 514 | .59 mul add exch 515 | 516 | .3 mul add 517 | 518 | cvi 3 copy put 519 | 520 | pop 1 add 521 | } def 522 | /ci6putcmyktograystr 523 | { 524 | exch .11 mul add 525 | 526 | exch .59 mul add 527 | 528 | exch .3 mul add 529 | 530 | dup 255 gt { pop 255 } if 531 | 532 | 255 exch sub cvi 3 copy put 533 | 534 | pop 1 add 535 | } def 536 | /ci6rgbtograyproc { 537 | Adobe_ColorImage_AI6_Vars begin 538 | sourcearray 0 get exec 539 | XIBuffer3 540 | dup 3 1 roll 541 | 542 | /ci6putrgbtograystr load exch 543 | ci6walkrgbstring 544 | end 545 | } def 546 | /ci6cmyktograyproc { 547 | Adobe_ColorImage_AI6_Vars begin 548 | sourcearray 0 get exec 549 | XIBuffer3 550 | dup 3 1 roll 551 | 552 | /ci6putcmyktograystr load exch 553 | ci6walkcmykstring 554 | end 555 | } def 556 | /ci6separatecmykproc { 557 | Adobe_ColorImage_AI6_Vars begin 558 | sourcearray 0 get exec 559 | 560 | XIBuffer3 561 | 562 | 0 2 index 563 | 564 | plateindex 4 2 index length 1 sub { 565 | get 255 exch sub 566 | 567 | 3 copy put pop 1 add 568 | 569 | 2 index 570 | } for 571 | pop pop exch pop 572 | end 573 | } def 574 | 575 | /ci6compositeimage { 576 | dup 1 eq { 577 | pop pop image 578 | }{ 579 | /ci6colorimage load null ne { 580 | ci6colorimage 581 | }{ 582 | 3 1 roll pop 583 | sourcearray 0 3 -1 roll put 584 | 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load 585 | image 586 | } ifelse 587 | } ifelse 588 | } def 589 | /ci6knockoutimage { 590 | gsave 591 | 0 ci6curtransfer exec 1 ci6curtransfer exec 592 | eq { 593 | 0 ci6curtransfer exec 0.5 lt 594 | }{ 595 | 0 ci6curtransfer exec 1 ci6curtransfer exec gt 596 | } ifelse 597 | {{pop 0}}{{pop 1}} ifelse 598 | systemdict /settransfer get exec 599 | ci6compositeimage 600 | grestore 601 | } def 602 | /ci6drawimage { 603 | ci6testplate -1 eq { 604 | pop ci6compositeimage 605 | }{ 606 | dup type /arraytype eq { 607 | dup length plateindex gt {plateindex get}{pop false} ifelse 608 | }{ 609 | { 610 | true 611 | }{ 612 | dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse 613 | } ifelse 614 | } ifelse 615 | { 616 | dup 1 eq { 617 | pop pop ci6image 618 | }{ 619 | dup 3 eq { 620 | ci6compositeimage 621 | }{ 622 | pop pop 623 | sourcearray 0 3 -1 roll put 624 | /ci6separatecmykproc load 625 | ci6image 626 | } ifelse 627 | } ifelse 628 | }{ 629 | ci6curoverprint { 630 | 7 {pop} repeat 631 | }{ 632 | ci6knockoutimage 633 | } ifelse 634 | } ifelse 635 | } ifelse 636 | } def 637 | /ci6proctintimage { 638 | /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store 639 | /_pticomps _ptispace ci6numcomps store 640 | /_ptiscale _pti1 _pti0 sub store 641 | level2? { 642 | _ptiname length 0 gt version cvr 2012 ge and { 643 | [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace 644 | [_pti0 _pti1] ci6makeimagedict ci6image 645 | }{ 646 | [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace 647 | [0 255] ci6makeimagedict ci6image 648 | } ifelse 649 | }{ 650 | _pticomps 1 eq { 651 | { 652 | dup 653 | { 654 | 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put 655 | } ci6stringapply 656 | } ci6concatprocs ci6image 657 | }{ 658 | { 659 | dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse 660 | _ptibuf { 661 | exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc 662 | _pticomps 2 add -2 roll 663 | _pticomps 1 sub -1 0 { 664 | 1 index add 2 index exch 665 | 5 -1 roll 666 | 255 mul cvi put 667 | } for 668 | pop pop 669 | } ci6stringapply 670 | } ci6concatprocs false _pticomps 671 | /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse 672 | } ifelse 673 | } ifelse 674 | } def 675 | /ci6graytintimage { 676 | /_gtigray 5 -1 roll store 677 | {1 _gtigray sub mul 1 exch sub} 4 1 roll 678 | /DeviceGray ci6proctintimage 679 | } def 680 | /ci6cmyktintimage { 681 | /_cticmyk 5 -1 roll store 682 | {_cticmyk {1 index mul exch} forall pop} 4 1 roll 683 | /DeviceCMYK ci6proctintimage 684 | } def 685 | /ci6rgbtintimage { 686 | /_rtirgb 5 -1 roll store 687 | {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll 688 | /DeviceRGB ci6proctintimage 689 | } def 690 | /ci6tintimage { 691 | ci6testplate -1 eq { 692 | ci6colorexpand 693 | 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll 694 | dup /DeviceGray eq { 695 | pop ci6graytintimage 696 | }{ 697 | dup /DeviceRGB eq { 698 | pop ci6rgbtintimage 699 | }{ 700 | pop ci6cmyktintimage 701 | } ifelse 702 | } ifelse 703 | }{ 704 | dup ci6marksplate { 705 | plateindex 5 lt { 706 | ci6colortocmyk plateindex get 707 | dup 0 eq ci6curoverprint and { 708 | 7 {pop} repeat 709 | }{ 710 | 1 exch sub 711 | exch {1 0}{0 1} ifelse () ci6graytintimage 712 | } ifelse 713 | }{ 714 | pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage 715 | } ifelse 716 | }{ 717 | ci6curoverprint { 718 | 8 {pop} repeat 719 | }{ 720 | pop pop pop 721 | {pop 1} 0 1 () /DeviceGray ci6proctintimage 722 | } ifelse 723 | } ifelse 724 | } ifelse 725 | } def 726 | /XINullImage { 727 | } def 728 | /XIImageMask { 729 | XIImageWidth XIImageHeight false 730 | [XIImageWidth 0 0 XIImageHeight neg 0 0] 731 | /XIDataProc load 732 | imagemask 733 | } def 734 | /XIImageTint { 735 | XIImageWidth XIImageHeight XIBitsPerPixel 736 | [XIImageWidth 0 0 XIImageHeight neg 0 0] 737 | /XIDataProc load 738 | XIType 3 eq XIColorValues XIColorSpace ci6tintimage 739 | } def 740 | /XIImage { 741 | XIImageWidth XIImageHeight XIBitsPerPixel 742 | [XIImageWidth 0 0 XIImageHeight neg 0 0] 743 | /XIDataProc load 744 | false XIChannelCount XIPlateList ci6drawimage 745 | } def 746 | /XG { 747 | pop pop 748 | } def 749 | /XF { 750 | 13 {pop} repeat 751 | } def 752 | /Xh { 753 | Adobe_ColorImage_AI6_Vars begin 754 | gsave 755 | /XIType exch def 756 | /XIImageHeight exch def 757 | /XIImageWidth exch def 758 | /XIImageMatrix exch def 759 | 0 0 moveto 760 | XIImageMatrix concat 761 | XIImageWidth XIImageHeight scale 762 | 763 | /_lp /null ddef 764 | _fc 765 | /_lp /imagemask ddef 766 | end 767 | } def 768 | /XH { 769 | Adobe_ColorImage_AI6_Vars begin 770 | grestore 771 | end 772 | } def 773 | /XIEnable { 774 | Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put 775 | } def 776 | /XC { 777 | Adobe_ColorImage_AI6_Vars begin 778 | ci6colormake 779 | /XIColorSpace exch def 780 | /XIColorValues exch def 781 | end 782 | } def 783 | /XIPlates { 784 | Adobe_ColorImage_AI6_Vars begin 785 | /XIPlateList exch def 786 | end 787 | } def 788 | /XI 789 | { 790 | Adobe_ColorImage_AI6_Vars begin 791 | gsave 792 | /XIType exch def 793 | cvi dup 794 | 256 idiv /XICompression exch store 795 | 256 mod /XIEncoding exch store 796 | pop pop 797 | /XIChannelCount exch def 798 | /XIBitsPerPixel exch def 799 | /XIImageHeight exch def 800 | /XIImageWidth exch def 801 | pop pop pop pop 802 | /XIImageMatrix exch def 803 | XIBitsPerPixel 1 eq { 804 | XIImageWidth 8 div ceiling cvi 805 | }{ 806 | XIImageWidth XIChannelCount mul 807 | } ifelse 808 | /XIRowBytes exch def 809 | XIEnable { 810 | /XIBuffer3 XIImageWidth string def 811 | XICompression 0 eq { 812 | /XIBuffer1 XIRowBytes string def 813 | XIEncoding 0 eq { 814 | {currentfile XIBuffer1 readhexstring pop} 815 | }{ 816 | {currentfile XIBuffer1 readstring pop} 817 | } ifelse 818 | }{ 819 | /XIBuffer1 256 string def 820 | /XIBuffer2 XIRowBytes string def 821 | {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if} 822 | /ASCII85Decode filter /DCTDecode filter 823 | /XIFile exch def 824 | {XIFile XIBuffer2 readstring pop} 825 | } ifelse 826 | /XIDataProc exch def 827 | 828 | XIType 1 ne { 829 | 0 setgray 830 | } if 831 | XIType 1 eq { 832 | XIImageMask 833 | }{ 834 | XIType 2 eq XIType 3 eq or { 835 | XIImageTint 836 | }{ 837 | XIImage 838 | } ifelse 839 | } ifelse 840 | }{ 841 | XINullImage 842 | } ifelse 843 | /XIPlateList false def 844 | grestore 845 | end 846 | } def 847 | end 848 | %%EndProcSet 849 | %%BeginResource: procset Adobe_Illustrator_AI5 1.3 0 850 | %%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog) 851 | %%Version: 1.3 0 852 | %%CreationDate: (3/7/1994) () 853 | %%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved) 854 | currentpacking true setpacking 855 | userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin 856 | put 857 | /_?cmyk false def 858 | /_eo false def 859 | /_lp /none def 860 | /_pf 861 | { 862 | } def 863 | /_ps 864 | { 865 | } def 866 | /_psf 867 | { 868 | } def 869 | /_pss 870 | { 871 | } def 872 | /_pjsf 873 | { 874 | } def 875 | /_pjss 876 | { 877 | } def 878 | /_pola 0 def 879 | /_doClip 0 def 880 | /cf currentflat def 881 | /_lineorientation 0 def 882 | /_charorientation 0 def 883 | /_yokoorientation 0 def 884 | /_tm matrix def 885 | /_renderStart 886 | [ 887 | /e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 888 | ] def 889 | /_renderEnd 890 | [ 891 | null null null null /i1 /i1 /i1 /i1 892 | ] def 893 | /_render -1 def 894 | /_shift [0 0] def 895 | /_ax 0 def 896 | /_ay 0 def 897 | /_cx 0 def 898 | /_cy 0 def 899 | /_leading 900 | [ 901 | 0 0 902 | ] def 903 | /_ctm matrix def 904 | /_mtx matrix def 905 | /_sp 16#020 def 906 | /_hyphen (-) def 907 | /_fontSize 0 def 908 | /_fontAscent 0 def 909 | /_fontDescent 0 def 910 | /_fontHeight 0 def 911 | /_fontRotateAdjust 0 def 912 | /Ss 256 string def 913 | Ss 0 (fonts/) putinterval 914 | /_cnt 0 def 915 | /_scale [1 1] def 916 | /_nativeEncoding 0 def 917 | /_useNativeEncoding 0 def 918 | /_tempEncode 0 def 919 | /_pntr 0 def 920 | /_tDict 2 dict def 921 | /_hfname 100 string def 922 | /_hffound false def 923 | /Tx 924 | { 925 | } def 926 | /Tj 927 | { 928 | } def 929 | /CRender 930 | { 931 | } def 932 | /_AI3_savepage 933 | { 934 | } def 935 | /_gf null def 936 | /_cf 4 array def 937 | /_rgbf 3 array def 938 | /_if null def 939 | /_of false def 940 | /_fc 941 | { 942 | } def 943 | /_gs null def 944 | /_cs 4 array def 945 | /_rgbs 3 array def 946 | /_is null def 947 | /_os false def 948 | /_sc 949 | { 950 | } def 951 | /_pd 1 dict def 952 | /_ed 15 dict def 953 | /_pm matrix def 954 | /_fm null def 955 | /_fd null def 956 | /_fdd null def 957 | /_sm null def 958 | /_sd null def 959 | /_sdd null def 960 | /_i null def 961 | /_lobyte 0 def 962 | /_hibyte 0 def 963 | /_cproc null def 964 | /_cscript 0 def 965 | /_hvax 0 def 966 | /_hvay 0 def 967 | /_hvwb 0 def 968 | /_hvcx 0 def 969 | /_hvcy 0 def 970 | /_bitfont null def 971 | /_bitlobyte 0 def 972 | /_bithibyte 0 def 973 | /_bitkey null def 974 | /_bitdata null def 975 | /_bitindex 0 def 976 | /discardSave null def 977 | /buffer 256 string def 978 | /beginString null def 979 | /endString null def 980 | /endStringLength null def 981 | /layerCnt 1 def 982 | /layerCount 1 def 983 | /perCent (%) 0 get def 984 | /perCentSeen? false def 985 | /newBuff null def 986 | /newBuffButFirst null def 987 | /newBuffLast null def 988 | /clipForward? false def 989 | end 990 | userdict /Adobe_Illustrator_AI5 known not { 991 | userdict /Adobe_Illustrator_AI5 100 dict put 992 | } if 993 | userdict /Adobe_Illustrator_AI5 get begin 994 | /initialize 995 | { 996 | Adobe_Illustrator_AI5 dup begin 997 | Adobe_Illustrator_AI5_vars begin 998 | /_aicmykps where {pop /_?cmyk _aicmykps def}if 999 | discardDict 1000 | { 1001 | bind pop pop 1002 | } forall 1003 | dup /nc get begin 1004 | { 1005 | dup xcheck 1 index type /operatortype ne and 1006 | { 1007 | bind 1008 | } if 1009 | pop pop 1010 | } forall 1011 | end 1012 | newpath 1013 | } def 1014 | /terminate 1015 | { 1016 | end 1017 | end 1018 | } def 1019 | /_ 1020 | null def 1021 | /ddef 1022 | { 1023 | Adobe_Illustrator_AI5_vars 3 1 roll put 1024 | } def 1025 | /xput 1026 | { 1027 | dup load dup length exch maxlength eq 1028 | { 1029 | dup dup load dup 1030 | length 2 mul dict copy def 1031 | } if 1032 | load begin 1033 | def 1034 | end 1035 | } def 1036 | /npop 1037 | { 1038 | { 1039 | pop 1040 | } repeat 1041 | } def 1042 | /hswj 1043 | { 1044 | dup stringwidth 3 2 roll 1045 | { 1046 | _hvwb eq { exch _hvcx add exch _hvcy add } if 1047 | exch _hvax add exch _hvay add 1048 | } cforall 1049 | } def 1050 | /vswj 1051 | { 1052 | 0 0 3 -1 roll 1053 | { 1054 | dup 255 le 1055 | _charorientation 1 eq 1056 | and 1057 | { 1058 | dup cstring stringwidth 5 2 roll 1059 | _hvwb eq { exch _hvcy sub exch _hvcx sub } if 1060 | exch _hvay sub exch _hvax sub 1061 | 4 -1 roll sub exch 1062 | 3 -1 roll sub exch 1063 | } 1064 | { 1065 | _hvwb eq { exch _hvcy sub exch _hvcx sub } if 1066 | exch _hvay sub exch _hvax sub 1067 | _fontHeight sub 1068 | } ifelse 1069 | } cforall 1070 | } def 1071 | /swj 1072 | { 1073 | 6 1 roll 1074 | /_hvay exch ddef 1075 | /_hvax exch ddef 1076 | /_hvwb exch ddef 1077 | /_hvcy exch ddef 1078 | /_hvcx exch ddef 1079 | _lineorientation 0 eq { hswj } { vswj } ifelse 1080 | } def 1081 | /sw 1082 | { 1083 | 0 0 0 6 3 roll swj 1084 | } def 1085 | /vjss 1086 | { 1087 | 4 1 roll 1088 | { 1089 | dup cstring 1090 | dup length 1 eq 1091 | _charorientation 1 eq 1092 | and 1093 | { 1094 | -90 rotate 1095 | currentpoint 1096 | _fontRotateAdjust add 1097 | moveto 1098 | gsave 1099 | false charpath currentpoint 1100 | 5 index setmatrix stroke 1101 | grestore 1102 | _fontRotateAdjust sub 1103 | moveto 1104 | _sp eq 1105 | { 1106 | 5 index 5 index rmoveto 1107 | } if 1108 | 2 copy rmoveto 1109 | 90 rotate 1110 | } 1111 | { 1112 | currentpoint 1113 | _fontHeight sub 1114 | 5 index sub 1115 | 3 index _sp eq 1116 | { 1117 | 9 index sub 1118 | } if 1119 | 1120 | currentpoint 1121 | exch 4 index stringwidth pop 2 div sub 1122 | exch _fontAscent sub 1123 | moveto 1124 | 1125 | gsave 1126 | 2 index false charpath 1127 | 6 index setmatrix stroke 1128 | grestore 1129 | 1130 | moveto pop pop 1131 | } ifelse 1132 | } cforall 1133 | 6 npop 1134 | } def 1135 | /hjss 1136 | { 1137 | 4 1 roll 1138 | { 1139 | dup cstring 1140 | gsave 1141 | false charpath currentpoint 1142 | 5 index setmatrix stroke 1143 | grestore 1144 | moveto 1145 | _sp eq 1146 | { 1147 | 5 index 5 index rmoveto 1148 | } if 1149 | 2 copy rmoveto 1150 | } cforall 1151 | 6 npop 1152 | } def 1153 | /jss 1154 | { 1155 | _lineorientation 0 eq { hjss } { vjss } ifelse 1156 | } def 1157 | /ss 1158 | { 1159 | 0 0 0 7 3 roll jss 1160 | } def 1161 | /vjsp 1162 | { 1163 | 4 1 roll 1164 | { 1165 | dup cstring 1166 | dup length 1 eq 1167 | _charorientation 1 eq 1168 | and 1169 | { 1170 | -90 rotate 1171 | currentpoint 1172 | _fontRotateAdjust add 1173 | moveto 1174 | false charpath 1175 | currentpoint 1176 | _fontRotateAdjust sub 1177 | moveto 1178 | _sp eq 1179 | { 1180 | 5 index 5 index rmoveto 1181 | } if 1182 | 2 copy rmoveto 1183 | 90 rotate 1184 | } 1185 | { 1186 | currentpoint 1187 | _fontHeight sub 1188 | 5 index sub 1189 | 3 index _sp eq 1190 | { 1191 | 9 index sub 1192 | } if 1193 | 1194 | currentpoint 1195 | exch 4 index stringwidth pop 2 div sub 1196 | exch _fontAscent sub 1197 | moveto 1198 | 1199 | 2 index false charpath 1200 | 1201 | moveto pop pop 1202 | } ifelse 1203 | } cforall 1204 | 6 npop 1205 | } def 1206 | /hjsp 1207 | { 1208 | 4 1 roll 1209 | { 1210 | dup cstring 1211 | false charpath 1212 | _sp eq 1213 | { 1214 | 5 index 5 index rmoveto 1215 | } if 1216 | 2 copy rmoveto 1217 | } cforall 1218 | 6 npop 1219 | } def 1220 | /jsp 1221 | { 1222 | matrix currentmatrix 1223 | _lineorientation 0 eq {hjsp} {vjsp} ifelse 1224 | } def 1225 | /sp 1226 | { 1227 | matrix currentmatrix 1228 | 0 0 0 7 3 roll 1229 | _lineorientation 0 eq {hjsp} {vjsp} ifelse 1230 | } def 1231 | /pl 1232 | { 1233 | transform 1234 | 0.25 sub round 0.25 add exch 1235 | 0.25 sub round 0.25 add exch 1236 | itransform 1237 | } def 1238 | /setstrokeadjust where 1239 | { 1240 | pop true setstrokeadjust 1241 | /c 1242 | { 1243 | curveto 1244 | } def 1245 | /C 1246 | /c load def 1247 | /v 1248 | { 1249 | currentpoint 6 2 roll curveto 1250 | } def 1251 | /V 1252 | /v load def 1253 | /y 1254 | { 1255 | 2 copy curveto 1256 | } def 1257 | /Y 1258 | /y load def 1259 | /l 1260 | { 1261 | lineto 1262 | } def 1263 | /L 1264 | /l load def 1265 | /m 1266 | { 1267 | moveto 1268 | } def 1269 | } 1270 | { 1271 | /c 1272 | { 1273 | pl curveto 1274 | } def 1275 | /C 1276 | /c load def 1277 | /v 1278 | { 1279 | currentpoint 6 2 roll pl curveto 1280 | } def 1281 | /V 1282 | /v load def 1283 | /y 1284 | { 1285 | pl 2 copy curveto 1286 | } def 1287 | /Y 1288 | /y load def 1289 | /l 1290 | { 1291 | pl lineto 1292 | } def 1293 | /L 1294 | /l load def 1295 | /m 1296 | { 1297 | pl moveto 1298 | } def 1299 | } ifelse 1300 | /d 1301 | { 1302 | setdash 1303 | } def 1304 | /cf 1305 | { 1306 | } def 1307 | /i 1308 | { 1309 | dup 0 eq 1310 | { 1311 | pop cf 1312 | } if 1313 | setflat 1314 | } def 1315 | /j 1316 | { 1317 | setlinejoin 1318 | } def 1319 | /J 1320 | { 1321 | setlinecap 1322 | } def 1323 | /M 1324 | { 1325 | setmiterlimit 1326 | } def 1327 | /w 1328 | { 1329 | setlinewidth 1330 | } def 1331 | /XR 1332 | { 1333 | 0 ne 1334 | /_eo exch ddef 1335 | } def 1336 | /H 1337 | { 1338 | } def 1339 | /h 1340 | { 1341 | closepath 1342 | } def 1343 | /N 1344 | { 1345 | _pola 0 eq 1346 | { 1347 | _doClip 1 eq 1348 | { 1349 | _eo {eoclip} {clip} ifelse /_doClip 0 ddef 1350 | } if 1351 | newpath 1352 | } 1353 | { 1354 | /CRender 1355 | { 1356 | N 1357 | } ddef 1358 | } ifelse 1359 | } def 1360 | /n 1361 | { 1362 | N 1363 | } def 1364 | /F 1365 | { 1366 | _pola 0 eq 1367 | { 1368 | _doClip 1 eq 1369 | { 1370 | gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc 1371 | /_doClip 0 ddef 1372 | } 1373 | { 1374 | _pf 1375 | } ifelse 1376 | } 1377 | { 1378 | /CRender 1379 | { 1380 | F 1381 | } ddef 1382 | } ifelse 1383 | } def 1384 | /f 1385 | { 1386 | closepath 1387 | F 1388 | } def 1389 | /S 1390 | { 1391 | _pola 0 eq 1392 | { 1393 | _doClip 1 eq 1394 | { 1395 | gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc 1396 | /_doClip 0 ddef 1397 | } 1398 | { 1399 | _ps 1400 | } ifelse 1401 | } 1402 | { 1403 | /CRender 1404 | { 1405 | S 1406 | } ddef 1407 | } ifelse 1408 | } def 1409 | /s 1410 | { 1411 | closepath 1412 | S 1413 | } def 1414 | /B 1415 | { 1416 | _pola 0 eq 1417 | { 1418 | _doClip 1 eq 1419 | gsave F grestore 1420 | { 1421 | gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc 1422 | /_doClip 0 ddef 1423 | } 1424 | { 1425 | S 1426 | } ifelse 1427 | } 1428 | { 1429 | /CRender 1430 | { 1431 | B 1432 | } ddef 1433 | } ifelse 1434 | } def 1435 | /b 1436 | { 1437 | closepath 1438 | B 1439 | } def 1440 | /W 1441 | { 1442 | /_doClip 1 ddef 1443 | } def 1444 | /* 1445 | { 1446 | count 0 ne 1447 | { 1448 | dup type /stringtype eq 1449 | { 1450 | pop 1451 | } if 1452 | } if 1453 | newpath 1454 | } def 1455 | /u 1456 | { 1457 | } def 1458 | /U 1459 | { 1460 | } def 1461 | /q 1462 | { 1463 | _pola 0 eq 1464 | { 1465 | gsave 1466 | } if 1467 | } def 1468 | /Q 1469 | { 1470 | _pola 0 eq 1471 | { 1472 | grestore 1473 | } if 1474 | } def 1475 | /*u 1476 | { 1477 | _pola 1 add /_pola exch ddef 1478 | } def 1479 | /*U 1480 | { 1481 | _pola 1 sub /_pola exch ddef 1482 | _pola 0 eq 1483 | { 1484 | CRender 1485 | } if 1486 | } def 1487 | /D 1488 | { 1489 | pop 1490 | } def 1491 | /*w 1492 | { 1493 | } def 1494 | /*W 1495 | { 1496 | } def 1497 | /` 1498 | { 1499 | /_i save ddef 1500 | clipForward? 1501 | { 1502 | nulldevice 1503 | } if 1504 | 6 1 roll 4 npop 1505 | concat pop 1506 | userdict begin 1507 | /showpage 1508 | { 1509 | } def 1510 | 0 setgray 1511 | 0 setlinecap 1512 | 1 setlinewidth 1513 | 0 setlinejoin 1514 | 10 setmiterlimit 1515 | [] 0 setdash 1516 | /setstrokeadjust where {pop false setstrokeadjust} if 1517 | newpath 1518 | 0 setgray 1519 | false setoverprint 1520 | } def 1521 | /~ 1522 | { 1523 | end 1524 | _i restore 1525 | } def 1526 | /_rgbtocmyk 1527 | { 1528 | 3 1529 | { 1530 | 1 exch sub 3 1 roll 1531 | } repeat 1532 | 3 copy 1 4 1 roll 1533 | 3 1534 | { 1535 | 3 index 2 copy gt 1536 | { 1537 | exch 1538 | } if 1539 | pop 4 1 roll 1540 | } repeat 1541 | pop pop pop 1542 | 4 1 roll 1543 | 3 1544 | { 1545 | 3 index sub 1546 | 3 1 roll 1547 | } repeat 1548 | 4 -1 roll 1549 | } def 1550 | /setrgbfill 1551 | { 1552 | _rgbf astore pop 1553 | /_fc 1554 | { 1555 | _lp /fill ne 1556 | { 1557 | _of setoverprint 1558 | _rgbf aload pop setrgbcolor 1559 | /_lp /fill ddef 1560 | } if 1561 | } ddef 1562 | /_pf 1563 | { 1564 | _fc 1565 | _eo {eofill} {fill} ifelse 1566 | } ddef 1567 | /_psf 1568 | { 1569 | _fc 1570 | hvashow 1571 | } ddef 1572 | /_pjsf 1573 | { 1574 | _fc 1575 | hvawidthshow 1576 | } ddef 1577 | /_lp /none ddef 1578 | } def 1579 | /setrgbstroke 1580 | { 1581 | _rgbs astore pop 1582 | /_sc 1583 | { 1584 | _lp /stroke ne 1585 | { 1586 | _os setoverprint 1587 | _rgbs aload pop setrgbcolor 1588 | /_lp /stroke ddef 1589 | } if 1590 | } ddef 1591 | /_ps 1592 | { 1593 | _sc 1594 | stroke 1595 | } ddef 1596 | /_pss 1597 | { 1598 | _sc 1599 | ss 1600 | } ddef 1601 | /_pjss 1602 | { 1603 | _sc 1604 | jss 1605 | } ddef 1606 | /_lp /none ddef 1607 | } def 1608 | /O 1609 | { 1610 | 0 ne 1611 | /_of exch ddef 1612 | /_lp /none ddef 1613 | } def 1614 | /R 1615 | { 1616 | 0 ne 1617 | /_os exch ddef 1618 | /_lp /none ddef 1619 | } def 1620 | /g 1621 | { 1622 | /_gf exch ddef 1623 | /_fc 1624 | { 1625 | _lp /fill ne 1626 | { 1627 | _of setoverprint 1628 | _gf setgray 1629 | /_lp /fill ddef 1630 | } if 1631 | } ddef 1632 | /_pf 1633 | { 1634 | _fc 1635 | _eo {eofill} {fill} ifelse 1636 | } ddef 1637 | /_psf 1638 | { 1639 | _fc 1640 | hvashow 1641 | } ddef 1642 | /_pjsf 1643 | { 1644 | _fc 1645 | hvawidthshow 1646 | } ddef 1647 | /_lp /none ddef 1648 | } def 1649 | /G 1650 | { 1651 | /_gs exch ddef 1652 | /_sc 1653 | { 1654 | _lp /stroke ne 1655 | { 1656 | _os setoverprint 1657 | _gs setgray 1658 | /_lp /stroke ddef 1659 | } if 1660 | } ddef 1661 | /_ps 1662 | { 1663 | _sc 1664 | stroke 1665 | } ddef 1666 | /_pss 1667 | { 1668 | _sc 1669 | ss 1670 | } ddef 1671 | /_pjss 1672 | { 1673 | _sc 1674 | jss 1675 | } ddef 1676 | /_lp /none ddef 1677 | } def 1678 | /k 1679 | { 1680 | _cf astore pop 1681 | /_fc 1682 | { 1683 | _lp /fill ne 1684 | { 1685 | _of setoverprint 1686 | _cf aload pop setcmykcolor 1687 | /_lp /fill ddef 1688 | } if 1689 | } ddef 1690 | /_pf 1691 | { 1692 | _fc 1693 | _eo {eofill} {fill} ifelse 1694 | } ddef 1695 | /_psf 1696 | { 1697 | _fc 1698 | hvashow 1699 | } ddef 1700 | /_pjsf 1701 | { 1702 | _fc 1703 | hvawidthshow 1704 | } ddef 1705 | /_lp /none ddef 1706 | } def 1707 | /K 1708 | { 1709 | _cs astore pop 1710 | /_sc 1711 | { 1712 | _lp /stroke ne 1713 | { 1714 | _os setoverprint 1715 | _cs aload pop setcmykcolor 1716 | /_lp /stroke ddef 1717 | } if 1718 | } ddef 1719 | /_ps 1720 | { 1721 | _sc 1722 | stroke 1723 | } ddef 1724 | /_pss 1725 | { 1726 | _sc 1727 | ss 1728 | } ddef 1729 | /_pjss 1730 | { 1731 | _sc 1732 | jss 1733 | } ddef 1734 | /_lp /none ddef 1735 | } def 1736 | /Xa 1737 | { 1738 | _?cmyk { 1739 | 3 npop k 1740 | }{ 1741 | setrgbfill 4 npop 1742 | } ifelse 1743 | } def 1744 | /XA 1745 | { 1746 | _?cmyk { 1747 | 3 npop K 1748 | }{ 1749 | setrgbstroke 4 npop 1750 | } ifelse 1751 | } def 1752 | /Xs 1753 | { 1754 | /_gf exch ddef 1755 | 5 npop 1756 | /_fc 1757 | { 1758 | _lp /fill ne 1759 | { 1760 | _of setoverprint 1761 | _gf setAIseparationgray 1762 | /_lp /fill ddef 1763 | } if 1764 | } ddef 1765 | /_pf 1766 | { 1767 | _fc 1768 | _eo {eofill} {fill} ifelse 1769 | } ddef 1770 | /_psf 1771 | { 1772 | _fc 1773 | hvashow 1774 | } ddef 1775 | /_pjsf 1776 | { 1777 | _fc 1778 | hvawidthshow 1779 | } ddef 1780 | /_lp /none ddef 1781 | } def 1782 | /XS 1783 | { 1784 | /_gs exch ddef 1785 | 5 npop 1786 | /_sc 1787 | { 1788 | _lp /stroke ne 1789 | { 1790 | _os setoverprint 1791 | _gs setAIseparationgray 1792 | /_lp /stroke ddef 1793 | } if 1794 | } ddef 1795 | /_ps 1796 | { 1797 | _sc 1798 | stroke 1799 | } ddef 1800 | /_pss 1801 | { 1802 | _sc 1803 | ss 1804 | } ddef 1805 | /_pjss 1806 | { 1807 | _sc 1808 | jss 1809 | } ddef 1810 | /_lp /none ddef 1811 | } def 1812 | /Xx 1813 | { 1814 | exch 1815 | /_gf exch ddef 1816 | 0 eq { 1817 | findcmykcustomcolor 1818 | }{ 1819 | _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse 1820 | { 1821 | 4 1 roll 3 npop 1822 | findcmykcustomcolor 1823 | }{ 1824 | 8 -4 roll 4 npop 1825 | findrgbcustomcolor 1826 | } ifelse 1827 | } ifelse 1828 | /_if exch ddef 1829 | /_fc 1830 | { 1831 | _lp /fill ne 1832 | { 1833 | _of setoverprint 1834 | _if _gf 1 exch sub setcustomcolor 1835 | /_lp /fill ddef 1836 | } if 1837 | } ddef 1838 | /_pf 1839 | { 1840 | _fc 1841 | _eo {eofill} {fill} ifelse 1842 | } ddef 1843 | /_psf 1844 | { 1845 | _fc 1846 | hvashow 1847 | } ddef 1848 | /_pjsf 1849 | { 1850 | _fc 1851 | hvawidthshow 1852 | } ddef 1853 | /_lp /none ddef 1854 | } def 1855 | /XX 1856 | { 1857 | exch 1858 | /_gs exch ddef 1859 | 0 eq { 1860 | findcmykcustomcolor 1861 | }{ 1862 | _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse 1863 | { 1864 | 4 1 roll 3 npop 1865 | findcmykcustomcolor 1866 | }{ 1867 | 8 -4 roll 4 npop 1868 | findrgbcustomcolor 1869 | } ifelse 1870 | } ifelse 1871 | /_is exch ddef 1872 | /_sc 1873 | { 1874 | _lp /stroke ne 1875 | { 1876 | _os setoverprint 1877 | _is _gs 1 exch sub setcustomcolor 1878 | /_lp /stroke ddef 1879 | } if 1880 | } ddef 1881 | /_ps 1882 | { 1883 | _sc 1884 | stroke 1885 | } ddef 1886 | /_pss 1887 | { 1888 | _sc 1889 | ss 1890 | } ddef 1891 | /_pjss 1892 | { 1893 | _sc 1894 | jss 1895 | } ddef 1896 | /_lp /none ddef 1897 | } def 1898 | /x 1899 | { 1900 | /_gf exch ddef 1901 | findcmykcustomcolor 1902 | /_if exch ddef 1903 | /_fc 1904 | { 1905 | _lp /fill ne 1906 | { 1907 | _of setoverprint 1908 | _if _gf 1 exch sub setcustomcolor 1909 | /_lp /fill ddef 1910 | } if 1911 | } ddef 1912 | /_pf 1913 | { 1914 | _fc 1915 | _eo {eofill} {fill} ifelse 1916 | } ddef 1917 | /_psf 1918 | { 1919 | _fc 1920 | hvashow 1921 | } ddef 1922 | /_pjsf 1923 | { 1924 | _fc 1925 | hvawidthshow 1926 | } ddef 1927 | /_lp /none ddef 1928 | } def 1929 | /X 1930 | { 1931 | /_gs exch ddef 1932 | findcmykcustomcolor 1933 | /_is exch ddef 1934 | /_sc 1935 | { 1936 | _lp /stroke ne 1937 | { 1938 | _os setoverprint 1939 | _is _gs 1 exch sub setcustomcolor 1940 | /_lp /stroke ddef 1941 | } if 1942 | } ddef 1943 | /_ps 1944 | { 1945 | _sc 1946 | stroke 1947 | } ddef 1948 | /_pss 1949 | { 1950 | _sc 1951 | ss 1952 | } ddef 1953 | /_pjss 1954 | { 1955 | _sc 1956 | jss 1957 | } ddef 1958 | /_lp /none ddef 1959 | } def 1960 | /XK 1961 | { 1962 | 3 -1 roll pop 1963 | 0 eq 1964 | { 1965 | 1 exch sub 1966 | 3 {dup 3 1 roll mul 5 1 roll} repeat 1967 | mul 4 1 roll 1968 | K 1969 | } 1970 | { 1971 | 1 exch sub 4 1 roll 1972 | 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat 1973 | 4 -1 roll pop 1974 | XA 1975 | } ifelse 1976 | } def 1977 | /Xk 1978 | { 1979 | 3 -1 roll pop 1980 | 0 eq 1981 | { 1982 | 1 exch sub 1983 | 3 {dup 3 1 roll mul 5 1 roll} repeat 1984 | mul 4 1 roll 1985 | k 1986 | } 1987 | { 1988 | 1 exch sub 4 1 roll 1989 | 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat 1990 | 4 -1 roll pop 1991 | Xa 1992 | } ifelse 1993 | } def 1994 | /A 1995 | { 1996 | pop 1997 | } def 1998 | /annotatepage 1999 | { 2000 | userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse 2001 | } def 2002 | /XT { 2003 | pop pop 2004 | } def 2005 | /Xt { 2006 | pop 2007 | } def 2008 | /discard 2009 | { 2010 | save /discardSave exch store 2011 | discardDict begin 2012 | /endString exch store 2013 | gt38? 2014 | { 2015 | 2 add 2016 | } if 2017 | load 2018 | stopped 2019 | pop 2020 | end 2021 | discardSave restore 2022 | } bind def 2023 | userdict /discardDict 7 dict dup begin 2024 | put 2025 | /pre38Initialize 2026 | { 2027 | /endStringLength endString length store 2028 | /newBuff buffer 0 endStringLength getinterval store 2029 | /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store 2030 | /newBuffLast newBuff endStringLength 1 sub 1 getinterval store 2031 | } def 2032 | /shiftBuffer 2033 | { 2034 | newBuff 0 newBuffButFirst putinterval 2035 | newBuffLast 0 2036 | currentfile read not 2037 | { 2038 | stop 2039 | } if 2040 | put 2041 | } def 2042 | 0 2043 | { 2044 | pre38Initialize 2045 | mark 2046 | currentfile newBuff readstring exch pop 2047 | { 2048 | { 2049 | newBuff endString eq 2050 | { 2051 | cleartomark stop 2052 | } if 2053 | shiftBuffer 2054 | } loop 2055 | } 2056 | { 2057 | stop 2058 | } ifelse 2059 | } def 2060 | 1 2061 | { 2062 | pre38Initialize 2063 | /beginString exch store 2064 | mark 2065 | currentfile newBuff readstring exch pop 2066 | { 2067 | { 2068 | newBuff beginString eq 2069 | { 2070 | /layerCount dup load 1 add store 2071 | } 2072 | { 2073 | newBuff endString eq 2074 | { 2075 | /layerCount dup load 1 sub store 2076 | layerCount 0 eq 2077 | { 2078 | cleartomark stop 2079 | } if 2080 | } if 2081 | } ifelse 2082 | shiftBuffer 2083 | } loop 2084 | } if 2085 | } def 2086 | 2 2087 | { 2088 | mark 2089 | { 2090 | currentfile buffer {readline} stopped { 2091 | % assume error was due to overfilling the buffer 2092 | }{ 2093 | not 2094 | { 2095 | stop 2096 | } if 2097 | endString eq { 2098 | cleartomark stop 2099 | } if 2100 | }ifelse 2101 | } loop 2102 | } def 2103 | 3 2104 | { 2105 | /beginString exch store 2106 | /layerCnt 1 store 2107 | mark 2108 | { 2109 | currentfile buffer {readline} stopped { 2110 | % assume error was due to overfilling the buffer 2111 | }{ 2112 | not 2113 | { 2114 | stop 2115 | } if 2116 | dup beginString eq 2117 | { 2118 | pop /layerCnt dup load 1 add store 2119 | } 2120 | { 2121 | endString eq 2122 | { 2123 | layerCnt 1 eq 2124 | { 2125 | cleartomark stop 2126 | } 2127 | { 2128 | /layerCnt dup load 1 sub store 2129 | } ifelse 2130 | } if 2131 | } ifelse 2132 | }ifelse 2133 | } loop 2134 | } def 2135 | end 2136 | userdict /clipRenderOff 15 dict dup begin 2137 | put 2138 | { 2139 | /n /N /s /S /f /F /b /B 2140 | } 2141 | { 2142 | { 2143 | _doClip 1 eq 2144 | { 2145 | /_doClip 0 ddef _eo {eoclip} {clip} ifelse 2146 | } if 2147 | newpath 2148 | } def 2149 | } forall 2150 | /Tr /pop load def 2151 | /Bb {} def 2152 | /BB /pop load def 2153 | /Bg {12 npop} def 2154 | /Bm {6 npop} def 2155 | /Bc /Bm load def 2156 | /Bh {4 npop} def 2157 | end 2158 | /Lb 2159 | { 2160 | 6 npop 2161 | 7 2 roll 2162 | 5 npop 2163 | 0 eq 2164 | { 2165 | 0 eq 2166 | { 2167 | (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard 2168 | } 2169 | { 2170 | 2171 | /clipForward? true def 2172 | 2173 | /Tx /pop load def 2174 | /Tj /pop load def 2175 | 2176 | currentdict end clipRenderOff begin begin 2177 | } ifelse 2178 | } 2179 | { 2180 | 0 eq 2181 | { 2182 | save /discardSave exch store 2183 | } if 2184 | } ifelse 2185 | } bind def 2186 | /LB 2187 | { 2188 | discardSave dup null ne 2189 | { 2190 | restore 2191 | } 2192 | { 2193 | pop 2194 | clipForward? 2195 | { 2196 | currentdict 2197 | end 2198 | end 2199 | begin 2200 | 2201 | /clipForward? false ddef 2202 | } if 2203 | } ifelse 2204 | } bind def 2205 | /Pb 2206 | { 2207 | pop pop 2208 | 0 (%AI5_EndPalette) discard 2209 | } bind def 2210 | /Np 2211 | { 2212 | 0 (%AI5_End_NonPrinting--) discard 2213 | } bind def 2214 | /Ln /pop load def 2215 | /Ap 2216 | /pop load def 2217 | /Ar 2218 | { 2219 | 72 exch div 2220 | 0 dtransform dup mul exch dup mul add sqrt 2221 | dup 1 lt 2222 | { 2223 | pop 1 2224 | } if 2225 | setflat 2226 | } def 2227 | /Mb 2228 | { 2229 | q 2230 | } def 2231 | /Md 2232 | { 2233 | } def 2234 | /MB 2235 | { 2236 | Q 2237 | } def 2238 | /nc 4 dict def 2239 | nc begin 2240 | /setgray 2241 | { 2242 | pop 2243 | } bind def 2244 | /setcmykcolor 2245 | { 2246 | 4 npop 2247 | } bind def 2248 | /setrgbcolor 2249 | { 2250 | 3 npop 2251 | } bind def 2252 | /setcustomcolor 2253 | { 2254 | 2 npop 2255 | } bind def 2256 | currentdict readonly pop 2257 | end 2258 | /XP 2259 | { 2260 | 4 npop 2261 | } bind def 2262 | /XD 2263 | { 2264 | pop 2265 | } bind def 2266 | end 2267 | setpacking 2268 | %%EndResource 2269 | %%BeginResource: procset Adobe_cshow 2.0 8 2270 | %%Title: (Writing System Operators) 2271 | %%Version: 2.0 8 2272 | %%CreationDate: (1/23/89) () 2273 | %%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved) 2274 | currentpacking true setpacking 2275 | userdict /Adobe_cshow 14 dict dup begin put 2276 | /initialize 2277 | { 2278 | Adobe_cshow begin 2279 | Adobe_cshow 2280 | { 2281 | dup xcheck 2282 | { 2283 | bind 2284 | } if 2285 | pop pop 2286 | } forall 2287 | end 2288 | Adobe_cshow begin 2289 | } def 2290 | /terminate 2291 | { 2292 | currentdict Adobe_cshow eq 2293 | { 2294 | end 2295 | } if 2296 | } def 2297 | /cforall 2298 | { 2299 | /_lobyte 0 ddef 2300 | /_hibyte 0 ddef 2301 | /_cproc exch ddef 2302 | /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef 2303 | { 2304 | /_lobyte exch ddef 2305 | _hibyte 0 eq 2306 | _cscript 1 eq 2307 | _lobyte 129 ge _lobyte 159 le and 2308 | _lobyte 224 ge _lobyte 252 le and or and 2309 | _cscript 2 eq 2310 | _lobyte 161 ge _lobyte 254 le and and 2311 | _cscript 3 eq 2312 | _lobyte 161 ge _lobyte 254 le and and 2313 | _cscript 25 eq 2314 | _lobyte 161 ge _lobyte 254 le and and 2315 | _cscript -1 eq 2316 | or or or or and 2317 | { 2318 | /_hibyte _lobyte ddef 2319 | } 2320 | { 2321 | _hibyte 256 mul _lobyte add 2322 | _cproc 2323 | /_hibyte 0 ddef 2324 | } ifelse 2325 | } forall 2326 | } def 2327 | /cstring 2328 | { 2329 | dup 256 lt 2330 | { 2331 | (s) dup 0 4 3 roll put 2332 | } 2333 | { 2334 | dup 256 idiv exch 256 mod 2335 | (hl) dup dup 0 6 5 roll put 1 4 3 roll put 2336 | } ifelse 2337 | } def 2338 | /clength 2339 | { 2340 | 0 exch 2341 | { 256 lt { 1 } { 2 } ifelse add } cforall 2342 | } def 2343 | /hawidthshow 2344 | { 2345 | { 2346 | dup cstring 2347 | show 2348 | _hvax _hvay rmoveto 2349 | _hvwb eq { _hvcx _hvcy rmoveto } if 2350 | } cforall 2351 | } def 2352 | /vawidthshow 2353 | { 2354 | { 2355 | dup 255 le 2356 | _charorientation 1 eq 2357 | and 2358 | { 2359 | -90 rotate 2360 | 0 _fontRotateAdjust rmoveto 2361 | cstring 2362 | _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow 2363 | 0 _fontRotateAdjust neg rmoveto 2364 | 90 rotate 2365 | } 2366 | { 2367 | currentpoint 2368 | _fontHeight sub 2369 | exch _hvay sub exch _hvax sub 2370 | 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if 2371 | 3 2 roll 2372 | cstring 2373 | dup stringwidth pop 2 div neg _fontAscent neg rmoveto 2374 | show 2375 | moveto 2376 | } ifelse 2377 | } cforall 2378 | } def 2379 | /hvawidthshow 2380 | { 2381 | 6 1 roll 2382 | /_hvay exch ddef 2383 | /_hvax exch ddef 2384 | /_hvwb exch ddef 2385 | /_hvcy exch ddef 2386 | /_hvcx exch ddef 2387 | _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse 2388 | } def 2389 | /hvwidthshow 2390 | { 2391 | 0 0 3 -1 roll hvawidthshow 2392 | } def 2393 | /hvashow 2394 | { 2395 | 0 0 0 6 -3 roll hvawidthshow 2396 | } def 2397 | /hvshow 2398 | { 2399 | 0 0 0 0 0 6 -1 roll hvawidthshow 2400 | } def 2401 | currentdict readonly pop end 2402 | setpacking 2403 | %%EndResource 2404 | %%BeginResource: procset Adobe_shading_AI8 1.0 0 2405 | %%Title: (Adobe Illustrator 8 Shading Procset) 2406 | %%Version: 1.0 0 2407 | %%CreationDate: (12/17/97) () 2408 | %%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved) 2409 | userdict /defaultpacking currentpacking put true setpacking 2410 | userdict /Adobe_shading_AI8 10 dict dup begin put 2411 | /initialize { 2412 | Adobe_shading_AI8 begin 2413 | Adobe_shading_AI8 bdprocs 2414 | Mesh /initialize get exec 2415 | } def 2416 | /terminate { 2417 | currentdict Adobe_shading_AI8 eq { 2418 | end 2419 | } if 2420 | } def 2421 | /bdprocs { 2422 | { 2423 | dup xcheck 1 index type /arraytype eq and { 2424 | bind 2425 | } if 2426 | pop pop 2427 | } forall 2428 | } def 2429 | /X! {pop} def 2430 | /X# {pop pop} def 2431 | /Mesh 40 dict def 2432 | Mesh begin 2433 | /initialize { 2434 | Mesh bdprocs 2435 | Mesh begin 2436 | /emulate? /AI8MeshEmulation where { 2437 | pop AI8MeshEmulation 2438 | }{ 2439 | systemdict /shfill known not 2440 | } ifelse def 2441 | end 2442 | } def 2443 | /bd { 2444 | shadingdict begin 2445 | } def 2446 | /paint { 2447 | emulate? { 2448 | end 2449 | }{ 2450 | /_lp /none ddef _fc /_lp /none ddef 2451 | 2452 | /AIColorSpace AIColorSpace tocolorspace store 2453 | /ColorSpace AIColorSpace topsspace store 2454 | 2455 | version_ge_3010.106 not systemdict /setsmoothness known and { 2456 | 0.0001 setsmoothness 2457 | } if 2458 | 2459 | composite? { 2460 | /DataSource getdatasrc def 2461 | Matrix concat 2462 | currentdict end 2463 | shfill 2464 | }{ 2465 | AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and { 2466 | end 2467 | }{ 2468 | /ColorSpace /DeviceGray store 2469 | /Decode [0 1 0 1 0 1] store 2470 | /DataSource getplatesrc def 2471 | Matrix concat 2472 | currentdict end 2473 | shfill 2474 | } ifelse 2475 | } ifelse 2476 | } ifelse 2477 | } def 2478 | /shadingdict 12 dict def 2479 | shadingdict begin 2480 | /ShadingType 6 def 2481 | /BitsPerCoordinate 16 def 2482 | /BitsPerComponent 8 def 2483 | /BitsPerFlag 8 def 2484 | end 2485 | /datafile null def 2486 | /databuf 256 string def 2487 | /dataptr 0 def 2488 | /srcspace null def 2489 | /srcchannels 0 def 2490 | /dstchannels 0 def 2491 | /dstplate 0 def 2492 | /srctodstcolor null def 2493 | /getplatesrc { 2494 | /srcspace AIColorSpace store 2495 | /srcchannels AIColorSpace getnchannels store 2496 | /dstchannels 1 store 2497 | /dstplate getplateindex store 2498 | /srctodstcolor srcspace makesmarks { 2499 | dstplate 4 eq { 2500 | {1 exch sub} 2501 | }{ 2502 | {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat} 2503 | } ifelse 2504 | }{ 2505 | {srcchannels {pop} repeat 1} 2506 | } ifelse store 2507 | /datafile getdatasrc store 2508 | /rdpatch168 load DataLength () /SubFileDecode filter 2509 | } def 2510 | /getdatasrc { 2511 | /rdcmntline load /ASCII85Decode filter 2512 | } def 2513 | /rdpatch168 { 2514 | /dataptr 0 store 2515 | 49 rdcount 2516 | 4 { 2517 | dup {pop srcchannels getint8} if 2518 | dup {pop srctodstcolor dstchannels putint8 true} if 2519 | } repeat 2520 | {databuf 0 dataptr getinterval}{()} ifelse 2521 | } def 2522 | /rdpatch3216 { 2523 | /dataptr 0 store 2524 | 97 rdcount 2525 | 4 { 2526 | dup {pop srcchannels getint16} if 2527 | dup {pop srctodstcolor dstchannels putint16 true} if 2528 | } repeat 2529 | {databuf 0 dataptr getinterval}{()} ifelse 2530 | } def 2531 | /rdcount { 2532 | dup 0 gt { 2533 | datafile databuf dataptr 4 -1 roll getinterval readstring 2534 | exch length dataptr add /dataptr exch store 2535 | }{ 2536 | true 2537 | } ifelse 2538 | } def 2539 | /getint8 { 2540 | mark true 3 -1 roll 2541 | { 2542 | dup {pop datafile read} if 2543 | dup {pop 255 div true} if 2544 | } repeat 2545 | { 2546 | counttomark 1 add -1 roll pop true 2547 | }{ 2548 | cleartomark false 2549 | } ifelse 2550 | } def 2551 | /putint8 { 2552 | dup dataptr add /dataptr exch store 2553 | dataptr exch 2554 | { 2555 | 1 sub exch 2556 | 255 mul cvi 2557 | databuf 2 index 2558 | 3 -1 roll put 2559 | } repeat 2560 | pop 2561 | } def 2562 | /getint16 { 2563 | mark true 3 -1 roll 2564 | { 2565 | dup {pop datafile read} if 2566 | dup {pop 256 mul datafile read} if 2567 | dup {pop add 65535 div true} if 2568 | } repeat 2569 | { 2570 | counttomark 1 add -1 roll pop true 2571 | }{ 2572 | cleartomark false 2573 | } ifelse 2574 | } def 2575 | /putint16 { 2576 | dup 2 mul dataptr add /dataptr exch store 2577 | dataptr exch 2578 | { 2579 | 2 sub exch 2580 | 65535 mul cvi dup 2581 | 256 idiv databuf 3 index 3 -1 roll put 2582 | 256 mod databuf 2 index 1 add 3 -1 roll put 2583 | } repeat 2584 | pop 2585 | } def 2586 | /srcbuf 256 string def 2587 | /rdcmntline { 2588 | currentfile srcbuf readline pop 2589 | (%) anchorsearch {pop} if 2590 | } def 2591 | /getplateindex { 2592 | 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall 2593 | } def 2594 | /aicsarray 4 array def 2595 | /aicsaltvals 4 array def 2596 | /aicsaltcolr aicsaltvals def 2597 | /tocolorspace { 2598 | dup type /arraytype eq { 2599 | mark exch aload pop 2600 | aicsarray 0 3 -1 roll put 2601 | aicsarray 1 3 -1 roll put 2602 | dup aicsarray 2 3 -1 roll put 2603 | gettintxform aicsarray 3 3 -1 roll put 2604 | counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store 2605 | aicsaltcolr astore pop pop 2606 | aicsarray 2607 | } if 2608 | } def 2609 | /subtintxform {aicsaltcolr {1 index mul exch} forall pop} def 2610 | /addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def 2611 | /gettintxform { 2612 | /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load 2613 | } def 2614 | /getnchannels { 2615 | dup type /arraytype eq {0 get} if 2616 | colorspacedict exch get begin Channels end 2617 | } def 2618 | /makesmarks { 2619 | composite? { 2620 | pop true 2621 | }{ 2622 | dup dup type /arraytype eq {0 get} if 2623 | colorspacedict exch get begin MarksPlate end 2624 | } ifelse 2625 | } def 2626 | /markingplate { 2627 | composite? { 2628 | pop true 2629 | }{ 2630 | dup type /arraytype eq { 2631 | dup length getplateindex gt {getplateindex get}{pop false} ifelse 2632 | } if 2633 | } ifelse 2634 | } def 2635 | /tocmyk { 2636 | dup dup type /arraytype eq {0 get} if 2637 | colorspacedict exch get begin ToCMYK end 2638 | } def 2639 | /topsspace { 2640 | dup dup type /arraytype eq {0 get} if 2641 | colorspacedict exch get begin ToPSSpace end 2642 | } def 2643 | /colorspacedict 5 dict dup begin 2644 | /DeviceGray 4 dict dup begin 2645 | /Channels 1 def 2646 | /MarksPlate {pop black?} def 2647 | /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def 2648 | /ToPSSpace {} def 2649 | end def 2650 | /DeviceRGB 4 dict dup begin 2651 | /Channels 3 def 2652 | /MarksPlate {pop isCMYKSep?} def 2653 | /ToCMYK {pop _rgbtocmyk} def 2654 | /ToPSSpace {} def 2655 | end def 2656 | /DeviceCMYK 4 dict dup begin 2657 | /Channels 4 def 2658 | /MarksPlate {pop isCMYKSep?} def 2659 | /ToCMYK {pop} def 2660 | /ToPSSpace {} def 2661 | end def 2662 | /Separation 4 dict dup begin 2663 | /Channels 1 def 2664 | /MarksPlate { 2665 | /findcmykcustomcolor where { 2666 | pop dup 1 exch ToCMYK 5 -1 roll 1 get 2667 | findcmykcustomcolor 1 setcustomcolor 2668 | systemdict /currentgray get exec 2669 | 1 ne 2670 | }{ 2671 | pop false 2672 | } ifelse 2673 | } def 2674 | /ToCMYK { 2675 | dup 2 get mark exch 4 2 roll 2676 | 3 get exec 2677 | counttomark -1 roll tocmyk 2678 | 5 -1 roll pop 2679 | } def 2680 | /ToPSSpace {} def 2681 | end def 2682 | /Process 4 dict dup begin 2683 | /Channels 1 def 2684 | /MarksPlate { 2685 | isCMYKSep? { 2686 | 1 exch ToCMYK 4 array astore getplateindex get 0 ne 2687 | }{ 2688 | pop false 2689 | } ifelse 2690 | } def 2691 | /ToCMYK { 2692 | dup 2 get mark exch 4 2 roll 2693 | 3 get exec 2694 | counttomark -1 roll tocmyk 2695 | 5 -1 roll pop 2696 | } def 2697 | /ToPSSpace { 2698 | 4 array copy dup 0 /Separation put 2699 | } def 2700 | end def 2701 | end def 2702 | /isoverprint { 2703 | /currentoverprint where {pop currentoverprint}{_of} ifelse 2704 | } def 2705 | /version_ge_3010.106 { 2706 | version {cvr} stopped { 2707 | pop 2708 | false 2709 | }{ 2710 | 3010.106 ge 2711 | } ifelse 2712 | } def 2713 | end 2714 | end 2715 | defaultpacking setpacking 2716 | %%EndResource 2717 | %%EndProlog %%BeginSetup userdict /_useSmoothShade false put userdict /_aicmykps true put userdict /_forceToCMYK true put Adobe_level2_AI5 /initialize get exec 2718 | Adobe_cshow /initialize get exec 2719 | Adobe_ColorImage_AI6 /initialize get exec 2720 | Adobe_shading_AI8 /initialize get exec 2721 | Adobe_Illustrator_AI5 /initialize get exec 2722 | %AI3_BeginRider currentpacking true setpacking setpacking %AI3_EndRider %AI5_Begin_NonPrinting Np %AI8_PluginGroupInfo (Adobe Path Blends) (Adobe Blends Plugin) (LiveBlends.aip) %AI8_PluginGroupInfo (Adobe Tracing Object) (Tracing) (TracingSuite.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe Calligraphic Brush Tool) (Adobe Calligraphic Brush Plugin) (CalligBrushTool.aip) %AI8_PluginGroupInfo (Adobe Flare Plugin) (Flare) (Flare.aip) %AI8_PluginGroupInfo (Adobe Symbolism) (Adobe Symbolism) (ParticleSystem.aip) %AI8_PluginGroupInfo (Adobe Deform Plugin) (Adobe Envelope Plugin) (Envelope and Warp.aip) %AI8_PluginGroupInfo (Pathfinder Suite) (Adobe Compound Shape) (PathFinderS.aip) %AI8_PluginGroupInfo (Adobe Planar Group) (Adobe Live Paint Plugin) (Live Paint.aip) %AI5_End_NonPrinting-- %AI5_BeginPalette 0 0 Pb 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 Xs ([Registration]) Pc PB %AI5_EndPalette %%EndSetup %AI5_BeginLayer 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (svg2759) Ln 0 A u U u u 0 O 0.34902 0.231373 0.305882 0 0.666667 0.698039 0.670588 Xa 0 J 0 j 1 w 4 M []0 d 0 XR 343.9077 320.0234 m 457.2617 319.8218 L 458.8457 319.8218 460.2617 320.0571 460.2617 316.6616 C 460.123 279.332 L 341.0474 279.332 L 341.0474 316.8003 L 341.0474 318.4741 341.2095 320.0234 343.9077 320.0234 C f u 0 0 0 0 1 1 1 Xa 375.0225 300.9243 m 375.0269 293.3955 368.9258 287.2881 361.3955 287.2832 C 353.8657 287.2783 347.7568 293.3789 347.7524 300.9082 C 347.7524 300.9141 347.7524 300.9189 347.7524 300.9243 C 347.748 308.4546 353.8491 314.5615 361.3789 314.5659 C 368.9102 314.5708 375.0181 308.4702 375.0225 300.9409 C 375.0225 300.936 375.0225 300.9302 375.0225 300.9243 C f u *u 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 372.4712 312.0293 m 375.4946 309.0059 377.0068 305.3037 377.0068 300.9248 c 377.0068 296.5449 375.521 292.8828 372.5493 289.9375 C 369.396 286.834 365.6685 285.2842 361.3677 285.2842 c 357.1191 285.2842 353.4565 286.8213 350.3809 289.8984 C 347.3052 292.9736 345.7671 296.6484 345.7671 300.9248 c 345.7671 305.1997 347.3052 308.9014 350.3809 312.0293 C 353.3784 315.0537 357.041 316.5649 361.3677 316.5649 c 365.7471 316.5649 369.4478 315.0537 372.4712 312.0293 C f 1 D 352.4165 309.9956 m 349.8604 307.4141 348.5825 304.3896 348.5825 300.9209 c 348.5825 297.4531 349.8477 294.4541 352.3774 291.9258 C 354.9072 289.3955 357.9194 288.1309 361.4141 288.1309 c 364.9087 288.1309 367.9463 289.4082 370.5283 291.9639 C 372.98 294.3369 374.2061 297.3213 374.2061 300.9209 c 374.2061 304.4927 372.96 307.5239 370.4692 310.0151 C 367.979 312.5049 364.9609 313.7505 361.4141 313.7505 c 357.8672 313.7505 354.8677 312.4985 352.4165 309.9956 C f 0 D 359.1436 302.4468 m 358.7529 303.2979 358.1685 303.7236 357.3887 303.7236 c 356.0098 303.7236 355.3208 302.7959 355.3208 300.9404 c 355.3208 299.085 356.0098 298.1572 357.3887 298.1572 c 358.2988 298.1572 358.9492 298.6094 359.3389 299.5146 C 361.25 298.4971 L 360.3394 296.8789 358.9727 296.0693 357.1509 296.0693 c 355.7456 296.0693 354.6196 296.5 353.7744 297.3613 C 352.9277 298.2227 352.5054 299.4106 352.5054 300.9248 c 352.5054 302.4126 352.9409 303.5938 353.813 304.4683 C 354.6851 305.3428 355.771 305.7803 357.0732 305.7803 c 358.999 305.7803 360.3779 305.0215 361.2114 303.5054 C 359.1436 302.4468 L f 368.1338 302.4468 m 367.7427 303.2979 367.1694 303.7236 366.4141 303.7236 c 365.0078 303.7236 364.3042 302.7959 364.3042 300.9404 c 364.3042 299.085 365.0078 298.1572 366.4141 298.1572 c 367.3257 298.1572 367.9644 298.6094 368.3286 299.5146 C 370.2822 298.4971 L 369.373 296.8789 368.0083 296.0693 366.1899 296.0693 c 364.7866 296.0693 363.6631 296.5 362.8184 297.3613 C 361.9751 298.2227 361.5522 299.4106 361.5522 300.9248 c 361.5522 302.4126 361.9814 303.5938 362.8389 304.4683 C 363.6958 305.3428 364.7866 305.7803 366.1123 305.7803 c 368.0347 305.7803 369.4116 305.0215 370.2427 303.5054 C 368.1338 302.4468 L f *U U /AdobeObjectMatrix (1.000000 0.000000 0.000000 1.000000 -289.615692 99.065300) XT U /AdobeObjectMatrix (0.872921 0.000000 0.000000 0.872921 50.125359 143.214401) XT *u 1 D 458.2539 320.5 m 342.7466 320.5 L 341.5078 320.5 340.5 319.4917 340.5 318.2529 C 340.5 279.0078 L 340.5 278.7275 340.7271 278.5 341.0068 278.5 C 459.9922 278.5 L 460.2725 278.5 460.5 278.7275 460.5 279.0078 C 460.5 318.2529 L 460.5 319.4917 459.4922 320.5 458.2539 320.5 C f 0 D 342.7466 319.4849 m 458.2539 319.4849 L 458.9326 319.4849 459.4844 318.9321 459.4844 318.2529 C 459.4844 302.4346 459.4844 291.0078 V 376.9277 291.0078 L 373.9019 285.5371 368.0723 281.8232 361.3813 281.8232 c 354.688 281.8232 348.8599 285.5342 345.8354 291.0078 C 341.5142 291.0078 L 341.5142 302.4346 341.5142 318.2529 Y 341.5142 318.9321 342.0674 319.4849 342.7466 319.4849 C f *U u 0 0 0 0 1 1 1 Xa 426.7637 282.7676 m 426.8438 282.6133 426.9502 282.4883 427.083 282.3916 C 427.2168 282.2959 427.3711 282.2246 427.5498 282.1787 C 427.7295 282.1318 427.915 282.1094 428.1055 282.1094 c 428.2354 282.1094 428.374 282.1191 428.5225 282.1416 C 428.6699 282.1621 428.8086 282.2051 428.9385 282.2666 C 429.0684 282.3281 429.1758 282.4141 429.2617 282.5215 C 429.3496 282.6299 429.3926 282.7676 429.3926 282.9346 c 429.3926 283.1133 429.334 283.2588 429.2207 283.3701 C 429.1064 283.4824 428.9561 283.5742 428.7715 283.6484 C 428.5859 283.7227 428.376 283.7871 428.1426 283.8438 C 427.9072 283.8994 427.6699 283.9609 427.4287 284.0293 C 427.1816 284.0908 426.9404 284.166 426.7051 284.2559 C 426.4717 284.3457 426.2617 284.4619 426.0762 284.6035 c 425.8906 284.7461 425.7412 284.9238 425.627 285.1367 C 425.5127 285.3516 425.4551 285.6094 425.4551 285.9121 c 425.4551 286.252 425.5283 286.5469 425.6729 286.7979 C 425.8184 287.0479 426.0088 287.2568 426.2441 287.4238 C 426.4775 287.5908 426.7441 287.7148 427.041 287.7949 C 427.3359 287.875 427.6328 287.916 427.9297 287.916 c 428.2754 287.916 428.6074 287.877 428.9258 287.7988 C 429.2441 287.7227 429.5273 287.5957 429.7734 287.4229 C 430.0215 287.25 430.2168 287.0293 430.3623 286.7598 C 430.5068 286.4902 430.5801 286.1641 430.5801 285.7803 C 429.167 285.7803 L 429.1543 285.9785 429.1123 286.1426 429.043 286.2715 C 428.9717 286.4023 428.877 286.5039 428.7617 286.5781 C 428.6436 286.6523 428.5098 286.7051 428.3594 286.7354 C 428.208 286.7666 428.0439 286.7822 427.8652 286.7822 c 427.749 286.7822 427.6309 286.7695 427.5156 286.7451 C 427.3975 286.7207 427.292 286.6768 427.1973 286.6152 c 427.1006 286.5527 427.0215 286.4766 426.9609 286.3828 C 426.9004 286.29 426.8691 286.1729 426.8691 286.0313 c 426.8691 285.9004 426.8926 285.7949 426.9424 285.7148 C 426.9922 285.6348 427.0898 285.5605 427.2344 285.4922 c 427.3789 285.4248 427.5801 285.3564 427.8359 285.2881 c 428.0918 285.2207 428.4277 285.1328 428.8418 285.0293 C 428.9648 285.0039 429.1357 284.959 429.3555 284.8936 C 429.5742 284.8281 429.792 284.7256 430.0078 284.584 C 430.2246 284.4404 430.4111 284.25 430.5693 284.0127 C 430.7266 283.7744 430.8047 283.4697 430.8047 283.0986 c 430.8047 282.7949 430.7461 282.5137 430.6289 282.2539 C 430.5107 281.9941 430.3359 281.7695 430.1045 281.582 C 429.873 281.3926 429.585 281.2461 429.2422 281.1406 C 428.8984 281.0352 428.501 280.9834 428.0508 280.9834 c 427.6855 280.9834 427.332 281.0283 426.9883 281.1182 C 426.6455 281.208 426.3418 281.3496 426.0781 281.541 C 425.8164 281.7334 425.6074 281.9785 425.4531 282.2754 C 425.2988 282.5723 425.2246 282.9248 425.2305 283.334 C 426.6436 283.334 L 426.6436 283.1113 426.6836 282.9219 426.7637 282.7676 C f *u 434.9688 287.752 m 437.4473 281.1309 L 435.9336 281.1309 L 435.4336 282.6055 L 432.9551 282.6055 L 432.4365 281.1309 L 430.9707 281.1309 L 433.4756 287.752 L 434.9688 287.752 L f 1 D 435.0527 283.6924 m 434.2188 286.1201 L 434.1992 286.1201 L 433.3359 283.6924 L 435.0527 283.6924 L f *U U u *u 0 D 400.4966 287.752 m 400.812 287.752 401.0996 287.7246 401.3604 287.6689 C 401.6211 287.6133 401.8438 287.5215 402.0293 287.3955 C 402.2148 287.2695 402.3594 287.1006 402.4619 286.8906 c 402.5645 286.6797 402.6152 286.4209 402.6152 286.1113 c 402.6152 285.7773 402.5391 285.5 402.3867 285.2773 C 402.2363 285.0547 402.0107 284.873 401.7129 284.7305 C 402.123 284.6133 402.4287 284.4082 402.6309 284.1133 c 402.832 283.8203 402.9336 283.4648 402.9336 283.0508 c 402.9336 282.7168 402.8691 282.4277 402.7383 282.1836 C 402.6084 281.9395 402.4326 281.7402 402.2129 281.5859 C 401.9932 281.4307 401.7422 281.3164 401.4609 281.2422 C 401.1777 281.168 400.8887 281.1309 400.5908 281.1309 C 397.3745 281.1309 L 397.3745 287.752 L 400.4966 287.752 L 400.4966 287.752 L f 1 D 400.3101 285.0742 m 400.5703 285.0742 400.7837 285.1357 400.9517 285.2598 C 401.1191 285.3828 401.2021 285.583 401.2021 285.8604 c 401.2021 286.0146 401.1738 286.1406 401.1191 286.2402 C 401.0625 286.3389 400.9888 286.416 400.8955 286.4707 C 400.8022 286.5264 400.6953 286.5654 400.5752 286.5869 C 400.4541 286.6084 400.3286 286.6191 400.1987 286.6191 C 398.834 286.6191 L 398.834 285.0742 L 400.3101 285.0742 L f 400.3955 282.2637 m 400.5381 282.2637 400.6743 282.2773 400.8042 282.3057 C 400.9341 282.334 401.0498 282.3799 401.1484 282.4443 C 401.248 282.5098 401.3262 282.5977 401.3857 282.709 c 401.4453 282.8203 401.4736 282.9629 401.4736 283.1357 c 401.4736 283.4746 401.3779 283.7178 401.1855 283.8633 c 400.9937 284.0078 400.7393 284.0801 400.4238 284.0801 C 398.834 284.0801 L 398.834 282.2637 L 400.3955 282.2637 L f *U 0 D 403.1904 287.752 m 404.8242 287.752 L 406.375 285.1367 L 407.916 287.752 L 409.5391 287.752 L 407.082 283.6719 L 407.082 281.1309 L 405.6211 281.1309 L 405.6211 283.709 L 403.1904 287.752 L f U u 442.9033 305.519 m 442.9063 299.6743 438.1719 294.9316 432.3262 294.9277 C 426.4805 294.9238 421.7383 299.6582 421.7324 305.5039 C 421.7324 305.5088 421.7324 305.5146 421.7324 305.519 C 421.7285 311.3647 426.4648 316.106 432.3105 316.1108 C 438.1563 316.1152 442.8994 311.3799 442.9033 305.5347 C 442.9033 305.5288 442.9033 305.5244 442.9033 305.519 C f u *u 1 D 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 432.2422 317.1138 m 429.0293 317.1138 426.3115 315.9932 424.0859 313.752 C 421.8027 311.4326 420.6621 308.6885 420.6621 305.519 c 420.6621 302.3501 421.8027 299.6245 424.0859 297.3447 C 426.3691 295.0645 429.0879 293.9238 432.2422 293.9238 c 435.4355 293.9238 438.2021 295.0742 440.5449 297.374 C 442.75 299.5571 443.8535 302.2729 443.8535 305.519 c 443.8535 308.7651 442.7305 311.5103 440.4854 313.752 C 438.2402 315.9932 435.4932 317.1138 432.2422 317.1138 c f 0 D 432.2715 315.0269 m 434.9033 315.0269 437.1387 314.0996 438.9775 312.2446 C 440.834 310.4082 441.7627 308.167 441.7627 305.519 c 441.7627 302.8525 440.8545 300.6396 439.0352 298.8809 C 437.1191 296.9873 434.8652 296.041 432.2715 296.041 c 429.6777 296.041 427.4434 296.9785 425.5664 298.8516 C 423.6895 300.7271 422.751 302.9487 422.751 305.519 c 422.751 308.0894 423.6992 310.3311 425.5957 312.2446 C 427.4141 314.0996 429.6396 315.0269 432.2715 315.0269 c f *U 427.1025 307.1558 m 427.5645 310.0732 429.6191 311.6328 432.1934 311.6328 c 435.8945 311.6328 438.1504 308.9468 438.1504 305.3647 c 438.1504 301.8701 435.75 299.1548 432.1348 299.1548 c 429.6465 299.1548 427.4209 300.6855 427.0156 303.689 C 429.9365 303.689 L 430.0234 302.1299 431.0361 301.5811 432.4824 301.5811 c 434.1299 301.5811 435.2012 303.1118 435.2012 305.4517 c 435.2012 307.9063 434.2754 309.2061 432.5391 309.2061 c 431.2676 309.2061 430.168 308.7437 429.9365 307.1558 C 430.7871 307.1602 L 428.4863 304.8613 L 426.1875 307.1602 L 427.1025 307.1558 L f U /AdobeObjectMatrix (1.000000 0.000000 0.000000 1.000000 -23.952101 -89.729622) XT U /AdobeObjectMatrix (0.624995 0.000000 0.000000 0.624995 391.229401 176.933197) XT u 0 0 0 0 1 1 1 Xa 403.8594 316.021 m 409.791 316.021 414.5986 311.2134 414.5986 305.2832 c 414.5986 299.3525 409.791 294.5449 403.8594 294.5449 c 397.9287 294.5449 393.1206 299.3525 393.1206 305.2832 c 393.1206 311.2134 397.9287 316.021 403.8594 316.021 c f u 1 D 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 406.9678 308.3901 m 406.9678 308.8037 406.6318 309.1387 406.2188 309.1387 C 401.4756 309.1387 L 401.0625 309.1387 400.7266 308.8042 400.7266 308.3901 C 400.7266 303.6475 L 402.0488 303.6475 L 402.0488 298.0313 L 405.6445 298.0313 L 405.6445 303.6475 L 406.9678 303.6475 L 406.9678 308.3901 L 406.9678 308.3901 L f 0 D 403.8477 313.0078 m 404.7432 313.0078 405.4688 312.2813 405.4688 311.3857 c 405.4688 310.4897 404.7432 309.7637 403.8477 309.7637 c 402.9512 309.7637 402.2246 310.4897 402.2246 311.3857 c 402.2246 312.2813 402.9512 313.0078 403.8477 313.0078 c f U *u 1 D 403.832 317.1138 m 400.6206 317.1138 397.9009 315.9937 395.6758 313.7515 C 393.3921 311.4331 392.251 308.6885 392.251 305.5195 c 392.251 302.3511 393.3921 299.625 395.6758 297.3447 C 397.9595 295.0645 400.6787 293.9248 403.832 293.9248 c 407.0254 293.9248 409.793 295.0742 412.1338 297.375 C 414.3408 299.5571 415.4434 302.2729 415.4434 305.5195 c 415.4434 308.7666 414.3213 311.5103 412.0762 313.7515 C 409.832 315.9937 407.084 317.1138 403.832 317.1138 c f 0 D 403.8613 315.0273 m 406.4932 315.0273 408.7285 314.0996 410.5664 312.2446 C 412.4248 310.4092 413.3535 308.167 413.3535 305.5195 c 413.3535 302.853 412.4443 300.6396 410.625 298.8809 C 408.709 296.9883 406.4551 296.041 403.8613 296.041 c 401.2676 296.041 399.0332 296.9785 397.1567 298.8525 C 395.2788 300.7271 394.3408 302.9492 394.3408 305.5195 c 394.3408 308.0898 395.2891 310.3315 397.1851 312.2446 C 399.0044 314.0996 401.2305 315.0273 403.8613 315.0273 c f *U U U /AdobeObjectMatrix (0.993781 0.000000 0.000000 0.993669 -177.694092 -74.436409) XT U LB %AI5_EndLayer-- %AI3_BeginCrops userdict /AI3_noCropMarks known not { 0 A u u 0 R 0 G 0 J 0 j 0.5 w 4 M []0 d 0 XR 331.5 278.5 m 304.5 278.5 L S 340.5 269.5 m 340.5 242.5 L S U u 331.5 320.5 m 304.5 320.5 L S 340.5 329.5 m 340.5 356.5 L S U u 469.5 320.5 m 496.5 320.5 L S 460.5 329.5 m 460.5 356.5 L S U u 469.5 278.5 m 496.5 278.5 L S 460.5 269.5 m 460.5 242.5 L S U U } if %AI3_EndCrops %%PageTrailer gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec 2723 | Adobe_shading_AI8 /terminate get exec 2724 | Adobe_ColorImage_AI6 /terminate get exec 2725 | Adobe_cshow /terminate get exec 2726 | Adobe_level2_AI5 /terminate get exec 2727 | %%EOF -------------------------------------------------------------------------------- /intro_to_distributed.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/siscia/intro-to-distributed-system/7fc8cb3e00cfa40ae127e1ef6f172eecca66a011/intro_to_distributed.pdf -------------------------------------------------------------------------------- /intro_to_distributed.tex: -------------------------------------------------------------------------------- 1 | % !TEX TS-program = pdflatex 2 | % !TEX encoding = UTF-8 Unicode 3 | 4 | % This is a simple template for a LaTeX document using the "article" class. 5 | % See "book", "report", "letter" for other types of document. 6 | 7 | \documentclass[12pt]{article} % use larger type; default would be 10pt 8 | 9 | \usepackage[utf8]{inputenc} % set input encoding (not needed with XeLaTeX) 10 | 11 | \usepackage{tikz} 12 | 13 | 14 | %%% Examples of Article customizations 15 | % These packages are optional, depending whether you want the features they provide. 16 | % See the LaTeX Companion or other references for full information. 17 | 18 | %%% PAGE DIMENSIONS 19 | \usepackage{geometry} % to change the page dimensions 20 | \geometry{a4paper} % or letterpaper (US) or a5paper or.... 21 | 22 | \usepackage{graphicx} % support the \includegraphics command and options 23 | 24 | %%% PACKAGES 25 | \usepackage{booktabs} % for much better looking tables 26 | \usepackage{array} % for better arrays (eg matrices) in maths 27 | \usepackage{paralist} % very flexible & customisable lists (eg. enumerate/itemize, etc.) 28 | \usepackage{verbatim} % adds environment for commenting out blocks of text & for better verbatim 29 | \usepackage{subfig} % make it possible to include more than one captioned figure/table in a single float 30 | % These packages are all incorporated in the memoir class to one degree or another... 31 | 32 | %%% HEADERS & FOOTERS 33 | \usepackage{fancyhdr} % This should be set AFTER setting up the page geometry 34 | \pagestyle{fancy} % options: empty , plain , fancy 35 | \renewcommand{\headrulewidth}{0pt} % customise the layout... 36 | \lhead{}\chead{}\rhead{} 37 | \lfoot{}\cfoot{\thepage}\rfoot{} 38 | 39 | %%% SECTION TITLE APPEARANCE 40 | \usepackage{sectsty} 41 | \allsectionsfont{\sffamily\mdseries\upshape} % (See the fntguide.pdf for font help) 42 | % (This matches ConTeXt defaults) 43 | 44 | %%% ToC (table of contents) APPEARANCE 45 | \usepackage[nottoc,notlof,notlot]{tocbibind} % Put the bibliography in the ToC 46 | \usepackage[titles,subfigure]{tocloft} % Alter the style of the Table of Contents 47 | \renewcommand{\cftsecfont}{\rmfamily\mdseries\upshape} 48 | \renewcommand{\cftsecpagefont}{\rmfamily\mdseries\upshape} % No bold! 49 | 50 | \definecolor{aliceblue}{rgb}{0.92, 0.97, 1.0} 51 | 52 | \pagecolor{aliceblue} 53 | 54 | \usepackage{background} 55 | 56 | \usepackage{nopageno} 57 | 58 | %%% END Article customizations 59 | 60 | %\usepackage{mathpazo} 61 | 62 | \usepackage{quattrocento} 63 | \usepackage[T1]{fontenc} 64 | 65 | \renewcommand{\sfdefault}{\quattrocentofamily} 66 | \renewcommand{\rmdefault}{ptm} 67 | \renewcommand{\familydefault}{\quattrocentofamily} 68 | 69 | \linespread{1.25} 70 | 71 | \hoffset = 35pt 72 | 73 | \marginparwidth = 125pt 74 | \marginparsep = 15pt 75 | \textwidth=350pt 76 | \textheight=625pt 77 | 78 | \setlength{\parindent}{2em} 79 | \setlength{\parskip}{2em} 80 | 81 | 82 | \usepackage{titlesec} 83 | \titleformat{\section}[hang] 84 | {\rmfamily \huge} 85 | {}{3em}{ 86 | \newpage 87 | \rule{\textwidth}{1pt} 88 | \vspace{1ex} 89 | \centering 90 | } % before-code 91 | [ 92 | \vspace{-5ex}% 93 | \rule{\textwidth}{0.3pt} 94 | ] % after-code 95 | 96 | \titleformat{\subsection}[hang] 97 | {\rmfamily \large} 98 | {}{2em}{} 99 | [ 100 | \vspace{-5ex}% 101 | \rule{\textwidth}{0.3pt} 102 | ] % after-code 103 | 104 | 105 | %%% The "real" document content comes below... 106 | 107 | \title{{\rmfamily Introduction to Highly Scalable, Fault Tolerant, Distributed System}} 108 | \author{RedBeardLab.github.io} 109 | \date{} % Activate to display a given date or no date (if empty), 110 | % otherwise the current date is printed 111 | 112 | \begin{document} 113 | 114 | \backgroundsetup{ 115 | placement=bottom, 116 | angle=0, 117 | color=black!40, 118 | scale=4, 119 | vshift=10, 120 | contents={ 121 | \begin{tikzpicture} 122 | \fill [blue!18](-5, 0) -- (0, 0) -- (0, -10) ..controls (-2, -2) and (-3, -6) ..(-5,0); 123 | \node at (-4, -10) {$- \thepage -$}; 124 | \end{tikzpicture} 125 | }} 126 | 127 | \maketitle 128 | 129 | \newpage 130 | 131 | {Copyright Simone Mosciatti 2016, Milano, Italy.} 132 | 133 | This little booklet is intended as a short, and definitely not complete nor exhaustive, introduction to the problem and possible solution faced during the design of distributed, highly scalable, fault tolerant systems. 134 | 135 | Following the Open Source principles this work is released under the Creative Commons, contributions and suggestions are extremely welcome. 136 | 137 | The complete source of the project can be found at \\ 138 | {\ttfamily https://github.com/siscia/intro-to-distributed-system} \\ 139 | where contributions are encouraged. 140 | 141 | The author can be directly contacted through Twitter {\ttfamily @siscia\_} or via email at {\ttfamily simone@mweb.biz} 142 | 143 | \vspace{\fill} 144 | 145 | \begin{figure}[h] 146 | \centering 147 | \includegraphics{by-sa} 148 | \end{figure} 149 | 150 | {\small This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit {\ttfamily http://creativecommons.org/licenses/by-sa/4.0/} .} 151 | 152 | \section{Introduction} 153 | 154 | In the last few years, the web has been exponentially growing and it is expected to keep growing faster than ever, accordingly the computing power required and the networking necessities need to be improved. 155 | 156 | However our computers are not getting much faster, they have reached their physically limit regarding performance, but fortunately those machines are getting cheaper and more power efficient every single day. 157 | 158 | The next logical step is thus to use a lot of cheap, small and power efficient computers instead of a few, big, expensive ones. 159 | 160 | Computation is going to be divided between a lot of machines, likely, not even in the same datacenter. This will allow to build systems that have the necessary performance for the modern web but it will also bring its own set of problems and challenges. 161 | 162 | Build and use distributed system is known to be very hard, but why? 163 | 164 | \section{Why is it hard?} 165 | 166 | Distributed systems are based on completely different foundations from traditional systems. The difference is that in the distributed systems there is not a physical central point of control where all the data flow; moreover information travel between the different parts of the system in a not negligible time. 167 | 168 | Also there is expectation that our system is live 24/7/365. Using a single machine there is no way to defend ourselves against power loss or somebody tripping on the cables, but if we use a lot of small machines distributed in different parts of the globe there is no reason that our system should be down if problems occur in a single data center. 169 | 170 | Working in a distributed system means using more than a single machine. It is good because it means that your system could be resistant to failure, however having a lot of machines around it means that some of those will break no matter what. 171 | 172 | Suppose that a machine goes ``down'' (whatever that means) with a small probability, lets say 1\%. This mean that a machine is ``up'' with a probability of $ 100\%-1\% = 99\%$. Now suppose you have 100 machines, it means that the probability that all machines are up at the same time is roughly $ 0.99^{100} = 0.366 $. What happens with 1000 machines? $0.99 ^ {1000} = 0,000043171 \approx 0 \%$ of chances of having all your computers ``up''. 173 | 174 | In a big distributed system, at any given time, some machines will be ``down'' , some other machines will be having some weird problems and -- even worse -- some that were working just fine a couple of seconds ago will go down. 175 | 176 | To manage all this complexity and uncertainty in a distributed system it is necessary to use a different mental framework from that used to build traditional systems. 177 | 178 | \subsection{State is evil} 179 | 180 | As previously discussed, no matter what, some of your machines will go ``down'', they will completely lose their memory and you will have lost the state stored in those machines. 181 | 182 | If your system relies on some state stored in a single machine you have a single point of failure, and when -- not if -- that machine goes down your system will go in some inconsistent state. 183 | 184 | The simplest solution is to not keeping any state in your system, but this is not always a practicable solution. Keeping the number of state at the bare minimum is, likely, the best trade off possible. 185 | 186 | When you lose state you need to be sure that your system can keep operating, it can either recover the state somehow (read it back from a persistent disk, ask to other part of the system or compute it back again from some known previous state) or, if the state wasn't so important, just don't care and keep going, which is arguably a wonderful solution as long as the system is operating correctly. 187 | 188 | \subsection{Forget about time} 189 | 190 | Different machines have different clocks, they can be synchronized but it won't last. 191 | 192 | Different clocks tick at different frequencies, the time on one machine is simply not reliable especially if events is necessary to be ordered. 193 | 194 | It is also important to remember that if the machines are far away from each other there is a not negligible lag between the time when you send a message from San Francisco and the time when you receive that same message in London. 195 | 196 | \subsection{Order of Events} 197 | 198 | If it is not possible to rely on time, ordering events becomes harder. The only reliable way to order events is to make all the events pass through the same machine (ideally the same processor), however this doesn't scale very well. 199 | 200 | If it is necessary to order a series of events, a good way is to keep a monotonic counter that can only increase and ask for a new value every time it is needed. Doing so, however, means keeping a state, and a very important one that is not possible to lose. 201 | 202 | \subsection{It is not that bad} 203 | 204 | I have been very catastrophic, but it is never that bad. Most systems have strict requirements about something and more relaxed constraints about something else. 205 | 206 | In the chat system of a video game it is not such a big deal if one message gets lost. It would be nice if all messages would go through, but if one message in a million gets lost, nobody will complain, however such system may need to be up 24/7 and even a couple of minutes of downtime can mean a lot of lost profit. 207 | 208 | On the other side a bank cannot afford to lose any transaction. If a payment needs a second attempt to go through it is annoying but still better than lose the customer's money. 209 | 210 | It is important to understand what part of the system can be little more relaxed and where it is necessary to be extremely robust. A technological system, even if carefully designed, will always be limited, it is the designer's responsibility to make the system achieve the necessary performance. 211 | 212 | \section{Small independent processes} 213 | 214 | One way to build highly scalable, distributed systems is to use a lot of small independent units. 215 | 216 | These units need to be stoppable and resumable at will. 217 | 218 | Each unit will have some responsibility and will be able to keep some sort of state. 219 | 220 | Since we are going to need a lot of those units, creating a new one must be a very light and quick operation and it cannot use much memory, an operating system fork is out of the plate. 221 | 222 | Fortunately a lot of programming languages provide something similar. These units are called process in Erlang/Elixir, tasklets or greenlets in python, Fiber in Java using Quasar or Actor using Akka, goroutines in golang and more. 223 | 224 | I am going to refer to them as ``process'' from now onward. 225 | 226 | The context switch between different processes is extremely low, almost negligible and it is not problematic. Similarly a process without state needs very few bytes of memory. 227 | 228 | This means that a single processor can handle an awful lot of different processes while it can manage -- with reasonable performance -- only a handful of different threads. 229 | 230 | \subsection{Filling a jar with stone or sand?} 231 | 232 | Suppose that your processor is a jar of glass, you want to use as much as possible of it, would you fill it with weird big rocks, threads, or with fine sand, processes? 233 | 234 | It is clear that sand won't leave much empty space, while the rocks will leave a lot of air, unused resource, in the jar. 235 | 236 | If you have a lot of processes and most of them are able to do meaningful work, your CPU will be totally used, yielding good performance. 237 | 238 | \subsection{Performance Bounds} 239 | 240 | There are three main factors that can limit the performance of a system: CPU, RAM \& I/O. 241 | 242 | A system bounded only by one of these is more desirable because easier to scale, either vertically or horizontally. 243 | 244 | If a system is bounded only by its CPU the easiest way to manage bigger loads is to use a faster processor, if the system is bounded only by its memory, buying more RAM is the best solution and if a system is bounded only by the I/O a faster disk, SSD or better network can be used. 245 | 246 | Similarly it is possible to scale horizontally, distribute the computation between more machines to have better use of your CPU or RAM, use a load balancer to accommodate requests if the network is saturating, etc... 247 | 248 | But if a system at its performance peek uses the 70\% of the CPU, the I/O is pretty much free and the RAM is around the 65\%, there is not a clear path to sustain bigger loads. 249 | 250 | Using small processes with just a little bit of attention will make bottlenecks clearer and simpler to spot. 251 | 252 | \subsection{Isolation and message passing} 253 | 254 | All the advantages of using small processes go bust if they share memory. 255 | 256 | If the memory is shared between processes there will be the need for coordination to mutate the variables. Coordination will slow down the execution, hence it is preferable to let every process have it own independent memory. 257 | 258 | Processes cannot share memory, but they usually communicate via messages. 259 | 260 | A message is sent from a process to another and left on the receiver mail box, the receiver will be in charge of looking at its own mail box and take action if necessary. 261 | 262 | Keep in mind that if you need to send some data from a process to another, the data will be copied, a reference to a common shared value will not be used. 263 | 264 | \section{Keep minimum overhead} 265 | 266 | Now that we have understood the advantages that small isolated processes bring, let's look at some basic rules on how to use them and the most common mistakes. 267 | 268 | There is a very simple golden path to follow when building complex systems. 269 | 270 | \begin{enumerate} 271 | \item Make it work 272 | \item Make it right 273 | \item Make it fast 274 | \end{enumerate} 275 | 276 | In order to achieve the great performances required by the modern web, keep testing a system during every iteration is needed, don't have any assumptions about performance and correctness. 277 | 278 | Said so a couple of suggestions: 279 | 280 | \subsection{Avoid single process bottlenecks} 281 | 282 | One of the simplest way to make a system speedup is to get rid of your bottlenecks. If all the processes in the system need to communicate with a single process, in order to coordinate, or to look at some global value, that single process is, or is about to be, a bottleneck. 283 | 284 | The system is to be designed avoiding such bottlenecks as much as possible. 285 | 286 | \subsection{Keep it as simple as possible} 287 | 288 | A lot of languages provide some sort of framework to build applications, in Erlang it would be OTP. They are very helpful to build any meaningful application but they come with some overhead that is not always necessary. 289 | 290 | Both the framework used and the language primitives need to be very well understood so that one can always choose the smallest sufficient element to get the job done. 291 | 292 | \subsection{Don't couple elements together} 293 | 294 | Ideally processes should have a simple and pure API. It means that it should do only one thing and that its output depends only on its input, not on some hidden state. 295 | 296 | This is not always achievable, but the more ``pure processes'' you have the easier will be to reason about your system and the more flexible it will be. 297 | 298 | \end{document} 299 | --------------------------------------------------------------------------------