@gitpagedocs/cli 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,49 @@
1
1
  /** Build route objects for md, html, and video content types */
2
2
 
3
+ /** Title/description styling every content route starts from (key order is part of the output). */
4
+ const ROUTE_TEXT_DEFAULTS = {
5
+ titleCss: "font-size: 1.85rem; font-weight: 700;",
6
+ titleDarkCss: "font-size: 1.85rem; font-weight: 700; color: var(--text);",
7
+ titleLightCss: "font-size: 1.85rem; font-weight: 700; color: var(--text);",
8
+ titlePosition: "center",
9
+ titleIsVisible: true,
10
+ descriptionCss: "font-size: 1.2rem; font-weight: 500;",
11
+ descriptionDarkCss: "font-size: 1.2rem; font-weight: 500; color: var(--text-secondary);",
12
+ descriptionLightCss: "font-size: 1.2rem; font-weight: 500; color: var(--text-secondary);",
13
+ descriptionPosition: "center",
14
+ descriptionIsVisible: true,
15
+ };
16
+
17
+ /** Container frame settings every content route starts from. */
18
+ const ROUTE_FRAME_DEFAULTS = {
19
+ fullscreenEnabled: true,
20
+ marginTop: "",
21
+ marginBottom: "",
22
+ blockLink: true,
23
+ };
24
+
25
+ /** Each default key, taking the option value when it is set. */
26
+ function withDefaults(defaults, options) {
27
+ return Object.fromEntries(
28
+ Object.entries(defaults).map(([key, value]) => [key, options[key] === undefined ? value : options[key]]),
29
+ );
30
+ }
31
+
32
+ /** A single value becomes the same value for every language. */
33
+ function perLanguage(value) {
34
+ return typeof value === "string" ? { pt: value, en: value, es: value } : value;
35
+ }
36
+
37
+ /** Copies only the fields that are set. */
38
+ function assignDefined(target, fields) {
39
+ for (const [key, value] of Object.entries(fields)) {
40
+ if (value !== undefined) target[key] = value;
41
+ }
42
+ return target;
43
+ }
44
+
3
45
  export function buildMdRoute(versionId, routeId, pathByLang, titles, descriptions, options = {}) {
4
46
  const {
5
- titleCss = "font-size: 1.85rem; font-weight: 700;",
6
- titleDarkCss = "font-size: 1.85rem; font-weight: 700; color: var(--text);",
7
- titleLightCss = "font-size: 1.85rem; font-weight: 700; color: var(--text);",
8
- titlePosition = "center",
9
- titleIsVisible = true,
10
- descriptionCss = "font-size: 1.2rem; font-weight: 500;",
11
- descriptionDarkCss = "font-size: 1.2rem; font-weight: 500; color: var(--text-secondary);",
12
- descriptionLightCss = "font-size: 1.2rem; font-weight: 500; color: var(--text-secondary);",
13
- descriptionPosition = "center",
14
- descriptionIsVisible = true,
15
- fullscreenEnabled = true,
16
- marginTop = "",
17
- marginBottom = "",
18
- blockLink = true,
19
47
  container,
20
48
  browseAll = false,
21
49
  RouteguideBrand = true,
@@ -24,26 +52,15 @@ export function buildMdRoute(versionId, routeId, pathByLang, titles, description
24
52
  RouteguideBrandContainerTop = false,
25
53
  audio,
26
54
  authorization,
55
+ hierarchyPage,
27
56
  } = options;
28
57
  const out = {
29
58
  id: routeId,
30
59
  title: titles ?? { pt: "Documentação", en: "Documentation", es: "Documentación" },
31
60
  description: descriptions ?? { pt: "Descrição da página", en: "Page description", es: "Descripción de la página" },
32
- titleCss,
33
- titleDarkCss,
34
- titleLightCss,
35
- titlePosition,
36
- titleIsVisible,
37
- descriptionCss,
38
- descriptionDarkCss,
39
- descriptionLightCss,
40
- descriptionPosition,
41
- descriptionIsVisible,
61
+ ...withDefaults(ROUTE_TEXT_DEFAULTS, options),
42
62
  path: pathByLang,
43
- fullscreenEnabled,
44
- marginTop,
45
- marginBottom,
46
- blockLink,
63
+ ...withDefaults(ROUTE_FRAME_DEFAULTS, options),
47
64
  container,
48
65
  browseAll,
49
66
  RouteguideBrand,
@@ -51,10 +68,7 @@ export function buildMdRoute(versionId, routeId, pathByLang, titles, description
51
68
  RouteguideBrandPosition,
52
69
  RouteguideBrandContainerTop,
53
70
  };
54
- if (container !== undefined) out.container = container;
55
- if (audio !== undefined) out.audio = audio;
56
- if (authorization !== undefined) out.authorization = authorization;
57
- return out;
71
+ return assignDefined(out, { container, audio, authorization, hierarchyPage });
58
72
  }
59
73
 
60
74
  export function buildHtmlRoute(versionId, routeId, pathByLang, titles, descriptions, options = {}) {
@@ -63,62 +77,39 @@ export function buildHtmlRoute(versionId, routeId, pathByLang, titles, descripti
63
77
  }
64
78
 
65
79
  export function buildVideoRoute(versionId, routeId, videoType, pathVideo, titles, descriptions, options = {}) {
66
- const {
67
- titleCss = "font-size: 1.85rem; font-weight: 700;",
68
- titleDarkCss = "font-size: 1.85rem; font-weight: 700; color: var(--text);",
69
- titleLightCss = "font-size: 1.85rem; font-weight: 700; color: var(--text);",
70
- titlePosition = "center",
71
- titleIsVisible = true,
72
- descriptionCss = "font-size: 1.2rem; font-weight: 500;",
73
- descriptionDarkCss = "font-size: 1.2rem; font-weight: 500; color: var(--text-secondary);",
74
- descriptionLightCss = "font-size: 1.2rem; font-weight: 500; color: var(--text-secondary);",
75
- descriptionPosition = "center",
76
- descriptionIsVisible = true,
77
- fullscreenEnabled = true,
78
- marginTop = "",
79
- marginBottom = "",
80
- blockLink = true,
81
- container,
82
- browseAll = false,
83
- authorization,
84
- } = options;
85
- const videoTypeByLang = typeof videoType === "string" ? { pt: videoType, en: videoType, es: videoType } : videoType;
86
- const pathVideoByLang = typeof pathVideo === "string" ? { pt: pathVideo, en: pathVideo, es: pathVideo } : pathVideo;
80
+ const { container, browseAll = false, authorization } = options;
87
81
  const obj = {
88
82
  id: routeId,
89
83
  title: titles ?? { pt: "Vídeo", en: "Video", es: "Vídeo" },
90
84
  description: descriptions ?? { pt: "Descrição do vídeo", en: "Video description", es: "Descripción del vídeo" },
91
- titleCss,
92
- titleDarkCss,
93
- titleLightCss,
94
- titlePosition,
95
- titleIsVisible,
96
- descriptionCss,
97
- descriptionDarkCss,
98
- descriptionLightCss,
99
- descriptionPosition,
100
- descriptionIsVisible,
101
- fullscreenEnabled,
102
- marginTop,
103
- marginBottom,
104
- blockLink,
85
+ ...withDefaults(ROUTE_TEXT_DEFAULTS, options),
86
+ ...withDefaults(ROUTE_FRAME_DEFAULTS, options),
105
87
  browseAll,
106
- video: { videoType: videoTypeByLang, pathVideo: pathVideoByLang },
88
+ video: { videoType: perLanguage(videoType), pathVideo: perLanguage(pathVideo) },
107
89
  };
108
- if (container !== undefined) obj.container = container;
109
- if (authorization !== undefined) obj.authorization = authorization;
110
- return obj;
90
+ return assignDefined(obj, { container, authorization });
111
91
  }
112
92
 
113
93
  export function buildAudioRoute(versionId, routeId, audioType, pathAudio, titles, descriptions, options = {}) {
114
94
  const base = buildVideoRoute(versionId, routeId, audioType, pathAudio, titles, descriptions, options);
115
- const audioTypeByLang = typeof audioType === "string" ? { pt: audioType, en: audioType, es: audioType } : audioType;
116
- const pathAudioByLang = typeof pathAudio === "string" ? { pt: pathAudio, en: pathAudio, es: pathAudio } : pathAudio;
117
95
  const { video, ...rest } = base;
118
96
  return {
119
97
  ...rest,
120
- audio: { audioType: audioTypeByLang, pathAudio: pathAudioByLang },
98
+ audio: { audioType: perLanguage(audioType), pathAudio: perLanguage(pathAudio) },
99
+ };
100
+ }
101
+
102
+ export function buildPdfRoute(meta, pathPdf, options = {}) {
103
+ const { container, authorization, pdf } = options;
104
+ const route = {
105
+ id: meta.id,
106
+ title: meta.titles,
107
+ description: meta.descriptions,
108
+ ...withDefaults(ROUTE_TEXT_DEFAULTS, options),
109
+ ...withDefaults(ROUTE_FRAME_DEFAULTS, options),
110
+ pdf: { pathPdf: perLanguage(pathPdf), ...pdf },
121
111
  };
112
+ return assignDefined(route, { container, authorization });
122
113
  }
123
114
 
124
115
  export function buildSourceViewerRoute(routeId, sourceViewerPath, titles, descriptions, options = {}) {
@@ -5,6 +5,7 @@ import {
5
5
  VIDEO_IDS,
6
6
  AUDIO_IDS,
7
7
  PAGE2_AUDIO,
8
+ PDF_GUIDE_FILENAME,
8
9
  } from "../data/path-mappings.mjs";
9
10
  import {
10
11
  ROUTE_META_ID1,
@@ -13,15 +14,18 @@ import {
13
14
  ROUTE_META_ID4,
14
15
  ROUTE_META_ID5,
15
16
  ROUTE_META_ID6,
17
+ REFERENCE_ROUTE_METAS,
16
18
  VIDEO_META_ID1,
17
19
  VIDEO_META_ID2,
18
20
  VIDEO_META_ID3,
19
21
  VIDEO_META_ID4,
20
22
  AUDIO_META_ID12,
23
+ PDF_GUIDE_META,
21
24
  SOURCE_VIEWER_META,
22
25
  DEFAULT_HIERARCHY,
26
+ VIDEO_FIRST_HIERARCHY,
23
27
  } from "../data/route-metas.mjs";
24
- import { buildAudioRoute, buildMdRoute, buildSourceViewerRoute, buildVideoRoute } from "./route-builders.mjs";
28
+ import { buildAudioRoute, buildMdRoute, buildPdfRoute, buildSourceViewerRoute, buildVideoRoute } from "./route-builders.mjs";
25
29
  import { resolveSourceViewerPath } from "./project-links.mjs";
26
30
 
27
31
  /** Demo route protections showcasing the "Authorized Routes" feature. They are
@@ -35,6 +39,14 @@ const VIDEO_ROUTE_AUTHORIZATION = {
35
39
  requireExternalAuth: true,
36
40
  allowedProviders: EXTERNAL_AUTH_PROVIDERS,
37
41
  };
42
+ /** Video route left open so the scaffold always shows a playable video (GitHub's introduction to Git). */
43
+ const PUBLIC_VIDEO_ROUTE_ID = 11;
44
+ /** Video routes follow the six markdown pages and the source viewer (ids 8-11). */
45
+ const VIDEO_ROUTE_ID_OFFSET = 7;
46
+ /** Markdown page that also shows the public video, in a video container above its text. */
47
+ const VIDEO_PAGE_ROUTE_ID = 5;
48
+ /** VIDEO_IDS / VIDEO_METAS entry of the public video (GitHub's introduction to Git). */
49
+ const PUBLIC_VIDEO_INDEX = PUBLIC_VIDEO_ROUTE_ID - VIDEO_ROUTE_ID_OFFSET;
38
50
 
39
51
  const ROUTE_METAS = {
40
52
  1: ROUTE_META_ID1,
@@ -43,12 +55,14 @@ const ROUTE_METAS = {
43
55
  4: ROUTE_META_ID4,
44
56
  5: ROUTE_META_ID5,
45
57
  6: ROUTE_META_ID6,
58
+ ...REFERENCE_ROUTE_METAS,
46
59
  };
60
+ const MARKDOWN_ROUTE_IDS = Object.keys(ROUTE_PATHS).map(Number);
47
61
  const VIDEO_METAS = { 1: VIDEO_META_ID1, 2: VIDEO_META_ID2, 3: VIDEO_META_ID3, 4: VIDEO_META_ID4 };
48
62
 
49
63
  function buildVersionMdRoutes(versionId, includeDemoAuthorization) {
50
64
  const base = `gitpagedocs/docs/versions/${versionId}`;
51
- return [1, 2, 3, 4, 5, 6].map((id) => {
65
+ return MARKDOWN_ROUTE_IDS.map((id) => {
52
66
  const paths = ROUTE_PATHS[id];
53
67
  const meta = ROUTE_METAS[id];
54
68
  const pathByLang = {
@@ -58,6 +72,7 @@ function buildVersionMdRoutes(versionId, includeDemoAuthorization) {
58
72
  };
59
73
  const routeOptions = {
60
74
  ...(id === 2 ? { audio: PAGE2_AUDIO } : {}),
75
+ ...(id === VIDEO_PAGE_ROUTE_ID ? { hierarchyPage: VIDEO_FIRST_HIERARCHY } : {}),
61
76
  ...(includeDemoAuthorization && id === 3
62
77
  ? { authorization: { requiredRoles: [MAINTAINER_ROLE] } }
63
78
  : {}),
@@ -76,18 +91,33 @@ function buildVersionMdRoutes(versionId, includeDemoAuthorization) {
76
91
  });
77
92
  }
78
93
 
94
+ /** Video container shown on the markdown page VIDEO_PAGE_ROUTE_ID (no menu entry of its own). */
95
+ function buildPageVideoRoute(versionId) {
96
+ return buildVideoRoute(
97
+ versionId,
98
+ VIDEO_PAGE_ROUTE_ID,
99
+ "youtube",
100
+ VIDEO_IDS[PUBLIC_VIDEO_INDEX - 1],
101
+ VIDEO_METAS[PUBLIC_VIDEO_INDEX].title,
102
+ VIDEO_METAS[PUBLIC_VIDEO_INDEX].description,
103
+ );
104
+ }
105
+
79
106
  function buildVersionVideoRoutes(versionId, includeDemoAuthorization) {
80
- return [1, 2, 3, 4].map((id) =>
81
- buildVideoRoute(
107
+ const menuVideoRoutes = [1, 2, 3, 4].map((id) => {
108
+ const routeId = id + VIDEO_ROUTE_ID_OFFSET;
109
+ const isGuarded = includeDemoAuthorization && routeId !== PUBLIC_VIDEO_ROUTE_ID;
110
+ return buildVideoRoute(
82
111
  versionId,
83
- id + 7,
112
+ routeId,
84
113
  "youtube",
85
114
  VIDEO_IDS[id - 1],
86
115
  VIDEO_METAS[id].title,
87
116
  VIDEO_METAS[id].description,
88
- includeDemoAuthorization ? { authorization: VIDEO_ROUTE_AUTHORIZATION } : {},
89
- )
90
- );
117
+ isGuarded ? { authorization: VIDEO_ROUTE_AUTHORIZATION } : {},
118
+ );
119
+ });
120
+ return [buildPageVideoRoute(versionId), ...menuVideoRoutes];
91
121
  }
92
122
 
93
123
  function buildVersionAudioRoutes(versionId) {
@@ -116,18 +146,21 @@ function buildVersionSourceViewerRoutes(options = {}) {
116
146
 
117
147
  function buildVersionMenus(versionId) {
118
148
  const base = `gitpagedocs/docs/versions/${versionId}`;
119
- const menuMd = [1, 2, 3, 4, 5, 6].map((id) => ({
149
+ const menuMd = MARKDOWN_ROUTE_IDS.map((id) => ({
120
150
  id,
121
151
  pt: { title: ROUTE_METAS[id].titles.pt, "path-click": `${base}/pt/${ROUTE_PATHS[id].pt}` },
122
152
  en: { title: ROUTE_METAS[id].titles.en, "path-click": `${base}/en/${ROUTE_PATHS[id].en}` },
123
153
  es: { title: ROUTE_METAS[id].titles.es, "path-click": `${base}/es/${ROUTE_PATHS[id].es}` },
124
154
  }));
125
- const menuVideo = [1, 2, 3, 4].map((id) => ({
126
- id: id + 7,
127
- pt: { title: `${VIDEO_METAS[id].title.pt.slice(0, 40)}...`, "path-click": `page:${id + 7}` },
128
- en: { title: `${VIDEO_METAS[id].title.en.slice(0, 40)}...`, "path-click": `page:${id + 7}` },
129
- es: { title: `${VIDEO_METAS[id].title.es.slice(0, 40)}...`, "path-click": `page:${id + 7}` },
130
- }));
155
+ const menuVideo = [1, 2, 3, 4].map((id) => {
156
+ const routeId = id + VIDEO_ROUTE_ID_OFFSET;
157
+ return {
158
+ id: routeId,
159
+ pt: { title: `${VIDEO_METAS[id].title.pt.slice(0, 40)}...`, "path-click": `page:${routeId}` },
160
+ en: { title: `${VIDEO_METAS[id].title.en.slice(0, 40)}...`, "path-click": `page:${routeId}` },
161
+ es: { title: `${VIDEO_METAS[id].title.es.slice(0, 40)}...`, "path-click": `page:${routeId}` },
162
+ };
163
+ });
131
164
  const menuAudio = [
132
165
  {
133
166
  id: AUDIO_META_ID12.id,
@@ -144,7 +177,13 @@ function buildVersionMenus(versionId) {
144
177
  es: { title: SOURCE_VIEWER_META.titles.es, "path-click": `page:${SOURCE_VIEWER_META.id}` },
145
178
  },
146
179
  ];
147
- return { md: menuMd, sourceViewer: menuSourceViewer, html: [], video: menuVideo, audio: menuAudio };
180
+ const menuPdf = [{
181
+ id: PDF_GUIDE_META.id,
182
+ pt: { title: PDF_GUIDE_META.titles.pt, "path-click": `page:${PDF_GUIDE_META.id}` },
183
+ en: { title: PDF_GUIDE_META.titles.en, "path-click": `page:${PDF_GUIDE_META.id}` },
184
+ es: { title: PDF_GUIDE_META.titles.es, "path-click": `page:${PDF_GUIDE_META.id}` },
185
+ }];
186
+ return { md: menuMd, sourceViewer: menuSourceViewer, html: [], video: menuVideo, audio: menuAudio, pdf: menuPdf };
148
187
  }
149
188
 
150
189
  /**
@@ -175,11 +214,13 @@ export function buildVersionConfig(versionId, options = {}) {
175
214
  "routes-html": [],
176
215
  "routes-video": buildVersionVideoRoutes(versionId, includeDemoAuthorization),
177
216
  "routes-audio": buildVersionAudioRoutes(versionId),
217
+ "routes-pdf": [buildPdfRoute(PDF_GUIDE_META, `gitpagedocs/docs/versions/${versionId}/en/${PDF_GUIDE_FILENAME}`)],
178
218
  "menus-header-md": menus.md,
179
219
  "menus-header-source-viewer": menus.sourceViewer,
180
220
  "menus-header-html": menus.html,
181
221
  "menus-header-video": menus.video,
182
222
  "menus-header-audio": menus.audio,
223
+ "menus-header-pdf": menus.pdf,
183
224
  hierarchyPage: DEFAULT_HIERARCHY,
184
225
  hierarchyMenu: DEFAULT_HIERARCHY,
185
226
  };
@@ -0,0 +1,245 @@
1
+ %PDF-1.4
2
+ %���� ReportLab Generated PDF document (opensource)
3
+ 1 0 obj
4
+ <<
5
+ /F1 2 0 R /F2 3 0 R /F3 5 0 R
6
+ >>
7
+ endobj
8
+ 2 0 obj
9
+ <<
10
+ /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
11
+ >>
12
+ endobj
13
+ 3 0 obj
14
+ <<
15
+ /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
16
+ >>
17
+ endobj
18
+ 4 0 obj
19
+ <<
20
+ /Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
21
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
22
+ >> /Rotate 0 /Trans <<
23
+
24
+ >>
25
+ /Type /Page
26
+ >>
27
+ endobj
28
+ 5 0 obj
29
+ <<
30
+ /BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
31
+ >>
32
+ endobj
33
+ 6 0 obj
34
+ <<
35
+ /Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
36
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
37
+ >> /Rotate 0 /Trans <<
38
+
39
+ >>
40
+ /Type /Page
41
+ >>
42
+ endobj
43
+ 7 0 obj
44
+ <<
45
+ /Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
46
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
47
+ >> /Rotate 0 /Trans <<
48
+
49
+ >>
50
+ /Type /Page
51
+ >>
52
+ endobj
53
+ 8 0 obj
54
+ <<
55
+ /Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
56
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
57
+ >> /Rotate 0 /Trans <<
58
+
59
+ >>
60
+ /Type /Page
61
+ >>
62
+ endobj
63
+ 9 0 obj
64
+ <<
65
+ /Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
66
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
67
+ >> /Rotate 0 /Trans <<
68
+
69
+ >>
70
+ /Type /Page
71
+ >>
72
+ endobj
73
+ 10 0 obj
74
+ <<
75
+ /Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
76
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
77
+ >> /Rotate 0 /Trans <<
78
+
79
+ >>
80
+ /Type /Page
81
+ >>
82
+ endobj
83
+ 11 0 obj
84
+ <<
85
+ /Contents 26 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
86
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
87
+ >> /Rotate 0 /Trans <<
88
+
89
+ >>
90
+ /Type /Page
91
+ >>
92
+ endobj
93
+ 12 0 obj
94
+ <<
95
+ /A <<
96
+ /S /URI /Type /Action /URI (https://github.com/Vidigal-code/git-page-docs)
97
+ >> /Border [ 0 0 0 ] /Rect [ 64 189.7898 206.82 201.7898 ] /Subtype /Link /Type /Annot
98
+ >>
99
+ endobj
100
+ 13 0 obj
101
+ <<
102
+ /A <<
103
+ /S /URI /Type /Action /URI (https://vidigal-code.github.io/git-page-docs/)
104
+ >> /Border [ 0 0 0 ] /Rect [ 64 175.7898 201.27 187.7898 ] /Subtype /Link /Type /Annot
105
+ >>
106
+ endobj
107
+ 14 0 obj
108
+ <<
109
+ /A <<
110
+ /S /URI /Type /Action /URI (https://github.com/Vidigal-code/git-page-docs/tree/main/gitpagedocs/docs/versions/0.0.9/en)
111
+ >> /Border [ 0 0 0 ] /Rect [ 64 161.7898 226.83 173.7898 ] /Subtype /Link /Type /Annot
112
+ >>
113
+ endobj
114
+ 15 0 obj
115
+ <<
116
+ /A <<
117
+ /S /URI /Type /Action /URI (https://github.com/Vidigal-code/git-page-docs/blob/main/mcp/README.md)
118
+ >> /Border [ 0 0 0 ] /Rect [ 64 147.7898 236.84 159.7898 ] /Subtype /Link /Type /Annot
119
+ >>
120
+ endobj
121
+ 16 0 obj
122
+ <<
123
+ /Annots [ 12 0 R 13 0 R 14 0 R 15 0 R ] /Contents 27 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
124
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
125
+ >> /Rotate 0
126
+ /Trans <<
127
+
128
+ >> /Type /Page
129
+ >>
130
+ endobj
131
+ 17 0 obj
132
+ <<
133
+ /PageMode /UseNone /Pages 19 0 R /Type /Catalog
134
+ >>
135
+ endobj
136
+ 18 0 obj
137
+ <<
138
+ /Author (GitPageDocs) /CreationDate (D:20261017071740-03'00') /Creator (GitPageDocs) /Keywords () /ModDate (D:20261017071740-03'00') /Producer (ReportLab PDF Library - \(opensource\))
139
+ /Subject (English project guide and PDF container example, version 0.0.9) /Title (GitPageDocs Project Guide) /Trapped /False
140
+ >>
141
+ endobj
142
+ 19 0 obj
143
+ <<
144
+ /Count 8 /Kids [ 4 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 16 0 R ] /Type /Pages
145
+ >>
146
+ endobj
147
+ 20 0 obj
148
+ <<
149
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 2001
150
+ >>
151
+ stream
152
+ Gatm<939k;']/F3maB3sKI#m:Y#5<H3KOg3VOMDAdb#>V)L!Gmkin/sGP/78N@9eEJ4?<%qtTT#`Zc)2<qS]2&H+Mbj"lTES*!AL*5eKG"eEr"r]Dr0ch8BG%*K#4,/\SOdg\mPN\YD\XO%6)0H`;r%GQ(iZ>J$QQEQ?C17U$PB-A.q2=k[ohW"aP9b'2.C*R\gd'Un#RQY)mkP?0FgjgB"2WW0]RL.hKqKgYI*O+%eiAEq@1YZq5ODmGjiY[]2+.q4rK@Qn1RPU/i)k*9E`KaQIG:Lalr[.IgFe1!pB:).jc(&CH1s+@QBRW>?f?C!cBP&37m<^EFX1.F'&8]sD%f*hA.irQsi?1BK_C!&!_;d>@_TFJe<cE)%rV>L<adgY+s7#H@Nlg'hpkYa_#!J9!e7ThdT34jQRFiR%H.q2'86%d?l/YI;)]9B4?7)os'ZG-#UqPMtD`O*Z@AQ/TQQ)>-U0noTCJdp%`LT\D\ke2@4fD8rVm\'N$Dei'6&B2S:Em]FnIIH7rP7CT+htj#:^`#&1$a(`"FEdG/YXGG6qSuLJdOr/b*L/Le4I*;67NRW5U),#>;"R)piTN47?V+Z@V<?O?DUL0ohM!uI%B>?p$Re.&8A:tKVWskDjd?t+ZA'hEM[b7T7P^eXHl5H66quKP[oJKE>ck86b;SFr@ho^4b=ROW!ipa[Z11BGmD^e+kEf+rXX?9hEcM]_`jDkTg^-r8,1-!&@Br%6V3Eh>pAa62J<T*:G+h-"G?9:f#[M*[P"<`,/8<`@SK)/+,+\:F)AB8]VJ`4AJPCD$Aj2^WIc@k%o^=^U:r8s`8]oYfi5"m[B=\PjYDZ*O`mgL^>B7pQL_H10Qa!&iaaR6>EGSlghrB0C@8/7MpC?U(!Dh:=G\+'+i"I#WKb+m/l/Xa^Zmf?;T!>USRiT'79IVPK%pub81G[PG]gT,@_"BWIRnBh6!$GK[l.pGJ9G"c>#tCuDg7s_Zu4:;Y1JKW-P`qK(G4Bh@Ckq=n[TA12HKS*Phs_>0;c\%YGNSf35Hh0&rS"e[(=T<N3O243QJ5D\pQTmG94]2e4UCqVi:es6?`RJ5)Hm^KeO>H/[3:2m".SKq$VW[:!9%?C/cBo+giJ`j@\Z)@WoS52U^]!JX9U:YY[[,aFTVH9n`KR[l+9LK8@);#`,%9H(d.C@h:E&3+G3#:_+/s9k8/ZT.6e%71siDj\Zpf!FT@[Vdl.(DDXc_M+VTEpatC@XXP]ecun%]KFKsAk@)!&/*7sfh?]L^5mcT_pG?SF_)Dfo.6MN%c4I1Do.\lod>KbOj(S[C>?Nr#:0ZDrML(hPGnJISA_TqKQk0&O8,V0O[E4.rpN7C^\6%f\as6><Gnpj(4c)HdLHJee@F3;fc'2AUHo[;:rE]AOr5k@dcl.;Qnu@&r%VPH>;e^ON$OVj]ecge>H$Os\?g(f$h&+-nVQY^#`Gh4_Kc-O7cp]e:b,'M4;*Eiu0eJSgG);pE0pBu33[rF>Q$Trh=?&C$!6D5C7$eY+@8KF%Gg2'T#qqKfZ)]1aWmS7oF]5b7,L*3.\2%1K.*gcO$SM'G#="0e-nJ.44e$uflCe1dPpgc\?q;+`_RH4;Q,RqK@j'_3M<k#R1u)8n_<n>(EuVL";eeD#[d6_47BSp":'B?>Bup!qm2IEeGX1<\[Yij+1e-HD7fbeG/lT-L;i9Zp<=cK9nB&'u4mYqJKDLXm,CJ\c:X+ud#5''l)jfSq5BEj97?Ve'?=sP2A!?!"2iXRl5QCd:dJ@q]5@t:FOP;_$fl=&RiZBU'?Ro-`7hI>>&gu;pd@'YTgD7884a>Jb,8O<;ZP[hkB"-@HXnCGFrbc:;Zq%GIfq\=YgLIe#VqN38%f8E1J%C)>I1<Xh5N#u)G>(clK]2j*\W!NU)k&:u.:(oN?EQnBl'3^3DFK<U?.R_cX;$''YO>ETRfs,-62*FZf@kphc\Tdfl0_h(mA1Hch*>!='[B0qQ*=U3X+]-TWQ1=&UON9QR\RI~>endstream
153
+ endobj
154
+ 21 0 obj
155
+ <<
156
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 2056
157
+ >>
158
+ stream
159
+ Gatm;mrRNt&cM.4@_[$)bubZOOWo)LdPU.!?KP-IZCI>1lG+YjiJo*a!jp7@rpbCErfH3IPtN?9,Z,\8[s7cc],QimGMp4,/^ZeK1jp0:&CPSf60(JAr(,G_MuR%,r]ElKR(QguiekB&9)LZDApmNbEZ/IpRV""f=mUi64Jsm/7agS6$_P'[9Dr!_?6%1P0^e'kl+s0OUAej[NMF].a\2Lk=Z:!`*cp>*U565lc]Sb@s%9l7kfllUlHGal7XMHqM!%ka_EorsMro71%$(]\^NHV<o4bb3bP009MR@i4F$oS,U0hG@PfE,RhojfrFgWieg&.,$T4n$@@iR*X$b\Ajk/25u_.,]^_;VqM6qQB^)pc"'nKL7($i;%O$VoT5PW?M&G_;?lMjkflIot.rq[[VKBhJ@Zi,csn4+KHPbp2.k!"S1N4:</"HYLT(d9'PAJt/a\+_3:e(SL[ONVN5oDr?h&Qr'L6WR,)1)bL(XL%IPH$@U>3<H9H+O$6MsV(B`+,lR6&"0'FK2R:n'=ku3fDPJqsd!<6gPnfU5qP7?LM9;"3PW)KBkn3hhap^ACXJ@CXJ_@?'>]7*o>#h[B\S`Kk#5IpOT(LA&TgL`f)U*GN,10T-`M*O@U'qoRgY+_\<h+JE:Y&lj)nFB+(;L9dU(Q;L08/])UMn^P6P+L5>,llVC-&@A'-eR[Ul^Z0pU.:a9E[FhR[7d(qt^[@gr#XS:K1n:,BBh+,mO"EOq%A9F2.MErS@,J,><DBYdhE\\biVD=oA,B'[6Mhh"%r?@hueWO!T1fQ7tkFkHo#h"mt<;f1dku.pWoeNQ!J3;/&,?,1t._.4pc2^K=O*W9[@Ch.1>.Za<2Z&-6Q7_Hppt/``[i4"%g1X]?]J+:M'<Q9d6,,Y]k3"i.$2>:daq_!:\khARe4r<DB],b!$_3$.UoY?Y-Z[;Hprd7HL?8UNekmiO8oUbeWN2&f\(WDYLUA^@!#S7T#oIqFWAa_#U-FcKi,NQ-V`i1Q$lN$`@6T-sEiflc60E(iP"'Q+%no#F]C%AGjD6&".-\tK,_Fs`TbJO8G`8GIe:s#eY*/3B[n_n%nB`Np]E+l)jS@tgC&>2__`iDm3_2W%&a.+j/kWX94?AIoSQpg]Xuc0I].CA`/Ji/jC*^rYbS<mCdC;<OZqZ0VtGQ,l7JD4%(W,V/&J/#o_`E9'RMY"o[nT#4u(D=akb5oK@9Z?YpQl?u[j3'?heq\jQ1Fd:PM%5k`)X;[Va/Uko5Y[#s3'lkVSddH]`o>\fa:3e*t!1[R1($#,B@jSP8$?8t[fLZEI4Iq$i5*;[?9eVk7Ri\A&Kljlgn]8>&*DS6KW5g'jN)X)s_^SrL/_4\_B;;0Oja'O.]r,kV-g@1o031_sb\2JR:sX]:;fai3-$>$a8bQnt._$0lG(V9BH`W9u(TdKGT22@'))%jmQNZ=Kh$g2I^>_o-NM>(n7r^DHqW"p]rn7+K+2l,P#*<^2(W2Wt&,C,(k80;*\hD'phho`W9"]k88mQZ;<*[&-W[5M5oTDFE%S*K7^K_79A!E=kP-hL&2K,HkN,72Q%jg0+(KIEA-mq%O%3D.G*%-,5H2'=Q9O?)nc2A*2RS`(;&ZF]_g_YqBE=op"oP_%(+=]TsNHP.9MY#FMkAZ`Im$snm53S;I(eD?:`4NhYIM*C0d;8?Zr;k+XZ9u16G5[ObNnfB6_0Y.EN"f"#nVA-p@>Ac3aCf/7SP7@eodtB7FGC5#p1CQLqDqbBW^^&"eWnI(Dpk4Ch/Fl73mZPaal6j-*;\=hRK'J'^W5J5"Q`n_S3dUXj8eRLXfcg4]].Ld?@(G>F9r+jhCH/nEpq[SDFBJZB'<d>YA7<\!c>*eV4`uql!sNgbIbDa[Cnop>`3?q<]%9La>/b#V(nKu=lt'DU+>6>SLVtfm41A*_(j(^fbJj^k(YBjaMO_/c=(XXkW$>c*MAJ7A7eY<\(''c]s*IG\hq_Ll9isq4u6=3ltkjp1J]Dh[gqG#J>HSQr+iNR?@Qgur5'b/8,3-2C@Rrh8&i8Ugn9O-DbpWR8jAXg?2P5R.k*a~>endstream
160
+ endobj
161
+ 22 0 obj
162
+ <<
163
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 1826
164
+ >>
165
+ stream
166
+ Gatm:D/\/e&H88.EA0'hh&KS$[aYchRO/NU-#4F2qm,Vl/^Y289%6DS=gn"<mmpTem%nU/ecu%=h(.s)kKX/Ghk'd?97ZU[9]dC@4tP=DKh_osCUdW@r-mY8;h#QPi-<]fIt?X81H.okjsLlna'RcDE=tX'7#jKiVVq=o.BL9IEPVsFfF8I4+to>Z;6(AM"/QRGXgAa3@H..A`*8e.e[`:YSLB4HKG("eeiLWs*#9pVY[\>hi_6gI4+Zih;`#)\+UlBtVtc\upSd"e;b*=.$d0/XYF*$M3P?!'!r*_m(Fg.5R%<7uM*8DNEm@YS"IALaq5s0A1_f^[m*DQ"\R6QR)K2jDRt`Vd\S^>?M%:Z@TRgMf0*_q]jut'!/qHU`o_._'O-_McE:rAT`?e3nh04,-dSC'"O&U2HER[#BVoEf9=jII-RoD=K0N)IY9<)[%M8m.g(;Y).$mY6Co0Udk/.Tr!A&WF2nCnKcP\pk$)o?[;7,!lr?eB11<=f=kejL-F6&J.@0qr%XWSj;D7U3c58>%4[n?C>S"nY/VT0es*]+e#*BOj`]2N6Kk3JKkeHjgs[;)&:'A5'A`B57`lTd?Jt\KI&83=r,$8FZ0O;GpX6P-%D/A]$C+3UPVqc;n2Gn!*tYUQW^*GVD[AN+sh8<hX55:p<8/A4G[eS`GdPm6K+^Rq)G?/++B/9GmaV2"mRr[D7YF[N[%,e`TS-"f7;t,jLck./!o&pL-9DT%](j&Fa]#_!)e,5rC1Y'F?(&&/?/,+$^4HLn%H2:V;%m7P8Mn9Ed5P1oi0dYQ3"]`t((pJntjIJ<mTlkc7\s?(@a]V=,G7(+J3UFpg(:KgKtiRVBM'P@!Jk1`3-i'>ZRN*-cC3bu!+b>(i'qish.>1N?b2UNPMg@_RP?`^gJ]"CY6\6>?nEVq/ZJp[&d?g@$*nEaBLq/&`3%_Sj-"3VIXIql[#>I[8A"j5R.NqC%rPl)pc<ge*HlPXK;Uh-sT;2YD=_(2#qVl^m:H]Jm.H4Y%pH@%W_;kUHH+=!'!/Lm]L6ou=m:>2eF:%*ra,n9B'*?sB\Z(e2+]RIegN?_N,'U!%k"$`]]m5SXc'k=h?H+cE=VrR`lmRb2U9U"(Edg>9Hi7,mSoR-L9f&&/SQIcu:MNrM7e6Jqeb*:1Y*E\QV^MJ;>mJC)LQ^h#r8*-$r9[O)tkDIErh:A!D9E8YB7@<kN&#/VW[WPZ(m..SK'i&L2:AB2ceUke?+@:O"e!MSC.++!BZWi*b0O:@B2.o>076qjJ`.9FSA.tPpl[I$iK@J'6TU92J,+TdR9]Fe)'Fsq#q(l-WD?K%@2+>RKZbtZ)u(pK5oM.o6;Z?1-7MQ26PB91G<4)4MkkQ5P6+hXLfc]C,0(+eM(GYj3gR\joGdK/h/3`t:rO]B\do!pTr7^=5M6*K!;Z!]AUU+jVj#\)Uk!"<5-N&lt$Du(2fYbZd4G3TI<E:1L^Xr83bimH.Nk_F`LIPGh3\EJ?o3LP`^J-STJ)l0982k%c@OsXWO0`K%.O!6GrOrNDLZNW45`s=lq&aVBSncftK6-YQ=jJVBMENu6nAe5jABA5CIMl)pf<?,21j)V)96q0CPi?k$QS?#Ue*"YIMrA]RYERIqQMu315PLQrHi`WA>@FEM%37_8>"iIQmloRt]+-O(eKk]iRg)P?;Rj-ieTof2lB'0p"!dh^ZA=oDU]k2P`ET*QQ6f)[E(1kOQ"t+8O^<i$mpCf0f\5B&]L:='6ap\e7S<B\O(2ogQ-maV"rO>.>0l-sd"g*kSeA.]9c4IS?\[M4(>KUSJUI&S5-b+l_+X&d(mLD8]:At:"`$?f~>endstream
167
+ endobj
168
+ 23 0 obj
169
+ <<
170
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 1859
171
+ >>
172
+ stream
173
+ GatU3;01G\&:XAWfO:X5Ugjm+80F(n-H<#H8OI@CQb!]_FPog1SU,L3\7tqhG>Aj-e7RJ=Ns/($]6iH0mHtQQJ:F9-AfH8e$Q*3)&4Wm+5o?pF(2mTh3;`$#"lj8/-c!T=MP#DfnK^Z&@+Jrt(T65VV<KgjA=B`9P)LQA^^+'@GSU:;VeIiR!_^DX,YI>ZES=P06ekeM1l8+r">"E@9^=RfYAm:"66*lIP0p'8K&6pF3G[&<.I/E%2bC>Q'II=3&YgRELW*bN9di+V#b.rkcVX\#%J4"#2s4srTed)G&&@YN=K-:a/7;D+B;X76[!0i(nGsCi;N.cR;8gmr12bpe*OFW7_:EKD_djD0)p^G;i'DlSNWTCh*=a_IR!N(.[))b>qV<g2<ss9Orp!qs6O8\SIN:24G!_d.o-eS+#*-\;Gng+rn#ZS6-S<Oq/qI6b@!(MKWUSqidL@:Yk_3Gt8K-(T6d4J<>/s-%#.5Y'r5G3,nVM2,![T)];TPuU1`WTn/!7[g.3/3-[cYpH4c)P"L)lIDC%MXm\\Yk?\R9!_@R.XZhs<9X^kM;<RUY=uoG[i+NFuM4P%(JQ,);H2)rO/9^_e4[.OWGtBDA!tFbKk`$Rg,:$i)_bj*D(PISUGi<L/?WRoYd/E$pNiej^/ul@X=.l2OZ.Sk+GEJXh$/Dkn&!*UXqgZ/SdBlmWF.1grZ`o7sjg.r@3"3K_WBmAESaF]^"IWXC]n=Y8hY'$tt8TA(@^!'R%NZ4K%QG,>o8h++:R>:Fa%a";>F;haB0#npSOFesO%]*2O_S*d>l4C6'"HpHb><K0<QUUV&m]Q0qrJVBso7fnE;jhcO:`_]o16I3#BaYis'[Armml<FY`.Vu(hjWL+2ABD13)94*6Zq"$[0CN*o0Xt#kgrd:hL%jeHgj7Xh/1X)n_%`U%_+.[0c=+c#_E"UHQCX7=3:;=kXV,N@F:CQjog@W*mVjZR#TI7Fh.dEIdA(`b!?9Ogro6Q#P#N3VNhkm7.g5+/<0-L]H/5%,G:0of,71j*HLU%+$N<s[FHa>Kq#_/#FoB"%Z?PC'.&3\>k*'QOC"8'f&!d"S@=<&=<+Q;YJn*IrR0/Mqk5uN]E,],N4NIktI3^U8l?P5O*@:<%hnZSA?@,K:)l)W5C%t_r[:l!tVMdbt23&nPqZ>RpQ,j?S2(7k]]N#_(TIOM@JR^'G.\+=NH/=rh*fG(^4SP>?=sjHWM)Z_op0(9Zj<Cchcrqi+][(aro>2UbpR"r]<&q*p7d2qW[;ja.U@cRp:!$DuN7C-ddO*PeV@pl.%^P!G<9CT=c_4@<cg4D2l>!66LM?Yq`5^gBM/BQ6<ph_Rf5jO(STEF-2*%RP9WakSZ^#<KB_Wm_Q:UP,?5@hnN>0_DO%QW5H=q5dOF(D<pT,$_$(^a.'O8"l2kmTA]LIdEpPt7hn$"Q]%OoWJnKh#.eer3If2CSOG^o[H_+Tb3kt[$tU*Q)cfom:jm@[brV(`j&]l%ccYMNRBgchdb=Q1"ZJc+O48D+D``b8j:bmh^I>A<3)W,_<2(:sTY=H>YMNo/TDNji7/e5mJl84t&uaWb1R#n\En5OshR(7\"A+#tk5A-%%9n1a3u!>`IBIDfPq+&D`a&n&=Z8ZRr;5-Ff:1m/,=H;(5"*d%:j+7cpIr(?'R<_H*t8/\@oSO?cq*biDk5H05Ag=#s`Z<558hXdF]M#aVHPn.YC_`a$%.&d'I!qOusncG3Gl-bj=d+tS)cJ/?2=NjVorr!%ddV'9R,O.UX/TFmr_^oY]>tmT?d16qokqJjE!/[MT,tMbA<i.P8Ib7Uq?C+,SGcibF29&moY8g@iADP1RHhDOdm_0BBo*]42!qmC$Q2~>endstream
174
+ endobj
175
+ 24 0 obj
176
+ <<
177
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 1772
178
+ >>
179
+ stream
180
+ Gatm;gN)%,&:O:Sm!,B`DF[0@^U-dSChM0SM&WM[1JEBEC6Ds*:pQtC^NZ$?-sEn+1oWU78-4-&B,>U)_*>EDAi7Ab96bIDK'U7Y!&n9d/:W5OjiO,Bb_`tl#_BN`Jp5#C+EkU9o]i5<iP\GnP,&D;BumqHN55$M$Ri_NEI\4,iqOt,d.Lm%*+XY3-58^!mUf$-UlG[2).h5^k5?fp#nmRGW$1fn_$E5)E-j@OSWMGPMajV4n$uk[.KWS&m][hN:JBnJ^`>d4S\>3L)U;Y\Hc&qE;Ip'jDh&?b)lYMPk-24BF4I?AC!(@&q$/Ic,9(\m^;gj>Ncs^)fsY6BK=cP/!-.?6JS-hm4IMk1@L&*L$=@%bOS3he.DW9Zp[<RBHF\]1^V.@oJf!?-2L&o`94oT4<:c72E+dg]aKk:.Q7nn-=_C-_2<25`<ZiGeTquEXEQj1dNW)l/PBAhJj%ase57>k6L,Ys1"Oq0\&%9uf>F"t8+@crXd9(:kKL_R?P'LMAT0AVR-Vaa>IL7k@ptjpJElAp+dee2^GsQXpF?l;'i`cM'\A$;>V?,?MT,c0'YLJHG&q)Y4U(ZWl.FoF-QDql=<KWl\J3.0u68VLKK"Fk)N6!D(1T8ApGPA0GX88'f>-+Pes-/7-4BUNW/h;s&HQRHG6Y@c>ptVQ:0(]3'd[$o>OB'F3.2Po2(T;J_f5N*<Z8'-lQShT1D(LW@ZXX.F,EKfR6,'nWU/8G`er'B[C]<#.NEtZV-1Zi*i4<a_c"UO\2cuj(n%n9a/>bs6MqQNcdqaK_9XWWUL2rQ/,)+4)]1VVkaHeRQ[sTc/4XcAk)fk`/k%X;)kBfma##cF)+4igN'X#ce"U6]XHb$u4;t3OXjUFOX=Go-mco$Ui7'[O9?=L3j2`Y-'B`V8tJ.89/9;_!_&lp-N,U.nC'D`Ieeqirm.44OE]u@]:?qRgmn2Af404Md2/3DZ!(<76<9N_Ht'VcLJhNY%oG6Wfi%<k`3B9MC`[K^[_gR=O<hjMN,5t[>MNeW[/'lR+n:67Y_/PM'4)8MhSBhKe3R4KLYZ[6bX#=0'L$M^IRnh'<9CUhsqg'[d4@Eqq10D/KG%.f3!a?*Nr]02sWGb,G0pBNHDV2.X9i*BpOF%_10T3hJh.RX<>c^$f`.5krP[D6*mooN1E_5&7c[WajG59T'c<:j($b3RYWnVk%B%2!+i126g_SOSFqMq_9gXG#>F6gU$A/oFuOGh4.=0'9,T!BNmuS.8]$'XEq?>01TH`2l?p,L]J+hTN"t>V4#F;T*Tm(XR3p@mP@[-(6F*WYVMK1gG@'#',9Dj@J+;bEFC'Y4*"=D,98qZ(bk"G#ro./SjW)A.iNIB,)UhB"Y.P$j`k"e*-t$n/,k3]]R](,]aD\\XKV-4-gZZJNXu!qE[]R>1B))=09%<.<(NO?KBB=r2!A@LJ<bP\YP`5eS/j*3'93'=W]e-\S:p?_<Z=3FRV-4@H?-O-j/"6,3FE-!KH))RXUNR;1sb5b_6sFRM'mh]@4V9Kl[#DGf#TrRijNrm<J^!:22h/nB.\*Kl4lD^QWlAmJTHW"U^&oSnr^8b8T+9DZlVng0N(H,)H;58;^IWhI&:ga,"mUTok)laEO'e1Jf13F;.0r=6F`(XC!XU+0oieab4Piro`%g.J<op"LjpCHH5AKC@NF&%(a+>n'8$r2a\6%G0k%(\8c1C7k+if$+>93IF_;4%N%p`Uh"tVZpn$6&,jB+_qrN*gktt@93>Q>P1;Nt-O1.q#UfWPJ+u5=~>endstream
181
+ endobj
182
+ 25 0 obj
183
+ <<
184
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 2071
185
+ >>
186
+ stream
187
+ Gatm<>BALX'RnB33%m@Wm1eSBG2IJ,1n.6a6PIn954&V#N"Xn98hu'frUG5Ffu?kJ9iE/8,>7mYq9Du`^rEi^IjR1kmkYf1FMMm)[KOX[I$f>:X4c/jB9jRL'0cK?#p[(abOm6+&;*O"$="Q2Yn]]I"@4#0mN`(SF[8i+^,r[;o&Igb@^#pSS%+#Pj%$dO55<B=.gl4,G/9')26g;*GE$Bi#^d_7#eYup_-\)8T/C(J>3a`I)kek0Fb116n8TZea7;TF9f+sbE#R8H:X=bu%d2G;9h@r1Gp3:g"o(]DA/r"`Cb)YYY)5&GEqLs,*b"b;A+V_N>UshB@CogtS+["'D!-L99I@2F4N[-5;1a*5gIMfl3<&,.>hd6H$D(&^DEhE4bi&?Vk4/l!@.+1=6Fq.IEkn,j^d/@pL)S`dC?1<!2aE6(Pgs$f_2<=?3K1it;RXJbr*%k-@.HEM>9rutcuKC'rMQi6XAMgE3(+cSr5P@XkI@[SoM/j4Bh94meSc[4*=R*CL>.DK$\^O0aD"Hj:VVu^HP6/Nqj=R0Q?;gOH!uq`;'uT#FW.&i,t]fSb=MDZ@J04W.8qP4dK3om=KRd[>mO%:"gt)g+N9M?Por\SY4bbXTuq)Cb_Ss6ElkYA29:>m$F5!u^hC*L=ZK0p8O.2$=jf^g>f`or\PRCqKhY:_1*`b<f&&Zr&"rn>g%%`Qo*k50'(B[?:sh<-0=C1=#"FDs-Q-IS,Z3/@idW34,_uum6L0Xif=2&/+D?X>_]Ed^,QN*fJlG.:601lDH`pjm]Dm.2"\H\%$K1bJWWhFej8oT4)+-jt8N:u2ckkmI[*8;gOGB#B?Sl(a@9V^B-(>6@5HibVI`I]B`;%<+Ml1.+2hRWjg+Q&B,m"Sn^Q[0'NX`,fIRK8CTi+470lp%a:\arLe<sJ@D!GoTR0;06l@)',l.33_%IA6PYI[T?S*Te1g>-"\2n.PM[qiHeDpN=EhN$t[1[E5HIOT<KId-?f\(<LOP(1ep%FF`B^.Cq[@NFAG9['mtN^eVd*#/AaO\ujuH:Tg1`R]XQC=hsk;XbZnOru_c(<ga#mR-MVKo*LNB9uiKRtW(m%b[!k9bEKUTbMn!(+@,q]u$qIKfNG$2<+bWTPI"UO>[gWX6GKU(f27&S751>hVskH89=(o=S%$T+9&9/,#/"/=;sU#-K,oFksS%DWLHq#CpmiN+5+6KU;C#i0@9h0mA-0"b``)`:):l,!+L,jopC\aLPp5Z=9sl7%tcnIOVK]6r\>5B1-&2[gQW!7l>r#!Gt)Mo*%DuL10J.a<%1%ja65c>-.s^*$YlBdX(lN,5/sXc-=EVe(k9/G\GQ0^rp%d6h-E`nmr)gIGMgCn*t:AWd`MN4n$oGl$t-DoQ#BUb<<#HGDs@>Nr:1-o7<%;.MLV']a4CRd@iV?r+I--("/N$^N*DOmn5?CTdRM8jRlh1:I@40gpH,4#3g7fh9QoM1;p_r\!EcXd@ZF%(M'T'QUaa!B>h-s!c>kqc>#WJ]/p_t>l3u3?dNS+j,-6n!dO'Q6<@F0^pDRMd$D\#]EJ'9R:MLO-6'Xe\kd*GbTKp(+;_2Xf7^cmKcGW6O2K8X3I9+ponJ!3YRjq:X3Pdga&k'kmWDIr,X:A-P%7Q.+,WGnTp;%?BRd9'@P-d+/;+G_[T$?+1$WE7TCCr;o5O-]p8WkIL9B!q<S\TT)a8"UjO1?^nQE,AN[%lqMRNk<)O62$.8>bnk_:"PT@s%RkUs`8B..a"iD-#/&gSiR]cFS:AKjIr%"^A"\i^=Ruh!BKXh%f)jqQ0+N[Gc41D$^8EkSU,7JelHDYYddFX/$L7=*B*Wdn>S4h\9afD`W/<0^lQWUa=F6T4,:64#H:uk8\oN>D*m/b"N*.$:0uc&ji?D:09"%=Q"diU5KN4@)mEe[XH\Y6J][b6#5:I?ac#Lc7aH;ZjHK\8;]XZrFQ.A#=AKLTL9]<S?6pgGbSDVJSpH\Z"AS(3_j'W"=*N>C"g=3=4["eFI5n-UK(Ar/IB9DmHAD8c*jk9;C<?QTHL/RdMCt)MM2IuWKS#?="&d>f'@iJ3;X52J^$4~>endstream
188
+ endobj
189
+ 26 0 obj
190
+ <<
191
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 1934
192
+ >>
193
+ stream
194
+ Gatm<>Ar7S'RnB33!_Db.pQ5?,tmN0etm*3U.*P\lcUt!N'uDo,Z1D:>h8S_n"Xc$*67Ba2Jc<IjS9;3ST`)ogSqsJN9L!RNF+a-\27EOj&mGJhU'C2i7!6g:YihXa`=7%7V'&9@/CP8j["pOTbCR;(kq$@^?#RuP['OhVo=i%Rk-3"m7B^3mn<f7Dt\G7@$=)e]@mU?0="lh_KJ`)lo@;L*^:prUQ#+Bd"(%'V%3g5fV+EgZDObNf#2_/.9Lh&"E>u2MH=3DZ,(.8%\=?'Af2V[$@Tp[r.U)&U48"`E`EI'doj*oeWc8FR>Q%X$dC;<p;C>I),4?dFG";J/f6-d%h3^JVB,nlh&JQ&0X4VD"3*6`",>j&/k*0R-K]hKBBS_iT,c2@oZpSl:2!>pIDAQJ2]=sLYi\)V^B8YW#'o4XaN$'^H)sT@35%I=UQVZnY'-L7_dJ;g9[!mCFqAu^GFN%1#oe+KUtn#+JU\#RfV&DHB/aohK+&2Qn_6Br]Hl)U/S/)ub7aqY?HPmZR*[?0X6#42SHrrW.np)'-sh`eTgD>P.7l/gF2b-:\K9.Xcmr8`mXTHib]<Pi2ER[#.SWgg"cKRMi"+%bnP&'Fa@je+<925kjmegA,k<psP$4/XDBl%*-)iBG,3.6L7Jbt%Gtr9CUH<-CWXX2nbH`>Rm/\Z%q*HV_`AH@u(V4P^<n*lDI&?[*Wf1Z:P;B)g=$)['#n]t@>a$LH*QMoBqK%F@7!.([V`]>r6S^!S65KpW"G-DW'%?][i1M1CAj.2O:<,-5TQ7@_QO//OJ>oC(qpu#m1I$<%Om8qt=Nk-p1u[`CfW^`U19"/XNdi!=2MQ7m,#A!9Q!K[d:r"Z@Mo1YhP::pi1&^i6Z#=B>+,Y#el^,H:HMlmp>i\W22Z;%M6o6*^GjAX8g%tNb%s/4;2)-u\2/4,PU?;h5RXB.N=A^1h[%od:D<IW?7]n^(baSN17M@,Y&ttDIUq.f%0L76sRKTI_"S3Ka2'Ho(q*Mkh26V2BZgh.;Q=QL<N&1'34N!JQ<S%:5hAML5A3*QFpP.b1c<(m,<)h#9Z!E0'&.M>L)&S$41e#&OnV]o@YKW$qO;C=We;2NgAFj]W)HbARCOHHLQrnLGbqZlV08?=gV:#18-ZY;)p4K\0nq`61lS7t>&t6;iOu!iVk,nS(QO.#BYQp<9=r.7EY);$rfF))h""*0$mm7a0$#,9pGj_)l&(cesPuf*p;G"A/,GDlP1)&,0T(Du]3CYUai4^d#"kujX0Kr99p_nBF4e3>)b`r9._DJl4-#`!qg?Idie1p"bf7L'Bg?@+(g8.L8Y!9)5k;c3(9$nnA`D[7dG=NQt\36dS);K`:]P4M10g#gRe.NKd"qr=,YA%jhD:)h*@el1bE]Hs,H]iY,ord?-1u3coh_L=0T!LP.4R:RY\-K*NQAVJ\6b$<",S,9CM[ZfZ\_M<bZ@'5tZ99-!XNpQPAF;oEeTNu'7NHV4Bo*[K1pCb/(j%UH-.t0;rO.#_p[r3@b&d8Q*7+KthRIj%c;CfIlrqK$f+'0sHq/+-;RER83CgFeqM%nKWXe[KJCmtHrS1r;dCj^5*?1JBa>u<31JEc)9YSob@&h?4(7k/u[(Z;a<#^MrIZ"Eo?(Tm^MdR(%[1Lh9gDmP"HsL*/Xo#2aTsJL"RYqm6C=E(^I#6rHRjQ1bLR.b9Rl\2<Yl)d)Tc&#jbIYp;MC/s;0IQsm5/^GVlYgn$-'.6@6HS"&mFU;s/<MmtOq+`h96@$T`r5:b;@1fVfOQU\h,Wm3<N5BsBeIAa/d^o\-;*m]6&GJF]tW`?/c("1(?<,>9!C32&=L-e^M%iWFWH[AmlfoI`UcBt1a9.Vl\dqe*\%)f6DM^;K>Iq]Mt-Vbo+u=@X=Q)S2K9]J*O8l"(.BSRm_fnLdjQ0!V]le#dqEjm*tN\Fa8~>endstream
195
+ endobj
196
+ 27 0 obj
197
+ <<
198
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 2140
199
+ >>
200
+ stream
201
+ Gau0D?#SK;&q0MX(uV,R>0&Nb75DZ,BPf-K5ocq_deg[$<t]#+b:]-%?1c23bYk6J<u.62>oU5NiGrSnbh$!DjPndts0IUHVZgA=o>pN;Yp(iC6<\c4lc%P\B9#(Hj"M[tRjPWh`t)Z=8kH54C-8#2WKSTA6;\X]IN2)(pIS"]rG^n^';gU*UuXpM&Go?)9UP00'N2GFm3GPr\ir-rm[:G3B)Wjt6j\Pj<>5UVY6<`TqL#_-4(50gB=]nQ$%+Cp@Z(d:_&Ohmi[8@2Gei(EN]dK2()=N.?^R6`b:Ajc7"5dH,'@*<GiuS3C*hL)\h)R[pU']fM]Z'Ar^MJ-,^qir[S-=[r<rgaFjlH3f^0^*.bluhd,)bp^qkaAmsI`E>QT*<c"qk'iVIR\n%[X_?./tfcP=/nl)/kXO$rT-ib20T:K_bs=j=FMW"&_se2\DK\n*>FNDeo+!Rl/e9g4W<^!Jg2>1JOjUoc&'>SmrFWDmq<Bb9]Zm03CiDr!AZq=@EL!:FR))hm5DKj]%QBdFY\f<S7j@?c5:NR5(L>73h$(lF7PNRTJ@ad.m[9PpWGs*@\H4)KtK^hSuV[jI2<NN-Q,qAm.JlG8rKX&;*f%fNmm]YR(el_7]a/m"btc1;rIC&2j;V-(kQ]5"mB[D]3(gbohHPq$jUU4',LNE12l]=g4>>BY-qb+.O2U2!;7f.KKBb6%Z'KUV*Sf\*<@:aN=_"Zn-TBr+fu=]o"F14ti.3QgPjekYnGSW%<bYV@]9.f)RcIs6pl0a\RAhSo#sR?fA".q,)p-FER&fc5@!f1.a_H\LWCI4[=!;j$K_167F=2DVld9ce3R$M.LPJ!1ae$R8ln/,oB9>H)uF<g;]QD_8SqbX_3<kd**&]:1JQ*I+`F,dO+Z[)tAAAA'Q+1l_Pffm-.^NV#JJYjs1.p)JY]Xn:`@9doSl&_$cR+SX$N'@_Vh-@)s7pgLP-g.>Eh_O""0[jaN22&o*oMNkt;V=PfI-OTnIp?bkZ57X_['lG-/^9RHgg>DA,[mf&WGF\K43p%Rhr?2"rF^BGdh^,&M2]L;@Nc2)1CLh++^N6LlW6e#$%>oSG)cA)1J3J&lA4hV`d39i:1?JfXS]GVF[F0$4NYEPPkGBVWn%VEMF`15rNERD-d7^C8"0q6ZXLR^XN2XfkZ'FJu3bjFhP$3=")/=s[\Yn_-`/79Sq(4gY?&L#<`r\t@GOd.m?L44:j,31PHAB=o^2^_)#-7J0B`rZuTG,SP_)Nr=q)HSF&cf7PPidEZkCpi)>@%X[eY7@Vk07.K$i*%>:RW<rQ,MH-Ps1d[E8q)rI8[:>n)iY2'hJ/\0`(5%Ec,R941MBl7GSkU!^NY%Ss]lPH2EC+X*3VcoS`[D8cWn6OebcaCKZ0.$(S:p+HD)A7OPujG4gkN;:iru'%q4FKeW&sD[9+>n$_\5R=DSg?J`pk4#H9j6Jh^q'cQ"5E_*G4M/rqI**Rlph)2M#d9>Q2,F1h#N(u)c(r0B>e/U,FU4M4Fr$[6W$)^:o3h=Au[kF%9=d[5mjSkpi>"2I5$FB!M,3TI,a^)SQ^"q_EAg<D],r=$+^;hc"'XQinE^hQVPa5(>K_4TSJe:-(jS5Nkl%$HN>aXi"`qDrp]G#TfqVEuJUg7RC",nfK0U&lpJDb3u5;Bo-2F[t7UPpXV3'dK4q<l`-I!0c@`=Mb@HL*WX7.eh>,X9,5QmiYTnTgLu?L$sSHo4M@IurZ)P^;:2otjR`UMMU%`?5Nm<Palr5u4]Gk6#fZR#Z:WjXp3@,kPB?&L5QL.mHKUT[8$T4V&P0qSV/'XZU,-.U+E8%Jsd(%fcJ'a/ds1X8hi$,e!**D>=UnDNGq:0-e!EmAfXtm<Yc,9S^49]t^4EU$oNF@FWet.0'+g>b!d58M07%^?*pr.TL%U[ZKd_"hd*E3?G?<Ih_Z^YAB<kYnIS#S+,N)s8*T84XUGk]mhW&ITCX&I!H91F`k]*Ql2c_W:Y5YM>KI]o?#?Im5Vrl#g`c43pD;M5Mf'>!'HfiCU#JB_q$e%A&Ds8G=$JI.f8eT^&YC5LmR@BK>sCK:<Ns"HW-q7HeNiBL'9J;U>#02!:EK)XVe/W:';(H9KOuUI.XBQimdZ,FgD+4Q$L3S^2,uTp*Tn^8=]~>endstream
202
+ endobj
203
+ xref
204
+ 0 28
205
+ 0000000000 65535 f
206
+ 0000000061 00000 n
207
+ 0000000112 00000 n
208
+ 0000000219 00000 n
209
+ 0000000331 00000 n
210
+ 0000000536 00000 n
211
+ 0000000641 00000 n
212
+ 0000000846 00000 n
213
+ 0000001051 00000 n
214
+ 0000001256 00000 n
215
+ 0000001461 00000 n
216
+ 0000001667 00000 n
217
+ 0000001873 00000 n
218
+ 0000002063 00000 n
219
+ 0000002253 00000 n
220
+ 0000002488 00000 n
221
+ 0000002702 00000 n
222
+ 0000002948 00000 n
223
+ 0000003018 00000 n
224
+ 0000003352 00000 n
225
+ 0000003457 00000 n
226
+ 0000005550 00000 n
227
+ 0000007698 00000 n
228
+ 0000009616 00000 n
229
+ 0000011567 00000 n
230
+ 0000013431 00000 n
231
+ 0000015594 00000 n
232
+ 0000017620 00000 n
233
+ trailer
234
+ <<
235
+ /ID
236
+ [<e2fbf8aaba54187166a9ba816fb1dc58><e2fbf8aaba54187166a9ba816fb1dc58>]
237
+ % ReportLab generated PDF document -- digest (opensource)
238
+
239
+ /Info 18 0 R
240
+ /Root 17 0 R
241
+ /Size 28
242
+ >>
243
+ startxref
244
+ 19852
245
+ %%EOF