├── README.md
├── drawHex.js
├── generateSector.html
├── readSector.html
├── testSector.txt
├── travGen.js
└── travGenUtils.js
/README.md:
--------------------------------------------------------------------------------
1 | # travGenJS
2 | Javascript library for generating, reading, writing, and drawing sector data for sci-fi RPGs such as Traveller.
3 |
4 | ## Getting Started
5 |
6 | The file generateSector.html is a simple example of using the library to generate a new sector, a new world, and a new UWP.
7 |
8 | The file readSector.html is a simple example of using travGenJS to read sector data into a Sector object, and then outputing that data to the screen in standard .sec format.
9 |
10 | ### Prerequisites
11 |
12 | None
13 |
14 | ### Installing
15 |
16 | ``
17 | ``
18 |
19 |
20 | ## API Reference
21 |
22 | sector generation
23 | subsector generation
24 | world generation
25 | uwp generation
26 | trade route generation
27 |
28 | sector reading
29 | subsector reading
30 | world reading
31 |
32 | sector output
33 | subsector output
34 | world output
35 |
36 | sector drawing
37 | subsector drawing
38 |
39 |
40 | ## Built With
41 |
42 | * [atom](http://www.atom.io) - Text Editor
43 | * [jQuery](https://jquery.com)
44 |
45 |
46 | ## Contributing
47 |
48 | ??
49 |
50 |
51 | ## Versioning
52 |
53 | ??
54 |
55 |
56 | ## Authors
57 |
58 | * **[forthekill](https://github.com/forthekill)** *
59 |
60 | See also the list of [contributors](https://github.com/your/project/contributors) who participated in this project.
61 |
62 |
63 | ## License
64 |
65 | ??
66 |
67 |
68 | ## Acknowledgments
69 |
70 | * [Joshua Bell](http://www.travellermap.com)
71 | * [Marc Miller](http://www.farfuture.net)
72 |
73 | * The Traveller game in all forms is owned by Far Future Enterprises. Copyright 1977 - 1998 Far Future Enterprises. Traveller is a registered trademark of Far Future Enterprises. Far Future permits web sites and fanzines for this game, provided it contains this notice, that Far Future is notified, and subject to a withdrawal of permission on 90 days notice. The contents of this site are for personal, non-commercial use only. Any use of Far Future Enterprises's copyrighted material or trademarks anywhere on this web site and its files should not be viewed as a challenge to those copyrights or trademarks. In addition, any program/articles/file on this site cannot be republished or distributed without the consent of the author who contributed it.
74 |
--------------------------------------------------------------------------------
/drawHex.js:
--------------------------------------------------------------------------------
1 | var HEXSIZE = 48; // Length of hex side
2 | var SEC_COLS = 32; // Number of hex columns
3 | var SEC_ROWS = 40; // Number of hex rows
4 |
5 | // Width from hex point to start of side
6 | var HEXH = Math.abs(Math.sin(30*Math.PI/180) * HEXSIZE);
7 | // Height from center point to flat side
8 | var HEXR = Math.abs(Math.cos(30*Math.PI/180) * HEXSIZE);
9 |
10 | // Canvas size
11 | // TODO: Figure out why the canvas seems to big based on this calc
12 | var CANVAS_HEIGHT = (HEXSIZE + (HEXH * 2)) * SEC_ROWS;
13 | var CANVAS_WIDTH = (HEXR * 2) * SEC_COLS;
14 |
15 | var worldHexNumbers = true; // If true, draws hex numbers only when a world is present
16 |
17 | // Colors
18 | var hexColor = "#AAA"; // Color of Hex Outline
19 | var hexNumColor = "#777" // Color of Hex Number
20 |
21 | var zoneAmberColor = "#FD0"; // Amber zone color
22 | var zoneRedColor = "#F00"; // Red zone color
23 | var stpColor = "#FFF"; // Color of Starport Text
24 | var nameColor = "#FFF";
25 | var nameColorCapital = "#F00";
26 |
27 | var xboatRouteColor = "#390";
28 | var btn08RouteColor = "#A00";
29 | var btn09RouteColor = "#FF6";
30 | var btn10RouteColor = "#F90";
31 | var btn11RouteColor = "#09F";
32 | var btn12RouteColor = "#939";
33 |
34 |
35 | // World Colors
36 | var worldColor = "#390";
37 | var worldColorAsteroid = "#333";
38 | var worldColorDesert = "#FC3";
39 | var worldColorExotic = "#F00";
40 | var worldColorIce = "#7BF";
41 | var worldColorWater = "#069";
42 | var worldColorVaccuum = "#FFF";
43 |
44 | // Font of all text
45 | var textFont = "Arial" // Generic text font
46 | var nameFont = "Arial"; // Font for world data
47 | var nameSize = (HEXSIZE * 0.25) + "px"; // Font size for world data
48 | var nameStyle = "bold"; // Font style for world data
49 |
50 | // Line widths
51 | var hexLineWidth = HEXSIZE / 48;
52 | var tradeLineWidth = HEXSIZE / 6;
53 | var travelZoneLineWidth = HEXSIZE / 14;
54 | var worldRadius = HEXSIZE * 0.18;
55 | var worldMaskRadius = HEXSIZE * 0.28;
56 |
57 | /* Sets the size of the hex and reevaluates the appropriate variables */
58 | function resizeHex(size){
59 | if(size <= 0){ size = 1 }; // size must be a positive value
60 | if(size > 96){ size = 96 }; // size cannot be greater than 96 or Canvas throws an error
61 | HEXSIZE = size;
62 |
63 | HEXH = Math.abs(Math.sin(30*Math.PI/180) * HEXSIZE);
64 | HEXR = Math.abs(Math.cos(30*Math.PI/180) * HEXSIZE);
65 | CANVAS_HEIGHT = (HEXSIZE + (HEXH * 2)) * SEC_ROWS;
66 | CANVAS_WIDTH = (HEXR * 2) * SEC_COLS;
67 |
68 | hexLineWidth = HEXSIZE / 48;
69 | tradeLineWidth = HEXSIZE / 6;
70 | travelZoneLineWidth = HEXSIZE / 14;
71 | worldRadius = HEXSIZE * 0.18;
72 | worldMaskRadius = HEXSIZE * 0.28;
73 |
74 | nameSize = (HEXSIZE * 0.25) + "px";
75 | }
76 |
77 |
78 | /* MAIN MAP DRAW FUNCTIONS */
79 |
80 | /* Takes a Canvas context and draws all map components */
81 | function drawMap(sector,context){
82 | drawHexes(context);
83 | if(worldHexNumbers){
84 | drawWorldHexNumbers(sector,context);
85 | }else{
86 | drawHexNumbers(context);
87 | }
88 | drawWorlds(sector,context);
89 | drawSectorData(sector,context);
90 | drawRoutes2(sector,context);
91 | }
92 |
93 | /* Takes a Canvas context and draws a hex map */
94 | function drawHexes(context){
95 | for (var c=0; c < SEC_COLS; c++){
96 | for (var i=0; i < SEC_ROWS; i++){
97 | var hex = getHex(c,i);
98 | drawHex(hex,context);
99 | }
100 | }
101 | }
102 |
103 | /* Takes a Canvas context and draws hex map numbers */
104 | function drawHexNumbers(context){
105 | for (var c=0; c < SEC_COLS; c++){
106 | for (var i=0; i < SEC_ROWS; i++){
107 | var hex = getHex(c,i);
108 | drawHexNumber(hex,context);
109 | }
110 | }
111 | }
112 |
113 | /* Takes a sector object and Canvas context and draws hex map numbers only in hexes where worlds exist */
114 | function drawWorldHexNumbers(sector,context){
115 | var len = sector.worlds.length;
116 | for(var x=0; x < len; x++){
117 | var hex = getWorldHex(sector.worlds[x]);
118 | drawHexNumber(hex,context);
119 | }
120 | }
121 |
122 | /* Takes a sector object and a Canvas context and draws the worlds for a sector */
123 | function drawWorlds(sector,context){
124 | var len = sector.worlds.length;
125 | for(var x=0; x < len; x++){
126 | drawWorld(sector.worlds[x],context);
127 | }
128 | }
129 |
130 | /* Takes a sector object and a Canvas context and draws the world data for a sector */
131 | function drawSectorData(sector,context) {
132 | var len = sector.worlds.length;
133 | for(var x=0; x < len; x++){
134 | drawWorldData(sector.worlds[x],context);
135 | }
136 | }
137 |
138 | /* Draws world name, starport, travel zone, gas giant, and bases for a world */
139 | function drawWorldData(world,context){
140 | drawName(world,context);
141 | drawStarport(world,context);
142 | if(world.zone == 1 || world.zone == 2) { drawTravelZone(world,context); }
143 | drawGasGiant(world,context);
144 | drawBases(world,context);
145 | }
146 |
147 | /* Takes a sector object and a Canvas context and draws the trade routes for a sector */
148 | function drawRoutes(sector,context) {
149 | // Loop through the pairs and drawRoute for each one
150 | var len = sector.tradeRoutePairs.length;
151 | if (len > 0){
152 | for(var x=0; x < len; x++){
153 | drawRoute(sector.tradeRoutePairs[x].start,sector.tradeRoutePairs[x].end,sector.tradeRoutePairs[x].btn,context);
154 | }
155 | }else{
156 | console.log("There are no trade route pairs. Please run generateTradeRoutePairs(sector).");
157 | }
158 | }
159 |
160 | /* SINGLE DRAW FUNCTIONS */
161 |
162 | /* Takes a hex and a Canvas context and draws the hex */
163 | function drawHex(hex,context){
164 | context.lineWidth = hexLineWidth;
165 | context.strokeStyle = hexColor;
166 | context.beginPath();
167 | context.moveTo(hex.points[0].x,hex.points[0].y);
168 | context.lineTo(hex.points[1].x,hex.points[1].y);
169 | context.lineTo(hex.points[2].x,hex.points[2].y);
170 | context.lineTo(hex.points[3].x,hex.points[3].y);
171 | context.lineTo(hex.points[4].x,hex.points[4].y);
172 | context.lineTo(hex.points[5].x,hex.points[5].y);
173 | context.lineTo(hex.points[0].x,hex.points[0].y)
174 | context.stroke();
175 | context.closePath();
176 | }
177 |
178 | /* Takes a hex and a Canvas context and draws the hexnumber */
179 | function drawHexNumber(hex,context){
180 | var hexnum = hexString(hex.col,hex.row);
181 | context.font = (hex.s * 0.25) + "px " + textFont;
182 | context.textAlign = "center";
183 | context.fillStyle = hexNumColor;
184 | context.fillText(hexnum,hex.centerX,hex.centerY - hex.r + (hex.s * 0.25));
185 | context.closePath();
186 | }
187 |
188 | /* Takes a world object and a Canvas context and draws the world */
189 | function drawWorld(world,context){
190 | //console.log("In drawWorld, hex " + world.hex);
191 |
192 | var hex = getWorldHex(world);
193 |
194 | // Draw mask circle under world to make ends of route line concave
195 | context.beginPath();
196 | context.fillStyle = "#000";
197 | context.arc(hex.centerX,hex.centerY,worldMaskRadius,0,Math.PI*2,true);
198 | context.fill();
199 | context.closePath();
200 |
201 | context.beginPath();
202 | context.fillStyle = worldColor;
203 | if(world.codes.as) { context.fillStyle = worldColorAsteroid; }
204 | if(world.codes.de) {
205 | context.fillStyle = worldColorDesert;
206 | }
207 | if(world.codes.ic) { context.fillStyle = worldColorIce; }
208 | if(world.codes.va && (world.hyd < 1)) { context.fillStyle = worldColorVaccuum; }
209 | if(world.codes.wa) {
210 | context.fillStyle = worldColorWater;
211 | }
212 | if(world.atm == 10) { context.fillStyle = worldColorExotic; };
213 |
214 | context.arc(hex.centerX,hex.centerY,worldRadius,0,Math.PI*2,true);
215 | context.fill();
216 | context.closePath();
217 |
218 | // TEMP: Dots for alignment, remove later
219 | //context.fillStyle = "#F00";
220 | //context.fillRect(hex.centerX,hex.centerY,1,1);
221 | //context.fillRect(hex.centerX,hex.centerY - (hex.r * .5),1,1);
222 | }
223 |
224 | /* Takes a world object and a Canvas context and draws the world name */
225 | function drawName(world,context){
226 |
227 | var hex = getWorldHex(world);
228 | var wName = world.name;
229 |
230 | // Over 1 Billion is CAPS
231 | if(world.pop > 8){ wName = wName.toUpperCase(); }
232 |
233 | context.font = nameStyle + " " + nameSize + " " + nameFont;
234 | context.textAlign = "center";
235 | context.fillStyle = nameColor;
236 | // TODO: Subsec capitals are colored Cx = Sec Cap
237 | if(world.codes.cp || world.codes.cx) { context.fillStyle = nameColorCapital; }
238 | context.fillText(wName,hex.centerX,hex.centerY + hex.r - (hex.s * 0.1));
239 | }
240 |
241 | /* Takes a world object and a Canvas context and draws starport indicator */
242 | function drawStarport(world,context){
243 |
244 | var hex = getWorldHex(world);
245 |
246 | // Starport Letter
247 | context.font = "bold " + (hex.s * 0.3) + "px " + textFont;
248 | context.textAlign = "center";
249 | context.fillStyle = stpColor;
250 | context.fillText(world.stp,hex.centerX,hex.centerY - (hex.r * 0.3));
251 | }
252 |
253 | /* Takes a world object and a Canvas context and draws a travel zone indicator if any */
254 | function drawTravelZone(world,context){
255 |
256 | var hex = getWorldHex(world);
257 |
258 | if(world.zone == 1){ context.strokeStyle = zoneAmberColor; } // AMBER
259 | else if(world.zone == 2){ context.strokeStyle = zoneRedColor; } // RED
260 | else { return; }
261 | context.beginPath();
262 | context.lineWidth = travelZoneLineWidth;
263 | context.lineCap = "round";
264 | context.arc(hex.centerX,hex.centerY,(HEXSIZE / 3) * 2,0.75 * Math.PI,0.25 * Math.PI,false);
265 | context.stroke();
266 | context.closePath();
267 | }
268 |
269 | /* Takes a world object and a Canvas context and draws gas giant indicator if any */
270 | function drawGasGiant(world,context){
271 |
272 | var hex = getWorldHex(world);
273 |
274 | context.beginPath();
275 | context.fillStyle = stpColor;
276 | context.arc(hex.centerX + (hex.s * 0.5),hex.centerY - (hex.r * 0.33),(hex.s / 15),0,Math.PI*2,true);
277 | context.fill();
278 | context.closePath();
279 | }
280 |
281 | /* Takes a world object and a Canvas context and draws base indicators if any */
282 | function drawBases(world,context){
283 |
284 | var hex = getWorldHex(world);
285 |
286 | // Base Indicators - Naval: Star, Scout: Triangle, Military: Diamond?
287 | if(world.base == "N" || world.base == "A"){ drawStar(context,hex); }
288 | if(world.base == "S" || world.base == "A"){ drawTriangle(context,hex); }
289 | if(world.base == "M"){ drawSquare(context,hex); }
290 | }
291 |
292 |
293 | /* UTILITY DRAW FUNCTIONS */
294 |
295 | /* Takes a world object and returns a hex object for that world */
296 | function getWorldHex(world){
297 | // Split hex string into x and y and get zero based column and row
298 | var col = parseInt(world.hex.substr(0,2),10) - 1;
299 | var row = parseInt(world.hex.substr(2,2),10) - 1;
300 |
301 | return getHex(col,row);
302 | }
303 |
304 | /* Takes a hex column and row and returns a hex object with coordinate information for drawing */
305 | function getHex(col,row){
306 | var hex = {points: []};
307 | var p0 = {}, p1 = {}, p2 = {}, p3 = {}, p4 = {}, p5 = {};
308 |
309 | hex.col = col + 1;
310 | hex.row = row + 1;
311 |
312 | // Hex size calculations (flat side horizontal)
313 | hex.s = HEXSIZE; // Length of side
314 | // Width from hex point to start of side
315 | hex.h = Math.abs(Math.sin(30*Math.PI/180) * hex.s);
316 | // Height from center point to flat side
317 | hex.r = Math.abs(Math.cos(30*Math.PI/180) * hex.s);
318 | hex.b = hex.s + (2*hex.h); // Width (point to point)
319 | hex.p = hex.b * 0.5; // Center to point
320 | hex.a = 2*hex.r; // Height (side to side)
321 |
322 | // Point 0
323 | p0.x = 0 + (col * (hex.h + hex.s));
324 | if(col%2){ // if odd else even
325 | p0.y = (2 * hex.r) + (row * 2 * hex.r);
326 | }else{
327 | p0.y = hex.r + (row * 2 * hex.r);
328 | }
329 | hex.points.push(p0);
330 |
331 | // Point 1
332 | p1.x = p0.x + hex.h;
333 | p1.y = p0.y + hex.r;
334 | hex.points.push(p1);
335 |
336 | // Point 2
337 | p2.x = p1.x + hex.s;
338 | p2.y = p1.y;
339 | hex.points.push(p2);
340 |
341 | // Point 3
342 | p3.x = p2.x + hex.h;
343 | p3.y = p2.y - hex.r;
344 | hex.points.push(p3);
345 |
346 | // Point 4
347 | p4.x = p3.x - hex.h;
348 | p4.y = p3.y - hex.r;
349 | hex.points.push(p4);
350 |
351 | // Point 5
352 | p5.x = p4.x - hex.s;
353 | p5.y = p4.y;
354 | hex.points.push(p5);
355 |
356 | hex.centerX = hex.points[0].x + (hex.b * 0.5);
357 | hex.centerY = hex.points[0].y;
358 |
359 | return hex;
360 | }
361 |
362 | /* Draws a triangle in a hex to indicate a scout base */
363 | function drawTriangle(context,hex){
364 |
365 | var side = HEXSIZE / 6.25;
366 | var a = Math.sqrt(Math.pow(side,2) - Math.pow(side * 0.5,2));
367 | var x = hex.centerX - (hex.s * 0.5);
368 | var y = hex.centerY + (hex.r * 0.33) - (a * 0.5);
369 |
370 | context.beginPath();
371 | context.fillStyle = stpColor;
372 | context.moveTo(x,y);
373 | context.lineTo(x+(side * 0.5),y+a);
374 | context.lineTo(x-(side * 0.5),y+a);
375 | context.lineTo(x,y);
376 |
377 | context.fill();
378 | context.closePath();
379 | }
380 |
381 | /* Draws a star in a hex to indicate a naval base */
382 | function drawStar(context,hex){
383 | // Sample star coords: 10,40 40,40 50,10 60,40 90,40 65,60 75,90 50,70 25,90 35,60
384 | context.beginPath();
385 | context.fillStyle = stpColor;
386 |
387 | var x = hex.centerX - (hex.s * 0.5) - (HEXSIZE/10);
388 | var y = hex.centerY - (hex.r * 0.33) - Math.sqrt((HEXSIZE/10.666666));
389 |
390 | context.moveTo(x,y);
391 | context.lineTo(x+(HEXSIZE/13.333333),y);
392 | context.lineTo(x+(HEXSIZE * 0.1),y-(HEXSIZE/13.333333));
393 | context.lineTo(x+(HEXSIZE/8),y);
394 | context.lineTo(x+(HEXSIZE * 0.2),y);
395 | context.lineTo(x+(HEXSIZE/7.272727),y+(HEXSIZE * 0.05));
396 | context.lineTo(x+(HEXSIZE/6.153846),y+(HEXSIZE/8));
397 | context.lineTo(x+(HEXSIZE * 0.1),y+(HEXSIZE/13.333333));
398 | context.lineTo(x+(HEXSIZE/26.666665),y+(HEXSIZE/8));
399 | context.lineTo(x+(HEXSIZE/16),y+(HEXSIZE * 0.05));
400 | context.lineTo(x,y);
401 | context.fill();
402 | context.closePath();
403 | }
404 |
405 | /* Draws a triangle in a hex to indicate a scout base */
406 | function drawSquare(context,hex){
407 |
408 | var side = HEXSIZE / 7;
409 | var x = hex.centerX - (hex.s * 0.5) - (side * 0.5);
410 | var y = hex.centerY - (hex.r * 0.33) - (side * 0.5);
411 |
412 | context.beginPath();
413 | context.fillStyle = stpColor;
414 | context.moveTo(x,y);
415 | context.lineTo(x+side,y);
416 | context.lineTo(x+side,y+side);
417 | context.lineTo(x,y+side);
418 | context.lineTo(x,y);
419 | context.fill();
420 | context.closePath();
421 | }
422 |
423 | /* */
424 | function drawRoute(start,end,btn,context){
425 | var sCol = hexCol(start) - 1;
426 | var sRow = hexRow(start) - 1;
427 | var eCol = hexCol(end) - 1;
428 | var eRow = hexRow(end) - 1;
429 | var startHex = getHex(sCol,sRow);
430 | var endHex = getHex(eCol,eRow);
431 |
432 | context.beginPath();
433 | context.lineWidth = tradeLineWidth;
434 | context.strokeStyle = xboatRouteColor;
435 | if(btn >= 8){ context.strokeStyle = btn08RouteColor; }
436 | if(btn >= 9){ context.strokeStyle = btn09RouteColor; }
437 | if(btn >= 10){ context.strokeStyle = btn10RouteColor; }
438 | if(btn >= 11){ context.strokeStyle = btn11RouteColor; }
439 | if(btn >= 12){ context.strokeStyle = btn12RouteColor; }
440 |
441 | context.moveTo(startHex.centerX,startHex.centerY);
442 | context.lineTo(endHex.centerX,endHex.centerY);
443 |
444 | context.stroke();
445 | context.closePath();
446 | }
--------------------------------------------------------------------------------
/generateSector.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Untitled Document
5 |
6 |
7 |
8 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/readSector.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Untitled Document
5 |
6 |
7 |
12 |
13 |
19 |
20 |
21 |
22 |
23 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/testSector.txt:
--------------------------------------------------------------------------------
1 | IyBHZW5lcmF0ZWQgYnkgaHR0cDovL3d3dy50cmF2ZWxsZXJtYXAuY29tDQojIDIwMTItMDMtMzBUMDc6MTk6MzQtMDc6MDANCg0KIyBDb3JlDQojIDAsMA0KDQojIE5hbWU6IENvcmUNCiMgTmFtZTogVWthbiAodmkpDQoNCiMgQXV0aG9yOiAgICBKb2UgRnVnYXRlDQojIFNvdXJjZTogICAgQXRsYXMgb2YgdGhlIEltcGVyaXVtLCBHRW5pZSAoY29ycmVjdGVkKSwgVHJhdmVsbGVycycgRGlnZXN0ICM4LCAjOSwgIzEwDQojIFJlZjogICAgICAgaHR0cDovL3RyYXZlbGxlci5tdS5vcmcvYXJjaGl2ZS9HZW5lcmFsL3NlY3RvcnMvY29yZS5zZWMNCg0KIyBTdWJzZWN0b3IgQTogQXBnZQ0KIyBTdWJzZWN0b3IgQjogUGVyaXRlDQojIFN1YnNlY3RvciBDOiBBbWVyb3MNCiMgU3Vic2VjdG9yIEQ6IFNoaW5rYW4NCiMgU3Vic2VjdG9yIEU6IFNhbmNoZXMNCiMgU3Vic2VjdG9yIEY6IE1la2VlDQojIFN1YnNlY3RvciBHOiBDb3JlDQojIFN1YnNlY3RvciBIOiBLYXNraWkNCiMgU3Vic2VjdG9yIEk6IEJ1bmtlcmlhDQojIFN1YnNlY3RvciBKOiBDZW1wbGFzDQojIFN1YnNlY3RvciBLOiBDaGFudA0KIyBTdWJzZWN0b3IgTDogRGluZ3RyYQ0KIyBTdWJzZWN0b3IgTTogQ2FkaW9uDQojIFN1YnNlY3RvciBOOiBDaCduYWFyDQojIFN1YnNlY3RvciBPOiBEdW5lYQ0KIyBTdWJzZWN0b3IgUDogU2FyZWdvbg0KDQojIEFsbGVnOiBJbTogIlRoaXJkIEltcGVyaXVtIg0KIyBBbGxlZzogU3k6ICJTeWxlYW4gRmVkZXJhdGlvbiINCg0KIDEtMjU6IE5hbWUNCjI3LTMwOiBIZXhOYnINCjMyLTQwOiBVV1ANCiAgIDQyOiBCYXNlcw0KNDQtNjg6IFJlbWFya3MgJiBDb21tZW50cw0KICAgNzA6IFpvbmUNCjcyLTc0OiBQQkcNCjc2LTc3OiBBbGxlZ2lhbmNlDQo3OS05ODogU3RlbGxhciBEYXRhDQoNCklya2lna2hhbiAgICAgICAgICAgICAgICAgMDEwMyBFNTQ1MzZBLTIgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNzAwIEltIE00ViAgICAgICAgICAgICAgICAgDQpTaGFuYSBNYSAgICAgICAgICAgICAgICAgIDAxMDQgRTM1MTExMi05ICAgTG8gTmkgUG8gICAgICAgICAgICAgICAgICAgIDkwMyBJbSBLMklWIE03RCAgICAgICAgICAgIA0KTmlpemVkaWp1ICAgICAgICAgICAgICAgICAwMTA2IEI5QzY4ODYtOSBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDQgSW0gQTFWICAgICAgICAgICAgICAgICANClBlciAgICAgICAgICAgICAgICAgICAgICAgMDExMiBBNjczMzEwLUIgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMTAzIEltIE02ViBNMEQgICAgICAgICAgICAgDQpLaGlzaGkgICAgICAgICAgICAgICAgICAgIDAxMTMgQzc5ODIwMC1EICAgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDMwMyBJbSBNNlYgICAgICAgICAgICAgICAgIA0KS2hpZCAgICAgICAgICAgICAgICAgICAgICAwMTE0IEIyNTA0MDEtQyBBIExvIE5pIFBvIERlICAgICAgICAgICAgICAgICAyMjAgSW0gTTFWICAgICAgICAgICAgICAgICANCklkcHV1ICAgICAgICAgICAgICAgICAgICAgMDExNiBCNDg1NjU2LUEgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgODExIEltIE00ViAgICAgICAgICAgICAgICAgDQpOZWtpICAgICAgICAgICAgICAgICAgICAgIDAxMTcgQjY2NDQ4OS04IE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUxMCBJbSBNMElJSSBNOVYgTTREICAgICAgIA0KS2VpbiAgICAgICAgICAgICAgICAgICAgICAwMTIwIEMyNDQ0MDMtQyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gSzJWICAgICAgICAgICAgICAgICANCkxhcnNhbHV1ICAgICAgICAgICAgICAgICAgMDEyNSBCNjY0MDAwLUMgICBMbyBOaSBCYSAgICAgICAgICAgICAgICAgICAgODEwIEltIE02ViBNMUQgICAgICAgICAgICAgDQpEZXNlY2EgICAgICAgICAgICAgICAgICAgIDAxMjYgQjI0MTc2Mi1CICAgUG8gICAgICAgICAgICAgICAgICAgICAgICAgIDUxMyBJbSBHN1ZJIE00RCAgICAgICAgICAgIA0KTWFyc3VzICAgICAgICAgICAgICAgICAgICAwMTI3IEI1Nzg1OTgtQiBBIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTQgSW0gTTFWICAgICAgICAgICAgICAgICANClByb3RhbHVzICAgICAgICAgICAgICAgICAgMDEyOCBCNTU5NDYzLUIgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMTIzIEltIEswViAgICAgICAgICAgICAgICAgDQpMYXNsaWkgTWlpICAgICAgICAgICAgICAgIDAxMjkgQjk4NDMzMS04ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUyMiBJbSBNOVYgICAgICAgICAgICAgICAgIA0KS2F0b2NrICAgICAgICAgICAgICAgICAgICAwMTMwIEUyMDAzMDEtQyAgIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICAxMDIgSW0gTTJWIE0wRCAgICAgICAgICAgICANCkxhc2ggICAgICAgICAgICAgICAgICAgICAgMDEzMiBCNzZBMjAwLUUgQSBMbyBOaSBXYSAgICAgICAgICAgICAgICAgICAgNTIxIEltIEszViBNMEQgICAgICAgICAgICAgDQpIb2x0ICAgICAgICAgICAgICAgICAgICAgIDAxMzMgQjhENzM0Ni1DIE4gTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDkxNSBJbSBHNVYgICAgICAgICAgICAgICAgIA0KQmxhbnVtICAgICAgICAgICAgICAgICAgICAwMTM0IEI0MjE2NzctQiBOIE5hIE5pIFBvICAgICAgICAgICAgICAgICAgICAyMDMgSW0gTTVJViAgICAgICAgICAgICAgICANCk1haXNodW4gICAgICAgICAgICAgICAgICAgMDEzNSBCNjY3NTg3LUMgTiBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgMjA0IEltIE00ViAgICAgICAgICAgICAgICAgDQpaaXJpcyAgICAgICAgICAgICAgICAgICAgIDAxMzggQTg3MzAwMC1BICAgTG8gTmkgQmEgICAgICAgICAgICAgICAgICAgIDcwMiBJbSBNMlYgICAgICAgICAgICAgICAgIA0KRGFzaHUgQWFyZGlyICAgICAgICAgICAgICAwMTM5IEI4N0ExMjAtRCBOIExvIE5pIFdhICAgICAgICAgICAgICAgICAgQSA2MTMgSW0gTTFWIE0zRCAgICAgICAgICAgICANClJlZmVyZW5jZSAgICAgICAgICAgICAgICAgMDE0MCBEMTAwMTAwLUIgQSBMbyBOaSBWYSBScyAgICAgICAgICAgICAgICAgMzAwIEltIEswViAgICAgICAgICAgICAgICAgDQpBemltdXRoICAgICAgICAgICAgICAgICAgIDAyMDIgQjg0NzQyNy1DIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIwMCBJbSBNMlYgTTdEICAgICAgICAgICAgIA0KS2hhdXIgR2EgICAgICAgICAgICAgICAgICAwMjAzIEIyMzQzMTQtRiBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gSzFWICAgICAgICAgICAgICAgICANCkdla3NoaWl1dW4gICAgICAgICAgICAgICAgMDIwOCBENTI3NTI0LTcgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgOTIzIEltIEY5SVYgICAgICAgICAgICAgICAgDQpVcmFzICAgICAgICAgICAgICAgICAgICAgIDAyMTAgQTc5NzY3OS1EICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDcwMSBJbSBNMlYgTTdEICAgICAgICAgICAgIA0KR2lyICAgICAgICAgICAgICAgICAgICAgICAwMjEyIEI2NDU0MzctQyBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDMgSW0gSzZJSSBNN0QgICAgICAgICAgICANCkVtdXVpcyAgICAgICAgICAgICAgICAgICAgMDIxNiBCNDIyMzY5LUMgTiBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgMTA0IEltIE05SVYgTTBEICAgICAgICAgICAgDQpEYXJuaWkgS2ltaSAgICAgICAgICAgICAgIDAyMTggRDg3ODc3Qi04IFMgQWcgUmkgICAgICAgICAgICAgICAgICAgICAgIDkxNCBJbSBNMFYgICAgICAgICAgICAgICAgIA0KSW5pciAgICAgICAgICAgICAgICAgICAgICAwMjIwIEQ4OEE0NDgtOCAgIExvIE5pIFdhICAgICAgICAgICAgICAgICAgICA1MDMgSW0gRzJWICAgICAgICAgICAgICAgICANCkthbiAgICAgICAgICAgICAgICAgICAgICAgMDIyMSBBNzg5NTY3LUQgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgODA1IEltIEcxViAgICAgICAgICAgICAgICAgDQpBa21pciBBc2ggICAgICAgICAgICAgICAgIDAyMjIgRTIxMDY2OS04ICAgTmEgTmkgICAgICAgICAgICAgICAgICAgICAgIDcwNSBJbSBHMVYgICAgICAgICAgICAgICAgIA0KTGluZGJhciAgICAgICAgICAgICAgICAgICAwMjI0IEUyMzQxNDctNiAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMDMgSW0gTThWICAgICAgICAgICAgICAgICANCkhla3RhbHVzICAgICAgICAgICAgICAgICAgMDIyOCBCNTY1MzAxLUEgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTIwIEltIE01ViAgICAgICAgICAgICAgICAgDQpSdXNodWdpbSAgICAgICAgICAgICAgICAgIDAyMzEgRTg2OTM3Mi02ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcxMSBJbSBHMVYgTThEICAgICAgICAgICAgIA0KU2lzaGFyICAgICAgICAgICAgICAgICAgICAwMjM0IEI2Njc0MjAtQyAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQgSW0gTTRWIE04RCAgICAgICAgICAgICANClR1dXJxYSBHYWFzaCAgICAgICAgICAgICAgMDIzNiBENjcxNDQzLTkgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzIEltIEc5SVYgICAgICAgICAgICAgICAgDQpCcmVraW4gICAgICAgICAgICAgICAgICAgIDAyNDAgQjU4NzQ4Qy1BICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCBJbSBNMlYgTTdEICAgICAgICAgICAgIA0KS2hhYW0gICAgICAgICAgICAgICAgICAgICAwMzAyIEI1OTc0ODgtOSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MDEgSW0gTTFWICAgICAgICAgICAgICAgICANCkt1dW5hYSAgICAgICAgICAgICAgICAgICAgMDMwNCBCOEI1MzY0LUIgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgODIzIEltIE02ViAgICAgICAgICAgICAgICAgDQpNdXVkZXNoaSAgICAgICAgICAgICAgICAgIDAzMDUgQTEwMDhBOC1EICAgTmEgVmEgICAgICAgICAgICAgICAgICAgICAgIDYwMSBJbSBHMVYgICAgICAgICAgICAgICAgIA0KS2lpZCAgICAgICAgICAgICAgICAgICAgICAwMzA2IEM3ODY1ODctQiBTIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA0MjIgSW0gTTFWICAgICAgICAgICAgICAgICANClBhc2xpaXIgICAgICAgICAgICAgICAgICAgMDMwNyBCMjc0NjYzLTkgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgMTAwIEltIEswViAgICAgICAgICAgICAgICAgDQpTaGFyICAgICAgICAgICAgICAgICAgICAgIDAzMDggQjY4ODEyNi1BIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDkxNCBJbSBNNlYgICAgICAgICAgICAgICAgIA0KTWFnICAgICAgICAgICAgICAgICAgICAgICAwMzEwIEU4ODgyNDEtNSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDIgSW0gTTdWIEs4RCAgICAgICAgICAgICANCk1haXNoIEFrdXNoICAgICAgICAgICAgICAgMDMxMyBCMzMyNDU0LUIgQSBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgNTAzIEltIE00ViAgICAgICAgICAgICAgICAgDQpNYWFyc2hpZ2VydmxpZyAgICAgICAgICAgIDAzMTQgQjhBNTg4QS05ICAgRmwgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNCBJbSBLNklJSSBNNUQgICAgICAgICAgIA0KRGFua2FobGFzICAgICAgICAgICAgICAgICAwMzE1IEI2ODU1NDEtQyAgIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA5MDQgSW0gTTNWIE0xRCAgICAgICAgICAgICANCkR1ZGluICAgICAgICAgICAgICAgICAgICAgMDMxNiBENTI4QTg5LUQgUyBIaSBJbiAgICAgICAgICAgICAgICAgICAgICAgNjI0IEltIE05ViAgICAgICAgICAgICAgICAgDQpVdXJ6ZSAgICAgICAgICAgICAgICAgICAgIDAzMTkgQjIzNDIyMC1GICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDQxNCBJbSBNMklWIEs3RCAgICAgICAgICAgIA0KQmVubHVyICAgICAgICAgICAgICAgICAgICAwMzIyIEIyNDIyNzUtRSBXIExvIE5pIFBvICAgICAgICAgICAgICAgICAgICAyMDQgSW0gTTFWICAgICAgICAgICAgICAgICANClZsaWdhICAgICAgICAgICAgICAgICAgICAgMDMyNCBCNDEzNzc3LUIgTiBOYSBJYyAgICAgICAgICAgICAgICAgICAgICAgMTAxIEltIE0zViAgICAgICAgICAgICAgICAgDQpJa2FydXMgICAgICAgICAgICAgICAgICAgIDAzMjUgQjIxMDc1Ny1DIFMgTmEgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMyBJbSBNMklWICAgICAgICAgICAgICAgIA0KQmVsbHVtICAgICAgICAgICAgICAgICAgICAwMzI2IEIzNDA0MDEtQiBOIE5pIFBvIERlICAgICAgICAgICAgICAgICAgICA3MDQgSW0gTTRWIE03RCAgICAgICAgICAgICANCkZlcm90ICAgICAgICAgICAgICAgICAgICAgMDMyOCBCMjUzNDMyLUQgICBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgMzExIEltIE0zRCAgICAgICAgICAgICAgICAgDQpLaWlyaXMgICAgICAgICAgICAgICAgICAgIDAzMzEgRTEwMDU5Qy03ICAgTmkgVmEgICAgICAgICAgICAgICAgICAgICAgIDcyNCBJbSBLNFYgTTBEICAgICAgICAgICAgIA0KUXVuZ3d5bGQgICAgICAgICAgICAgICAgICAwMzMyIEE2NTU1NjEtQSAgIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICAyMDMgSW0gTTRWIE05RCAgICAgICAgICAgICANClNpcmtpaW4gICAgICAgICAgICAgICAgICAgMDMzNCBBOTk5MzEwLUMgUyBMbyBOaSBGbCAgICAgICAgICAgICAgICAgICAgNTIzIEltIE0xViBNOUQgTTJEICAgICAgICAgDQpNYXJrdW4gICAgICAgICAgICAgICAgICAgIDAzMzggQjg4NzEzNi05IEEgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwMCBJbSBLMFYgTTJEICAgICAgICAgICAgIA0KQXBnZSAgICAgICAgICAgICAgICAgICAgICAwNDAyIEE3NzI5OTctRiBXIEhpIEluIENwICAgICAgICAgICAgICAgICAgICA3MTAgSW0gTTJWICAgICAgICAgICAgICAgICANCklybGkgVW4gICAgICAgICAgICAgICAgICAgMDQwMyBCMDAwMjAwLUQgICBMbyBOaSBBcyAgICAgICAgICAgICAgICAgICAgNzA0IEltIE0xViAgICAgICAgICAgICAgICAgDQpEYWtlIEFnICAgICAgICAgICAgICAgICAgIDA0MDUgQzY3NDQ2Ny1CICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcxNCBJbSBLMVYgTTVEICAgICAgICAgICAgIA0KQXJrYWcgS2EgICAgICAgICAgICAgICAgICAwNDA4IEI0NTM4NzUtRCAgIFBvICAgICAgICAgICAgICAgICAgICAgICAgICA0MDIgSW0gTTRWIE00RCAgICAgICAgICAgICANCkdpbiAgICAgICAgICAgICAgICAgICAgICAgMDQwOSBCOTk0NDQzLUMgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNDAyIEltIE0zViAgICAgICAgICAgICAgICAgDQpEYWFzYW1vayAgICAgICAgICAgICAgICAgIDA0MTAgQjc3OTVBRi1DIE4gTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMiBJbSBHNFYgTTZEICAgICAgICAgICAgIA0KS2FzaCAgICAgICAgICAgICAgICAgICAgICAwNDExIEQ1ODQzMDAtNyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDMgSW0gTTZWICAgICAgICAgICAgICAgICANClNoaWluYXVhICAgICAgICAgICAgICAgICAgMDQxNCBENDYxNTIwLTUgUyBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNDEzIEltIE0xViAgICAgICAgICAgICAgICAgDQpTYW5jaGVzICAgICAgICAgICAgICAgICAgIDA0MTYgQTY1NDlDOS1GIEEgSGkgQ3AgICAgICAgICAgICAgICAgICAgICAgIDExMyBJbSBNMFYgICAgICAgICAgICAgICAgIA0KU2hhcmRpICAgICAgICAgICAgICAgICAgICAwNDE4IEUzMzM5OEEtQiAgIEhpIE5hIFBvICAgICAgICAgICAgICAgICAgICA2MDMgSW0gTTRWICAgICAgICAgICAgICAgICANCk5pcmdlbSAgICAgICAgICAgICAgICAgICAgMDQyMCBCNkE3NDIyLTkgTiBMbyBOaSBGbCAgICAgICAgICAgICAgICAgICAgMTA0IEltIEszViBNNUQgICAgICAgICAgICAgDQpHaXNoYWxlbSAgICAgICAgICAgICAgICAgIDA0MjEgQTg4NzMyNS1EICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDgyMiBJbSBHOFYgICAgICAgICAgICAgICAgIA0KQmFncmFhbiAgICAgICAgICAgICAgICAgICAwNDIzIEI0MDA1NTUtRiBTIE5pIFZhICAgICAgICAgICAgICAgICAgICAgICAyMDAgSW0gSzRWICAgICAgICAgICAgICAgICANCklybHUgICAgICAgICAgICAgICAgICAgICAgMDQyOCBCNTM1OThDLUYgTiBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgNjEzIEltIEsyViBNNEQgICAgICAgICAgICAgDQpSZWxsZSAgICAgICAgICAgICAgICAgICAgIDA0MjkgQzlCOTY2NS1BICAgTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDcwNCBJbSBHNFYgICAgICAgICAgICAgICAgIA0KQmV0cmFzICAgICAgICAgICAgICAgICAgICAwNDMxIEI2MzQzMjAtQiBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDQgSW0gSzVWICAgICAgICAgICAgICAgICANClJlbGVpcyAgICAgICAgICAgICAgICAgICAgMDQzMiBCMTUwNzc5LUUgUyBQbyBEZSAgICAgICAgICAgICAgICAgICAgICAgODA1IEltIEsySUlJIE00ViAgICAgICAgICAgDQpMeXRyYXMgICAgICAgICAgICAgICAgICAgIDA0MzcgQjQwMDY0My1BICAgTmEgTmkgVmEgICAgICAgICAgICAgICAgICAgIDQwNSBJbSBNNFYgICAgICAgICAgICAgICAgIA0KSW5kYXMgRGFraXIgICAgICAgICAgICAgICAwNDM5IEIxMTAxMDAtQyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDMgSW0gTTFWIE00RCAgICAgICAgICAgICANCkdhbnNoYXMgICAgICAgICAgICAgICAgICAgMDQ0MCBBNTNBNzc3LUUgICBXYSAgICAgICAgICAgICAgICAgICAgICAgICAgNTAzIEltIEcxViBNMkQgICAgICAgICAgICAgDQpOaWlyICAgICAgICAgICAgICAgICAgICAgIDA1MDIgQjc2QTIwNC1CIE4gTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDgyMCBJbSBNMVYgTTNEICAgICAgICAgICAgIA0KRW1paWdhYXAgICAgICAgICAgICAgICAgICAwNTA1IEIxMzA2QUUtQSAgIE5hIE5pIFBvIERlICAgICAgICAgICAgICAgICA0MjQgSW0gTTFWICAgICAgICAgICAgICAgICANCkdhYWRpciAgICAgICAgICAgICAgICAgICAgMDUxMSBENDg2NzM2LTcgUyBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgNDEyIEltIEYxSVYgICAgICAgICAgICAgICAgDQpBcmxhIFVuICAgICAgICAgICAgICAgICAgIDA1MTIgQjUxMzczMy1CIE4gTmEgSWMgICAgICAgICAgICAgICAgICAgICAgIDIwMiBJbSBBNUlWIEs5RCAgICAgICAgICAgIA0KS2FtYW4gICAgICAgICAgICAgICAgICAgICAwNTEzIEQ3NzIzMTItNSBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAyMDMgSW0gSzBWICAgICAgICAgICAgICAgICANClJ1bmRhbiAgICAgICAgICAgICAgICAgICAgMDUxNiBCNzZBODQ1LTggTiBSaSBXYSAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIEswViAgICAgICAgICAgICAgICAgDQpTaGlnYSBTaGEgICAgICAgICAgICAgICAgIDA1MTcgRTcyNjAwMC0wICAgQmEgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMiBJbSBNMlYgICAgICAgICAgICAgICAgIA0KWmFuICAgICAgICAgICAgICAgICAgICAgICAwNTE5IEIxMDAxMDMtRSBOIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICAyMTQgSW0gTTVJSUkgICAgICAgICAgICAgICANCkFtaWtoYWFrICAgICAgICAgICAgICAgICAgMDUyMiBFMzYyNTU0LTggICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTI0IEltIEYyViAgICAgICAgICAgICAgICAgDQpEaW5oZSAgICAgICAgICAgICAgICAgICAgIDA1MjMgQjU5MDQ0NC1EICAgTmkgRGUgICAgICAgICAgICAgICAgICAgICAgIDIwMyBJbSBLMUlWICAgICAgICAgICAgICAgIA0KQXNhbGFtICAgICAgICAgICAgICAgICAgICAwNTI2IEIyMDAzNDYtRCAgIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICAxMjEgSW0gTTJWICAgICAgICAgICAgICAgICANClJheCAgICAgICAgICAgICAgICAgICAgICAgMDUyNyBBMzU3MTEwLUIgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMTE1IEltIEc5ViBNM0QgICAgICAgICAgICAgDQpJcmR1ICAgICAgICAgICAgICAgICAgICAgIDA1MjkgQjM4NjUyMS1DIE4gQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDUxMiBJbSBNNFYgTTVEICAgICAgICAgICAgIA0KVGFyc2hpaSAgICAgICAgICAgICAgICAgICAwNTMwIEQ0MzM1NjUtNyBTIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA1MDQgSW0gTTRWIE00RCAgICAgICAgICAgICANCkNhZGlvbiAgICAgICAgICAgICAgICAgICAgMDUzMSBCNjU1ODY0LUEgTiBDcCAgICAgICAgICAgICAgICAgICAgICAgICAgNDAwIEltIEsyViBNOEQgICAgICAgICAgICAgDQpMaWEgICAgICAgICAgICAgICAgICAgICAgIDA1MzcgRTY1NDk4OC1BICAgSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMiBJbSBGNFYgICAgICAgICAgICAgICAgIA0KRGFzaGdhZCAgICAgICAgICAgICAgICAgICAwNjAzIEIxNDAxMDMtRiAgIExvIE5pIFBvIERlICAgICAgICAgICAgICAgICA4MDEgSW0gRzFWICAgICAgICAgICAgICAgICANCktodXVtaWFtICAgICAgICAgICAgICAgICAgMDYwNiBDNzM2NzU3LUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjExIEltIE0wViAgICAgICAgICAgICAgICAgDQpLaHVraGkgICAgICAgICAgICAgICAgICAgIDA2MTIgQjY2Nzg5OC05ICAgUmkgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCBJbSBGM1YgTTdEICAgICAgICAgICAgIA0KSWdnYWFyICAgICAgICAgICAgICAgICAgICAwNjE5IEI3NTg4QTgtQSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTUgSW0gSzNWICAgICAgICAgICAgICAgICANClRvbGFzZWsgICAgICAgICAgICAgICAgICAgMDYyMiBBNjQ3Nzg5LUUgUyBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0IEltIE0xViAgICAgICAgICAgICAgICAgDQpPbnRhciAgICAgICAgICAgICAgICAgICAgIDA2MjQgQjEwMDIxMy1FIEEgTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDgwNCBJbSBNMVYgICAgICAgICAgICAgICAgIA0KU2VyaW1hYyAgICAgICAgICAgICAgICAgICAwNjM1IEI2NDI2NTItQSBOIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA5MDIgSW0gTTdWICAgICAgICAgICAgICAgICANClBhdHUgICAgICAgICAgICAgICAgICAgICAgMDYzNyBCNzk2Njc2LTcgUyBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgMjAzIEltIE00SUlJICAgICAgICAgICAgICAgDQpNYWFydXVyICAgICAgICAgICAgICAgICAgIDA3MDcgRTY5MjExMC1BICAgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDQyMCBJbSBLOFYgTTFEICAgICAgICAgICAgIA0KUnV1bmkgICAgICAgICAgICAgICAgICAgICAwNzEzIEIzMzM1NTctQyAgIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICAyMDMgSW0gTThWICAgICAgICAgICAgICAgICANCktpaXNoYWQgICAgICAgICAgICAgICAgICAgMDcxNCBCNkE3OEJELUIgICBGbCAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxIEltIEszViBNMUQgICAgICAgICAgICAgDQpVdXBpZyAgICAgICAgICAgICAgICAgICAgIDA3MTggRDc5NzExNC03ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDQwNSBJbSBLNFYgICAgICAgICAgICAgICAgIA0KU2hpa2EgICAgICAgICAgICAgICAgICAgICAwNzIxIEQyNTE1NzktOSAgIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA2MDEgSW0gTTBWIE0wRCAgICAgICAgICAgICANCkt1dWRha2kgICAgICAgICAgICAgICAgICAgMDcyMiBCMzYxNTc2LUEgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyIEltIE0wViAgICAgICAgICAgICAgICAgDQpBbnRhciAgICAgICAgICAgICAgICAgICAgIDA3MjUgQjQxMTExMS1EIE4gTG8gTmkgSWMgICAgICAgICAgICAgICAgICAgIDIwMyBJbSBNOElJICAgICAgICAgICAgICAgIA0KRHJhbCAgICAgICAgICAgICAgICAgICAgICAwNzI3IEI3Mjg5NjctRiBTIEhpIEluIENwICAgICAgICAgICAgICAgICAgICA5MTIgSW0gRzNWIE0zRCAgICAgICAgICAgICANClp6dWdlcCAgICAgICAgICAgICAgICAgICAgMDczMSBCNDUzOUNELUMgICBIaSBQbyAgICAgICAgICAgICAgICAgICAgICAgMzAwIEltIE0xViAgICAgICAgICAgICAgICAgDQpGZXJyw6kgICAgICAgICAgICAgICAgICAgICAwNzM0IEM3OTc3NzgtNSBTIEFnICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAgSW0gTTNWIE0zRCAgICAgICAgICAgICANClBhc2kgTWV0YWEgICAgICAgICAgICAgICAgMDczNSBENTg0NDc1LTQgUyBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgOTA0IEltIE0xViAgICAgICAgICAgICAgICAgDQpTaGFyYXNoICAgICAgICAgICAgICAgICAgIDA3MzcgQjg5ODY3NC04ICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDgyMyBJbSBHMVYgTTNEICAgICAgICAgICAgIA0KR2FhZ2VuICAgICAgICAgICAgICAgICAgICAwODA2IEEyMTI1MzEtRiBOIE5pIEljICAgICAgICAgICAgICAgICAgICAgICAxMDAgSW0gTTJWICAgICAgICAgICAgICAgICANCktpa2ltICAgICAgICAgICAgICAgICAgICAgMDgwOCBENTc1MzM0LTQgUyBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNzE0IEltIE0wSUkgTTZWICAgICAgICAgICAgDQpBbGVrdmFkaW4gICAgICAgICAgICAgICAgIDA4MTEgQjY3NTlBQi1FICAgSGkgSW4gICAgICAgICAgICAgICAgICAgICAgIDgwMiBJbSBNM1YgICAgICAgICAgICAgICAgIA0KS2FraHUgR2FzaCAgICAgICAgICAgICAgICAwODEyIEE4NDU4ODctOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTQgSW0gRzRWIE00RCAgICAgICAgICAgICANCktlc2hpICAgICAgICAgICAgICAgICAgICAgMDgxNiBCNzkyNTY2LUMgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNjEyIEltIEs0SUlJIE00RCAgICAgICAgICAgDQpJcnV1a3ppICAgICAgICAgICAgICAgICAgIDA4MjAgQjc3NjUxMC04ICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDkwMCBJbSBLM1YgTTVEICAgICAgICAgICAgIA0KTGFsYW5kYXIgICAgICAgICAgICAgICAgICAwODIxIEEwMDAzMjItRiBTIExvIE5pIEFzICAgICAgICAgICAgICAgICAgICA5MDQgSW0gRzZWICAgICAgICAgICAgICAgICANCkR1bmxlayAgICAgICAgICAgICAgICAgICAgMDgyMiBCMTQwMDAwLUQgTiBMbyBOaSBQbyBEZSBCYSAgICAgICAgICAgICAgMTE0IEltIEc5ViBNOUQgICAgICAgICAgICAgDQpFc3MgTnV1ciAgICAgICAgICAgICAgICAgIDA4MjcgQjM1MDQwMC1DICAgTmkgUG8gRGUgICAgICAgICAgICAgICAgICAgIDYxMyBJbSBNMlYgICAgICAgICAgICAgICAgIA0KS3VyIExpbW11ICAgICAgICAgICAgICAgICAwODMxIEM1NDk0NDktQiAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA2MTQgSW0gSzFWIE0xRCAgICAgICAgICAgICANCkJhaWxhYXplICAgICAgICAgICAgICAgICAgMDgzNSBENDM4MTEwLTYgUyBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTAzIEltIE02ViAgICAgICAgICAgICAgICAgDQpOaWdodCAgICAgICAgICAgICAgICAgICAgIDA4MzkgQTU3NDlDOS1GIE4gSGkgSW4gICAgICAgICAgICAgICAgICAgICAgIDMyMCBJbSBLOFZJIE00RCAgICAgICAgICAgIA0KS2FybmlrYSAgICAgICAgICAgICAgICAgICAwOTAxIEE3NTU4NzYtQiBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDIgSW0gRzBWICAgICAgICAgICAgICAgICANCkRpc2FsICAgICAgICAgICAgICAgICAgICAgMDkwMyBFMDAwMzAwLTggICBMbyBOaSBBcyAgICAgICAgICAgICAgICAgICAgNjEzIEltIEs1ViAgICAgICAgICAgICAgICAgDQpTaGF6ZWt1ICAgICAgICAgICAgICAgICAgIDA5MDUgQjU1M0E4OC1GIE4gSGkgUG8gICAgICAgICAgICAgICAgICAgICAgIDEwMCBJbSBNMlYgTTdEICAgICAgICAgICAgIA0KTXV1bXV1ICAgICAgICAgICAgICAgICAgICAwOTA2IEI3NzY1OUQtRCBTIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA5MDIgSW0gTTNWIEs3RCAgICAgICAgICAgICANCkdpc2ggICAgICAgICAgICAgICAgICAgICAgMDkwNyBCNzc4Njg3LTkgUyBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgOTMwIEltIEcwViBNN0QgICAgICAgICAgICAgDQpHaXNpZCAgICAgICAgICAgICAgICAgICAgIDA5MTAgRDU2NzEyNS00ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUwNSBJbSBLM1YgTTFEICAgICAgICAgICAgIA0KS2lrZWQgSWlnICAgICAgICAgICAgICAgICAwOTExIEM1NDU0NDgtQSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MDMgSW0gTTNWICAgICAgICAgICAgICAgICANCk11c2tveGFoICAgICAgICAgICAgICAgICAgMDkxNSBBNTc3MjAwLUYgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNjEzIEltIE0zViAgICAgICAgICAgICAgICAgDQpJcnNoaWlzaCAgICAgICAgICAgICAgICAgIDA5MTYgQjk1QTU2Ny1CICAgTmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDIwMSBJbSBHM1YgICAgICAgICAgICAgICAgIA0KTWFyaXhlIEthICAgICAgICAgICAgICAgICAwOTE5IEU1NTAwMDAtMCAgIEJhIERlICAgICAgICAgICAgICAgICAgICAgICAxMDQgSW0gTTFWICAgICAgICAgICAgICAgICANCldhc3RhbSAgICAgICAgICAgICAgICAgICAgMDkyMSBFNkE3Nzc3LTggICBGbCAgICAgICAgICAgICAgICAgICAgICAgICAgMzEwIEltIE00ViAgICAgICAgICAgICAgICAgDQpDZWxlbiAgICAgICAgICAgICAgICAgICAgIDA5MjIgQTM3NTAwMC1GIE4gTG8gTmkgQmEgICAgICAgICAgICAgICAgICAgIDMwMiBJbSBNMVYgICAgICAgICAgICAgICAgIA0KU2hlZHV1ICAgICAgICAgICAgICAgICAgICAwOTI5IEQ2NDk1NzctQSBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAgSW0gTTNWIE02RCAgICAgICAgICAgICANClNpbmlpciBTYSAgICAgICAgICAgICAgICAgMDkzMSBBNTk5MzY3LUMgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgODE0IEltIEcwViAgICAgICAgICAgICAgICAgDQpLYXNpbWlyICAgICAgICAgICAgICAgICAgIDA5MzMgQjg4QTEwNC1CIEEgTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDMxMSBJbSBLMklWICAgICAgICAgICAgICAgIA0KTWlzaGFhciAgICAgICAgICAgICAgICAgICAxMDAyIEIxNDBBQTgtRiBOIEhpIEluIFBvIERlICAgICAgICAgICAgICAgICA2MjAgSW0gQTJWICAgICAgICAgICAgICAgICANClV1c2xhICAgICAgICAgICAgICAgICAgICAgMTAwOCBCMzAyMzAxLUUgICBMbyBOaSBWYSBJYyAgICAgICAgICAgICAgICAgNDA0IEltIEszViAgICAgICAgICAgICAgICAgDQpMdXVtaWlsaWlwbGVuICAgICAgICAgICAgIDEwMDkgQjUzNjQ4OC1DIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDExMyBJbSBLNElWICAgICAgICAgICAgICAgIA0KVXVybXUgS3V1ICAgICAgICAgICAgICAgICAxMDEyIEI0MjQ0MDAtRiBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA1MjQgSW0gTTRWIE0wRCAgICAgICAgICAgICANClVzaHJhICAgICAgICAgICAgICAgICAgICAgMTAxNiBCMzYxOTY2LUQgVyBIaSBDcCAgICAgICAgICAgICAgICAgICAgICAgNzAzIEltIE0zViAgICAgICAgICAgICAgICAgDQpMaWdhIEthICAgICAgICAgICAgICAgICAgIDEwMTkgQjc4MzIwMC1DICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDkwMyBJbSBNMVYgTTFEICAgICAgICAgICAgIA0KS2FwbGlyICAgICAgICAgICAgICAgICAgICAxMDIyIEQ0NzMzMjItNiBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTMgSW0gRzBWICAgICAgICAgICAgICAgICANCklya2toYSAgICAgICAgICAgICAgICAgICAgMTAyMyBCMzIzNTU1LUIgICBOaSBQbyAgICAgICAgICAgICAgICAgICAgIEEgNTAwIEltIE0zViAgICAgICAgICAgICAgICAgDQpTaGFsYW0gICAgICAgICAgICAgICAgICAgIDEwMjggQzI1MDY0NC1BICAgTmkgUG8gRGUgICAgICAgICAgICAgICAgICAgIDQwMSBJbSBHM1YgICAgICAgICAgICAgICAgIA0KR2F2aW4gICAgICAgICAgICAgICAgICAgICAxMDMzIEI1NTYyMTUtRCBXIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDQgSW0gTTRWIE04RCAgICAgICAgICAgICANCkdpa3VyICAgICAgICAgICAgICAgICAgICAgMTAzNCBDNTMzNzYyLTYgICBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgMjAwIEltIE00ViBNOUQgICAgICAgICAgICAgDQpNYWRhbGFnYWEgICAgICAgICAgICAgICAgIDEwMzUgQjU4MTY2Ni1BIFMgTmkgUmkgICAgICAgICAgICAgICAgICAgICAgIDUwMyBJbSBHMlYgTTFWICAgICAgICAgICAgIA0KS2h1dW5pc2ggICAgICAgICAgICAgICAgICAxMDM3IEQ1NDIyMDEtOSBTIExvIE5pIFBvICAgICAgICAgICAgICAgICAgICA2MjQgSW0gTTVWICAgICAgICAgICAgICAgICANCk1hdXIgTmEgICAgICAgICAgICAgICAgICAgMTAzOCBCMzU4Njk3LUMgICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTE0IEltIE0zViAgICAgICAgICAgICAgICAgDQpEYXZsYSAgICAgICAgICAgICAgICAgICAgIDEwNDAgQjUyODIwMC1FICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDMyNSBJbSBNNVYgTTdEICAgICAgICAgICAgIA0KS2lpbWkgRGkgICAgICAgICAgICAgICAgICAxMTAxIEQxMjAyMzMtQiAgIExvIE5pIFBvIERlICAgICAgICAgICAgICAgICAyMDIgSW0gTTRWICAgICAgICAgICAgICAgICANCkdpcmlrYXNoICAgICAgICAgICAgICAgICAgMTEwMiBCNTk0MzQ0LUIgQSBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNzI0IEltIE03ViAgICAgICAgICAgICAgICAgDQpSYWUgICAgICAgICAgICAgICAgICAgICAgIDExMDQgRTU4MDg1OS02ICAgUmkgRGUgICAgICAgICAgICAgICAgICAgICAgIDMyMyBJbSBHMVYgTTlEICAgICAgICAgICAgIA0KVXVtZWF4YW4gICAgICAgICAgICAgICAgICAxMTA4IEI3NjU4OTUtQiBBIFJpICAgICAgICAgICAgICAgICAgICAgICAgICA0MTQgSW0gTTRWICAgICAgICAgICAgICAgICANClV1cnV1biBLdXUgICAgICAgICAgICAgICAgMTEwOSBDOTg3MjQ2LTcgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMTE0IEltIE02ViAgICAgICAgICAgICAgICAgDQpLaXNoICAgICAgICAgICAgICAgICAgICAgIDExMTIgQzMxMDQwMy05ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDQyMiBJbSBNNFZJIE0zRCAgICAgICAgICAgIA0KQWRndXUgVXVuICAgICAgICAgICAgICAgICAxMTE0IEE1MjA4MzQtQiAgIE5hIFBvIERlICAgICAgICAgICAgICAgICAgICA1MDMgSW0gTTFWIE0zRCAgICAgICAgICAgICANClZsYWFnZXNoIElpcmtpICAgICAgICAgICAgMTExNiBCNzgzNTExLTggICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgODAwIEltIEsxViBNNEQgICAgICAgICAgICAgDQpTaHV1bmtoYSAgICAgICAgICAgICAgICAgIDExMjAgQjM0MDdBNi1DIE4gUG8gRGUgICAgICAgICAgICAgICAgICAgICAgIDgwMyBJbSBNNFYgTTJEICAgICAgICAgICAgIA0KR3V1aXJrICAgICAgICAgICAgICAgICAgICAxMTIzIEExMDAxMzQtRiBOIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICA4MjUgSW0gTTJWICAgICAgICAgICAgICAgICANClBpeHRvbWUgICAgICAgICAgICAgICAgICAgMTEyNCBBOEFBNDUzLUYgQSBOaSBGbCBXYSAgICAgICAgICAgICAgICAgICAgMTEyIEltIE0xViBNNEQgICAgICAgICAgICAgDQpJc2hpaXJhICAgICAgICAgICAgICAgICAgIDExMjUgRDY1MjU1Mi05IFMgTmkgUG8gICAgICAgICAgICAgICAgICAgICAgIDIxMCBJbSBNMVYgTTNEIE05RCAgICAgICAgIA0KR2FzaGlsICAgICAgICAgICAgICAgICAgICAxMTI5IEM2QTQ1MTEtOCAgIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICA1MDQgSW0gSzNWIE0yRCAgICAgICAgICAgICANCk1lcmthYWtodSAgICAgICAgICAgICAgICAgMTEzMCBDNzlBNDY4LUMgUyBOaSBXYSAgICAgICAgICAgICAgICAgICAgICAgNTAxIEltIE05RCAgICAgICAgICAgICAgICAgDQpBdXJzaXMgICAgICAgICAgICAgICAgICAgIDExMzQgQTU0NTlCRC1GIEEgSGkgSW4gQ3AgICAgICAgICAgICAgICAgICAgIDUwMCBJbSBLMVYgICAgICAgICAgICAgICAgIA0KS2FhbWluZCAgICAgICAgICAgICAgICAgICAxMTQwIEJBRjM1NzktQSAgIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICA4MDAgSW0gSzBWICAgICAgICAgICAgICAgICANCkthcmdpICAgICAgICAgICAgICAgICAgICAgMTIwMiBCNTY5NjUxLUQgICBOaSBSaSAgICAgICAgICAgICAgICAgICAgICAgMzA1IEltIE0zViBHOEQgICAgICAgICAgICAgDQpMaW1hc2hpbWlpICAgICAgICAgICAgICAgIDEyMDQgRTQ0NzAwMC0wICAgQmEgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMiBJbSBNNEQgICAgICAgICAgICAgICAgIA0KTWlpbGFwIEthcyAgICAgICAgICAgICAgICAxMjA1IEI1OTA4ODYtQiBBIERlICAgICAgICAgICAgICAgICAgICAgICAgICA0MDQgSW0gSzNWICAgICAgICAgICAgICAgICANCkd1dW4gICAgICAgICAgICAgICAgICAgICAgMTIxNCBFNTg1NTU1LTggICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNDEyIEltIEs0ViAgICAgICAgICAgICAgICAgDQpBbWVkICAgICAgICAgICAgICAgICAgICAgIDEyMTkgQjIxMDZCOS1DIE4gTmEgTmkgICAgICAgICAgICAgICAgICAgICAgIDcyMCBJbSBHMFYgTThEICAgICAgICAgICAgIA0KUmh1YW4gICAgICAgICAgICAgICAgICAgICAxMjIwIEIxMDAxMjItQyAgIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICA2MDQgSW0gTTJWICAgICAgICAgICAgICAgICANClNodXVraGEgWnV1c2ggICAgICAgICAgICAgMTIyMSBCQUQ1NDQ2LTkgUyBOaSBGbCAgICAgICAgICAgICAgICAgICAgICAgMTEzIEltIEs2VkkgICAgICAgICAgICAgICAgDQpBcm1pICAgICAgICAgICAgICAgICAgICAgIDEyMjIgQjU3Nzg3NS04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxMyBJbSBHNFYgICAgICAgICAgICAgICAgIA0KTXVndXUgICAgICAgICAgICAgICAgICAgICAxMjIzIEQ1NTY0NDQtOSBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgQSA5MzAgSW0gSzlJSUkgTTBEICAgICAgICAgICANCkVzaG9uICAgICAgICAgICAgICAgICAgICAgMTIyNSBFMzQxNzY2LTcgICBQbyAgICAgICAgICAgICAgICAgICAgICAgICAgNTEwIEltIE0wViAgICAgICAgICAgICAgICAgDQpTaGFuaWkgQXJkdXUgICAgICAgICAgICAgIDEyMjYgQTQ4NTMzNC1EICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIyMiBJbSBNMFYgICAgICAgICAgICAgICAgIA0KTGlzaGlydXVkICAgICAgICAgICAgICAgICAxMjI4IEI2OTc5QUEtNyAgIEhpIEluICAgICAgICAgICAgICAgICAgICAgICAzMTMgSW0gTTdJViAgICAgICAgICAgICAgICANCkJhaXNpICAgICAgICAgICAgICAgICAgICAgMTIyOSBEMzU0NjlBLTUgICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNjEzIEltIE0zViBNNUQgICAgICAgICAgICAgDQpEaWFtIEthbmkgICAgICAgICAgICAgICAgIDEyMzIgQjEzMDU2My1EICAgTmkgUG8gRGUgICAgICAgICAgICAgICAgICAgIDcyMiBJbSBLMlYgICAgICAgICAgICAgICAgIA0KSWxsYXBwdSAgICAgICAgICAgICAgICAgICAxMjMzIEEzNzUwMjUtQiAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MjQgSW0gTTRWIE0wRCAgICAgICAgICAgICANCklzaG1hbCAgICAgICAgICAgICAgICAgICAgMTIzNiBCNDkxMzg0LUUgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMzAzIEltIE01ViBNNEQgICAgICAgICAgICAgDQpNaWlrdXUgQXIgICAgICAgICAgICAgICAgIDEyMzcgRTZBNzc2MS03ICAgRmwgICAgICAgICAgICAgICAgICAgICAgICAgIDkwMyBJbSBLMFYgICAgICAgICAgICAgICAgIA0KS2lyYmFydXMgICAgICAgICAgICAgICAgICAxMjM5IEI1NDc3NTktRCBOIEFnICAgICAgICAgICAgICAgICAgICAgICAgICAzMDIgSW0gTTBWICAgICAgICAgICAgICAgICANCkFsbGFtdSAgICAgICAgICAgICAgICAgICAgMTI0MCBDMjIzMzA0LTkgUyBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgMjE0IEltIEsySVYgTTdEICAgICAgICAgICAgDQpVdW1hYWQgTnVyaXIgICAgICAgICAgICAgIDEzMDIgQjc3ODQ3Ny1CICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIwNCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KQXNoZHV1bWEgICAgICAgICAgICAgICAgICAxMzA3IEM4OEE1NTMtQSAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICAzMTAgSW0gTTBJSUkgTTREICAgICAgICAgICANCkFrdXNzYW5qYSAgICAgICAgICAgICAgICAgMTMwOCBFNTU3MDAwLTAgUyBCYSAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0IEltIE00SUkgTThEICAgICAgICAgICAgDQpVdW5pbHV1ICAgICAgICAgICAgICAgICAgIDEzMDkgQjk0QTQzMi1CIE4gTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDcwMSBJbSBNMlYgTTdEIE04RCAgICAgICAgIA0KTXVraWlkICAgICAgICAgICAgICAgICAgICAxMzE0IEI4NTkzMjMtQiBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA1MDIgSW0gSzJWICAgICAgICAgICAgICAgICANClNoaWlyYW5kICAgICAgICAgICAgICAgICAgMTMxNiBEODVBODY5LTYgICBXYSAgICAgICAgICAgICAgICAgICAgICAgICAgMjAyIEltIEs3ViBNNUQgICAgICAgICAgICAgDQpHaXBraWtoYXIgICAgICAgICAgICAgICAgIDEzMTcgQjIwMzQ2Mi1FIEEgTG8gTmkgVmEgSWMgICAgICAgICAgICAgICAgIDMxMiBJbSBLNFYgTTdEICAgICAgICAgICAgIA0KQWRrYWFzaCAgICAgICAgICAgICAgICAgICAxMzIwIEIyMjIyMDEtQiBOIExvIE5pIFBvICAgICAgICAgICAgICAgICAgICA5MDIgSW0gTTVWICAgICAgICAgICAgICAgICANClJlbnUgICAgICAgICAgICAgICAgICAgICAgMTMyMSBCNjY0NjhCLTcgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgNjAwIEltIE00ViAgICAgICAgICAgICAgICAgDQpLZXBsbyAgICAgICAgICAgICAgICAgICAgIDEzMjIgQjY3NTg5OC1CIE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMyBJbSBNNFYgICAgICAgICAgICAgICAgIA0KQm9ndWV0aW4gICAgICAgICAgICAgICAgICAxMzIzIEEzMTA1QUMtRiBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAxMDMgSW0gRzNWIE04RCAgICAgICAgICAgICANClVzaHRhciAgICAgICAgICAgICAgICAgICAgMTMyOCBCNjQ3NTU0LUQgTiBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgMzAyIEltIE00ViBNMEQgICAgICAgICAgICAgDQpDYWxlc3NvbiAgICAgICAgICAgICAgICAgIDEzMzAgQjY4NTY0My04ICAgQWcgTmkgUmkgICAgICAgICAgICAgICAgICAgIDIwMCBJbSBGM1YgTTdEICAgICAgICAgICAgIA0KQW5zaGFyICAgICAgICAgICAgICAgICAgICAxMzM0IEJBQ0EzN0ItQyAgIExvIE5pIEZsIFdhICAgICAgICAgICAgICAgICAxMTIgSW0gRzVWIE0wRCAgICAgICAgICAgICANClVta2FzaHV1ICAgICAgICAgICAgICAgICAgMTMzNSBCMzU0OUM5LUMgICBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIyIEltIE0yViAgICAgICAgICAgICAgICAgDQpLcmFpbiAgICAgICAgICAgICAgICAgICAgIDEzMzYgRUE5NzU5Ni00ICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDUwMyBJbSBNM1YgTTBEICAgICAgICAgICAgIA0KUHJpbiAgICAgICAgICAgICAgICAgICAgICAxMzM4IEI2OTUzMDAtQyBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA5MDIgSW0gTTJWICAgICAgICAgICAgICAgICANCkdha3hhYWwgICAgICAgICAgICAgICAgICAgMTQwMyBFODk2MjAwLTYgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNjIxIEltIEcxViAgICAgICAgICAgICAgICAgDQpJbWd1dSAgICAgICAgICAgICAgICAgICAgIDE0MDcgQjIwMDMyMC1CIFMgTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDUyMCBJbSBNNVYgICAgICAgICAgICAgICAgIA0KVXVyZ2luICAgICAgICAgICAgICAgICAgICAxNDEwIEIyMTA2OUMtOSBBIE5hIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDMgSW0gTTNWICAgICAgICAgICAgICAgICANCkltZGkgTWkgICAgICAgICAgICAgICAgICAgMTQxNiBCNjhBNDMwLTkgICBMbyBOaSBXYSAgICAgICAgICAgICAgICAgICAgMjA0IEltIE0yViBNOEQgICAgICAgICAgICAgDQpLaXNoZHVzaCAgICAgICAgICAgICAgICAgIDE0MTggQzY0NjQ4QS04IFMgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDgwMyBJbSBNM1YgTTFEICAgICAgICAgICAgIA0KQWVuZ2FyICAgICAgICAgICAgICAgICAgICAxNDIxIEI0MzY4NjgtQiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MjIgSW0gTTBWIE0wRCAgICAgICAgICAgICANCkNob3RhdWsgICAgICAgICAgICAgICAgICAgMTQyMiBDN0MyMDQ4LUIgICBMbyBOaSBGbCAgICAgICAgICAgICAgICAgICAgOTExIEltIEc3ViBNMUQgTThEICAgICAgICAgDQpLaHVzZ3VybHUgICAgICAgICAgICAgICAgIDE0MjQgQjY1MjlFRy1EIE4gSGkgUG8gICAgICAgICAgICAgICAgICAgICAgIDIxNCBJbSBNMUlWICAgICAgICAgICAgICAgIA0KVmFsYWFyIEFraGFsICAgICAgICAgICAgICAxNDI4IEE2NTY1NDEtQyAgIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gSzZJSSBNOUQgTTJEICAgICAgICANCkFsdG9uICAgICAgICAgICAgICAgICAgICAgMTQzMCBCMTAwNTQyLUYgTiBOaSBWYSAgICAgICAgICAgICAgICAgICAgICAgNDAzIEltIEYxViBNMUQgICAgICAgICAgICAgDQpTYWFyICAgICAgICAgICAgICAgICAgICAgIDE0MzEgQzQ5NDA0Ni05IFMgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDkwMyBJbSBNN1YgICAgICAgICAgICAgICAgIA0KRGlpcm11dSAgICAgICAgICAgICAgICAgICAxNDM0IEM3NTUyMDMtQyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA1MDMgSW0gTTJWICAgICAgICAgICAgICAgICANCkFydmxlc3NhaXNoICAgICAgICAgICAgICAgMTQzNiBFNkIwNzhCLTkgICBEZSAgICAgICAgICAgICAgICAgICAgICAgICAgNDAxIEltIEczViAgICAgICAgICAgICAgICAgDQpNaXNoYWEgICAgICAgICAgICAgICAgICAgIDE0MzcgQjlBODMxMS05IFMgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDkxMyBJbSBNNklJSSAgICAgICAgICAgICAgIA0KTWluZHV1biBTYW1tYWQgICAgICAgICAgICAxNDQwIEE1OEE2OUMtRiAgIE5pIFJpIFdhICAgICAgICAgICAgICAgICAgICAzMDMgSW0gTTRWICAgICAgICAgICAgICAgICANClpla3RpbmQgSXIgICAgICAgICAgICAgICAgMTUwMyBDNTM2ODMxLTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0IEltIE0wViAgICAgICAgICAgICAgICAgDQpLdXVtICAgICAgICAgICAgICAgICAgICAgIDE1MDUgQjY2NzU0Ni04IFMgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDUxNCBJbSBLOUlJSSAgICAgICAgICAgICAgIA0KS2FrYWFndXVyICAgICAgICAgICAgICAgICAxNTA2IEM0ODY3OTYtOCAgIEFnIFJpICAgICAgICAgICAgICAgICAgICAgICA0MDQgSW0gSzNWICAgICAgICAgICAgICAgICANCkFzbWkgICAgICAgICAgICAgICAgICAgICAgMTUwOCBENjk3MjI2LTQgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTAwIEltIEc1ViAgICAgICAgICAgICAgICAgDQpLaW51dSAgICAgICAgICAgICAgICAgICAgIDE1MTAgRTExMDIzMi1CICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIwMyBJbSBNMklJICAgICAgICAgICAgICAgIA0KQW1hbiBVcmsgICAgICAgICAgICAgICAgICAxNTExIEU0NDUyNzktNyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAyMjMgSW0gTThWIE02RCAgICAgICAgICAgICANCkFuc2hhbSAgICAgICAgICAgICAgICAgICAgMTUxMiBCOEMyNzQ3LTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIE01ViAgICAgICAgICAgICAgICAgDQpEZXBvdCAgICAgICAgICAgICAgICAgICAgIDE1MTggQTg2QTQyMi1GIEQgTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDQyMCBJbSBNNElJSSAgICAgICAgICAgICAgIA0KU2hlciAgICAgICAgICAgICAgICAgICAgICAxNTE5IEQ5RDI2NjUtOCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA2MDMgSW0gTTJWIE03RCAgICAgICAgICAgICANClN1aHRsYW0gICAgICAgICAgICAgICAgICAgMTUyMiBCN0MwMDAwLUEgICBMbyBOaSBEZSBCYSAgICAgICAgICAgICAgICAgNjAwIEltIE03ViBNMEQgICAgICAgICAgICAgDQpCZWxpY29zZSAgICAgICAgICAgICAgICAgIDE1MjMgQTU5NjIzNi1DICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcxMyBJbSBNM1YgTTREICAgICAgICAgICAgIA0KU2hpYmFzaGxpaW0gICAgICAgICAgICAgICAxNTI0IEI2MjZBOEMtRiBOIEhpIEluIENwICAgICAgICAgICAgICAgICAgICA0MTIgSW0gSzRWICAgICAgICAgICAgICAgICANCk5hZ2Flc2ggICAgICAgICAgICAgICAgICAgMTUyNiBFNDAzNDcyLTggICBOaSBWYSBJYyAgICAgICAgICAgICAgICAgICAgNjIzIEltIE0xViAgICAgICAgICAgICAgICAgDQpCaWlya2UgICAgICAgICAgICAgICAgICAgIDE1MjkgRDIxMDEwMS05ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUyNCBJbSBGOFYgTTVEICAgICAgICAgICAgIA0KU2FudGFnICAgICAgICAgICAgICAgICAgICAxNTMwIEI1NjMxMDEtRSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDIgSW0gTTVJViBNNkQgICAgICAgICAgICANCkVtc2hhIExhICAgICAgICAgICAgICAgICAgMTUzMSBDMzMzODlDLUIgICBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgODEzIEltIEszViBNM0QgICAgICAgICAgICAgDQpaYWdpIFV1biAgICAgICAgICAgICAgICAgIDE1MzMgQjY0Nzg4Ni04IE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMiBJbSBNM1YgTTBEICAgICAgICAgICAgIA0KR2lkZWtpcyAgICAgICAgICAgICAgICAgICAxNTM0IEE3NkE1NTEtRCBOIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICA2MDMgSW0gSzFWIE02RCAgICAgICAgICAgICANClNodWVzaGxhciAgICAgICAgICAgICAgICAgMTUzNiBDNDM1OTk4LTkgUyBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTAyIEltIE0zSUlJIE0zRCAgICAgICAgICAgDQpFa2h1dXJtZSAgICAgICAgICAgICAgICAgIDE1MzggQTM0MzdCQi1BIE4gUG8gICAgICAgICAgICAgICAgICAgICAgICAgIDIwMSBJbSBLMFYgICAgICAgICAgICAgICAgIA0KRGltYW5hYW0gICAgICAgICAgICAgICAgICAxNTM5IEE1ODMyMjAtRiBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMDQgSW0gSzZWIE0xRCAgICAgICAgICAgICANCkdpaWFraWlzIEUgICAgICAgICAgICAgICAgMTYwNSBBNDQ2NDQ1LUMgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNDAwIEltIEsxViAgICAgICAgICAgICAgICAgDQpTaXJtYSAgICAgICAgICAgICAgICAgICAgIDE2MDkgQzIyNDk4QS1FICAgSGkgSW4gQ3AgICAgICAgICAgICAgICAgICAgIDUwMiBJbSBLNFYgTTNEICAgICAgICAgICAgIA0KTmFnYW4gICAgICAgICAgICAgICAgICAgICAxNjEwIEI2NDU2MjMtQyAgIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDMgSW0gTTFWICAgICAgICAgICAgICAgICANClNoYXV1ZyAgICAgICAgICAgICAgICAgICAgMTYxMSBCOTY0NDQyLUQgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTE0IEltIEswViAgICAgICAgICAgICAgICAgDQpNYXJsYWthc2kgICAgICAgICAgICAgICAgIDE2MTUgQjc3OTQwMC1CICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDQwNCBJbSBNMFYgICAgICAgICAgICAgICAgIA0KVmx1dXJ2bGFzaCAgICAgICAgICAgICAgICAxNjE2IEU5QjQ2ODMtOCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA2MTQgSW0gTTRWICAgICAgICAgICAgICAgICANCkhlcmFjbGVhICAgICAgICAgICAgICAgICAgMTYyMiBDMTIwNTc2LUQgICBOaSBQbyBEZSAgICAgICAgICAgICAgICAgICAgNDAxIEltIE0ySUkgTThWIE03RCAgICAgICAgDQpWZWxwYXJlICAgICAgICAgICAgICAgICAgIDE2MjMgQTU2NzYzNC05IFMgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDQyNCBJbSBNM1YgRzJEICAgICAgICAgICAgIA0KS2lya3VzICAgICAgICAgICAgICAgICAgICAxNjI1IEI4ODU2NDAtQiBOIEFnIE5pIFJpICAgICAgICAgICAgICAgICAgICA3MTQgSW0gSzRJViAgICAgICAgICAgICAgICANCkFtc2hha2UgICAgICAgICAgICAgICAgICAgMTYyOCBCNjMzN0M5LUIgUyBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgMjA0IEltIEYzSVYgICAgICAgICAgICAgICAgDQpSYXNoaXVvbiAgICAgICAgICAgICAgICAgIDE2MzAgQjEzMDIyMS1FICAgTG8gTmkgUG8gRGUgICAgICAgICAgICAgICAgIDQwMyBJbSBNN0lWICAgICAgICAgICAgICAgIA0KUmVzaGkgVXVuICAgICAgICAgICAgICAgICAxNjMzIEIzMDA2NjYtRCAgIE5hIE5pIFZhICAgICAgICAgICAgICAgICAgICA4MDEgSW0gSzRJSUkgICAgICAgICAgICAgICANCktoYXNoaWd1biAgICAgICAgICAgICAgICAgMTYzNSBDNjI3NTdCLUEgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0IEltIEswViAgICAgICAgICAgICAgICAgDQpNYWxhYXNoICAgICAgICAgICAgICAgICAgIDE2MzggRTc1OTg3Ny01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxMiBJbSBLMklWIE0yRCAgICAgICAgICAgIA0KS2FtYSAgICAgICAgICAgICAgICAgICAgICAxNzAxIEU5OUE0ODktOCAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICAyMjQgSW0gTTFWICAgICAgICAgICAgICAgICANCklza2kgS3V1ICAgICAgICAgICAgICAgICAgMTcwMiBDNDYzN0I2LTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAyIEltIE00ViAgICAgICAgICAgICAgICAgDQpJcmtoZWRpICAgICAgICAgICAgICAgICAgIDE3MDMgQjY0NTM2Ny1EIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwMCBJbSBNNlYgICAgICAgICAgICAgICAgIA0KRXJkaSAgICAgICAgICAgICAgICAgICAgICAxNzA3IEI2ODY3NDUtOSBOIEFnIFJpICAgICAgICAgICAgICAgICAgICAgICA4MDAgSW0gTTFWICAgICAgICAgICAgICAgICANClVubmFnaWx1ICAgICAgICAgICAgICAgICAgMTcwOCBCMDAwODY4LUIgUyBOYSBBcyAgICAgICAgICAgICAgICAgICAgICAgOTA0IEltIEcyViAgICAgICAgICAgICAgICAgDQpLaGVyaXAgQWcgICAgICAgICAgICAgICAgIDE3MTAgRTAwMDIzMC04ICAgTG8gTmkgQXMgICAgICAgICAgICAgICAgICAgIDMxMSBJbSBNOVYgTTJEICAgICAgICAgICAgIA0KS2Fha2hlIE1pcmlyICAgICAgICAgICAgICAxNzExIEQxMDA3QjgtOSBTIE5hIFZhICAgICAgICAgICAgICAgICAgICAgICA4MTIgSW0gSzBWICAgICAgICAgICAgICAgICANClJpc29uICAgICAgICAgICAgICAgICAgICAgMTcxMyBCOUQzNjk1LUEgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNzE0IEltIEswViAgICAgICAgICAgICAgICAgDQpGb3Jub2wgICAgICAgICAgICAgICAgICAgIDE3MTUgQjU4MTlDQS1BIE4gSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMiBJbSBLMFYgICAgICAgICAgICAgICAgIA0KS2FzZGFnYSAgICAgICAgICAgICAgICAgICAxNzE3IEQ5QjczNjItQSBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MjQgSW0gSzBWICAgICAgICAgICAgICAgICANClRlbXJhICAgICAgICAgICAgICAgICAgICAgMTcyMSBCNTY1Nzg2LUIgTiBBZyBSaSAgICAgICAgICAgICAgICAgICAgICAgNDA0IEltIEcwViBNNEQgICAgICAgICAgICAgDQpBa2V5b2xhcml4ICAgICAgICAgICAgICAgIDE3MjQgQTY3NTQ0Ni1FIE4gTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDQyNCBJbSBNMklJSSAgICAgICAgICAgICAgIA0KQydyZSAgICAgICAgICAgICAgICAgICAgICAxNzI1IEI0NDU4ODUtQyBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDMgSW0gTTBWICAgICAgICAgICAgICAgICANCkRlbWxhICAgICAgICAgICAgICAgICAgICAgMTcyNiBCMDAwOEFGLUMgUyBOYSBBcyAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIE0xViBNMkQgICAgICAgICAgICAgDQpCcmFuZWQgICAgICAgICAgICAgICAgICAgIDE3MjcgQjhCMTQxMS1DIE4gTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDUwNSBJbSBNMElJICAgICAgICAgICAgICAgIA0KV2FkdXVrYSAgICAgICAgICAgICAgICAgICAxNzMwIEJBQjQ0MzUtQiAgIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICAxMDQgSW0gTThWSSBNMEQgICAgICAgICAgICANCk1hYXNhYW5pbiAgICAgICAgICAgICAgICAgMTczMiBCNzU4NDU0LUIgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIE00ViBNN0QgICAgICAgICAgICAgDQpSaWlkICAgICAgICAgICAgICAgICAgICAgIDE3MzMgQjg2NTQwMC1CICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNCBJbSBLM1YgICAgICAgICAgICAgICAgIA0KU2FudHJ5ICAgICAgICAgICAgICAgICAgICAxNzM2IEI0MjA4NTMtRiBOIE5hIFBvIERlICAgICAgICAgICAgICAgICAgICA2MDAgSW0gTTFWIE02RCAgICAgICAgICAgICANCk1pbmFtdWxhbSBLaXJhayAgICAgICAgICAgMTczNyBCMzc0NDc2LUEgICBOaSAgICAgICAgICAgICAgICAgICAgICAgIEEgNjAwIEltIE00ViAgICAgICAgICAgICAgICAgDQpHaW5uYSAgICAgICAgICAgICAgICAgICAgIDE3MzggQzhBNjIwMy1BICAgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDIxMyBJbSBNNVYgTTZEICAgICAgICAgICAgIA0KRW5zaHV1a2thciAgICAgICAgICAgICAgICAxNzM5IEI2QTY3NjQtQyAgIEZsICAgICAgICAgICAgICAgICAgICAgICAgICA2MTIgSW0gTTRWICAgICAgICAgICAgICAgICANCktpbm5lZCAgICAgICAgICAgICAgICAgICAgMTgwMSBENDUxNTg4LTUgUyBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgNzI1IEltIEsyViBNNEQgICAgICAgICAgICAgDQpHYW1paWdlbGEgICAgICAgICAgICAgICAgIDE4MDggQjEwMDU0NC1EICAgTmkgVmEgICAgICAgICAgICAgICAgICAgICAgIDIyMyBJbSBLMlYgICAgICAgICAgICAgICAgIA0KS2hpaWRrYXIgICAgICAgICAgICAgICAgICAxODEyIEIzODM2NTctQyBBIE5pIFJpICAgICAgICAgICAgICAgICAgICAgICA3MDUgSW0gSzBWICAgICAgICAgICAgICAgICANCkxlY3RvcnNlbiAgICAgICAgICAgICAgICAgMTgxMyBEMzU0NjU1LTUgICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTAwIEltIEswViAgICAgICAgICAgICAgICAgDQpUaGFzcyAgICAgICAgICAgICAgICAgICAgIDE4MTUgQjUxMDQyMC05ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcxMyBJbSBLMFYgICAgICAgICAgICAgICAgIA0KQmFscGFuICAgICAgICAgICAgICAgICAgICAxODE5IEI1MDUzNDUtOSBBIExvIE5pIFZhIEljICAgICAgICAgICAgICAgICA2MDAgSW0gSzBWICAgICAgICAgICAgICAgICANClRlbGwgICAgICAgICAgICAgICAgICAgICAgMTgyMSBBNzhBMzcyLUYgTiBMbyBOaSBXYSAgICAgICAgICAgICAgICAgICAgNTAyIEltIE00ViBNNUQgICAgICAgICAgICAgDQpBbmdhIEtlICAgICAgICAgICAgICAgICAgIDE4MjIgQTIwMDM1My1GIE4gTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDkxMiBJbSBNM1YgSzJEICAgICAgICAgICAgIA0KR2VyYXIgS2hhc2hpaSAgICAgICAgICAgICAxODIzIEU4QjczMzMtNyAgIExvIE5pIEZsICAgICAgICAgICAgICAgICAgICA2MDQgSW0gTTNWICAgICAgICAgICAgICAgICANCk1hbmRoZW0gICAgICAgICAgICAgICAgICAgMTgyNCBFNTU0MTAwLTYgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIE00ViAgICAgICAgICAgICAgICAgDQpSYXJrYW4gICAgICAgICAgICAgICAgICAgIDE4MjUgQjVBMjIwMC1EIFMgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDUwMSBJbSBNOUQgTTlEICAgICAgICAgICAgIA0KU2hpcyAgICAgICAgICAgICAgICAgICAgICAxODI5IEIyMTE3NzktRSAgIE5hIEljICAgICAgICAgICAgICAgICAgICAgICA3MTMgSW0gRzBWICAgICAgICAgICAgICAgICANCkdpcnJpayAgICAgICAgICAgICAgICAgICAgMTgzMSBDNjYzNDEwLTYgUyBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMjI1IEltIE0yViBNOEQgICAgICAgICAgICAgDQpTaGFhcmFtICAgICAgICAgICAgICAgICAgIDE4MzMgRDQ2NDg3NC05ICAgUmkgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNCBJbSBNMklJICAgICAgICAgICAgICAgIA0KS2hlYSAgICAgICAgICAgICAgICAgICAgICAxODM2IEIzNDA5NTUtRiAgIEhpIEluIFBvIERlICAgICAgICAgICAgICAgICAzMDMgSW0gSzFWIE0wRCAgICAgICAgICAgICANCkFubHVtaXIgICAgICAgICAgICAgICAgICAgMTgzNyBCQTlBMjAxLUYgTiBMbyBOaSBXYSAgICAgICAgICAgICAgICAgICAgNzAwIEltIEc2ViAgICAgICAgICAgICAgICAgDQpJcmFkZGlpICAgICAgICAgICAgICAgICAgIDE4MzggRDk4OTYyMC03IFMgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDYwMyBJbSBNNFYgICAgICAgICAgICAgICAgIA0KUmlsaWsgQWFzaCAgICAgICAgICAgICAgICAxODM5IEI3ODI0NTUtQSBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAzMDEgSW0gRzVWSSAgICAgICAgICAgICAgICANClNhcnV1bWRpaXVzaCAgICAgICAgICAgICAgMTg0MCBFNzQzN0JDLTUgICBQbyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwIEltIE0xViAgICAgICAgICAgICAgICAgDQpaYW5paW4gICAgICAgICAgICAgICAgICAgIDE5MDEgQjY5NDVBQi1DICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDMwMCBJbSBBM1YgTTdEICAgICAgICAgICAgIA0KSXJiaSAgICAgICAgICAgICAgICAgICAgICAxOTAyIEI4ODk0OEEtQiAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA1MDMgSW0gTThWIE05RCAgICAgICAgICAgICANCklpc2thIEFzaGdpICAgICAgICAgICAgICAgMTkwOSBENDMzNTQxLTYgUyBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgODAwIEltIEs1ViBNNEQgTTNEICAgICAgICAgDQpLaGFtaWlsYSAgICAgICAgICAgICAgICAgIDE5MTIgQjQzMDU1MS1GIEEgTmkgUG8gRGUgICAgICAgICAgICAgICAgICAgIDYxMiBJbSBLMFYgICAgICAgICAgICAgICAgIA0KSXJ1cmsgICAgICAgICAgICAgICAgICAgICAxOTE2IEEzNDQ4ODktQiBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MTQgSW0gSzBWICAgICAgICAgICAgICAgICANCkFnZ2lpIEdhbmFhbiAgICAgICAgICAgICAgMTkxNyBEMjIyNzQ3LTYgUyBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgMTA0IEltIEswViAgICAgICAgICAgICAgICAgDQpUcmFhayAgICAgICAgICAgICAgICAgICAgIDE5MTggQjYyNDg4Qy1BIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwNCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KQ3JvbXB0b24gICAgICAgICAgICAgICAgICAxOTE5IEU3NzYwMDAtMCAgIEJhICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgSW0gSzBWICAgICAgICAgICAgICAgICANClNoaW9uICAgICAgICAgICAgICAgICAgICAgMTkyMCBENDEwMzQ0LTcgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMTAzIEltIEswViAgICAgICAgICAgICAgICAgDQpTb3JjZXQgICAgICAgICAgICAgICAgICAgIDE5MjEgQjI0NTc0MC05ICAgQWcgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNCBJbSBHNFYgICAgICAgICAgICAgICAgIA0KTWFyb3RhICAgICAgICAgICAgICAgICAgICAxOTI0IEU0NTUzMzUtNSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMDAgSW0gQTRWIE0zVkkgICAgICAgICAgICANCk5hYXJ1cCBFbXJpbSAgICAgICAgICAgICAgMTkyNSBBNDg1Njk5LUMgTiBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgMzAwIEltIE0wViBNNUQgICAgICAgICAgICAgDQpLaGlyaSAgICAgICAgICAgICAgICAgICAgIDE5MjcgQjk0QTc3NS03ICAgV2EgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNCBJbSBLMlYgTTVEICAgICAgICAgICAgIA0KRmFyaG9tZSAgICAgICAgICAgICAgICAgICAxOTI5IEU2Mjg1NDQtNiAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA5MjQgSW0gTTJWICAgICAgICAgICAgICAgICANCktlZ2kgQWF0cmEgICAgICAgICAgICAgICAgMTkzMCBBMDAwNzg0LUUgICBBcyBOYSAgICAgICAgICAgICAgICAgICAgICAgNjA0IEltIEExViAgICAgICAgICAgICAgICAgDQpLdXVzaHJ1dSAgICAgICAgICAgICAgICAgIDE5MzMgQjU5OTc3NS1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwNCBJbSBNMVYgTTVEICAgICAgICAgICAgIA0KWmlzaG1hIEtoYSAgICAgICAgICAgICAgICAxOTM0IEI4ODY4NzktNyBOIFJpIENwICAgICAgICAgICAgICAgICAgICAgICAzMDAgSW0gTTJWICAgICAgICAgICAgICAgICANCktlc2hpICAgICAgICAgICAgICAgICAgICAgMTkzOCBCNTY2OUQ4LTggICBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0IEltIEszViBNMUQgTTBEICAgICAgICAgDQpOYWRpciAgICAgICAgICAgICAgICAgICAgIDE5NDAgQjU0ODg0NC1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyMCBJbSBNNklJSSAgICAgICAgICAgICAgIA0KQW11ciBJc2FyayAgICAgICAgICAgICAgICAyMDA2IEIyMTA4NjctOSBOIE5hICAgICAgICAgICAgICAgICAgICAgICAgICA0MTIgSW0gTTJWICAgICAgICAgICAgICAgICANCkFtZXJvcyAgICAgICAgICAgICAgICAgICAgMjAwOCBCMTEwNTQyLUYgTiBOaSBDcCAgICAgICAgICAgICAgICAgICAgICAgNjA1IEltIE0xViBNN0QgICAgICAgICAgICAgDQpNYXNoYWEgICAgICAgICAgICAgICAgICAgIDIwMTAgQjhCNzQ5Ni1EIFMgTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDkwNSBJbSBHM1YgICAgICAgICAgICAgICAgIA0KRHVkYWthICAgICAgICAgICAgICAgICAgICAyMDExIEU1NDQwMDAtMCAgIEJhICAgICAgICAgICAgICAgICAgICAgICAgICAxMDMgSW0gSzBWICAgICAgICAgICAgICAgICANClRpd2F0aCAgICAgICAgICAgICAgICAgICAgMjAxMiBFNjUxNTc1LTggICBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgNjMzIEltIEswViAgICAgICAgICAgICAgICAgDQpNb3JpaSAgICAgICAgICAgICAgICAgICAgIDIwMTQgQjYyQTY0NC05ICAgTmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDIxNCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KWnVhcmtyaSAgICAgICAgICAgICAgICAgICAyMDE2IEI4Nzc2NTUtQyBXIEFnIE5pIFJpICAgICAgICAgICAgICAgICAgICA2MDQgSW0gSzBWICAgICAgICAgICAgICAgICANCkthaW4gICAgICAgICAgICAgICAgICAgICAgMjAxNyBFNTc2MDAwLTAgICBCYSAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxIEltIEswViAgICAgICAgICAgICAgICAgDQpUZXJ0aGEgICAgICAgICAgICAgICAgICAgIDIwMjAgQzIwMDM0Mi1BICAgTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDUxMyBJbSBLMFYgICAgICAgICAgICAgICAgIA0KQW50aGVyICAgICAgICAgICAgICAgICAgICAyMDIxIEEzMDA2OTctRSBOIE5hIE5pIFZhICAgICAgICAgICAgICAgICAgICA2MTUgSW0gSzlJViAgICAgICAgICAgICAgICANClByaW5vc2t1ICAgICAgICAgICAgICAgICAgMjAyNyBCOUE1NjlBLUIgTiBGbCBOaSAgICAgICAgICAgICAgICAgICAgICAgMTAwIEltIEs1VkkgICAgICAgICAgICAgICAgDQpCYXNpbGl1biAgICAgICAgICAgICAgICAgIDIwMjggQTQ0MzEwNC1EIE4gTG8gTmkgUG8gICAgICAgICAgICAgICAgICAgIDkwNCBJbSBHMVYgTTJEICAgICAgICAgICAgIA0KUmVnbmkgRGluICAgICAgICAgICAgICAgICAyMDMwIEQ2M0E1NjYtOCAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICAyMTQgSW0gTTRWICAgICAgICAgICAgICAgICANCkRpbmRha2hhcmEgICAgICAgICAgICAgICAgMjAzNCBCMzI0NTc5LUUgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTAzIEltIE0xSUlJICAgICAgICAgICAgICAgDQpVdW5kaXppICAgICAgICAgICAgICAgICAgIDIwMzYgQTQxMDg1Ni1GIE4gTmEgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNCBJbSBHOElJSSBNOEQgICAgICAgICAgIA0KRGFhdWQgVXJsZSAgICAgICAgICAgICAgICAyMDM3IEIzMzMyMTEtQyBBIExvIE5pIFBvICAgICAgICAgICAgICAgICAgICA2MjAgSW0gTTFWICAgICAgICAgICAgICAgICANCkdpbW1pIFV1c3NoYWEgICAgICAgICAgICAgMjAzOCBCNDc2NDUwLUMgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgIEEgNTAyIEltIEswViAgICAgICAgICAgICAgICAgDQpLaGlpIElzaXMgICAgICAgICAgICAgICAgIDIwNDAgQTI0MDc0NS1BICAgUG8gRGUgICAgICAgICAgICAgICAgICAgICAgIDIwMiBJbSBNM1YgTTJEICAgICAgICAgICAgIA0KS2hpenV1biAgICAgICAgICAgICAgICAgICAyMTAxIEE4NUE2OUQtRSAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICA1MDMgSW0gTTRWICAgICAgICAgICAgICAgICANClJhdmxhICAgICAgICAgICAgICAgICAgICAgMjEwMiBCNTU0MjQwLTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTEwIEltIEc1SVYgICAgICAgICAgICAgICAgDQpJbmx1biBSYSAgICAgICAgICAgICAgICAgIDIxMDMgRTAwMDEyNy05ICAgTG8gTmkgQXMgICAgICAgICAgICAgICAgICAgIDgwNSBJbSBLMlYgICAgICAgICAgICAgICAgIA0KTnV1ZGxlICAgICAgICAgICAgICAgICAgICAyMTA0IEI4ODQ4NjktQiAgIFJpICAgICAgICAgICAgICAgICAgICAgICAgICA5MDIgSW0gSzVEIE0wRCAgICAgICAgICAgICANClNoaXphICAgICAgICAgICAgICAgICAgICAgMjEwNSBCNDYxNTQyLUUgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNjAzIEltIE00ViBNOUQgICAgICAgICAgICAgDQpTaWR1a2EgICAgICAgICAgICAgICAgICAgIDIxMTEgQjQ0NjY4OS1DIE4gQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDIwMCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KTmFwcGFyICAgICAgICAgICAgICAgICAgICAyMTEyIEM0Mjg1NjctOCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA4MjAgSW0gSzBWICAgICAgICAgICAgICAgICANClppbWlpbiAgICAgICAgICAgICAgICAgICAgMjExNSBBMzMxNzU4LUYgTiBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIEswViAgICAgICAgICAgICAgICAgDQpDYXBpdGFsICAgICAgICAgICAgICAgICAgIDIxMTggQTU4NkE5OC1GIEIgSGkgQ2EgQ3ggQ3AgICAgICAgICAgICAgICAgIDYwNSBTeSBLMFYgICAgICAgICAgICAgICAgIA0KQWZmaW5pdHkgICAgICAgICAgICAgICAgICAyMTIxIEI5OEE1NjEtQSAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICAyMTMgSW0gRzFWICAgICAgICAgICAgICAgICANCklpcnVra2h1bnogICAgICAgICAgICAgICAgMjEyMiBCNDc2MDAwLUQgQSBMbyBOaSBCYSAgICAgICAgICAgICAgICAgICAgOTAwIEltIE05ViAgICAgICAgICAgICAgICAgDQpFbGlndXJhc2ggICAgICAgICAgICAgICAgIDIxMjUgQTUyNDU3NS1DICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMyBJbSBLNFYgTTlEICAgICAgICAgICAgIA0KSXJ1aWUgS2FkbyAgICAgICAgICAgICAgICAyMTMwIEI1NjU1NTgtQiBOIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDMgSW0gRzRWICAgICAgICAgICAgICAgICANCkRlZ2thayBVdW4gICAgICAgICAgICAgICAgMjEzMyBFODhBNjU0LTggICBOaSBSaSBXYSAgICAgICAgICAgICAgICAgICAgMjEwIEltIEs0SUlJICAgICAgICAgICAgICAgDQpEaWxpaWcgICAgICAgICAgICAgICAgICAgIDIxMzUgRDc0OTEyMS02ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUxMyBJbSBLNlYgICAgICAgICAgICAgICAgIA0KS2lpciAgICAgICAgICAgICAgICAgICAgICAyMTM2IEE3N0E1QUQtRiAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICA1MDQgSW0gTTNWIE02RCAgICAgICAgICAgICANCkFka2hpICAgICAgICAgICAgICAgICAgICAgMjEzOCBFODg4NjZBLTUgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgMTAwIEltIE0zViBNM0QgICAgICAgICAgICAgDQpHaW5uYWthciAgICAgICAgICAgICAgICAgIDIxMzkgQjU2NTIwMC1DIFcgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUwMiBJbSBNOFYgTTVEICAgICAgICAgICAgIA0KU2lkemVyICAgICAgICAgICAgICAgICAgICAyMTQwIEMyMDA3OUQtQSAgIE5hIFZhICAgICAgICAgICAgICAgICAgICAgICA3MTAgSW0gTTJJSUkgTTFWSSAgICAgICAgICANCkFuZGthZyBQYSAgICAgICAgICAgICAgICAgMjIwMyBCMzM4NDQxLUMgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgODAwIEltIEsyViAgICAgICAgICAgICAgICAgDQpEYWFzaCAgICAgICAgICAgICAgICAgICAgIDIyMDUgQjUzODU0NS1DIEEgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDkyMyBJbSBHM1YgICAgICAgICAgICAgICAgIA0KRWRpcmtpc2RpaSAgICAgICAgICAgICAgICAyMjA2IEI0NDQzMTAtRSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgQSAzMTMgSW0gQThWICAgICAgICAgICAgICAgICANCk5pbWx1aW4gICAgICAgICAgICAgICAgICAgMjIwOSBCNDc2OTY1LUYgQSBIaSBJbiBDcCAgICAgICAgICAgICAgICAgICAgNDEwIEltIE0xViBNOUQgICAgICAgICAgICAgDQpHaXMgICAgICAgICAgICAgICAgICAgICAgIDIyMTAgQzU2Mjc2Ny01IFMgUmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNSBJbSBNMlYgTTFEICAgICAgICAgICAgIA0KU2h1c2hhbiAgICAgICAgICAgICAgICAgICAyMjExIEE2NTUzMzUtRSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA5MjQgSW0gSzBWICAgICAgICAgICAgICAgICANCktpaXJyaSAgICAgICAgICAgICAgICAgICAgMjIxMyBCNTQxMjMxLTYgICBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgODE0IFN5IEswViAgICAgICAgICAgICAgICAgDQpTaHVkdXNoYW0gICAgICAgICAgICAgICAgIDIyMTQgRTg0OTg1NS1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwNCBTeSBLMFYgICAgICAgICAgICAgICAgIA0KUmh5bGVhICAgICAgICAgICAgICAgICAgICAyMjE2IEI4QTY1MzAtOCAgIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICA2MjMgU3kgSzBWICAgICAgICAgICAgICAgICANClN5cm9lICAgICAgICAgICAgICAgICAgICAgMjIxOCBCNDM2ODU0LUQgQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIEswViAgICAgICAgICAgICAgICAgDQpBc2UgICAgICAgICAgICAgICAgICAgICAgIDIyMTkgQjIyMDk4Qi1GICAgSGkgTmEgSW4gUG8gRGUgICAgICAgICAgICAgIDExMCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KS2hpc2huYXIgICAgICAgICAgICAgICAgICAyMjIwIEQ0NjI4Q0EtNCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTMgSW0gSzBWICAgICAgICAgICAgICAgICANCkxhbWlyaXUgICAgICAgICAgICAgICAgICAgMjIyMSBCOTk4NjU2LTkgTiBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgODE1IEltIEsxViBNNUQgICAgICAgICAgICAgDQpNaXJlc2ggS2FhbiAgICAgICAgICAgICAgIDIyMjIgQjg1NTc0Ni1DICAgQWcgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMyBJbSBNMFYgICAgICAgICAgICAgICAgIA0KQ2F1bG8gTXVuICAgICAgICAgICAgICAgICAyMjIzIEE4NjY2NDUtOSAgIEFnIE5pIFJpICAgICAgICAgICAgICAgICAgICA1MDIgSW0gTTJWICAgICAgICAgICAgICAgICANCkNoYW50ICAgICAgICAgICAgICAgICAgICAgMjIyNCBBMTYwNjg4LUYgVyBOaSBSaSBEZSBDcCAgICAgICAgICAgICAgICAgOTAzIEltIEsySUkgICAgICAgICAgICAgICAgDQpNZWl6aSAgICAgICAgICAgICAgICAgICAgIDIyMjUgQjUxMjg0Ny1CIFMgTmEgSWMgICAgICAgICAgICAgICAgICAgICAgIDExMSBJbSBLNFYgICAgICAgICAgICAgICAgIA0KU2tlZW4gICAgICAgICAgICAgICAgICAgICAyMjI2IEI0OTE5OUItRiAgIEhpIEluICAgICAgICAgICAgICAgICAgICAgICA0MjIgSW0gSzFWICAgICAgICAgICAgICAgICANCkxpZGVyICAgICAgICAgICAgICAgICAgICAgMjIyNyBDMzU3NzQ3LUEgICBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAzIEltIEszViBNNkQgICAgICAgICAgICAgDQpLdXVtYSAgICAgICAgICAgICAgICAgICAgIDIyMzIgQjUzODgzNi1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMiBJbSBNMVYgTTdWICAgICAgICAgICAgIA0KTWlyZXppICAgICAgICAgICAgICAgICAgICAyMjM3IEIyMDMyMTItQyBOIExvIE5pIFZhIEljICAgICAgICAgICAgICAgICAyMDAgSW0gRjlWICAgICAgICAgICAgICAgICANCkVyZW0gRGFzaCAgICAgICAgICAgICAgICAgMjMwNiBDNjQ1NDQxLUIgUyBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzIEltIE0wViBNOEQgICAgICAgICAgICAgDQpHaWlra2FsYSAgICAgICAgICAgICAgICAgIDIzMTIgQjc5QTU1Ny1GICAgTmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDQwMyBJbSBLMFYgICAgICAgICAgICAgICAgIA0KTGFhaXJlciAgICAgICAgICAgICAgICAgICAyMzE0IEI1NTk2NjctQiAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQgU3kgSzBWICAgICAgICAgICAgICAgICANCklkbXVtICAgICAgICAgICAgICAgICAgICAgMjMxNiBCNDQ0ODU0LTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAyIFN5IEswViAgICAgICAgICAgICAgICAgDQpDb2RzZW4gICAgICAgICAgICAgICAgICAgIDIzMTcgRTU3MTU2OC0yICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMCBTeSBLMFYgICAgICAgICAgICAgICAgIA0KS3V1bmVuIElzaCAgICAgICAgICAgICAgICAyMzE4IEIyMTA1NzctQSBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAxMTMgU3kgSzBWICAgICAgICAgICAgICAgICANCklwZHV1IEluICAgICAgICAgICAgICAgICAgMjMxOSBDOTc5Nzg4LUIgUyBSaSAgICAgICAgICAgICAgICAgICAgICAgICAgNDE0IEltIEswViAgICAgICAgICAgICAgICAgDQpVbWdhZGluICAgICAgICAgICAgICAgICAgIDIzMjAgQjZCNTk0Ni1CICAgSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMiBJbSBLMFYgICAgICAgICAgICAgICAgIA0KU2h1c2EgICAgICAgICAgICAgICAgICAgICAyMzIyIEE1ODE2NTEtRiAgIE5pIFJpICAgICAgICAgICAgICAgICAgICAgICA5MDQgSW0gTTJWIE01RCAgICAgICAgICAgICANCk1lcmF0ICAgICAgICAgICAgICAgICAgICAgMjMyMyBCNDIzODY4LUEgTiBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgNDAzIEltIEs0ViAgICAgICAgICAgICAgICAgDQpMaW1lc2ggQWt1biAgICAgICAgICAgICAgIDIzMjYgRDQxMDY2Ni03IFMgTmEgTmkgICAgICAgICAgICAgICAgICAgICAgIDkxMCBJbSBLMVZJICAgICAgICAgICAgICAgIA0KUmlqYXMgVm9yZWEgICAgICAgICAgICAgICAyMzI3IEI3NTkzMDAtRCAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTMgSW0gTTNWICAgICAgICAgICAgICAgICANClJhYW1pICAgICAgICAgICAgICAgICAgICAgMjMzMCBCNTIyOTY2LUYgICBIaSBOYSBJbiBQbyAgICAgICAgICAgICAgICAgNjAzIEltIE0yViAgICAgICAgICAgICAgICAgDQpCdXNzaXJrYSAgICAgICAgICAgICAgICAgIDIzMzQgQjIzMzAwMC1FIE4gTG8gTmkgUG8gQmEgICAgICAgICAgICAgICAgIDYwMyBJbSBHN1YgICAgICAgICAgICAgICAgIA0KR2lzaCAgICAgICAgICAgICAgICAgICAgICAyMzM1IEI1NTUyMjItRCAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAyMDMgSW0gTTFJSSAgICAgICAgICAgICAgICANCkFkYW4gICAgICAgICAgICAgICAgICAgICAgMjMzNiBENjYxNjk2LTYgICBOaSBSaSAgICAgICAgICAgICAgICAgICAgICAgNjAzIEltIEsxViBNMkQgICAgICAgICAgICAgDQpTaGluemFya2FuICAgICAgICAgICAgICAgIDIzMzggQjQ1NTYyMC1EICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICBBIDYxNCBJbSBNOElWIE0wViAgICAgICAgICAgIA0KRXJraWltICAgICAgICAgICAgICAgICAgICAyNDAxIEE1MkEyMzEtQyBBIExvIE5pIFdhICAgICAgICAgICAgICAgICAgICAxMDMgSW0gTTlWIE0yRCAgICAgICAgICAgICANCkFhcnV1IFppICAgICAgICAgICAgICAgICAgMjQwMyBCNDY5OEM5LTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIzIEltIEsxViAgICAgICAgICAgICAgICAgDQpHZW1pICAgICAgICAgICAgICAgICAgICAgIDI0MDQgQjQwMDQ0Mi1EIFcgTmkgVmEgICAgICAgICAgICAgICAgICAgICAgIDUwNCBJbSBNNFYgICAgICAgICAgICAgICAgIA0KTHV1bm5pIE1pdSAgICAgICAgICAgICAgICAyNDA1IEM1NzYyNDItOCAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMTMgSW0gTTBWIE0wRCAgICAgICAgICAgICANCkxhZ2Fhc2hpbiAgICAgICAgICAgICAgICAgMjQwNyBFNzY3NjY0LTUgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgODEwIEltIEszViAgICAgICAgICAgICAgICAgDQpBcm5ha2kgICAgICAgICAgICAgICAgICAgIDI0MDggQTIwMDUyNC1GICAgTmkgVmEgICAgICAgICAgICAgICAgICAgICAgIDQxMyBJbSBNMVYgICAgICAgICAgICAgICAgIA0KVXVuZ2lwICAgICAgICAgICAgICAgICAgICAyNDEwIEIwMDA1MzEtQiBOIE5pIEFzICAgICAgICAgICAgICAgICAgICAgICA3MTIgSW0gTTdJSSBNOUQgICAgICAgICAgICANCkNhcGlvbiAgICAgICAgICAgICAgICAgICAgMjQxMyBCNjUxODY0LTYgICBQbyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxIFN5IEswViAgICAgICAgICAgICAgICAgDQpLaGFhc2h1dSAgICAgICAgICAgICAgICAgIDI0MTQgQUE3QTc4OC05ICAgUmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDIwMCBTeSBLMFYgICAgICAgICAgICAgICAgIA0KQXJnYXNoICAgICAgICAgICAgICAgICAgICAyNDE2IEI3NTU0OTYtNyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDQgU3kgSzBWICAgICAgICAgICAgICAgICANCkdhc2ggICAgICAgICAgICAgICAgICAgICAgMjQxOSBBNTQ0NTc2LUEgUyBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTAwIEltIEczViBNN0QgICAgICAgICAgICAgDQpSbyBBbmlpICAgICAgICAgICAgICAgICAgIDI0MjIgQTQ3MzMyMC1FIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwNCBJbSBNMVYgTTlEICAgICAgICAgICAgIA0KQXZpa2ggVGhhdXMgICAgICAgICAgICAgICAyNDI1IEIyMDA4NzktRSAgIE5hIFZhICAgICAgICAgICAgICAgICAgICAgICA3MjMgSW0gRzFWSSBNNUQgICAgICAgICAgICANCkFya2F1bSAgICAgICAgICAgICAgICAgICAgMjQyOSBCNTUyNjI1LTggICBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgOTAyIEltIEYyViAgICAgICAgICAgICAgICAgDQpLaW0gICAgICAgICAgICAgICAgICAgICAgIDI0MzEgRDdBODY3OC02IFMgTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDgxMiBJbSBNMVYgTTFWSSAgICAgICAgICAgIA0KVXVyYW1hZyAgICAgICAgICAgICAgICAgICAyNDMzIEM3OTQ3OTgtOCBTIEFnICAgICAgICAgICAgICAgICAgICAgICAgICA5MTQgSW0gTTJWICAgICAgICAgICAgICAgICANCklpZGtlayAgICAgICAgICAgICAgICAgICAgMjQzNSBCQUI0NDIzLTkgTiBOaSBGbCAgICAgICAgICAgICAgICAgICAgICAgMzAwIEltIE01SVYgTTNEICAgICAgICAgICAgDQpMaWdlbXVtICAgICAgICAgICAgICAgICAgIDI0MzcgRDYzNjY1MC03IFMgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMiBJbSBNNFYgSzdEICAgICAgICAgICAgIA0KSW5uYW1lZyAgICAgICAgICAgICAgICAgICAyNDM5IEIzODQwMDAtQiAgIExvIE5pIEJhICAgICAgICAgICAgICAgICAgICAxMjMgSW0gTTdWICAgICAgICAgICAgICAgICANCkVyYW5pICAgICAgICAgICAgICAgICAgICAgMjUwMSBCMDAwNTU2LUUgTiBOaSBBcyAgICAgICAgICAgICAgICAgICAgICAgMjAwIEltIE02SVYgICAgICAgICAgICAgICAgDQpHaWdpICAgICAgICAgICAgICAgICAgICAgIDI1MDMgQjAwMDEwMC1DIE4gTG8gTmkgQXMgICAgICAgICAgICAgICAgICAgIDcwNCBJbSBNMlYgSzFEICAgICAgICAgICAgIA0KTmludWEgICAgICAgICAgICAgICAgICAgICAyNTA3IEE5ODY3QkMtRCBOIEFnICAgICAgICAgICAgICAgICAgICAgICAgICA4MTAgSW0gTTFWIEszRCAgICAgICAgICAgICANCkt1dWlyIEFtICAgICAgICAgICAgICAgICAgMjUxMSBDNDc3NDk3LTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMjAyIEltIE05SUkgTTNEICAgICAgICAgICAgDQpLaHVpciAgICAgICAgICAgICAgICAgICAgIDI1MTMgQjg5QUFDQS1EICAgSGkgSW4gV2EgICAgICAgICAgICAgICAgICAgIDgwMiBTeSBLMVYgICAgICAgICAgICAgICAgIA0KSW1hYXIgUGEgICAgICAgICAgICAgICAgICAyNTE3IEU0NDQwMDAtMCAgIEJhICAgICAgICAgICAgICAgICAgICAgICAgICAxMDIgU3kgTTFWIE0wRCAgICAgICAgICAgICANClJpaWQgSXJtYW4gICAgICAgICAgICAgICAgMjUxOSBEMDAwMzMwLUEgUyBMbyBOaSBBcyAgICAgICAgICAgICAgICAgICAgNjA0IEltIEczViAgICAgICAgICAgICAgICAgDQpTaGFzaHV1YSAgICAgICAgICAgICAgICAgIDI1MjEgRTI2MDQ2My02ICAgTmkgRGUgICAgICAgICAgICAgICAgICAgICAgIDIwMSBJbSBLNFYgICAgICAgICAgICAgICAgIA0KR2xpbW1lciAgICAgICAgICAgICAgICAgICAyNTI0IEE1NzYzMjItQSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA5MDMgSW0gTTlWICAgICAgICAgICAgICAgICANCktpc2EgICAgICAgICAgICAgICAgICAgICAgMjUyNiBBN0M2MzIwLUYgICBMbyBOaSBGbCAgICAgICAgICAgICAgICAgICAgNjAyIEltIEs2ViBNMUQgTTREICAgICAgICAgDQpVZGFhICAgICAgICAgICAgICAgICAgICAgIDI1MjkgRTU2NDhBOC02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNCBJbSBNMFYgICAgICAgICAgICAgICAgIA0KTWllIER1dXIgICAgICAgICAgICAgICAgICAyNTMyIEIxMTAzMjAtQyBBIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDMgSW0gSzZWICAgICAgICAgICAgICAgICANCk1pZGRlbmEgICAgICAgICAgICAgICAgICAgMjUzNCBCNjQ4Nzk3LTcgTiBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgNDAyIEltIE0yViAgICAgICAgICAgICAgICAgDQpEdXVucGlnYW11dXIgICAgICAgICAgICAgIDI1MzYgQzUxMTYzNy05IFMgTmEgTmkgSWMgICAgICAgICAgICAgICAgICAgIDYyNCBJbSBNMklWIEs5RCAgICAgICAgICAgIA0KRHV1ZGluICAgICAgICAgICAgICAgICAgICAyNTM4IEI3Njg0MTAtQyAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA3MDIgSW0gSzZJViAgICAgICAgICAgICAgICANCkJ1bWluYSAgICAgICAgICAgICAgICAgICAgMjU0MCBDNTUzMzE0LTggICBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgNDIwIEltIEszViAgICAgICAgICAgICAgICAgDQpTYWdha3UgICAgICAgICAgICAgICAgICAgIDI2MDIgQjQ0NDdBQS1BICAgQWcgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMSBJbSBNMVYgTTZEICAgICAgICAgICAgIA0KQXJ1bmRlICAgICAgICAgICAgICAgICAgICAyNjAzIEVBQUEzMDMtQiAgIExvIE5pIEZsIFdhICAgICAgICAgICAgICAgICAzMDMgSW0gSzRWICAgICAgICAgICAgICAgICANCk1hcmdpc2ggTGlpciAgICAgICAgICAgICAgMjYwNiBCMzQ3NDMxLUUgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgOTA1IEltIEsySVYgICAgICAgICAgICAgICAgDQpEdXJlaWphICAgICAgICAgICAgICAgICAgIDI2MDggQjU1Nzg5OS04IEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMyBJbSBNM1YgTTdEICAgICAgICAgICAgIA0KRWJiYSAgICAgICAgICAgICAgICAgICAgICAyNjA5IEI1OTkzMTMtRSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MTMgSW0gTTlWICAgICAgICAgICAgICAgICANCktlcmxpYXIgICAgICAgICAgICAgICAgICAgMjYxMCBCNTk0NzY5LUEgICBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgMjA1IEltIE00ViAgICAgICAgICAgICAgICAgDQpLaXNoa2VpaW0gICAgICAgICAgICAgICAgIDI2MTEgQjIwMTg4NS1BICAgTmEgVmEgSWMgICAgICAgICAgICAgICAgICAgIDUwMyBJbSBNOElJIE01RCAgICAgICAgICAgIA0KSXNwdW1lciAgICAgICAgICAgICAgICAgICAyNjE1IEUzODE5N0ItNyAgIEhpICAgICAgICAgICAgICAgICAgICAgICAgICA5MDUgU3kgTTNWIE01RCBLNUQgICAgICAgICANCkxpa2hhbWlpICAgICAgICAgICAgICAgICAgMjYxNiBCNTM2OENELTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAzIFN5IE0xViBNMEQgICAgICAgICAgICAgDQpHdXJkYWFuICAgICAgICAgICAgICAgICAgIDI2MjMgQjMxMDlEQS1FIE4gSGkgTmEgSW4gICAgICAgICAgICAgICAgICAgIDExNCBJbSBNMVYgICAgICAgICAgICAgICAgIA0KSWRhcyAgICAgICAgICAgICAgICAgICAgICAyNjI0IEI0OTI5QUUtRiBOIEhpIEluICAgICAgICAgICAgICAgICAgICAgICAxMDEgSW0gRjJWIE01RCAgICAgICAgICAgICANCkltc2hhICAgICAgICAgICAgICAgICAgICAgMjYyNSBCMjI0MzM3LUQgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNzA0IEltIEsxViBNM0QgICAgICAgICAgICAgDQpHYXNoa2FuYW4gICAgICAgICAgICAgICAgIDI2MjggQjc0QTYyMi05IE4gTmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDMxNCBJbSBBNFYgSzdEICAgICAgICAgICAgIA0KU2hlc2ggICAgICAgICAgICAgICAgICAgICAyNjMwIEMwMDAzMTQtRSAgIExvIE5pIEFzICAgICAgICAgICAgICAgICAgICA1MDQgSW0gTTFWICAgICAgICAgICAgICAgICANClV1cmt1dW1sdXUgICAgICAgICAgICAgICAgMjYzMSBCMjQ1NTI1LTkgQSBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTEzIEltIE0zViBNNUQgICAgICAgICAgICAgDQpBcnZsYWEgR2FtICAgICAgICAgICAgICAgIDI2MzUgRTg4OTY2Mi02ICAgTmkgUmkgICAgICAgICAgICAgICAgICAgICAgIDcwNCBJbSBNM1YgICAgICAgICAgICAgICAgIA0KVmFsZWQgICAgICAgICAgICAgICAgICAgICAyNjM2IEI5OTgyMTMtQSBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTQgSW0gSzdWICAgICAgICAgICAgICAgICANClN1dXJhc2h1dXIgICAgICAgICAgICAgICAgMjYzOSBCMTAwNDAzLUQgUyBOaSBWYSAgICAgICAgICAgICAgICAgICAgICAgMjAzIEltIEc5RCAgICAgICAgICAgICAgICAgDQpEaXNoYWRzaGlpICAgICAgICAgICAgICAgIDI2NDAgQjYxNEFDRy1GIE4gSGkgSW4gSWMgICAgICAgICAgICAgICAgICAgIDIwNCBJbSBNMVYgICAgICAgICAgICAgICAgIA0KRGVya3UgICAgICAgICAgICAgICAgICAgICAyNzAzIEM2MTA5ODktRCAgIEhpIE5hIEluIENwICAgICAgICAgICAgICAgICA2MDMgSW0gTTRWIE00RCAgICAgICAgICAgICANClJvc2thICAgICAgICAgICAgICAgICAgICAgMjcwNSBFMzU2MTAwLTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMzAxIEltIE03ViAgICAgICAgICAgICAgICAgDQpTZWt3b24gICAgICAgICAgICAgICAgICAgIDI3MDYgQjM2NDUwMC1EIEEgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDUxNCBJbSBLMVYgICAgICAgICAgICAgICAgIA0KS2FsZW5kYWUgICAgICAgICAgICAgICAgICAyNzA3IEM1MjUzNDAtOCBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDAgSW0gTTFWICAgICAgICAgICAgICAgICANCktpbXZsZSAgICAgICAgICAgICAgICAgICAgMjcwOSBCMDAwMjAzLUYgTiBMbyBOaSBBcyAgICAgICAgICAgICAgICAgICAgNTAzIEltIE0wViAgICAgICAgICAgICAgICAgDQpMaXIgICAgICAgICAgICAgICAgICAgICAgIDI3MjAgQjQyNjQ3Qy1BICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwMyBJbSBLOElWIE03RCAgICAgICAgICAgIA0KS2lydSB1ZGEgICAgICAgICAgICAgICAgICAyNzIxIEI1NTE2ODYtOCAgIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA5MzQgSW0gTTFWICAgICAgICAgICAgICAgICANCkdhYXIgICAgICAgICAgICAgICAgICAgICAgMjcyOSBCMzYwMjI0LUUgICBMbyBOaSBEZSAgICAgICAgICAgICAgICAgICAgMzIwIEltIE05ViAgICAgICAgICAgICAgICAgDQpNYWFuICAgICAgICAgICAgICAgICAgICAgIDI3MzAgQTI0MTYzMi1GICAgTmkgUG8gICAgICAgICAgICAgICAgICAgICAgIDQwMyBJbSBLM1YgICAgICAgICAgICAgICAgIA0KTWlscGEgICAgICAgICAgICAgICAgICAgICAyNzMxIEI2MzE1QUYtQSBOIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA0MDQgSW0gRzBWICAgICAgICAgICAgICAgICANClNoaW1hcmFhayAgICAgICAgICAgICAgICAgMjczMiBCOUU3NDI1LUUgICBOaSBGbCAgICAgICAgICAgICAgICAgICAgICAgODAyIEltIEc0ViAgICAgICAgICAgICAgICAgDQpHYWVuIEx1dW0gICAgICAgICAgICAgICAgIDI3MzYgQjMyNDc1Ny1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMyBJbSBLMlYgICAgICAgICAgICAgICAgIA0KR2VraHV1ICAgICAgICAgICAgICAgICAgICAyODAyIEI2Nzg4OTYtQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MjUgSW0gRzJWICAgICAgICAgICAgICAgICANCktlcnNpIEFtICAgICAgICAgICAgICAgICAgMjgwMyBBNDI3NDU2LUQgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIE00ViAgICAgICAgICAgICAgICAgDQpLaHV1bWEgICAgICAgICAgICAgICAgICAgIDI4MTQgQzIyMzY2OS04ICAgTmEgTmkgUG8gICAgICAgICAgICAgICAgICAgIDUwNCBTeSBLNFYgTTREICAgICAgICAgICAgIA0KSW5kc2hpaW0gR2FubWUgICAgICAgICAgICAyODE2IEI4NjkzMjMtQyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMDMgU3kgRzRWICAgICAgICAgICAgICAgICANCkt1Z2dhciAgICAgICAgICAgICAgICAgICAgMjgyMSBCNTUyODk3LTggICBQbyAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0IEltIEEyViAgICAgICAgICAgICAgICAgDQpCZXJ1bWkgICAgICAgICAgICAgICAgICAgIDI4MjMgQzU1MzEwMC1DICAgTG8gTmkgUG8gICAgICAgICAgICAgICAgICAgIDMwMyBJbSBNMFYgICAgICAgICAgICAgICAgIA0KQmlzaGFha3V1a2EgICAgICAgICAgICAgICAyODI1IEI2ODM4QkEtNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjMgSW0gTTFWICAgICAgICAgICAgICAgICANCkdpc2hhc2h1bSAgICAgICAgICAgICAgICAgMjgyOSBFMTAwODk1LUIgICBOYSBWYSAgICAgICAgICAgICAgICAgICAgICAgNDI0IEltIE0wViBNNUQgICAgICAgICAgICAgDQpOYXZsYSBTaGEgICAgICAgICAgICAgICAgIDI4MzAgRUFDNzQ1Ny04ICAgTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDIxNCBJbSBNM1YgTTNEICAgICAgICAgICAgIA0KU2luYWQgICAgICAgICAgICAgICAgICAgICAyODMyIEI0NTg5QUQtRCBOIEhpICAgICAgICAgICAgICAgICAgICAgICAgICA0MDIgSW0gTTRWIE01RCAgICAgICAgICAgICANCktodWlyICAgICAgICAgICAgICAgICAgICAgMjgzNiBCNDc4ODYxLUQgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIE0zViAgICAgICAgICAgICAgICAgDQpJZ2xhICAgICAgICAgICAgICAgICAgICAgIDI4MzcgQjQxNEFERy1GICAgSGkgSW4gSWMgICAgICAgICAgICAgICAgICAgIDgwNCBJbSBNMlYgTTlEICAgICAgICAgICAgIA0KR2Flc2htZSAgICAgICAgICAgICAgICAgICAyODM5IEM3ODMzNTQtOSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MDMgSW0gTTFWIE0xRCAgICAgICAgICAgICANCkd1bWlyIEdhZWcgICAgICAgICAgICAgICAgMjg0MCBCOEMwODg1LUIgICBEZSAgICAgICAgICAgICAgICAgICAgICAgICAgODE0IEltIE04SUlJIE00RCAgICAgICAgICAgDQpJc2hudXVuYXIgICAgICAgICAgICAgICAgIDI5MDQgRDU3MjgzNC02IFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMCBJbSBNNElWIE02RCAgICAgICAgICAgIA0KRGFta2kgSW0gICAgICAgICAgICAgICAgICAyOTA2IEIyMDA4NzgtRCAgIE5hIFZhICAgICAgICAgICAgICAgICAgICAgICA2MDMgSW0gRzRWIE05RCAgICAgICAgICAgICANClNodXNhIExpaXNobGkgICAgICAgICAgICAgMjkxMCBCMjExMTEyLUYgTiBMbyBOaSBJYyAgICAgICAgICAgICAgICAgICAgMzIzIEltIEsyViBNMEQgICAgICAgICAgICAgDQpMZWVyICAgICAgICAgICAgICAgICAgICAgIDI5MTIgQTdCMzY5OS1EICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNSBJbSBHMlYgICAgICAgICAgICAgICAgIA0KS2hpdXVyIExhICAgICAgICAgICAgICAgICAyOTEzIEM4QjM3NjMtNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDMgU3kgTTNWIE0yRCAgICAgICAgICAgICANCk1pa2hhZyBLdXUgICAgICAgICAgICAgICAgMjkxNCBBNjY4ODczLTggICBSaSAgICAgICAgICAgICAgICAgICAgICAgICAgMjEzIFN5IEYwViAgICAgICAgICAgICAgICAgDQpLaGlpbnJhIEFzaCAgICAgICAgICAgICAgIDI5MTYgQkFFNjM2Mi03ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwNCBTeSBNMklWIE0xRCAgICAgICAgICAgIA0KRWt1Z3VzaCAgICAgICAgICAgICAgICAgICAyOTIyIEI2NTI5NjgtOSAgIEhpIFBvICAgICAgICAgICAgICAgICAgICAgICA5MDQgSW0gTTFWIE05RCAgICAgICAgICAgICANClVzaGJhIFNpbmQgICAgICAgICAgICAgICAgMjkyNCBENTY0Nzc5LTMgUyBBZyBSaSAgICAgICAgICAgICAgICAgICAgICAgNDA1IEltIEY0ViBNMEQgICAgICAgICAgICAgDQpWaWxha2h1ICAgICAgICAgICAgICAgICAgIDI5MjggQTQ5NDMwMC1GICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIxNCBJbSBNOFYgICAgICAgICAgICAgICAgIA0KRGFudXV2bGFuICAgICAgICAgICAgICAgICAyOTI5IEIwMDA1NzgtQiAgIE5pIEFzICAgICAgICAgICAgICAgICAgICAgICA5MTMgSW0gTTFWICAgICAgICAgICAgICAgICANCkRpbmVucnV1bSAgICAgICAgICAgICAgICAgMjkzMSBFMzMyNjc5LTUgICBOYSBOaSBQbyAgICAgICAgICAgICAgICAgICAgMTIyIEltIEsxSVYgTTNEIE00RCAgICAgICAgDQpHYW5hZCAgICAgICAgICAgICAgICAgICAgIDI5MzMgQTY1NjlCQS1GIE4gSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNCBJbSBNMFYgICAgICAgICAgICAgICAgIA0KRGlzaGUgICAgICAgICAgICAgICAgICAgICAyOTM0IEE3NzgyMzItRCAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTUgSW0gSzlWICAgICAgICAgICAgICAgICANCkFtdXVyIEtlaWlyICAgICAgICAgICAgICAgMjkzNSBDNDcyMjU1LUEgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTEzIEltIEExViAgICAgICAgICAgICAgICAgDQpTYXJlZ29uICAgICAgICAgICAgICAgICAgIDI5MzYgQTU4NDk3Ni1FICAgSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDExNCBJbSBNM1YgTTZEICAgICAgICAgICAgIA0KVXVyaWdnZXIgICAgICAgICAgICAgICAgICAyOTM3IEI0MzQ3NzktQSBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDMgSW0gTTFJSUkgTTlWICAgICAgICAgICANClNoYWtpaWdhICAgICAgICAgICAgICAgICAgMjkzOCBCODY3QUNBLUIgICBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwIEltIEs0ViAgICAgICAgICAgICAgICAgDQpJc3V1ciAgICAgICAgICAgICAgICAgICAgIDMwMDIgQzM0NDg4Ni05ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMCBJbSBLMFZJICAgICAgICAgICAgICAgIA0KSWlkc2hhICAgICAgICAgICAgICAgICAgICAzMDAzIEI2NjUzNTUtQSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MTAgSW0gTTZWICAgICAgICAgICAgICAgICANCkFhcnphIEthbmQgICAgICAgICAgICAgICAgMzAwNSBCMzA0ODQyLUIgICBWYSBJYyAgICAgICAgICAgICAgICAgICAgICAgNDIyIEltIEsxViBNNEQgICAgICAgICAgICAgDQpNaW5vcyAgICAgICAgICAgICAgICAgICAgIDMwMDggQTQwMDdCOS1GIE4gTmEgVmEgICAgICAgICAgICAgICAgICAgICAgIDQwMSBJbSBHMlYgICAgICAgICAgICAgICAgIA0KTGF1ZHVtICAgICAgICAgICAgICAgICAgICAzMDExIEIzNTI5ODYtRCBOIEhpIFBvICAgICAgICAgICAgICAgICAgICAgICAxMDEgSW0gTThWIE0xRCAgICAgICAgICAgICANCkFudXVnICAgICAgICAgICAgICAgICAgICAgMzAxNSBCNzgzMzUxLTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMjAwIFN5IEs2ViAgICAgICAgICAgICAgICAgDQpLaW5la2VzaCAgICAgICAgICAgICAgICAgIDMwMTkgQjIyMjU1Mi1GIE4gTmkgUG8gICAgICAgICAgICAgICAgICAgICAgIDczMCBJbSBNM1YgTTdEICAgICAgICAgICAgIA0KS2Ftc2lpICAgICAgICAgICAgICAgICAgICAzMDIxIEE0NTc3OEMtQSAgIEFnICAgICAgICAgICAgICAgICAgICAgICAgICA2MjQgSW0gSzFWIE03RCAgICAgICAgICAgICANCkd1cmlzaGkgICAgICAgICAgICAgICAgICAgMzAyMiBCNzU2OTk5LUIgTiBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIEcwViBNM0QgICAgICAgICAgICAgDQpNYW5sdXVzaGFnaSAgICAgICAgICAgICAgIDMwMjUgQzIwMDM1My1DIFMgTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDYyMSBJbSBNN1YgICAgICAgICAgICAgICAgIA0KVXVtZXNoYWwgICAgICAgICAgICAgICAgICAzMDI2IEMzNjM0NDUtOCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAxMDIgSW0gSzBWICAgICAgICAgICAgICAgICANCkd1dXphIEJlbSAgICAgICAgICAgICAgICAgMzAyNyBCOUQ1NzY5LTggTiBGbCAgICAgICAgICAgICAgICAgICAgICAgIEEgMzIzIEltIE0zViBNNUQgTTFEICAgICAgICAgDQpEdXJndXUgICAgICAgICAgICAgICAgICAgIDMwMjggQTM3MzQ2Qi1GICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMSBJbSBNMlYgICAgICAgICAgICAgICAgIA0KQXNobWVsYW0gICAgICAgICAgICAgICAgICAzMDMzIEE0MjQ1ODgtRiBOIE5pIENwICAgICAgICAgICAgICAgICAgICAgICAxMDMgSW0gSzJWICAgICAgICAgICAgICAgICANCklpc2hhYW5rYSAgICAgICAgICAgICAgICAgMzAzNCBBNTU0NzU1LUQgVyBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgOTAzIEltIEszViBNM0QgICAgICAgICAgICAgDQpMYXNodXBpaSAgICAgICAgICAgICAgICAgIDMwMzcgRTY2NTY1NS02ICAgQWcgTmkgUmkgICAgICAgICAgICAgICAgICAgIDkyMiBJbSBNM1YgICAgICAgICAgICAgICAgIA0KS2lpZ2d1cmEgICAgICAgICAgICAgICAgICAzMDM5IEI4QjQ0NDItRCBTIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICA2MDEgSW0gRzBWICAgICAgICAgICAgICAgICANClVubGFraGFyICAgICAgICAgICAgICAgICAgMzA0MCBCNjI5OTk3LUYgTiBIaSBJbiAgICAgICAgICAgICAgICAgICAgICAgNjAzIEltIEszViAgICAgICAgICAgICAgICAgDQpFZHphICAgICAgICAgICAgICAgICAgICAgIDMxMDEgQjczQTE0Ni1DIFMgTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDEwNCBJbSBHMlYgTThEICAgICAgICAgICAgIA0KR2FyZW4gICAgICAgICAgICAgICAgICAgICAzMTAzIEI0Mzk1NjgtRSAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAyMTQgSW0gSzRWIE00ViAgICAgICAgICAgICANCkFhZGtoYSBOYSAgICAgICAgICAgICAgICAgMzEwNCBFMjAwNzc2LUEgICBOYSBWYSAgICAgICAgICAgICAgICAgICAgICAgOTMxIEltIEcwViBNNkQgICAgICAgICAgICAgDQpLaXIgICAgICAgICAgICAgICAgICAgICAgIDMxMDUgQjMwMDczMi1FIE4gTmEgVmEgICAgICAgICAgICAgICAgICAgICAgIDIxMCBJbSBNM1YgICAgICAgICAgICAgICAgIA0KSHJlb3dhbiAgICAgICAgICAgICAgICAgICAzMTA2IEI0MjUyNzgtQSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDMgSW0gSzhWICAgICAgICAgICAgICAgICANClJ1aWdpdXIgICAgICAgICAgICAgICAgICAgMzExMyBFMzQyNjQ3LTUgICBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgMjA0IFN5IE0yRCBNNEQgICAgICAgICAgICAgDQpNYXJrYXNoZXIgICAgICAgICAgICAgICAgIDMxMTUgQzU1NDlDQy04ICAgSGkgTmEgICAgICAgICAgICAgICAgICAgICAgIDQyMCBTeSBLOElWICAgICAgICAgICAgICAgIA0KS2hpaXJpICAgICAgICAgICAgICAgICAgICAzMTE3IEIyMDA0NTYtQiAgIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICAyMTQgU3kgTTVJViAgICAgICAgICAgICAgICANCkxlbWlraSAgICAgICAgICAgICAgICAgICAgMzExOCBDNTZBOThCLUMgICBIaSBXYSAgICAgICAgICAgICAgICAgICAgICAgNzExIEltIEsxViAgICAgICAgICAgICAgICAgDQpLYWdhc2ggICAgICAgICAgICAgICAgICAgIDMxMjEgQzU1NDhBQS02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMiBJbSBNMlYgTTlEICAgICAgICAgICAgIA0KS2Fua3V1cCBJciAgICAgICAgICAgICAgICAzMTIzIEI0MjQ3QTgtQSBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTQgSW0gTTNWICAgICAgICAgICAgICAgICANCkthZHVzaGlpICAgICAgICAgICAgICAgICAgMzEyNSBENjk1OTczLUEgUyBIaSBJbiAgICAgICAgICAgICAgICAgICAgICAgNzEzIEltIE0yViAgICAgICAgICAgICAgICAgDQpBcmthZGtoaSAgICAgICAgICAgICAgICAgIDMxMjcgQjc3OTMzMy1EIEEgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDMwNCBJbSBLMklWICAgICAgICAgICAgICAgIA0KTWlzaCAgICAgICAgICAgICAgICAgICAgICAzMTI4IEI2Nzk4ODUtRCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDMgSW0gTTZWSSAgICAgICAgICAgICAgICANCktlcmFzIFZsYSAgICAgICAgICAgICAgICAgMzEyOSBCODY3NDMwLUEgQSBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzAzIEltIEswViAgICAgICAgICAgICAgICAgDQpBZ2RhbSBHaWkgICAgICAgICAgICAgICAgIDMxMzAgQjU1Nzc3NC1DICAgQWcgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMCBJbSBNOUlJSSBLOEQgICAgICAgICAgIA0KQXNoZ2EgICAgICAgICAgICAgICAgICAgICAzMTMxIEE3QzM4NzQtQyAgIEZsICAgICAgICAgICAgICAgICAgICAgICAgICA1MTMgSW0gSzJWIE02RCAgICAgICAgICAgICANCktpbnVyaSAgICAgICAgICAgICAgICAgICAgMzEzMiBCNDYyNUFDLUEgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwIEltIEcwViBNNUQgICAgICAgICAgICAgDQpOaW5kYWtpciAgICAgICAgICAgICAgICAgIDMxMzMgQzM2MjY3Qi04ICAgTmkgUmkgICAgICAgICAgICAgICAgICAgICAgIDMwMiBJbSBNNUlWIE0zRCAgICAgICAgICAgIA0KQXJsYSAgICAgICAgICAgICAgICAgICAgICAzMTM1IEI1OEE3NjMtQSBOIFJpIFdhICAgICAgICAgICAgICAgICAgICAgICA0MDAgSW0gSzJWICAgICAgICAgICAgICAgICANCklpbWRpaSAgICAgICAgICAgICAgICAgICAgMzEzNyBCNDkzNjY2LTggTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNjAzIEltIE0xViAgICAgICAgICAgICAgICAgDQpLZXJndW1pciAgICAgICAgICAgICAgICAgIDMxNDAgQTU2Mjg5OC1CIFMgUmkgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMCBJbSBHMElWICAgICAgICAgICAgICAgIA0KTWFlZ2hlbiAgICAgICAgICAgICAgICAgICAzMjAzIEM2Njg3NjktNSBTIEFnIFJpICAgICAgICAgICAgICAgICAgICAgICA5MTEgSW0gRzNWICAgICAgICAgICAgICAgICANCkZsdWVyZSAgICAgICAgICAgICAgICAgICAgMzIwNSBCNzY1NjYyLTcgTiBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgNzEzIEltIEs5SVYgTTZEICAgICAgICAgICAgDQpEaW0gICAgICAgICAgICAgICAgICAgICAgIDMyMDYgQzY0NjQ0NC04ICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNCBJbSBNNlZJICAgICAgICAgICAgICAgIA0KSW1raGFnIEd1dSAgICAgICAgICAgICAgICAzMjA3IEM1Njc3ODktNiAgIEFnIFJpICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gRzJWIE00RCAgICAgICAgICAgICANCkFnZHV1ICAgICAgICAgICAgICAgICAgICAgMzIwOCBFNDAwMTAyLUIgICBMbyBOaSBWYSAgICAgICAgICAgICAgICAgICAgOTA0IEltIE0xViBNN0QgICAgICAgICAgICAgDQpFbmthaWVpbiAgICAgICAgICAgICAgICAgIDMyMTAgQTk2NTMxMi1DICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUwNSBJbSBLNlYgICAgICAgICAgICAgICAgIA0KWmlraGkgICAgICAgICAgICAgICAgICAgICAzMjExIEM0Mjc1MzUtRCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAxMDIgSW0gTTBWIE03RCBNNkQgICAgICAgICANClNoYW5kICAgICAgICAgICAgICAgICAgICAgMzIxNiBCOTY0NDQzLTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTEzIFN5IEs0ViBNMEQgICAgICAgICAgICAgDQpLYXNraWkgICAgICAgICAgICAgICAgICAgIDMyMTggQTMwMEE5OC1GIE4gSGkgTmEgSW4gVmEgQ3AgICAgICAgICAgICAgIDUwNCBJbSBHNFYgICAgICAgICAgICAgICAgIA0KRHV1a2EgICAgICAgICAgICAgICAgICAgICAzMjI2IEI2ODY1NzYtQyBOIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gRjJWICAgICAgICAgICAgICAgICANCkFzaGFzaCBBcyAgICAgICAgICAgICAgICAgMzIyNyBCNzU4NTc3LTkgICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTAzIEltIE0yViBNNkQgICAgICAgICAgICAgDQpHYXUgICAgICAgICAgICAgICAgICAgICAgIDMyMzQgQjQzMzc2NC1FICAgTmEgUG8gICAgICAgICAgICAgICAgICAgICAgIDUyMCBJbSBNNUlJSSBNMkQgICAgICAgICAgIA0KVGFsaXlhbiAgICAgICAgICAgICAgICAgICAzMjM1IEI3NUE0MzEtOSAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICA2MTMgSW0gTTFWICAgICAgICAgICAgICAgICANCkxpc2hpZGUgICAgICAgICAgICAgICAgICAgMzIzOCBFNTYwNjcyLTYgICBOaSBSaSBEZSAgICAgICAgICAgICAgICAgICAgNTAzIEltIE0yViBNNEQgICAgICAgICAgICAg
--------------------------------------------------------------------------------
/travGen.js:
--------------------------------------------------------------------------------
1 | // Constants for sector size
2 | var SEC_COLS = 32;
3 | var SEC_ROWS = 40;
4 | // Constant for jump distance
5 | var JUMP_DIST = 2;
6 |
7 | /**
8 | * Creates an instance of a Sector
9 | *
10 | * @constructor
11 | * @param {string} name of the Sector
12 | */
13 | function Sector(name){
14 | this.metadata = {};
15 | this.worlds = [];
16 | this.secMap = {};
17 | this.subsectors = [];
18 | this.tradeRoutes = []; // TODO: change this to generic routes? i think so
19 |
20 | this.metadata.name = name;
21 | this.metadata.density = 0;
22 | this.metadata.maturity = 3;
23 |
24 | this.generate = function(density,maturity){
25 | var name = "Unnamed"; // TODO: Name generator
26 | this.metadata.density = density;
27 | this.metadata.maturity = maturity;
28 | for (var x=1; x <= SEC_COLS; ++x) {
29 | for (var y=1; y <= SEC_ROWS; ++y) {
30 | // Determine if world should be generated
31 | if (roll(100,1,0) > this.metadata.density) {
32 | continue;
33 | }
34 | var system = new World(x,y,name,this.metadata.maturity);
35 | system.generate();
36 | this.worlds.push(system);
37 | }
38 | }
39 |
40 | // Partition worlds into subsectors
41 | this.createSubsectors();
42 | this.splitSector();
43 | this.createMap();
44 | }
45 |
46 | /* Converts a sector file (text) into a sector object */
47 | this.parseSector = function(text){
48 |
49 | this.createSubsectors();
50 | /*
51 | for (var i = 0; i < 16; i += 1) {
52 | // Creates 16 subsectors each with its own world array
53 | this.subsectors[i] = {worlds: []};
54 | }
55 | */
56 | var lineArr = [];
57 | var count = 0;
58 |
59 | text.split(/\r?\n/).forEach(function(line) {
60 | lineArr[count] = line;
61 | count++;
62 | });
63 |
64 | var len = lineArr.length;
65 |
66 | for(var x=0; x < len; x++){
67 | var ss;
68 |
69 | if (lineArr[x].match(/^(.{10,}) (\d\d\d\d) (\w\w\w\w\w\w\w-\w) (\w| ) (.{10,}) +(\w| ) (\w\w\w) (\w\w)/)) {
70 | // Matches data lines for systems
71 | var w = new World(0,0,"Unnamed",3);
72 | var u = new UWP();
73 |
74 | w.name = RegExp.$1;
75 | w.x = hexCol(RegExp.$2);
76 | w.y = hexRow(RegExp.$2);
77 | w.hex = RegExp.$2;
78 | u.parseUWP(RegExp.$3);
79 | w.uwp = u;
80 | w.base = RegExp.$4;
81 | w.trade.parseTradeCodes(RegExp.$5);
82 | if(RegExp.$6 == "A") { w.zone = 1; }
83 | if(RegExp.$6 == "R") { w.zone = 2; }
84 | w.pmod = hexToNum(RegExp.$7.charAt(0));
85 | w.belt = hexToNum(RegExp.$7.charAt(1));
86 | w.gas = hexToNum(RegExp.$7.charAt(2));
87 | w.alg = RegExp.$8;
88 |
89 | w.name = w.name.trim();
90 |
91 | // Calculate WTN per GURPS Far Trader rules
92 | w.genUWTN();
93 | w.genWTN();
94 | w.population = Math.pow(10, w.uwp.pop) * w.pmod;
95 |
96 | this.worlds.push(w);
97 | }else if (lineArr[x].match(/^#\s+Subsector\s+([A-P]):\s+(.*)/i)) {
98 | // Match comments for Subsector names, eg. # Subsector A: Orion
99 | ss = RegExp.$1.charCodeAt(0) - "A".charCodeAt(0);
100 | ss = this.subsectors[ss];
101 | ss.name = RegExp.$2;
102 | ss.index = RegExp.$1;
103 | ss.name = ss.name.trim();
104 | }else if (lineArr[x].match(/^#\s+Name:\s+(.*?)( \(.*\))?$/i)) {
105 | // Match comments for sector names, eg. # Name: Orion (vi)
106 | this.metadata.name = this.metadata.name || RegExp.$1.trim();
107 | }else if (lineArr[x].match(/^#\s+Alleg:\s+(.*?)( \(.*\))?$/i)) {
108 | // TODO: Create an allegiance object for the sector??
109 | //console.log("Alleg 1: " + RegExp.$1);
110 | //console.log("Alleg 2: " + RegExp.$2);
111 | }else if (lineArr[x].match(/^#\s+(.*):\s+(.*)/i)) {
112 | // More generically matches comments for sec name, author, source, ref, subsec, and allegiance
113 | this.metadata[RegExp.$1.toLowerCase()] = RegExp.$2.trim();
114 | }
115 | }
116 |
117 | this.splitSector();
118 | this.createMap();
119 | }
120 |
121 | /* Converts a sector object into text (in .sec file format) */
122 | this.writeSector = function(){
123 | var array = [];
124 | // Grab each world, create a world string, and add it to the array
125 | this.worlds.forEach(function(world) {
126 | array.push(world.writeWorld());
127 | });
128 | // Create text, one world string per line
129 | return array.join("\n");
130 | }
131 |
132 | this.writeSectorHTML = function(){
133 | var array = [];
134 | array.push("
");
135 | // Grab each world, create a world string, and add it to the array
136 | this.worlds.forEach(function(world) {
137 | array.push(world.writeWorld());
138 | });
139 | array.push("
");
140 | // Create text, one world string per line
141 | return array.join("");
142 | }
143 |
144 | this.splitSector = function(){
145 | var wlen = this.worlds.length;
146 | // Partition worlds into subsectors
147 | for(var w=0; w < wlen; w++){
148 | var ss = this.worlds[w].getSubsec();
149 | //console.log("ss: " + ss);
150 | this.subsectors[ss].worlds.push(this.worlds[w]);
151 | }
152 | }
153 |
154 | this.createSubsectors = function(){
155 | for (var i = 0; i < 16; i += 1) {
156 | // Creates 16 subsectors each with its own world array
157 | this.subsectors[i] = {worlds: []};
158 | }
159 | }
160 |
161 | /* Creates a sectorMap object from a world array */
162 | // TODO: Make this private, create removeWorld and addWorld methods that will do a map update
163 | this.createMap = function(){
164 | for(var x in this.worlds){
165 | this.secMap[this.worlds[x].hex] = 1;
166 | }
167 | }
168 |
169 | /* Generates trade routes for the sector */
170 | this.generateTradeRoutes = function(){
171 | // Create routes array containing all route objects
172 | var type = "trade";
173 | var len = this.worlds.length;
174 |
175 | for(var i=0; i < len; i++){
176 | var start = this.worlds[i];
177 | for(var x=i+1; x < len; x++){
178 | //console.log(x);
179 | var end = this.worlds[x];
180 | var rt = new Route(start.hex,end.hex,type);
181 | //console.log("rt: " + rt);
182 | // Calculate best route for jump length
183 | rt.calculatePath(JUMP_DIST,this.secMap);
184 | console.log("Path: " + rt.path);
185 | // If there is no route, go to the next pair
186 | if (rt.path == undefined){ continue; }
187 | // If there is a route, calculate the BTN
188 | rt.genBTN(start,end);
189 | console.log("BTN: " + rt.btn);
190 | // If BTN is high enough, add to tradeRoutes object
191 | if (rt.btn >= MIN_BTN){
192 | this.tradeRoutes.push(route);
193 | }
194 | }
195 | }
196 | }
197 |
198 | this.addWorld = function(world){
199 | // Add to world array
200 | this.worlds.push(world);
201 | // Update map object
202 | this.secMap[world.hex] = 1;
203 | // Add to subsector array
204 | var ss = world.getSubsec();
205 | this.subsectors[ss].addWorld(world);
206 |
207 | }
208 |
209 | this.delWorld = function(hex){
210 | // TODO: Delete a world
211 | // Update map object
212 | // Update subsector and world arrays
213 | }
214 |
215 | };
216 |
217 |
218 | /**
219 | * Creates an instance of a Subsector
220 | *
221 | * @constructor
222 | * @param {string} letter of the Subsector
223 | */
224 | function Subsector(letter){
225 | this.name = "";
226 | this.index = hexToNum(letter);
227 | this.letter = letter;
228 | this.worlds = [];
229 |
230 | this.generate = function(){
231 | // TODO
232 | }
233 |
234 | this.parseSubsec = function(letter){
235 | // Takes text and puts it into subsec object
236 | }
237 |
238 | this.writeSubsec = function(letter){
239 | // Writes the subsector to text?
240 | }
241 |
242 | this.addWorld = function(world){
243 |
244 | }
245 | };
246 |
247 |
248 | /**
249 | * Creates an instance of a World
250 | *
251 | * @constructor
252 | * @param {string} x coordinate in the Sector
253 | * @param {string} y coordinate in the Sector
254 | * @param {string} name of the World
255 | * @param {string} maturity of the World
256 | */
257 | function World(x,y,name,maturity){
258 | this.name = name;
259 | this.x = x;
260 | this.y = y;
261 | this.hex = rjust(this.x.toString(), 2, "0") + rjust(this.y.toString(), 2, "0");
262 | this.mat = maturity;
263 | this.uwp = new UWP();
264 | this.base = " ";
265 | this.trade = new TradeCodes();
266 | this.pmod = 0;
267 | this.gas = 0;
268 | this.belt = 0;
269 | this.zone = 0;
270 | this.alg = "Un";
271 |
272 | this.uwtn = 0;
273 | this.wtn = 0;
274 |
275 | // TODO should a world keep track of its subsector and sector? probably.
276 | // TODO create a setHex method for x and y, remove x and y from constructor
277 | // TODO generate should take maturity
278 |
279 | this.generate = function(){
280 | this.genUwp();
281 | this.genExt();
282 | this.genTradeNumber();
283 | }
284 |
285 | this.parseWorld = function(){
286 | // TODO Takes a world string and parses it into a World object
287 | }
288 |
289 | /* Concatenates a World object into a world string */
290 | this.writeWorld = function(){
291 | var line = ljust(this.name,25," ");
292 | line += this.hex;
293 | line += " ";
294 | line += this.uwp.writeUWP();
295 | line += this.base + " ";
296 | line += ljust(this.trade.writeTradeCodes(),15," ");
297 | line += rjust(" AR".charAt(this.zone),11," ") + " ";
298 | line += this.pmod;
299 | line += this.belt;
300 | line += this.gas + " ";
301 | line += this.alg;
302 | return line;
303 | }
304 |
305 | /* Generates UWP for a world */
306 | this.genUwp = function(){
307 | this.uwp.generate(this.mat)
308 | }
309 |
310 | /* Generates extended stats for a world */
311 | this.genExt = function(){
312 | this.genBase(this.uwp);
313 | this.trade.generate(this.uwp);
314 | this.genPopMod();
315 | this.genGasGiant();
316 | this.genPlanBelt();
317 | this.genTravelZone(this.uwp);
318 | this.genAllegiance();
319 | }
320 |
321 | /* Generates a trade number for a world */
322 | this.genTradeNumber = function(){
323 | this.genUWTN();
324 | this.genWTN();
325 | }
326 |
327 | /* Generates what bases, if any, for a world */
328 | this.genBase = function(uwp){
329 | var nav,sct,mil = 0;
330 |
331 | if (uwp.stp == 10){ // A
332 | if (roll(6,2,0) > 7) { nav = 1; }
333 | if (roll(6,2,0) > 9) { sct = 1; }
334 | if (roll(6,2,0) > 9) { mil = 1; }
335 | }
336 |
337 | if (uwp.stp == 11){ // B
338 | if (roll(6,2,0) > 7) { nav = 1; }
339 | if (roll(6,2,0) > 8) { sct = 1; }
340 | if (roll(6,2,0) > 8) { mil = 1; }
341 | }
342 |
343 | if (uwp.stp == 12){ // C
344 | if (roll(6,2,0) > 7) { sct = 1; }
345 | if (roll(6,2,0) > 7) { mil = 1; }
346 | }
347 |
348 | if (uwp.stp == 13){ // D
349 | if (roll(6,2,0) > 6) { sct = 1; }
350 | }
351 |
352 | if (nav && !sct) { this.base = "N"; }
353 | if (!nav && sct) { this.base = "S"; }
354 | if (nav && sct) { this.base = "A"; }
355 | if (!nav && !sct && mil) { this.base = "M"; }
356 | }
357 |
358 | /* Generates population multiplier for the mainworld */
359 | this.genPopMod = function(){
360 | if (roll(6,1,0) % 2){
361 | this.pmod = reroll(6,1,-1,5);
362 | }else{
363 | this.pmod = reroll(6,1,4,10);
364 | }
365 | }
366 |
367 | /* Generates gas giants for a system */
368 | this.genGasGiant = function(){
369 | if (roll(6,2,0) > 4){
370 | var res = roll2D();
371 | if (res < 10){
372 | this.gas = Math.floor(res / 2);
373 | }else{
374 | this.gas = Math.ceil(res / 2 - 1);
375 | }
376 | }else{ this.gas = 0; }
377 | }
378 |
379 | /* Generates planetoid belts for a system */
380 | this.genPlanBelt = function(){
381 | var res = roll(6,2,this.gas);
382 | if (res < 8){ plb = 1 }
383 | if (res == 12){
384 | this.belt = 3;
385 | }else{
386 | this.belt = 2;
387 | }
388 | }
389 |
390 | /* Generates the Travel Zone designation, if any, for a world */
391 | this.genTravelZone = function(uwp){
392 | if (uwp.stp == 33) { this.zone = 2; }
393 | if (uwp.gov == 10 && uwp.law == 20) { this.zone = 1; }
394 | if (uwp.gov == 11 && uwp.law > 18) { this.zone = 1; }
395 | if (uwp.gov == 12 && uwp.law > 17) { this.zone = 1; }
396 | if (uwp.gov == 13 && uwp.law > 16) { this.zone = 1; }
397 | if (uwp.gov == 13 && uwp.law == 20) { this.zone = 2; }
398 | if (uwp.gov == 14 && uwp.law > 16 && uwp.law < 19) { this.zone = 1; }
399 | if (uwp.gov == 14 && uwp.law > 18) { this.zone = 2; }
400 | if (uwp.gov == 15 && uwp.law > 15) { this.zone = 1; }
401 | if (uwp.gov == 15 && uwp.law > 17) { this.zone = 2; }
402 | }
403 |
404 | /* Generates the Allegiance for a world */
405 | this.genAllegiance = function(){
406 | // TODO: Allegiance list config
407 | this.alg = "Rg";
408 | }
409 |
410 | /* Generates UWTN for a world */
411 | this.genUWTN = function(){
412 |
413 | var tlConvert = [13,12,11,10,10,9,9,9,8,7,6,6,5,5,5,4,3]; // GURPS to Traveller TL conversion array
414 | // 1. Determine Unmodified World Trade Number (UWTN)
415 |
416 | // TL Modifier
417 | var tl = tlConvert[this.uwp.tl];
418 | var tlMod = 1.5;
419 | if (tl < 12) { tlMod -= .5; }
420 | if (tl < 9) { tlMod -= .5; }
421 | if (tl < 6) { tlMod -= .5; }
422 | if (tl < 3) { tlMod -= .5; }
423 |
424 | // Determine Population Modifier
425 | var popMod = this.uwp.pop / 2;
426 |
427 | this.uwtn = popMod + tlMod;
428 | }
429 |
430 | /* Generates WTN for a world */
431 | this.genWTN = function(){
432 |
433 | // 2. Determine Port Modifier
434 | // Set up arrays of modifiers for the "chart", one list per Starport Class
435 | var pmA = [1.5,1,1,.5,.5,0,0,0];
436 | var pmB = [1,1,.5,.5,0,0,-.5,-1];
437 | var pmC = [1,.5,.5,0,0,-.5,-1,-1.5];
438 | var pmD = [.5,.5,0,0,-0.5,-1,-1.5,-2];
439 | var pmE = [.5,0,0,-.5,-1,-1.5,-2,-2.5];
440 | var pmX = [0,0,-2.5,-3,-3.5,-4,-4.5,-5];
441 |
442 | // Add each Starport Class modifier list to the master array to create the "chart", at its base_36 location
443 | var pmArr = [];
444 | pmArr[10] = pmA;
445 | pmArr[11] = pmB;
446 | pmArr[12] = pmC;
447 | pmArr[13] = pmD;
448 | pmArr[14] = pmE;
449 | pmArr[33] = pmX;
450 |
451 | // Round UWTN down to use in lookup of Port Modifier
452 | var ruwtn = Math.floor(this.uwtn);
453 | if (ruwtn > 7) { ruwtn = 7; }
454 | if (ruwtn < 1) { ruwtn = 0; }
455 |
456 | // Use UWTN and converted Starport number to lookup the Port Modifier from the "chart"
457 | var portMod = pmArr[this.uwp.stp][ruwtn];
458 |
459 | // 3. Determine World Trade Number
460 | this.wtn = this.uwtn + portMod;
461 | }
462 |
463 | this.getSubsec = function(){
464 | var ss = Math.floor((this.x - 1) / (SEC_COLS / 4)) + Math.floor((this.y - 1) / (SEC_ROWS / 4)) * 4;
465 | return ss;
466 | }
467 | };
468 |
469 |
470 | /**
471 | * Creates an instance of a UWP
472 | *
473 | * @constructor
474 | */
475 | function UWP(){
476 | this.stp = 35;
477 | this.size = 0;
478 | this.atm = 0;
479 | this.hyd = 0;
480 | this.pop = 0;
481 | this.gov = 0;
482 | this.law = 0;
483 | this.tl = 0;
484 |
485 | /* Generates the entire UWP */
486 | this.generate = function(maturity){
487 | console.log("Generate");
488 | this.genStarport(maturity);
489 | this.genSize();
490 | this.genAtmo(this.size);
491 | this.genHydro(this.size,this.atm);
492 | this.genPop();
493 | this.genGov(this.pop);
494 | this.genLaw(this.gov);
495 | this.genTL(this.stp,this.size,this.atm,this.hyd,this.pop,this.gov);
496 | }
497 |
498 | this.parseUWP = function(text){
499 | this.stp = hexToNum(text.charAt(0));
500 | this.siz = hexToNum(text.charAt(1));
501 | this.atm = hexToNum(text.charAt(2));
502 | this.hyd = hexToNum(text.charAt(3));
503 | this.pop = hexToNum(text.charAt(4));
504 | this.gov = hexToNum(text.charAt(5));
505 | this.law = hexToNum(text.charAt(6));
506 | this.tl = hexToNum(text.charAt(8));
507 | }
508 |
509 | this.writeUWP = function(){
510 | var upp = this.stp;
511 | upp += numToHex(this.siz);
512 | upp += numToHex(this.atm);
513 | upp += numToHex(this.hyd);
514 | upp += numToHex(this.pop);
515 | upp += numToHex(this.gov);
516 | upp += numToHex(this.law);
517 | upp += "-";
518 | upp += numToHex(this.tl);
519 | upp += " ";
520 | return upp;
521 | }
522 |
523 | /* Generates the Starport */
524 | this.genStarport = function(maturity){
525 | // Starport quality
526 | var stp = "X";
527 | switch(maturity){
528 | case 1: // backwater
529 | stp = "NAABBCCCDEEX".charAt(roll(6,2,-1));
530 | break;
531 | case 2: // frontier
532 | stp = "NAAABBCCDEEX".charAt(roll(6,2,-1));
533 | break;
534 | case 4: //cluster
535 | stp = "NAAAABBCCDEX".charAt(roll(6,2,-1));
536 | break;
537 | default: // mature
538 | stp = "NAAABBCCDEEE".charAt(roll(6,2,-1));
539 | break;
540 | }
541 | this.stp = parseInt(stp,36);
542 | }
543 |
544 | /* Generates the Size of a world */
545 | this.genSize = function(){
546 | this.size = roll(6,2,-2);
547 | }
548 |
549 | /* Generates the Atmosphere type for a world */
550 | this.genAtmo = function(size){
551 | this.atm = roll(6,2,-7) + size;
552 | if (size < 0 || this.atm < 0) { this.atm = 0; }
553 | }
554 |
555 | /* Generates the Hydrographic percentage for a world */
556 | this.genHydro = function(size,atmo){
557 | this.hyd = roll(6,2,-7) + size;
558 | if (size < 2) { this.hyd = 0; }
559 | if (atmo < 2 || atmo > 9) { this.hyd -= 4; }
560 | if (this.hyd < 0) { this.hyd = 0; }
561 | if (this.hyd > 10) { this.hyd = 10; }
562 | }
563 |
564 | /* Generates the Population of a world */
565 | this.genPop = function(){
566 | this.pop = roll(6,2,-2);
567 | }
568 |
569 | /* Generates the Government type for a world */
570 | this.genGov = function(pop){
571 | this.gov = roll(6,2,-7) + pop;
572 | if (this.gov < 0) { this.gov = 0; }
573 | }
574 |
575 | /* Generates the Law Level for a world */
576 | this.genLaw = function(gov){
577 | this.law = roll(6,2,-7) + gov;
578 | if (this.law < 0) { this.law = 0; }
579 | }
580 |
581 | /* Generates the Tech level for a world */
582 | this.genTL = function(stp,size,atmo,hydro,pop,gov){
583 | this.tl = roll(6,1,0);
584 | if (stp == 10) { this.tl += 6; }
585 | if (stp == 11) { this.tl += 4; }
586 | if (stp == 12) { this.tl += 2; }
587 | //if (stp == 15) { this.tl += 1; } // Errata, but there is no starport F
588 | if (stp == 33) { this.tl -= 4; }
589 | if (size < 5) { this.tl += 1; if (size < 2) { this.tl += 1; } }
590 | if (atmo < 4) { this.tl += 1; }
591 | if (atmo > 9) { this.tl += 1; }
592 | if (hydro > 8) { this.tl += 1; if (hydro > 9) { this.tl += 1; } }
593 | if (pop > 0 && pop < 6) { this.tl += 1; }
594 | if (pop > 8) { this.tl += 2; if (pop > 9) { this.tl += 2; } }
595 | if (gov == 0 || gov == 5) { this.tl += 1; }
596 | if (gov == 13) { this.tl -= 2; }
597 | if (gov > 13) { this.tl -= 1; } // Errata
598 | if (this.tl < 0) { this.tl = 0; }
599 | }
600 |
601 | };
602 |
603 |
604 | /**
605 | * Creates an instance of a Route
606 | *
607 | * @constructor
608 | * @param {string} start hex of the Route
609 | * @param {string} end hex of the Route
610 | * @param {string} type of Route (trade, xboat, gate, wormhole, etc.)
611 | */
612 | function Route(start,end,type){
613 | this.type = type; // trade, xboat, gate, wormhole, etc.
614 | this.start = start; // start hex
615 | this.end = end; // end hex
616 | this.distance = dist(start,end);
617 | this.path = []; // array of full path of all hexes, in order
618 | this.btn = 0; // BTN for start-end pair
619 | this.secx = 0; // x coord of sector, relative to start
620 | this.secy = 0; // y coord of sector, relative to start
621 |
622 | /* Determines whether there is a route between two world given a specific jump distance and returns the path */
623 | this.calculatePath = function(jump,map){
624 | var opened = new List();
625 | var closed = new List();
626 |
627 | // add the starting node to the open list
628 | opened.add(new Node(this.start, 0, 0, undefined));
629 | // while the open list is not empty
630 | while(!opened.isEmpty()){
631 | // current node = node from open list with the lowest cost
632 | var currentNode = opened.getLowestCostNode();
633 | //alert(currentNode);
634 | // if current node = goal node then path complete
635 | if(currentNode.id == this.end){
636 | var path = [];
637 | var node = currentNode;
638 | path.unshift(node.id);
639 | while(node.parent){
640 | node = node.parent;
641 | path.unshift(node.id);
642 | }
643 | this.path = path;
644 | }else{
645 | // Move current node to the closed list
646 | opened.remove(currentNode);
647 | closed.add(currentNode);
648 | // Examine each node adjacent to the current node
649 | var adjacentHexes = reachableHexes(currentNode.id, jump);
650 | // For each adjacent node
651 | var length = adjacentHexes.length;
652 | for(var i = 0; i < length; i++){
653 | var adjacentHex = adjacentHexes[i];
654 | var adjacentNode = new Node(adjacentHex, -1, currentNode.steps+1, currentNode);
655 | // if it isn't on the open list
656 | if(!opened.contains(adjacentNode)){
657 | // and it isn't on the closed list
658 | if(!closed.contains(adjacentNode)){
659 | // and it isn't an obstacle then
660 | if(map[adjacentHex] !== undefined){
661 | // move it to open list and calculate cost
662 | opened.add(adjacentNode);
663 | var cost = adjacentNode.steps + dist(adjacentHex, this.end);
664 | // NOTE: Can tweak cost, e.g.
665 | // if RedZone then cost += 2, if AmberZone then cost += 1
666 | // if NoWater then cost += 1, if !Imperial then cost += 1
667 | adjacentNode.cost = cost;
668 | }
669 | }
670 | }
671 | }
672 | }
673 | }
674 | this.path = undefined;
675 | }
676 |
677 |
678 | /* Generate a BTN for a world pair */
679 | this.genBTN = function(world1, world2){
680 |
681 | var mods = {};
682 | var modDist, modWCTM = 0;
683 |
684 | // 1. Determine World Trade Classification Modifier
685 |
686 | mods.wctm = 0;
687 | // Check to see if one world is Ag and the other is either Ex or Na
688 | if (world1.codes.ag) {
689 | if (world2.codes.ex || world2.codes.na){ mods.wctm += .5; }
690 | }else if (world2.codes.ag){
691 | if (world1.codes.ex || world1.codes.na) { mods.wctm += .5; }
692 | }
693 |
694 | // Check to see if one world is In and the other is Ni
695 | if (world1.codes.in) {
696 | if (world2.codes.ni) { mods.wctm += .5; }
697 | }else if (world2.codes.in) {
698 | if (world1.codes.ni) { mods.wctm += .5; }
699 | }
700 |
701 | // Check to see if worlds share allegiences
702 | if (world1.alg != world2.alg) { mods.wctm -= .5; }
703 |
704 | // 2. Determine Distance Modifier
705 | var parsecs = routeLength(this.path);
706 | mods.dist = 0;
707 | if (parsecs > 1) { mods.dist += .5; }
708 | if (parsecs > 2) { mods.dist += .5; }
709 | if (parsecs > 5) { mods.dist += .5; }
710 | if (parsecs > 9) { mods.dist += .5; }
711 | if (parsecs > 19) { mods.dist += .5; }
712 | if (parsecs > 29) { mods.dist += .5; }
713 | if (parsecs > 59) { mods.dist += .5; }
714 | if (parsecs > 99) { mods.dist += .5; }
715 | if (parsecs > 199) { mods.dist += .5; }
716 | if (parsecs > 299) { mods.dist += .5; }
717 | if (parsecs > 599) { mods.dist += .5; }
718 | if (parsecs > 999) { mods.dist += .5; }
719 |
720 | // 3. Calculate Bilateral Trade Number (BTN)
721 | // BTN = WTN1 + WTN2 + WTCM - Distance Modifier
722 | this.btn = world1.wtn + world2.wtn + mods.wctm - mods.dist;
723 | if (world1.wtn < world2.wtn){
724 | if (this.btn > world1.wtn + 5) { this.btn = world1.wtn + 5; }
725 | }else{
726 | if (this.btn > world2.wtn + 5) { this.btn = world2.wtn + 5; }
727 | }
728 | }
729 |
730 |
731 | /* Returns the length of a route path in parsecs */
732 | this.length = function(){
733 | var len = this.path.length;
734 | var hops = 0;
735 | for(var x; x < len - 1; x++){
736 | hops += dist(this.path[x],this.path[x-1]);
737 | }
738 | return hops;
739 | }
740 | };
741 |
742 |
743 | /**
744 | * Creates an instnace of a Trade code
745 | *
746 | * @constructor
747 | */
748 | function TradeCodes(){
749 | this.ag = false;
750 | this.as = false;
751 | this.ba = false;
752 | this.de = false;
753 | this.fl = false;
754 | this.hi = false;
755 | this.ic = false;
756 | this.ind = false;
757 | this.lo = false;
758 | this.na = false;
759 | this.ni = false;
760 | this.po = false;
761 | this.ri = false;
762 | this.wa = false;
763 | this.cp = false;
764 | this.cx = false;
765 |
766 | /* Generates trade codes for a world */
767 | this.generate = function(uwp){
768 | if ((uwp.atm > 3 && uwp.atm < 10) && (uwp.hyd > 3 && uwp.hyd < 9) && (uwp.pop > 4 && uwp.pop < 8)){ this.ag = true; }
769 | if (uwp.size == 0 && uwp.atm == 0 && uwp.hyd == 0){ this.as = true; } else if (uwp.atm == 0){ this.va = true; }
770 | if (uwp.pop == 0 && uwp.gov == 0 && uwp.law == 0) { this.ba = true; }
771 | if (uwp.hyd == 0 && uwp.atm > 1) { this.de = true; }
772 | if (uwp.size > 9 && uwp.atm > 0) { this.fl = true; }
773 | if (uwp.pop > 8) { this.hi = true; }
774 | if (uwp.atm < 2 && uwp.hyd > 0) { this.ic = true; }
775 | if ((uwp.atm < 5 || uwp.atm == 7 || uwp.atm == 9) && uwp.pop > 8) { this.ind = true; }
776 | if (uwp.pop < 4) { this.lo = true; }
777 | if (uwp.atm < 4 && uwp.hyd < 4 && uwp.pop > 5) { this.na = true; }
778 | if (uwp.pop < 7) { this.ni = true; }
779 | if ((uwp.atm > 1 && uwp.atm < 6) && uwp.hyd < 4) { this.po = true; }
780 | if ((uwp.atm == 6 || uwp.atm == 8) && (uwp.pop > 5 && uwp.pop < 9) && (uwp.gov > 3 && uwp.gov < 10)){ this.ri = true; }
781 | if (uwp.hyd == 10) { this.wa = true; }
782 | }
783 |
784 | /* Parse a string of trade codes and set the world object properties */
785 | this.parseTradeCodes = function(text){
786 | var array = text.split(" ");
787 | var len = array.length;
788 | for(var x=0; x < len; x++){
789 | switch(array[x]){
790 | case "Ag":
791 | this.ag = true;
792 | break;
793 | case "As":
794 | this.as = true;
795 | break;
796 | case "Ba":
797 | this.ba = true;
798 | break;
799 | case "Cp":
800 | this.cp = true;
801 | break;
802 | case "Cx":
803 | this.cx = true;
804 | break;
805 | case "De":
806 | this.de = true;
807 | break;
808 | case "Fl":
809 | this.fl = true;
810 | break;
811 | case "Hi":
812 | this.hi = true;
813 | break;
814 | case "Ic":
815 | this.ic = true;
816 | break;
817 | case "In":
818 | this.ind = true;
819 | break;
820 | case "Lo":
821 | this.lo = true;
822 | break;
823 | case "Na":
824 | this.na = true;
825 | break;
826 | case "Ni":
827 | this.ni = true;
828 | break;
829 | case "Po":
830 | this.po = true;
831 | break;
832 | case "Ri":
833 | this.ri = true;
834 | break;
835 | case "Va":
836 | this.va = true;
837 | break;
838 | case "Wa":
839 | this.wa = true;
840 | break;
841 | case " ":
842 | break;
843 | case " ":
844 | break;
845 | case "":
846 | break;
847 | default:
848 | this[array[x].toLowerCase()] = true;
849 | break;
850 | }
851 | }
852 | }
853 |
854 | /* Create string from world trade code properties */
855 | this.writeTradeCodes = function(){
856 | var codes = "";
857 | if (this.ag){ codes += "Ag "; }
858 | if (this.as){ codes += "As "; }
859 | if (this.ba){ codes += "Ba "; }
860 | if (this.cp){ codes += "Cp "; }
861 | if (this.cx){ codes += "Cx "; }
862 | if (this.de){ codes += "De "; }
863 | if (this.fl){ codes += "Fl "; }
864 | if (this.hi){ codes += "Hi "; }
865 | if (this.ic){ codes += "Ic "; }
866 | if (this.ind){ codes += "In "; }
867 | if (this.lo){ codes += "Lo "; }
868 | if (this.na){ codes += "Na "; }
869 | if (this.ni){ codes += "Ni "; }
870 | if (this.po){ codes += "Po "; }
871 | if (this.ri){ codes += "Ri "; }
872 | if (this.va){ codes += "Va "; }
873 | if (this.wa){ codes += "Wa"; }
874 | return codes;
875 | }
876 | };
877 |
--------------------------------------------------------------------------------
/travGenUtils.js:
--------------------------------------------------------------------------------
1 | /* Astrometric Constants */
2 | Astrometrics = {
3 | ParsecScaleX: Math.cos(Math.PI / 6), // cos(30)
4 | ParsecScaleY: 1.0,
5 | SectorWidth: 32,
6 | SectorHeight: 40,
7 | ReferenceHexX: 1, // Reference is at Core 0140
8 | ReferenceHexY: 40,
9 | MinScale: 0.0078125,
10 | MaxScale: 512
11 | };
12 |
13 |
14 | function roll(die,num,mod){
15 | var result = 0;
16 | var count = 1;
17 | while(count <= num){
18 | result = result + (Math.floor(Math.random() * die) + 1);
19 | count++;
20 | }
21 | result = result + mod;
22 | return result;
23 | }
24 |
25 |
26 | function reroll(die,num,mod,non){
27 | var result = roll(die,num,mod);
28 | if (result == non){
29 | result = reroll(die,num,mod,non);
30 | }
31 | return result;
32 | }
33 |
34 |
35 | function roll1D() {
36 | return roll(6,1,0);
37 | }
38 |
39 |
40 | function roll2D() {
41 | return roll(6,2,0);
42 | }
43 |
44 |
45 | function numToHex(n) {
46 | return "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ".charAt(n);
47 | }
48 |
49 |
50 | function hexToNum(n) {
51 | return "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ".indexOf(n.toUpperCase());
52 | }
53 |
54 |
55 | function hexString(x,y){
56 | var str = rjust(x.toString(),2,"0");
57 | str += rjust(y.toString(),2,"0");
58 | return str;
59 | }
60 |
61 | /* Gets 2 digit column number from hex location string */
62 | function hexCol(hexnum){
63 | return hexnum.substr(0,2);
64 | }
65 |
66 | /* Gets 2 digit row number from hex location string */
67 | function hexRow(hexnum){
68 | return hexnum.substr(2,2);
69 | }
70 |
71 |
72 | function ljust(str, size, fill) {
73 | while (str.length < size) {
74 | str = str + fill;
75 | }
76 | return str;
77 | }
78 |
79 |
80 | function rjust(str, size, fill) {
81 | while (str.length < size) {
82 | str = fill + str;
83 | }
84 | return str;
85 | }
86 |
87 | /* Returns the index of an object in a given array
88 |
89 | var index = arrayIndexOf(array, function(obj) {
90 | return obj.property == value;
91 | });
92 | */
93 | function arrayIndexOf(array, func) {
94 | if (!func || typeof (func) != 'function'){ return -1; }
95 | if (!array || !array.length || array.length < 1) { return -1; }
96 | for (var i = 0; i < array.length; i++){
97 | if (func(array[i])) { return i; }
98 | }
99 | return -1;
100 | }
101 |
102 | // Miscellaneous functions
103 | function even(x) { return ( x % 2 ) == 0; }
104 | function odd (x) { return ( x % 2 ) != 0; }
105 | function div(a, b) { return Math.floor(a / b); }
106 | function mod(a, b) { return Math.floor(a % b); }
107 | function max(a, b, c) { return (a >= b && a >= c) ? a : (b >= a && b >= c) ? b : c; }
108 |
109 | // Gets the length of an object
110 | Object.size = function(obj) {
111 | var size = 0, key;
112 | for (key in obj) {
113 | if (obj.hasOwnProperty(key)) size++;
114 | }
115 | return size;
116 | };
117 |
118 |
119 | function rand(){
120 | rand.seed = (rand.seed * rand.a + rand.c) % rand.m;
121 | return rand.seed / rand.m;
122 | }
123 |
124 | rand.m = 714025;
125 | rand.a = 4096;
126 | rand.c = 150889;
127 | rand.seed = (new Date()).getTime() % rand.m;
128 |
129 | function srand(seed) { rand.seed = seed; }
130 |
131 | /*
132 | /* Distance functions for hexes
133 | */
134 |
135 | /* Returns the distance between two hexes */
136 | function dist(a, b){
137 | var a_x = div(a,100);
138 | var a_y = mod(a,100);
139 | var b_x = div(b,100);
140 | var b_y = mod(b,100);
141 | var dx = b_x - a_x;
142 | var dy = b_y - a_y;
143 | var adx = Math.abs(dx);
144 | var ody = dy + div( adx, 2 );
145 | if( odd(a_x) && even(b_x) ) { ody += 1; }
146 | return max(adx - ody, ody, adx);
147 | }
148 |
149 | /* Returns the distance between two hexes */
150 | function distance(world1, world2){
151 | var a1 = world1.row + Math.floor(world1.col / 2, 10);
152 | var a2 = world2.row + Math.floor(world2.col / 2, 10);
153 |
154 | var d1 = Math.abs(a1 - a2);
155 | var d2 = Math.abs(world1.col - world2.col);
156 | var d3 = Math.abs((a1 - world1.col) - (a2 - world2.col));
157 |
158 | if ((d1 > d2) && (d1 > d3)){ return d1; }
159 | if ((d2 > d1) && (d2 > d3)){ return d2; }
160 | return d3;
161 | }
162 |
163 | /* Returns list of hexes within specified jump range */
164 | function reachableHexes(hex, jump){
165 |
166 | var results = [];
167 | var x = div(hex, 100);
168 | var y = mod(hex, 100);
169 |
170 | for(var rx = x - jump; rx <= x + jump; rx++){
171 | for(var ry = y - jump; ry <= y + jump; ry++){
172 | if(rx >= 1 && rx <= SEC_COLS && ry >= 1 && ry <= SEC_ROWS){
173 | var candidate = hexString(rx, ry);
174 | var distance = dist( hex, candidate);
175 | if(distance > 0 && distance <= jump){
176 | results.push(candidate);
177 | }
178 | }
179 | }
180 | }
181 | return results;
182 | }
183 |
184 | //
185 | // These functions are used for helping to determine trade routes
186 | //
187 |
188 | // A* Algorithm
189 | // Based on notes in _AI for Game Developers_, Bourg & Seemann, O'Reilly Media, Inc., July 2004.
190 | // Code by Joshua Bell
191 | function Node(id, cost, steps, parent){
192 | this.id = id;
193 | this.cost = cost;
194 | this.steps = steps;
195 | this.parent = parent;
196 | }
197 |
198 |
199 | function List(){
200 | this.list = new Object();
201 | this.count = 0;
202 | }
203 |
204 | List.prototype.isEmpty = function(){
205 | return (this.count == 0);
206 | }
207 |
208 | List.prototype.contains = function(node){
209 | return (this.list[node.id] !== undefined);
210 | }
211 |
212 | List.prototype.add = function(node){
213 | if(!this.contains(node)){
214 | this.list[node.id] = node;
215 | this.count++;
216 | }
217 | var str = "";
218 | for(var key in this.list) { str += " " + key + ": " + this.list[key] + " "; }
219 | }
220 |
221 | List.prototype.remove = function(node){
222 | if(this.contains(node)){
223 | delete this.list[node.id];
224 | this.count--;
225 | }
226 | var str = "";
227 | for(var key in this.list) { str += " " + key + ": " + this.list[key] + " "; }
228 | }
229 |
230 | List.prototype.getLowestCostNode = function(){
231 | var cost = undefined;
232 | var node = undefined;
233 |
234 | for(var key in this.list){
235 | var currentNode = this.list[key];
236 | if(cost === undefined || currentNode.cost < cost){
237 | node = currentNode;
238 | cost = currentNode.cost;
239 | }
240 | }
241 | return node;
242 | }
243 |
--------------------------------------------------------------------------------