mapserver-8.4.0/share/ogcapi/templates/html-bootstrap4/landing.html000066400000000000000000000010031474174441300254410ustar00rootroot00000000000000{% include "header.html" %}

{{ response.title }}

{{ response.description }}

Links

{% include "footer.html" %} mapserver-8.4.0/share/ogcapi/templates/html-bootstrap4/openapi.html000066400000000000000000000025361474174441300254740ustar00rootroot00000000000000 Swagger UI - {{ template.title }}
mapserver-8.4.0/share/ogcapi/templates/html-plain/000077500000000000000000000000001474174441300221475ustar00rootroot00000000000000mapserver-8.4.0/share/ogcapi/templates/html-plain/collection-item.html000066400000000000000000000004521474174441300261250ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collection Item: {{ response.collection.title }}

Properties:

  • ID: {{ response.id }}
  • {% for key, value in response.properties %}
  • {{ key }}: {{ value }}
  • {% endfor %}
{% include "footer.html" %} mapserver-8.4.0/share/ogcapi/templates/html-plain/collection-items.html000066400000000000000000000014571474174441300263160ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collection Items: {{ response.collection.title }}

Number of matching items: {{ response.numberMatched }}
Number of returned items: {{ response.numberReturned }}

{% if response.features %} {% for key, value in response.features.0.properties %} {% endfor %} {% endif %} {% for feature in response.features %} {% for key, value in feature.properties %} {% endfor %} {% endfor %}
ID{{ key }}
{{ feature.id }}{{ value }}
{% include "footer.html" %} mapserver-8.4.0/share/ogcapi/templates/html-plain/collection.html000066400000000000000000000014451474174441300251740ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collection: {{ response.title }}

{{ response.description }}

{% if existsIn(response, "keywords") and length(response.keywords) > 0 %}

Keywords

    {% for keyword in response.keywords %}
  • {{ keyword }}
  • {% endfor %}
{% endif %} {% if existsIn(response, "storageCrs") %}

Storage CRS

{{ response.storageCrs }} {% endif %} {% if existsIn(response, "crs") %}

Supported CRS

    {% for href in response.crs %}
  • {{ href }}
  • {% endfor %}
{% endif %}

Links

{% include "footer.html" %} mapserver-8.4.0/share/ogcapi/templates/html-plain/collections.html000066400000000000000000000011001474174441300253430ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collections

{% for collection in response.collections %} {% endfor %}
# Title Type Description
{{ loop.index1 }} {{ collection.title }} {{ collection.itemType }} {{ collection.description }}
{% include "footer.html" %} mapserver-8.4.0/share/ogcapi/templates/html-plain/conformance.html000066400000000000000000000005501474174441300253270ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Conformance

This API implements the conformance classes from standards and community specifications that are listed below.

Links

    {% for url in response.conformsTo %}
  • {{ url }}
  • {% endfor %}
{% include "footer.html" %} mapserver-8.4.0/share/ogcapi/templates/html-plain/debug.html000066400000000000000000000004771474174441300241330ustar00rootroot00000000000000{% if existsIn(template.tags, "debug") %} {% if template.tags.debug == "true" %}

Template Data

API Root: {{ template.api_root }}
Path: {{ template.path }}
Params: {{ template.params }}
Title: {{ template.title }}
Tags: {{ template.tags }}

{% endif %} {% endif %} mapserver-8.4.0/share/ogcapi/templates/html-plain/footer.html000066400000000000000000000000611474174441300243300ustar00rootroot00000000000000 {% include "debug.html" %} mapserver-8.4.0/share/ogcapi/templates/html-plain/header.html000066400000000000000000000002001474174441300242550ustar00rootroot00000000000000 {{ template.title }} mapserver-8.4.0/share/ogcapi/templates/html-plain/landing.html000066400000000000000000000004021474174441300244450ustar00rootroot00000000000000{% include "header.html" %}

{{ response.title }}

{{ response.description }}

Links

{% include "footer.html" %} mapserver-8.4.0/share/ogcapi/templates/html-plain/openapi.html000066400000000000000000000025361474174441300244760ustar00rootroot00000000000000 Swagger UI - {{ template.title }}
mapserver-8.4.0/src/000077500000000000000000000000001474174441300143275ustar00rootroot00000000000000mapserver-8.4.0/src/apache/000077500000000000000000000000001474174441300155505ustar00rootroot00000000000000mapserver-8.4.0/src/apache/CMakeLists.txt000066400000000000000000000025571474174441300203210ustar00rootroot00000000000000add_library(mod_mapserver MODULE mod_mapserver.c) target_link_libraries(mod_mapserver ${MAPSERVER_LIBMAPSERVER}) set_target_properties(mod_mapserver PROPERTIES PREFIX "") IF(APPLE) if(HTTPD_EXECUTABLE) if(XCODE) SET(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -bundle_loader ${HTTPD_EXECUTABLE}") else(XCODE) SET(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "${CMAKE_SHARED_MODULE_CREATE_C_FLAGS} -bundle_loader ${HTTPD_EXECUTABLE}") endif(XCODE) else(HTTPD_EXECUTABLE) if(XCODE) SET(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -undefined dynamic_lookup") else(XCODE) SET(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "${CMAKE_SHARED_MODULE_CREATE_C_FLAGS} -Wl,-undefined,dynamic_lookup") endif(XCODE) endif(HTTPD_EXECUTABLE) ENDIF(APPLE) find_package(APACHE) if(APACHE_FOUND) include_directories(${APACHE_INCLUDE_DIR}) else(APACHE_FOUND) report_mandatory_not_found(APACHE) endif(APACHE_FOUND) find_package(APR) if(APR_FOUND) include_directories(${APR_INCLUDE_DIR}) target_link_libraries(mod_mapserver ${APR_LIBRARY}) if(DEFINED APR_CPPFLAGS) add_definitions("${APR_CPPFLAGS}") endif(DEFINED APR_CPPFLAGS) else(APR_FOUND) report_mandatory_not_found(APR) endif(APR_FOUND) if(APACHE_MODULE_DIR) INSTALL(TARGETS mod_mapserver DESTINATION ${APACHE_MODULE_DIR}) endif(APACHE_MODULE_DIR) mapserver-8.4.0/src/apache/mod_mapserver.c000066400000000000000000000337341474174441300205710ustar00rootroot00000000000000/* * mod_mapserver.c -- Apache sample wms module */ #include "httpd.h" #include "http_config.h" #include "http_protocol.h" #include "http_log.h" #include "ap_config.h" #include "apr.h" #include "apr_strings.h" #include "apr_tables.h" #include "apr_file_info.h" #include "../mapserver.h" /* for mapObj */ #include "../cgiutil.h" #include "../apps/mapserv.h" module AP_MODULE_DECLARE_DATA mapserver_module; typedef struct { apr_pool_t *config_pool; apr_time_t mtime; char *mapfile_name; char *uri; mapObj *map; } mapserver_dir_config; /* These are the IO redirection hooks. They are mostly copied over from * mapio.c. Note that cbData contains Apache's request_rec! */ static int msIO_apacheWrite(void *cbData, void *data, int byteCount) { /* simply use the block writing function which is very similar to fwrite */ return ap_rwrite(data, byteCount, (request_rec *)cbData); } static int msIO_apacheError(void *cbData, void *data, int byteCount) { /* error reporting is done through the log file... */ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "%s", (char *)data); return strlen((char *)data); } int msIO_installApacheRedirect(request_rec *r) { msIOContext stdout_ctx, stderr_ctx; stdout_ctx.label = "apache"; stdout_ctx.write_channel = MS_TRUE; stdout_ctx.readWriteFunc = msIO_apacheWrite; stdout_ctx.cbData = (void *)r; stderr_ctx.label = "apache"; stderr_ctx.write_channel = MS_TRUE; stderr_ctx.readWriteFunc = msIO_apacheError; stderr_ctx.cbData = (void *)r; msIO_installHandlers(NULL, &stdout_ctx, &stderr_ctx); return MS_TRUE; } /* The maximum number of arguments we support. The number is taken from * cgiutil.h I think. It is only used for easier param decoding. */ #define WMS_MAX_ARGS 100 /* This is our simple query decoding function. Should be improved but for now * it works... */ static int mapserver_decode_args(apr_pool_t *p, char *args, char ***ParamNames, char ***ParamValues) { char **argv = NULL; int i; int n; int argc = 0; char *sep; /* alloc the name/value pointer list */ argv = (char **)apr_pcalloc(p, (WMS_MAX_ARGS + 1) * 2 * sizeof(char *)); *ParamNames = argv; *ParamValues = argv + WMS_MAX_ARGS + 1; /* No arguments? Then we're done */ if (!args) return 0; argv[0] = args; /* separate the arguments */ for (i = 1, n = 0; args[n] && (i < WMS_MAX_ARGS); n++) if (args[n] == '&') { argv[i++] = args + n + 1; args[n] = '\0'; } /* eliminate empty args */ for (n = 0, i = 0; argv[i]; i++) if (*(argv[i]) != '\0') argv[n++] = argv[i]; else argv[i] = NULL; /* argument count is the number of non-zero arguments! */ argc = n; /* split the name/value pairs */ for (i = 0; argv[i]; i++) { sep = strchr(argv[i], '='); if (!sep) continue; *sep = '\0'; argv[i + WMS_MAX_ARGS + 1] = (char *)apr_pstrdup(p, sep + 1); if (ap_unescape_url(argv[i + WMS_MAX_ARGS + 1]) == HTTP_BAD_REQUEST) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "%s: malformed URI, couldn't unescape param %s", __func__, argv[i]); argv[i + WMS_MAX_ARGS + 1] = NULL; } else { plustospace(argv[i + WMS_MAX_ARGS + 1]); } } return argc; } static char *mapserver_read_post_data(request_rec *r) { int size; long blen, rsize, rpos = 0; char *buffer = NULL; char buf[512]; if (ap_setup_client_block(r, REQUEST_CHUNKED_ERROR) != OK) return NULL; if (!ap_should_client_block(r)) return NULL; buffer = (char *)apr_palloc(r->pool, r->remaining + 1); if (!buffer) return NULL; size = r->remaining; buffer[size] = '\0'; while ((blen = ap_get_client_block(r, buf, sizeof(buf))) > 0) { if (rpos + blen > size) { rsize = blen - rpos; } else { rsize = blen; } memcpy((char *)buffer + rpos, buf, rsize); rpos += rsize; } return buffer; } /* ** Extract Map File name from params and load it. ** Returns map object or NULL on error. */ static mapObj *msModuleLoadMap(mapservObj *mapserv, mapserver_dir_config *conf) { int i; /* OK, here's the magic: we take the mapObj from our stored config. * We will use a copy of it created by msCopyMap since MapServer * modifies the object at several places during request processing */ mapObj *map = msNewMapObj(); if (!map) return NULL; msCopyMap(map, conf->map); /* check for any %variable% substitutions here, also do any map_ changes, we * do this here so WMS/WFS */ /* services can take advantage of these "vendor specific" extensions */ for (i = 0; i < mapserv->request->NumParams; i++) { /* ** a few CGI variables should be skipped altogether ** ** qstring: there is separate per layer validation for attribute queries and *the substitution checks ** below conflict with that so we avoid it here */ if (strncasecmp(mapserv->request->ParamNames[i], "qstring", 7) == 0) continue; if (strncasecmp(mapserv->request->ParamNames[i], "map_", 4) == 0 || strncasecmp(mapserv->request->ParamNames[i], "map.", 4) == 0) { /* check to see if there are any additions to the mapfile */ if (msUpdateMapFromURL(map, mapserv->request->ParamNames[i], mapserv->request->ParamValues[i]) != MS_SUCCESS) { msFreeMap(map); return NULL; } continue; } } msApplySubstitutions(map, mapserv->request->ParamNames, mapserv->request->ParamValues, mapserv->request->NumParams); msApplyDefaultSubstitutions(map); /* check to see if a ogc map context is passed as argument. if there */ /* is one load it */ for (i = 0; i < mapserv->request->NumParams; i++) { if (strcasecmp(mapserv->request->ParamNames[i], "context") == 0) { if (mapserv->request->ParamValues[i] && strlen(mapserv->request->ParamValues[i]) > 0) { if (strncasecmp(mapserv->request->ParamValues[i], "http", 4) == 0) { if (msGetConfigOption(map, "CGI_CONTEXT_URL")) msLoadMapContextURL(map, mapserv->request->ParamValues[i], MS_FALSE); } else msLoadMapContext(map, mapserv->request->ParamValues[i], MS_FALSE); } } } /* * RFC-42 HTTP Cookie Forwarding * Here we set the http_cookie_data metadata to handle the * HTTP Cookie Forwarding. The content of this metadata is the cookie * content. In the future, this metadata will probably be replaced * by an object that is part of the mapObject that would contain * information on the application status (such as cookie). */ if (mapserv->request->httpcookiedata != NULL) { msInsertHashTable(&(map->web.metadata), "http_cookie_data", mapserv->request->httpcookiedata); } return map; } /*** * The main request handler. **/ static int mapserver_handler(request_rec *r) { /* acquire the appropriate configuration for this directory */ mapserver_dir_config *conf; conf = (mapserver_dir_config *)ap_get_module_config(r->per_dir_config, &mapserver_module); /* decline the request if there's no map configured */ if (!conf || !conf->map) return DECLINED; apr_finfo_t mapstat; if (apr_stat(&mapstat, conf->mapfile_name, APR_FINFO_MTIME, r->pool) == APR_SUCCESS) { if (apr_time_sec(mapstat.mtime) > apr_time_sec(conf->mtime)) { mapObj *newmap = msLoadMap(conf->mapfile_name, NULL); if (newmap) { msFreeMap(conf->map); conf->map = newmap; conf->mtime = mapstat.mtime; } else { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, "unable to reload map file %s", conf->mapfile_name); } } } else { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, "%s: unable to stat file %s", __func__, conf->mapfile_name); } /* make a copy of the URI so we can modify it safely */ char *uri = apr_pstrdup(r->pool, r->uri); int len = strlen(uri); int conf_uri_len = strlen(conf->uri); /* If the URI points to a subdirectory we want to decline. */ if (len > conf_uri_len) return DECLINED; int argc = 0; char **ParamNames = NULL; char **ParamValues = NULL; char *post_data = NULL; int szMethod = -1; char *szContentType = NULL; mapservObj *mapserv = NULL; /* Try decoding the query string */ if (r->method_number == M_GET) { argc = mapserver_decode_args(r->pool, (char *)apr_pstrdup(r->pool, r->args), &ParamNames, &ParamValues); szMethod = MS_GET_REQUEST; } else if (r->method_number == M_POST) { szContentType = (char *)apr_table_get(r->headers_in, "Content-Type"); post_data = mapserver_read_post_data(r); szMethod = MS_POST_REQUEST; if (strcmp(szContentType, "application/x-www-form-urlencoded") == 0) { argc = mapserver_decode_args(r->pool, (char *)apr_pstrdup(r->pool, r->args), &ParamNames, &ParamValues); } } else return HTTP_METHOD_NOT_ALLOWED; if (!argc && !post_data) return HTTP_BAD_REQUEST; /* Now we install the IO redirection. */ if (msIO_installApacheRedirect(r) != MS_TRUE) ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "%s: could not install apache redirect", __func__); mapserv = msAllocMapServObj(); mapserv->request->NumParams = argc; mapserv->request->ParamNames = ParamNames; mapserv->request->ParamValues = ParamValues; mapserv->request->type = (enum MS_REQUEST_TYPE)szMethod; mapserv->request->postrequest = post_data; mapserv->request->contenttype = szContentType; // mapserv->map = msModuleLoadMap(mapserv,conf); mapserv->map = conf->map; if (!mapserv->map) { msCGIWriteError(mapserv); goto end_request; } if (msCGIDispatchRequest(mapserv) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } end_request: if (mapserv) { mapserv->request->ParamNames = NULL; mapserv->request->ParamValues = NULL; mapserv->request->postrequest = NULL; mapserv->request->contenttype = NULL; mapserv->map = NULL; msFreeMapServObj(mapserv); } msResetErrorList(); /* Check if status was set inside MapServer functions. If it was, we * return it's value instead of simply OK. This is to support redirects * from maptemplate.c */ if (r->status == HTTP_MOVED_TEMPORARILY) return r->status; return OK; } /* This function will be called on startup to allow us to register our * handler. We don't do anything else yet... */ static void mapserver_register_hooks(apr_pool_t *p) { ap_hook_handler(mapserver_handler, NULL, NULL, APR_HOOK_MIDDLE); } /* That's the second part of the overall magic. This function will be called * when the configuration reaches the "WMS_Map" parameter. It will be passed * in as argument and should contain the full path and name of the map file. * We try to load it and store the resulting mapObj in the config of the * current directory. If we fail we throw a message... */ static const char *mapserver_set_map(cmd_parms *cmd, void *config, const char *arg) { mapserver_dir_config *conf = (mapserver_dir_config *)config; /* if the mapObj already exists the WMS_Map was given more than once - * may be the user forgot to comment something out... */ if (conf->map) { msWriteError(stderr); return (char *)apr_psprintf(cmd->temp_pool, "An MAP-file has already been registered for " "this URI - not accepting '%s'.", arg); } /* Simply try loading the argument as map file. */ conf->mapfile_name = apr_pstrdup(cmd->pool, arg); conf->map = msLoadMap((char *)arg, NULL); /* Ooops - we failed. We report it and fail. So beware: Always do a * configcheck before really restarting your web server! */ if (!conf->map) { msWriteError(stderr); return (char *)apr_psprintf( cmd->temp_pool, "The given MAP-file '%s' could not be loaded", arg); } apr_finfo_t status; if (apr_stat(&status, conf->mapfile_name, APR_FINFO_MTIME, cmd->pool) != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, "%s: unable to stat file %s", __func__, conf->mapfile_name); } conf->mtime = status.mtime; return NULL; } /* This function creates the (default) directory configuration. Well, we have * no defaults to set so we simply alloc the memory... */ static void *mapserver_create_dir_config(apr_pool_t *p, char *dir) { mapserver_dir_config *newconf; newconf = (mapserver_dir_config *)apr_pcalloc(p, sizeof(mapserver_dir_config)); newconf->config_pool = p; newconf->uri = apr_pstrdup(p, dir); newconf->map = NULL; newconf->mapfile_name = NULL; newconf->mtime = apr_time_from_sec(0); if (dir) { int len = strlen(dir); if (len > 1 && dir[len - 1] == '/') newconf->uri[len - 1] = '\0'; } return newconf; } /* This structure defines our single config option which takes exactly one * argument. */ static const command_rec mapserver_options[] = { AP_INIT_TAKE1("Mapfile", mapserver_set_map, NULL, ACCESS_CONF, "WMS_Map "), {NULL}}; /* The following structure declares everything Apache needs to treat us as * a module. Merging would mean inheriting from the parent directory but that * doesn't make much sense here since we would only inherit the map file... */ /* Dispatch list for API hooks */ module AP_MODULE_DECLARE_DATA mapserver_module = { STANDARD20_MODULE_STUFF, mapserver_create_dir_config, /* create per-dir config structures */ NULL, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ mapserver_options, /* table of config file commands */ mapserver_register_hooks /* register hooks */ }; mapserver-8.4.0/src/apps/000077500000000000000000000000001474174441300152725ustar00rootroot00000000000000mapserver-8.4.0/src/apps/coshp.c000066400000000000000000000201351474174441300165530ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Command line utility to sort a shapefile based on the * spatial index file. * ****************************************************************************** * Copyright (c) 2021 Paul Ramsey * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include #include #include #include "../mapserver.h" typedef struct { SHPHandle inSHP, outSHP; DBFHandle inDBF, outDBF; int currentOutRecord; int numDbfFields; } writeState; static char *AddFileSuffix(const char *Filename, const char *Suffix) { char *pszFullname, *pszBasename; int i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *)msSmallMalloc(strlen(Filename) + 5); strcpy(pszBasename, Filename); for (i = (int)strlen(pszBasename) - 1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { } if (pszBasename[i] == '.') pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *)msSmallMalloc(strlen(pszBasename) + 5); sprintf(pszFullname, "%s%s", pszBasename, Suffix); free(pszBasename); return (pszFullname); } static int writeShape(writeState *state, int shapeId) { int j = 0; int i = state->currentOutRecord; char fName[20]; int fWidth, fnDecimals; shapeObj shape; /* Copy the DBF record over */ for (j = 0; j < state->numDbfFields; j++) { DBFFieldType dbfField = msDBFGetFieldInfo(state->inDBF, j, fName, &fWidth, &fnDecimals); switch (dbfField) { case FTInteger: msDBFWriteIntegerAttribute( state->outDBF, i, j, msDBFReadIntegerAttribute(state->inDBF, shapeId, j)); break; case FTDouble: msDBFWriteDoubleAttribute( state->outDBF, i, j, msDBFReadDoubleAttribute(state->inDBF, shapeId, j)); break; case FTString: msDBFWriteStringAttribute( state->outDBF, i, j, msDBFReadStringAttribute(state->inDBF, shapeId, j)); break; default: fprintf(stderr, "Unsupported data type for field: %s, exiting.\n", fName); exit(0); } } /* Copy the SHP record over */ msSHPReadShape(state->inSHP, shapeId, &shape); msSHPWriteShape(state->outSHP, &shape); msFreeShape(&shape); /* Increment output row number */ state->currentOutRecord++; return MS_SUCCESS; } static int writeNode(writeState *state, treeNodeObj *node) { int i; if (node->ids) { for (i = 0; i < node->numshapes; i++) { int curRec = state->currentOutRecord; writeShape(state, node->ids[i]); node->ids[i] = curRec; } } for (i = 0; i < node->numsubnodes; i++) { if (node->subnode[i]) writeNode(state, node->subnode[i]); } return MS_SUCCESS; } int main(int argc, char *argv[]) { treeObj *tree; /* In-memory index */ shapefileObj shapefile; /* Input shapefile */ SHPHandle outSHP; /* Output SHP */ DBFHandle outDBF; /* Output DBF */ DBFFieldType dbfField; writeState state; int shpType, nShapes; char fName[20]; int fWidth, fnDecimals; char buffer[1024]; int numFields; int i; if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ------------------------------------------------------------------------------- */ /* Check the number of arguments, return syntax if not correct */ /* ------------------------------------------------------------------------------- */ if (argc != 3) { fprintf(stderr, "Syntax: %s [infile] [outfile]\n", argv[0]); exit(1); } msSetErrorFile("stderr", NULL); /* ------------------------------------------------------------------------------- */ /* Open the shapefile */ /* ------------------------------------------------------------------------------- */ if (msShapefileOpen(&shapefile, "rb", argv[1], MS_TRUE) < 0) { fprintf(stdout, "Error opening shapefile %s.\n", argv[1]); exit(0); } nShapes = shapefile.numshapes; shpType = shapefile.type; numFields = msDBFGetFieldCount(shapefile.hDBF); /* ------------------------------------------------------------------------------- */ /* Index the shapefile (auto-calculate depth) */ /* ------------------------------------------------------------------------------- */ tree = msCreateTree(&shapefile, 0); msTreeTrim(tree); /* ------------------------------------------------------------------------------- */ /* Setup the output .shp/.shx and .dbf files */ /* ------------------------------------------------------------------------------- */ outSHP = msSHPCreate(argv[2], shpType); if (outSHP == NULL) { fprintf(stderr, "Failed to create file '%s'.\n", argv[2]); exit(1); } sprintf(buffer, "%s.dbf", argv[2]); outDBF = msDBFCreate(buffer); if (outDBF == NULL) { fprintf(stderr, "Failed to create dbf file '%s'.\n", buffer); exit(1); } /* Clone the fields from the input to the output definition */ for (i = 0; i < numFields; i++) { dbfField = msDBFGetFieldInfo( shapefile.hDBF, i, fName, &fWidth, &fnDecimals); /* ---- Get field info from in file ---- */ msDBFAddField(outDBF, fName, dbfField, fWidth, fnDecimals); } /* ------------------------------------------------------------------------------- */ /* Write the sorted .shp/.shx and .dbf files */ /* ------------------------------------------------------------------------------- */ /* Set up writer state */ state.inSHP = shapefile.hSHP; state.outSHP = outSHP; state.inDBF = shapefile.hDBF; state.outDBF = outDBF; state.currentOutRecord = 0; state.numDbfFields = numFields; writeNode(&state, tree->root); /* ------------------------------------------------------------------------------- */ /* Write the spatial index */ /* ------------------------------------------------------------------------------- */ msWriteTree(tree, AddFileSuffix(argv[2], MS_INDEX_EXTENSION), MS_NEW_LSB_ORDER); msDestroyTree(tree); /* ------------------------------------------------------------------------------- */ /* Close all files */ /* ------------------------------------------------------------------------------- */ msShapefileClose(&shapefile); msSHPClose(outSHP); msDBFClose(outDBF); fprintf(stdout, "Wrote %d spatially sorted shapes into shapefile '%s'\n", nShapes, argv[2]); return (0); } mapserver-8.4.0/src/apps/coshp.md000066400000000000000000000113671474174441300167400ustar00rootroot00000000000000# MapServer QIX File (aka ShpTree) https://support.esri.com/en/white-paper/279 ## Shape File Model The shape file consists of three standard components. * **shp** file contains the binary representations of the shapes (points, lines, polygons) * **dbf** file contains the associated attribute information for each shape, one row per shape * **shx** includes an ordered list of byte offsets of shapes in the **shp** file The records in each component are inter-related by their **order of appearance**. The first entry in the **shx** file is the byte offset to the first shape in the shape file, and the first record of the dbf file contains the attributes of the first shape. In addition to the standard three components, the QIX model adds a fourth component. * **qix** file contains a binary quad-tree, in which every node in the three includes a bounds, a list of child nodes, and a list of "shape ids" that are contained in that node. The "shape ids" are just the record numbers. So "shape id" **0** corresponds to the first record in the shp/dbf/shx files, and so on. ## Header There is an **8 byte** header. * **byte 0, len 3** are file signature string, always "SQT" * **byte 3, len 1** signals the byte-order of multi-byte types * [see code](https://github.com/MapServer/MapServer/blob/8af82513f8be8a380acbb5d92f9c5dec360ee5f1/maptree.h#L72-L76) * 1 = LSB (little-endian) * 2 = MSB (big-endian) * 0 = native (the endian of the system that wrote the file (probably LSB)) * **byte 4, len 1** is the version number * 1 = current version * **byte 5, len 3** is reserved for future use * **byte 8, len 4** is an **integer** count of number of shapes in the tree * **byte 12, len 4** is an **integer** count of depth of the three All **integer** values may require a byte swap, if the system byte order differs from the file byte order. ## Nodes Nodes contain an * **byte 0, len 4** is an **integer** offset from the just after the numShapes of this node to the start of the next sibling node * **byte 4, len 8** is a the **double** minx of the node * **byte 12, len 8** is a the **double** miny of the node * **byte 20, len 8** is a the **double** maxx of the node * **byte 28, len 8** is a the **double** maxy of the node * **byte 36, len 4** is an **integer** numShapes, the count of shape ids stored in this node * **byte 40, len 4\*numShapes** is an **array of integer** shape ids * **byte 40+4\*numShapes, 40+4\*numShapes+4** is an **integer** numChildren number of child nodes under this node All **integer** and **double** values may require a byte swap, if the system byte order differs from the file byte order. Note that the **offset** is the distance in bytes from just after the numShapes entry, 40 bytes from the start of the node. Or put another way, "offset + 40" is the distance from the start of **this** node to the start of the **next sibling** node. ## Arrangement of Components * The file starts with a header. * A node and all its descendents always form a contiguous range of the file. * A node has at most four children. * Both internal and leaf nodes may contain shape ids. ``` Header Node A Node AA Node AAA Node AAB Node AAC Node AB Node ABA Node ABB Node AC Node B Node BA Node BAA Node BAB Node BB Node C ``` ## Searching ### The Tree The spatial search will involve a "query box" and will return a list of "shape id". * Recursively search from the top node. * Check that the node box and the query box intersect. * If they do not, return. * If they do, then add the "shape ids" in the node to the result list. * Call the search function on each child node. You can use the "offset" of each child to find the location of the next child in the set. Implementation of a reader will probably want to opportunistically load portions of the whole tree into a memory structure, rather than hopping around with random reads. If "distance to next sibling" < some size, load whole subtree into memory and iterate on that. ### For Features Once the tree search is complete, retrieving the features involves pulling the data from the **shp** and **dbf** files. If the shape file has been "cloud optimized", a query rectangle should involve a minimized number of range requests on the data files, since the order of records should match the order of nodes in the tree. Analyze the "shape id" list coming out of the tree search, and find contiguous or almost-contiguous ranges of ids. Lookup the [byte offsets](https://www.esri.com/content/dam/esrisites/sitecore-archive/Files/Pdfs/library/whitepapers/pdfs/shapefile.pdf#page=28) from the **shx** file, then retrieve those ranges of data from the **shp** file. The **dbf** file is based on a fixed-length record, so once the header is read, finding the byte offset of a record just involving multiplying the record length by the shape id number. mapserver-8.4.0/src/apps/legend.c000066400000000000000000000041731474174441300167010ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Mainline of commandline legend generation test utility. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" int main(int argc, char *argv[]) { mapObj *map = NULL; imageObj *img = NULL; msSetup(); if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } if (argc < 3) { fprintf(stdout, "Syntax: legend [mapfile] [output image]\n"); exit(0); } map = msLoadMap(argv[1], NULL, NULL); if (!map) { msWriteError(stderr); exit(0); } img = msDrawLegend(map, MS_FALSE, NULL); if (!img) { msWriteError(stderr); exit(0); } msSaveImage(NULL, img, argv[2]); msFreeImage(img); msFreeMap(map); return (MS_TRUE); } mapserver-8.4.0/src/apps/map2img.c000066400000000000000000000316721474174441300170030ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Commandline .map rendering utility, mostly for testing. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "../mapserver.h" #include "../maptime.h" #include "limits.h" /** * Check if the required number of arguments are available for the * parsed option or otherwise print an error message and exit. * * @param option option name for the error message * @param num_required_arguments number of arguments required by option * @param num_remaining_arguments number of arguments following the option * @param config optional config object to free if we exit * @param map optional map object to free if we exit */ static void hasMoreArgumentsOrExit(const char *option, int num_required_arguments, int num_remaining_arguments, configObj *config, mapObj *map) { (void)map; if (num_remaining_arguments < num_required_arguments) { if (num_required_arguments == 1) fprintf(stderr, "Argument %s requires an additional argument.\n", option); else fprintf(stderr, "Argument %s needs %i space separated arguments.\n", option, num_required_arguments); msCleanup(); msFreeConfig(config); exit(1); } } int main(int argc, char *argv[]) { int i, j, k; mapObj *map = NULL; imageObj *image = NULL; configObj *config = NULL; char **layers = NULL; int num_layers = 0; int layer_found = 0; char *outfile = NULL; /* no -o sends image to STDOUT */ int iterations = 1; int draws = 0; /* ---- output version info and exit --- */ if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ---- check the number of arguments, return syntax if not correct ---- */ if (argc < 3) { fprintf(stdout, "\nPurpose: convert a mapfile to an image\n\n"); fprintf(stdout, "Syntax: map2img -m mapfile [-o image] [-e minx miny maxx " "maxy] [-s sizex sizey]\n" " [-l \"layer1 [layers2...]\"] [-i format]\n" " [-all_debug n] [-map_debug n] " "[-layer_debug n] [-p n] [-c n] [-d layername datavalue]\n" " [-conf filename]\n"); fprintf(stdout, " -m mapfile: Map file to operate on - required\n"); fprintf( stdout, " -i format: Override the IMAGETYPE value to pick output format\n"); fprintf(stdout, " -o image: output filename (stdout if not provided)\n"); fprintf(stdout, " -e minx miny maxx maxy: extents to render\n"); fprintf(stdout, " -s sizex sizey: output image size\n"); fprintf(stdout, " -l layers: layers / groups to enable - make sure they " "are quoted and space separated if more than one listed\n"); fprintf(stdout, " -all_debug n: Set debug level for map and all layers\n"); fprintf(stdout, " -map_debug n: Set map debug level\n"); fprintf(stdout, " -layer_debug layer_name n: Set layer debug level\n"); fprintf(stdout, " -c n: draw map n number of times\n"); fprintf(stdout, " -p n: pause for n seconds after reading the map\n"); fprintf(stdout, " -d layername datavalue: change DATA value for layer\n"); fprintf( stdout, " -conf filename: filename of the MapServer configuration file.\n"); exit(0); } if (msSetup() != MS_SUCCESS) { msWriteError(stderr); exit(1); } bool some_debug_requested = FALSE; const char *config_filename = NULL; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-c") == 0) { /* user specified number of draws */ hasMoreArgumentsOrExit("-c", 1, argc - i - 1, config, map); iterations = atoi(argv[i + 1]); if (iterations < 0 || iterations > INT_MAX - 1) { printf("Invalid number of iterations"); return 1; } printf("We will draw %d times...\n", iterations); continue; } if (strcmp(argv[i], "-all_debug") == 0) { /* global debug */ hasMoreArgumentsOrExit("-all_debug", 1, argc - i - 1, config, map); int debug_level = atoi(argv[++i]); some_debug_requested = TRUE; msSetGlobalDebugLevel(debug_level); continue; } if (i < argc - 1 && (strcmp(argv[i], "-map_debug") == 0 || strcmp(argv[i], "-layer_debug") == 0)) { some_debug_requested = TRUE; continue; } if (strcmp(argv[i], "-conf") == 0) { hasMoreArgumentsOrExit("-conf", 1, argc - i - 1, config, map); config_filename = argv[i + 1]; ++i; continue; } } if (some_debug_requested) { /* Send output to stderr by default */ if (msGetErrorFile() == NULL) msSetErrorFile("stderr", NULL); } config = msLoadConfig(config_filename); for (draws = 0; draws < iterations; draws++) { struct mstimeval requeststarttime, requestendtime; if (msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&requeststarttime, NULL); /* Use PROJ_DATA/PROJ_LIB env vars if set */ msProjDataInitFromEnv(); /* Use MS_ERRORFILE and MS_DEBUGLEVEL env vars if set */ if (msDebugInitFromEnv() != MS_SUCCESS) { msWriteError(stderr); msCleanup(); msFreeConfig(config); exit(1); } for (i = 1; i < argc; i++) { /* Step though the user arguments, 1st to find map file */ if (strcmp(argv[i], "-m") == 0) { hasMoreArgumentsOrExit("-m", 1, argc - i - 1, config, map); map = msLoadMap(argv[i + 1], NULL, config); if (!map) { msWriteError(stderr); msCleanup(); msFreeConfig(config); exit(1); } msApplyDefaultSubstitutions(map); } } if (!map) { fprintf(stderr, "Mapfile (-m) option not specified.\n"); msCleanup(); msFreeConfig(config); exit(1); } for (i = 1; i < argc; i++) { /* Step though the user arguments */ if (strcmp(argv[i], "-m") == 0) { /* skip it */ i += 1; } if (strcmp(argv[i], "-p") == 0) { hasMoreArgumentsOrExit("-p", 1, argc - i - 1, config, map); int pause_length = atoi(argv[i + 1]); time_t start_time = time(NULL); printf("Start pause of %d seconds.\n", pause_length); while (time(NULL) < start_time + pause_length) { } printf("Done pause.\n"); i += 1; } if (strcmp(argv[i], "-o") == 0) { /* load the output image filename */ hasMoreArgumentsOrExit("-o", 1, argc - i - 1, config, map); outfile = argv[i + 1]; i += 1; } if (strcmp(argv[i], "-i") == 0) { hasMoreArgumentsOrExit("-i", 1, argc - i - 1, config, map); outputFormatObj *format; format = msSelectOutputFormat(map, argv[i + 1]); if (format == NULL) printf("No such OUTPUTFORMAT as %s.\n", argv[i + 1]); else { msFree((char *)map->imagetype); map->imagetype = msStrdup(argv[i + 1]); msApplyOutputFormat(&(map->outputformat), format, MS_NOOVERRIDE); } i += 1; } if (strcmp(argv[i], "-d") == 0) { /* swap layer data */ hasMoreArgumentsOrExit("-d", 2, argc - i - 1, config, map); for (j = 0; j < map->numlayers; j++) { if (strcmp(GET_LAYER(map, j)->name, argv[i + 1]) == 0) { free(GET_LAYER(map, j)->data); GET_LAYER(map, j)->data = msStrdup(argv[i + 2]); break; } } i += 2; } if (strcmp(argv[i], "-all_debug") == 0) { /* global debug */ hasMoreArgumentsOrExit("-all_debug", 1, argc - i - 1, config, map); int debug_level = atoi(argv[++i]); /* msSetGlobalDebugLevel() already called. Just need to force debug * level in map and all layers */ map->debug = debug_level; for (j = 0; j < map->numlayers; j++) { GET_LAYER(map, j)->debug = debug_level; } } if (strcmp(argv[i], "-map_debug") == 0) { /* debug */ hasMoreArgumentsOrExit("-map_debug", 1, argc - i - 1, config, map); map->debug = atoi(argv[++i]); } if (strcmp(argv[i], "-layer_debug") == 0) { /* debug */ hasMoreArgumentsOrExit("-layer_debug", 2, argc - i - 1, config, map); const char *layer_name = argv[++i]; int debug_level = atoi(argv[++i]); int got_layer = 0; for (j = 0; j < map->numlayers; j++) { if (strcmp(GET_LAYER(map, j)->name, layer_name) == 0) { GET_LAYER(map, j)->debug = debug_level; got_layer = 1; } } if (!got_layer) fprintf(stderr, " Did not find layer '%s' from -layer_debug switch.\n", layer_name); } if (strcmp(argv[i], "-e") == 0) { /* change extent */ hasMoreArgumentsOrExit("-e", 4, argc - i - 1, config, map); map->extent.minx = atof(argv[i + 1]); map->extent.miny = atof(argv[i + 2]); map->extent.maxx = atof(argv[i + 3]); map->extent.maxy = atof(argv[i + 4]); i += 4; } if (strcmp(argv[i], "-s") == 0) { hasMoreArgumentsOrExit("-s", 2, argc - i - 1, config, map); msMapSetSize(map, atoi(argv[i + 1]), atoi(argv[i + 2])); i += 2; } if (strcmp(argv[i], "-l") == 0) { /* load layer list */ hasMoreArgumentsOrExit("-l", 1, argc - i - 1, config, map); layers = msStringSplit(argv[i + 1], ' ', &(num_layers)); for (j = 0; j < num_layers; j++) { /* loop over -l */ layer_found = 0; for (k = 0; k < map->numlayers; k++) { if ((GET_LAYER(map, k)->name && strcasecmp(GET_LAYER(map, k)->name, layers[j]) == 0) || (GET_LAYER(map, k)->group && strcasecmp(GET_LAYER(map, k)->group, layers[j]) == 0)) { layer_found = 1; break; } } if (layer_found == 0) { fprintf(stderr, "Layer (-l) \"%s\" not found\n", layers[j]); msFreeCharArray(layers, num_layers); msFreeMap(map); msCleanup(); msFreeConfig(config); exit(1); } } for (j = 0; j < map->numlayers; j++) { if (GET_LAYER(map, j)->status == MS_DEFAULT) continue; else { GET_LAYER(map, j)->status = MS_OFF; for (k = 0; k < num_layers; k++) { if ((GET_LAYER(map, j)->name && strcasecmp(GET_LAYER(map, j)->name, layers[k]) == 0) || (GET_LAYER(map, j)->group && strcasecmp(GET_LAYER(map, j)->group, layers[k]) == 0)) { GET_LAYER(map, j)->status = MS_ON; break; } } } } msFreeCharArray(layers, num_layers); i += 1; } } image = msDrawMap(map, MS_FALSE); if (!image) { msWriteError(stderr); msFreeMap(map); msCleanup(); msFreeConfig(config); exit(1); } if (msSaveImage(map, image, outfile) != MS_SUCCESS) { msWriteError(stderr); } msFreeImage(image); msFreeMap(map); if (msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&requestendtime, NULL); msDebug("map2img total time: %.3fs\n", (requestendtime.tv_sec + requestendtime.tv_usec / 1.0e6) - (requeststarttime.tv_sec + requeststarttime.tv_usec / 1.0e6)); } } /* for(draws=0; draws #include #ifdef USE_FASTCGI #define NO_FCGI_DEFINES #include "fcgi_stdio.h" #endif #include "mapserv.h" #include "../mapio.h" #include "../maptime.h" #include "cpl_conv.h" #ifndef _WIN32 #include #endif /************************************************************************/ /* FastCGI cleanup functions. */ /************************************************************************/ static int finish_process = 0; #ifndef _WIN32 static void msCleanupOnSignal(int nInData) { (void)nInData; finish_process = 1; } #endif #ifdef _WIN32 static void msCleanupOnExit(void) { finish_process = 1; } #endif #ifdef USE_FASTCGI /************************************************************************/ /* msIO_fcgiRead() */ /* */ /* This is the default implementation via stdio. */ /************************************************************************/ static int msIO_fcgiRead(void *cbData, void *data, int byteCount) { return (int)FCGI_fread(data, 1, byteCount, (FCGI_FILE *)cbData); } /************************************************************************/ /* msIO_fcgiWrite() */ /* */ /* This is the default implementation via stdio. */ /************************************************************************/ static int msIO_fcgiWrite(void *cbData, void *data, int byteCount) { return (int)FCGI_fwrite(data, 1, byteCount, (FCGI_FILE *)cbData); } /************************************************************************/ /* msIO_installFastCGIRedirect() */ /************************************************************************/ static int msIO_installFastCGIRedirect() { msIOContext stdin_ctx, stdout_ctx, stderr_ctx; stdin_ctx.label = "fcgi"; stdin_ctx.write_channel = MS_FALSE; stdin_ctx.readWriteFunc = msIO_fcgiRead; stdin_ctx.cbData = (void *)FCGI_stdin; stdout_ctx.label = "fcgi"; stdout_ctx.write_channel = MS_TRUE; stdout_ctx.readWriteFunc = msIO_fcgiWrite; stdout_ctx.cbData = (void *)FCGI_stdout; stderr_ctx.label = "fcgi"; stderr_ctx.write_channel = MS_TRUE; stderr_ctx.readWriteFunc = msIO_fcgiWrite; stderr_ctx.cbData = (void *)FCGI_stderr; msIO_installHandlers(&stdin_ctx, &stdout_ctx, &stderr_ctx); return MS_TRUE; } #endif /************************************************************************/ /* main() */ /************************************************************************/ int main(int argc, char *argv[]) { int sendheaders = MS_TRUE; struct mstimeval execstarttime, execendtime; struct mstimeval requeststarttime, requestendtime; mapservObj *mapserv = NULL; configObj *config = NULL; /* ** Process -v and -h command line arguments first end exit. We want to avoid *any error messages ** associated with msLoadConfig() or msSetup(). */ const char *config_filename = NULL; const bool use_command_line_options = getenv("QUERY_STRING") == NULL; if (use_command_line_options) { /* WARNING: * Do not parse command line arguments (especially those that could have * dangerous consequences if controlled through a web request), without * checking that the QUERY_STRING environment variable is *not* set, because * in a CGI context, command line arguments can be generated from the * content of the QUERY_STRING, and thus cause a security problem. For ex, * "http://example.com/mapserv.cgi?-conf+bar would result in "mapserv.cgi * -conf bar" being invoked. See * https://github.com/MapServer/MapServer/pull/6429#issuecomment-952533589 * and https://datatracker.ietf.org/doc/html/rfc3875#section-4.4 */ for (int iArg = 1; iArg < argc; iArg++) { if (strcmp(argv[iArg], "-v") == 0) { printf("%s\n", msGetVersion()); fflush(stdout); exit(0); } else if (strcmp(argv[iArg], "-h") == 0 || strcmp(argv[iArg], "--help") == 0) { printf("Usage: mapserv [--help] [-v] [-nh] [QUERY_STRING=value] " "[PATH_INFO=value]\n"); printf(" [-conf filename]\n"); printf("\n"); printf("Options :\n"); printf(" -h, --help Display this help message.\n"); printf(" -v Display version and exit.\n"); printf( " -nh Suppress HTTP headers in CGI mode.\n"); printf(" -conf filename Filename of the MapServer " "configuration file.\n"); printf(" QUERY_STRING=value Set the QUERY_STRING in GET request " "mode.\n"); printf(" PATH_INFO=value Set the PATH_INFO for an API " "request.\n"); fflush(stdout); exit(0); } else if (iArg < argc - 1 && strcmp(argv[iArg], "-conf") == 0) { config_filename = argv[iArg + 1]; ++iArg; } } } config = msLoadConfig(config_filename); // first thing if (config == NULL) { #ifdef USE_FASTCGI msIO_installFastCGIRedirect(); // FastCGI setup for error handling here FCGI_Accept(); #endif msCGIWriteError(mapserv); exit(0); } /* -------------------------------------------------------------------- */ /* Initialize mapserver. This sets up threads, GD and GEOS as */ /* well as using MS_ERRORFILE and MS_DEBUGLEVEL env vars if set. */ /* -------------------------------------------------------------------- */ if (msSetup() != MS_SUCCESS) { #ifdef USE_FASTCGI msIO_installFastCGIRedirect(); // FastCGI setup for error handling here FCGI_Accept(); #endif msCGIWriteError(mapserv); msCleanup(); msFreeConfig(config); exit(0); } if (msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&execstarttime, NULL); /* -------------------------------------------------------------------- */ /* Process arguments. In normal use as a cgi-bin there are no */ /* commandline switches, but we provide a few for test/debug */ /* purposes. */ /* -------------------------------------------------------------------- */ if (use_command_line_options) { for (int iArg = 1; iArg < argc; iArg++) { if (strcmp(argv[iArg], "-nh") == 0) { sendheaders = MS_FALSE; msIO_setHeaderEnabled(MS_FALSE); } else if (strncmp(argv[iArg], "QUERY_STRING=", 13) == 0) { /* Debugging hook... pass "QUERY_STRING=..." on the command-line */ putenv("REQUEST_METHOD=GET"); /* coverity[tainted_string] */ putenv(argv[iArg]); } else if (strncmp(argv[iArg], "PATH_INFO=", 10) == 0) { /* Debugging hook for APIs... pass "PATH_INFO=..." on the command-line */ putenv("REQUEST_METHOD=GET"); /* coverity[tainted_string] */ putenv(argv[iArg]); } } } /* -------------------------------------------------------------------- */ /* Setup cleanup magic, mainly for FastCGI case. */ /* -------------------------------------------------------------------- */ #ifndef _WIN32 signal(SIGUSR1, msCleanupOnSignal); signal(SIGTERM, msCleanupOnSignal); #endif #ifdef USE_FASTCGI msIO_installFastCGIRedirect(); /* In FastCGI case we loop accepting multiple requests. In normal CGI */ /* use we only accept and process one request. */ while (!finish_process && FCGI_Accept() >= 0) { #endif /* def USE_FASTCGI */ /* -------------------------------------------------------------------- */ /* Process a request. */ /* -------------------------------------------------------------------- */ mapserv = msAllocMapServObj(); mapserv->sendheaders = sendheaders; /* override the default if necessary (via command line -nh switch) */ mapserv->request->NumParams = loadParams(mapserv->request, NULL, NULL, 0, NULL); if (msCGIIsAPIRequest(mapserv) == MS_FALSE && mapserv->request->NumParams == -1) { /* no QUERY_STRING or PATH_INFO */ msCGIWriteError(mapserv); goto end_request; } mapserv->map = msCGILoadMap(mapserv, config); if (!mapserv->map) { msCGIWriteError(mapserv); goto end_request; } if (mapserv->map->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&requeststarttime, NULL); #ifdef USE_FASTCGI if (mapserv->map->debug) { static int nRequestCounter = 1; msDebug("CGI Request %d on process %d\n", nRequestCounter, getpid()); nRequestCounter++; } #endif if (mapserv->request->api_path != NULL && mapserv->request->api_path_length > 1) { // API requests require a map key and a path if (msCGIDispatchAPIRequest(mapserv) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } } else if (msCGIDispatchRequest(mapserv) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } end_request: if (mapserv->map && mapserv->map->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&requestendtime, NULL); msDebug("mapserv request processing time (msLoadMap not incl.): %.3fs\n", (requestendtime.tv_sec + requestendtime.tv_usec / 1.0e6) - (requeststarttime.tv_sec + requeststarttime.tv_usec / 1.0e6)); } msFreeMapServObj(mapserv); #ifdef USE_FASTCGI /* FCGI_ --- return to top of loop */ msResetErrorList(); continue; } /* end fastcgi loop */ #endif /* normal case, processing is complete */ if (msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&execendtime, NULL); msDebug("mapserv total execution time: %.3fs\n", (execendtime.tv_sec + execendtime.tv_usec / 1.0e6) - (execstarttime.tv_sec + execstarttime.tv_usec / 1.0e6)); } msCleanup(); msFreeConfig(config); #ifdef _WIN32 /* flush pending writes to stdout */ fflush(stdout); #endif exit(0); } mapserver-8.4.0/src/apps/mapserv.h000066400000000000000000000056331474174441300171270ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations supporting mapserv.c. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPSERV_H #define MAPSERV_H #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif #include #include #include "../maptemplate.h" #include "../maptile.h" #include "../cgiutil.h" /* ** Defines */ #define NUMEXP "[-]?(([0-9]+)|([0-9]*[.][0-9]+)([eE][-+]?[0-9]+)?)" #define EXTENT_PADDING .05 /* ** Macros */ #define TEMPLATE_TYPE(s) \ (((strncmp("http://", s, 7) == 0) || (strncmp("https://", s, 8) == 0) || \ (strncmp("ftp://", s, 6)) == 0) \ ? MS_URL \ : MS_FILE) MS_DLL_EXPORT void msCGIWriteError(mapservObj *mapserv); MS_DLL_EXPORT mapObj *msCGILoadMap(mapservObj *mapserv, configObj *context); int msCGISetMode(mapservObj *mapserv); int msCGILoadForm(mapservObj *mapserv); int msCGIDispatchBrowseRequest(mapservObj *mapserv); int msCGIDispatchCoordinateRequest(mapservObj *mapserv); int msCGIDispatchQueryRequest(mapservObj *mapserv); int msCGIDispatchImageRequest(mapservObj *mapserv); int msCGIDispatchLegendRequest(mapservObj *mapserv); int msCGIDispatchLegendIconRequest(mapservObj *mapserv); MS_DLL_EXPORT int msCGIDispatchRequest(mapservObj *mapserv); MS_DLL_EXPORT int msCGIIsAPIRequest(mapservObj *mapserv); MS_DLL_EXPORT int msCGIDispatchAPIRequest(mapservObj *mapserv); #endif /* MAPSERV_H */ mapserver-8.4.0/src/apps/msencrypt.c000066400000000000000000000052361474174441300174700ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Command-line encryption utility (see MS-RFC-18) * Author: Daniel Morissette * ****************************************************************************** * Copyright (c) 1996-2006 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" void PrintUsage() { printf("Usage: msencrypt <-keygen filename>|<-key filename " "string_to_encrypt>\n"); } int main(int argc, char *argv[]) { if (argc == 3 && strcmp(argv[1], "-keygen") == 0) { /* TODO: Move this to a function */ unsigned char pabyKey[16]; char szKeyEncoded[50]; FILE *fp; msGenerateEncryptionKey(pabyKey); msHexEncode(pabyKey, szKeyEncoded, 16); if ((fp = fopen(argv[2], "wt")) != NULL) { fprintf(fp, "%s\n", szKeyEncoded); fclose(fp); } else { printf("ERROR: Failed writing to %s\n", argv[2]); return -1; } } else if (argc == 4 && strcmp(argv[1], "-key") == 0) { unsigned char key[16]; char *pszBuf; if (msReadEncryptionKeyFromFile(argv[2], key, NULL) != MS_SUCCESS) { printf("ERROR: Failed reading key from file %s\n", argv[2]); return -1; } pszBuf = (char *)malloc((strlen(argv[3]) * 2 + 17) * sizeof(char)); MS_CHECK_ALLOC(pszBuf, (strlen(argv[3]) * 2 + 17) * sizeof(char), -1); msEncryptStringWithKey(key, argv[3], pszBuf); printf("%s\n", pszBuf); msFree(pszBuf); } else { PrintUsage(); } return 0; } mapserver-8.4.0/src/apps/scalebar.c000066400000000000000000000043131474174441300172130ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Commandline scalebar generating utility, mostly for testing. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" int main(int argc, char *argv[]) { mapObj *map = NULL; imageObj *image = NULL; msSetup(); if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ---- check the number of arguments, return syntax if not correct ---- */ if (argc < 3) { fprintf(stdout, "Syntax: scalebar [mapfile] [output image]\n"); exit(1); } map = msLoadMap(argv[1], NULL, NULL); if (!map) { msWriteError(stderr); exit(1); } image = msDrawScalebar(map); if (!image) { msWriteError(stderr); exit(1); } msSaveImage(map, image, argv[2]); msFreeImage(image); msFreeMap(map); return (MS_TRUE); } mapserver-8.4.0/src/apps/shptree.c000066400000000000000000000134611474174441300171150ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Commandline utility to generate .qix shapefile spatial indexes. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" #include "../maptree.h" #include char *AddFileSuffix(const char *Filename, const char *Suffix) { char *pszFullname, *pszBasename; int i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *)msSmallMalloc(strlen(Filename) + 5); strcpy(pszBasename, Filename); for (i = (int)strlen(pszBasename) - 1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { } if (pszBasename[i] == '.') pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *)msSmallMalloc(strlen(pszBasename) + 5); sprintf(pszFullname, "%s%s", pszBasename, Suffix); free(pszBasename); return (pszFullname); } int main(int argc, char *argv[]) { shapefileObj shapefile; treeObj *tree; int byte_order = MS_NEW_LSB_ORDER, i; int depth = 0; if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine to decide default */ /* index format */ /* -------------------------------------------------------------------- */ i = 1; /* cppcheck-suppress knownConditionTrueFalse */ if (*((uchar *)&i) == 1) byte_order = MS_NEW_LSB_ORDER; else byte_order = MS_NEW_MSB_ORDER; if (argc < 2) { fprintf(stdout, "Syntax:\n"); fprintf(stdout, " shptree [] []\n"); fprintf(stdout, "Where:\n"); fprintf(stdout, " is the name of the .shp file to index.\n"); fprintf(stdout, " (optional) is the maximum depth of the index\n"); fprintf(stdout, " to create, default is 0 meaning that shptree\n"); fprintf(stdout, " will calculate a reasonable default depth.\n"); fprintf(stdout, " (optional) is one of:\n"); fprintf(stdout, " NL: LSB byte order, using new index format\n"); fprintf(stdout, " NM: MSB byte order, using new index format\n"); fprintf(stdout, " The following old format options are deprecated:\n"); fprintf(stdout, " N: Native byte order\n"); fprintf(stdout, " L: LSB (intel) byte order\n"); fprintf(stdout, " M: MSB byte order\n"); fprintf(stdout, " The default index_format on this system is: %s\n\n", (byte_order == MS_NEW_LSB_ORDER) ? "NL" : "NM"); exit(0); } if (argc >= 3) depth = atoi(argv[2]); if (argc >= 4) { if (!strcasecmp(argv[3], "N")) byte_order = MS_NATIVE_ORDER; if (!strcasecmp(argv[3], "L")) byte_order = MS_LSB_ORDER; if (!strcasecmp(argv[3], "M")) byte_order = MS_MSB_ORDER; if (!strcasecmp(argv[3], "NL")) byte_order = MS_NEW_LSB_ORDER; if (!strcasecmp(argv[3], "NM")) byte_order = MS_NEW_MSB_ORDER; } if (msShapefileOpen(&shapefile, "rb", argv[1], MS_TRUE) == -1) { fprintf(stdout, "Error opening shapefile %s.\n", argv[1]); exit(0); } printf( "creating index of %s %s format\n", (byte_order < 1 ? "old (deprecated)" : "new"), ((byte_order == MS_NATIVE_ORDER) ? "native" : ((byte_order == MS_LSB_ORDER) || (byte_order == MS_NEW_LSB_ORDER) ? " LSB" : "MSB"))); tree = msCreateTree(&shapefile, depth); if (!tree) { #if MAX_SUBNODE == 2 fprintf(stdout, "Error generating binary tree.\n"); #else fprintf(stdout, "Error generating quadtree.\n"); #endif exit(0); } msWriteTree(tree, AddFileSuffix(argv[1], MS_INDEX_EXTENSION), byte_order); msDestroyTree(tree); /* ** Clean things up */ msShapefileClose(&shapefile); return (0); } mapserver-8.4.0/src/apps/shptreetst.c000066400000000000000000000126331474174441300176500ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Utility program to visualize a quadtree search * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" #include #ifndef _WIN32 #include #endif #include #include #ifdef SHPT_POLYGON #undef MAPSERVER #else #define MAPSERVER 1 #define SHPT_POLYGON MS_SHP_POLYGON #endif char *AddFileSuffix(const char *Filename, const char *Suffix) { char *pszFullname, *pszBasename; int i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *)msSmallMalloc(strlen(Filename) + 5); strcpy(pszBasename, Filename); for (i = (int)strlen(pszBasename) - 1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { } if (pszBasename[i] == '.') pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *)msSmallMalloc(strlen(pszBasename) + 5); sprintf(pszFullname, "%s%s", pszBasename, Suffix); msFree(pszBasename); return (pszFullname); } int main(int argc, char **argv) { SHPTreeHandle qix; int i, j; rectObj rect; int pos; ms_bitarray bitmap = NULL; /* char mBigEndian; */ treeNodeObj *node = NULL; /* -------------------------------------------------------------------- */ /* Display a usage message. */ /* -------------------------------------------------------------------- */ if (argc <= 1) { printf("shptreetst shapefile {minx miny maxx maxy}\n"); exit(1); } /* i = 1; if( *((unsigned char *) &i) == 1 ) mBigEndian = 0; else mBigEndian = 1; */ qix = msSHPDiskTreeOpen(AddFileSuffix(argv[1], ".qix"), 0 /* no debug*/); if (qix == NULL) { printf("unable to open index file %s \n", argv[1]); exit(-1); } printf("This %s %s index supports a shapefile with %d shapes, %d depth \n", (qix->version ? "new" : "old"), (qix->LSB_order ? "LSB" : "MSB"), (int)qix->nShapes, (int)qix->nDepth); /* -------------------------------------------------------------------- */ /* Skim over the list of shapes, printing all the vertices. */ /* -------------------------------------------------------------------- */ pos = ftell(qix->fp); j = 0; while (pos && j < 20) { j++; /* fprintf (stderr,"box %d, at %d pos \n", j, (int) ftell(qix)); */ node = readTreeNode(qix); if (node) { fprintf(stdout, "shapes %d, node %d, %f,%f,%f,%f \n", (int)node->numshapes, node->numsubnodes, node->rect.minx, node->rect.miny, node->rect.maxx, node->rect.maxy); } else { pos = 0; } } printf("read entire file now at quad box rec %d file pos %ld\n", j, ftell(qix->fp)); j = qix->nShapes; msSHPDiskTreeClose(qix); if (argc >= 5) { rect.minx = atof(argv[2]); rect.miny = atof(argv[3]); rect.maxx = atof(argv[4]); rect.maxy = atof(argv[5]); } else { if (node == NULL) { printf("node == NULL"); return 1; } printf("using last read box as a search \n"); rect.minx = node->rect.minx; rect.miny = node->rect.miny; rect.maxx = node->rect.maxx; rect.maxy = node->rect.maxy; } bitmap = msSearchDiskTree(argv[1], rect, 0 /* no debug*/, j); /* j < INT_MAX - 1 test just to please Coverity untrusted bound loop warning */ if (bitmap && j < INT_MAX - 1) { printf("result of rectangle search was \n"); for (i = 0; i < j; i++) { if (msGetBit(bitmap, i)) { printf(" %d,", i); } } } printf("\n"); return (0); } mapserver-8.4.0/src/apps/shptreevis.c000066400000000000000000000156531474174441300176440ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Utility program to visualize a quadtree * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" #include #ifndef _WIN32 #include #endif #include #ifdef SHPT_POLYGON #undef MAPSERVER #else #define MAPSERVER 1 #define SHPT_POLYGON SHP_POLYGON #endif char *AddFileSuffix(const char *Filename, const char *Suffix) { char *pszFullname, *pszBasename; size_t i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *)msSmallMalloc(strlen(Filename) + 5); strcpy(pszBasename, Filename); for (i = strlen(pszBasename) - 1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { } if (pszBasename[i] == '.') pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *)msSmallMalloc(strlen(pszBasename) + 5); sprintf(pszFullname, "%s%s", pszBasename, Suffix); free(pszBasename); return (pszFullname); } int main(int argc, char **argv) { SHPHandle hSHP; DBFHandle hDBF; SHPTreeHandle qix; char *myfile = NULL; treeNodeObj *node; #ifdef MAPSERVER shapeObj shape; lineObj line[3]; pointObj pts[6]; #else SHPObject *shape; double X[6], Y[6]; #endif int result; /* char mBigEndian; int i; */ int this_rec; /* -------------------------------------------------------------------- */ /* Display a usage message. */ /* -------------------------------------------------------------------- */ if (argc <= 2) { printf("shptreevis shapefile new_shapefile \n"); exit(1); } /* i = 1; if( *((unsigned char *) &i) == 1 ) mBigEndian = 0; else mBigEndian = 1; */ qix = msSHPDiskTreeOpen(AddFileSuffix(argv[1], ".qix"), 0 /* no debug*/); if (qix == NULL) { printf("unable to open index file %s \n", argv[1]); exit(-1); } /* -------------------------------------------------------------------- */ /* Open the passed shapefile. */ /* -------------------------------------------------------------------- */ myfile = AddFileSuffix(argv[2], ".shp"); #ifdef MAPSERVER hSHP = msSHPCreate(myfile, SHPT_POLYGON); hDBF = msDBFCreate(AddFileSuffix(argv[2], ".dbf")); #else hSHP = SHPCreate(myfile, SHPT_POLYGON); hDBF = DBFCreate(AddFileSuffix(argv[2], ".dbf")); #endif if ((!hSHP) || (!hDBF)) { printf("create error for %s ... exiting \n", myfile); exit(-1); } /* add fields to dbf */ #ifdef MAPSERVER msDBFAddField(hDBF, "ITEMS", FTInteger, 15, 0); msDBFAddField(hDBF, "SUBNODES", FTInteger, 15, 0); msDBFAddField(hDBF, "FACTOR", FTInteger, 15, 0); #else DBFAddField(hDBF, "ITEMS", FTInteger, 15, 0); DBFAddField(hDBF, "SUBNODES", FTInteger, 15, 0); DBFAddField(hDBF, "FACTOR", FTInteger, 15, 0); #endif #ifndef MAPSERVER SHPClose(hSHP); hSHP = SHPOpen(myfile, "r+b"); DBFClose(hDBF); hDBF = DBFOpen(myfile, "r+b"); #endif printf("This %s %s index supports a shapefile with %d shapes, %d depth \n", (qix->version ? "new" : "old"), (qix->LSB_order ? "LSB" : "MSB"), (int)qix->nShapes, (int)qix->nDepth); /* -------------------------------------------------------------------- */ /* Skim over the list of shapes, printing all the vertices. */ /* -------------------------------------------------------------------- */ while (1) { node = readTreeNode(qix); if (node) { this_rec = hDBF->nRecords; #ifdef MAPSERVER msDBFWriteIntegerAttribute(hDBF, this_rec, 0, node->numshapes); msDBFWriteIntegerAttribute(hDBF, this_rec, 1, node->numsubnodes); #else DBFWriteIntegerAttribute(hDBF, this_rec, 0, node->numshapes); DBFWriteIntegerAttribute(hDBF, this_rec, 1, node->numsubnodes); #endif #ifdef MAPSERVER shape.numlines = 1; shape.type = SHPT_POLYGON; pts[0].x = node->rect.minx; pts[0].y = node->rect.miny; pts[1].x = node->rect.maxx; pts[1].y = node->rect.miny; pts[2].x = node->rect.maxx; pts[2].y = node->rect.maxy; pts[3].x = node->rect.minx; pts[3].y = node->rect.maxy; pts[4].x = node->rect.minx; pts[4].y = node->rect.miny; line[0].numpoints = 5; line[0].point = &pts[0]; shape.line = &line[0]; shape.bounds = node->rect; result = msSHPWriteShape(hSHP, &shape); if (result < 0) { printf("unable to write shape \n"); exit(0); } #else X[0] = node->rect.minx; X[1] = node->rect.maxx; X[2] = node->rect.maxx; X[3] = node->rect.minx; X[4] = node->rect.minx; Y[0] = node->rect.miny; Y[1] = node->rect.miny; Y[2] = node->rect.maxy; Y[3] = node->rect.maxy; Y[4] = node->rect.miny; shape = SHPCreateSimpleObject(SHPT_POLYGON, 5, X, Y, NULL); SHPWriteObject(hSHP, -1, shape); SHPDestroyObject(shape); #endif } else break; } #ifdef MAPSERVER msSHPClose(hSHP); msDBFClose(hDBF); #else SHPClose(hSHP); DBFClose(hDBF); #endif msSHPDiskTreeClose(qix); return (0); } mapserver-8.4.0/src/apps/sortshp.c000066400000000000000000000202561474174441300171450ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Command line utility to sort a shapefile based on a single * attribute in ascending or descending order. Useful for * prioritizing drawing or labeling of shapes. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include #include #include #include "../mapserver.h" typedef struct { double number; char string[255]; int index; } sortStruct; static int compare_string_descending(const void *a, const void *b) { const sortStruct *i = a, *j = b; return (strcmp(j->string, i->string)); } static int compare_string_ascending(const void *a, const void *b) { const sortStruct *i = a, *j = b; return (strcmp(i->string, j->string)); } static int compare_number_descending(const void *a, const void *b) { const sortStruct *i = a, *j = b; if (i->number > j->number) return (-1); if (i->number < j->number) return (1); return (0); } static int compare_number_ascending(const void *a, const void *b) { const sortStruct *i = a, *j = b; if (i->number > j->number) return (1); if (i->number < j->number) return (-1); return (0); } int main(int argc, char *argv[]) { SHPHandle inSHP, outSHP; /* ---- Shapefile file pointers ---- */ DBFHandle inDBF, outDBF; /* ---- DBF file pointers ---- */ sortStruct *array; shapeObj shape; int shpType, nShapes; int fieldNumber = -1; /* ---- Field number of item to be sorted on ---- */ DBFFieldType dbfField; char fName[20]; int fWidth, fnDecimals; char buffer[1024]; int i, j; int num_fields, num_records; if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ------------------------------------------------------------------------------- */ /* Check the number of arguments, return syntax if not correct */ /* ------------------------------------------------------------------------------- */ if (argc != 5) { fprintf( stderr, "Syntax: sortshp [infile] [outfile] [item] [ascending|descending]\n"); exit(1); } msSetErrorFile("stderr", NULL); /* ------------------------------------------------------------------------------- */ /* Open the shapefile */ /* ------------------------------------------------------------------------------- */ inSHP = msSHPOpen(argv[1], "rb"); if (!inSHP) { fprintf(stderr, "Unable to open %s shapefile.\n", argv[1]); exit(1); } msSHPGetInfo(inSHP, &nShapes, &shpType); /* ------------------------------------------------------------------------------- */ /* Open the dbf file */ /* ------------------------------------------------------------------------------- */ snprintf(buffer, sizeof(buffer), "%s.dbf", argv[1]); inDBF = msDBFOpen(buffer, "rb"); if (inDBF == NULL) { fprintf(stderr, "Unable to open %s XBASE file.\n", buffer); exit(1); } num_fields = msDBFGetFieldCount(inDBF); num_records = msDBFGetRecordCount(inDBF); for (i = 0; i < num_fields; i++) { msDBFGetFieldInfo(inDBF, i, fName, NULL, NULL); if (strncasecmp(argv[3], fName, (int)strlen(argv[3])) == 0) { /* ---- Found it ---- */ fieldNumber = i; break; } } if (fieldNumber < 0) { fprintf(stderr, "Item %s doesn't exist in %s\n", argv[3], buffer); exit(1); } array = (sortStruct *)malloc(sizeof(sortStruct) * num_records); /* ---- Allocate the array ---- */ if (!array) { fprintf(stderr, "Unable to allocate sort array.\n"); exit(1); } /* ------------------------------------------------------------------------------- */ /* Load the array to be sorted */ /* ------------------------------------------------------------------------------- */ dbfField = msDBFGetFieldInfo(inDBF, fieldNumber, NULL, NULL, NULL); switch (dbfField) { case FTString: for (i = 0; i < num_records; i++) { strlcpy(array[i].string, msDBFReadStringAttribute(inDBF, i, fieldNumber), sizeof(array[i].string)); array[i].index = i; } if (*argv[4] == 'd') qsort(array, num_records, sizeof(sortStruct), compare_string_descending); else qsort(array, num_records, sizeof(sortStruct), compare_string_ascending); break; case FTInteger: case FTDouble: for (i = 0; i < num_records; i++) { array[i].number = msDBFReadDoubleAttribute(inDBF, i, fieldNumber); array[i].index = i; } if (*argv[4] == 'd') qsort(array, num_records, sizeof(sortStruct), compare_number_descending); else qsort(array, num_records, sizeof(sortStruct), compare_number_ascending); break; default: fprintf(stderr, "Data type for item %s not supported.\n", argv[3]); exit(1); } /* ------------------------------------------------------------------------------- */ /* Setup the output .shp/.shx and .dbf files */ /* ------------------------------------------------------------------------------- */ outSHP = msSHPCreate(argv[2], shpType); if (outSHP == NULL) { fprintf(stderr, "Failed to create file '%s'.\n", argv[2]); exit(1); } sprintf(buffer, "%s.dbf", argv[2]); outDBF = msDBFCreate(buffer); if (outDBF == NULL) { fprintf(stderr, "Failed to create dbf file '%s'.\n", buffer); exit(1); } for (i = 0; i < num_fields; i++) { dbfField = msDBFGetFieldInfo( inDBF, i, fName, &fWidth, &fnDecimals); /* ---- Get field info from in file ---- */ msDBFAddField(outDBF, fName, dbfField, fWidth, fnDecimals); } /* ------------------------------------------------------------------------------- */ /* Write the sorted .shp/.shx and .dbf files */ /* ------------------------------------------------------------------------------- */ for (i = 0; i < num_records; i++) { /* ---- For each shape/record ---- */ for (j = 0; j < num_fields; j++) { /* ---- For each .dbf field ---- */ dbfField = msDBFGetFieldInfo(inDBF, j, fName, &fWidth, &fnDecimals); switch (dbfField) { case FTInteger: msDBFWriteIntegerAttribute( outDBF, i, j, msDBFReadIntegerAttribute(inDBF, array[i].index, j)); break; case FTDouble: msDBFWriteDoubleAttribute( outDBF, i, j, msDBFReadDoubleAttribute(inDBF, array[i].index, j)); break; case FTString: msDBFWriteStringAttribute( outDBF, i, j, msDBFReadStringAttribute(inDBF, array[i].index, j)); break; default: fprintf(stderr, "Unsupported data type for field: %s, exiting.\n", fName); exit(0); } } msSHPReadShape(inSHP, array[i].index, &shape); msSHPWriteShape(outSHP, &shape); msFreeShape(&shape); } free(array); msSHPClose(inSHP); msDBFClose(inDBF); msSHPClose(outSHP); msDBFClose(outDBF); return (0); } mapserver-8.4.0/src/apps/testcopy.c000066400000000000000000000052731474174441300173170ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Test of msCopyMap() * Author: Sean Gilles * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" void printAtts(mapObj *, const char *); int main(int argc, char *argv[]) { mapObj *original_map, *clone_map; /* --------------------------------------------------------------------- * Test 1: free original before freeing clone * --------------------------------------------------------------------- */ /* Load map file */ original_map = msLoadMap("tests/test.map", NULL); if (original_map == NULL) { /* Write errors */ msWriteError(stderr); msResetErrorList(); exit(0); } /* Dump out some attributes */ printAtts(original_map, "Original"); /* Clone it */ clone_map = msNewMapObj(); msCopyMap(clone_map, original_map); /* Write errors */ msWriteError(stderr); msResetErrorList(); /* Free */ msFreeMap(original_map); /* Dump clone's attributes */ printAtts(clone_map, "Clone"); /* Free clone */ msFreeMap(clone_map); exit(0); } void printAtts(mapObj *map, const char *title) { printf("\n%s Attributes\n----------------------\n", title); printf("Map Name: %s\n", map->name); printf("Numlayers: %d\n", map->numlayers); printf("Map Fontset Filename: %s\n", map->fontset.filename); printf("Map Symbolset Filename: %s\n", map->symbolset.filename); } mapserver-8.4.0/src/apps/testexpr.c000066400000000000000000000045321474174441300173200ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Commandline tester for expression evaluation * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "../mapserver.h" #include "../mapparser.h" #include "../mapfile.h" extern int msyyparse(); extern int msyylex(); extern char *msyystring_buffer; extern int msyyresult; /* result of parsing, true/false */ extern int msyystate; extern char *msyystring; int main(int argc, char *argv[]) { int status; if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ---- check the number of arguments, return syntax if not correct ---- */ if (argc < 2) { fprintf(stdout, "Syntax: testexpr [string]\n"); exit(0); } msyystate = MS_TOKENIZE_EXPRESSION; msyystring = argv[1]; status = msyyparse(); if (status != 0) printf("Error parsing expression near %s.\n", msyystring_buffer); else printf("Expression evalulated to: %d.\n", msyyresult); exit(0); } mapserver-8.4.0/src/apps/tile4ms.c000066400000000000000000000216441474174441300170260ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Create shapefile of rectangles from extents of several shapefiles * (=tiles) * Create DBF with file names for shape tiles, in column LOCATION as * required by mapserv. * For use with Mapserv tiling capability. * Author: Herbie Freytag hfreytag@dlwc.nsw.gov.au * * Note: * Resulting shape files do not display in ArcView. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /* * This is a modified version of Herbie's program that works with MapServer's * shapelib and should be using the MapServer makefile. * */ #include "../mapserver.h" #include /***********************************************************************/ int process_shapefiles(char *metaFileNameP, char *tileFileNameP, int tile_path_only) { SHPHandle hSHP, tileSHP; rectObj extentRect; lineObj line; shapeObj shapeRect; DBFHandle tileDBF; DBFHandle shpDBF; typedef struct DBFFieldDef_struct { DBFFieldType type; char name[12]; int width; int decimals; } DBFFieldDef; DBFFieldDef *theFields = NULL; char fldname[256]; int width; int decimals; int fieldCnt; int i; FILE *metaFP = NULL; char *p; char tileshapeName[256]; char tiledbfName[256]; char shapeFileName[256]; int entityNum; int tilesFound = 0; int tilesProcessed = 0; msInitShape(&shapeRect); line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 5); line.numpoints = 5; /* open metafile */ /* ------------- */ if (NULL == (metaFP = fopen(metaFileNameP, "r"))) { printf("Unable to open:%s\n", metaFileNameP); return (1); } /* create new tileindex shapefiles and create a header */ /* -------------------------------------------------- */ snprintf(tileshapeName, sizeof(tileshapeName), "%s.shp", tileFileNameP); if (NULL == (tileSHP = msSHPCreate(tileFileNameP, SHP_POLYGON))) { fclose(metaFP); printf("Unable to create %s.shp (.shx)\n", tileFileNameP); return (1); } /* create new tileindex dbf-file */ /* ----------------------------- */ snprintf(tiledbfName, sizeof(tiledbfName), "%s.dbf", tileFileNameP); if (NULL == (tileDBF = msDBFCreate(tiledbfName))) { fclose(metaFP); msSHPClose(tileSHP); printf("DBFCreate(%s) failed.\n", tiledbfName); return (1); } if (msDBFAddField(tileDBF, "LOCATION", FTString, 255, 0) == -1) { fclose(metaFP); msSHPClose(tileSHP); msDBFClose(tileDBF); printf("DBFAddField(fieldname='LOCATION') failed.\n"); return (1); } /* loop through files listed in metafile */ /* ===================================== */ while (fgets(shapeFileName, 255, metaFP)) { if ((p = strchr(shapeFileName, '\n')) != NULL) *p = '\0'; if (!strlen(shapeFileName)) break; tilesFound++; /* read the DBFFields for this shapefile */ /* and save them if the first, otherwise compare them */ shpDBF = msDBFOpen(shapeFileName, "rb"); if (shpDBF == NULL) { printf("Aborted. Unable to open DBF:%s\n", shapeFileName); break; } if (theFields == NULL) { fieldCnt = msDBFGetFieldCount(shpDBF); theFields = (DBFFieldDef *)msSmallCalloc(fieldCnt, sizeof(DBFFieldDef)); for (i = 0; i < fieldCnt; i++) { theFields[i].type = msDBFGetFieldInfo(shpDBF, i, theFields[i].name, &theFields[i].width, &theFields[i].decimals); if (theFields[i].type == FTInvalid) { printf("Aborted. DBF Invalid field (%d of %d) file:%s\n", i, fieldCnt, shapeFileName); break; } } } else { fieldCnt = msDBFGetFieldCount(shpDBF); for (i = 0; i < fieldCnt; i++) { if (theFields[i].type != msDBFGetFieldInfo(shpDBF, i, fldname, &width, &decimals) || strcmp(theFields[i].name, fldname) || theFields[i].width != width || theFields[i].decimals != decimals) { printf("Aborted. DBF fields do not match for file:%s\n", shapeFileName); break; } } } msDBFClose(shpDBF); /* Get rid of .shp extension if it was included. */ if (strlen(shapeFileName) > 4 && (p = shapeFileName + strlen(shapeFileName) - 4) && strcasecmp(p, ".shp") == 0) *p = '\0'; if (!strlen(shapeFileName)) break; /* read extent from shapefile */ /* -------------------------- */ hSHP = msSHPOpen(shapeFileName, "rb"); if (hSHP == NULL) { printf("Aborted. Unable to open SHP:%s\n", shapeFileName); break; } msSHPReadBounds(hSHP, -1, &extentRect); /* SHPGetInfo(hSHP, &nEntities, &nShapeType, adfBndsMin, adfBndsMax); */ /* printf("File: %s Bounds 0/1: * (%15.10lg,%15.10lg)\n\t(%15.10lg,%15.10lg)\n", shapeFileName, * adfBndsMin[0], adfBndsMin[1], adfBndsMax[0], adfBndsMax[1] ); */ msSHPClose(hSHP); /* create rectangle describing current shapefile extent */ /* ---------------------------------------------------- */ line.point[0].x = line.point[4].x = extentRect.minx; /* bottom left */ line.point[0].y = line.point[4].y = extentRect.miny; line.point[1].x = extentRect.minx; /* top left */ line.point[1].y = extentRect.maxy; line.point[2].x = extentRect.maxx; /* top left */ line.point[2].y = extentRect.maxy; line.point[3].x = extentRect.maxx; /* bottom right */ line.point[3].y = extentRect.miny; /* create and add shape object. Returns link to entry in DBF file */ /* --------------------------------------------------------------- */ shapeRect.type = MS_SHAPE_POLYGON; msAddLine(&shapeRect, &line); entityNum = msSHPWriteShape(tileSHP, &shapeRect); msFreeShape(&shapeRect); /* store filepath of current shapefile as attribute of rectangle */ /* ------------------------------------------------------------- */ /* Strip off filename if requested */ if (tile_path_only) { char *pszTmp; if ((pszTmp = strrchr(shapeFileName, '/')) != NULL || (pszTmp = strrchr(shapeFileName, '\\')) != NULL) { *(pszTmp + 1) = '\0'; /* Keep the trailing '/' only. */ } } msDBFWriteStringAttribute(tileDBF, entityNum, 0, shapeFileName); tilesProcessed++; } msSHPClose(tileSHP); msDBFClose(tileDBF); fclose(metaFP); free(line.point); free(theFields); printf("Processed %i of %i files\n", tilesProcessed, tilesFound); return (0); } /***********************************************************************/ void print_usage_and_exit(void) { printf("\nusage: tile4ms [-tile-path-only]\n"); printf("\tINPUT file containing list of shapefile " "names\n\t\t(complete paths 255 chars max, no extension)\n"); printf("\tOUTPUT shape file of extent rectangles and " "names\n\t\tof tiles in .dbf\n"); printf("-tile-path-only\tOptional flag. If specified then only the path to " "the \n\t\tshape files will be stored in the LOCATION " "field\n\t\tinstead of storing the full filename.\n\n"); exit(1); } /***********************************************************************/ int main(int argc, char **argv) { int tile_path_only = 0; /* stun user with existence of help */ /* -------------------------------- */ if ((argc == 2) && (strstr(argv[1], "-h"))) { print_usage_and_exit(); } /* check arguments */ /* --------------- */ if (argc < 3) { print_usage_and_exit(); } if (argc == 4 && strcmp(argv[3], "-tile-path-only") == 0) { tile_path_only = 1; } process_shapefiles(argv[1], argv[2], tile_path_only); exit(0); } mapserver-8.4.0/src/cgiutil.c000066400000000000000000000366111474174441300161420ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: cgiRequestObj and CGI parameter parsing. * Author: Steve Lime and the MapServer team. * * Notes: Portions derived from NCSA HTTPd Server's example CGI programs *(util.c). * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include #include #include #include "mapserver.h" #include "cgiutil.h" #include "cpl_conv.h" #define LF 10 #define CR 13 int readPostBody(cgiRequestObj *request, char **data) { size_t data_max, data_len; int chunk_size; (void)request; msIO_needBinaryStdin(); /* -------------------------------------------------------------------- */ /* If the length is provided, read in one gulp. */ /* -------------------------------------------------------------------- */ if (getenv("CONTENT_LENGTH") != NULL) { data_max = (size_t)atoi(getenv("CONTENT_LENGTH")); /* Test for suspicious CONTENT_LENGTH (negative value or SIZE_MAX) */ if (data_max >= SIZE_MAX) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("Suspicious Content-Length.\n"); msSetError(MS_WEBERR, "Suspicious Content-Length.", "readPostBody()"); return MS_FAILURE; } *data = (char *)malloc(data_max + 1); if (*data == NULL) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("malloc() failed, Content-Length: %u unreasonably // large?\n", (unsigned int)data_max ); msSetError(MS_WEBERR, "malloc() failed, Content-Length: %u unreasonably large?", "readPostBody()", (unsigned int)data_max); return MS_FAILURE; } if ((int)msIO_fread(*data, 1, data_max, stdin) < (int)data_max) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("POST body is short\n"); msSetError(MS_WEBERR, "POST body is short.", "readPostBody()"); return MS_FAILURE; } (*data)[data_max] = '\0'; return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Otherwise read in chunks to the end. */ /* -------------------------------------------------------------------- */ #define DATA_ALLOC_SIZE 10000 data_max = DATA_ALLOC_SIZE; data_len = 0; *data = (char *)msSmallMalloc(data_max + 1); (*data)[data_max] = '\0'; while ((chunk_size = msIO_fread(*data + data_len, 1, data_max - data_len, stdin)) > 0) { data_len += chunk_size; if (data_len == data_max) { /* Realloc buffer, making sure we check for possible size_t overflow */ if (data_max > SIZE_MAX - (DATA_ALLOC_SIZE + 1)) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("Possible size_t overflow, cannot reallocate input // buffer, POST body too large?\n" ); msSetError(MS_WEBERR, "Possible size_t overflow, cannot reallocate input buffer, " "POST body too large?", "readPostBody()"); return MS_FAILURE; } data_max = data_max + DATA_ALLOC_SIZE; *data = (char *)msSmallRealloc(*data, data_max + 1); } } (*data)[data_len] = '\0'; return MS_SUCCESS; } static char *msGetEnv(const char *name, void *thread_context) { (void)thread_context; return getenv(name); } int loadParams(cgiRequestObj *request, char *(*getenv2)(const char *, void *thread_context), char *raw_post_data, ms_uint32 raw_post_data_length, void *thread_context) { int m = 0; char *s, *queryString = NULL, *httpCookie = NULL; int debuglevel; int maxParams = MS_DEFAULT_CGI_PARAMS; if (getenv2 == NULL) getenv2 = &msGetEnv; if (getenv2("REQUEST_METHOD", thread_context) == NULL) { msIO_printf("This script can only be used to decode form results and \n"); msIO_printf("should be initiated as a CGI process via a httpd server.\n"); msIO_printf("For other options please try using the --help switch.\n"); return -1; } debuglevel = (int)msGetGlobalDebugLevel(); if (strcmp(getenv2("REQUEST_METHOD", thread_context), "POST") == 0 && CPLGetConfigOption("MS_NO_POST", NULL) == NULL) { /* we've got a post from a form */ char *post_data; int data_len; request->type = MS_POST_REQUEST; if (request->contenttype == NULL) { s = getenv2("CONTENT_TYPE", thread_context); if (s != NULL) { request->contenttype = msStrdup(s); } else { /* we've to set default Content-Type which is * application/octet-stream according to * W3 RFC 2626 section 7.2.1 */ request->contenttype = msStrdup("application/octet-stream"); } } if (raw_post_data) { post_data = msStrdup(raw_post_data); data_len = raw_post_data_length; } else { if (MS_SUCCESS != readPostBody(request, &post_data)) return -1; data_len = strlen(post_data); } /* if the content_type is application/x-www-form-urlencoded, we have to parse it like the QUERY_STRING variable */ if (strncmp(request->contenttype, "application/x-www-form-urlencoded", strlen("application/x-www-form-urlencoded")) == 0) { while (data_len > 0 && isspace(post_data[data_len - 1])) post_data[--data_len] = '\0'; while (post_data[0]) { if (m >= maxParams) { maxParams *= 2; request->ParamNames = (char **)msSmallRealloc( request->ParamNames, sizeof(char *) * maxParams); request->ParamValues = (char **)msSmallRealloc( request->ParamValues, sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(post_data, '&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m], '='); m++; } free(post_data); } else request->postrequest = post_data; /* check the QUERY_STRING even in the post request since it can contain information. Eg a wfs request with */ s = getenv2("QUERY_STRING", thread_context); if (s) { if (debuglevel >= MS_DEBUGLEVEL_DEBUG) msDebug("loadParams() QUERY_STRING: %s\n", s); queryString = msStrdup(s); while (queryString[0] != '\0') { if (m >= maxParams) { maxParams *= 2; request->ParamNames = (char **)msSmallRealloc( request->ParamNames, sizeof(char *) * maxParams); request->ParamValues = (char **)msSmallRealloc( request->ParamValues, sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(queryString, '&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m], '='); m++; } } } else { if (strcmp(getenv2("REQUEST_METHOD", thread_context), "GET") == 0) { /* we've got a get request */ request->type = MS_GET_REQUEST; s = getenv2("QUERY_STRING", thread_context); if (s == NULL) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("No query information to decode. QUERY_STRING not // set.\n"); msSetError(MS_WEBERR, "No query information to decode. QUERY_STRING not set.", "loadParams()"); return -1; } if (debuglevel >= MS_DEBUGLEVEL_DEBUG) msDebug("loadParams() QUERY_STRING: %s\n", s); if (strlen(s) == 0) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("No query information to decode. QUERY_STRING is set, but // empty.\n"); msSetError( MS_WEBERR, "No query information to decode. QUERY_STRING is set, but empty.", "loadParams()"); return -1; } /* don't modify the string returned by getenv2 */ queryString = msStrdup(s); while (queryString[0] != '\0') { if (m >= maxParams) { maxParams *= 2; request->ParamNames = (char **)msSmallRealloc( request->ParamNames, sizeof(char *) * maxParams); request->ParamValues = (char **)msSmallRealloc( request->ParamValues, sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(queryString, '&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m], '='); m++; } } else { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("This script should be referenced with a METHOD of GET or // METHOD of POST.\n"); msSetError(MS_WEBERR, "This script should be referenced with a METHOD of GET or " "METHOD of POST.", "loadParams()"); return -1; } } /* check for any available cookies */ s = getenv2("HTTP_COOKIE", thread_context); if (s != NULL) { httpCookie = msStrdup(s); request->httpcookiedata = msStrdup(s); while (httpCookie[0] != '\0') { if (m >= maxParams) { maxParams *= 2; request->ParamNames = (char **)msSmallRealloc( request->ParamNames, sizeof(char *) * maxParams); request->ParamValues = (char **)msSmallRealloc( request->ParamValues, sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(httpCookie, ';'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword_skip(request->ParamValues[m], '=', ' '); m++; } } if (queryString) free(queryString); if (httpCookie) free(httpCookie); return (m); } void getword(char *word, char *line, char stop) { int x = 0, y; for (x = 0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x]; word[x] = '\0'; if (line[x]) ++x; y = 0; while ((line[y++] = line[x++])) ; } char *makeword_skip(char *line, char stop, char skip) { int x = 0, y, offset = 0; char *word = (char *)msSmallMalloc(sizeof(char) * (strlen(line) + 1)); for (x = 0; ((line[x]) && (line[x] == skip)); x++) ; offset = x; for (x = offset; ((line[x]) && (line[x] != stop)); x++) word[x - offset] = line[x]; word[x - offset] = '\0'; if (line[x]) ++x; y = 0; while ((line[y++] = line[x++])) ; return word; } char *makeword(char *line, char stop) { int x = 0, y; char *word = (char *)msSmallMalloc(sizeof(char) * (strlen(line) + 1)); for (x = 0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x]; word[x] = '\0'; if (line[x]) ++x; y = 0; while ((line[y++] = line[x++])) ; return word; } char *fmakeword(FILE *f, char stop, int *cl) { int wsize; char *word; int ll; wsize = 102400; ll = 0; word = (char *)msSmallMalloc(sizeof(char) * (wsize + 1)); while (1) { word[ll] = (char)fgetc(f); if (ll == wsize) { word[ll + 1] = '\0'; wsize += 102400; word = (char *)msSmallRealloc(word, sizeof(char) * (wsize + 1)); } --(*cl); if ((word[ll] == stop) || (feof(f)) || (!(*cl))) { if (word[ll] != stop) ll++; word[ll] = '\0'; word = (char *)msSmallRealloc(word, ll + 1); return word; } ++ll; } } char x2c(char *what) { register char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); return (digit); } void unescape_url(char *url) { register int x, y; for (x = 0, y = 0; url[y]; ++x, ++y) { if ((url[x] = url[y]) == '%') { url[x] = x2c(&url[y + 1]); y += 2; } } url[x] = '\0'; } void plustospace(char *str) { register int x; for (x = 0; str[x]; x++) if (str[x] == '+') str[x] = ' '; } int rind(char *s, char c) { register int x; for (x = strlen(s) - 1; x != -1; x--) if (s[x] == c) return x; return -1; } void send_fd(FILE *f, FILE *fd) { int c; while (1) { c = fgetc(f); if (c == EOF) return; fputc((char)c, fd); } } int ind(char *s, char c) { register int x; for (x = 0; s[x]; x++) if (s[x] == c) return x; return -1; } /* ** patched version according to CERT advisory... */ void escape_shell_cmd(char *cmd) { register int x, y, l; l = strlen(cmd); for (x = 0; cmd[x]; x++) { if (ind("&;`'\"|*?~<>^()[]{}$\\\n", cmd[x]) != -1) { for (y = l + 1; y > x; y--) cmd[y] = cmd[y - 1]; l++; /* length has been increased */ cmd[x] = '\\'; x++; /* skip the character */ } } } /* ** Allocate a new request holder structure */ cgiRequestObj *msAllocCgiObj() { cgiRequestObj *request = (cgiRequestObj *)malloc(sizeof(cgiRequestObj)); if (!request) return NULL; request->ParamNames = (char **)msSmallMalloc(MS_DEFAULT_CGI_PARAMS * sizeof(char *)); request->ParamValues = (char **)msSmallMalloc(MS_DEFAULT_CGI_PARAMS * sizeof(char *)); request->NumParams = 0; request->type = MS_GET_REQUEST; request->contenttype = NULL; request->postrequest = NULL; request->httpcookiedata = NULL; request->path_info = NULL; request->api_path = NULL; request->api_path_length = 0; return request; } void msFreeCgiObj(cgiRequestObj *request) { msFreeCharArray(request->ParamNames, request->NumParams); msFreeCharArray(request->ParamValues, request->NumParams); request->ParamNames = NULL; request->ParamValues = NULL; request->NumParams = 0; request->type = -1; msFree(request->contenttype); msFree(request->postrequest); msFree(request->httpcookiedata); request->contenttype = NULL; request->postrequest = NULL; request->httpcookiedata = NULL; if (request->api_path) { msFreeCharArray(request->api_path, request->api_path_length); request->api_path = NULL; request->api_path_length = 0; } msFree(request); } mapserver-8.4.0/src/cgiutil.h000066400000000000000000000066701474174441300161510ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: cgiRequestObj and CGI parsing utility related declarations. * Author: Steve Lime and the MapServer team. * * Notes: Portions derived from NCSA HTTPd Server's example CGI programs *(util.c). * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef CGIUTIL_H #define CGIUTIL_H #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32) && !defined(__CYGWIN__) #define MS_DLL_EXPORT __declspec(dllexport) #else #define MS_DLL_EXPORT #endif /* ** Misc. defines */ #define MS_DEFAULT_CGI_PARAMS 100 enum MS_REQUEST_TYPE { MS_GET_REQUEST, MS_POST_REQUEST }; /** Class for programming OWS services */ typedef struct { #ifndef SWIG char **ParamNames; char **ParamValues; #endif #ifdef SWIG %immutable; #endif int NumParams; ///< The number of querystring parameters #ifdef SWIG %mutable; #endif enum MS_REQUEST_TYPE type; ///< A :ref:`request type constant` char *contenttype; ///< The content type of the request char *postrequest; ///< Any POST data request char *httpcookiedata; ///< Any cookie data associated with the request #ifndef SWIG const char *path_info; int api_path_length; char **api_path; #endif } cgiRequestObj; /* ** Function prototypes */ #ifndef SWIG MS_DLL_EXPORT int loadParams(cgiRequestObj *request, char *(*getenv2)(const char *, void *thread_context), char *raw_post_data, ms_uint32 raw_post_data_length, void *thread_context); MS_DLL_EXPORT void getword(char *, char *, char); MS_DLL_EXPORT char *makeword_skip(char *, char, char); MS_DLL_EXPORT char *makeword(char *, char); MS_DLL_EXPORT char *fmakeword(FILE *, char, int *); MS_DLL_EXPORT char x2c(char *); MS_DLL_EXPORT void unescape_url(char *); MS_DLL_EXPORT void plustospace(char *); MS_DLL_EXPORT int rind(char *, char); MS_DLL_EXPORT void send_fd(FILE *, FILE *); MS_DLL_EXPORT int ind(char *, char); MS_DLL_EXPORT void escape_shell_cmd(char *); MS_DLL_EXPORT cgiRequestObj *msAllocCgiObj(void); MS_DLL_EXPORT void msFreeCgiObj(cgiRequestObj *request); #endif /*SWIG*/ #ifdef __cplusplus } #endif #endif /* CGIUTIL_H */ mapserver-8.4.0/src/classobject.c000066400000000000000000000145551474174441300170010ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions for operating on a classObj that don't belong in a * more specific file such as mapfile.c. * Adapted from mapobject.c. * Author: Sean Gillies, sgillies@frii.com * ****************************************************************************** * Copyright (c) 2004, Sean Gillies * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" /* ** Add a label to a classObj (order doesn't matter for labels like it does with *styles) */ int msAddLabelToClass(classObj *class, labelObj *label) { if (!label) { msSetError(MS_CHILDERR, "Can't add a NULL label.", "msAddLabelToClass()"); return MS_FAILURE; } if (msGrowClassLabels(class) == NULL) return MS_FAILURE; /* msGrowClassLabels will alloc the label, free it in this case */ free(class->labels[class->numlabels]); class->labels[class->numlabels] = label; MS_REFCNT_INCR(label); class->numlabels++; return MS_SUCCESS; } /* ** Remove a label from a classObj. */ labelObj *msRemoveLabelFromClass(classObj *class, int nLabelIndex) { int i; labelObj *label; if (nLabelIndex < 0 || nLabelIndex >= class->numlabels) { msSetError(MS_CHILDERR, "Cannot remove label, invalid index %d", "msRemoveLabelFromClass()", nLabelIndex); return NULL; } else { label = class->labels[nLabelIndex]; for (i = nLabelIndex; i < class->numlabels - 1; i++) { class->labels[i] = class->labels[i + 1]; } class->labels[class->numlabels - 1] = NULL; class->numlabels--; MS_REFCNT_DECR(label); return label; } } /** * Move the style up inside the array of styles. */ int msMoveStyleUp(classObj *class, int nStyleIndex) { styleObj *psTmpStyle = NULL; if (class && nStyleIndex < class->numstyles && nStyleIndex > 0) { psTmpStyle = (styleObj *)malloc(sizeof(styleObj)); initStyle(psTmpStyle); msCopyStyle(psTmpStyle, class->styles[nStyleIndex]); msCopyStyle(class->styles[nStyleIndex], class->styles[nStyleIndex - 1]); msCopyStyle(class->styles[nStyleIndex - 1], psTmpStyle); return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveStyleUp()", nStyleIndex); return (MS_FAILURE); } /** * Move the style down inside the array of styles. */ int msMoveStyleDown(classObj *class, int nStyleIndex) { styleObj *psTmpStyle = NULL; if (class && nStyleIndex < class->numstyles - 1 && nStyleIndex >= 0) { psTmpStyle = (styleObj *)malloc(sizeof(styleObj)); initStyle(psTmpStyle); msCopyStyle(psTmpStyle, class->styles[nStyleIndex]); msCopyStyle(class->styles[nStyleIndex], class->styles[nStyleIndex + 1]); msCopyStyle(class->styles[nStyleIndex + 1], psTmpStyle); return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveStyleDown()", nStyleIndex); return (MS_FAILURE); } /* Moved here from mapscript.i * * Returns the index at which the style was inserted * */ int msInsertStyle(classObj *class, styleObj *style, int nStyleIndex) { int i; if (!style) { msSetError(MS_CHILDERR, "Can't insert a NULL Style", "msInsertStyle()"); return -1; } /* Ensure there is room for a new style */ if (msGrowClassStyles(class) == NULL) { return -1; } /* Catch attempt to insert past end of styles array */ else if (nStyleIndex >= class->numstyles) { msSetError(MS_CHILDERR, "Cannot insert style beyond index %d", "insertStyle()", class->numstyles - 1); return -1; } else if (nStyleIndex < 0) { /* Insert at the end by default */ class->styles[class->numstyles] = style; MS_REFCNT_INCR(style); class->numstyles++; return class->numstyles - 1; } else { /* Move styles existing at the specified nStyleIndex or greater */ /* to a higher nStyleIndex */ for (i = class->numstyles - 1; i >= nStyleIndex; i--) { class->styles[i + 1] = class->styles[i]; } class->styles[nStyleIndex] = style; MS_REFCNT_INCR(style); class->numstyles++; return nStyleIndex; } } styleObj *msRemoveStyle(classObj *class, int nStyleIndex) { int i; styleObj *style; if (nStyleIndex < 0 || nStyleIndex >= class->numstyles) { msSetError(MS_CHILDERR, "Cannot remove style, invalid nStyleIndex %d", "removeStyle()", nStyleIndex); return NULL; } else { style = class->styles[nStyleIndex]; for (i = nStyleIndex; i < class->numstyles - 1; i++) { class->styles[i] = class->styles[i + 1]; } class->styles[class->numstyles - 1] = NULL; class->numstyles--; MS_REFCNT_DECR(style); return style; } } /** * Delete the style identified by the index and shift * styles that follows the deleted style. */ int msDeleteStyle(classObj *class, int nStyleIndex) { if (class && nStyleIndex < class->numstyles && nStyleIndex >= 0) { if (freeStyle(class->styles[nStyleIndex]) == MS_SUCCESS) msFree(class->styles[nStyleIndex]); for (int i = nStyleIndex; i < class->numstyles - 1; i++) { class->styles[i] = class->styles[i + 1]; } class->styles[class->numstyles - 1] = NULL; class->numstyles--; return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msDeleteStyle()", nStyleIndex); return (MS_FAILURE); } mapserver-8.4.0/src/dejavu-sans-condensed.h000066400000000000000000150115301474174441300206660ustar00rootroot00000000000000/* Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Arev Fonts Copyright ------------------------------ Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. */ #ifndef _DEJAVU_SANS_CONDENSED_H #define _DEJAVU_SANS_CONDENSED_H /* to regenerate this file, use the `xxd -i` command */ unsigned char dejavu_sans_condensed_ttf[] = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x04, 0x00, 0x30, 0x46, 0x46, 0x54, 0x4d, 0x66, 0x09, 0x1f, 0xf9, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x00, 0x1c, 0x47, 0x44, 0x45, 0x46, 0xc3, 0x10, 0xc5, 0x70, 0x00, 0x00, 0x01, 0x58, 0x00, 0x00, 0x01, 0xc2, 0x47, 0x50, 0x4f, 0x53, 0xfc, 0xcc, 0xe2, 0x8c, 0x00, 0x00, 0x03, 0x1c, 0x00, 0x00, 0x70, 0xc4, 0x47, 0x53, 0x55, 0x42, 0x81, 0x22, 0xfe, 0xaf, 0x00, 0x00, 0x73, 0xe0, 0x00, 0x00, 0x0d, 0x50, 0x4f, 0x53, 0x2f, 0x32, 0x8d, 0x18, 0xe6, 0xc7, 0x00, 0x00, 0x81, 0x30, 0x00, 0x00, 0x00, 0x56, 0x63, 0x6d, 0x61, 0x70, 0x26, 0x77, 0xbd, 0xfb, 0x00, 0x00, 0x81, 0x88, 0x00, 0x00, 0x0e, 0x0e, 0x63, 0x76, 0x74, 0x20, 0x00, 0x69, 0x1d, 0x39, 0x00, 0x00, 0x8f, 0x98, 0x00, 0x00, 0x01, 0xfe, 0x66, 0x70, 0x67, 0x6d, 0x71, 0x34, 0x76, 0x6a, 0x00, 0x00, 0x91, 0x98, 0x00, 0x00, 0x00, 0xab, 0x67, 0x61, 0x73, 0x70, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x92, 0x44, 0x00, 0x00, 0x00, 0x0c, 0x67, 0x6c, 0x79, 0x66, 0xbf, 0x93, 0x97, 0x69, 0x00, 0x00, 0x92, 0x50, 0x00, 0x06, 0x16, 0x80, 0x68, 0x65, 0x61, 0x64, 0x00, 0x93, 0x52, 0xd5, 0x00, 0x06, 0xa8, 0xd0, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, 0x0c, 0x31, 0x19, 0x73, 0x00, 0x06, 0xa9, 0x08, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, 0xd6, 0x38, 0x75, 0x2e, 0x00, 0x06, 0xa9, 0x2c, 0x00, 0x00, 0x48, 0x38, 0x6b, 0x65, 0x72, 0x6e, 0x87, 0x38, 0x36, 0x5f, 0x00, 0x06, 0xf1, 0x64, 0x00, 0x00, 0x3f, 0xfc, 0x6c, 0x6f, 0x63, 0x61, 0x2b, 0x97, 0xe6, 0xcc, 0x00, 0x07, 0x31, 0x60, 0x00, 0x00, 0x48, 0x3c, 0x6d, 0x61, 0x78, 0x70, 0x16, 0x7b, 0x04, 0x5b, 0x00, 0x07, 0x79, 0x9c, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xf0, 0xf9, 0x25, 0x82, 0x00, 0x07, 0x79, 0xbc, 0x00, 0x00, 0x3d, 0xc5, 0x70, 0x6f, 0x73, 0x74, 0x6b, 0x1b, 0xc9, 0x76, 0x00, 0x07, 0xb7, 0x84, 0x00, 0x00, 0xb1, 0xbd, 0x70, 0x72, 0x65, 0x70, 0x3b, 0x07, 0xf1, 0x00, 0x00, 0x08, 0x69, 0x44, 0x00, 0x00, 0x05, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x89, 0x6f, 0x31, 0x00, 0x00, 0x00, 0x00, 0xce, 0x3f, 0xd8, 0x63, 0x00, 0x00, 0x00, 0x00, 0xce, 0x3f, 0xd8, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x56, 0x01, 0x5e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x03, 0x02, 0xb0, 0x00, 0x01, 0x02, 0xb1, 0x02, 0xc5, 0x00, 0x03, 0x02, 0xc6, 0x02, 0xc6, 0x00, 0x01, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x03, 0x02, 0xcb, 0x02, 0xcc, 0x00, 0x01, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x03, 0x02, 0xd2, 0x02, 0xd3, 0x00, 0x01, 0x02, 0xd4, 0x02, 0xe4, 0x00, 0x03, 0x02, 0xe5, 0x02, 0xe9, 0x00, 0x01, 0x02, 0xea, 0x02, 0xf3, 0x00, 0x03, 0x02, 0xf4, 0x02, 0xf4, 0x00, 0x01, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x03, 0x02, 0xf6, 0x02, 0xf6, 0x00, 0x01, 0x02, 0xf7, 0x02, 0xff, 0x00, 0x03, 0x03, 0x00, 0x03, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03, 0x04, 0x00, 0x03, 0x03, 0x05, 0x03, 0x05, 0x00, 0x01, 0x03, 0x06, 0x03, 0x06, 0x00, 0x03, 0x03, 0x07, 0x03, 0x07, 0x00, 0x01, 0x03, 0x08, 0x03, 0x09, 0x00, 0x03, 0x03, 0x0a, 0x03, 0x0a, 0x00, 0x01, 0x03, 0x0b, 0x03, 0x0c, 0x00, 0x03, 0x03, 0x0d, 0x04, 0x16, 0x00, 0x01, 0x04, 0x17, 0x04, 0x1b, 0x00, 0x03, 0x04, 0x1c, 0x05, 0x49, 0x00, 0x01, 0x05, 0x4a, 0x05, 0x4f, 0x00, 0x03, 0x05, 0x50, 0x07, 0x70, 0x00, 0x01, 0x07, 0x71, 0x07, 0x71, 0x00, 0x02, 0x07, 0x72, 0x07, 0x7b, 0x00, 0x01, 0x07, 0x7c, 0x07, 0x7e, 0x00, 0x02, 0x07, 0x7f, 0x07, 0xd1, 0x00, 0x01, 0x07, 0xd2, 0x07, 0xd2, 0x00, 0x02, 0x07, 0xd3, 0x07, 0xe2, 0x00, 0x01, 0x07, 0xe3, 0x07, 0xe9, 0x00, 0x03, 0x07, 0xea, 0x07, 0xea, 0x00, 0x02, 0x07, 0xeb, 0x07, 0xee, 0x00, 0x01, 0x07, 0xef, 0x07, 0xf0, 0x00, 0x02, 0x07, 0xf1, 0x08, 0x08, 0x00, 0x01, 0x08, 0x09, 0x08, 0x0a, 0x00, 0x02, 0x08, 0x0b, 0x08, 0x23, 0x00, 0x01, 0x08, 0x24, 0x08, 0x24, 0x00, 0x02, 0x08, 0x25, 0x0f, 0x08, 0x00, 0x01, 0x0f, 0x09, 0x0f, 0x0f, 0x00, 0x02, 0x0f, 0x10, 0x0f, 0x10, 0x00, 0x01, 0x0f, 0x11, 0x0f, 0x11, 0x00, 0x03, 0x0f, 0x12, 0x0f, 0x12, 0x00, 0x01, 0x0f, 0x13, 0x0f, 0x13, 0x00, 0x03, 0x0f, 0x14, 0x10, 0xea, 0x00, 0x01, 0x10, 0xeb, 0x10, 0xf5, 0x00, 0x03, 0x10, 0xf6, 0x11, 0x49, 0x00, 0x01, 0x11, 0x4a, 0x11, 0x51, 0x00, 0x03, 0x11, 0x52, 0x11, 0xab, 0x00, 0x01, 0x11, 0xac, 0x11, 0xac, 0x00, 0x03, 0x11, 0xad, 0x12, 0x0d, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0xb1, 0x02, 0xc6, 0x00, 0x01, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x02, 0x02, 0xcd, 0x02, 0xd7, 0x00, 0x02, 0x02, 0xd8, 0x02, 0xd8, 0x00, 0x03, 0x02, 0xd9, 0x02, 0xd9, 0x00, 0x04, 0x02, 0xda, 0x02, 0xe4, 0x00, 0x02, 0x02, 0xea, 0x02, 0xed, 0x00, 0x02, 0x02, 0xee, 0x02, 0xf5, 0x00, 0x01, 0x02, 0xf6, 0x02, 0xf6, 0x00, 0x02, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x01, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x02, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x01, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x02, 0x03, 0x01, 0x03, 0x02, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x00, 0x02, 0x03, 0x04, 0x03, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x01, 0xd8, 0x02, 0x32, 0x00, 0x14, 0x44, 0x46, 0x4c, 0x54, 0x00, 0x7a, 0x61, 0x72, 0x61, 0x62, 0x00, 0x86, 0x61, 0x72, 0x6d, 0x6e, 0x00, 0xa8, 0x62, 0x72, 0x61, 0x69, 0x00, 0xb4, 0x63, 0x61, 0x6e, 0x73, 0x00, 0xc0, 0x63, 0x68, 0x65, 0x72, 0x00, 0xcc, 0x63, 0x79, 0x72, 0x6c, 0x00, 0xd8, 0x67, 0x65, 0x6f, 0x72, 0x00, 0xf4, 0x67, 0x72, 0x65, 0x6b, 0x01, 0x00, 0x68, 0x61, 0x6e, 0x69, 0x01, 0x10, 0x68, 0x65, 0x62, 0x72, 0x01, 0x1c, 0x6b, 0x61, 0x6e, 0x61, 0x01, 0x2a, 0x6c, 0x61, 0x6f, 0x20, 0x01, 0x36, 0x6c, 0x61, 0x74, 0x6e, 0x01, 0x42, 0x6d, 0x61, 0x74, 0x68, 0x01, 0x82, 0x6e, 0x6b, 0x6f, 0x20, 0x01, 0x8e, 0x6f, 0x67, 0x61, 0x6d, 0x01, 0x9c, 0x72, 0x75, 0x6e, 0x72, 0x01, 0xa8, 0x74, 0x66, 0x6e, 0x67, 0x01, 0xb4, 0x74, 0x68, 0x61, 0x69, 0x01, 0xc2, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x4b, 0x55, 0x52, 0x20, 0x00, 0x16, 0x53, 0x4e, 0x44, 0x20, 0x00, 0x16, 0x55, 0x52, 0x44, 0x20, 0x00, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x4d, 0x4b, 0x44, 0x20, 0x00, 0x10, 0x53, 0x52, 0x42, 0x20, 0x00, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x08, 0x49, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x4b, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x4c, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x4d, 0x4f, 0x4c, 0x20, 0x00, 0x34, 0x4e, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x52, 0x4f, 0x4d, 0x20, 0x00, 0x34, 0x53, 0x4b, 0x53, 0x20, 0x00, 0x34, 0x53, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x2c, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x32, 0x6d, 0x61, 0x72, 0x6b, 0x00, 0x3a, 0x6d, 0x61, 0x72, 0x6b, 0x00, 0x40, 0x6d, 0x61, 0x72, 0x6b, 0x00, 0x48, 0x6d, 0x6b, 0x6d, 0x6b, 0x00, 0x4e, 0x6d, 0x6b, 0x6d, 0x6b, 0x00, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x44, 0x00, 0x06, 0x00, 0x04, 0x00, 0x02, 0x00, 0xf0, 0x03, 0xd0, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x08, 0x86, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xc0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x11, 0x72, 0x17, 0x1c, 0x17, 0x9c, 0x1b, 0x3a, 0x2c, 0x8e, 0x44, 0xde, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x46, 0x1c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xca, 0x00, 0x01, 0x00, 0x58, 0x00, 0x4e, 0x00, 0x01, 0x00, 0x62, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x01, 0x01, 0xcc, 0x08, 0xfc, 0x00, 0x01, 0x01, 0xcc, 0x09, 0xc4, 0x00, 0x01, 0x01, 0xcc, 0x08, 0xfc, 0x00, 0x01, 0x01, 0xcc, 0x08, 0x34, 0x00, 0x01, 0x01, 0xcc, 0x09, 0xc4, 0x00, 0x01, 0x01, 0xcc, 0x08, 0x34, 0x00, 0x01, 0x01, 0xcc, 0x07, 0xd0, 0x00, 0x01, 0x01, 0xcc, 0x09, 0x60, 0x00, 0x02, 0x00, 0x01, 0x11, 0x4a, 0x11, 0x51, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x11, 0x4a, 0x11, 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0x5a, 0x01, 0x26, 0x00, 0x01, 0x01, 0x94, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x5a, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6c, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7e, 0x00, 0x84, 0x00, 0x8a, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9c, 0x00, 0xa2, 0x00, 0xa8, 0x00, 0xae, 0x00, 0xb4, 0x00, 0xba, 0x00, 0xc0, 0x00, 0xc6, 0x00, 0xcc, 0x00, 0xd2, 0x00, 0xd8, 0x00, 0xde, 0x00, 0xe4, 0x00, 0xea, 0x00, 0xf0, 0x00, 0xf6, 0x00, 0xfc, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0e, 0x01, 0x14, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xde, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xde, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xda, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x89, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x89, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x89, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xda, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x14, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x74, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x74, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x1f, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x3b, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x18, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x38, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x38, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x38, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0xbf, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xda, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x1f, 0x00, 0x01, 0xfe, 0x35, 0xfe, 0x13, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0b, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x13, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xda, 0x00, 0x02, 0x00, 0x08, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x00, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x04, 0x02, 0xd4, 0x02, 0xe2, 0x00, 0x09, 0x02, 0xea, 0x02, 0xed, 0x00, 0x18, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x1c, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x00, 0x21, 0x03, 0x06, 0x03, 0x06, 0x00, 0x22, 0x00, 0x02, 0x00, 0x09, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x00, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x04, 0x02, 0xd4, 0x02, 0xd7, 0x00, 0x09, 0x02, 0xda, 0x02, 0xe2, 0x00, 0x0d, 0x02, 0xea, 0x02, 0xed, 0x00, 0x16, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x1a, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x1d, 0x03, 0x03, 0x03, 0x03, 0x00, 0x1f, 0x03, 0x06, 0x03, 0x06, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x16, 0x00, 0x00, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x22, 0x00, 0x00, 0x01, 0x28, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x34, 0x00, 0x00, 0x01, 0x3a, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x46, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x35, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x42, 0x01, 0xde, 0x00, 0x01, 0x02, 0x8e, 0x00, 0x0c, 0x00, 0x3a, 0x00, 0x76, 0x00, 0x7c, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8e, 0x00, 0x94, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xac, 0x00, 0xb2, 0x00, 0xb8, 0x00, 0xbe, 0x00, 0xc4, 0x00, 0xca, 0x00, 0xd0, 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe2, 0x00, 0xe8, 0x00, 0xee, 0x00, 0xf4, 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x01, 0x12, 0x01, 0x18, 0x01, 0x1e, 0x01, 0x24, 0x01, 0x2a, 0x01, 0x30, 0x01, 0x36, 0x01, 0x3c, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4e, 0x01, 0x54, 0x01, 0x5a, 0x01, 0x60, 0x01, 0x66, 0x01, 0x6c, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7e, 0x01, 0x84, 0x01, 0x8a, 0x01, 0x90, 0x01, 0x96, 0x01, 0x9c, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x3d, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x44, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0xc5, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0xa8, 0x00, 0x01, 0xfe, 0x34, 0x06, 0xa8, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x56, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x44, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x93, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x3d, 0x00, 0x01, 0xfe, 0x34, 0x07, 0xd0, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x44, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x44, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0xfe, 0x34, 0x06, 0xda, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xdb, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x1e, 0x00, 0x02, 0x00, 0x10, 0x02, 0xb1, 0x02, 0xc2, 0x00, 0x00, 0x02, 0xee, 0x02, 0xee, 0x00, 0x12, 0x02, 0xf0, 0x02, 0xf3, 0x00, 0x13, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x17, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x18, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x19, 0x03, 0x01, 0x03, 0x02, 0x00, 0x1c, 0x03, 0x04, 0x03, 0x04, 0x00, 0x1e, 0x03, 0x08, 0x03, 0x09, 0x00, 0x1f, 0x03, 0x0b, 0x03, 0x0c, 0x00, 0x21, 0x05, 0x4a, 0x05, 0x4f, 0x00, 0x23, 0x07, 0xe3, 0x07, 0xe9, 0x00, 0x29, 0x10, 0xeb, 0x10, 0xeb, 0x00, 0x30, 0x10, 0xed, 0x10, 0xed, 0x00, 0x31, 0x10, 0xef, 0x10, 0xf5, 0x00, 0x32, 0x11, 0xac, 0x11, 0xac, 0x00, 0x39, 0x00, 0x02, 0x00, 0x0c, 0x02, 0xb1, 0x02, 0xc2, 0x00, 0x00, 0x02, 0xee, 0x02, 0xee, 0x00, 0x12, 0x02, 0xf0, 0x02, 0xf3, 0x00, 0x13, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x17, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x18, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x19, 0x03, 0x01, 0x03, 0x02, 0x00, 0x1c, 0x03, 0x04, 0x03, 0x04, 0x00, 0x1e, 0x05, 0x4a, 0x05, 0x4f, 0x00, 0x1f, 0x07, 0xe3, 0x07, 0xe9, 0x00, 0x25, 0x10, 0xeb, 0x10, 0xf5, 0x00, 0x2c, 0x11, 0xac, 0x11, 0xac, 0x00, 0x37, 0x00, 0x38, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0x36, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x01, 0x4e, 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x01, 0x5a, 0x00, 0x00, 0x01, 0x60, 0x00, 0x00, 0x01, 0x66, 0x00, 0x00, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x72, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x01, 0x7e, 0x00, 0x00, 0x01, 0x84, 0x00, 0x00, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0x96, 0x00, 0x00, 0x01, 0x9c, 0x00, 0x00, 0x01, 0xa2, 0x00, 0x00, 0x01, 0xa8, 0x00, 0x00, 0x01, 0xae, 0x00, 0x00, 0x01, 0xb4, 0x00, 0x00, 0x01, 0xba, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x01, 0xc6, 0x00, 0x00, 0x01, 0xcc, 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xd8, 0x00, 0x00, 0x01, 0xde, 0x00, 0x00, 0x01, 0xe4, 0x00, 0x00, 0x01, 0xea, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x01, 0xf6, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x26, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0xb0, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0xb0, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x06, 0xe6, 0x06, 0xbe, 0x00, 0x01, 0x06, 0xf0, 0x00, 0x0c, 0x00, 0xd6, 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd8, 0x01, 0xde, 0x01, 0xe4, 0x01, 0xea, 0x01, 0xf0, 0x01, 0xf6, 0x01, 0xfc, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0e, 0x02, 0x14, 0x02, 0x1a, 0x02, 0x20, 0x02, 0x26, 0x02, 0x2c, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3e, 0x02, 0x44, 0x02, 0x4a, 0x02, 0x50, 0x02, 0x56, 0x02, 0x5c, 0x02, 0x62, 0x02, 0x68, 0x02, 0x6e, 0x02, 0x74, 0x02, 0x7a, 0x02, 0x80, 0x02, 0x86, 0x02, 0x8c, 0x02, 0x92, 0x02, 0x98, 0x02, 0x9e, 0x02, 0xa4, 0x02, 0xaa, 0x02, 0xb0, 0x02, 0xb6, 0x02, 0xbc, 0x02, 0xc2, 0x02, 0xc8, 0x02, 0xce, 0x02, 0xd4, 0x02, 0xda, 0x02, 0xe0, 0x02, 0xe6, 0x02, 0xec, 0x02, 0xf2, 0x02, 0xf8, 0x02, 0xfe, 0x03, 0x04, 0x03, 0x0a, 0x03, 0x10, 0x03, 0x16, 0x03, 0x1c, 0x03, 0x22, 0x03, 0x28, 0x03, 0x2e, 0x03, 0x34, 0x03, 0x3a, 0x03, 0x40, 0x03, 0x46, 0x03, 0x4c, 0x03, 0x52, 0x03, 0x58, 0x03, 0x5e, 0x03, 0x64, 0x03, 0x6a, 0x03, 0x70, 0x03, 0x76, 0x03, 0x7c, 0x03, 0x82, 0x03, 0x88, 0x03, 0x8e, 0x03, 0x94, 0x03, 0x9a, 0x03, 0xa0, 0x03, 0xa6, 0x03, 0xac, 0x03, 0xb2, 0x03, 0xb8, 0x03, 0xbe, 0x03, 0xc4, 0x03, 0xca, 0x03, 0xd0, 0x03, 0xd6, 0x03, 0xdc, 0x03, 0xe2, 0x03, 0xe8, 0x03, 0xee, 0x03, 0xf4, 0x03, 0xfa, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0c, 0x04, 0x12, 0x04, 0x18, 0x04, 0x1e, 0x04, 0x24, 0x04, 0x2a, 0x04, 0x30, 0x04, 0x36, 0x04, 0x3c, 0x04, 0x42, 0x04, 0x48, 0x04, 0x4e, 0x04, 0x54, 0x04, 0x5a, 0x04, 0x60, 0x04, 0x66, 0x04, 0x6c, 0x04, 0x72, 0x04, 0x78, 0x04, 0x7e, 0x04, 0x84, 0x04, 0x8a, 0x04, 0x90, 0x04, 0x96, 0x04, 0x9c, 0x04, 0xa2, 0x04, 0xa8, 0x04, 0xae, 0x04, 0xb4, 0x04, 0xba, 0x04, 0xc0, 0x04, 0xc6, 0x04, 0xcc, 0x04, 0xd2, 0x04, 0xd8, 0x04, 0xde, 0x04, 0xe4, 0x04, 0xea, 0x04, 0xf0, 0x04, 0xf6, 0x04, 0xfc, 0x05, 0x02, 0x05, 0x08, 0x05, 0x0e, 0x05, 0x14, 0x05, 0x1a, 0x05, 0x20, 0x05, 0x26, 0x05, 0x2c, 0x05, 0x32, 0x05, 0x38, 0x05, 0x3e, 0x05, 0x44, 0x05, 0x4a, 0x05, 0x50, 0x05, 0x56, 0x05, 0x5c, 0x05, 0x62, 0x05, 0x68, 0x05, 0x6e, 0x05, 0x74, 0x05, 0x7a, 0x05, 0x80, 0x05, 0x86, 0x05, 0x8c, 0x05, 0x92, 0x05, 0x98, 0x05, 0x9e, 0x05, 0xa4, 0x05, 0xaa, 0x05, 0xb0, 0x05, 0xb6, 0x05, 0xbc, 0x05, 0xc2, 0x05, 0xc8, 0x05, 0xce, 0x05, 0xd4, 0x05, 0xda, 0x05, 0xe0, 0x05, 0xe6, 0x05, 0xec, 0x05, 0xf2, 0x05, 0xf8, 0x05, 0xfe, 0x06, 0x04, 0x06, 0x0a, 0x06, 0x10, 0x06, 0x16, 0x06, 0x1c, 0x06, 0x22, 0x06, 0x28, 0x06, 0x2e, 0x06, 0x34, 0x06, 0x3a, 0x06, 0x40, 0x06, 0x46, 0x06, 0x4c, 0x06, 0x52, 0x06, 0x58, 0x06, 0x5e, 0x06, 0x64, 0x06, 0x6a, 0x06, 0x70, 0x06, 0x76, 0x06, 0x7c, 0x06, 0x82, 0x06, 0x88, 0x06, 0x8e, 0x06, 0x94, 0x06, 0x9a, 0x06, 0xa0, 0x06, 0xa6, 0x06, 0xac, 0x00, 0x01, 0x03, 0x2a, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x0d, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x0d, 0x03, 0xe8, 0x00, 0x01, 0x02, 0x76, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xc2, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xd2, 0x03, 0xb6, 0x00, 0x01, 0x01, 0xc2, 0x03, 0x52, 0x00, 0x01, 0x01, 0xc2, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xd2, 0x03, 0xb6, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x03, 0x2a, 0x03, 0x52, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x03, 0x2a, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x0d, 0x05, 0x14, 0x00, 0x01, 0x01, 0x0d, 0x05, 0x14, 0x00, 0x01, 0x02, 0x49, 0x06, 0x0e, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xaa, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xaa, 0x00, 0x01, 0x02, 0x49, 0x05, 0xdc, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x78, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x78, 0x00, 0x01, 0x02, 0x49, 0x05, 0xdc, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x78, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x78, 0x00, 0x01, 0x02, 0x49, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1c, 0x04, 0x7e, 0x00, 0x01, 0x02, 0x1c, 0x04, 0x7e, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x04, 0x42, 0x08, 0x34, 0x00, 0x01, 0x01, 0x31, 0x08, 0x34, 0x00, 0x01, 0x01, 0x31, 0x08, 0x34, 0x00, 0x01, 0x02, 0x76, 0x03, 0xb6, 0x00, 0x01, 0x01, 0x0d, 0x04, 0xb0, 0x00, 0x01, 0x01, 0x0d, 0x04, 0xb0, 0x00, 0x01, 0x02, 0x76, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xef, 0x03, 0x52, 0x00, 0x01, 0x01, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x0e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x0e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x0e, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x80, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x80, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x80, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x21, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x21, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x21, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xdd, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xdd, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xdd, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x63, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x63, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x63, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x7e, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x7e, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x7e, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd2, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd2, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd2, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x52, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x52, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x52, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe5, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe5, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x68, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x68, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x95, 0x06, 0x40, 0x00, 0x01, 0x01, 0x95, 0x05, 0xaa, 0x00, 0x01, 0x01, 0x95, 0x05, 0xdc, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x02, 0x76, 0x03, 0xe8, 0x00, 0x01, 0x02, 0x76, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x02, 0xfd, 0x04, 0x1a, 0x00, 0x01, 0x02, 0xfd, 0x04, 0x1a, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x02, 0x49, 0x03, 0x84, 0x00, 0x01, 0x02, 0x49, 0x03, 0x84, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x02, 0xfd, 0x04, 0xe2, 0x00, 0x01, 0x02, 0xfd, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x01, 0xef, 0x03, 0x20, 0x00, 0x01, 0x01, 0xef, 0x03, 0x20, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x02, 0x1c, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1c, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1e, 0x06, 0x72, 0x00, 0x01, 0x01, 0x31, 0x06, 0x72, 0x00, 0x01, 0x01, 0x31, 0x06, 0x72, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x01, 0xc2, 0x06, 0x72, 0x00, 0x01, 0x01, 0xbc, 0x05, 0x78, 0x00, 0x01, 0x02, 0x76, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xc2, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xd2, 0x03, 0xb6, 0x00, 0x01, 0x02, 0x76, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x46, 0x00, 0x01, 0x01, 0xd2, 0x04, 0xb0, 0x00, 0x01, 0x02, 0x76, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xc2, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xd2, 0x03, 0xb6, 0x00, 0x01, 0x01, 0xc2, 0x03, 0x52, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x46, 0x00, 0x01, 0x01, 0xd2, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xc2, 0x03, 0x52, 0x00, 0x01, 0x01, 0xc2, 0x06, 0x40, 0x00, 0x01, 0x01, 0xd2, 0x05, 0xaa, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0x6c, 0x05, 0x78, 0x00, 0x01, 0x00, 0x6c, 0x05, 0x78, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0xe1, 0x06, 0x0e, 0x00, 0x01, 0x00, 0xe1, 0x06, 0x0e, 0x00, 0x01, 0x02, 0xe6, 0x06, 0x0e, 0x00, 0x01, 0x00, 0xf7, 0x06, 0xa4, 0x00, 0x01, 0x00, 0xf7, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x76, 0x05, 0xdc, 0x00, 0x01, 0x00, 0xe1, 0x06, 0x0e, 0x00, 0x01, 0x00, 0xe1, 0x06, 0x0e, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0xe1, 0x06, 0xa4, 0x00, 0x01, 0x00, 0xe1, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0xe1, 0x06, 0xa4, 0x00, 0x01, 0x00, 0xe1, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0xf7, 0x08, 0x66, 0x00, 0x01, 0x00, 0xf7, 0x08, 0x66, 0x00, 0x01, 0x04, 0x42, 0x08, 0x34, 0x00, 0x01, 0x01, 0x31, 0x08, 0x34, 0x00, 0x01, 0x01, 0x31, 0x08, 0x34, 0x00, 0x01, 0x04, 0x42, 0x08, 0x66, 0x00, 0x01, 0x01, 0x31, 0x08, 0x66, 0x00, 0x01, 0x01, 0x31, 0x08, 0x66, 0x00, 0x01, 0x02, 0x49, 0x05, 0x14, 0x00, 0x01, 0x01, 0x31, 0x06, 0x72, 0x00, 0x01, 0x01, 0x31, 0x06, 0x72, 0x00, 0x01, 0x02, 0x49, 0x02, 0xee, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x02, 0x49, 0x02, 0xee, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x02, 0x76, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x0d, 0x05, 0x14, 0x00, 0x01, 0x01, 0x0d, 0x05, 0x14, 0x00, 0x02, 0x00, 0x06, 0x10, 0xfc, 0x11, 0x06, 0x00, 0x00, 0x11, 0x08, 0x11, 0x19, 0x00, 0x0b, 0x11, 0x35, 0x11, 0x3d, 0x00, 0x1d, 0x11, 0x3f, 0x11, 0x3f, 0x00, 0x26, 0x11, 0x52, 0x11, 0xab, 0x00, 0x27, 0x11, 0xb9, 0x12, 0x0d, 0x00, 0x81, 0x00, 0x02, 0x00, 0x01, 0x11, 0x4a, 0x11, 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x00, 0x20, 0x00, 0x1a, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x00, 0x01, 0x00, 0xa9, 0x00, 0x02, 0x00, 0x09, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x00, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x04, 0x02, 0xd4, 0x02, 0xd7, 0x00, 0x09, 0x02, 0xda, 0x02, 0xe4, 0x00, 0x0d, 0x02, 0xea, 0x02, 0xed, 0x00, 0x18, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x1c, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x00, 0x21, 0x03, 0x06, 0x03, 0x06, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0x36, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x01, 0x4e, 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x01, 0x5a, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x35, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0x05, 0x8c, 0x04, 0xb6, 0x00, 0x01, 0x05, 0x94, 0x00, 0x0c, 0x00, 0x95, 0x01, 0x2c, 0x01, 0x32, 0x01, 0x38, 0x01, 0x3e, 0x01, 0x44, 0x01, 0x4a, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5c, 0x01, 0x62, 0x01, 0x68, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x7a, 0x01, 0x80, 0x01, 0x86, 0x01, 0x8c, 0x01, 0x92, 0x01, 0x98, 0x01, 0x9e, 0x01, 0xa4, 0x01, 0xaa, 0x01, 0xb0, 0x01, 0xb6, 0x01, 0xbc, 0x01, 0xc2, 0x01, 0xc8, 0x01, 0xce, 0x01, 0xd4, 0x01, 0xda, 0x01, 0xe0, 0x01, 0xe6, 0x01, 0xec, 0x01, 0xf2, 0x01, 0xf8, 0x01, 0xfe, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1c, 0x02, 0x22, 0x02, 0x28, 0x02, 0x2e, 0x02, 0x34, 0x02, 0x3a, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4c, 0x02, 0x52, 0x02, 0x58, 0x02, 0x5e, 0x02, 0x64, 0x02, 0x6a, 0x02, 0x70, 0x02, 0x76, 0x02, 0x7c, 0x02, 0x82, 0x02, 0x88, 0x02, 0x8e, 0x02, 0x94, 0x02, 0x9a, 0x02, 0xa0, 0x02, 0xa6, 0x02, 0xac, 0x02, 0xb2, 0x02, 0xb8, 0x02, 0xbe, 0x02, 0xc4, 0x02, 0xca, 0x02, 0xd0, 0x02, 0xd6, 0x02, 0xdc, 0x02, 0xe2, 0x02, 0xe8, 0x02, 0xee, 0x02, 0xf4, 0x02, 0xfa, 0x03, 0x00, 0x03, 0x06, 0x03, 0x0c, 0x03, 0x12, 0x03, 0x18, 0x03, 0x1e, 0x03, 0x24, 0x03, 0x2a, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3c, 0x03, 0x42, 0x03, 0x48, 0x03, 0x4e, 0x03, 0x54, 0x03, 0x5a, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6c, 0x03, 0x72, 0x03, 0x78, 0x03, 0x7e, 0x03, 0x84, 0x03, 0x8a, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9c, 0x03, 0xa2, 0x03, 0xa8, 0x03, 0xae, 0x03, 0xb4, 0x03, 0xba, 0x03, 0xc0, 0x03, 0xc6, 0x03, 0xcc, 0x03, 0xd2, 0x03, 0xd8, 0x03, 0xde, 0x03, 0xe4, 0x03, 0xea, 0x03, 0xf0, 0x03, 0xf6, 0x03, 0xfc, 0x04, 0x02, 0x04, 0x08, 0x04, 0x0e, 0x04, 0x14, 0x04, 0x1a, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2c, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3e, 0x04, 0x44, 0x04, 0x4a, 0x04, 0x50, 0x04, 0x56, 0x04, 0x5c, 0x04, 0x62, 0x04, 0x68, 0x04, 0x6e, 0x04, 0x74, 0x04, 0x7a, 0x04, 0x80, 0x04, 0x86, 0x04, 0x8c, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9e, 0x04, 0xa4, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x02, 0x00, 0x23, 0x00, 0x24, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x1a, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x34, 0x00, 0xba, 0x00, 0xba, 0x00, 0x35, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0x36, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x38, 0x00, 0xf3, 0x00, 0xf3, 0x00, 0x3a, 0x01, 0x28, 0x01, 0x29, 0x00, 0x3b, 0x01, 0x41, 0x01, 0x41, 0x00, 0x3d, 0x01, 0x48, 0x01, 0x48, 0x00, 0x3e, 0x01, 0x51, 0x01, 0x52, 0x00, 0x3f, 0x01, 0x59, 0x01, 0x59, 0x00, 0x41, 0x01, 0x61, 0x01, 0x61, 0x00, 0x42, 0x01, 0x79, 0x01, 0x7b, 0x00, 0x43, 0x02, 0x12, 0x02, 0x12, 0x00, 0x46, 0x02, 0x16, 0x02, 0x16, 0x00, 0x47, 0x02, 0x1b, 0x02, 0x1b, 0x00, 0x48, 0x02, 0x1d, 0x02, 0x1d, 0x00, 0x49, 0x02, 0x2a, 0x02, 0x2a, 0x00, 0x4a, 0x02, 0x37, 0x02, 0x37, 0x00, 0x4b, 0x02, 0x54, 0x02, 0x54, 0x00, 0x4c, 0x05, 0x23, 0x05, 0x23, 0x00, 0x4d, 0x05, 0x5a, 0x05, 0x63, 0x00, 0x4e, 0x0e, 0x38, 0x0e, 0x3a, 0x00, 0x58, 0x0e, 0x3d, 0x0e, 0x3e, 0x00, 0x5b, 0x0e, 0x44, 0x0e, 0x44, 0x00, 0x5d, 0x0e, 0x48, 0x0e, 0x49, 0x00, 0x5e, 0x0e, 0x62, 0x0e, 0x65, 0x00, 0x60, 0x0e, 0x6b, 0x0e, 0x75, 0x00, 0x64, 0x0e, 0x78, 0x0e, 0x81, 0x00, 0x6f, 0x0e, 0x83, 0x0e, 0x87, 0x00, 0x79, 0x0e, 0x8c, 0x0e, 0x8f, 0x00, 0x7e, 0x0e, 0x96, 0x0e, 0xa2, 0x00, 0x82, 0x0e, 0xa4, 0x0e, 0xa8, 0x00, 0x8f, 0x11, 0x1c, 0x11, 0x1c, 0x00, 0x94, 0x00, 0x01, 0x00, 0x02, 0x0f, 0x11, 0x0f, 0x13, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x62, 0x00, 0x4e, 0x00, 0x01, 0x00, 0x6a, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x01, 0x02, 0x0f, 0x06, 0x14, 0x00, 0x01, 0x02, 0xa1, 0x07, 0x6d, 0x00, 0x01, 0x02, 0x53, 0x06, 0x14, 0x00, 0x01, 0x01, 0x02, 0x06, 0x14, 0x00, 0x01, 0x02, 0x34, 0x06, 0x14, 0x00, 0x01, 0x02, 0x3d, 0x06, 0x14, 0x00, 0x01, 0x02, 0xa1, 0x07, 0x50, 0x00, 0x01, 0x03, 0x97, 0x07, 0x89, 0x00, 0x01, 0x00, 0x08, 0x00, 0xc3, 0x00, 0xd0, 0x00, 0xd5, 0x00, 0xed, 0x01, 0x0f, 0x01, 0x2d, 0x05, 0x5a, 0x05, 0x5b, 0x00, 0x01, 0x00, 0x02, 0x02, 0xb1, 0x02, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x8c, 0x02, 0xd6, 0x00, 0x01, 0x03, 0x92, 0x00, 0x0c, 0x00, 0x59, 0x00, 0xb4, 0x00, 0xba, 0x00, 0xc0, 0x00, 0xc6, 0x00, 0xcc, 0x00, 0xd2, 0x00, 0xd8, 0x00, 0xde, 0x00, 0xe4, 0x00, 0xea, 0x00, 0xf0, 0x00, 0xf6, 0x00, 0xfc, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0e, 0x01, 0x14, 0x01, 0x1a, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2c, 0x01, 0x32, 0x01, 0x38, 0x01, 0x3e, 0x01, 0x44, 0x01, 0x4a, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5c, 0x01, 0x62, 0x01, 0x68, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x7a, 0x01, 0x80, 0x01, 0x86, 0x01, 0x8c, 0x01, 0x92, 0x01, 0x98, 0x01, 0x9e, 0x01, 0xa4, 0x01, 0xaa, 0x01, 0xb0, 0x01, 0xb6, 0x01, 0xbc, 0x01, 0xc2, 0x01, 0xc8, 0x01, 0xce, 0x01, 0xd4, 0x01, 0xda, 0x01, 0xe0, 0x01, 0xe6, 0x01, 0xec, 0x01, 0xf2, 0x01, 0xf8, 0x01, 0xfe, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1c, 0x02, 0x22, 0x02, 0x28, 0x02, 0x2e, 0x02, 0x34, 0x02, 0x3a, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4c, 0x02, 0x52, 0x02, 0x58, 0x02, 0x5e, 0x02, 0x64, 0x02, 0x6a, 0x02, 0x70, 0x02, 0x76, 0x02, 0x7c, 0x02, 0x82, 0x02, 0x88, 0x02, 0x8e, 0x02, 0x94, 0x02, 0x9a, 0x02, 0xa0, 0x02, 0xa6, 0x02, 0xac, 0x02, 0xb2, 0x02, 0xb8, 0x02, 0xbe, 0x02, 0xc4, 0x00, 0x01, 0x04, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf7, 0x00, 0x00, 0x00, 0x01, 0x01, 0xf5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x01, 0xf6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x04, 0x7f, 0xfe, 0x80, 0x00, 0x01, 0x03, 0x6f, 0xfe, 0x80, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x95, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x05, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x04, 0xec, 0x00, 0x00, 0x00, 0x01, 0x05, 0x96, 0x00, 0x00, 0x00, 0x01, 0x04, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x02, 0x85, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x01, 0xf6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x69, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0xfe, 0x52, 0x00, 0x01, 0x00, 0x59, 0x00, 0x24, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x36, 0x00, 0x38, 0x00, 0x3d, 0x00, 0x44, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x56, 0x00, 0x58, 0x00, 0x5d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x9a, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xba, 0x00, 0xc3, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xd5, 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0xf2, 0x00, 0xf3, 0x01, 0x0f, 0x01, 0x2d, 0x01, 0x48, 0x01, 0x51, 0x01, 0x52, 0x01, 0x59, 0x01, 0x61, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x91, 0x01, 0x92, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x02, 0x12, 0x02, 0x16, 0x02, 0x1b, 0x02, 0x1d, 0x02, 0x2a, 0x02, 0x37, 0x02, 0x54, 0x05, 0x7e, 0x05, 0x7f, 0x06, 0x18, 0x06, 0x19, 0x0e, 0x38, 0x0e, 0x44, 0x0e, 0x6c, 0x0e, 0x6d, 0x0e, 0x6e, 0x0e, 0x6f, 0x0e, 0x7e, 0x0e, 0x7f, 0x0e, 0x9c, 0x0e, 0x9d, 0x0e, 0xa0, 0x0e, 0xa1, 0x0e, 0xa2, 0x0e, 0xa7, 0x11, 0x1c, 0x11, 0xb8, 0x00, 0x01, 0x00, 0x01, 0x02, 0xd8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0xfe, 0x48, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xba, 0x0d, 0x8e, 0x00, 0x01, 0x0f, 0xf4, 0x00, 0x0c, 0x01, 0xb0, 0x03, 0x62, 0x03, 0x68, 0x03, 0x6e, 0x03, 0x74, 0x03, 0x7a, 0x03, 0x80, 0x03, 0x86, 0x03, 0x8c, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9e, 0x03, 0xa4, 0x03, 0xaa, 0x03, 0xb0, 0x03, 0xb6, 0x03, 0xbc, 0x03, 0xc2, 0x03, 0xc8, 0x03, 0xce, 0x03, 0xd4, 0x03, 0xda, 0x03, 0xe0, 0x03, 0xe6, 0x03, 0xec, 0x03, 0xf2, 0x03, 0xf8, 0x03, 0xfe, 0x04, 0x04, 0x04, 0x0a, 0x04, 0x10, 0x04, 0x16, 0x04, 0x1c, 0x04, 0x22, 0x04, 0x28, 0x04, 0x2e, 0x04, 0x34, 0x04, 0x3a, 0x04, 0x40, 0x04, 0x46, 0x04, 0x4c, 0x04, 0x52, 0x04, 0x58, 0x04, 0x5e, 0x04, 0x64, 0x04, 0x6a, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7c, 0x04, 0x82, 0x04, 0x88, 0x04, 0x8e, 0x04, 0x94, 0x04, 0x9a, 0x04, 0xa0, 0x04, 0xa6, 0x04, 0xac, 0x04, 0xb2, 0x04, 0xb8, 0x04, 0xbe, 0x04, 0xc4, 0x04, 0xca, 0x04, 0xd0, 0x04, 0xd6, 0x04, 0xdc, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xee, 0x04, 0xf4, 0x04, 0xfa, 0x05, 0x00, 0x05, 0x06, 0x05, 0x0c, 0x05, 0x12, 0x05, 0x18, 0x05, 0x1e, 0x05, 0x24, 0x05, 0x2a, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3c, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4e, 0x05, 0x54, 0x05, 0x5a, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6c, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7e, 0x05, 0x84, 0x05, 0x8a, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9c, 0x05, 0xa2, 0x05, 0xa8, 0x05, 0xae, 0x05, 0xb4, 0x05, 0xba, 0x05, 0xc0, 0x05, 0xc6, 0x05, 0xcc, 0x05, 0xd2, 0x05, 0xd8, 0x05, 0xde, 0x05, 0xe4, 0x05, 0xea, 0x05, 0xf0, 0x05, 0xf6, 0x05, 0xfc, 0x06, 0x02, 0x06, 0x08, 0x06, 0x0e, 0x06, 0x14, 0x06, 0x1a, 0x06, 0x20, 0x06, 0x26, 0x06, 0x2c, 0x06, 0x32, 0x06, 0x38, 0x06, 0x3e, 0x06, 0x44, 0x06, 0x4a, 0x06, 0x50, 0x06, 0x56, 0x06, 0x5c, 0x06, 0x62, 0x06, 0x68, 0x06, 0x6e, 0x06, 0x74, 0x06, 0x7a, 0x06, 0x80, 0x06, 0x86, 0x06, 0x8c, 0x06, 0x92, 0x06, 0x98, 0x06, 0x9e, 0x06, 0xa4, 0x06, 0xaa, 0x06, 0xb0, 0x06, 0xb6, 0x06, 0xbc, 0x06, 0xc2, 0x06, 0xc8, 0x06, 0xce, 0x06, 0xd4, 0x06, 0xda, 0x06, 0xe0, 0x06, 0xe6, 0x06, 0xec, 0x06, 0xf2, 0x06, 0xf8, 0x06, 0xfe, 0x07, 0x04, 0x07, 0x0a, 0x07, 0x10, 0x07, 0x16, 0x07, 0x1c, 0x07, 0x22, 0x07, 0x28, 0x07, 0x2e, 0x07, 0x34, 0x07, 0x3a, 0x07, 0x40, 0x07, 0x46, 0x07, 0x4c, 0x07, 0x52, 0x07, 0x58, 0x07, 0x5e, 0x07, 0x64, 0x07, 0x6a, 0x07, 0x70, 0x07, 0x76, 0x07, 0x7c, 0x07, 0x82, 0x07, 0x88, 0x07, 0x8e, 0x07, 0x94, 0x07, 0x9a, 0x07, 0xa0, 0x07, 0xa6, 0x07, 0xac, 0x07, 0xb2, 0x07, 0xb8, 0x07, 0xbe, 0x07, 0xc4, 0x07, 0xca, 0x07, 0xd0, 0x07, 0xd6, 0x07, 0xdc, 0x07, 0xe2, 0x07, 0xe8, 0x07, 0xee, 0x07, 0xf4, 0x07, 0xfa, 0x08, 0x00, 0x08, 0x06, 0x08, 0x0c, 0x08, 0x12, 0x08, 0x18, 0x08, 0x1e, 0x08, 0x24, 0x08, 0x2a, 0x08, 0x30, 0x08, 0x36, 0x08, 0x3c, 0x08, 0x42, 0x08, 0x48, 0x08, 0x4e, 0x08, 0x54, 0x08, 0x5a, 0x08, 0x60, 0x08, 0x66, 0x08, 0x6c, 0x08, 0x72, 0x08, 0x78, 0x08, 0x7e, 0x08, 0x84, 0x08, 0x8a, 0x08, 0x90, 0x08, 0x96, 0x08, 0x9c, 0x08, 0xa2, 0x08, 0xa8, 0x08, 0xae, 0x08, 0xb4, 0x08, 0xba, 0x08, 0xc0, 0x08, 0xc6, 0x08, 0xcc, 0x08, 0xd2, 0x08, 0xd8, 0x08, 0xde, 0x08, 0xe4, 0x08, 0xea, 0x08, 0xf0, 0x08, 0xf6, 0x08, 0xfc, 0x09, 0x02, 0x09, 0x08, 0x09, 0x0e, 0x09, 0x14, 0x09, 0x1a, 0x09, 0x20, 0x09, 0x26, 0x09, 0x2c, 0x09, 0x32, 0x09, 0x38, 0x09, 0x3e, 0x09, 0x44, 0x09, 0x4a, 0x09, 0x50, 0x09, 0x56, 0x09, 0x5c, 0x09, 0x62, 0x09, 0x68, 0x09, 0x6e, 0x09, 0x74, 0x09, 0x7a, 0x09, 0x80, 0x09, 0x86, 0x09, 0x8c, 0x09, 0x92, 0x09, 0x98, 0x09, 0x9e, 0x09, 0xa4, 0x09, 0xaa, 0x09, 0xb0, 0x09, 0xb6, 0x09, 0xbc, 0x09, 0xc2, 0x09, 0xc8, 0x09, 0xce, 0x09, 0xd4, 0x09, 0xda, 0x09, 0xe0, 0x09, 0xe6, 0x09, 0xec, 0x09, 0xf2, 0x09, 0xf8, 0x09, 0xfe, 0x0a, 0x04, 0x0a, 0x0a, 0x0a, 0x10, 0x0a, 0x16, 0x0a, 0x1c, 0x0a, 0x22, 0x0a, 0x28, 0x0a, 0x2e, 0x0a, 0x34, 0x0a, 0x3a, 0x0a, 0x40, 0x0a, 0x46, 0x0a, 0x4c, 0x0a, 0x52, 0x0a, 0x58, 0x0a, 0x5e, 0x0a, 0x64, 0x0a, 0x6a, 0x0a, 0x70, 0x0a, 0x76, 0x0a, 0x7c, 0x0a, 0x82, 0x0a, 0x88, 0x0a, 0x8e, 0x0a, 0x94, 0x0a, 0x9a, 0x0a, 0xa0, 0x0a, 0xa6, 0x0a, 0xac, 0x0a, 0xb2, 0x0a, 0xb8, 0x0a, 0xbe, 0x0a, 0xc4, 0x0a, 0xca, 0x0a, 0xd0, 0x0a, 0xd6, 0x0a, 0xdc, 0x0a, 0xe2, 0x0a, 0xe8, 0x0a, 0xee, 0x0a, 0xf4, 0x0a, 0xfa, 0x0b, 0x00, 0x0b, 0x06, 0x0b, 0x0c, 0x0b, 0x12, 0x0b, 0x18, 0x0b, 0x1e, 0x0b, 0x24, 0x0b, 0x2a, 0x0b, 0x30, 0x0b, 0x36, 0x0b, 0x3c, 0x0b, 0x42, 0x0b, 0x48, 0x0b, 0x4e, 0x0b, 0x54, 0x0b, 0x5a, 0x0b, 0x60, 0x0b, 0x66, 0x0b, 0x6c, 0x0b, 0x72, 0x0b, 0x78, 0x0b, 0x7e, 0x0b, 0x84, 0x0b, 0x8a, 0x0b, 0x90, 0x0b, 0x96, 0x0b, 0x9c, 0x0b, 0xa2, 0x0b, 0xa8, 0x0b, 0xae, 0x0b, 0xb4, 0x0b, 0xba, 0x0b, 0xc0, 0x0b, 0xc6, 0x0b, 0xcc, 0x0b, 0xd2, 0x0b, 0xd8, 0x0b, 0xde, 0x0b, 0xe4, 0x0b, 0xea, 0x0b, 0xf0, 0x0b, 0xf6, 0x0b, 0xfc, 0x0c, 0x02, 0x0c, 0x08, 0x0c, 0x0e, 0x0c, 0x14, 0x0c, 0x1a, 0x0c, 0x20, 0x0c, 0x26, 0x0c, 0x2c, 0x0c, 0x32, 0x0c, 0x38, 0x0c, 0x3e, 0x0c, 0x44, 0x0c, 0x4a, 0x0c, 0x50, 0x0c, 0x56, 0x0c, 0x5c, 0x0c, 0x62, 0x0c, 0x68, 0x0c, 0x6e, 0x0c, 0x74, 0x0c, 0x7a, 0x0c, 0x80, 0x0c, 0x86, 0x0c, 0x8c, 0x0c, 0x92, 0x0c, 0x98, 0x0c, 0x9e, 0x0c, 0xa4, 0x0c, 0xaa, 0x0c, 0xb0, 0x0c, 0xb6, 0x0c, 0xbc, 0x0c, 0xc2, 0x0c, 0xc8, 0x0c, 0xce, 0x0c, 0xd4, 0x0c, 0xda, 0x0c, 0xe0, 0x0c, 0xe6, 0x0c, 0xec, 0x0c, 0xf2, 0x0c, 0xf8, 0x0c, 0xfe, 0x0d, 0x04, 0x0d, 0x0a, 0x0d, 0x10, 0x0d, 0x16, 0x0d, 0x1c, 0x0d, 0x22, 0x0d, 0x28, 0x0d, 0x2e, 0x0d, 0x34, 0x0d, 0x3a, 0x0d, 0x40, 0x0d, 0x46, 0x0d, 0x4c, 0x0d, 0x52, 0x0d, 0x58, 0x0d, 0x5e, 0x0d, 0x64, 0x0d, 0x6a, 0x0d, 0x70, 0x0d, 0x76, 0x0d, 0x7c, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf7, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x56, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x51, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x03, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x85, 0x00, 0x00, 0x00, 0x01, 0x02, 0x33, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x71, 0x00, 0x00, 0x00, 0x01, 0x02, 0x60, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x03, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0xee, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x01, 0x02, 0x23, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x03, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x04, 0x7f, 0xfe, 0x80, 0x00, 0x01, 0x03, 0x6f, 0xfe, 0x80, 0x00, 0x01, 0x02, 0xa1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0x88, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x48, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x71, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x17, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x7a, 0x00, 0x01, 0x02, 0x23, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x52, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x33, 0x00, 0x00, 0x00, 0x01, 0x02, 0x23, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x46, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x01, 0x95, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x2c, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x2c, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x25, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xec, 0x00, 0x00, 0x00, 0x01, 0x01, 0x59, 0x00, 0x00, 0x00, 0x01, 0x01, 0x70, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xa3, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x84, 0x00, 0x00, 0x00, 0x01, 0x03, 0x84, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x84, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x48, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x48, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x48, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x04, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xff, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x24, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x35, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x15, 0x00, 0x00, 0x00, 0x01, 0x01, 0xef, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xbf, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xd9, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xc2, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0x26, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x24, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5f, 0xff, 0xf6, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x66, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x22, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x97, 0x00, 0x00, 0x00, 0x01, 0x03, 0x97, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x97, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0xfe, 0x52, 0x00, 0x01, 0x04, 0x19, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3e, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x41, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x85, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x29, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xa1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa1, 0xfe, 0x89, 0x00, 0x01, 0x02, 0x28, 0xfe, 0x89, 0x00, 0x01, 0x02, 0xa1, 0xfe, 0xbf, 0x00, 0x01, 0x02, 0x28, 0xfe, 0xbf, 0x00, 0x01, 0x02, 0xa1, 0xfe, 0x74, 0x00, 0x01, 0x02, 0x28, 0xfe, 0x74, 0x00, 0x01, 0x02, 0xa1, 0xfe, 0x15, 0x00, 0x01, 0x02, 0x28, 0xfe, 0x15, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x03, 0x37, 0x00, 0x00, 0x00, 0x01, 0x01, 0xb7, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf7, 0x00, 0x00, 0x00, 0x01, 0x03, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x02, 0xfd, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0xda, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0xda, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe2, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd3, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xbf, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x03, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x03, 0x3c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0xad, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3a, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe2, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x03, 0x33, 0x00, 0x00, 0x00, 0x01, 0x03, 0xde, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc1, 0x00, 0x08, 0x00, 0x01, 0x02, 0x5a, 0x00, 0x07, 0x00, 0x01, 0x01, 0x56, 0x00, 0x00, 0x00, 0x01, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x03, 0x09, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xaf, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x71, 0x00, 0x00, 0x00, 0x01, 0x02, 0x56, 0x00, 0x00, 0x00, 0x01, 0x02, 0x56, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1a, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7c, 0xff, 0xe4, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x03, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x51, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x77, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xb5, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x48, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x1e, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x5b, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x0f, 0xfe, 0x56, 0x00, 0x01, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x03, 0xc5, 0x00, 0x00, 0x00, 0x01, 0x03, 0x74, 0x00, 0x00, 0x00, 0x01, 0x04, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x03, 0x96, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x03, 0x96, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1d, 0xff, 0xf6, 0x00, 0x01, 0x03, 0x96, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1d, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x69, 0x00, 0x00, 0x00, 0x01, 0x03, 0x39, 0x00, 0x00, 0x00, 0x01, 0x01, 0x69, 0x00, 0x00, 0x00, 0x01, 0x02, 0x83, 0x00, 0x00, 0x00, 0x01, 0x01, 0x83, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x02, 0x85, 0x00, 0x00, 0x00, 0x01, 0x04, 0xe3, 0x00, 0x00, 0x00, 0x01, 0x03, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x63, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xab, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xbe, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xc4, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x51, 0x00, 0x00, 0x00, 0x01, 0x01, 0xee, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x03, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x11, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x04, 0x51, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb9, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb9, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x01, 0x01, 0x69, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x03, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x40, 0x00, 0x00, 0x00, 0x01, 0x02, 0x8c, 0x00, 0x00, 0x00, 0x01, 0x02, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x02, 0x9a, 0x00, 0x00, 0x00, 0x01, 0x04, 0x05, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x8b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x6e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x37, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x62, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x01, 0x99, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0xfe, 0x52, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3d, 0x00, 0x0a, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x24, 0x00, 0x8e, 0x00, 0x91, 0x00, 0x3e, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x42, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0x43, 0x00, 0xae, 0x00, 0xb2, 0x00, 0x44, 0x00, 0xba, 0x00, 0xba, 0x00, 0x49, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x4a, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0x4b, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x4d, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0x4f, 0x00, 0xe9, 0x00, 0xef, 0x00, 0x50, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x57, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x59, 0x01, 0x0d, 0x01, 0x0d, 0x00, 0x5a, 0x01, 0x0f, 0x01, 0x0f, 0x00, 0x5b, 0x01, 0x28, 0x01, 0x29, 0x00, 0x5c, 0x01, 0x2d, 0x01, 0x2d, 0x00, 0x5e, 0x01, 0x41, 0x01, 0x41, 0x00, 0x5f, 0x01, 0x45, 0x01, 0x45, 0x00, 0x60, 0x01, 0x48, 0x01, 0x48, 0x00, 0x61, 0x01, 0x4e, 0x01, 0x4e, 0x00, 0x62, 0x01, 0x51, 0x01, 0x52, 0x00, 0x63, 0x01, 0x54, 0x01, 0x54, 0x00, 0x65, 0x01, 0x59, 0x01, 0x59, 0x00, 0x66, 0x01, 0x61, 0x01, 0x61, 0x00, 0x67, 0x01, 0x6c, 0x01, 0x6c, 0x00, 0x68, 0x01, 0x76, 0x01, 0x76, 0x00, 0x69, 0x01, 0x79, 0x01, 0x7b, 0x00, 0x6a, 0x01, 0x91, 0x01, 0x92, 0x00, 0x6d, 0x01, 0xca, 0x01, 0xcd, 0x00, 0x6f, 0x01, 0xf6, 0x01, 0xf8, 0x00, 0x73, 0x02, 0x05, 0x02, 0x0c, 0x00, 0x76, 0x02, 0x0e, 0x02, 0x4a, 0x00, 0x7e, 0x02, 0x4c, 0x02, 0x67, 0x00, 0xbb, 0x02, 0x69, 0x02, 0x6b, 0x00, 0xd7, 0x02, 0x6d, 0x02, 0x6d, 0x00, 0xda, 0x03, 0x46, 0x03, 0x46, 0x00, 0xdb, 0x03, 0x49, 0x03, 0x49, 0x00, 0xdc, 0x03, 0x4c, 0x03, 0x4c, 0x00, 0xdd, 0x03, 0x88, 0x03, 0x88, 0x00, 0xde, 0x03, 0x9a, 0x03, 0x9a, 0x00, 0xdf, 0x03, 0xea, 0x03, 0xeb, 0x00, 0xe0, 0x04, 0x06, 0x04, 0x07, 0x00, 0xe2, 0x04, 0x22, 0x04, 0x22, 0x00, 0xe4, 0x04, 0x33, 0x04, 0x33, 0x00, 0xe5, 0x04, 0x36, 0x04, 0x36, 0x00, 0xe6, 0x04, 0x7c, 0x04, 0x7d, 0x00, 0xe7, 0x04, 0xba, 0x04, 0xbb, 0x00, 0xe9, 0x04, 0xbd, 0x04, 0xc2, 0x00, 0xeb, 0x04, 0xc5, 0x04, 0xcd, 0x00, 0xf1, 0x04, 0xd1, 0x04, 0xd5, 0x00, 0xfa, 0x04, 0xd9, 0x04, 0xde, 0x00, 0xff, 0x05, 0x23, 0x05, 0x23, 0x01, 0x05, 0x05, 0x5a, 0x05, 0x63, 0x01, 0x06, 0x05, 0x7e, 0x05, 0x7f, 0x01, 0x10, 0x06, 0x18, 0x06, 0x19, 0x01, 0x12, 0x06, 0x4a, 0x06, 0x4b, 0x01, 0x14, 0x07, 0xec, 0x07, 0xec, 0x01, 0x16, 0x07, 0xf4, 0x07, 0xf7, 0x01, 0x17, 0x07, 0xf9, 0x07, 0xfb, 0x01, 0x1b, 0x07, 0xfe, 0x07, 0xfe, 0x01, 0x1e, 0x08, 0x01, 0x08, 0x06, 0x01, 0x1f, 0x08, 0x0d, 0x08, 0x0d, 0x01, 0x25, 0x08, 0x11, 0x08, 0x11, 0x01, 0x26, 0x08, 0x15, 0x08, 0x16, 0x01, 0x27, 0x08, 0x18, 0x08, 0x1a, 0x01, 0x29, 0x08, 0x1c, 0x08, 0x1c, 0x01, 0x2c, 0x08, 0x1e, 0x08, 0x22, 0x01, 0x2d, 0x08, 0x25, 0x08, 0x28, 0x01, 0x32, 0x0a, 0x1d, 0x0a, 0x1d, 0x01, 0x36, 0x0e, 0x2b, 0x0e, 0x2b, 0x01, 0x37, 0x0e, 0x2d, 0x0e, 0x2e, 0x01, 0x38, 0x0e, 0x30, 0x0e, 0x41, 0x01, 0x3a, 0x0e, 0x43, 0x0e, 0x45, 0x01, 0x4c, 0x0e, 0x48, 0x0e, 0x49, 0x01, 0x4f, 0x0e, 0x62, 0x0e, 0x65, 0x01, 0x51, 0x0e, 0x67, 0x0e, 0x68, 0x01, 0x55, 0x0e, 0x6a, 0x0e, 0x75, 0x01, 0x57, 0x0e, 0x78, 0x0e, 0x87, 0x01, 0x63, 0x0e, 0x8c, 0x0e, 0x8f, 0x01, 0x73, 0x0e, 0x95, 0x0e, 0xa8, 0x01, 0x77, 0x0f, 0x93, 0x0f, 0xa5, 0x01, 0x8b, 0x0f, 0xbd, 0x0f, 0xbd, 0x01, 0x9e, 0x0f, 0xbf, 0x0f, 0xbf, 0x01, 0x9f, 0x0f, 0xf4, 0x0f, 0xfd, 0x01, 0xa0, 0x11, 0x1c, 0x11, 0x1d, 0x01, 0xaa, 0x11, 0x34, 0x11, 0x34, 0x01, 0xac, 0x11, 0x3e, 0x11, 0x3e, 0x01, 0xad, 0x11, 0x48, 0x11, 0x48, 0x01, 0xae, 0x11, 0xb8, 0x11, 0xb8, 0x01, 0xaf, 0x00, 0x02, 0x00, 0x09, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x00, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x04, 0x02, 0xd4, 0x02, 0xd7, 0x00, 0x09, 0x02, 0xda, 0x02, 0xe4, 0x00, 0x0d, 0x02, 0xea, 0x02, 0xed, 0x00, 0x18, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x1c, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x00, 0x21, 0x03, 0x06, 0x03, 0x06, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0x36, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x01, 0x4e, 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x01, 0x5a, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x35, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0x15, 0x68, 0x12, 0xca, 0x00, 0x01, 0x15, 0xb4, 0x00, 0x0c, 0x02, 0x53, 0x04, 0xa8, 0x04, 0xae, 0x04, 0xb4, 0x04, 0xba, 0x04, 0xc0, 0x04, 0xc6, 0x04, 0xcc, 0x04, 0xd2, 0x04, 0xd8, 0x04, 0xde, 0x04, 0xe4, 0x04, 0xea, 0x04, 0xf0, 0x04, 0xf6, 0x04, 0xfc, 0x05, 0x02, 0x05, 0x08, 0x05, 0x0e, 0x05, 0x14, 0x05, 0x1a, 0x05, 0x20, 0x05, 0x26, 0x05, 0x2c, 0x05, 0x32, 0x05, 0x38, 0x05, 0x3e, 0x05, 0x44, 0x05, 0x4a, 0x05, 0x50, 0x05, 0x56, 0x05, 0x5c, 0x05, 0x62, 0x05, 0x68, 0x05, 0x6e, 0x05, 0x74, 0x05, 0x7a, 0x05, 0x80, 0x05, 0x88, 0x05, 0x8e, 0x05, 0x96, 0x05, 0x9c, 0x05, 0xa4, 0x05, 0xaa, 0x05, 0xb0, 0x05, 0xb6, 0x05, 0xbc, 0x05, 0xc2, 0x05, 0xc8, 0x05, 0xce, 0x05, 0xd4, 0x05, 0xda, 0x05, 0xe2, 0x05, 0xe8, 0x05, 0xee, 0x05, 0xf4, 0x05, 0xfa, 0x06, 0x00, 0x06, 0x08, 0x06, 0x0e, 0x06, 0x14, 0x06, 0x1a, 0x06, 0x20, 0x06, 0x26, 0x06, 0x2c, 0x06, 0x32, 0x06, 0x38, 0x06, 0x3e, 0x06, 0x46, 0x06, 0x4c, 0x06, 0x52, 0x06, 0x5a, 0x06, 0x60, 0x06, 0x66, 0x06, 0x6c, 0x06, 0x74, 0x06, 0x7a, 0x06, 0x80, 0x06, 0x86, 0x06, 0x8c, 0x06, 0x92, 0x06, 0x98, 0x06, 0x9e, 0x06, 0xa4, 0x06, 0xaa, 0x06, 0xb0, 0x06, 0xb6, 0x06, 0xbc, 0x06, 0xc2, 0x06, 0xc8, 0x06, 0xce, 0x06, 0xd4, 0x06, 0xda, 0x06, 0xe0, 0x06, 0xe6, 0x06, 0xec, 0x06, 0xf2, 0x06, 0xf8, 0x06, 0xfe, 0x07, 0x04, 0x07, 0x0a, 0x07, 0x10, 0x07, 0x16, 0x07, 0x1c, 0x07, 0x22, 0x07, 0x28, 0x07, 0x2e, 0x07, 0x34, 0x07, 0x3a, 0x07, 0x40, 0x07, 0x46, 0x07, 0x4c, 0x07, 0x52, 0x07, 0x58, 0x07, 0x5e, 0x07, 0x64, 0x07, 0x6a, 0x07, 0x70, 0x07, 0x76, 0x07, 0x7c, 0x07, 0x82, 0x07, 0x88, 0x07, 0x8e, 0x07, 0x94, 0x07, 0x9a, 0x07, 0xa0, 0x07, 0xa6, 0x07, 0xac, 0x07, 0xb2, 0x07, 0xb8, 0x07, 0xbe, 0x07, 0xc4, 0x07, 0xca, 0x07, 0xd0, 0x07, 0xd6, 0x07, 0xdc, 0x07, 0xe2, 0x07, 0xe8, 0x07, 0xee, 0x07, 0xf6, 0x07, 0xfc, 0x08, 0x02, 0x08, 0x08, 0x08, 0x0e, 0x08, 0x14, 0x08, 0x1a, 0x08, 0x22, 0x08, 0x28, 0x08, 0x2e, 0x08, 0x34, 0x08, 0x3a, 0x08, 0x40, 0x08, 0x46, 0x08, 0x4c, 0x08, 0x52, 0x08, 0x58, 0x08, 0x5e, 0x08, 0x64, 0x08, 0x6a, 0x08, 0x70, 0x08, 0x76, 0x08, 0x7c, 0x08, 0x82, 0x08, 0x88, 0x08, 0x8e, 0x08, 0x94, 0x08, 0x9a, 0x08, 0xa0, 0x08, 0xa6, 0x08, 0xac, 0x08, 0xb2, 0x08, 0xb8, 0x08, 0xc0, 0x08, 0xc6, 0x08, 0xcc, 0x08, 0xd2, 0x08, 0xd8, 0x08, 0xde, 0x08, 0xe4, 0x08, 0xea, 0x08, 0xf0, 0x08, 0xf6, 0x08, 0xfc, 0x09, 0x02, 0x09, 0x08, 0x09, 0x0e, 0x09, 0x14, 0x09, 0x1a, 0x09, 0x20, 0x09, 0x26, 0x09, 0x2c, 0x09, 0x32, 0x09, 0x38, 0x09, 0x3e, 0x09, 0x44, 0x09, 0x4a, 0x09, 0x50, 0x09, 0x56, 0x09, 0x5c, 0x09, 0x62, 0x09, 0x68, 0x09, 0x6e, 0x09, 0x74, 0x09, 0x7a, 0x09, 0x80, 0x09, 0x86, 0x09, 0x8c, 0x09, 0x92, 0x09, 0x98, 0x09, 0x9e, 0x09, 0xa4, 0x09, 0xaa, 0x09, 0xb0, 0x09, 0xb6, 0x09, 0xbc, 0x09, 0xc2, 0x09, 0xc8, 0x09, 0xce, 0x09, 0xd4, 0x09, 0xda, 0x09, 0xe0, 0x09, 0xe6, 0x09, 0xec, 0x09, 0xf2, 0x09, 0xf8, 0x09, 0xfe, 0x0a, 0x04, 0x0a, 0x0a, 0x0a, 0x12, 0x0a, 0x18, 0x0a, 0x1e, 0x0a, 0x24, 0x0a, 0x2a, 0x0a, 0x30, 0x0a, 0x36, 0x0a, 0x3c, 0x0a, 0x42, 0x0a, 0x48, 0x0a, 0x4e, 0x0a, 0x54, 0x0a, 0x5a, 0x0a, 0x60, 0x0a, 0x66, 0x0a, 0x6c, 0x0a, 0x72, 0x0a, 0x78, 0x0a, 0x7e, 0x0a, 0x84, 0x0a, 0x8a, 0x0a, 0x90, 0x0a, 0x96, 0x0a, 0x9c, 0x0a, 0xa2, 0x0a, 0xa8, 0x0a, 0xae, 0x0a, 0xb4, 0x0a, 0xba, 0x0a, 0xc0, 0x0a, 0xc6, 0x0a, 0xcc, 0x0a, 0xd2, 0x0a, 0xd8, 0x0a, 0xde, 0x0a, 0xe4, 0x0a, 0xea, 0x0a, 0xf0, 0x0a, 0xf6, 0x0a, 0xfc, 0x0b, 0x02, 0x0b, 0x08, 0x0b, 0x0e, 0x0b, 0x14, 0x0b, 0x1a, 0x0b, 0x20, 0x0b, 0x26, 0x0b, 0x2c, 0x0b, 0x32, 0x0b, 0x38, 0x0b, 0x3e, 0x0b, 0x44, 0x0b, 0x4a, 0x0b, 0x50, 0x0b, 0x56, 0x0b, 0x5c, 0x0b, 0x62, 0x0b, 0x68, 0x0b, 0x6e, 0x0b, 0x74, 0x0b, 0x7a, 0x0b, 0x80, 0x0b, 0x86, 0x0b, 0x8c, 0x0b, 0x92, 0x0b, 0x98, 0x0b, 0x9e, 0x0b, 0xa4, 0x0b, 0xaa, 0x0b, 0xb0, 0x0b, 0xb6, 0x0b, 0xbc, 0x0b, 0xc2, 0x0b, 0xc8, 0x0b, 0xce, 0x0b, 0xd4, 0x0b, 0xda, 0x0b, 0xe0, 0x0b, 0xe6, 0x0b, 0xec, 0x0b, 0xf2, 0x0b, 0xf8, 0x0b, 0xfe, 0x0c, 0x04, 0x0c, 0x0a, 0x0c, 0x10, 0x0c, 0x16, 0x0c, 0x1c, 0x0c, 0x22, 0x0c, 0x28, 0x0c, 0x2e, 0x0c, 0x34, 0x0c, 0x3a, 0x0c, 0x40, 0x0c, 0x46, 0x0c, 0x4c, 0x0c, 0x52, 0x0c, 0x58, 0x0c, 0x5e, 0x0c, 0x64, 0x0c, 0x6a, 0x0c, 0x70, 0x0c, 0x76, 0x0c, 0x7c, 0x0c, 0x82, 0x0c, 0x88, 0x0c, 0x8e, 0x0c, 0x94, 0x0c, 0x9a, 0x0c, 0xa0, 0x0c, 0xa6, 0x0c, 0xac, 0x0c, 0xb2, 0x0c, 0xb8, 0x0c, 0xbe, 0x0c, 0xc4, 0x0c, 0xca, 0x0c, 0xd0, 0x0c, 0xd6, 0x0c, 0xdc, 0x0c, 0xe2, 0x0c, 0xe8, 0x0c, 0xee, 0x0c, 0xf4, 0x0c, 0xfa, 0x0d, 0x00, 0x0d, 0x06, 0x0d, 0x0c, 0x0d, 0x12, 0x0d, 0x18, 0x0d, 0x1e, 0x0d, 0x24, 0x0d, 0x2a, 0x0d, 0x30, 0x0d, 0x36, 0x0d, 0x3c, 0x0d, 0x42, 0x0d, 0x48, 0x0d, 0x4e, 0x0d, 0x54, 0x0d, 0x5a, 0x0d, 0x60, 0x0d, 0x66, 0x0d, 0x6c, 0x0d, 0x72, 0x0d, 0x78, 0x0d, 0x7e, 0x0d, 0x84, 0x0d, 0x8a, 0x0d, 0x90, 0x0d, 0x96, 0x0d, 0x9c, 0x0d, 0xa2, 0x0d, 0xa8, 0x0d, 0xae, 0x0d, 0xb4, 0x0d, 0xba, 0x0d, 0xc0, 0x0d, 0xc6, 0x0d, 0xcc, 0x0d, 0xd2, 0x0d, 0xd8, 0x0d, 0xde, 0x0d, 0xe4, 0x0d, 0xea, 0x0d, 0xf0, 0x0d, 0xf6, 0x0d, 0xfc, 0x0e, 0x02, 0x0e, 0x08, 0x0e, 0x0e, 0x0e, 0x14, 0x0e, 0x1a, 0x0e, 0x20, 0x0e, 0x26, 0x0e, 0x2c, 0x0e, 0x32, 0x0e, 0x38, 0x0e, 0x3e, 0x0e, 0x44, 0x0e, 0x4a, 0x0e, 0x50, 0x0e, 0x56, 0x0e, 0x5c, 0x0e, 0x62, 0x0e, 0x68, 0x0e, 0x6e, 0x0e, 0x74, 0x0e, 0x7a, 0x0e, 0x80, 0x0e, 0x86, 0x0e, 0x8c, 0x0e, 0x92, 0x0e, 0x98, 0x0e, 0x9e, 0x0e, 0xa4, 0x0e, 0xaa, 0x0e, 0xb0, 0x0e, 0xb6, 0x0e, 0xbc, 0x0e, 0xc2, 0x0e, 0xc8, 0x0e, 0xce, 0x0e, 0xd4, 0x0e, 0xda, 0x0e, 0xe2, 0x0e, 0xe8, 0x0e, 0xee, 0x0e, 0xf4, 0x0e, 0xfa, 0x0f, 0x00, 0x0f, 0x06, 0x0f, 0x0c, 0x0f, 0x12, 0x0f, 0x18, 0x0f, 0x1e, 0x0f, 0x26, 0x0f, 0x2c, 0x0f, 0x32, 0x0f, 0x38, 0x0f, 0x3e, 0x0f, 0x44, 0x0f, 0x4a, 0x0f, 0x50, 0x0f, 0x56, 0x0f, 0x5c, 0x0f, 0x62, 0x0f, 0x68, 0x0f, 0x6e, 0x0f, 0x74, 0x0f, 0x7a, 0x0f, 0x80, 0x0f, 0x86, 0x0f, 0x8c, 0x0f, 0x92, 0x0f, 0x98, 0x0f, 0x9e, 0x0f, 0xa4, 0x0f, 0xaa, 0x0f, 0xb0, 0x0f, 0xb6, 0x0f, 0xbc, 0x0f, 0xc2, 0x0f, 0xc8, 0x0f, 0xce, 0x0f, 0xd4, 0x0f, 0xda, 0x0f, 0xe0, 0x0f, 0xe6, 0x0f, 0xec, 0x0f, 0xf2, 0x0f, 0xf8, 0x0f, 0xfe, 0x10, 0x04, 0x10, 0x0a, 0x10, 0x10, 0x10, 0x16, 0x10, 0x1c, 0x10, 0x22, 0x10, 0x28, 0x10, 0x2e, 0x10, 0x34, 0x10, 0x3a, 0x10, 0x40, 0x10, 0x46, 0x10, 0x4c, 0x10, 0x52, 0x10, 0x58, 0x10, 0x5e, 0x10, 0x64, 0x10, 0x6a, 0x10, 0x72, 0x10, 0x78, 0x10, 0x7e, 0x10, 0x84, 0x10, 0x8a, 0x10, 0x90, 0x10, 0x96, 0x10, 0x9c, 0x10, 0xa2, 0x10, 0xa8, 0x10, 0xae, 0x10, 0xb4, 0x10, 0xba, 0x10, 0xc0, 0x10, 0xc6, 0x10, 0xcc, 0x10, 0xd2, 0x10, 0xd8, 0x10, 0xde, 0x10, 0xe4, 0x10, 0xea, 0x10, 0xf2, 0x10, 0xf8, 0x10, 0xfe, 0x11, 0x04, 0x11, 0x0a, 0x11, 0x10, 0x11, 0x16, 0x11, 0x1c, 0x11, 0x22, 0x11, 0x28, 0x11, 0x2e, 0x11, 0x34, 0x11, 0x3c, 0x11, 0x42, 0x11, 0x48, 0x11, 0x4e, 0x11, 0x54, 0x11, 0x5a, 0x11, 0x60, 0x11, 0x66, 0x11, 0x6c, 0x11, 0x72, 0x11, 0x78, 0x11, 0x7e, 0x11, 0x84, 0x11, 0x8a, 0x11, 0x90, 0x11, 0x96, 0x11, 0x9c, 0x11, 0xa2, 0x11, 0xa8, 0x11, 0xae, 0x11, 0xb4, 0x11, 0xba, 0x11, 0xc0, 0x11, 0xc6, 0x11, 0xcc, 0x11, 0xd2, 0x11, 0xd8, 0x11, 0xde, 0x11, 0xe4, 0x11, 0xea, 0x11, 0xf0, 0x11, 0xf6, 0x11, 0xfc, 0x12, 0x02, 0x12, 0x08, 0x12, 0x0e, 0x12, 0x14, 0x12, 0x1a, 0x12, 0x20, 0x12, 0x26, 0x12, 0x2c, 0x12, 0x32, 0x12, 0x38, 0x12, 0x3e, 0x12, 0x44, 0x12, 0x4a, 0x12, 0x50, 0x12, 0x56, 0x12, 0x5c, 0x12, 0x62, 0x12, 0x68, 0x12, 0x6e, 0x12, 0x74, 0x12, 0x7a, 0x12, 0x80, 0x12, 0x86, 0x12, 0x8c, 0x12, 0x92, 0x12, 0x98, 0x12, 0x9e, 0x12, 0xa4, 0x12, 0xaa, 0x12, 0xb0, 0x12, 0xb6, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf7, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x06, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x8f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x85, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x33, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7b, 0x00, 0x23, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x60, 0x04, 0x7b, 0x00, 0x17, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x53, 0x04, 0x7b, 0x00, 0x12, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x2c, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x02, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x0c, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x30, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x14, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xf3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x23, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x7f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x1a, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7b, 0x00, 0x23, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x4c, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x2f, 0x05, 0xf0, 0x00, 0x02, 0x01, 0x00, 0x04, 0x7b, 0x00, 0x04, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xab, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf7, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x7d, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x1b, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x06, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x78, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfb, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x41, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x79, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x63, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x33, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x53, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x47, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xf3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x33, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x46, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x8d, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x02, 0x01, 0x9f, 0x04, 0x7b, 0x00, 0x03, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x16, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x16, 0x04, 0x7b, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7c, 0x00, 0x08, 0x00, 0x01, 0x02, 0x06, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x06, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x2c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x2c, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x01, 0x06, 0x2f, 0x00, 0x01, 0x00, 0xec, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x59, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x70, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xcb, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x02, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x0e, 0x00, 0x01, 0x04, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x9e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xfa, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xfa, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x24, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x31, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x5b, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x01, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x15, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xbf, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xd9, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xf3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x26, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x84, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x01, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x84, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x01, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x24, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x0d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5f, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x02, 0x66, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x2c, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x84, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x01, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf3, 0x05, 0xf0, 0x00, 0x01, 0x04, 0x19, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd0, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x0f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7c, 0x00, 0x08, 0x00, 0x01, 0x02, 0x0a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xf4, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x46, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe0, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x0a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x31, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x2c, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe4, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x65, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x60, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x07, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x07, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xc0, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xf4, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x05, 0xf0, 0x00, 0x01, 0x04, 0x59, 0x05, 0xf0, 0x00, 0x01, 0x04, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x56, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xe0, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x23, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf7, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x30, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x18, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x85, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x6d, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xd9, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xd9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x2c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x13, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x96, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x58, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x24, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x0a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xaa, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x3e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x06, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xac, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb7, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x23, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x13, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x10, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xd2, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xcd, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x86, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xaa, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x03, 0x94, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x8d, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x15, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x5c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x07, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xc1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0c, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xaa, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x2a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd1, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xe0, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x3a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xda, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xe0, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x3a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xc5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd4, 0x05, 0xfa, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xcf, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x52, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xe0, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x3e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xb1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x10, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb7, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x0a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x85, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xac, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xac, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe4, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xab, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x83, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x06, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfc, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb7, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x85, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x76, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x76, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x76, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xab, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe0, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x4e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x4e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x29, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xf3, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xcb, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfc, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xac, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x37, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xb7, 0x05, 0xf0, 0x00, 0x02, 0x02, 0xf7, 0x05, 0xf0, 0x00, 0x16, 0x00, 0x01, 0x03, 0xd5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x98, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xa7, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x94, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xda, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xe2, 0x05, 0xe2, 0x00, 0x01, 0x02, 0xd3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xbf, 0x05, 0xf0, 0x00, 0x02, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x0c, 0x00, 0x01, 0x03, 0x2a, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x3c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x08, 0x05, 0xe2, 0x00, 0x01, 0x02, 0xad, 0x05, 0xe2, 0x00, 0x01, 0x02, 0x3a, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xe2, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x82, 0x04, 0x44, 0x00, 0x01, 0x02, 0x7f, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x33, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xde, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xc7, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x7f, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xc1, 0x05, 0xe7, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xe7, 0x00, 0x01, 0x01, 0x56, 0x06, 0x31, 0x00, 0x01, 0x02, 0xab, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x09, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xaf, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0e, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0c, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x7c, 0x05, 0xd3, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x8f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x65, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xa5, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7b, 0x00, 0x08, 0x00, 0x01, 0x01, 0xe3, 0x04, 0x7b, 0x00, 0x01, 0x04, 0x80, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x6f, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xc5, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x74, 0x04, 0x7b, 0x00, 0x01, 0x04, 0x4a, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x6f, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x96, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1d, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x96, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1d, 0x04, 0x71, 0x00, 0x01, 0x03, 0x96, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x01, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0c, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x39, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x83, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xe8, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x85, 0x04, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x04, 0xe3, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xaa, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x4c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x63, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x30, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xab, 0x05, 0xf0, 0x00, 0x02, 0x01, 0x00, 0x04, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa4, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x6d, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xc4, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x06, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x2c, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x11, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xfc, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x07, 0x88, 0x00, 0x01, 0x04, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xe9, 0x06, 0x04, 0x00, 0x01, 0x02, 0xb9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb9, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x06, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x68, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa8, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x8c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x9a, 0x05, 0xf0, 0x00, 0x01, 0x04, 0x05, 0x05, 0xf7, 0x00, 0x01, 0x02, 0xe6, 0x05, 0xf7, 0x00, 0x01, 0x02, 0x8b, 0x05, 0xf7, 0x00, 0x01, 0x02, 0x6e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x1f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x37, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x01, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x9f, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x99, 0x05, 0xf0, 0x00, 0x02, 0x03, 0x43, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3d, 0x00, 0x0a, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x24, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x3e, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0x3f, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x41, 0x00, 0xba, 0x00, 0xba, 0x00, 0x42, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x43, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0x44, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0x46, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0x47, 0x00, 0xf3, 0x00, 0xf3, 0x00, 0x49, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x4a, 0x01, 0x0d, 0x01, 0x0d, 0x00, 0x4b, 0x01, 0x15, 0x01, 0x15, 0x00, 0x4c, 0x01, 0x28, 0x01, 0x29, 0x00, 0x4d, 0x01, 0x35, 0x01, 0x35, 0x00, 0x4f, 0x01, 0x41, 0x01, 0x42, 0x00, 0x50, 0x01, 0x45, 0x01, 0x45, 0x00, 0x52, 0x01, 0x48, 0x01, 0x49, 0x00, 0x53, 0x01, 0x4e, 0x01, 0x4e, 0x00, 0x55, 0x01, 0x50, 0x01, 0x56, 0x00, 0x56, 0x01, 0x58, 0x01, 0x59, 0x00, 0x5d, 0x01, 0x5b, 0x01, 0x5d, 0x00, 0x5f, 0x01, 0x5f, 0x01, 0x5f, 0x00, 0x62, 0x01, 0x61, 0x01, 0x61, 0x00, 0x63, 0x01, 0x66, 0x01, 0x66, 0x00, 0x64, 0x01, 0x69, 0x01, 0x6a, 0x00, 0x65, 0x01, 0x6c, 0x01, 0x70, 0x00, 0x67, 0x01, 0x74, 0x01, 0x7b, 0x00, 0x6c, 0x01, 0xac, 0x01, 0xac, 0x00, 0x74, 0x01, 0xf6, 0x01, 0xf9, 0x00, 0x75, 0x02, 0x05, 0x02, 0x0c, 0x00, 0x79, 0x02, 0x0e, 0x02, 0x4a, 0x00, 0x81, 0x02, 0x4c, 0x02, 0x67, 0x00, 0xbe, 0x02, 0x69, 0x02, 0x6b, 0x00, 0xda, 0x02, 0x6d, 0x02, 0x6d, 0x00, 0xdd, 0x03, 0x45, 0x03, 0x5d, 0x00, 0xde, 0x03, 0x64, 0x03, 0x65, 0x00, 0xf7, 0x03, 0x69, 0x03, 0x69, 0x00, 0xf9, 0x03, 0x6b, 0x03, 0x6b, 0x00, 0xfa, 0x03, 0x6d, 0x03, 0x6d, 0x00, 0xfb, 0x03, 0x6f, 0x03, 0x6f, 0x00, 0xfc, 0x03, 0x77, 0x03, 0x77, 0x00, 0xfd, 0x03, 0x84, 0x03, 0x8a, 0x00, 0xfe, 0x03, 0x8c, 0x03, 0x8c, 0x01, 0x05, 0x03, 0x90, 0x03, 0x90, 0x01, 0x06, 0x03, 0x98, 0x03, 0x9a, 0x01, 0x07, 0x03, 0x9d, 0x03, 0x9e, 0x01, 0x0a, 0x03, 0xa3, 0x03, 0xac, 0x01, 0x0c, 0x03, 0xae, 0x03, 0xcc, 0x01, 0x16, 0x03, 0xce, 0x03, 0xe3, 0x01, 0x35, 0x03, 0xe8, 0x03, 0xef, 0x01, 0x4b, 0x03, 0xf3, 0x04, 0x01, 0x01, 0x53, 0x04, 0x04, 0x04, 0x09, 0x01, 0x62, 0x04, 0x22, 0x04, 0x23, 0x01, 0x68, 0x04, 0x2a, 0x04, 0x2b, 0x01, 0x6a, 0x04, 0x2e, 0x04, 0x36, 0x01, 0x6c, 0x04, 0x40, 0x04, 0x40, 0x01, 0x75, 0x04, 0x4d, 0x04, 0x4d, 0x01, 0x76, 0x04, 0x58, 0x04, 0x58, 0x01, 0x77, 0x04, 0x5e, 0x04, 0x5e, 0x01, 0x78, 0x04, 0x62, 0x04, 0x62, 0x01, 0x79, 0x04, 0x7c, 0x04, 0x7d, 0x01, 0x7a, 0x04, 0x8b, 0x04, 0x8b, 0x01, 0x7c, 0x04, 0x92, 0x04, 0x93, 0x01, 0x7d, 0x04, 0xa7, 0x04, 0xa7, 0x01, 0x7f, 0x04, 0xb2, 0x04, 0xb3, 0x01, 0x80, 0x04, 0xb5, 0x04, 0xb5, 0x01, 0x82, 0x04, 0xb7, 0x04, 0xb7, 0x01, 0x83, 0x04, 0xba, 0x04, 0xc2, 0x01, 0x84, 0x04, 0xc5, 0x04, 0xce, 0x01, 0x8d, 0x04, 0xd1, 0x04, 0xd5, 0x01, 0x97, 0x04, 0xd8, 0x04, 0xde, 0x01, 0x9c, 0x04, 0xe2, 0x04, 0xe2, 0x01, 0xa3, 0x05, 0x23, 0x05, 0x23, 0x01, 0xa4, 0x05, 0x5c, 0x05, 0x63, 0x01, 0xa5, 0x06, 0x4a, 0x06, 0x4b, 0x01, 0xad, 0x07, 0xec, 0x07, 0xec, 0x01, 0xaf, 0x07, 0xf4, 0x07, 0xf7, 0x01, 0xb0, 0x07, 0xf9, 0x07, 0xfb, 0x01, 0xb4, 0x07, 0xfe, 0x07, 0xfe, 0x01, 0xb7, 0x08, 0x01, 0x08, 0x06, 0x01, 0xb8, 0x08, 0x0d, 0x08, 0x0d, 0x01, 0xbe, 0x08, 0x11, 0x08, 0x11, 0x01, 0xbf, 0x08, 0x15, 0x08, 0x16, 0x01, 0xc0, 0x08, 0x18, 0x08, 0x1a, 0x01, 0xc2, 0x08, 0x1c, 0x08, 0x1c, 0x01, 0xc5, 0x08, 0x1e, 0x08, 0x22, 0x01, 0xc6, 0x08, 0x25, 0x08, 0x28, 0x01, 0xcb, 0x0a, 0x1d, 0x0a, 0x1d, 0x01, 0xcf, 0x0e, 0x2b, 0x0e, 0x45, 0x01, 0xd0, 0x0e, 0x48, 0x0e, 0x49, 0x01, 0xeb, 0x0e, 0x62, 0x0e, 0x65, 0x01, 0xed, 0x0e, 0x67, 0x0e, 0x68, 0x01, 0xf1, 0x0e, 0x6a, 0x0e, 0x75, 0x01, 0xf3, 0x0e, 0x78, 0x0e, 0x87, 0x01, 0xff, 0x0e, 0x89, 0x0e, 0x89, 0x02, 0x0f, 0x0e, 0x8b, 0x0e, 0x8f, 0x02, 0x10, 0x0e, 0x94, 0x0e, 0xa8, 0x02, 0x15, 0x0f, 0x93, 0x0f, 0xa5, 0x02, 0x2a, 0x0f, 0xbd, 0x0f, 0xbd, 0x02, 0x3d, 0x0f, 0xbf, 0x0f, 0xbf, 0x02, 0x3e, 0x0f, 0xf4, 0x0f, 0xfd, 0x02, 0x3f, 0x11, 0x1b, 0x11, 0x1d, 0x02, 0x49, 0x11, 0x34, 0x11, 0x34, 0x02, 0x4c, 0x11, 0x3e, 0x11, 0x3e, 0x02, 0x4d, 0x11, 0x42, 0x11, 0x42, 0x02, 0x4e, 0x11, 0x45, 0x11, 0x46, 0x02, 0x4f, 0x11, 0x48, 0x11, 0x48, 0x02, 0x51, 0x11, 0xb8, 0x11, 0xb8, 0x02, 0x52, 0x00, 0x02, 0x00, 0x0c, 0x02, 0xb1, 0x02, 0xc5, 0x00, 0x00, 0x02, 0xee, 0x02, 0xf3, 0x00, 0x15, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x1b, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x1c, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x1d, 0x03, 0x01, 0x03, 0x02, 0x00, 0x20, 0x03, 0x04, 0x03, 0x04, 0x00, 0x22, 0x04, 0x17, 0x04, 0x1b, 0x00, 0x23, 0x05, 0x4a, 0x05, 0x4f, 0x00, 0x28, 0x07, 0xe3, 0x07, 0xe9, 0x00, 0x2e, 0x10, 0xeb, 0x10, 0xf5, 0x00, 0x35, 0x11, 0xac, 0x11, 0xac, 0x00, 0x40, 0x00, 0x41, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x0e, 0x00, 0x00, 0x01, 0x16, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0x36, 0x00, 0x00, 0x01, 0x3e, 0x00, 0x00, 0x01, 0x46, 0x00, 0x00, 0x01, 0x4c, 0x00, 0x00, 0x01, 0x52, 0x00, 0x00, 0x01, 0x58, 0x00, 0x00, 0x01, 0x60, 0x00, 0x00, 0x01, 0x66, 0x00, 0x00, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x72, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x01, 0x7e, 0x00, 0x00, 0x01, 0x84, 0x00, 0x00, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0x96, 0x00, 0x00, 0x01, 0x9c, 0x00, 0x00, 0x01, 0xa2, 0x00, 0x00, 0x01, 0xa8, 0x00, 0x00, 0x01, 0xae, 0x00, 0x00, 0x01, 0xb4, 0x00, 0x00, 0x01, 0xba, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x01, 0xc6, 0x00, 0x00, 0x01, 0xcc, 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xd8, 0x00, 0x00, 0x01, 0xde, 0x00, 0x00, 0x01, 0xe4, 0x00, 0x00, 0x01, 0xea, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x01, 0xf6, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x26, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x00, 0x02, 0x32, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x02, 0x3e, 0x00, 0x00, 0x02, 0x46, 0x00, 0x00, 0x02, 0x4e, 0x00, 0x00, 0x02, 0x54, 0x00, 0x00, 0x02, 0x5a, 0x00, 0x00, 0x02, 0x60, 0x00, 0x00, 0x02, 0x66, 0x00, 0x00, 0x02, 0x6c, 0x00, 0x00, 0x02, 0x72, 0x00, 0x00, 0x02, 0x78, 0x00, 0x00, 0x02, 0x7e, 0x00, 0x00, 0x02, 0x84, 0x00, 0x00, 0x02, 0x8a, 0x00, 0x00, 0x02, 0x90, 0x00, 0x00, 0x02, 0x96, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x04, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x04, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x04, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x08, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0xb0, 0x03, 0x6f, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x72, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x72, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0xb0, 0x04, 0x72, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfd, 0xcd, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0xa6, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x6e, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x48, 0x04, 0x7b, 0x00, 0x01, 0xfd, 0x39, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x0c, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x10, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x3e, 0x00, 0xfe, 0x00, 0x01, 0x01, 0x44, 0x00, 0x0c, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x44, 0x00, 0x4a, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5c, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x7a, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8c, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xa4, 0x00, 0xaa, 0x00, 0xb0, 0x00, 0xb6, 0x00, 0xbc, 0x00, 0xc2, 0x00, 0xc8, 0x00, 0xce, 0x00, 0xd4, 0x00, 0xda, 0x00, 0xe0, 0x00, 0xe6, 0x00, 0xec, 0x00, 0x01, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x60, 0x00, 0x00, 0x00, 0x01, 0x01, 0x35, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x59, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0xff, 0xfe, 0x00, 0x01, 0x03, 0x54, 0x00, 0x00, 0x00, 0x01, 0x03, 0x14, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x35, 0x00, 0x00, 0x00, 0x01, 0x03, 0xb1, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe1, 0xfe, 0x56, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x35, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x95, 0x00, 0x00, 0x00, 0x01, 0x01, 0x23, 0x00, 0x00, 0x00, 0x01, 0x02, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x04, 0xb6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x9a, 0x00, 0xba, 0x00, 0xf3, 0x01, 0x48, 0x01, 0x59, 0x01, 0x61, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x02, 0x12, 0x02, 0x16, 0x02, 0x2a, 0x02, 0x37, 0x02, 0x54, 0x0e, 0x38, 0x11, 0x1c, 0x00, 0x01, 0x00, 0x01, 0x02, 0xd9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0xfe, 0x29, 0x00, 0x00, 0x00, 0x02, 0x26, 0xf0, 0x00, 0x04, 0x00, 0x00, 0x21, 0x30, 0x23, 0x20, 0x00, 0x35, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x72, 0x00, 0x39, 0x00, 0x4b, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0xff, 0x9a, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0xff, 0x61, 0xff, 0x75, 0xff, 0xad, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x03, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0xff, 0xb7, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0x90, 0xff, 0x90, 0xff, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xc9, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xb7, 0xff, 0x61, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0xff, 0x90, 0x00, 0x00, 0xff, 0xb7, 0xff, 0x90, 0xff, 0x44, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xc9, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0x90, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0xff, 0xc9, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xdc, 0xff, 0x9a, 0x00, 0x00, 0xff, 0x9a, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe6, 0xff, 0x9a, 0xff, 0x1f, 0xff, 0x44, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x61, 0xfd, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xad, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0x44, 0x00, 0x00, 0xff, 0xd3, 0xfe, 0xc1, 0x00, 0x00, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xb7, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x26, 0xfe, 0xb7, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0x7d, 0x00, 0x00, 0xff, 0xad, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0xad, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0x00, 0x00, 0xff, 0x7d, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0x90, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x9a, 0xff, 0xd3, 0xff, 0xa4, 0x00, 0x00, 0xff, 0xa4, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0x7d, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0xff, 0x0d, 0xff, 0x1f, 0xff, 0x61, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xad, 0xfe, 0xa4, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xa4, 0xfe, 0xd3, 0xfe, 0xad, 0x00, 0x00, 0xfe, 0xc9, 0x00, 0x00, 0xfe, 0xad, 0x00, 0x00, 0xfe, 0xc1, 0xff, 0x44, 0xff, 0x90, 0x00, 0x00, 0xff, 0x88, 0xff, 0x11, 0xfe, 0xe0, 0x00, 0x00, 0xfe, 0xf4, 0xfe, 0xe7, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x88, 0xfe, 0xf8, 0xff, 0x59, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0xff, 0x4e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0xff, 0x61, 0x00, 0x00, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe6, 0x00, 0x00, 0xff, 0xad, 0xff, 0x15, 0xff, 0x88, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0x88, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0x90, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x88, 0x00, 0x00, 0xff, 0x88, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xfe, 0xf8, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0xff, 0xad, 0xff, 0xd3, 0x00, 0x00, 0xff, 0x0d, 0xfe, 0x61, 0xfe, 0xf0, 0xff, 0x61, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x1f, 0xff, 0x6b, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xe6, 0xfe, 0xf0, 0x00, 0x00, 0xfe, 0xf0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xdc, 0xfe, 0xf8, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0x6b, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xb7, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0x90, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0xb7, 0xff, 0x7d, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x44, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xd3, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xfe, 0xc9, 0x00, 0x00, 0xff, 0xc9, 0xff, 0x61, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xfe, 0xdc, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xff, 0x90, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x4e, 0xff, 0x90, 0xff, 0x90, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf8, 0xff, 0x03, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x03, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x03, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xad, 0xff, 0xa4, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0x90, 0xff, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0xff, 0x90, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x02, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x02, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xc9, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x44, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xd3, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xfe, 0xc9, 0x00, 0x00, 0xff, 0x44, 0xff, 0x0d, 0xff, 0x1f, 0xff, 0x61, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xad, 0xfe, 0xa4, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xa4, 0xfe, 0xd3, 0xfe, 0xad, 0x00, 0x00, 0xfe, 0xc9, 0x00, 0x00, 0xfe, 0xad, 0x00, 0x00, 0xfe, 0xc1, 0xff, 0x44, 0xff, 0x90, 0x00, 0x00, 0xff, 0x88, 0xfe, 0xad, 0xfe, 0xa4, 0x00, 0x00, 0xfe, 0xa4, 0xfe, 0xc9, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x72, 0x00, 0x39, 0x00, 0x4b, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0xff, 0x9a, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf8, 0xff, 0xc1, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0x6b, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7d, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xff, 0xb7, 0xff, 0x90, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x2f, 0xff, 0x90, 0xff, 0x90, 0x00, 0x00, 0xfe, 0xe6, 0x00, 0x00, 0xfe, 0x88, 0xff, 0x03, 0xff, 0xb7, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x52, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x00, 0x24, 0x00, 0x24, 0x00, 0x02, 0x00, 0x25, 0x00, 0x25, 0x00, 0x03, 0x00, 0x26, 0x00, 0x26, 0x00, 0x04, 0x00, 0x27, 0x00, 0x27, 0x00, 0x05, 0x00, 0x29, 0x00, 0x29, 0x00, 0x06, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x07, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x08, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x09, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x0b, 0x00, 0x32, 0x00, 0x32, 0x00, 0x0c, 0x00, 0x33, 0x00, 0x33, 0x00, 0x0d, 0x00, 0x34, 0x00, 0x34, 0x00, 0x0e, 0x00, 0x35, 0x00, 0x35, 0x00, 0x0f, 0x00, 0x36, 0x00, 0x36, 0x00, 0x10, 0x00, 0x37, 0x00, 0x37, 0x00, 0x11, 0x00, 0x38, 0x00, 0x38, 0x00, 0x12, 0x00, 0x39, 0x00, 0x39, 0x00, 0x13, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x14, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x15, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x16, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x17, 0x00, 0x48, 0x00, 0x48, 0x00, 0x18, 0x00, 0x49, 0x00, 0x49, 0x00, 0x19, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x1a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x1b, 0x00, 0x52, 0x00, 0x52, 0x00, 0x1c, 0x00, 0x55, 0x00, 0x55, 0x00, 0x1d, 0x00, 0x59, 0x00, 0x59, 0x00, 0x1e, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x1f, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x20, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x21, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x22, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x23, 0x00, 0x82, 0x00, 0x82, 0x00, 0x24, 0x00, 0x83, 0x00, 0x84, 0x00, 0x25, 0x00, 0x85, 0x00, 0x85, 0x00, 0x26, 0x00, 0x86, 0x00, 0x86, 0x00, 0x25, 0x00, 0x88, 0x00, 0x88, 0x00, 0x27, 0x00, 0x89, 0x00, 0x89, 0x00, 0x28, 0x00, 0x92, 0x00, 0x92, 0x00, 0x05, 0x00, 0x94, 0x00, 0x98, 0x00, 0x0c, 0x00, 0x9b, 0x00, 0x9e, 0x00, 0x12, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x16, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x29, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x2a, 0x00, 0xaa, 0x00, 0xad, 0x00, 0x18, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x2b, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x1b, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0x1c, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0x21, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x21, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x2c, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x2c, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x2d, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x28, 0x00, 0xce, 0x00, 0xce, 0x00, 0x28, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x05, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x2e, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x18, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x07, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x0b, 0x00, 0xff, 0x00, 0xff, 0x00, 0x0b, 0x01, 0x02, 0x01, 0x02, 0x00, 0x2f, 0x01, 0x0a, 0x01, 0x0a, 0x00, 0x1b, 0x01, 0x16, 0x01, 0x16, 0x00, 0x0f, 0x01, 0x17, 0x01, 0x17, 0x00, 0x1d, 0x01, 0x1a, 0x01, 0x1a, 0x00, 0x0f, 0x01, 0x1b, 0x01, 0x1b, 0x00, 0x30, 0x01, 0x20, 0x01, 0x20, 0x00, 0x10, 0x01, 0x22, 0x01, 0x22, 0x00, 0x10, 0x01, 0x26, 0x01, 0x26, 0x00, 0x31, 0x01, 0x30, 0x01, 0x30, 0x00, 0x12, 0x01, 0x3a, 0x01, 0x3a, 0x00, 0x16, 0x01, 0x3f, 0x01, 0x3f, 0x00, 0x17, 0x07, 0x45, 0x07, 0x45, 0x00, 0x32, 0x07, 0x51, 0x07, 0x51, 0x00, 0x33, 0x07, 0x53, 0x07, 0x53, 0x00, 0x34, 0x0e, 0x60, 0x0e, 0x60, 0x00, 0x11, 0x0e, 0x78, 0x0e, 0x78, 0x00, 0x0a, 0x0e, 0x79, 0x0e, 0x79, 0x00, 0x1a, 0x00, 0x02, 0x00, 0xa2, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x00, 0x11, 0x00, 0x11, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x24, 0x00, 0x24, 0x00, 0x04, 0x00, 0x25, 0x00, 0x25, 0x00, 0x05, 0x00, 0x26, 0x00, 0x26, 0x00, 0x06, 0x00, 0x27, 0x00, 0x27, 0x00, 0x07, 0x00, 0x29, 0x00, 0x29, 0x00, 0x08, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x08, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x08, 0x00, 0x32, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x33, 0x00, 0x33, 0x00, 0x08, 0x00, 0x34, 0x00, 0x34, 0x00, 0x0c, 0x00, 0x35, 0x00, 0x35, 0x00, 0x08, 0x00, 0x36, 0x00, 0x36, 0x00, 0x0d, 0x00, 0x37, 0x00, 0x37, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x38, 0x00, 0x0f, 0x00, 0x39, 0x00, 0x39, 0x00, 0x10, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x11, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x12, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x13, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x14, 0x00, 0x44, 0x00, 0x44, 0x00, 0x15, 0x00, 0x46, 0x00, 0x46, 0x00, 0x16, 0x00, 0x47, 0x00, 0x47, 0x00, 0x17, 0x00, 0x48, 0x00, 0x48, 0x00, 0x18, 0x00, 0x49, 0x00, 0x49, 0x00, 0x19, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x1a, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x1b, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x1c, 0x00, 0x50, 0x00, 0x50, 0x00, 0x1a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x1d, 0x00, 0x52, 0x00, 0x52, 0x00, 0x1e, 0x00, 0x54, 0x00, 0x54, 0x00, 0x17, 0x00, 0x55, 0x00, 0x55, 0x00, 0x1f, 0x00, 0x56, 0x00, 0x56, 0x00, 0x20, 0x00, 0x57, 0x00, 0x57, 0x00, 0x21, 0x00, 0x58, 0x00, 0x58, 0x00, 0x22, 0x00, 0x59, 0x00, 0x59, 0x00, 0x23, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x24, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x25, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x26, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x27, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x28, 0x00, 0x82, 0x00, 0x86, 0x00, 0x04, 0x00, 0x88, 0x00, 0x88, 0x00, 0x29, 0x00, 0x89, 0x00, 0x89, 0x00, 0x2a, 0x00, 0x94, 0x00, 0x98, 0x00, 0x0b, 0x00, 0x9b, 0x00, 0x9e, 0x00, 0x0f, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x13, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0x08, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x2b, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x15, 0x00, 0xa4, 0x00, 0xa7, 0x00, 0x2b, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0x16, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0x2c, 0x00, 0xab, 0x00, 0xab, 0x00, 0x18, 0x00, 0xac, 0x00, 0xad, 0x00, 0x2c, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x2d, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x1d, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0x2e, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0x1e, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0x2f, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0x22, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x2f, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0x26, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x26, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x30, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x31, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x30, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x31, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x30, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x31, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x06, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0x32, 0x00, 0xca, 0x00, 0xca, 0x00, 0x33, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x34, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x33, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x35, 0x00, 0xce, 0x00, 0xce, 0x00, 0x06, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0x32, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x07, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0x36, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0x37, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0x38, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0x38, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0x38, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x38, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x18, 0x00, 0xde, 0x00, 0xde, 0x00, 0x33, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x39, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0x1a, 0x00, 0xe2, 0x00, 0xe2, 0x00, 0x33, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0x3a, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x3b, 0x00, 0xf5, 0x00, 0xf5, 0x00, 0x3b, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x08, 0x00, 0xff, 0x00, 0xff, 0x00, 0x08, 0x01, 0x0a, 0x01, 0x0a, 0x00, 0x1d, 0x01, 0x0e, 0x01, 0x0e, 0x00, 0x33, 0x01, 0x0f, 0x01, 0x0f, 0x00, 0x3c, 0x01, 0x10, 0x01, 0x10, 0x00, 0x33, 0x01, 0x11, 0x01, 0x11, 0x00, 0x3c, 0x01, 0x12, 0x01, 0x12, 0x00, 0x3d, 0x01, 0x13, 0x01, 0x13, 0x00, 0x3c, 0x01, 0x16, 0x01, 0x16, 0x00, 0x08, 0x01, 0x17, 0x01, 0x17, 0x00, 0x1f, 0x01, 0x19, 0x01, 0x19, 0x00, 0x3b, 0x01, 0x1a, 0x01, 0x1a, 0x00, 0x08, 0x01, 0x1b, 0x01, 0x1b, 0x00, 0x1f, 0x01, 0x1c, 0x01, 0x1c, 0x00, 0x0d, 0x01, 0x1e, 0x01, 0x1e, 0x00, 0x0d, 0x01, 0x20, 0x01, 0x20, 0x00, 0x0d, 0x01, 0x21, 0x01, 0x21, 0x00, 0x20, 0x01, 0x22, 0x01, 0x22, 0x00, 0x0d, 0x01, 0x23, 0x01, 0x23, 0x00, 0x20, 0x01, 0x24, 0x01, 0x24, 0x00, 0x3e, 0x01, 0x25, 0x01, 0x25, 0x00, 0x35, 0x01, 0x26, 0x01, 0x26, 0x00, 0x0e, 0x01, 0x27, 0x01, 0x27, 0x00, 0x21, 0x01, 0x28, 0x01, 0x28, 0x00, 0x3f, 0x01, 0x2b, 0x01, 0x2b, 0x00, 0x40, 0x01, 0x2d, 0x01, 0x2d, 0x00, 0x40, 0x01, 0x2f, 0x01, 0x2f, 0x00, 0x40, 0x01, 0x30, 0x01, 0x30, 0x00, 0x0f, 0x01, 0x31, 0x01, 0x31, 0x00, 0x22, 0x01, 0x33, 0x01, 0x33, 0x00, 0x40, 0x01, 0x35, 0x01, 0x35, 0x00, 0x40, 0x01, 0x36, 0x01, 0x36, 0x00, 0x41, 0x01, 0x37, 0x01, 0x37, 0x00, 0x42, 0x01, 0x38, 0x01, 0x38, 0x00, 0x43, 0x01, 0x39, 0x01, 0x39, 0x00, 0x44, 0x01, 0x3a, 0x01, 0x3a, 0x00, 0x13, 0x01, 0x3f, 0x01, 0x3f, 0x00, 0x14, 0x01, 0x88, 0x01, 0x88, 0x00, 0x34, 0x01, 0xac, 0x01, 0xac, 0x00, 0x45, 0x01, 0xad, 0x01, 0xad, 0x00, 0x46, 0x01, 0xae, 0x01, 0xae, 0x00, 0x45, 0x01, 0xaf, 0x01, 0xaf, 0x00, 0x46, 0x01, 0xda, 0x01, 0xda, 0x00, 0x0d, 0x01, 0xdc, 0x01, 0xdc, 0x00, 0x47, 0x01, 0xdd, 0x01, 0xdd, 0x00, 0x34, 0x01, 0xf0, 0x01, 0xf0, 0x00, 0x33, 0x01, 0xf1, 0x01, 0xf1, 0x00, 0x48, 0x01, 0xf3, 0x01, 0xf3, 0x00, 0x34, 0x01, 0xf4, 0x01, 0xf4, 0x00, 0x49, 0x01, 0xf5, 0x01, 0xf5, 0x00, 0x4a, 0x05, 0xd0, 0x05, 0xd0, 0x00, 0x41, 0x05, 0xd1, 0x05, 0xd1, 0x00, 0x4b, 0x05, 0xd2, 0x05, 0xd2, 0x00, 0x4c, 0x05, 0xd3, 0x05, 0xd3, 0x00, 0x42, 0x05, 0xd4, 0x05, 0xd4, 0x00, 0x41, 0x05, 0xd5, 0x05, 0xd5, 0x00, 0x42, 0x06, 0x42, 0x06, 0x42, 0x00, 0x43, 0x06, 0x43, 0x06, 0x43, 0x00, 0x44, 0x07, 0x51, 0x07, 0x51, 0x00, 0x4d, 0x07, 0x52, 0x07, 0x52, 0x00, 0x4e, 0x07, 0x53, 0x07, 0x53, 0x00, 0x4f, 0x0e, 0x78, 0x0e, 0x78, 0x00, 0x08, 0x00, 0x01, 0x00, 0x61, 0x00, 0x10, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x51, 0x00, 0x52, 0x00, 0x55, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x6d, 0x00, 0x7d, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x88, 0x00, 0x89, 0x00, 0x92, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xbf, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0x00, 0xc8, 0x00, 0xce, 0x00, 0xd0, 0x00, 0xd2, 0x00, 0xdd, 0x00, 0xe0, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x02, 0x01, 0x0a, 0x01, 0x16, 0x01, 0x17, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x20, 0x01, 0x22, 0x01, 0x26, 0x01, 0x30, 0x01, 0x3a, 0x01, 0x3f, 0x07, 0x45, 0x07, 0x51, 0x07, 0x53, 0x0e, 0x60, 0x0e, 0x78, 0x0e, 0x79, 0x00, 0x02, 0x00, 0x60, 0x00, 0x04, 0x00, 0x00, 0x00, 0x24, 0x00, 0x58, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd8, 0x00, 0x00, 0xff, 0xb1, 0x00, 0x00, 0xff, 0xa3, 0x00, 0x00, 0xff, 0x9c, 0x00, 0x01, 0x0e, 0xaa, 0x00, 0x17, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x0e, 0xc2, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x0e, 0xaa, 0x0e, 0xae, 0x00, 0x00, 0x0e, 0xb0, 0x0e, 0xb4, 0x00, 0x05, 0x0e, 0xb6, 0x0e, 0xba, 0x00, 0x0a, 0x0e, 0xbc, 0x0e, 0xc0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x01, 0xf0, 0x02, 0x9e, 0x00, 0x14, 0x44, 0x46, 0x4c, 0x54, 0x00, 0x7a, 0x61, 0x72, 0x61, 0x62, 0x00, 0x88, 0x61, 0x72, 0x6d, 0x6e, 0x00, 0xa6, 0x62, 0x72, 0x61, 0x69, 0x00, 0xb2, 0x63, 0x61, 0x6e, 0x73, 0x00, 0xbe, 0x63, 0x68, 0x65, 0x72, 0x00, 0xca, 0x63, 0x79, 0x72, 0x6c, 0x00, 0xd6, 0x67, 0x65, 0x6f, 0x72, 0x00, 0xf8, 0x67, 0x72, 0x65, 0x6b, 0x01, 0x04, 0x68, 0x61, 0x6e, 0x69, 0x01, 0x14, 0x68, 0x65, 0x62, 0x72, 0x01, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x01, 0x2c, 0x6c, 0x61, 0x6f, 0x20, 0x01, 0x38, 0x6c, 0x61, 0x74, 0x6e, 0x01, 0x44, 0x6d, 0x61, 0x74, 0x68, 0x01, 0x9e, 0x6e, 0x6b, 0x6f, 0x20, 0x01, 0xaa, 0x6f, 0x67, 0x61, 0x6d, 0x01, 0xb6, 0x72, 0x75, 0x6e, 0x72, 0x01, 0xc2, 0x74, 0x66, 0x6e, 0x67, 0x01, 0xce, 0x74, 0x68, 0x61, 0x69, 0x01, 0xda, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x06, 0x00, 0x16, 0x00, 0x03, 0x4b, 0x55, 0x52, 0x20, 0x00, 0x16, 0x53, 0x4e, 0x44, 0x20, 0x00, 0x16, 0x55, 0x52, 0x44, 0x20, 0x00, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x10, 0x00, 0x02, 0x4d, 0x4b, 0x44, 0x20, 0x00, 0x18, 0x53, 0x52, 0x42, 0x20, 0x00, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x01, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x34, 0x00, 0x08, 0x49, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x4b, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x4c, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x4d, 0x4f, 0x4c, 0x20, 0x00, 0x34, 0x4e, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x52, 0x4f, 0x4d, 0x20, 0x00, 0x34, 0x53, 0x4b, 0x53, 0x20, 0x00, 0x46, 0x53, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x02, 0x00, 0x05, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x0e, 0x20, 0x52, 0x51, 0x44, 0x00, 0x56, 0x61, 0x61, 0x6c, 0x74, 0x00, 0x5c, 0x61, 0x61, 0x6c, 0x74, 0x00, 0x62, 0x63, 0x63, 0x6d, 0x70, 0x00, 0x68, 0x63, 0x63, 0x6d, 0x70, 0x00, 0x6e, 0x63, 0x63, 0x6d, 0x70, 0x00, 0x76, 0x64, 0x6c, 0x69, 0x67, 0x00, 0x7e, 0x64, 0x6c, 0x69, 0x67, 0x00, 0x84, 0x68, 0x6c, 0x69, 0x67, 0x00, 0x8a, 0x6c, 0x69, 0x67, 0x61, 0x00, 0x90, 0x6c, 0x6f, 0x63, 0x6c, 0x00, 0x96, 0x6c, 0x6f, 0x63, 0x6c, 0x00, 0x9c, 0x73, 0x61, 0x6c, 0x74, 0x00, 0xa2, 0x73, 0x61, 0x6c, 0x74, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xa0, 0x00, 0xa8, 0x00, 0xb0, 0x00, 0xb8, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xd0, 0x00, 0xd8, 0x00, 0xe0, 0x00, 0xe8, 0x00, 0x06, 0x00, 0x09, 0x00, 0x01, 0x00, 0xc2, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x01, 0x12, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x01, 0x3e, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x04, 0xb2, 0x05, 0x0a, 0x05, 0x62, 0x05, 0xba, 0x06, 0x12, 0x06, 0x6a, 0x06, 0xac, 0x06, 0xf4, 0x07, 0x3c, 0x07, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x07, 0xac, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x07, 0xb0, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x07, 0xb4, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x07, 0xe8, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x07, 0xf8, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x08, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x9c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0xba, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0xd8, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x08, 0xee, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x52, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x88, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x90, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x98, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0xa0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0xb0, 0x00, 0x02, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x02, 0x07, 0x42, 0x07, 0x42, 0x00, 0x00, 0x11, 0x52, 0x11, 0xab, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x07, 0x42, 0x07, 0x42, 0x00, 0x01, 0x11, 0x52, 0x11, 0xab, 0x00, 0x01, 0x00, 0x03, 0x00, 0x08, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x05, 0x00, 0x00, 0x03, 0x0c, 0x03, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xf1, 0x02, 0x0b, 0x02, 0x2a, 0x02, 0x5f, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf7, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x03, 0x01, 0x03, 0x02, 0x03, 0x04, 0x03, 0x87, 0x03, 0xea, 0x03, 0xec, 0x04, 0x17, 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x05, 0x7d, 0x06, 0x1b, 0x07, 0xe3, 0x07, 0xe4, 0x07, 0xe5, 0x07, 0xe6, 0x08, 0x31, 0x08, 0x32, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x24, 0x00, 0x3d, 0x00, 0x03, 0x00, 0x45, 0x00, 0x45, 0x00, 0x03, 0x00, 0x47, 0x00, 0x47, 0x00, 0x03, 0x00, 0x49, 0x00, 0x49, 0x00, 0x03, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x03, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x03, 0x00, 0x57, 0x00, 0x57, 0x00, 0x03, 0x00, 0x82, 0x00, 0x98, 0x00, 0x03, 0x00, 0x9a, 0x00, 0xa1, 0x00, 0x03, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x03, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x03, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x03, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x03, 0x00, 0xca, 0x00, 0xca, 0x00, 0x03, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x03, 0x00, 0xce, 0x00, 0xce, 0x00, 0x03, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x03, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x03, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x03, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x03, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0x03, 0x00, 0xda, 0x00, 0xda, 0x00, 0x03, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x03, 0x00, 0xde, 0x00, 0xde, 0x00, 0x03, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x03, 0x00, 0xe2, 0x00, 0xe2, 0x00, 0x03, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0x03, 0x00, 0xe6, 0x00, 0xea, 0x00, 0x03, 0x00, 0xec, 0x00, 0xec, 0x00, 0x03, 0x00, 0xee, 0x00, 0xee, 0x00, 0x03, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x03, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x01, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0x03, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0x03, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0x03, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x03, 0x00, 0xfb, 0x01, 0x05, 0x00, 0x03, 0x01, 0x07, 0x01, 0x07, 0x00, 0x03, 0x01, 0x09, 0x01, 0x09, 0x00, 0x03, 0x01, 0x0c, 0x01, 0x0c, 0x00, 0x03, 0x01, 0x0e, 0x01, 0x0e, 0x00, 0x03, 0x01, 0x10, 0x01, 0x10, 0x00, 0x03, 0x01, 0x12, 0x01, 0x12, 0x00, 0x03, 0x01, 0x14, 0x01, 0x14, 0x00, 0x03, 0x01, 0x16, 0x01, 0x16, 0x00, 0x03, 0x01, 0x18, 0x01, 0x18, 0x00, 0x03, 0x01, 0x1a, 0x01, 0x1a, 0x00, 0x03, 0x01, 0x1c, 0x01, 0x1c, 0x00, 0x03, 0x01, 0x1e, 0x01, 0x1e, 0x00, 0x03, 0x01, 0x20, 0x01, 0x20, 0x00, 0x03, 0x01, 0x22, 0x01, 0x22, 0x00, 0x03, 0x01, 0x24, 0x01, 0x24, 0x00, 0x03, 0x01, 0x26, 0x01, 0x26, 0x00, 0x03, 0x01, 0x28, 0x01, 0x28, 0x00, 0x03, 0x01, 0x2a, 0x01, 0x2a, 0x00, 0x03, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x03, 0x01, 0x2e, 0x01, 0x2e, 0x00, 0x03, 0x01, 0x30, 0x01, 0x30, 0x00, 0x03, 0x01, 0x32, 0x01, 0x32, 0x00, 0x03, 0x01, 0x34, 0x01, 0x34, 0x00, 0x03, 0x01, 0x36, 0x01, 0x36, 0x00, 0x03, 0x01, 0x38, 0x01, 0x38, 0x00, 0x03, 0x01, 0x3a, 0x01, 0x3b, 0x00, 0x03, 0x01, 0x3d, 0x01, 0x3d, 0x00, 0x03, 0x01, 0x3f, 0x01, 0x3f, 0x00, 0x03, 0x01, 0x41, 0x01, 0x41, 0x00, 0x03, 0x01, 0x48, 0x01, 0x48, 0x00, 0x03, 0x01, 0x52, 0x01, 0x52, 0x00, 0x03, 0x01, 0x54, 0x01, 0x54, 0x00, 0x03, 0x01, 0x56, 0x01, 0x56, 0x00, 0x03, 0x01, 0x79, 0x01, 0x7a, 0x00, 0x03, 0x01, 0x8f, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x91, 0x01, 0x93, 0x00, 0x03, 0x01, 0x95, 0x01, 0x95, 0x00, 0x03, 0x01, 0xa4, 0x01, 0xa4, 0x00, 0x03, 0x01, 0xac, 0x01, 0xac, 0x00, 0x03, 0x01, 0xae, 0x01, 0xae, 0x00, 0x03, 0x01, 0xda, 0x01, 0xda, 0x00, 0x03, 0x01, 0xdc, 0x01, 0xdc, 0x00, 0x03, 0x01, 0xf0, 0x01, 0xf0, 0x00, 0x03, 0x01, 0xf4, 0x01, 0xf4, 0x00, 0x03, 0x02, 0x0b, 0x02, 0x0b, 0x00, 0x01, 0x02, 0x2a, 0x02, 0x2a, 0x00, 0x01, 0x02, 0x5f, 0x02, 0x5f, 0x00, 0x01, 0x02, 0xb1, 0x02, 0xc5, 0x00, 0x02, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x04, 0x02, 0xcd, 0x02, 0xe4, 0x00, 0x04, 0x02, 0xea, 0x02, 0xed, 0x00, 0x04, 0x02, 0xee, 0x02, 0xf5, 0x00, 0x02, 0x02, 0xf6, 0x02, 0xf6, 0x00, 0x04, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x02, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x04, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x02, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x04, 0x03, 0x01, 0x03, 0x02, 0x00, 0x02, 0x03, 0x03, 0x03, 0x03, 0x00, 0x04, 0x03, 0x04, 0x03, 0x04, 0x00, 0x02, 0x03, 0x87, 0x03, 0x87, 0x00, 0x01, 0x03, 0xea, 0x03, 0xea, 0x00, 0x01, 0x03, 0xec, 0x03, 0xec, 0x00, 0x01, 0x04, 0x17, 0x04, 0x1a, 0x00, 0x02, 0x05, 0x7d, 0x05, 0x7d, 0x00, 0x01, 0x06, 0x1b, 0x06, 0x1b, 0x00, 0x01, 0x07, 0xe3, 0x07, 0xe6, 0x00, 0x02, 0x08, 0x31, 0x08, 0x32, 0x00, 0x01, 0x00, 0x03, 0x00, 0x08, 0x00, 0x16, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x08, 0x00, 0x16, 0x00, 0x26, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0xa7, 0x02, 0xa7, 0x00, 0x01, 0x02, 0xa8, 0x02, 0xab, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa7, 0x00, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa7, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa7, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0xa7, 0x02, 0xaa, 0x00, 0x02, 0x02, 0xab, 0x02, 0xab, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xa7, 0x00, 0x02, 0x00, 0x02, 0x02, 0xa7, 0x02, 0xa7, 0x00, 0x01, 0x0e, 0xaa, 0x0e, 0xad, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x02, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa8, 0x00, 0x01, 0x0e, 0xae, 0x0e, 0xae, 0x00, 0x02, 0x0e, 0xb0, 0x0e, 0xb2, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x02, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa9, 0x00, 0x01, 0x0e, 0xb3, 0x0e, 0xb4, 0x00, 0x02, 0x0e, 0xb6, 0x0e, 0xb7, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xaa, 0x00, 0x02, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xaa, 0x00, 0x01, 0x0e, 0xb8, 0x0e, 0xba, 0x00, 0x02, 0x0e, 0xbc, 0x0e, 0xbc, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xab, 0x00, 0x02, 0x00, 0x02, 0x02, 0xab, 0x02, 0xab, 0x00, 0x01, 0x0e, 0xbd, 0x0e, 0xc0, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x01, 0x00, 0x06, 0x0b, 0x43, 0x00, 0x01, 0x00, 0x01, 0x03, 0xc5, 0x00, 0x01, 0x00, 0x06, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0c, 0x00, 0x01, 0x00, 0x36, 0x00, 0x01, 0x00, 0x08, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x22, 0x00, 0x28, 0x0f, 0x0d, 0x00, 0x03, 0x00, 0x49, 0x00, 0x4f, 0x0f, 0x0c, 0x00, 0x03, 0x00, 0x49, 0x00, 0x4c, 0x0f, 0x0b, 0x00, 0x02, 0x00, 0x4f, 0x0f, 0x0a, 0x00, 0x02, 0x00, 0x4c, 0x0f, 0x09, 0x00, 0x02, 0x00, 0x49, 0x00, 0x01, 0x00, 0x01, 0x00, 0x49, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x0f, 0x0f, 0x00, 0x02, 0x00, 0x57, 0x00, 0x01, 0x00, 0x01, 0x00, 0x56, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x0f, 0x0e, 0x00, 0x02, 0x00, 0x57, 0x00, 0x01, 0x00, 0x01, 0x01, 0x41, 0x00, 0x01, 0x00, 0x88, 0x00, 0x08, 0x00, 0x16, 0x00, 0x28, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5a, 0x00, 0x66, 0x00, 0x72, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x07, 0x7e, 0x00, 0x02, 0x00, 0x22, 0x07, 0x71, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x07, 0x7d, 0x00, 0x02, 0x00, 0x04, 0x07, 0x7c, 0x00, 0x02, 0x00, 0x22, 0x00, 0x01, 0x00, 0x04, 0x08, 0x24, 0x00, 0x03, 0x00, 0x24, 0x00, 0x3b, 0x00, 0x01, 0x00, 0x04, 0x07, 0xd2, 0x00, 0x02, 0x00, 0x56, 0x00, 0x01, 0x00, 0x04, 0x08, 0x09, 0x00, 0x02, 0x00, 0x30, 0x00, 0x01, 0x00, 0x04, 0x08, 0x0a, 0x00, 0x03, 0x00, 0x28, 0x00, 0x2f, 0x00, 0x01, 0x00, 0x04, 0x07, 0xea, 0x00, 0x03, 0x00, 0x12, 0x00, 0x46, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0e, 0x07, 0xf0, 0x00, 0x03, 0x00, 0x12, 0x00, 0x58, 0x07, 0xef, 0x00, 0x03, 0x00, 0x12, 0x00, 0x52, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x22, 0x00, 0x29, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x44, 0x00, 0x46, 0x00, 0x02, 0x00, 0x14, 0x00, 0x07, 0x03, 0x67, 0x03, 0x66, 0x03, 0x68, 0x03, 0x64, 0x03, 0x65, 0x03, 0x6a, 0x03, 0x69, 0x00, 0x01, 0x00, 0x07, 0x03, 0x23, 0x03, 0x39, 0x03, 0x3f, 0x03, 0x46, 0x03, 0x4c, 0x03, 0x54, 0x03, 0x5a, 0x00, 0x02, 0x00, 0x14, 0x00, 0x07, 0x03, 0x67, 0x03, 0x66, 0x03, 0x68, 0x03, 0x64, 0x03, 0x65, 0x03, 0x6a, 0x03, 0x69, 0x00, 0x01, 0x00, 0x07, 0x03, 0x23, 0x03, 0x39, 0x03, 0x3f, 0x03, 0x46, 0x03, 0x4c, 0x03, 0x54, 0x03, 0x5a, 0x00, 0x02, 0x00, 0x10, 0x00, 0x05, 0x11, 0x48, 0x11, 0x34, 0x02, 0x13, 0x11, 0x3e, 0x11, 0x1b, 0x00, 0x01, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x4f, 0x01, 0x0c, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x06, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x01, 0x11, 0x48, 0x00, 0x01, 0x11, 0x34, 0x00, 0x01, 0x02, 0x13, 0x00, 0x01, 0x11, 0x3e, 0x00, 0x01, 0x11, 0xb8, 0x00, 0x01, 0x11, 0x1b, 0x00, 0x01, 0x00, 0x06, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x4f, 0x00, 0x5c, 0x01, 0x0c, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x0c, 0x10, 0xee, 0x10, 0xec, 0x10, 0xef, 0x10, 0xed, 0x10, 0xf2, 0x10, 0xf3, 0x10, 0xeb, 0x11, 0xac, 0x10, 0xf4, 0x10, 0xf0, 0x10, 0xf5, 0x10, 0xf1, 0x00, 0x01, 0x00, 0x0c, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xc0, 0x02, 0xc2, 0x00, 0x02, 0x00, 0x20, 0x00, 0x0d, 0x00, 0xf3, 0x01, 0xf9, 0x11, 0x42, 0x02, 0x21, 0x11, 0x1c, 0x11, 0x1d, 0x01, 0xf9, 0x00, 0xf3, 0x01, 0xf9, 0x11, 0x45, 0x11, 0x46, 0x11, 0x43, 0x11, 0x44, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xf1, 0x02, 0x0b, 0x02, 0x2a, 0x02, 0x5f, 0x03, 0x87, 0x03, 0xea, 0x03, 0xec, 0x05, 0x7d, 0x06, 0x1b, 0x08, 0x31, 0x08, 0x32, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x02, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x07, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x11, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x16, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x05, 0x0e, 0xc2, 0x0e, 0xc2, 0x0e, 0xc2, 0x0e, 0xc2, 0x0e, 0xc2, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x03, 0xa6, 0x01, 0x90, 0x00, 0x04, 0x00, 0x00, 0x05, 0x33, 0x05, 0x99, 0x00, 0x00, 0x01, 0x1e, 0x05, 0x33, 0x05, 0x99, 0x00, 0x00, 0x03, 0xd7, 0x00, 0x66, 0x02, 0x12, 0x00, 0x00, 0x02, 0x0b, 0x06, 0x06, 0x03, 0x08, 0x04, 0x02, 0x02, 0x04, 0xe0, 0x00, 0x02, 0xff, 0x52, 0x00, 0xfd, 0xff, 0x02, 0x24, 0x00, 0x21, 0x04, 0x00, 0x20, 0x00, 0x50, 0x66, 0x45, 0x64, 0x00, 0x40, 0x00, 0x20, 0xff, 0xff, 0x06, 0x14, 0xfe, 0x14, 0x01, 0x9a, 0x07, 0x6d, 0x01, 0xe3, 0x60, 0x00, 0x01, 0xff, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x8c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x04, 0x8c, 0x00, 0x04, 0x04, 0x60, 0x00, 0x00, 0x01, 0x14, 0x01, 0x00, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x00, 0x7e, 0x02, 0xe9, 0x02, 0xee, 0x02, 0xf3, 0x02, 0xf7, 0x03, 0x4f, 0x03, 0x53, 0x03, 0x58, 0x03, 0x5a, 0x03, 0x62, 0x03, 0x77, 0x03, 0x7e, 0x03, 0x8a, 0x03, 0x8c, 0x03, 0xa1, 0x05, 0x25, 0x1d, 0x14, 0x1d, 0x23, 0x1d, 0x2e, 0x1d, 0x5b, 0x1d, 0x6a, 0x1d, 0x78, 0x1d, 0x7b, 0x1d, 0x7d, 0x1d, 0x85, 0x1d, 0xbf, 0x1d, 0xc9, 0x1e, 0xfb, 0x1f, 0x15, 0x1f, 0x1d, 0x1f, 0x45, 0x1f, 0x4d, 0x1f, 0x57, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x7d, 0x1f, 0xb4, 0x1f, 0xc4, 0x1f, 0xd3, 0x1f, 0xdb, 0x1f, 0xef, 0x1f, 0xf4, 0x1f, 0xfe, 0x20, 0x64, 0x20, 0x71, 0x20, 0x8e, 0x20, 0x9c, 0x20, 0xb5, 0x20, 0xba, 0x20, 0xd1, 0x20, 0xd7, 0x20, 0xdc, 0x20, 0xe1, 0x21, 0x09, 0x21, 0x49, 0x21, 0x4b, 0x21, 0x4e, 0x21, 0x85, 0x21, 0x89, 0x23, 0x11, 0x23, 0x19, 0x23, 0x21, 0x23, 0x28, 0x23, 0x2c, 0x23, 0x75, 0x23, 0x7a, 0x23, 0x7d, 0x23, 0x87, 0x23, 0x94, 0x23, 0xae, 0x23, 0xcf, 0x23, 0xe3, 0x23, 0xe5, 0x23, 0xe8, 0x24, 0x23, 0x24, 0x69, 0x26, 0x9c, 0x26, 0xb8, 0x26, 0xc3, 0x26, 0xe2, 0x27, 0x04, 0x27, 0x09, 0x27, 0x27, 0x27, 0x4b, 0x27, 0x4d, 0x27, 0x52, 0x27, 0x56, 0x27, 0x5e, 0x27, 0x94, 0x27, 0xaf, 0x27, 0xbe, 0x27, 0xc6, 0x27, 0xe0, 0x27, 0xeb, 0x28, 0xff, 0x29, 0x07, 0x29, 0x0b, 0x29, 0x41, 0x29, 0x84, 0x29, 0xd5, 0x29, 0xeb, 0x29, 0xfb, 0x2a, 0x02, 0x2a, 0x1c, 0x2a, 0x2f, 0x2a, 0x6b, 0x2a, 0xa0, 0x2a, 0xba, 0x2a, 0xfa, 0x2b, 0x1a, 0x2b, 0x24, 0x2b, 0x54, 0x2c, 0x77, 0x2c, 0x7f, 0xa7, 0x16, 0xa7, 0x1f, 0xa7, 0x2b, 0xa7, 0x41, 0xa7, 0x4b, 0xa7, 0x53, 0xa7, 0x57, 0xa7, 0x67, 0xa7, 0x83, 0xa7, 0x8e, 0xa7, 0x91, 0xa7, 0xaa, 0xa7, 0xff, 0xef, 0x19, 0xf0, 0x03, 0xf4, 0x26, 0xf4, 0x41, 0xf6, 0xc5, 0xfb, 0x06, 0xfe, 0x23, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xa0, 0x02, 0xec, 0x02, 0xf3, 0x02, 0xf7, 0x03, 0x00, 0x03, 0x51, 0x03, 0x57, 0x03, 0x5a, 0x03, 0x5c, 0x03, 0x70, 0x03, 0x7a, 0x03, 0x84, 0x03, 0x8c, 0x03, 0x8e, 0x03, 0xa3, 0x1d, 0x00, 0x1d, 0x16, 0x1d, 0x26, 0x1d, 0x30, 0x1d, 0x5d, 0x1d, 0x77, 0x1d, 0x7b, 0x1d, 0x7d, 0x1d, 0x85, 0x1d, 0x9b, 0x1d, 0xc4, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x18, 0x1f, 0x20, 0x1f, 0x48, 0x1f, 0x50, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x5f, 0x1f, 0x80, 0x1f, 0xb6, 0x1f, 0xc6, 0x1f, 0xd6, 0x1f, 0xdd, 0x1f, 0xf2, 0x1f, 0xf6, 0x20, 0x00, 0x20, 0x6a, 0x20, 0x74, 0x20, 0x90, 0x20, 0xa0, 0x20, 0xb8, 0x20, 0xd0, 0x20, 0xd6, 0x20, 0xdb, 0x20, 0xe1, 0x21, 0x00, 0x21, 0x0b, 0x21, 0x4b, 0x21, 0x4e, 0x21, 0x50, 0x21, 0x89, 0x21, 0x90, 0x23, 0x18, 0x23, 0x1c, 0x23, 0x24, 0x23, 0x2b, 0x23, 0x73, 0x23, 0x7a, 0x23, 0x7d, 0x23, 0x87, 0x23, 0x94, 0x23, 0x9b, 0x23, 0xce, 0x23, 0xe3, 0x23, 0xe5, 0x23, 0xe8, 0x24, 0x22, 0x24, 0x60, 0x25, 0x00, 0x26, 0xa0, 0x26, 0xc0, 0x26, 0xe2, 0x27, 0x01, 0x27, 0x06, 0x27, 0x0c, 0x27, 0x29, 0x27, 0x4d, 0x27, 0x4f, 0x27, 0x56, 0x27, 0x58, 0x27, 0x61, 0x27, 0x98, 0x27, 0xb1, 0x27, 0xc5, 0x27, 0xe0, 0x27, 0xe6, 0x27, 0xf0, 0x29, 0x06, 0x29, 0x0a, 0x29, 0x40, 0x29, 0x83, 0x29, 0xce, 0x29, 0xeb, 0x29, 0xfa, 0x2a, 0x00, 0x2a, 0x0c, 0x2a, 0x2f, 0x2a, 0x6a, 0x2a, 0x7d, 0x2a, 0xae, 0x2a, 0xf9, 0x2b, 0x00, 0x2b, 0x1f, 0x2b, 0x53, 0x2c, 0x60, 0x2c, 0x79, 0xa7, 0x08, 0xa7, 0x1b, 0xa7, 0x22, 0xa7, 0x30, 0xa7, 0x46, 0xa7, 0x4e, 0xa7, 0x56, 0xa7, 0x64, 0xa7, 0x80, 0xa7, 0x89, 0xa7, 0x90, 0xa7, 0xa0, 0xa7, 0xfa, 0xef, 0x00, 0xf0, 0x00, 0xf4, 0x00, 0xf4, 0x28, 0xf6, 0xc5, 0xfb, 0x00, 0xfe, 0x20, 0xff, 0xf9, 0xff, 0xff, 0x00, 0x00, 0xff, 0xe3, 0xff, 0xc2, 0xff, 0xc0, 0xff, 0xbc, 0xff, 0xb9, 0xff, 0xb1, 0xff, 0xb0, 0xff, 0xad, 0xff, 0xac, 0xff, 0xab, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x97, 0xff, 0x96, 0xff, 0x95, 0xff, 0x94, 0xe7, 0xba, 0xe7, 0xb9, 0xe7, 0xb7, 0xe7, 0xb6, 0xe7, 0xb5, 0xe7, 0xa9, 0xe7, 0xa7, 0xe7, 0xa6, 0xe7, 0x9f, 0xe7, 0x8a, 0xe7, 0x86, 0xe7, 0x50, 0xe7, 0x4c, 0xe7, 0x4a, 0xe7, 0x48, 0xe7, 0x46, 0xe7, 0x44, 0xe7, 0x43, 0xe7, 0x42, 0xe7, 0x41, 0xe7, 0x40, 0xe7, 0x3e, 0xe7, 0x3d, 0xe7, 0x3c, 0xe7, 0x3a, 0xe7, 0x39, 0xe7, 0x37, 0xe7, 0x36, 0xe7, 0x35, 0xe7, 0x30, 0xe7, 0x2e, 0xe7, 0x2d, 0xe7, 0x2a, 0xe7, 0x28, 0xe7, 0x13, 0xe7, 0x0f, 0xe7, 0x0c, 0xe7, 0x08, 0xe6, 0xea, 0xe6, 0xe9, 0xe6, 0xe8, 0xe6, 0xe6, 0xe6, 0xe5, 0xe6, 0xe2, 0xe6, 0xdc, 0xe6, 0xd6, 0xe6, 0xd4, 0xe6, 0xd2, 0xe6, 0xd0, 0xe6, 0x8a, 0xe6, 0x86, 0xe6, 0x84, 0xe6, 0x7b, 0xe6, 0x6f, 0xe6, 0x69, 0xe6, 0x4a, 0xe6, 0x37, 0xe6, 0x36, 0xe6, 0x34, 0xe5, 0xfb, 0xe5, 0xbf, 0xe5, 0x29, 0xe5, 0x26, 0xe5, 0x1f, 0xe5, 0x01, 0xe4, 0xe3, 0xe4, 0xe2, 0xe4, 0xe0, 0xe4, 0xdf, 0xe4, 0xde, 0xe4, 0xdd, 0xe4, 0xda, 0xe4, 0xd9, 0xe4, 0xd7, 0xe4, 0xd4, 0xe4, 0xd3, 0xe4, 0xcd, 0xe4, 0xb4, 0xe4, 0xaf, 0xe4, 0xab, 0xe4, 0xa5, 0xe4, 0xa3, 0xe4, 0x6f, 0xe4, 0x2e, 0xe3, 0xe5, 0xe3, 0xd0, 0xe3, 0xc2, 0xe3, 0xbe, 0xe3, 0xb5, 0xe3, 0xa3, 0xe3, 0x69, 0xe3, 0x58, 0xe3, 0x4b, 0xe3, 0x0d, 0xe3, 0x08, 0xe3, 0x04, 0xe2, 0xd6, 0xe1, 0xcb, 0xe1, 0xca, 0x67, 0x42, 0x67, 0x3e, 0x67, 0x3c, 0x67, 0x38, 0x67, 0x34, 0x67, 0x32, 0x67, 0x30, 0x67, 0x24, 0x67, 0x0c, 0x67, 0x07, 0x67, 0x06, 0x66, 0xf8, 0x66, 0xa9, 0x1f, 0xa9, 0x1e, 0xc3, 0x1a, 0xc7, 0x1a, 0xc6, 0x18, 0x43, 0x14, 0x09, 0x10, 0xf0, 0x0f, 0x1b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x02, 0xe9, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x02, 0xec, 0x00, 0x00, 0x02, 0xee, 0x00, 0x00, 0x02, 0xac, 0x00, 0x00, 0x02, 0xf3, 0x00, 0x00, 0x02, 0xf3, 0x00, 0x00, 0x02, 0xaf, 0x00, 0x00, 0x02, 0xf7, 0x00, 0x00, 0x02, 0xf7, 0x00, 0x00, 0x02, 0xb0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x4f, 0x00, 0x00, 0x02, 0xb1, 0x00, 0x00, 0x03, 0x51, 0x00, 0x00, 0x03, 0x53, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x57, 0x00, 0x00, 0x03, 0x58, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x03, 0x5a, 0x00, 0x00, 0x03, 0x5a, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x03, 0x5c, 0x00, 0x00, 0x03, 0x62, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x03, 0x70, 0x00, 0x00, 0x03, 0x77, 0x00, 0x00, 0x03, 0x0e, 0x00, 0x00, 0x03, 0x7a, 0x00, 0x00, 0x03, 0x7e, 0x00, 0x00, 0x03, 0x16, 0x00, 0x00, 0x03, 0x84, 0x00, 0x00, 0x03, 0x8a, 0x00, 0x00, 0x03, 0x1b, 0x00, 0x00, 0x03, 0x8c, 0x00, 0x00, 0x03, 0x8c, 0x00, 0x00, 0x03, 0x22, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 0x03, 0xa1, 0x00, 0x00, 0x03, 0x23, 0x00, 0x00, 0x03, 0xa3, 0x00, 0x00, 0x05, 0x25, 0x00, 0x00, 0x03, 0x37, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x14, 0x00, 0x00, 0x04, 0xba, 0x00, 0x00, 0x1d, 0x16, 0x00, 0x00, 0x1d, 0x23, 0x00, 0x00, 0x04, 0xcf, 0x00, 0x00, 0x1d, 0x26, 0x00, 0x00, 0x1d, 0x2e, 0x00, 0x00, 0x04, 0xdd, 0x00, 0x00, 0x1d, 0x30, 0x00, 0x00, 0x1d, 0x5b, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x1d, 0x5d, 0x00, 0x00, 0x1d, 0x6a, 0x00, 0x00, 0x05, 0x12, 0x00, 0x00, 0x1d, 0x77, 0x00, 0x00, 0x1d, 0x78, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x1d, 0x7b, 0x00, 0x00, 0x1d, 0x7b, 0x00, 0x00, 0x05, 0x22, 0x00, 0x00, 0x1d, 0x7d, 0x00, 0x00, 0x1d, 0x7d, 0x00, 0x00, 0x05, 0x23, 0x00, 0x00, 0x1d, 0x85, 0x00, 0x00, 0x1d, 0x85, 0x00, 0x00, 0x05, 0x24, 0x00, 0x00, 0x1d, 0x9b, 0x00, 0x00, 0x1d, 0xbf, 0x00, 0x00, 0x05, 0x25, 0x00, 0x00, 0x1d, 0xc4, 0x00, 0x00, 0x1d, 0xc9, 0x00, 0x00, 0x05, 0x4a, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0xfb, 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x15, 0x00, 0x00, 0x06, 0x4c, 0x00, 0x00, 0x1f, 0x18, 0x00, 0x00, 0x1f, 0x1d, 0x00, 0x00, 0x06, 0x62, 0x00, 0x00, 0x1f, 0x20, 0x00, 0x00, 0x1f, 0x45, 0x00, 0x00, 0x06, 0x68, 0x00, 0x00, 0x1f, 0x48, 0x00, 0x00, 0x1f, 0x4d, 0x00, 0x00, 0x06, 0x8e, 0x00, 0x00, 0x1f, 0x50, 0x00, 0x00, 0x1f, 0x57, 0x00, 0x00, 0x06, 0x94, 0x00, 0x00, 0x1f, 0x59, 0x00, 0x00, 0x1f, 0x59, 0x00, 0x00, 0x06, 0x9c, 0x00, 0x00, 0x1f, 0x5b, 0x00, 0x00, 0x1f, 0x5b, 0x00, 0x00, 0x06, 0x9d, 0x00, 0x00, 0x1f, 0x5d, 0x00, 0x00, 0x1f, 0x5d, 0x00, 0x00, 0x06, 0x9e, 0x00, 0x00, 0x1f, 0x5f, 0x00, 0x00, 0x1f, 0x7d, 0x00, 0x00, 0x06, 0x9f, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x1f, 0xb4, 0x00, 0x00, 0x06, 0xbe, 0x00, 0x00, 0x1f, 0xb6, 0x00, 0x00, 0x1f, 0xc4, 0x00, 0x00, 0x06, 0xf3, 0x00, 0x00, 0x1f, 0xc6, 0x00, 0x00, 0x1f, 0xd3, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x1f, 0xd6, 0x00, 0x00, 0x1f, 0xdb, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x1f, 0xdd, 0x00, 0x00, 0x1f, 0xef, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x1f, 0xf2, 0x00, 0x00, 0x1f, 0xf4, 0x00, 0x00, 0x07, 0x29, 0x00, 0x00, 0x1f, 0xf6, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x07, 0x2c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x64, 0x00, 0x00, 0x07, 0x35, 0x00, 0x00, 0x20, 0x6a, 0x00, 0x00, 0x20, 0x71, 0x00, 0x00, 0x07, 0x9a, 0x00, 0x00, 0x20, 0x74, 0x00, 0x00, 0x20, 0x8e, 0x00, 0x00, 0x07, 0xa2, 0x00, 0x00, 0x20, 0x90, 0x00, 0x00, 0x20, 0x9c, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x00, 0x20, 0xa0, 0x00, 0x00, 0x20, 0xb5, 0x00, 0x00, 0x07, 0xca, 0x00, 0x00, 0x20, 0xb8, 0x00, 0x00, 0x20, 0xba, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x20, 0xd0, 0x00, 0x00, 0x20, 0xd1, 0x00, 0x00, 0x07, 0xe3, 0x00, 0x00, 0x20, 0xd6, 0x00, 0x00, 0x20, 0xd7, 0x00, 0x00, 0x07, 0xe5, 0x00, 0x00, 0x20, 0xdb, 0x00, 0x00, 0x20, 0xdc, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 0x20, 0xe1, 0x00, 0x00, 0x20, 0xe1, 0x00, 0x00, 0x07, 0xe9, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x09, 0x00, 0x00, 0x07, 0xea, 0x00, 0x00, 0x21, 0x0b, 0x00, 0x00, 0x21, 0x49, 0x00, 0x00, 0x07, 0xf4, 0x00, 0x00, 0x21, 0x4b, 0x00, 0x00, 0x21, 0x4b, 0x00, 0x00, 0x08, 0x33, 0x00, 0x00, 0x21, 0x4e, 0x00, 0x00, 0x21, 0x4e, 0x00, 0x00, 0x08, 0x34, 0x00, 0x00, 0x21, 0x50, 0x00, 0x00, 0x21, 0x85, 0x00, 0x00, 0x08, 0x35, 0x00, 0x00, 0x21, 0x89, 0x00, 0x00, 0x21, 0x89, 0x00, 0x00, 0x08, 0x6b, 0x00, 0x00, 0x21, 0x90, 0x00, 0x00, 0x23, 0x11, 0x00, 0x00, 0x08, 0x6c, 0x00, 0x00, 0x23, 0x18, 0x00, 0x00, 0x23, 0x19, 0x00, 0x00, 0x09, 0xee, 0x00, 0x00, 0x23, 0x1c, 0x00, 0x00, 0x23, 0x21, 0x00, 0x00, 0x09, 0xf0, 0x00, 0x00, 0x23, 0x24, 0x00, 0x00, 0x23, 0x28, 0x00, 0x00, 0x09, 0xf6, 0x00, 0x00, 0x23, 0x2b, 0x00, 0x00, 0x23, 0x2c, 0x00, 0x00, 0x09, 0xfb, 0x00, 0x00, 0x23, 0x73, 0x00, 0x00, 0x23, 0x75, 0x00, 0x00, 0x09, 0xfd, 0x00, 0x00, 0x23, 0x7a, 0x00, 0x00, 0x23, 0x7a, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x23, 0x7d, 0x00, 0x00, 0x23, 0x7d, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x23, 0x87, 0x00, 0x00, 0x23, 0x87, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x23, 0x94, 0x00, 0x00, 0x23, 0x94, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x23, 0x9b, 0x00, 0x00, 0x23, 0xae, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x23, 0xce, 0x00, 0x00, 0x23, 0xcf, 0x00, 0x00, 0x0a, 0x18, 0x00, 0x00, 0x23, 0xe3, 0x00, 0x00, 0x23, 0xe3, 0x00, 0x00, 0x0a, 0x1a, 0x00, 0x00, 0x23, 0xe5, 0x00, 0x00, 0x23, 0xe5, 0x00, 0x00, 0x0a, 0x1b, 0x00, 0x00, 0x23, 0xe8, 0x00, 0x00, 0x23, 0xe8, 0x00, 0x00, 0x0a, 0x1c, 0x00, 0x00, 0x24, 0x22, 0x00, 0x00, 0x24, 0x23, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x00, 0x24, 0x60, 0x00, 0x00, 0x24, 0x69, 0x00, 0x00, 0x0a, 0x1f, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x9c, 0x00, 0x00, 0x0a, 0x29, 0x00, 0x00, 0x26, 0xa0, 0x00, 0x00, 0x26, 0xb8, 0x00, 0x00, 0x0b, 0xc6, 0x00, 0x00, 0x26, 0xc0, 0x00, 0x00, 0x26, 0xc3, 0x00, 0x00, 0x0b, 0xdf, 0x00, 0x00, 0x26, 0xe2, 0x00, 0x00, 0x26, 0xe2, 0x00, 0x00, 0x0b, 0xe3, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x27, 0x04, 0x00, 0x00, 0x0b, 0xe4, 0x00, 0x00, 0x27, 0x06, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x0b, 0xe8, 0x00, 0x00, 0x27, 0x0c, 0x00, 0x00, 0x27, 0x27, 0x00, 0x00, 0x0b, 0xec, 0x00, 0x00, 0x27, 0x29, 0x00, 0x00, 0x27, 0x4b, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x27, 0x4d, 0x00, 0x00, 0x27, 0x4d, 0x00, 0x00, 0x0c, 0x2b, 0x00, 0x00, 0x27, 0x4f, 0x00, 0x00, 0x27, 0x52, 0x00, 0x00, 0x0c, 0x2c, 0x00, 0x00, 0x27, 0x56, 0x00, 0x00, 0x27, 0x56, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x27, 0x58, 0x00, 0x00, 0x27, 0x5e, 0x00, 0x00, 0x0c, 0x31, 0x00, 0x00, 0x27, 0x61, 0x00, 0x00, 0x27, 0x94, 0x00, 0x00, 0x0c, 0x38, 0x00, 0x00, 0x27, 0x98, 0x00, 0x00, 0x27, 0xaf, 0x00, 0x00, 0x0c, 0x6c, 0x00, 0x00, 0x27, 0xb1, 0x00, 0x00, 0x27, 0xbe, 0x00, 0x00, 0x0c, 0x84, 0x00, 0x00, 0x27, 0xc5, 0x00, 0x00, 0x27, 0xc6, 0x00, 0x00, 0x0c, 0x92, 0x00, 0x00, 0x27, 0xe0, 0x00, 0x00, 0x27, 0xe0, 0x00, 0x00, 0x0c, 0x94, 0x00, 0x00, 0x27, 0xe6, 0x00, 0x00, 0x27, 0xeb, 0x00, 0x00, 0x0c, 0x95, 0x00, 0x00, 0x27, 0xf0, 0x00, 0x00, 0x28, 0xff, 0x00, 0x00, 0x0c, 0x9b, 0x00, 0x00, 0x29, 0x06, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x0d, 0xab, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, 0x29, 0x0b, 0x00, 0x00, 0x0d, 0xad, 0x00, 0x00, 0x29, 0x40, 0x00, 0x00, 0x29, 0x41, 0x00, 0x00, 0x0d, 0xaf, 0x00, 0x00, 0x29, 0x83, 0x00, 0x00, 0x29, 0x84, 0x00, 0x00, 0x0d, 0xb1, 0x00, 0x00, 0x29, 0xce, 0x00, 0x00, 0x29, 0xd5, 0x00, 0x00, 0x0d, 0xb3, 0x00, 0x00, 0x29, 0xeb, 0x00, 0x00, 0x29, 0xeb, 0x00, 0x00, 0x0d, 0xbb, 0x00, 0x00, 0x29, 0xfa, 0x00, 0x00, 0x29, 0xfb, 0x00, 0x00, 0x0d, 0xbc, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x0d, 0xbe, 0x00, 0x00, 0x2a, 0x0c, 0x00, 0x00, 0x2a, 0x1c, 0x00, 0x00, 0x0d, 0xc1, 0x00, 0x00, 0x2a, 0x2f, 0x00, 0x00, 0x2a, 0x2f, 0x00, 0x00, 0x0d, 0xd2, 0x00, 0x00, 0x2a, 0x6a, 0x00, 0x00, 0x2a, 0x6b, 0x00, 0x00, 0x0d, 0xd3, 0x00, 0x00, 0x2a, 0x7d, 0x00, 0x00, 0x2a, 0xa0, 0x00, 0x00, 0x0d, 0xd5, 0x00, 0x00, 0x2a, 0xae, 0x00, 0x00, 0x2a, 0xba, 0x00, 0x00, 0x0d, 0xf9, 0x00, 0x00, 0x2a, 0xf9, 0x00, 0x00, 0x2a, 0xfa, 0x00, 0x00, 0x0e, 0x06, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x1a, 0x00, 0x00, 0x0e, 0x08, 0x00, 0x00, 0x2b, 0x1f, 0x00, 0x00, 0x2b, 0x24, 0x00, 0x00, 0x0e, 0x23, 0x00, 0x00, 0x2b, 0x53, 0x00, 0x00, 0x2b, 0x54, 0x00, 0x00, 0x0e, 0x29, 0x00, 0x00, 0x2c, 0x60, 0x00, 0x00, 0x2c, 0x77, 0x00, 0x00, 0x0e, 0x2b, 0x00, 0x00, 0x2c, 0x79, 0x00, 0x00, 0x2c, 0x7f, 0x00, 0x00, 0x0e, 0x43, 0x00, 0x00, 0xa7, 0x08, 0x00, 0x00, 0xa7, 0x16, 0x00, 0x00, 0x0e, 0x4a, 0x00, 0x00, 0xa7, 0x1b, 0x00, 0x00, 0xa7, 0x1f, 0x00, 0x00, 0x0e, 0x59, 0x00, 0x00, 0xa7, 0x22, 0x00, 0x00, 0xa7, 0x2b, 0x00, 0x00, 0x0e, 0x5e, 0x00, 0x00, 0xa7, 0x30, 0x00, 0x00, 0xa7, 0x41, 0x00, 0x00, 0x0e, 0x68, 0x00, 0x00, 0xa7, 0x46, 0x00, 0x00, 0xa7, 0x4b, 0x00, 0x00, 0x0e, 0x7a, 0x00, 0x00, 0xa7, 0x4e, 0x00, 0x00, 0xa7, 0x53, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, 0xa7, 0x56, 0x00, 0x00, 0xa7, 0x57, 0x00, 0x00, 0x0e, 0x86, 0x00, 0x00, 0xa7, 0x64, 0x00, 0x00, 0xa7, 0x67, 0x00, 0x00, 0x0e, 0x88, 0x00, 0x00, 0xa7, 0x80, 0x00, 0x00, 0xa7, 0x83, 0x00, 0x00, 0x0e, 0x8c, 0x00, 0x00, 0xa7, 0x89, 0x00, 0x00, 0xa7, 0x8e, 0x00, 0x00, 0x0e, 0x90, 0x00, 0x00, 0xa7, 0x90, 0x00, 0x00, 0xa7, 0x91, 0x00, 0x00, 0x0e, 0x96, 0x00, 0x00, 0xa7, 0xa0, 0x00, 0x00, 0xa7, 0xaa, 0x00, 0x00, 0x0e, 0x98, 0x00, 0x00, 0xa7, 0xfa, 0x00, 0x00, 0xa7, 0xff, 0x00, 0x00, 0x0e, 0xa3, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xef, 0x19, 0x00, 0x00, 0x0e, 0xa9, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x0e, 0xc3, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x26, 0x00, 0x00, 0x0e, 0xc7, 0x00, 0x00, 0xf4, 0x28, 0x00, 0x00, 0xf4, 0x41, 0x00, 0x00, 0x0e, 0xee, 0x00, 0x00, 0xf6, 0xc5, 0x00, 0x00, 0xf6, 0xc5, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfb, 0x06, 0x00, 0x00, 0x0f, 0x09, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xfe, 0x23, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xff, 0xf9, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x0f, 0x14, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01, 0x03, 0x1e, 0x00, 0x00, 0x0f, 0x19, 0x00, 0x01, 0x03, 0x20, 0x00, 0x01, 0x03, 0x23, 0x00, 0x00, 0x0f, 0x38, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x01, 0xd3, 0x56, 0x00, 0x00, 0x0f, 0x3c, 0x00, 0x01, 0xd5, 0x38, 0x00, 0x01, 0xd5, 0x39, 0x00, 0x00, 0x0f, 0x93, 0x00, 0x01, 0xd5, 0x3b, 0x00, 0x01, 0xd5, 0x3e, 0x00, 0x00, 0x0f, 0x95, 0x00, 0x01, 0xd5, 0x40, 0x00, 0x01, 0xd5, 0x44, 0x00, 0x00, 0x0f, 0x99, 0x00, 0x01, 0xd5, 0x46, 0x00, 0x01, 0xd5, 0x46, 0x00, 0x00, 0x0f, 0x9e, 0x00, 0x01, 0xd5, 0x4a, 0x00, 0x01, 0xd5, 0x50, 0x00, 0x00, 0x0f, 0x9f, 0x00, 0x01, 0xd5, 0x52, 0x00, 0x01, 0xd5, 0x6b, 0x00, 0x00, 0x0f, 0xa6, 0x00, 0x01, 0xd5, 0xa0, 0x00, 0x01, 0xd5, 0xd3, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x01, 0xd7, 0xd8, 0x00, 0x01, 0xd7, 0xeb, 0x00, 0x00, 0x0f, 0xf4, 0x00, 0x01, 0xf0, 0x30, 0x00, 0x01, 0xf0, 0x93, 0x00, 0x00, 0x10, 0x08, 0x00, 0x01, 0xf0, 0xa0, 0x00, 0x01, 0xf0, 0xae, 0x00, 0x00, 0x10, 0x6c, 0x00, 0x01, 0xf0, 0xb1, 0x00, 0x01, 0xf0, 0xbe, 0x00, 0x00, 0x10, 0x7b, 0x00, 0x01, 0xf0, 0xc1, 0x00, 0x01, 0xf0, 0xcf, 0x00, 0x00, 0x10, 0x89, 0x00, 0x01, 0xf0, 0xd1, 0x00, 0x01, 0xf0, 0xdf, 0x00, 0x00, 0x10, 0x98, 0x00, 0x01, 0xf4, 0x2d, 0x00, 0x01, 0xf4, 0x2e, 0x00, 0x00, 0x10, 0xa7, 0x00, 0x01, 0xf4, 0x31, 0x00, 0x01, 0xf4, 0x31, 0x00, 0x00, 0x10, 0xa9, 0x00, 0x01, 0xf4, 0x35, 0x00, 0x01, 0xf4, 0x35, 0x00, 0x00, 0x10, 0xaa, 0x00, 0x01, 0xf6, 0x00, 0x00, 0x01, 0xf6, 0x23, 0x00, 0x00, 0x10, 0xab, 0x00, 0x01, 0xf6, 0x25, 0x00, 0x01, 0xf6, 0x2b, 0x00, 0x00, 0x10, 0xcf, 0x00, 0x01, 0xf6, 0x2d, 0x00, 0x01, 0xf6, 0x40, 0x00, 0x00, 0x10, 0xd6, 0x00, 0x06, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x00, 0x00, 0x86, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8b, 0x00, 0x93, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xa3, 0x00, 0xa2, 0x00, 0xa4, 0x00, 0xa6, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa9, 0x00, 0xab, 0x00, 0xaa, 0x00, 0xac, 0x00, 0xad, 0x00, 0xaf, 0x00, 0xae, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb3, 0x00, 0xb5, 0x00, 0xb4, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbe, 0x07, 0x55, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x07, 0x57, 0x00, 0x78, 0x00, 0xa1, 0x00, 0x70, 0x00, 0x6b, 0x08, 0x0b, 0x00, 0x76, 0x00, 0x6a, 0x09, 0x3c, 0x00, 0x88, 0x00, 0x9a, 0x08, 0xfa, 0x00, 0x73, 0x09, 0x40, 0x09, 0x41, 0x00, 0x67, 0x00, 0x77, 0x08, 0xde, 0x08, 0xed, 0x08, 0xeb, 0x03, 0x54, 0x09, 0x07, 0x00, 0x6c, 0x00, 0x7c, 0x03, 0x3d, 0x00, 0xa8, 0x00, 0xba, 0x00, 0x81, 0x00, 0x63, 0x00, 0x6e, 0x08, 0xf6, 0x01, 0x54, 0x09, 0x24, 0x08, 0xe2, 0x00, 0x6d, 0x00, 0x7d, 0x07, 0x5b, 0x00, 0x62, 0x00, 0x82, 0x00, 0x85, 0x00, 0x97, 0x01, 0x14, 0x01, 0x15, 0x07, 0x48, 0x07, 0x49, 0x07, 0x51, 0x07, 0x52, 0x07, 0x4d, 0x07, 0x4e, 0x00, 0xb9, 0x0a, 0xf3, 0x00, 0xc1, 0x01, 0x3a, 0x07, 0x79, 0x07, 0xd6, 0x07, 0x6e, 0x07, 0x6f, 0x0f, 0x0a, 0x0f, 0x0b, 0x07, 0x56, 0x00, 0x79, 0x07, 0x4f, 0x07, 0x53, 0x07, 0x65, 0x00, 0x84, 0x00, 0x8c, 0x00, 0x83, 0x00, 0x8d, 0x00, 0x8a, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x8e, 0x00, 0x95, 0x00, 0x96, 0x00, 0x00, 0x00, 0x94, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9b, 0x00, 0xf3, 0x02, 0x88, 0x02, 0x9e, 0x00, 0x71, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x00, 0x7a, 0x02, 0x9f, 0x02, 0x9d, 0x02, 0x89, 0x00, 0x00, 0x01, 0x35, 0x00, 0xb8, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xc1, 0x00, 0xaa, 0x00, 0x9c, 0x01, 0xa6, 0x00, 0xb8, 0x00, 0x66, 0x00, 0x00, 0x00, 0x71, 0x00, 0xcb, 0x00, 0xa0, 0x02, 0xb2, 0x00, 0x85, 0x00, 0x75, 0x00, 0xb8, 0x00, 0xc3, 0x01, 0xcb, 0x01, 0x89, 0x02, 0x2d, 0x00, 0xcb, 0x00, 0xa6, 0x00, 0xf0, 0x00, 0xd3, 0x00, 0xaa, 0x00, 0x87, 0x00, 0xcb, 0x03, 0xaa, 0x04, 0x00, 0x01, 0x4a, 0x00, 0x33, 0x00, 0xcb, 0x00, 0x00, 0x00, 0xd9, 0x05, 0x02, 0x00, 0xf4, 0x01, 0x54, 0x00, 0xb4, 0x00, 0x9c, 0x01, 0x39, 0x01, 0x14, 0x01, 0x39, 0x07, 0x06, 0x04, 0x00, 0x04, 0x4e, 0x04, 0xb4, 0x04, 0x52, 0x04, 0xb8, 0x04, 0xe7, 0x04, 0xcd, 0x00, 0x37, 0x04, 0x73, 0x04, 0xcd, 0x04, 0x60, 0x04, 0x73, 0x01, 0x33, 0x03, 0xa2, 0x05, 0x56, 0x05, 0xa6, 0x05, 0x56, 0x05, 0x39, 0x03, 0xc5, 0x02, 0x12, 0x00, 0xc9, 0x00, 0x1f, 0x00, 0xb8, 0x01, 0xdf, 0x00, 0x73, 0x00, 0xba, 0x03, 0xe9, 0x03, 0x33, 0x03, 0xbc, 0x04, 0x44, 0x04, 0x0e, 0x00, 0xdf, 0x03, 0xcd, 0x03, 0xaa, 0x00, 0xe5, 0x03, 0xaa, 0x04, 0x04, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x8f, 0x00, 0xa4, 0x00, 0x7b, 0x00, 0xb8, 0x00, 0x14, 0x01, 0x6f, 0x00, 0x7f, 0x02, 0x7b, 0x02, 0x52, 0x00, 0x8f, 0x00, 0xc7, 0x05, 0xcd, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x6f, 0x00, 0xcb, 0x00, 0xcd, 0x01, 0x9e, 0x01, 0xd3, 0x00, 0xf0, 0x00, 0xba, 0x01, 0x83, 0x00, 0xd5, 0x00, 0x98, 0x03, 0x04, 0x02, 0x48, 0x00, 0x9e, 0x01, 0xd5, 0x00, 0xc1, 0x00, 0xcb, 0x00, 0xf6, 0x00, 0x83, 0x03, 0x54, 0x02, 0x7f, 0x00, 0x00, 0x03, 0x33, 0x02, 0x66, 0x00, 0xd3, 0x00, 0xc7, 0x00, 0xa4, 0x00, 0xcd, 0x00, 0x8f, 0x00, 0x9a, 0x00, 0x73, 0x04, 0x00, 0x05, 0xd5, 0x01, 0x0a, 0x00, 0xfe, 0x02, 0x2b, 0x00, 0xa4, 0x00, 0xb4, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x62, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x1d, 0x03, 0x2d, 0x05, 0xd5, 0x05, 0xd5, 0x05, 0xd5, 0x05, 0xf0, 0x00, 0x7f, 0x00, 0x7b, 0x00, 0x54, 0x00, 0xa4, 0x06, 0xb8, 0x06, 0x14, 0x07, 0x23, 0x01, 0xd3, 0x00, 0xb8, 0x00, 0xcb, 0x00, 0xa6, 0x01, 0xc3, 0x01, 0xec, 0x06, 0x93, 0x00, 0xa0, 0x00, 0xd3, 0x03, 0x5c, 0x03, 0x71, 0x03, 0xdb, 0x01, 0x85, 0x04, 0x23, 0x04, 0xa8, 0x04, 0x48, 0x00, 0x8f, 0x01, 0x39, 0x01, 0x14, 0x01, 0x39, 0x03, 0x60, 0x00, 0x8f, 0x05, 0xd5, 0x01, 0x9a, 0x06, 0x14, 0x07, 0x23, 0x06, 0x66, 0x01, 0x79, 0x04, 0x60, 0x04, 0x60, 0x04, 0x60, 0x04, 0x7b, 0x00, 0x9c, 0x00, 0x00, 0x02, 0x77, 0x04, 0x60, 0x01, 0xaa, 0x00, 0xe9, 0x04, 0x60, 0x07, 0x62, 0x00, 0x7b, 0x00, 0xc5, 0x00, 0x7f, 0x02, 0x7b, 0x00, 0x00, 0x00, 0xb4, 0x02, 0x52, 0x05, 0xcd, 0x00, 0x66, 0x00, 0xbc, 0x00, 0x66, 0x00, 0x77, 0x06, 0x10, 0x00, 0xcd, 0x01, 0x3b, 0x01, 0x85, 0x03, 0x89, 0x00, 0x8f, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1d, 0x00, 0xcd, 0x07, 0x4a, 0x04, 0x2f, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x00, 0x07, 0x7d, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6f, 0x03, 0x35, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x7b, 0x00, 0xae, 0x00, 0xb2, 0x00, 0x2d, 0x03, 0x96, 0x00, 0x8f, 0x02, 0x7b, 0x00, 0xf6, 0x00, 0x83, 0x03, 0x54, 0x06, 0x37, 0x05, 0xf6, 0x00, 0x8f, 0x00, 0x9c, 0x04, 0xe1, 0x02, 0x66, 0x00, 0x8f, 0x01, 0x8d, 0x02, 0xf6, 0x00, 0xcd, 0x03, 0x44, 0x00, 0x29, 0x00, 0x66, 0x04, 0xee, 0x00, 0x73, 0x00, 0x00, 0x14, 0x00, 0x00, 0x96, 0x00, 0x00, 0xb7, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x2c, 0x20, 0x10, 0xb0, 0x02, 0x25, 0x49, 0x64, 0xb0, 0x40, 0x51, 0x58, 0x20, 0xc8, 0x59, 0x21, 0x2d, 0x2c, 0xb0, 0x02, 0x25, 0x49, 0x64, 0xb0, 0x40, 0x51, 0x58, 0x20, 0xc8, 0x59, 0x21, 0x2d, 0x2c, 0x20, 0x10, 0x07, 0x20, 0xb0, 0x00, 0x50, 0xb0, 0x0d, 0x79, 0x20, 0xb8, 0xff, 0xff, 0x50, 0x58, 0x04, 0x1b, 0x05, 0x59, 0xb0, 0x05, 0x1c, 0xb0, 0x03, 0x25, 0x08, 0xb0, 0x04, 0x25, 0x23, 0xe1, 0x20, 0xb0, 0x00, 0x50, 0xb0, 0x0d, 0x79, 0x20, 0xb8, 0xff, 0xff, 0x50, 0x58, 0x04, 0x1b, 0x05, 0x59, 0xb0, 0x05, 0x1c, 0xb0, 0x03, 0x25, 0x08, 0xe1, 0x2d, 0x2c, 0x4b, 0x50, 0x58, 0x20, 0xb0, 0xfd, 0x45, 0x44, 0x59, 0x21, 0x2d, 0x2c, 0xb0, 0x02, 0x25, 0x45, 0x60, 0x44, 0x2d, 0x2c, 0x4b, 0x53, 0x58, 0xb0, 0x02, 0x25, 0xb0, 0x02, 0x25, 0x45, 0x44, 0x59, 0x21, 0x21, 0x2d, 0x2c, 0x45, 0x44, 0x2d, 0x2c, 0xb0, 0x02, 0x25, 0xb0, 0x02, 0x25, 0x49, 0xb0, 0x05, 0x25, 0xb0, 0x05, 0x25, 0x49, 0x60, 0xb0, 0x20, 0x63, 0x68, 0x20, 0x8a, 0x10, 0x8a, 0x23, 0x3a, 0x8a, 0x10, 0x65, 0x3a, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0xff, 0xff, 0x00, 0x03, 0x00, 0x02, 0x00, 0x5b, 0xfe, 0x96, 0x03, 0xf6, 0x05, 0xa4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x5c, 0x03, 0x99, 0xfc, 0xce, 0x02, 0xcc, 0xfd, 0x34, 0xfe, 0x96, 0x07, 0x0e, 0xf8, 0xf2, 0x72, 0x06, 0x29, 0x00, 0x00, 0x00, 0x02, 0x01, 0x16, 0x00, 0x00, 0x01, 0xcd, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x11, 0x33, 0x11, 0x03, 0x23, 0x03, 0x01, 0x16, 0xb7, 0xb7, 0xb7, 0x12, 0x92, 0x13, 0xfe, 0xfe, 0x05, 0xd5, 0xfd, 0x71, 0xfe, 0x9b, 0x01, 0x65, 0x00, 0x02, 0x00, 0xb1, 0x03, 0xaa, 0x02, 0x9f, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0x4a, 0x99, 0x01, 0xed, 0x98, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x00, 0x05, 0x7c, 0x05, 0xbe, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x03, 0x21, 0x0b, 0x01, 0x21, 0x13, 0x33, 0x03, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x03, 0x23, 0x13, 0x21, 0x03, 0x23, 0x13, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x13, 0x03, 0xae, 0xfe, 0xfa, 0x4b, 0x01, 0x07, 0x3d, 0x5d, 0x01, 0x06, 0x5f, 0x90, 0x5d, 0x01, 0x19, 0xfe, 0xc4, 0x4a, 0x01, 0x1f, 0xfe, 0xbe, 0x5d, 0x90, 0x5c, 0xfe, 0xf9, 0x5d, 0x91, 0x5e, 0xfe, 0xe4, 0x01, 0x3d, 0x4c, 0xfe, 0xde, 0x01, 0x45, 0x5c, 0x03, 0x85, 0xfe, 0xb2, 0x03, 0x87, 0xfe, 0x61, 0x01, 0x9f, 0xfe, 0x61, 0x9a, 0xfe, 0xb2, 0x99, 0xfe, 0x62, 0x01, 0x9e, 0xfe, 0x62, 0x01, 0x9e, 0x99, 0x01, 0x4e, 0x9a, 0x01, 0x9f, 0x00, 0x00, 0x03, 0x00, 0x99, 0xfe, 0xd3, 0x03, 0xfc, 0x06, 0x14, 0x00, 0x21, 0x00, 0x28, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x23, 0x03, 0x2e, 0x01, 0x27, 0x35, 0x1e, 0x01, 0x17, 0x11, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x1e, 0x01, 0x17, 0x15, 0x2e, 0x01, 0x27, 0x11, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x03, 0x11, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x11, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x02, 0x6f, 0x5a, 0x01, 0x5f, 0xbd, 0x5f, 0x5c, 0xbc, 0x64, 0xc7, 0xb5, 0xc4, 0xb8, 0x5a, 0x53, 0x9d, 0x4b, 0x4b, 0x9d, 0x53, 0xcc, 0xc1, 0xcd, 0xc0, 0x5a, 0x69, 0x6d, 0x65, 0xcb, 0x72, 0x74, 0x6f, 0xfe, 0xd3, 0x01, 0x2d, 0x02, 0x2d, 0x2d, 0xb4, 0x40, 0x41, 0x01, 0x01, 0xc8, 0x24, 0xac, 0x96, 0xa3, 0xbc, 0x0e, 0xeb, 0xe8, 0x04, 0x1f, 0x1b, 0xaf, 0x2a, 0x2e, 0x04, 0xfe, 0x55, 0x23, 0xb4, 0x9c, 0xa9, 0xc3, 0x0f, 0x03, 0x00, 0x01, 0x9a, 0x0d, 0x6a, 0x58, 0x56, 0x60, 0xd5, 0xfe, 0x4f, 0x11, 0x6e, 0x5a, 0x58, 0x68, 0x00, 0x05, 0x00, 0x65, 0xff, 0xe3, 0x06, 0x72, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x27, 0x00, 0x33, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x25, 0x33, 0x01, 0x23, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0x3c, 0x4e, 0x59, 0x59, 0x4e, 0x4d, 0x59, 0x59, 0x4d, 0x8e, 0xa8, 0xa9, 0x8d, 0x90, 0xa7, 0xa8, 0xfc, 0xee, 0x4d, 0x59, 0x58, 0x4e, 0x4f, 0x59, 0x5a, 0x02, 0xdf, 0x90, 0xfc, 0xb7, 0x90, 0x1c, 0x8f, 0xa9, 0xa9, 0x8f, 0x8f, 0xa6, 0xa7, 0x02, 0x91, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x7f, 0xdc, 0xbb, 0xbb, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x02, 0x61, 0x95, 0x82, 0x84, 0x94, 0x94, 0x84, 0x81, 0x96, 0x7f, 0xf9, 0xf3, 0x06, 0x0d, 0xdb, 0xbb, 0xbd, 0xda, 0xdb, 0xbc, 0xba, 0xdc, 0x00, 0x02, 0x00, 0x74, 0xff, 0xe3, 0x05, 0x65, 0x05, 0xf0, 0x00, 0x09, 0x00, 0x30, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x09, 0x01, 0x3e, 0x01, 0x37, 0x33, 0x06, 0x02, 0x07, 0x13, 0x23, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0xc0, 0x52, 0x4c, 0xbf, 0x90, 0x55, 0x96, 0x41, 0xfe, 0xa2, 0x01, 0xc9, 0x35, 0x3c, 0x05, 0xa8, 0x0b, 0x5e, 0x53, 0xfb, 0xe3, 0x81, 0x5d, 0xce, 0x76, 0xd8, 0xfe, 0xec, 0x79, 0x78, 0x2b, 0x2d, 0xc8, 0xa5, 0x4b, 0x95, 0x4c, 0x4e, 0x8e, 0x3e, 0x5e, 0x76, 0x35, 0x03, 0x23, 0x51, 0xa1, 0x58, 0x92, 0xc2, 0x3f, 0x40, 0x02, 0x8f, 0xfd, 0xf8, 0x59, 0xcb, 0x72, 0x84, 0xfe, 0xfe, 0x7e, 0xfe, 0xe3, 0x93, 0x59, 0x57, 0x01, 0x13, 0xd7, 0x80, 0xe1, 0x63, 0x3f, 0x7d, 0x3c, 0xa2, 0xc5, 0x24, 0x24, 0xb6, 0x2f, 0x31, 0x6f, 0x58, 0x33, 0x67, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb1, 0x03, 0xaa, 0x01, 0x4b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x4a, 0x99, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x3c, 0x06, 0x12, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x23, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x02, 0x3c, 0x79, 0x75, 0x76, 0x78, 0x90, 0x88, 0x86, 0x86, 0x88, 0x06, 0x12, 0xe6, 0xfe, 0x3e, 0xe7, 0xe7, 0xfe, 0x3b, 0xe5, 0xeb, 0x01, 0xc6, 0xe0, 0xdf, 0x01, 0xc4, 0xec, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x93, 0xfe, 0xf2, 0x02, 0x31, 0x06, 0x12, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x23, 0x36, 0x12, 0x35, 0x34, 0x02, 0x94, 0x90, 0x87, 0x86, 0x86, 0x87, 0x90, 0x77, 0x76, 0x76, 0x06, 0x12, 0xec, 0xfe, 0x3c, 0xdf, 0xe0, 0xfe, 0x3a, 0xeb, 0xe5, 0x01, 0xc5, 0xe7, 0xe7, 0x01, 0xc2, 0x00, 0x00, 0x01, 0x00, 0x36, 0x02, 0x4a, 0x03, 0x63, 0x05, 0xf0, 0x00, 0x11, 0x00, 0x00, 0x01, 0x0d, 0x01, 0x07, 0x25, 0x11, 0x23, 0x11, 0x05, 0x27, 0x2d, 0x01, 0x37, 0x05, 0x11, 0x33, 0x11, 0x25, 0x03, 0x63, 0xfe, 0xbd, 0x01, 0x43, 0x35, 0xfe, 0xd2, 0x66, 0xfe, 0xd1, 0x34, 0x01, 0x43, 0xfe, 0xbd, 0x34, 0x01, 0x2f, 0x66, 0x01, 0x2e, 0x04, 0xdf, 0xc2, 0xc3, 0x62, 0xcb, 0xfe, 0x87, 0x01, 0x79, 0xcb, 0x62, 0xc3, 0xc2, 0x63, 0xcb, 0x01, 0x79, 0xfe, 0x87, 0xcb, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x03, 0x50, 0x01, 0xf5, 0xfe, 0x0b, 0x97, 0xfe, 0x0a, 0x01, 0xf6, 0x05, 0x04, 0xfd, 0xd3, 0xaa, 0xfd, 0xd3, 0x02, 0x2d, 0xaa, 0x02, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xff, 0x12, 0x01, 0x96, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x00, 0x37, 0x33, 0x15, 0x03, 0x23, 0x13, 0xd8, 0xbe, 0x94, 0x74, 0x4a, 0xfe, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xdf, 0x02, 0x40, 0x02, 0x83, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x01, 0xe5, 0xfe, 0x1b, 0x02, 0x83, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc5, 0x00, 0x00, 0x01, 0x83, 0x00, 0xfe, 0x00, 0x03, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0xfe, 0xfe, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x42, 0x02, 0x6d, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x01, 0xd4, 0x99, 0xfe, 0x2c, 0x99, 0x05, 0xd5, 0xf9, 0x6d, 0x00, 0x02, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x1b, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x27, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x02, 0x4a, 0x8c, 0x8e, 0x8e, 0x8c, 0x8d, 0x8d, 0x8d, 0x8d, 0xe2, 0xee, 0xee, 0xe2, 0xe2, 0xee, 0xee, 0x05, 0x50, 0xfe, 0xcd, 0xfe, 0xcc, 0xfe, 0xcd, 0xfe, 0xcd, 0x01, 0x33, 0x01, 0x33, 0x01, 0x34, 0x01, 0x33, 0xa0, 0xfe, 0x73, 0xfe, 0x86, 0xfe, 0x87, 0xfe, 0x73, 0x01, 0x8d, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x8d, 0x00, 0x01, 0x00, 0xca, 0x00, 0x00, 0x03, 0xeb, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x00, 0x37, 0x21, 0x11, 0x05, 0x35, 0x25, 0x33, 0x11, 0x21, 0x15, 0x21, 0xe5, 0x01, 0x29, 0xfe, 0xbc, 0x01, 0x42, 0xb6, 0x01, 0x29, 0xfc, 0xfa, 0xaa, 0x04, 0x73, 0x48, 0xb8, 0x48, 0xfa, 0xd5, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0xdd, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x35, 0x36, 0x00, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x02, 0x01, 0x62, 0x02, 0x7a, 0xfc, 0xab, 0x67, 0x01, 0x66, 0x2e, 0x57, 0x45, 0x96, 0x79, 0x55, 0xbe, 0x6c, 0x6e, 0xbf, 0x4f, 0xd1, 0xf8, 0x3e, 0x52, 0x17, 0xf1, 0xaa, 0xaa, 0xaa, 0x77, 0x01, 0x91, 0x3a, 0x6d, 0x97, 0x49, 0x77, 0x96, 0x42, 0x43, 0xcc, 0x31, 0x32, 0xe8, 0xc2, 0x5c, 0xa5, 0x70, 0x1d, 0xfe, 0xeb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, 0xff, 0xe3, 0x04, 0x02, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x02, 0xec, 0x82, 0x93, 0xfe, 0xef, 0xfc, 0x55, 0xb3, 0x60, 0x4c, 0xb4, 0x62, 0xab, 0xb3, 0xa6, 0x95, 0x9c, 0xa3, 0x86, 0x8f, 0x93, 0x89, 0x4b, 0xaa, 0x67, 0x67, 0xb5, 0x50, 0xcf, 0xf2, 0x80, 0x03, 0x25, 0x1f, 0xc4, 0x90, 0xdd, 0xf2, 0x25, 0x25, 0xc3, 0x31, 0x32, 0x96, 0x8f, 0x84, 0x95, 0xa6, 0x77, 0x70, 0x73, 0x7b, 0x24, 0x26, 0xb4, 0x20, 0x20, 0xd1, 0xb2, 0x7c, 0xab, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x04, 0x2e, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x02, 0xb9, 0xfe, 0x35, 0x01, 0xcb, 0x30, 0xe5, 0xbf, 0xbf, 0xb5, 0xfd, 0xa1, 0x05, 0x25, 0xfc, 0xe3, 0x03, 0xcd, 0xfc, 0x33, 0xa8, 0xfe, 0xa0, 0x01, 0x60, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xff, 0xe3, 0x03, 0xf4, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x15, 0x14, 0x00, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0xc7, 0x02, 0xca, 0xfd, 0xdc, 0x28, 0x4f, 0x28, 0xe1, 0x01, 0x07, 0xfe, 0xf2, 0xf6, 0x55, 0xaf, 0x5e, 0x51, 0xad, 0x60, 0x9c, 0xb6, 0xb6, 0x9c, 0x49, 0x91, 0x4b, 0x05, 0xd5, 0xaa, 0xfe, 0x92, 0x0f, 0x0f, 0xfe, 0xee, 0xea, 0xf1, 0xfe, 0xf5, 0x20, 0x20, 0xcb, 0x31, 0x30, 0xb6, 0x9c, 0x9c, 0xb6, 0x24, 0x26, 0x00, 0x00, 0x02, 0x00, 0x80, 0xff, 0xe3, 0x04, 0x21, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x03, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x02, 0x60, 0x7a, 0x8f, 0x8f, 0x7a, 0x7b, 0x8f, 0x8f, 0xee, 0x44, 0x8c, 0x44, 0xb4, 0xbe, 0x0d, 0x35, 0xa0, 0x60, 0xcb, 0xeb, 0xf5, 0xcc, 0xe9, 0xf6, 0x01, 0x2e, 0x00, 0xff, 0x44, 0x8c, 0x03, 0x3b, 0xba, 0xa2, 0xa1, 0xbb, 0xbb, 0xa1, 0xa2, 0xba, 0x02, 0x79, 0xb8, 0x24, 0x26, 0xfe, 0xf2, 0xfe, 0xef, 0x57, 0x5d, 0xfe, 0xef, 0xeb, 0xe6, 0xfe, 0xea, 0x01, 0x8d, 0x01, 0x79, 0x01, 0x62, 0x01, 0xa5, 0x1e, 0x00, 0x01, 0x00, 0x97, 0x00, 0x00, 0x03, 0xf8, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x97, 0x03, 0x60, 0xfe, 0x18, 0xbd, 0x01, 0xca, 0xfd, 0x7b, 0x05, 0xd5, 0x56, 0xfa, 0x81, 0x05, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7d, 0xff, 0xe3, 0x04, 0x17, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x25, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x02, 0x4a, 0x82, 0x94, 0x94, 0x82, 0x82, 0x95, 0x95, 0xfe, 0xc8, 0x75, 0x82, 0xe5, 0xc8, 0xc9, 0xe4, 0x82, 0x74, 0x83, 0x93, 0xef, 0xde, 0xde, 0xef, 0x94, 0x41, 0x82, 0x76, 0x75, 0x84, 0x84, 0x75, 0x76, 0x82, 0x02, 0xc5, 0x9a, 0x87, 0x87, 0x9a, 0x9b, 0x86, 0x87, 0x9a, 0x56, 0x20, 0xb2, 0x80, 0xb3, 0xd0, 0xd0, 0xb3, 0x80, 0xb2, 0x20, 0x22, 0xc6, 0x8f, 0xd9, 0xe8, 0xe8, 0xd9, 0x8f, 0xc6, 0x01, 0x61, 0x74, 0x82, 0x82, 0x74, 0x74, 0x82, 0x82, 0x00, 0x02, 0x00, 0x74, 0xff, 0xe3, 0x04, 0x14, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x37, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x13, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x00, 0x23, 0x22, 0x26, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0xca, 0x45, 0x8c, 0x44, 0xb4, 0xbe, 0x0d, 0x34, 0xa0, 0x61, 0xca, 0xeb, 0xf5, 0xcb, 0xe9, 0xf6, 0xfe, 0xd3, 0xff, 0x45, 0x8c, 0x01, 0x1e, 0x7b, 0x8f, 0x8f, 0x7b, 0x7a, 0x8f, 0x8f, 0x1f, 0xb8, 0x24, 0x26, 0x01, 0x0d, 0x01, 0x12, 0x56, 0x5c, 0x01, 0x0f, 0xeb, 0xe6, 0x01, 0x16, 0xfe, 0x73, 0xfe, 0x86, 0xfe, 0x9f, 0xfe, 0x5b, 0x1e, 0x02, 0x97, 0xba, 0xa2, 0xa1, 0xbb, 0xbb, 0xa1, 0xa2, 0xba, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd8, 0x00, 0x00, 0x01, 0x96, 0x04, 0x23, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xd8, 0xbe, 0xbe, 0xbe, 0xbe, 0xfe, 0xfe, 0x04, 0x23, 0xfe, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8e, 0xff, 0x12, 0x01, 0x96, 0x04, 0x23, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x03, 0x23, 0x13, 0xd8, 0xbe, 0xbe, 0xbe, 0x94, 0x74, 0x4a, 0x04, 0x23, 0xfe, 0xfd, 0xd9, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x5e, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x45, 0xfc, 0x5f, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0xf0, 0xfe, 0x91, 0xfe, 0x93, 0xb6, 0x01, 0xd1, 0xa6, 0x01, 0xd1, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x03, 0xa2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x5e, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x06, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x9f, 0x03, 0xf0, 0xb6, 0xfe, 0x2f, 0xa6, 0xfe, 0x2f, 0xb6, 0x01, 0x6d, 0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x03, 0x52, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x13, 0x23, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x15, 0x01, 0x60, 0xb7, 0xb7, 0xb1, 0xac, 0x33, 0x51, 0x51, 0x33, 0x2e, 0x76, 0x61, 0x47, 0xa1, 0x58, 0x55, 0xae, 0x5c, 0xa6, 0xc9, 0x41, 0x51, 0x4f, 0x2b, 0x23, 0x07, 0x05, 0x06, 0xfe, 0xfe, 0x01, 0x91, 0x9a, 0x65, 0x82, 0x56, 0x59, 0x35, 0x5e, 0x31, 0x59, 0x6e, 0x46, 0x43, 0xbc, 0x39, 0x38, 0xc2, 0x9f, 0x4c, 0x89, 0x56, 0x56, 0x2f, 0x35, 0x19, 0x15, 0x3c, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x79, 0xfe, 0x9c, 0x06, 0xb3, 0x05, 0xa2, 0x00, 0x0b, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x24, 0x23, 0x22, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x04, 0x23, 0x22, 0x24, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x24, 0x33, 0x32, 0x04, 0x17, 0x1e, 0x01, 0x15, 0x10, 0x00, 0x07, 0x02, 0xae, 0x80, 0x6f, 0x6f, 0x7f, 0x82, 0x6e, 0x6d, 0x80, 0x01, 0xea, 0x36, 0x8b, 0x5d, 0x9b, 0xc1, 0xc2, 0x9a, 0x5d, 0x8c, 0x35, 0x81, 0x83, 0x95, 0x39, 0x39, 0x5e, 0xfe, 0xf3, 0x9e, 0x6f, 0xcc, 0x56, 0x8d, 0xa0, 0x68, 0x62, 0x5e, 0xf9, 0x8d, 0x74, 0xe0, 0x5e, 0x51, 0x71, 0xfe, 0xf7, 0x89, 0xa6, 0xfe, 0xd8, 0x73, 0x73, 0x78, 0x7a, 0x71, 0x74, 0x01, 0x31, 0xaa, 0xbe, 0x01, 0x47, 0x6f, 0x43, 0x47, 0xfe, 0xe2, 0xfc, 0x02, 0x19, 0x8f, 0xa3, 0xa4, 0x8e, 0x8c, 0xa5, 0xa4, 0xfe, 0x48, 0x4d, 0x49, 0xf9, 0xc8, 0xc8, 0xfa, 0x4b, 0x4c, 0x83, 0xfd, 0x20, 0x16, 0xdf, 0xb1, 0x6b, 0xbc, 0x50, 0x83, 0x8b, 0x41, 0x40, 0x66, 0xfe, 0xb5, 0xc1, 0x9f, 0xfe, 0xea, 0x6a, 0x68, 0x6d, 0x57, 0x51, 0x6f, 0x61, 0x67, 0x83, 0x7d, 0x7d, 0x01, 0x49, 0xbd, 0xb6, 0x01, 0x4a, 0x7d, 0x7f, 0x87, 0xae, 0xa0, 0x62, 0xe6, 0x7b, 0xfe, 0xf9, 0xfe, 0xd0, 0x06, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x33, 0x01, 0x23, 0x03, 0x21, 0x03, 0x23, 0x02, 0x76, 0xf7, 0x01, 0xef, 0xfe, 0xa1, 0xcf, 0x02, 0x00, 0xbd, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x05, 0x0e, 0xfd, 0x19, 0x03, 0xae, 0xfa, 0x2b, 0x01, 0x7f, 0xfe, 0x81, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x01, 0x6b, 0x01, 0x23, 0x93, 0x8d, 0x8d, 0x93, 0xfe, 0xdd, 0x01, 0x0d, 0x85, 0x83, 0x83, 0x85, 0xfe, 0x3d, 0x01, 0xd0, 0xd0, 0xe1, 0x73, 0x70, 0x87, 0x94, 0xf5, 0xe2, 0xfe, 0x1e, 0x02, 0xc9, 0xfd, 0xdd, 0x87, 0x8b, 0x8c, 0x85, 0x02, 0x66, 0xfe, 0x3e, 0x6f, 0x72, 0x71, 0x70, 0xa6, 0xc0, 0xb1, 0x89, 0xa2, 0x14, 0x20, 0xcb, 0x98, 0xc8, 0xda, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x19, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x04, 0xa3, 0x5c, 0xd0, 0x75, 0xe6, 0xf5, 0xf5, 0xe6, 0x75, 0xd0, 0x5c, 0x5f, 0xd6, 0x76, 0xfe, 0xce, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x32, 0x78, 0xd6, 0x05, 0x62, 0xd5, 0x5f, 0x5e, 0xfe, 0xc7, 0xfe, 0xd8, 0xfe, 0xd9, 0xfe, 0xc7, 0x5e, 0x5f, 0xd3, 0x48, 0x48, 0x01, 0x9f, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x47, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x25, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x01, 0x6b, 0xdb, 0x01, 0x16, 0x01, 0x03, 0xfe, 0xfd, 0xfe, 0xea, 0xfe, 0x6f, 0x01, 0x75, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfe, 0x8b, 0x05, 0x2f, 0xfb, 0x77, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xa6, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xb5, 0x03, 0x51, 0xfd, 0x65, 0x02, 0x80, 0xfd, 0x80, 0x02, 0xac, 0xfc, 0x9e, 0x05, 0xd5, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0xb5, 0x03, 0x04, 0xfd, 0xb2, 0x02, 0x15, 0xfd, 0xeb, 0xb6, 0x05, 0xd5, 0xaa, 0xfe, 0x48, 0xaa, 0xfd, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x25, 0x11, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x04, 0x49, 0xfe, 0xd7, 0x01, 0xdd, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xfe, 0x9d, 0x01, 0x63, 0x01, 0x3b, 0x83, 0xed, 0x64, 0x65, 0xe3, 0x7d, 0xf6, 0xf8, 0xf8, 0xf6, 0x61, 0x97, 0xd5, 0x01, 0x91, 0xa6, 0xfd, 0x7f, 0x53, 0x55, 0x01, 0x99, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x99, 0x48, 0x46, 0xd7, 0x5f, 0x60, 0xfe, 0xce, 0xfe, 0xd1, 0xfe, 0xd2, 0xfe, 0xce, 0x25, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0x2b, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xb5, 0xb6, 0xb6, 0x05, 0xd5, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xfe, 0x66, 0x01, 0x6b, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0xb5, 0xb6, 0xb9, 0xcc, 0x45, 0x38, 0x79, 0x63, 0x05, 0xd5, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0x02, 0xca, 0xef, 0xfd, 0x7b, 0xb6, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x48, 0xfc, 0xe3, 0x02, 0xcf, 0xfd, 0x31, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0xb5, 0xb6, 0x02, 0x8e, 0xfc, 0xbc, 0x05, 0xd5, 0xfa, 0xd5, 0xaa, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x21, 0x09, 0x01, 0x21, 0x11, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0xb5, 0x01, 0x0f, 0x01, 0x57, 0x01, 0x58, 0x01, 0x0f, 0xb1, 0xfe, 0xa5, 0xb6, 0xfe, 0xa5, 0xb0, 0x05, 0xd5, 0xfc, 0x08, 0x03, 0xf8, 0xfa, 0x2b, 0x05, 0x1f, 0xfc, 0x00, 0x04, 0x00, 0xfa, 0xe1, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x23, 0xb5, 0xf5, 0x02, 0x54, 0xb0, 0xf5, 0xfd, 0xac, 0xb0, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x2b, 0x04, 0xe1, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x27, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x02, 0xd6, 0xc6, 0xe9, 0xe9, 0xc6, 0xc6, 0xe8, 0xe8, 0xc6, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x05, 0x4c, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x48, 0xa4, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0x01, 0xa4, 0x01, 0x62, 0x01, 0x62, 0x01, 0xa5, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xfe, 0x66, 0x01, 0x9a, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xb6, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xa6, 0xe3, 0xdb, 0xdd, 0xe2, 0xfd, 0xa8, 0x00, 0x02, 0x00, 0x67, 0xfe, 0xf8, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x1b, 0x01, 0x23, 0x27, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x02, 0x02, 0xd6, 0xc6, 0xe9, 0xe9, 0xc6, 0xc6, 0xe8, 0xe8, 0x39, 0xef, 0xdb, 0xc7, 0x1e, 0x1f, 0x0f, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xbc, 0x05, 0x4c, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x48, 0xfa, 0xcf, 0xfe, 0xdd, 0xef, 0x02, 0x02, 0x01, 0xa5, 0x01, 0x61, 0x01, 0x62, 0x01, 0xa5, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0xfc, 0xfe, 0x8e, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0x01, 0x9a, 0xe7, 0xe2, 0x75, 0xfd, 0xc8, 0xe4, 0x84, 0x86, 0x86, 0x84, 0x02, 0xbc, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x05, 0xd5, 0xd6, 0xd8, 0x8d, 0xba, 0x02, 0x4f, 0xfd, 0xee, 0x87, 0x83, 0x83, 0x85, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x05, 0xf0, 0x00, 0x27, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0xda, 0x67, 0xb8, 0x55, 0x95, 0xa1, 0x6b, 0x96, 0x6d, 0xcc, 0xc1, 0xfe, 0xfb, 0xfd, 0x60, 0xd7, 0x73, 0x6f, 0xd4, 0x67, 0x9b, 0xaa, 0x7a, 0x8b, 0x6e, 0xcc, 0xb5, 0xfb, 0xdc, 0x5f, 0xc4, 0x05, 0xa4, 0xc5, 0x37, 0x36, 0x80, 0x76, 0x63, 0x65, 0x1f, 0x19, 0x2b, 0xd9, 0xb6, 0xd9, 0xe0, 0x30, 0x2f, 0xd0, 0x45, 0x46, 0x88, 0x7e, 0x6e, 0x7c, 0x1f, 0x18, 0x2d, 0xc0, 0xab, 0xc6, 0xe4, 0x26, 0x00, 0x00, 0x01, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x05, 0x04, 0x70, 0xfe, 0x23, 0xb6, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0xfa, 0xd5, 0x05, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, 0xa0, 0xb7, 0x9d, 0xaf, 0xaf, 0x9c, 0xb7, 0xfe, 0xfc, 0xfe, 0xff, 0xfe, 0xfc, 0x05, 0xd5, 0xfc, 0x75, 0xf0, 0xd3, 0xd3, 0xf0, 0x03, 0x8b, 0xfc, 0x5c, 0xfe, 0xdc, 0xfe, 0xd6, 0x01, 0x2a, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x21, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x02, 0x0f, 0xfd, 0xff, 0xbe, 0x01, 0xaa, 0x01, 0xab, 0xbd, 0xfe, 0x00, 0x05, 0xd5, 0xfb, 0x17, 0x04, 0xe9, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0x23, 0x3d, 0xb8, 0x01, 0x1a, 0x01, 0x1a, 0xcc, 0x01, 0x1b, 0x01, 0x1a, 0xb8, 0xfe, 0xaf, 0xe5, 0xfe, 0xe5, 0xfe, 0xe1, 0xe4, 0x05, 0xd5, 0xfb, 0x12, 0x04, 0xee, 0xfb, 0x12, 0x04, 0xee, 0xfa, 0x2b, 0x05, 0x10, 0xfa, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x74, 0xc3, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x50, 0x01, 0xcd, 0xc3, 0xfe, 0x86, 0xfe, 0x83, 0xc4, 0x01, 0xe0, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x33, 0xfc, 0xf8, 0x02, 0x7b, 0xfd, 0x85, 0x03, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x03, 0x33, 0x09, 0x01, 0x33, 0x01, 0x11, 0x23, 0x11, 0x04, 0xc4, 0x01, 0x74, 0x01, 0x72, 0xc4, 0xfe, 0x24, 0xb6, 0x05, 0xd5, 0xfd, 0x9a, 0x02, 0x66, 0xfc, 0xf2, 0xfd, 0x39, 0x02, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x68, 0x04, 0x1f, 0xfc, 0xaf, 0x03, 0x66, 0xfb, 0xb7, 0x03, 0x51, 0xfc, 0xc4, 0x05, 0xd5, 0x9a, 0xfb, 0x6f, 0xaa, 0x9a, 0x04, 0x91, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x9e, 0x01, 0x7e, 0xd8, 0xd8, 0xfe, 0x82, 0x06, 0x14, 0x8f, 0xf9, 0xfc, 0x8f, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x42, 0x02, 0x6d, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x01, 0x23, 0x01, 0x99, 0x01, 0xd4, 0x99, 0xfe, 0x2c, 0x05, 0xd5, 0xf9, 0x6d, 0x06, 0x93, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb3, 0xfe, 0xf2, 0x02, 0x31, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x02, 0x31, 0xfe, 0x82, 0xd7, 0xd7, 0x06, 0x14, 0xf8, 0xde, 0x8f, 0x06, 0x04, 0x8f, 0x00, 0x01, 0x00, 0xc3, 0x03, 0xa8, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x03, 0x5c, 0x01, 0xe9, 0xb5, 0xfe, 0x74, 0xfe, 0x74, 0xb5, 0x01, 0xe9, 0x05, 0xd5, 0xfd, 0xd3, 0x01, 0x8b, 0xfe, 0x75, 0x02, 0x2d, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x1d, 0x03, 0xac, 0xfe, 0xac, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x03, 0xac, 0xfc, 0x42, 0xfe, 0xac, 0x8f, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x04, 0xf0, 0x02, 0x49, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x13, 0x23, 0x01, 0x01, 0x4a, 0xfe, 0x8a, 0xfe, 0xdb, 0x06, 0x66, 0xfe, 0x8a, 0x01, 0x76, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x25, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x37, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x78, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0xa6, 0xa6, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x4c, 0xfd, 0x81, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x33, 0x03, 0x81, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xfd, 0xcd, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xa7, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x02, 0x52, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x06, 0x14, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x03, 0x83, 0x46, 0x8d, 0x48, 0xa2, 0xb2, 0xb2, 0xa2, 0x48, 0x8d, 0x46, 0x45, 0x95, 0x53, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x4d, 0x92, 0x04, 0x35, 0xac, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0xe3, 0x2b, 0x2b, 0xaa, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x06, 0x14, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x45, 0xa6, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0xfe, 0x00, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x03, 0xb6, 0x02, 0x5e, 0xf9, 0xec, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0xfe, 0x15, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x15, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x12, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x04, 0x0c, 0xfd, 0x06, 0x0b, 0xb9, 0xa4, 0x60, 0xb3, 0x58, 0x59, 0xbb, 0x60, 0xf2, 0xfe, 0xe7, 0x01, 0x0b, 0xe3, 0xcb, 0xed, 0xa6, 0x02, 0x94, 0x7a, 0x8b, 0xa7, 0x0c, 0x02, 0x5e, 0x5a, 0xbe, 0xc7, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x01, 0x38, 0x01, 0x0a, 0x01, 0x13, 0x01, 0x43, 0xfe, 0xdd, 0xc4, 0x97, 0xb4, 0xae, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x02, 0xac, 0x9e, 0x5a, 0x45, 0x01, 0x11, 0xfe, 0xef, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x06, 0x14, 0x99, 0x50, 0x68, 0x63, 0x8f, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x17, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x03, 0x45, 0x95, 0x86, 0x85, 0x94, 0x94, 0x85, 0x86, 0x95, 0xa6, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe2, 0xba, 0x70, 0xa0, 0x33, 0xa6, 0x02, 0x3d, 0xc8, 0xdc, 0xdc, 0xc8, 0xc7, 0xdc, 0xdc, 0xeb, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0x01, 0x3a, 0x01, 0x03, 0x01, 0x04, 0x01, 0x3a, 0x62, 0x63, 0xaa, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x06, 0x14, 0xfd, 0x9e, 0x65, 0x64, 0xef, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x11, 0x33, 0x15, 0x23, 0xae, 0xa5, 0xa5, 0xa5, 0xa5, 0x04, 0x60, 0xfb, 0xa0, 0x06, 0x14, 0xe9, 0x00, 0x02, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x15, 0x23, 0xae, 0xa5, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0xa5, 0xa5, 0x04, 0x60, 0xfb, 0x8c, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x06, 0x28, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0xa7, 0xa7, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x02, 0x2d, 0xd8, 0xfe, 0x00, 0xa7, 0x06, 0x14, 0xfc, 0x69, 0x01, 0xe3, 0xfd, 0xf4, 0xfd, 0xac, 0x02, 0x23, 0xfd, 0xdd, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xae, 0xa5, 0xa5, 0x06, 0x14, 0xf9, 0xec, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x04, 0x7b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xbe, 0x3f, 0xac, 0x75, 0x9e, 0xab, 0xa7, 0x66, 0x6a, 0x80, 0x96, 0xa6, 0x67, 0x6b, 0x7f, 0x95, 0xa7, 0xa7, 0x39, 0x9e, 0x6d, 0x6e, 0x9a, 0x03, 0x89, 0x7c, 0x76, 0xf5, 0xe2, 0xfd, 0x5c, 0x02, 0x9e, 0xa1, 0x9c, 0xbe, 0xa4, 0xfd, 0x87, 0x02, 0x9e, 0xa2, 0x9b, 0xbf, 0xa3, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x67, 0x62, 0x7c, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x64, 0xef, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x02, 0x34, 0x85, 0x9b, 0x9a, 0x86, 0x85, 0x9a, 0x9a, 0x85, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xf5, 0xf5, 0x03, 0xdf, 0xe7, 0xc9, 0xc9, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0x9c, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x4e, 0xa7, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x01, 0xff, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xa8, 0xfd, 0xae, 0x06, 0x0a, 0xaa, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x01, 0xeb, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x23, 0x01, 0x11, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x02, 0x34, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0xa6, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0xfd, 0xae, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0xaa, 0xf9, 0xf6, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xf6, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0xa7, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x03, 0xb4, 0x12, 0x11, 0xcb, 0xbe, 0xfd, 0xb2, 0x04, 0x60, 0xae, 0x66, 0x63, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x00, 0x27, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x30, 0x46, 0x97, 0x51, 0x7b, 0x7c, 0x59, 0x85, 0x38, 0xb1, 0x94, 0xde, 0xc2, 0x51, 0xb0, 0x61, 0x5c, 0xb2, 0x57, 0x75, 0x7e, 0x5b, 0x9a, 0x39, 0x9a, 0x89, 0xca, 0xb9, 0x5c, 0xa2, 0x04, 0x3f, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2a, 0x99, 0x89, 0x9c, 0xb6, 0x23, 0x23, 0xbe, 0x35, 0x35, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x05, 0x9e, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x43, 0x67, 0xab, 0xab, 0xbf, 0x92, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xfd, 0xa0, 0x89, 0x4e, 0x9a, 0x9f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x14, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x01, 0x9d, 0xa5, 0x70, 0x6f, 0x87, 0x9b, 0xa6, 0xa6, 0x3c, 0x9f, 0x6a, 0xad, 0xb4, 0x01, 0xa0, 0x01, 0xba, 0x02, 0xa6, 0xfd, 0x61, 0x9f, 0x9f, 0xbe, 0xa4, 0x02, 0x7b, 0xfb, 0xa0, 0xac, 0x66, 0x63, 0xf0, 0x03, 0xa8, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x06, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0x37, 0xaf, 0x01, 0x3b, 0x01, 0x3b, 0xb0, 0xfe, 0x86, 0xe1, 0x04, 0x60, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0xa0, 0x00, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x4d, 0xa6, 0xcf, 0xce, 0xc3, 0xcf, 0xce, 0xa6, 0xfe, 0xf8, 0xc3, 0xd9, 0xda, 0xc3, 0x04, 0x60, 0xfc, 0x96, 0x03, 0x6a, 0xfc, 0x96, 0x03, 0x6a, 0xfb, 0xa0, 0x03, 0x96, 0xfc, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x02, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x03, 0xf4, 0xfe, 0x93, 0x01, 0x7f, 0xc3, 0xfe, 0xdb, 0xfe, 0xda, 0xc3, 0x01, 0x88, 0xfe, 0x99, 0xc4, 0x01, 0x0b, 0x01, 0x0b, 0x04, 0x60, 0xfd, 0xdf, 0xfd, 0xc1, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x4a, 0x02, 0x16, 0xfe, 0x71, 0x01, 0x8f, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x05, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x51, 0x46, 0x85, 0x70, 0x84, 0x61, 0x44, 0x4c, 0x2e, 0x1e, 0xfe, 0x68, 0xaf, 0x01, 0x3b, 0x01, 0x3b, 0xb0, 0x68, 0xc8, 0x7a, 0x9a, 0x48, 0x86, 0x54, 0x04, 0x4e, 0xfc, 0x94, 0x03, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x66, 0x03, 0x12, 0xfd, 0x92, 0x02, 0x6e, 0xfc, 0xd7, 0x02, 0x6f, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfc, 0xdb, 0x93, 0xa8, 0x03, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe6, 0xfe, 0xb2, 0x03, 0xaf, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x05, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1d, 0x01, 0x14, 0x16, 0x33, 0x03, 0xae, 0x38, 0xe0, 0x98, 0x61, 0x80, 0x37, 0x37, 0x81, 0x60, 0x98, 0xe0, 0x38, 0x3d, 0x7f, 0x4d, 0x52, 0x63, 0x64, 0x51, 0x4d, 0x7f, 0xbe, 0x90, 0x94, 0xdd, 0xef, 0x97, 0x74, 0x8f, 0x73, 0x95, 0xf0, 0xdd, 0x93, 0x8f, 0x58, 0x8d, 0xf8, 0x9d, 0x8e, 0x19, 0x1b, 0x8e, 0x9c, 0xf8, 0x8d, 0x58, 0x00, 0x01, 0x00, 0xea, 0xfe, 0x1d, 0x01, 0x83, 0x06, 0x1d, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x83, 0x99, 0x06, 0x1d, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe6, 0xfe, 0xb2, 0x03, 0xaf, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x17, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0xe6, 0x3f, 0x7e, 0x4d, 0x51, 0x64, 0x64, 0x51, 0x4d, 0x7e, 0x3f, 0x39, 0xe0, 0x97, 0x61, 0x7f, 0x38, 0x38, 0x7f, 0x61, 0x97, 0xe0, 0x39, 0xbe, 0x56, 0x8f, 0xf8, 0x9c, 0x8e, 0x1b, 0x19, 0x8e, 0x9d, 0xf8, 0x8e, 0x57, 0x8f, 0x93, 0xdd, 0xf0, 0x95, 0x73, 0x8f, 0x74, 0x97, 0xef, 0xdd, 0x94, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x01, 0xd3, 0x05, 0x46, 0x03, 0x31, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x0a, 0x05, 0x06, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x08, 0x05, 0x07, 0x0d, 0x8b, 0x55, 0x4d, 0x98, 0x03, 0x31, 0xb2, 0x4f, 0x44, 0x3b, 0x04, 0x02, 0x03, 0x05, 0x3e, 0x4d, 0x53, 0xb2, 0x4f, 0x45, 0x3c, 0x04, 0x02, 0x03, 0x05, 0x3e, 0x4c, 0x00, 0x02, 0x01, 0x16, 0x00, 0x00, 0x01, 0xcd, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x11, 0x23, 0x11, 0x13, 0x33, 0x13, 0x01, 0xcd, 0xb7, 0xb7, 0xb7, 0x13, 0x92, 0x12, 0x04, 0xd7, 0xfe, 0xfa, 0x2b, 0x02, 0x8f, 0x01, 0x65, 0xfe, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9a, 0xfe, 0xc7, 0x03, 0xba, 0x05, 0x98, 0x00, 0x06, 0x00, 0x21, 0x00, 0x00, 0x25, 0x11, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x01, 0x15, 0x2e, 0x01, 0x27, 0x03, 0x3e, 0x01, 0x37, 0x15, 0x0e, 0x01, 0x07, 0x11, 0x23, 0x11, 0x26, 0x02, 0x11, 0x10, 0x12, 0x37, 0x11, 0x33, 0x13, 0x1e, 0x01, 0x02, 0x62, 0x84, 0x94, 0x94, 0x01, 0xdb, 0x43, 0x7a, 0x3d, 0x01, 0x3f, 0x7b, 0x41, 0x3a, 0x7c, 0x45, 0x5c, 0xd9, 0xee, 0xee, 0xd9, 0x5c, 0x01, 0x42, 0x7b, 0x83, 0x03, 0x58, 0x12, 0xe2, 0xb8, 0xb9, 0xe2, 0x03, 0xa1, 0xac, 0x29, 0x2a, 0x03, 0xfc, 0xa0, 0x05, 0x2a, 0x27, 0xaa, 0x1e, 0x23, 0x07, 0xfe, 0xe4, 0x01, 0x20, 0x14, 0x01, 0x33, 0x01, 0x01, 0x01, 0x02, 0x01, 0x32, 0x16, 0x01, 0x1f, 0xfe, 0xe1, 0x04, 0x21, 0x00, 0x00, 0x01, 0x00, 0x74, 0x00, 0x00, 0x03, 0xf2, 0x05, 0xf0, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x10, 0x36, 0x33, 0x32, 0x16, 0x03, 0xe0, 0x45, 0x7a, 0x37, 0x85, 0x69, 0x01, 0x60, 0xfe, 0xa0, 0x01, 0xf6, 0xfc, 0x82, 0xd4, 0xb3, 0xb3, 0xc1, 0xd1, 0x37, 0x88, 0x05, 0xb4, 0xb6, 0x29, 0x29, 0x9b, 0xd4, 0xd7, 0x8f, 0xfe, 0x2f, 0xaa, 0xaa, 0x01, 0xd1, 0x8f, 0xee, 0x01, 0x05, 0xf3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x52, 0x04, 0x43, 0x04, 0xb2, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x37, 0x17, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x27, 0x37, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x22, 0xba, 0x67, 0xba, 0x22, 0x20, 0x22, 0x24, 0xbc, 0x67, 0xba, 0x35, 0x68, 0x37, 0x34, 0x6c, 0x37, 0xbb, 0x65, 0xba, 0x21, 0x22, 0x22, 0x23, 0xbb, 0x68, 0xba, 0x32, 0x68, 0x3a, 0x36, 0x69, 0x53, 0x8c, 0x66, 0x65, 0x8e, 0x8d, 0x66, 0x65, 0x8d, 0x03, 0xe1, 0xd1, 0x73, 0xce, 0x3b, 0x77, 0x3e, 0x3f, 0x73, 0x39, 0xcf, 0x71, 0xcf, 0x28, 0x26, 0x25, 0x25, 0xcf, 0x73, 0xce, 0x3e, 0x76, 0x3a, 0x40, 0x74, 0x38, 0xce, 0x73, 0xcf, 0x27, 0x25, 0x24, 0xfe, 0x7c, 0x70, 0x9a, 0x9a, 0x70, 0x72, 0x9c, 0x9d, 0x00, 0x01, 0x00, 0x49, 0x00, 0x00, 0x04, 0x4a, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x27, 0x21, 0x35, 0x33, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x33, 0x15, 0x21, 0x07, 0x15, 0x21, 0x04, 0x18, 0xfe, 0x8d, 0xb5, 0xfe, 0x8a, 0x01, 0x76, 0x4c, 0xfe, 0xd6, 0xed, 0xfe, 0xe3, 0xab, 0x01, 0x55, 0x01, 0x53, 0xac, 0xfe, 0xe2, 0xed, 0xfe, 0xd7, 0x4c, 0x01, 0x75, 0x01, 0xc7, 0xfe, 0x39, 0x01, 0xc7, 0x7b, 0x33, 0x9b, 0x7b, 0x02, 0x4a, 0xfd, 0x44, 0x02, 0xbc, 0xfd, 0xb6, 0x7b, 0x9b, 0x33, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xea, 0xfe, 0xa2, 0x01, 0x83, 0x05, 0x98, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x13, 0x11, 0x23, 0x11, 0x01, 0x83, 0x99, 0x99, 0x99, 0x01, 0x98, 0xfd, 0x0a, 0x02, 0xf6, 0x04, 0x00, 0xfd, 0x0a, 0x02, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x52, 0xff, 0x3d, 0x03, 0x45, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x55, 0x39, 0x37, 0x7d, 0xe1, 0x38, 0x38, 0x81, 0xb8, 0x4b, 0x80, 0x33, 0x57, 0x61, 0xb9, 0x18, 0x0c, 0xbe, 0x76, 0x53, 0x54, 0x38, 0x34, 0xb8, 0x9c, 0x41, 0x8b, 0x4f, 0x4e, 0x85, 0x34, 0x5c, 0x66, 0xc7, 0x16, 0xc1, 0x73, 0x53, 0x52, 0x35, 0x35, 0xb4, 0x96, 0x41, 0x8a, 0x03, 0xa8, 0x2e, 0x5a, 0x2e, 0x4c, 0x85, 0x87, 0x2d, 0x5b, 0x2e, 0x4b, 0x88, 0x02, 0x93, 0xa4, 0x27, 0x27, 0x50, 0x47, 0x5a, 0x73, 0x0f, 0x08, 0x77, 0x9a, 0x65, 0x5a, 0x8c, 0x35, 0x34, 0x6d, 0x40, 0x8e, 0xa8, 0x1d, 0x1d, 0xa4, 0x27, 0x27, 0x54, 0x4c, 0x66, 0x7b, 0x0e, 0x78, 0x99, 0x66, 0x5b, 0x8f, 0x31, 0x2c, 0x70, 0x45, 0x82, 0x9f, 0x1d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc1, 0x05, 0x46, 0x02, 0xd9, 0x06, 0x10, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x02, 0x21, 0xb7, 0xb7, 0xfe, 0xa1, 0xb6, 0xb6, 0x06, 0x10, 0xca, 0xca, 0xca, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x06, 0x35, 0x05, 0xcd, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x49, 0x00, 0x00, 0x01, 0x32, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x3e, 0x01, 0x17, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x9a, 0x88, 0xed, 0x62, 0x62, 0x61, 0x61, 0x62, 0x62, 0xed, 0x88, 0x89, 0xed, 0x62, 0x62, 0x61, 0x61, 0x62, 0x62, 0xed, 0x89, 0x76, 0xcc, 0x54, 0x55, 0x56, 0x56, 0x55, 0x54, 0xcc, 0x76, 0x76, 0xcd, 0x54, 0x54, 0x54, 0x55, 0x53, 0x54, 0xcd, 0x97, 0x3c, 0x75, 0x3b, 0x86, 0x97, 0x9a, 0x8c, 0x3a, 0x6d, 0x3c, 0x3d, 0x7b, 0x3f, 0xc2, 0xe2, 0xe2, 0xc2, 0x42, 0x7a, 0x05, 0xcd, 0x6e, 0x6d, 0x6d, 0xfe, 0xfa, 0x9a, 0x98, 0xfe, 0xfb, 0x6d, 0x6d, 0x6e, 0x6e, 0x6d, 0x6d, 0x01, 0x05, 0x98, 0x9a, 0x01, 0x06, 0x6d, 0x6d, 0x6e, 0x67, 0x5e, 0x5e, 0x5e, 0xe5, 0x82, 0x81, 0xe3, 0x5e, 0x5e, 0x5f, 0x5f, 0x5e, 0x5d, 0xe2, 0x83, 0x85, 0xe3, 0x5d, 0x5e, 0x5e, 0xf5, 0x81, 0x21, 0x20, 0xaf, 0x9d, 0x9f, 0xae, 0x1f, 0x22, 0x7f, 0x1d, 0x1c, 0xf4, 0xd0, 0xd1, 0xf2, 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0x01, 0xd5, 0x02, 0xe9, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x7d, 0x02, 0x6b, 0xfd, 0x95, 0x02, 0x69, 0x86, 0x27, 0x82, 0x53, 0x74, 0x88, 0xab, 0xaa, 0xa3, 0x69, 0x69, 0x38, 0x7a, 0x3e, 0x42, 0x83, 0x3e, 0xa4, 0xa1, 0xf8, 0x91, 0x71, 0x58, 0x4a, 0x5d, 0x75, 0x02, 0x50, 0x7b, 0x02, 0xb8, 0xfe, 0x40, 0x70, 0x3f, 0x44, 0x87, 0x71, 0x87, 0x8a, 0x04, 0x5b, 0x5b, 0x22, 0x22, 0x7f, 0x1c, 0x1c, 0xb0, 0xf0, 0x43, 0x4f, 0x40, 0x4d, 0x90, 0x72, 0x1d, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x8d, 0x03, 0xbb, 0x04, 0x23, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x15, 0x09, 0x01, 0x15, 0x01, 0x35, 0x13, 0x15, 0x09, 0x01, 0x15, 0x01, 0x35, 0x03, 0xbb, 0xfe, 0xf1, 0x01, 0x0f, 0xfe, 0x5a, 0x1f, 0xfe, 0xf1, 0x01, 0x0f, 0xfe, 0x5a, 0x04, 0x23, 0xbf, 0xfe, 0xf4, 0xfe, 0xf4, 0xbf, 0x01, 0xa2, 0x52, 0x01, 0xa2, 0xbf, 0xfe, 0xf4, 0xfe, 0xf4, 0xbf, 0x01, 0xa2, 0x52, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x01, 0x1f, 0x05, 0x46, 0x03, 0x5e, 0x00, 0x05, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0xc3, 0x04, 0x82, 0x97, 0xfc, 0x15, 0x03, 0x5e, 0xfd, 0xc1, 0x01, 0x95, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xdf, 0x02, 0x40, 0x02, 0x83, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x01, 0xe5, 0xfe, 0x1b, 0x02, 0x83, 0xa4, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfe, 0x00, 0x00, 0x06, 0x35, 0x05, 0xcd, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x38, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x32, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x3e, 0x01, 0x13, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1f, 0x01, 0x23, 0x27, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x03, 0x9a, 0x76, 0xcc, 0x54, 0x55, 0x56, 0x56, 0x55, 0x54, 0xcc, 0x76, 0x76, 0xcd, 0x54, 0x54, 0x54, 0x55, 0x53, 0x54, 0xcd, 0x76, 0x88, 0xed, 0x62, 0x62, 0x61, 0x61, 0x62, 0x62, 0xed, 0x88, 0x89, 0xed, 0x62, 0x62, 0x61, 0x61, 0x62, 0x62, 0xed, 0x70, 0x6e, 0x6e, 0x63, 0x4f, 0x50, 0x5b, 0x9e, 0x9d, 0x5f, 0x56, 0x15, 0x3d, 0x29, 0x7b, 0x9a, 0x75, 0x35, 0x41, 0x31, 0x3b, 0x8c, 0x05, 0x66, 0x5e, 0x5e, 0x5e, 0xe5, 0x82, 0x81, 0xe3, 0x5e, 0x5e, 0x5f, 0x5f, 0x5e, 0x5d, 0xe2, 0x83, 0x85, 0xe3, 0x5d, 0x5e, 0x5e, 0x67, 0x6e, 0x6d, 0x6d, 0xfe, 0xfa, 0x9a, 0x98, 0xfe, 0xfb, 0x6d, 0x6d, 0x6e, 0x6e, 0x6d, 0x6d, 0x01, 0x05, 0x98, 0x9a, 0x01, 0x06, 0x6d, 0x6d, 0x6e, 0xfe, 0x62, 0xfe, 0xec, 0x3e, 0x4b, 0x4c, 0x3f, 0x67, 0x77, 0x79, 0x56, 0x70, 0x11, 0x08, 0x4d, 0x49, 0xdf, 0xd1, 0x60, 0x33, 0xfe, 0x9c, 0x03, 0x44, 0x00, 0x01, 0x00, 0xbf, 0x05, 0x62, 0x02, 0xda, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0xc0, 0x02, 0x1a, 0xfd, 0xe6, 0x05, 0xf6, 0x94, 0x00, 0x00, 0x00, 0x02, 0x00, 0xaf, 0x03, 0x75, 0x02, 0xeb, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0xcd, 0x48, 0x63, 0x63, 0x48, 0x48, 0x63, 0x64, 0x47, 0x39, 0x6b, 0x26, 0x2a, 0x29, 0xa6, 0x79, 0x79, 0xa2, 0xa5, 0x05, 0x6f, 0x6f, 0x50, 0x4f, 0x6d, 0x6d, 0x4f, 0x4f, 0x70, 0x81, 0x31, 0x2e, 0x2d, 0x72, 0x42, 0x84, 0xb7, 0xb4, 0x87, 0x86, 0xba, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x21, 0x15, 0x21, 0x03, 0x50, 0x01, 0xf5, 0xfe, 0x0b, 0x97, 0xfe, 0x0a, 0x01, 0xf6, 0xfe, 0x0a, 0x04, 0x82, 0xfb, 0x7e, 0x05, 0x04, 0xfe, 0x7d, 0xaa, 0xfe, 0x7d, 0x01, 0x83, 0xaa, 0x01, 0x83, 0xfb, 0xa6, 0xaa, 0x00, 0x01, 0x00, 0x54, 0x02, 0x9c, 0x02, 0x6f, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0xf1, 0x01, 0x7e, 0xfd, 0xe6, 0x1e, 0x39, 0x01, 0x36, 0x5e, 0x4d, 0x2e, 0x6e, 0x41, 0x45, 0x78, 0x33, 0x83, 0x9c, 0xfe, 0xd7, 0x33, 0x03, 0x0e, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x01, 0x00, 0x58, 0x02, 0x8d, 0x02, 0x86, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0xd8, 0x52, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x63, 0x62, 0x4d, 0x55, 0x54, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x32, 0x81, 0x98, 0x51, 0x04, 0x60, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x01, 0x01, 0x4d, 0x04, 0xee, 0x02, 0xfd, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x02, 0x4a, 0xb3, 0xfe, 0xdb, 0x8a, 0x06, 0x66, 0xfe, 0x88, 0x00, 0x01, 0x00, 0x9c, 0xfe, 0x56, 0x04, 0x68, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x11, 0x9d, 0xa5, 0x7c, 0x7a, 0x85, 0x86, 0xa6, 0x1f, 0x22, 0x08, 0x1c, 0x1a, 0x25, 0x42, 0x1f, 0x3e, 0x4a, 0x0e, 0x2d, 0x82, 0x59, 0x5b, 0x81, 0x26, 0xfe, 0x56, 0x06, 0x0a, 0xfd, 0x48, 0x91, 0x94, 0xa8, 0xa8, 0x02, 0x8d, 0xfc, 0xa2, 0x3c, 0x39, 0x0b, 0x0c, 0x94, 0x17, 0x16, 0x4e, 0x50, 0x4f, 0x4f, 0x4e, 0x4e, 0xfd, 0xd7, 0x00, 0x01, 0x00, 0x8e, 0xff, 0x3b, 0x03, 0xcd, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x02, 0x3a, 0x01, 0x93, 0x7f, 0xab, 0x80, 0xc1, 0xd4, 0xea, 0x05, 0xd5, 0xf9, 0x66, 0x06, 0x1f, 0xf9, 0xe1, 0x03, 0x4e, 0x11, 0xdd, 0xb8, 0xbe, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc5, 0x02, 0x48, 0x01, 0x83, 0x03, 0x46, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0x03, 0x46, 0xfe, 0x00, 0x01, 0x01, 0x05, 0xfe, 0x75, 0x02, 0x7b, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x21, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x02, 0x18, 0x32, 0x30, 0x6c, 0x6a, 0x29, 0x4e, 0x27, 0x1e, 0x43, 0x2a, 0x35, 0x36, 0x26, 0x29, 0x3e, 0x69, 0x30, 0x59, 0x5b, 0x0c, 0x0c, 0x83, 0x11, 0x0f, 0x30, 0x2e, 0x1e, 0x57, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x02, 0x9c, 0x02, 0x7f, 0x05, 0xdf, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x8c, 0xb8, 0xc9, 0xcf, 0x7c, 0xb8, 0xfe, 0x0e, 0x03, 0x0a, 0x02, 0x63, 0x29, 0x74, 0x27, 0xfd, 0x2b, 0x6e, 0x00, 0x00, 0x03, 0x00, 0x56, 0x01, 0xd5, 0x03, 0x0e, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x7d, 0x02, 0x6b, 0xfd, 0x95, 0x01, 0x36, 0xa1, 0xb9, 0xb9, 0xa1, 0xa1, 0xbc, 0xbc, 0xa1, 0x5f, 0x71, 0x72, 0x5e, 0x5e, 0x71, 0x70, 0x02, 0x50, 0x7b, 0x04, 0x1b, 0xdd, 0xbf, 0xbf, 0xdb, 0xdc, 0xbe, 0xbf, 0xdd, 0x73, 0xa1, 0x88, 0x85, 0xa0, 0xa0, 0x85, 0x89, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x8d, 0x03, 0xdb, 0x04, 0x23, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0x25, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0xae, 0x01, 0xa6, 0xfe, 0x5a, 0x01, 0x0f, 0xfe, 0xf1, 0x01, 0x86, 0x01, 0xa6, 0xfe, 0x5a, 0x01, 0x0f, 0xfe, 0xf1, 0x04, 0x23, 0xfe, 0x5e, 0x52, 0xfe, 0x5e, 0xbf, 0x01, 0x0c, 0x01, 0x0c, 0xbf, 0xfe, 0x5e, 0x52, 0xfe, 0x5e, 0xbf, 0x01, 0x0c, 0x01, 0x0c, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xc0, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x07, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0x86, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x00, 0x74, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x07, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x58, 0xff, 0xe3, 0x06, 0xc0, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x75, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x07, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0xff, 0xe3, 0x03, 0x4e, 0x05, 0xd5, 0x00, 0x20, 0x00, 0x24, 0x00, 0x00, 0x01, 0x33, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x13, 0x23, 0x35, 0x33, 0x01, 0xc2, 0xab, 0x31, 0x52, 0x50, 0x35, 0x2e, 0x76, 0x62, 0x47, 0xa2, 0x56, 0x55, 0xac, 0x5d, 0xa6, 0xc9, 0x41, 0x50, 0x50, 0x2b, 0x22, 0x07, 0x07, 0x05, 0xb0, 0xb5, 0xb5, 0x04, 0x44, 0x9c, 0x65, 0x82, 0x57, 0x58, 0x35, 0x5e, 0x31, 0x59, 0x6e, 0x46, 0x43, 0xbc, 0x39, 0x38, 0xc2, 0x9f, 0x4c, 0x89, 0x56, 0x56, 0x2f, 0x35, 0x19, 0x15, 0x3c, 0x36, 0x01, 0x0e, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x43, 0x01, 0x75, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x43, 0x01, 0x75, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x5e, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x10, 0xed, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x0b, 0x01, 0x21, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x01, 0x23, 0x03, 0x21, 0x03, 0x23, 0x02, 0xff, 0x50, 0x39, 0x3a, 0x4e, 0x4f, 0x39, 0x39, 0x50, 0x89, 0xf5, 0x01, 0xeb, 0xfe, 0x82, 0x37, 0x38, 0x8f, 0x68, 0x67, 0x91, 0x39, 0x36, 0x01, 0xdf, 0xbd, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x06, 0x5a, 0x3f, 0x59, 0x57, 0x41, 0x3f, 0x58, 0x58, 0xfe, 0xf3, 0xfd, 0x19, 0x03, 0x4e, 0x29, 0x73, 0x49, 0x73, 0xa0, 0xa1, 0x72, 0x46, 0x76, 0x29, 0xfa, 0x8b, 0x01, 0x7f, 0xfe, 0x81, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x06, 0x8e, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x23, 0x01, 0x17, 0x01, 0x21, 0x11, 0x06, 0x7c, 0xfd, 0x66, 0x02, 0x80, 0xfd, 0x80, 0x02, 0xac, 0xfc, 0x9d, 0xfe, 0x25, 0x90, 0xb9, 0x02, 0x33, 0x7d, 0xfe, 0xd7, 0x01, 0x9d, 0x05, 0xd5, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0xd5, 0x9e, 0xfc, 0xf0, 0x03, 0x10, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0x01, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x28, 0x01, 0x75, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x28, 0x01, 0x75, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x04, 0x28, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x28, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x01, 0x8e, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x02, 0xde, 0x01, 0x75, 0xff, 0xff, 0x00, 0x91, 0x00, 0x00, 0x01, 0xe9, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x02, 0xde, 0x01, 0x75, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x02, 0x24, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x02, 0xde, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x02, 0x1c, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x02, 0xde, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x05, 0x28, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x00, 0x13, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x11, 0x23, 0x35, 0x33, 0x13, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0xbe, 0x01, 0x76, 0x01, 0x86, 0x01, 0x6d, 0xfe, 0x92, 0xfe, 0x7b, 0xfe, 0x8a, 0xb5, 0xb5, 0xb7, 0x01, 0x2e, 0xfe, 0xd2, 0xda, 0x01, 0x16, 0x01, 0x03, 0xfe, 0xfd, 0xfe, 0xea, 0x05, 0xd5, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x02, 0xbc, 0x90, 0x01, 0xe3, 0xfe, 0x1d, 0x90, 0xfd, 0xea, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x5e, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x10, 0xed, 0x04, 0x7e, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x04, 0xa3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x5e, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x10, 0xed, 0x04, 0xa3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0xa3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfc, 0x00, 0x3f, 0x05, 0x0d, 0x04, 0xc5, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x02, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x37, 0x09, 0x01, 0x05, 0x0c, 0xfe, 0x65, 0x01, 0x9b, 0x6b, 0xfe, 0x63, 0xfe, 0x63, 0x6a, 0x01, 0x9a, 0xfe, 0x66, 0x6a, 0x01, 0x9d, 0x01, 0x9d, 0x04, 0x4c, 0xfe, 0x35, 0xfe, 0x37, 0x79, 0x01, 0xcb, 0xfe, 0x35, 0x79, 0x01, 0xc9, 0x01, 0xcb, 0x79, 0xfe, 0x35, 0x01, 0xcb, 0x00, 0x00, 0x03, 0x00, 0x5b, 0xff, 0xba, 0x05, 0x4f, 0x06, 0x17, 0x00, 0x09, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x00, 0x09, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x14, 0x16, 0x17, 0x07, 0x26, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x37, 0x17, 0x07, 0x16, 0x12, 0x15, 0x10, 0x00, 0x21, 0x22, 0x26, 0x27, 0x07, 0x27, 0x04, 0x3d, 0xfd, 0x7b, 0x38, 0x91, 0x55, 0xc6, 0xe8, 0x24, 0x6c, 0x37, 0x91, 0x56, 0xc6, 0xe9, 0x23, 0x23, 0x78, 0x46, 0x47, 0x01, 0x53, 0x01, 0x1b, 0x75, 0xc7, 0x4e, 0x92, 0x5c, 0x99, 0x46, 0x48, 0xfe, 0xae, 0xfe, 0xe5, 0x73, 0xc7, 0x52, 0x92, 0x5c, 0x04, 0x58, 0xfc, 0xb2, 0x40, 0x43, 0x01, 0x48, 0x01, 0x1a, 0x70, 0xb8, 0xb8, 0x40, 0x43, 0xfe, 0xb8, 0xfe, 0xe5, 0x70, 0xbc, 0x44, 0x9e, 0x66, 0x01, 0x08, 0xa0, 0x01, 0x62, 0x01, 0xa5, 0x4d, 0x4b, 0xbf, 0x59, 0xc6, 0x67, 0xfe, 0xf6, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0x4b, 0x4b, 0xbf, 0x58, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x04, 0x70, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x70, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x01, 0x01, 0x75, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x13, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0xb5, 0xb6, 0xe4, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xb6, 0xb6, 0xe4, 0x7f, 0x8b, 0x8a, 0x80, 0x05, 0xd5, 0xfe, 0xf8, 0xe1, 0xdc, 0xdc, 0xe2, 0xfe, 0xae, 0x04, 0x27, 0xfd, 0xd1, 0x92, 0x86, 0x86, 0x91, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x35, 0x06, 0x14, 0x00, 0x2f, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0xa7, 0xd7, 0xc5, 0xbb, 0xc5, 0x03, 0x88, 0x97, 0x34, 0x3a, 0x34, 0x95, 0x56, 0xca, 0xbe, 0x3a, 0x7a, 0x42, 0x48, 0x7e, 0x3b, 0x68, 0x6c, 0x35, 0x5b, 0x53, 0x56, 0x4e, 0x96, 0x88, 0x07, 0x76, 0x66, 0x75, 0x7a, 0xa9, 0x04, 0x71, 0xc8, 0xdb, 0xe8, 0xe0, 0x08, 0x73, 0x60, 0x2f, 0x51, 0x2a, 0x25, 0x6a, 0x8e, 0x64, 0xac, 0xb7, 0x19, 0x18, 0xa4, 0x1e, 0x1d, 0x5f, 0x5b, 0x3f, 0x54, 0x3e, 0x37, 0x3b, 0x87, 0x5b, 0x7f, 0xac, 0x1d, 0x67, 0x70, 0x8b, 0x83, 0xfb, 0x93, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x00, 0x43, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x00, 0x76, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x37, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9e, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x10, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x06, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9c, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x04, 0x7b, 0x00, 0x06, 0x00, 0x33, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x03, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x1d, 0x01, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x06, 0x0a, 0x01, 0x94, 0x7b, 0x8a, 0xa7, 0x0c, 0x3d, 0x42, 0xbf, 0x77, 0xcb, 0xee, 0xfd, 0x06, 0x0b, 0xb8, 0xa4, 0x5e, 0xb4, 0x5a, 0x5a, 0xbb, 0x60, 0x96, 0xdf, 0x45, 0x42, 0xc3, 0x80, 0xaa, 0xbd, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0x80, 0xc0, 0xd7, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x02, 0x94, 0x97, 0xb4, 0xae, 0x9e, 0x01, 0x30, 0x5a, 0x5e, 0xfe, 0xdd, 0xfa, 0x5a, 0xbf, 0xc8, 0x35, 0x35, 0xae, 0x2a, 0x2c, 0x79, 0x77, 0x78, 0x78, 0xbb, 0xa8, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0x60, 0xfe, 0x18, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x03, 0x84, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0x00, 0x81, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x66, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x66, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x66, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcc, 0x00, 0x00, 0x01, 0x7c, 0x06, 0x66, 0x10, 0x27, 0x00, 0x43, 0xff, 0x34, 0x00, 0x00, 0x12, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x02, 0x31, 0x06, 0x66, 0x10, 0x27, 0x00, 0x76, 0xff, 0x34, 0x00, 0x00, 0x12, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x02, 0x20, 0x06, 0x66, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x07, 0x02, 0x88, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x02, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x14, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x13, 0x16, 0x12, 0x15, 0x14, 0x00, 0x23, 0x22, 0x02, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x27, 0x05, 0x27, 0x37, 0x27, 0x33, 0x17, 0x25, 0x17, 0x05, 0x02, 0xf2, 0x2d, 0x4f, 0x25, 0x96, 0xa7, 0x9d, 0x83, 0x83, 0x9c, 0x30, 0x08, 0x71, 0x67, 0xff, 0x00, 0xcf, 0xd0, 0xfe, 0xf8, 0xc7, 0x10, 0x2f, 0x26, 0x8f, 0xfe, 0xe1, 0x1e, 0xfd, 0xa3, 0xcd, 0x72, 0x01, 0x2c, 0x1e, 0xfe, 0xf6, 0x03, 0x93, 0x11, 0x10, 0xd8, 0xc3, 0xbc, 0xde, 0xde, 0xbc, 0x7a, 0xbc, 0x01, 0x26, 0x8f, 0xfe, 0xe0, 0xad, 0xff, 0xfe, 0xc9, 0x01, 0x37, 0x00, 0xff, 0xfa, 0x01, 0x37, 0x05, 0x05, 0xb4, 0x6b, 0x63, 0x5c, 0xcc, 0x91, 0x6f, 0x61, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x37, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9e, 0x00, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x37, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9e, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x10, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x68, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x96, 0x05, 0x46, 0x04, 0x6f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x01, 0x21, 0x15, 0x21, 0x02, 0x96, 0xdd, 0xdd, 0xdd, 0xdd, 0xfe, 0x2d, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x6f, 0xf6, 0xfe, 0x12, 0xf5, 0x02, 0x41, 0xaa, 0x00, 0x00, 0x03, 0x00, 0x40, 0xff, 0xa2, 0x04, 0x26, 0x04, 0xbc, 0x00, 0x09, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x00, 0x09, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x35, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, 0x07, 0x1e, 0x01, 0x15, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, 0x03, 0x2e, 0xfe, 0x4a, 0x25, 0x5d, 0x3a, 0x85, 0x9a, 0x12, 0x52, 0x26, 0x5d, 0x38, 0x88, 0x98, 0x11, 0x12, 0x70, 0x31, 0x30, 0xf5, 0xd9, 0x54, 0x8f, 0x3c, 0x7d, 0x56, 0x83, 0x2f, 0x31, 0xf7, 0xd8, 0x56, 0x91, 0x39, 0x7d, 0x56, 0x03, 0x21, 0xfd, 0xb0, 0x2a, 0x28, 0xe8, 0xc8, 0x4f, 0x75, 0x9a, 0x29, 0x29, 0xeb, 0xd3, 0x48, 0x6e, 0x2e, 0x97, 0x4d, 0xc5, 0x77, 0x01, 0x14, 0x01, 0x38, 0x33, 0x34, 0xa8, 0x4f, 0xb3, 0x4d, 0xc6, 0x78, 0xfe, 0xed, 0xfe, 0xc7, 0x34, 0x33, 0xa8, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x66, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x66, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x66, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x10, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x66, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x55, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x4e, 0xa7, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x01, 0xff, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xa8, 0xfd, 0xae, 0x07, 0xbe, 0xfd, 0xa2, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x01, 0xeb, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x55, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0xaa, 0x01, 0x3b, 0x13, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x05, 0xf6, 0x10, 0x26, 0x00, 0x71, 0x43, 0x00, 0x13, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x92, 0x10, 0x27, 0x02, 0x9a, 0x00, 0xb9, 0x01, 0x4a, 0x13, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x1f, 0x10, 0x26, 0x02, 0x9a, 0x47, 0xd7, 0x13, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x75, 0x05, 0x15, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x02, 0x9a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x75, 0x04, 0x0d, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x01, 0x92, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0xa8, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x66, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0xc4, 0x01, 0x75, 0x13, 0x06, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x66, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, 0x10, 0x07, 0x02, 0x88, 0x00, 0x94, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0xc4, 0x01, 0x75, 0x12, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x2d, 0x00, 0x00, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0xa8, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x66, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, 0x10, 0x06, 0x02, 0x89, 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x6e, 0x01, 0x75, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x05, 0x46, 0x06, 0x14, 0x12, 0x26, 0x00, 0x47, 0x00, 0x00, 0x11, 0x07, 0x10, 0xea, 0x04, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x05, 0x28, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x76, 0x06, 0x14, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x45, 0xfe, 0xdb, 0x01, 0x25, 0xa6, 0x8a, 0x8a, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0xfe, 0x00, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x03, 0xb6, 0x01, 0x4e, 0x7d, 0x93, 0x93, 0x7d, 0xfa, 0xfc, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0xfe, 0x15, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x33, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x91, 0x01, 0x3d, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x05, 0xf6, 0x10, 0x27, 0x00, 0x71, 0x00, 0x87, 0x00, 0x00, 0x13, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x2a, 0x01, 0x75, 0x13, 0x06, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x48, 0x10, 0x27, 0x02, 0x9a, 0x00, 0x87, 0x00, 0x00, 0x13, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x28, 0x01, 0x75, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x21, 0x00, 0x00, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x75, 0x04, 0x19, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x01, 0x9e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x01, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x67, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x2f, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x61, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0x00, 0x85, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0xd3, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x66, 0x10, 0x26, 0x02, 0x88, 0x5e, 0x00, 0x13, 0x06, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x98, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x48, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9a, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0xd3, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xf9, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x01, 0x04, 0xfe, 0x05, 0xf0, 0x10, 0x27, 0x02, 0xd7, 0x04, 0xd4, 0xff, 0xed, 0x12, 0x06, 0x00, 0x2a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x34, 0x10, 0x27, 0x02, 0xc3, 0x03, 0x7c, 0x01, 0x0c, 0x12, 0x06, 0x00, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0x82, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x02, 0xc7, 0x01, 0x75, 0x13, 0x06, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xe4, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x01, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x17, 0x15, 0x21, 0x35, 0x01, 0x4c, 0xb6, 0x02, 0x94, 0xb6, 0x98, 0x98, 0xb6, 0xfd, 0x6c, 0xb6, 0x97, 0x97, 0xb6, 0x02, 0x94, 0x05, 0xd5, 0xe0, 0xe0, 0xe0, 0xa4, 0xfb, 0xaf, 0x02, 0xc7, 0xfd, 0x39, 0x04, 0x51, 0xa4, 0xa4, 0xe0, 0xe0, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x04, 0x29, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x04, 0x29, 0xa6, 0x6f, 0x70, 0x86, 0x9b, 0xa7, 0x70, 0x70, 0xa7, 0x01, 0x3d, 0xfe, 0xc3, 0x3b, 0xa2, 0x69, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0xf6, 0xa4, 0x7a, 0x7a, 0xa4, 0xfe, 0xbc, 0x65, 0x64, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x02, 0x39, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x02, 0xdd, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, 0x02, 0x2a, 0x06, 0x37, 0x10, 0x27, 0x02, 0x9e, 0xff, 0x34, 0x00, 0x00, 0x13, 0x06, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1d, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0xff, 0x43, 0x01, 0x3b, 0x13, 0x06, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x02, 0x0e, 0x05, 0xf5, 0x10, 0x27, 0x00, 0x71, 0xff, 0x34, 0xff, 0xff, 0x13, 0x06, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x02, 0x2a, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x02, 0xdd, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x02, 0x1b, 0x06, 0x48, 0x10, 0x27, 0x02, 0x9a, 0xff, 0x34, 0x00, 0x00, 0x13, 0x06, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xfe, 0x75, 0x01, 0xef, 0x05, 0xd5, 0x10, 0x27, 0x02, 0x9d, 0xff, 0x74, 0x00, 0x00, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0xfe, 0x75, 0x01, 0xd7, 0x06, 0x14, 0x10, 0x27, 0x02, 0x9d, 0xff, 0x5c, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6d, 0x07, 0x50, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf3, 0x02, 0xde, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x04, 0x7b, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x13, 0xae, 0xa5, 0xa5, 0x52, 0x04, 0x60, 0xfb, 0xa0, 0x04, 0x7b, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x66, 0x03, 0x8b, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x2d, 0x02, 0x20, 0x00, 0x00, 0x11, 0x06, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0xfe, 0x56, 0x03, 0x53, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x01, 0xff, 0x00, 0x00, 0x11, 0x06, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0xfe, 0x66, 0x02, 0x23, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x02, 0xdd, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x02, 0x20, 0x06, 0x66, 0x10, 0x27, 0x02, 0x88, 0xff, 0x34, 0x00, 0x00, 0x13, 0x06, 0x01, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x1e, 0x04, 0xe0, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x98, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x1e, 0x04, 0x26, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x35, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0xa7, 0xa7, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x02, 0x2d, 0xd8, 0xfe, 0x00, 0xa7, 0x04, 0x60, 0xfe, 0x1b, 0x01, 0xe5, 0xfd, 0xf2, 0xfd, 0xae, 0x02, 0x21, 0xfd, 0xdf, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x03, 0x16, 0x01, 0x76, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0x10, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x03, 0x04, 0x01, 0x76, 0x13, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x1e, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x25, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7a, 0xfe, 0x1e, 0x01, 0x83, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd7, 0x02, 0xce, 0x00, 0x0a, 0x13, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x10, 0xea, 0x02, 0x5c, 0xff, 0xc3, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0xb4, 0x06, 0x14, 0x10, 0x27, 0x10, 0xea, 0x02, 0x00, 0x00, 0x02, 0x11, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x79, 0x01, 0xf9, 0x00, 0x77, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0x44, 0x06, 0x14, 0x10, 0x27, 0x00, 0x79, 0x00, 0xc1, 0x00, 0x73, 0x11, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf3, 0x00, 0x00, 0x04, 0x03, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x25, 0x17, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x07, 0x27, 0x37, 0xbe, 0xb7, 0x01, 0x19, 0x48, 0xfe, 0x9f, 0x02, 0x8e, 0xfc, 0xbb, 0x85, 0x46, 0xcb, 0x05, 0xd5, 0xfd, 0x98, 0xdb, 0x6f, 0xfe, 0xee, 0xfd, 0xe3, 0xaa, 0x02, 0x3b, 0x6a, 0x6e, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0e, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x37, 0x17, 0x07, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0xb3, 0xa6, 0x70, 0x45, 0xb5, 0xa6, 0x6f, 0x42, 0xb1, 0x06, 0x14, 0xfd, 0xa6, 0x5a, 0x6a, 0x8d, 0xfc, 0xe3, 0x02, 0x9a, 0x58, 0x6a, 0x8d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x4b, 0x01, 0x76, 0x13, 0x06, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x6d, 0x10, 0x26, 0x00, 0x76, 0x3c, 0x07, 0x13, 0x06, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x1e, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x80, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x1e, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x1c, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x5f, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x76, 0x01, 0x67, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x66, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb8, 0x00, 0x00, 0x05, 0x27, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x51, 0x01, 0x33, 0x00, 0x00, 0x10, 0x06, 0x02, 0x7e, 0x18, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0x97, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x10, 0x21, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x12, 0x19, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x03, 0xe2, 0xfe, 0xeb, 0xa1, 0xc1, 0xb6, 0xb6, 0x46, 0x5e, 0x60, 0x89, 0xcd, 0xd1, 0x49, 0x49, 0xa3, 0x4e, 0x2c, 0x5c, 0x47, 0x03, 0x7f, 0x01, 0xac, 0xff, 0xde, 0xfc, 0xb2, 0x05, 0xd5, 0xf1, 0x86, 0x43, 0x43, 0xfe, 0xc1, 0xfe, 0xcc, 0xfc, 0x6f, 0xd5, 0x61, 0x60, 0x9c, 0x5a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x03, 0xf4, 0x4a, 0x49, 0xa3, 0xe5, 0xd2, 0x5f, 0x22, 0x22, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0x50, 0x51, 0x6a, 0xad, 0x59, 0x5a, 0x02, 0xa4, 0xfd, 0x48, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x02, 0xb2, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x32, 0x32, 0x77, 0x78, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x01, 0x0a, 0x01, 0x3b, 0x13, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x68, 0xff, 0x13, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0xa3, 0x01, 0x75, 0x13, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x48, 0x10, 0x26, 0x02, 0x9a, 0x68, 0x00, 0x13, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xf4, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x27, 0x02, 0x9f, 0x00, 0x90, 0x00, 0x00, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0x00, 0x00, 0x07, 0x3e, 0x05, 0xd5, 0x00, 0x10, 0x00, 0x19, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x17, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x33, 0x07, 0x2e, 0xfd, 0x64, 0x02, 0x80, 0xfd, 0x80, 0x02, 0xac, 0xfc, 0x42, 0xfe, 0x7a, 0xfe, 0x6e, 0x01, 0x92, 0x01, 0x86, 0x5c, 0x74, 0xfe, 0xdf, 0xfe, 0xe0, 0x01, 0x20, 0x01, 0x21, 0x74, 0x05, 0xd5, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0x01, 0x7c, 0x01, 0x70, 0x01, 0x6d, 0x01, 0x7c, 0xaa, 0xfe, 0xe1, 0xfe, 0xe0, 0xfe, 0xdf, 0xfe, 0xdf, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xfd, 0x04, 0x7b, 0x00, 0x06, 0x00, 0x27, 0x00, 0x33, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x05, 0x15, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x25, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x06, 0x56, 0x02, 0x94, 0x7b, 0x8a, 0xa6, 0x0d, 0x02, 0xf4, 0xfd, 0x07, 0x0b, 0xb7, 0xa5, 0x5f, 0xb4, 0x59, 0x5a, 0xbc, 0x5f, 0x90, 0xda, 0x49, 0x40, 0xbc, 0x7e, 0xd9, 0xf5, 0xf5, 0xd9, 0x7e, 0xbe, 0x3c, 0x46, 0xd1, 0x80, 0xcc, 0xed, 0xfb, 0x38, 0x85, 0x9b, 0x9a, 0x86, 0x85, 0x9a, 0x9a, 0x02, 0x94, 0x98, 0xb3, 0xae, 0x9e, 0x35, 0x5a, 0xbe, 0xc7, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x6e, 0x6d, 0x6e, 0x6d, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x6f, 0x6c, 0x6b, 0x70, 0xfe, 0xdd, 0x87, 0xe7, 0xc9, 0xc9, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x20, 0x01, 0x76, 0x12, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x39, 0x06, 0x6d, 0x10, 0x26, 0x00, 0x76, 0x3b, 0x07, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x1e, 0x04, 0xcc, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x8e, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x75, 0xfe, 0x1e, 0x02, 0xf6, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd7, 0x02, 0xc9, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x5f, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x0a, 0x01, 0x67, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x05, 0x06, 0x66, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x20, 0x01, 0x76, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x06, 0x6d, 0x10, 0x26, 0x00, 0x76, 0x3c, 0x07, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0x1e, 0x01, 0x75, 0x13, 0x06, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x06, 0x66, 0x10, 0x26, 0x02, 0x88, 0x21, 0x00, 0x13, 0x06, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x75, 0x04, 0x2c, 0x05, 0xf0, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x75, 0x03, 0x67, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x15, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x17, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x06, 0x66, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, 0x11, 0x07, 0x02, 0xbd, 0x03, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0x75, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x7a, 0x48, 0x00, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0x75, 0x02, 0xa7, 0x05, 0x9e, 0x10, 0x26, 0x00, 0x7a, 0xe4, 0x00, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x07, 0x5f, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x01, 0x01, 0x67, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0x00, 0x00, 0x02, 0xb2, 0x06, 0x82, 0x12, 0x26, 0x00, 0x57, 0x00, 0x00, 0x11, 0x07, 0x10, 0xea, 0x01, 0xfe, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x05, 0x04, 0x70, 0xfe, 0x23, 0xef, 0xef, 0xb6, 0xef, 0xef, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0xfd, 0xc0, 0xaa, 0xfd, 0xbf, 0x02, 0x41, 0xaa, 0x02, 0x40, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x05, 0x9e, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x01, 0x55, 0xfe, 0xab, 0x21, 0x22, 0x67, 0xab, 0xab, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xe9, 0x8e, 0xe9, 0x89, 0x27, 0x27, 0x9a, 0x50, 0x4f, 0xd2, 0xe9, 0x8e, 0xe9, 0x8f, 0x01, 0x3e, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0x70, 0x01, 0x75, 0x13, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x37, 0x10, 0x26, 0x02, 0x9e, 0x76, 0x00, 0x13, 0x06, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0xd6, 0x01, 0x3b, 0x13, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x76, 0xff, 0x13, 0x06, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x70, 0x01, 0x75, 0x13, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x48, 0x10, 0x26, 0x02, 0x9a, 0x76, 0x00, 0x13, 0x06, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6f, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9c, 0x00, 0xd8, 0x00, 0x69, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0xca, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9c, 0x70, 0xc4, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xf4, 0x04, 0x70, 0x01, 0x75, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xef, 0x06, 0x66, 0x10, 0x27, 0x02, 0x9f, 0x00, 0x9e, 0x00, 0x00, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x75, 0x04, 0xa5, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x00, 0xe1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x75, 0x04, 0x6b, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x01, 0xf0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x74, 0x10, 0x27, 0x10, 0xef, 0x05, 0x5c, 0x01, 0x7c, 0x13, 0x06, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x6d, 0x10, 0x27, 0x02, 0x88, 0x01, 0x24, 0x00, 0x07, 0x13, 0x06, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x74, 0x10, 0x27, 0x10, 0xef, 0x04, 0x00, 0x01, 0x7c, 0x13, 0x06, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x6d, 0x10, 0x26, 0x02, 0x88, 0x55, 0x07, 0x13, 0x06, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x01, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x20, 0x01, 0x76, 0x12, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x06, 0x6d, 0x10, 0x26, 0x00, 0x76, 0x3c, 0x07, 0x12, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x45, 0x01, 0x75, 0x12, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xae, 0x00, 0x00, 0x13, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf0, 0x04, 0x45, 0x01, 0x75, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x06, 0x66, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x00, 0x10, 0x00, 0x00, 0x21, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x01, 0x6f, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x9d, 0x9e, 0x5a, 0x22, 0x23, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x99, 0x28, 0x29, 0x67, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x0f, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x15, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x03, 0x81, 0x4b, 0x4b, 0x83, 0x84, 0x4b, 0x4b, 0x4b, 0x4b, 0x84, 0x83, 0x4b, 0x4b, 0xfd, 0xcd, 0x34, 0x50, 0x4f, 0x6f, 0xb8, 0x72, 0x73, 0x73, 0x72, 0xb8, 0x6f, 0x4f, 0x50, 0x34, 0xa7, 0x8a, 0x8a, 0xa7, 0x01, 0x24, 0xfe, 0xdc, 0x02, 0x2f, 0xcb, 0x74, 0x73, 0x73, 0x74, 0xcb, 0xcb, 0x74, 0x73, 0x73, 0x74, 0x02, 0x52, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0xfe, 0xf8, 0xfe, 0xf8, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0xa8, 0x05, 0x04, 0x7d, 0x93, 0x93, 0x7d, 0x00, 0x00, 0x03, 0xff, 0xa1, 0x00, 0x00, 0x04, 0xc8, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x29, 0x00, 0x00, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x01, 0xc5, 0x01, 0x23, 0x93, 0x8d, 0x8d, 0x93, 0xfe, 0xdd, 0x01, 0x0d, 0x85, 0x83, 0x83, 0x85, 0xfe, 0x3d, 0x01, 0xd0, 0xd0, 0xe1, 0x73, 0x70, 0x87, 0x94, 0xf5, 0xe2, 0xfe, 0x1e, 0x77, 0x6a, 0x8c, 0xac, 0x02, 0xc9, 0xfd, 0xdd, 0x87, 0x8b, 0x8c, 0x85, 0x02, 0x66, 0xfe, 0x3e, 0x6f, 0x72, 0x71, 0x70, 0xa6, 0xc0, 0xb1, 0x89, 0xa2, 0x14, 0x20, 0xcb, 0x98, 0xc8, 0xda, 0x05, 0x30, 0x5f, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x06, 0x03, 0xa5, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x16, 0x00, 0x26, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x15, 0x23, 0x11, 0x21, 0x15, 0x25, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x4e, 0x34, 0x50, 0x4f, 0x6f, 0xb8, 0x72, 0x73, 0x73, 0x72, 0xb8, 0x6f, 0x4f, 0x50, 0x34, 0xa7, 0x02, 0xfa, 0xfd, 0xad, 0x02, 0x33, 0x4b, 0x4b, 0x83, 0x84, 0x4b, 0x4b, 0x4b, 0x4b, 0x84, 0x83, 0x4b, 0x4b, 0x03, 0xb6, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0xfe, 0xf8, 0xfe, 0xf8, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0xa8, 0x06, 0x14, 0xa6, 0x01, 0xfc, 0xc0, 0xcb, 0x74, 0x73, 0x73, 0x74, 0xcb, 0xcb, 0x74, 0x73, 0x73, 0x74, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x01, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x01, 0x03, 0xae, 0x47, 0x46, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x93, 0x46, 0x47, 0xfd, 0xbd, 0x01, 0x2c, 0xe2, 0xf5, 0xf5, 0xe2, 0xfe, 0x1e, 0xb5, 0x01, 0x19, 0x01, 0xb7, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x04, 0xa8, 0xfd, 0x9a, 0xda, 0xde, 0xdd, 0xda, 0x04, 0x44, 0x01, 0x91, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x15, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x23, 0x01, 0x33, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x4e, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xa7, 0x01, 0x05, 0x49, 0x02, 0x33, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0x03, 0xb6, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x04, 0x44, 0x01, 0xd1, 0xfc, 0x1a, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x19, 0x00, 0x00, 0x13, 0x3e, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x06, 0x07, 0x68, 0x5d, 0xd5, 0x79, 0x01, 0x31, 0x01, 0x5f, 0xfe, 0xa1, 0xfe, 0xcf, 0x77, 0xd5, 0x5f, 0x5b, 0xd0, 0x75, 0xe7, 0xf4, 0xf4, 0xe7, 0x75, 0xd0, 0x5b, 0x05, 0x62, 0x47, 0x47, 0xfe, 0x61, 0xfe, 0x98, 0xfe, 0x99, 0xfe, 0x61, 0x48, 0x48, 0xd3, 0x5f, 0x5e, 0x01, 0x39, 0x01, 0x27, 0x01, 0x28, 0x01, 0x39, 0x5e, 0x5f, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x05, 0xb8, 0x07, 0x64, 0x00, 0x24, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x04, 0xa3, 0x5c, 0xd0, 0x75, 0xe6, 0xf5, 0xf5, 0xe6, 0x75, 0xd0, 0x5c, 0x5f, 0xd6, 0x76, 0xfe, 0xce, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x32, 0x56, 0x8c, 0x0c, 0x0b, 0x0e, 0x4b, 0x5c, 0xcc, 0x45, 0x38, 0x79, 0x63, 0x05, 0x62, 0xd5, 0x5f, 0x5e, 0xfe, 0xc7, 0xfe, 0xd8, 0xfe, 0xd9, 0xfe, 0xc7, 0x5e, 0x5f, 0xd3, 0x48, 0x48, 0x01, 0x9f, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x24, 0x03, 0x04, 0xc3, 0x62, 0x7a, 0xaa, 0x96, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x52, 0x06, 0x14, 0x00, 0x22, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x17, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x03, 0x83, 0x46, 0x8d, 0x48, 0xa2, 0xb2, 0xb2, 0xa2, 0x48, 0x8d, 0x46, 0x45, 0x95, 0x53, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x40, 0x3f, 0x91, 0xa3, 0x3e, 0x2b, 0x5e, 0x45, 0x04, 0x7e, 0xf5, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0xe3, 0x2b, 0x2b, 0xaa, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x0c, 0x0f, 0xd6, 0xc0, 0x9c, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x05, 0x28, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x92, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa1, 0x00, 0x00, 0x05, 0x79, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x11, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x25, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x11, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x01, 0xc5, 0xdb, 0x01, 0x16, 0x01, 0x03, 0xfe, 0xfd, 0xfe, 0xea, 0xfe, 0x6f, 0x01, 0x75, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfe, 0x8b, 0x77, 0x6a, 0x8c, 0xac, 0x05, 0x2f, 0xfb, 0x77, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xa6, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x05, 0x30, 0x5f, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x01, 0x10, 0x29, 0x01, 0x11, 0x21, 0x22, 0x06, 0x11, 0x21, 0x11, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x21, 0x01, 0x75, 0x01, 0x20, 0x01, 0x23, 0xfe, 0xdd, 0x93, 0x8d, 0x02, 0xf9, 0xfe, 0x1e, 0xe2, 0xf5, 0xf5, 0xe2, 0x01, 0x2c, 0xfd, 0xbd, 0x01, 0xb7, 0xfe, 0xef, 0x02, 0x23, 0x87, 0x03, 0x93, 0xfa, 0x2b, 0xda, 0xde, 0xdd, 0xda, 0x01, 0xc0, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x06, 0x14, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x35, 0x21, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x11, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0xf2, 0x02, 0xf9, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xfd, 0xcc, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x05, 0x6e, 0xa6, 0xf9, 0xec, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0x01, 0xb9, 0xfc, 0xc0, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x02, 0x04, 0x63, 0x00, 0x19, 0x00, 0x27, 0x00, 0x00, 0x25, 0x16, 0x15, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x03, 0x14, 0x02, 0x03, 0x36, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x3e, 0x01, 0x03, 0x14, 0x8d, 0xfe, 0x73, 0xc7, 0x6c, 0x5c, 0xdd, 0xde, 0xee, 0xbb, 0x69, 0x80, 0xf6, 0xd8, 0xd7, 0xf8, 0x01, 0x8c, 0x23, 0x01, 0x9a, 0x85, 0x85, 0x9b, 0xa9, 0x72, 0x39, 0x2e, 0x59, 0x63, 0x42, 0x4f, 0x8d, 0xfe, 0xf0, 0x46, 0x99, 0x46, 0x75, 0x5c, 0x30, 0x25, 0x70, 0x87, 0x01, 0x0f, 0x01, 0x0f, 0x01, 0x39, 0xfe, 0xc7, 0xfe, 0xed, 0x9c, 0xfe, 0xfc, 0x01, 0xa0, 0xcb, 0xe5, 0xe8, 0xc3, 0xc2, 0xc7, 0x0b, 0x06, 0x0e, 0x2a, 0xdc, 0x00, 0x01, 0x00, 0x75, 0x00, 0x00, 0x03, 0xd8, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x03, 0xd8, 0xfc, 0x9e, 0x02, 0xac, 0xfd, 0x80, 0x02, 0x80, 0xfd, 0x64, 0x05, 0xd5, 0xfa, 0x2b, 0xaa, 0x02, 0x1d, 0xaa, 0x01, 0xba, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x00, 0x13, 0x21, 0x10, 0x02, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x37, 0x16, 0x12, 0x33, 0x32, 0x12, 0x37, 0x69, 0x04, 0x1b, 0xf8, 0xf6, 0x7e, 0xe2, 0x65, 0x64, 0xec, 0x84, 0x01, 0x3b, 0x01, 0x63, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xd8, 0xfe, 0xbb, 0xc6, 0x0c, 0xe5, 0xb6, 0xb6, 0xe6, 0x0b, 0x03, 0x0c, 0x01, 0x0c, 0x01, 0x32, 0x60, 0x5f, 0xd7, 0x46, 0x48, 0xfe, 0x67, 0xfe, 0x92, 0xfe, 0x9f, 0xfe, 0x5b, 0x01, 0xb7, 0xcc, 0xc3, 0xfe, 0xe4, 0x01, 0x1c, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x93, 0xff, 0xe3, 0x04, 0x09, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x24, 0x35, 0x34, 0x36, 0x01, 0xa9, 0x76, 0x80, 0xf1, 0xcf, 0x50, 0xb5, 0x68, 0x67, 0xab, 0x4a, 0x89, 0x93, 0x8e, 0x86, 0xa4, 0x9c, 0x95, 0xa7, 0xb4, 0xab, 0x62, 0xb4, 0x4b, 0x5f, 0xb3, 0x55, 0xfc, 0xfe, 0xef, 0x92, 0x03, 0x25, 0x21, 0xab, 0x7c, 0xb2, 0xd1, 0x20, 0x20, 0xb4, 0x26, 0x24, 0x7b, 0x73, 0x70, 0x77, 0xa6, 0x95, 0x84, 0x8f, 0x96, 0x32, 0x31, 0xc3, 0x25, 0x25, 0xf2, 0xdd, 0x90, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xfe, 0x66, 0x03, 0xba, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0xb5, 0x03, 0x04, 0xfd, 0xb2, 0x02, 0x15, 0xfd, 0xeb, 0xb9, 0xcc, 0x45, 0x38, 0x79, 0x63, 0x05, 0xd5, 0xaa, 0xfe, 0x48, 0xaa, 0xfd, 0x9f, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x8b, 0xfe, 0x56, 0x02, 0xac, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x02, 0xac, 0x9e, 0x5a, 0x45, 0x01, 0x11, 0xfe, 0xef, 0x9c, 0xab, 0x9c, 0x9e, 0x59, 0x46, 0x9f, 0x9f, 0x9c, 0xaa, 0x06, 0x14, 0x99, 0x50, 0x68, 0x63, 0x8f, 0xfb, 0xeb, 0xbb, 0xab, 0x99, 0x50, 0x68, 0x04, 0x2a, 0x8f, 0x4e, 0xbb, 0xab, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x05, 0xef, 0x07, 0x64, 0x00, 0x26, 0x00, 0x00, 0x25, 0x11, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x04, 0x49, 0xfe, 0xd7, 0x01, 0xdd, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xfe, 0x9d, 0x01, 0x63, 0x01, 0x3b, 0x51, 0x93, 0x3e, 0xb5, 0xcc, 0x45, 0x38, 0x79, 0x63, 0x65, 0xe3, 0x7d, 0xf6, 0xf8, 0xf8, 0xf6, 0x61, 0x97, 0xd5, 0x01, 0x91, 0xa6, 0xfd, 0x7f, 0x53, 0x55, 0x01, 0x99, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x99, 0x19, 0x19, 0xbc, 0xea, 0xaa, 0x96, 0xc2, 0xd7, 0x5f, 0x60, 0xfe, 0xce, 0xfe, 0xd1, 0xfe, 0xd2, 0xfe, 0xce, 0x25, 0x00, 0x00, 0x02, 0x00, 0x07, 0xfe, 0x52, 0x04, 0xeb, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x00, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x13, 0x01, 0x33, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x33, 0x02, 0x79, 0x31, 0x27, 0x19, 0x1c, 0x2e, 0x27, 0x28, 0x2e, 0x1c, 0x19, 0x28, 0x31, 0x01, 0xa9, 0xc8, 0xfd, 0xf5, 0x5d, 0x3c, 0x2a, 0x44, 0x5a, 0x8b, 0x8b, 0x5b, 0x43, 0x29, 0x3d, 0x5d, 0xfd, 0xf4, 0xc8, 0xfe, 0xfd, 0x20, 0x14, 0x42, 0x39, 0x49, 0x79, 0x5c, 0x5c, 0x79, 0x49, 0x39, 0x42, 0x14, 0x20, 0x03, 0x7a, 0x03, 0x5e, 0xfb, 0xcf, 0xc8, 0xae, 0x77, 0x42, 0x8b, 0x41, 0x57, 0x57, 0x41, 0x8b, 0x42, 0x77, 0xae, 0xc8, 0x04, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x8d, 0x06, 0x14, 0x00, 0x2a, 0x00, 0x00, 0x25, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x11, 0x14, 0x00, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x33, 0x04, 0xc4, 0x86, 0x4c, 0x4e, 0x42, 0x38, 0x6d, 0xca, 0x62, 0x64, 0xfe, 0xfd, 0xc7, 0x3f, 0xa9, 0x8d, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x44, 0x5e, 0x9c, 0x62, 0x65, 0x9b, 0xde, 0x70, 0x5f, 0x21, 0x94, 0x1d, 0x8f, 0x91, 0xfe, 0xec, 0xf5, 0xfe, 0xe6, 0xc8, 0xce, 0x01, 0x08, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x06, 0x14, 0xfd, 0x9e, 0x65, 0x64, 0xef, 0xe8, 0xfe, 0xf2, 0x93, 0x67, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x02, 0x7f, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x11, 0xb5, 0xb6, 0x63, 0x78, 0x39, 0x45, 0xcd, 0xb8, 0x05, 0xd5, 0xfc, 0x2d, 0xc2, 0x96, 0xaa, 0xf4, 0x01, 0x0e, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x02, 0x17, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0xac, 0xac, 0xb6, 0xac, 0xac, 0x05, 0xd5, 0xfd, 0x16, 0xaa, 0xfd, 0xbf, 0x02, 0x41, 0xaa, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x5f, 0x05, 0xf0, 0x00, 0x17, 0x00, 0x00, 0x01, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x05, 0x5e, 0x99, 0x41, 0x23, 0x3f, 0x21, 0xfe, 0x14, 0x02, 0xca, 0xef, 0xfd, 0x7b, 0xb6, 0xb6, 0x02, 0x2e, 0x4c, 0x66, 0x7a, 0x4d, 0x4c, 0x04, 0x48, 0x79, 0x36, 0x50, 0x23, 0xfd, 0xf9, 0xfc, 0xe3, 0x02, 0xcf, 0xfd, 0x31, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x43, 0x4f, 0x5c, 0x5b, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa6, 0x00, 0x00, 0x04, 0x26, 0x06, 0x14, 0x00, 0x12, 0x00, 0x00, 0x13, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0xa6, 0x93, 0xa3, 0xac, 0x97, 0x5f, 0x44, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x02, 0x2d, 0xd8, 0xfe, 0x00, 0xa7, 0x04, 0x7e, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xfd, 0xff, 0x01, 0xe3, 0xfd, 0xf4, 0xfd, 0xac, 0x02, 0x23, 0xfd, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0xf3, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xae, 0xa5, 0xa0, 0xa0, 0xa5, 0xa5, 0xa5, 0x06, 0x14, 0xfd, 0x38, 0x90, 0xfd, 0x44, 0x02, 0xbc, 0x90, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x01, 0x27, 0x05, 0x27, 0x25, 0x27, 0x33, 0x17, 0x25, 0x17, 0x05, 0x01, 0x23, 0x09, 0x01, 0x37, 0x01, 0xba, 0x40, 0xfe, 0xf2, 0x1e, 0x01, 0x0b, 0x43, 0xb4, 0x2f, 0x01, 0x1a, 0x1e, 0xfe, 0xe8, 0x01, 0xbc, 0xb0, 0xfe, 0xe6, 0xfe, 0xa4, 0x04, 0x32, 0xbc, 0x65, 0x63, 0x63, 0xc5, 0x8a, 0x68, 0x61, 0x68, 0xfa, 0xd7, 0x03, 0x3c, 0xfc, 0xc4, 0x00, 0x00, 0x01, 0x00, 0xa0, 0xff, 0xe3, 0x06, 0x70, 0x05, 0xd5, 0x00, 0x27, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x03, 0x49, 0x3f, 0xac, 0x75, 0x9e, 0x55, 0x56, 0xb7, 0x23, 0x33, 0x6a, 0x80, 0x96, 0xb6, 0x34, 0x33, 0x6b, 0x6f, 0x4a, 0x4b, 0xb7, 0xb7, 0x39, 0x9e, 0x6d, 0x6e, 0x4d, 0x4c, 0xd5, 0x7c, 0x76, 0x7b, 0x7a, 0xe2, 0x04, 0x1b, 0xfb, 0xef, 0xba, 0x35, 0x4e, 0xbe, 0xa4, 0x03, 0xec, 0xfb, 0xef, 0xa2, 0x4e, 0x4d, 0x5f, 0x60, 0xa3, 0x03, 0xec, 0xfa, 0x29, 0xae, 0x67, 0x62, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xfe, 0x66, 0x04, 0xae, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0xb5, 0xf5, 0x02, 0x54, 0xb0, 0xf5, 0xfd, 0xac, 0xb8, 0xcc, 0x40, 0x38, 0x79, 0x63, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x2b, 0x04, 0xe1, 0xfb, 0x87, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x06, 0x03, 0x4b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x19, 0x00, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x22, 0x02, 0x07, 0x21, 0x26, 0x02, 0x01, 0x1a, 0x01, 0x33, 0x32, 0x12, 0x13, 0x68, 0x01, 0x53, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xad, 0x02, 0x6f, 0xb6, 0xe6, 0x0b, 0x03, 0x4e, 0x0c, 0xe5, 0xfd, 0x9a, 0x07, 0xe2, 0xc6, 0xc6, 0xe0, 0x07, 0x02, 0xe9, 0x01, 0x62, 0x01, 0xa5, 0xfe, 0x5b, 0xfe, 0x9f, 0xfe, 0x9e, 0xfe, 0x5b, 0x01, 0xa4, 0x03, 0xc5, 0xfe, 0xe4, 0xc3, 0xc3, 0x01, 0x1c, 0xfd, 0x7a, 0xfe, 0xff, 0xfe, 0xc2, 0x01, 0x3d, 0x01, 0x02, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x06, 0x14, 0x10, 0x26, 0x00, 0x32, 0xf5, 0x00, 0x10, 0x07, 0x02, 0xcc, 0x05, 0x11, 0x01, 0x34, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x04, 0xeb, 0x10, 0x27, 0x02, 0xcc, 0x03, 0xe9, 0x00, 0x0b, 0x10, 0x06, 0x00, 0x52, 0x04, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x21, 0x05, 0xf0, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x00, 0x21, 0x11, 0x34, 0x26, 0x23, 0x11, 0x06, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x17, 0x21, 0x32, 0x16, 0x19, 0x01, 0x01, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x37, 0x11, 0x26, 0x05, 0x6b, 0x63, 0x6e, 0xa9, 0xfe, 0xe4, 0xfe, 0xe6, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x1b, 0x65, 0x57, 0x01, 0x0a, 0xcc, 0xb9, 0xfc, 0xb5, 0xc6, 0xe9, 0xe9, 0xc6, 0x9e, 0x73, 0x7c, 0x03, 0xd3, 0xc2, 0x96, 0xfb, 0x8b, 0xd3, 0x01, 0xa4, 0x01, 0x62, 0x01, 0x62, 0x01, 0xa5, 0x1b, 0xf4, 0xfe, 0xf2, 0xfc, 0x2d, 0x05, 0x4c, 0xfe, 0xb8, 0xfe, 0xe6, 0xfe, 0xe5, 0xfe, 0xb8, 0x67, 0x04, 0x18, 0x46, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0xd1, 0x04, 0x7b, 0x00, 0x16, 0x00, 0x21, 0x00, 0x00, 0x01, 0x11, 0x34, 0x27, 0x26, 0x23, 0x11, 0x06, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x17, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x04, 0x2a, 0x22, 0x22, 0x5e, 0x7c, 0xd8, 0xd9, 0xf5, 0xf5, 0xd9, 0x5a, 0x4a, 0xc2, 0xa3, 0x4a, 0x49, 0xfd, 0x64, 0x85, 0x9b, 0x9a, 0x86, 0x74, 0x3a, 0x4c, 0xfe, 0x56, 0x04, 0x74, 0x99, 0x31, 0x30, 0xfc, 0xbc, 0x9d, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x1b, 0x60, 0x60, 0xd6, 0xfb, 0x8c, 0x05, 0x89, 0xe7, 0xc9, 0xc9, 0xe7, 0x3a, 0x02, 0xf0, 0x36, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa1, 0x00, 0x00, 0x04, 0x73, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x01, 0xc5, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xfe, 0x66, 0x01, 0x9a, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xb6, 0x77, 0x6a, 0x8c, 0xac, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xa6, 0xe3, 0xdb, 0xdd, 0xe2, 0xfd, 0xa8, 0x05, 0x30, 0x5f, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa6, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x4e, 0xa8, 0x93, 0xa3, 0xe5, 0xd0, 0x5f, 0x44, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x01, 0xff, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xa8, 0xfd, 0xae, 0x06, 0x28, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xc8, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x01, 0xeb, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x02, 0x00, 0xb4, 0xfe, 0xf8, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0xb6, 0xe4, 0xe7, 0xe2, 0x75, 0xfd, 0xc8, 0xe4, 0x7f, 0x8b, 0x8a, 0x80, 0x01, 0xb4, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfe, 0x91, 0x05, 0xd5, 0xfe, 0xf8, 0xd6, 0xd8, 0x8d, 0xba, 0x02, 0x4f, 0xfd, 0xd1, 0x92, 0x01, 0x0c, 0x91, 0x00, 0x01, 0x00, 0x66, 0xff, 0xe3, 0x04, 0x19, 0x05, 0xf0, 0x00, 0x21, 0x00, 0x00, 0x13, 0x36, 0x20, 0x16, 0x10, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x20, 0x07, 0xb8, 0xcd, 0x01, 0x98, 0xfb, 0xb5, 0xcc, 0x6e, 0x8b, 0x7a, 0xaa, 0x9b, 0xcb, 0xdf, 0xe9, 0xc1, 0xfd, 0x83, 0x82, 0xc1, 0xcc, 0x6d, 0x96, 0x36, 0x35, 0x50, 0x51, 0xfe, 0xc4, 0xcd, 0x05, 0xa4, 0x4c, 0xe4, 0xfe, 0x8f, 0xc0, 0x2d, 0x18, 0x1f, 0x7c, 0xec, 0x88, 0x8b, 0xd0, 0x5f, 0x70, 0x70, 0xd9, 0xb6, 0xd9, 0x2b, 0x19, 0x1f, 0x32, 0x33, 0xd9, 0x40, 0x40, 0x6d, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xe3, 0x03, 0x5d, 0x04, 0x7b, 0x00, 0x27, 0x00, 0x00, 0x13, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x90, 0x44, 0xa2, 0x5c, 0xba, 0xc9, 0x89, 0x9a, 0x39, 0x9a, 0x5b, 0x7e, 0x75, 0x57, 0xb3, 0x5b, 0x61, 0xaf, 0x51, 0xc3, 0xde, 0x94, 0xb1, 0x39, 0x85, 0x58, 0x7b, 0x7c, 0x51, 0x97, 0x46, 0x04, 0x3f, 0x1e, 0x1e, 0xac, 0x9e, 0x82, 0x95, 0x24, 0x0f, 0x25, 0x50, 0x4b, 0x51, 0x59, 0x35, 0x35, 0xbe, 0x23, 0x23, 0xb6, 0x9c, 0x89, 0x99, 0x2a, 0x0e, 0x21, 0x49, 0x40, 0x54, 0x54, 0x28, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x10, 0x06, 0x03, 0x37, 0x00, 0x00, 0x00, 0x02, 0xff, 0x0d, 0xfe, 0x56, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x22, 0x35, 0x34, 0x21, 0x32, 0x17, 0x16, 0x17, 0x33, 0x15, 0x25, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x33, 0x01, 0x52, 0x45, 0x59, 0x9e, 0x9c, 0xaa, 0x9d, 0xab, 0xf3, 0x01, 0x11, 0xa3, 0x49, 0x30, 0x10, 0xac, 0xfe, 0xac, 0x08, 0x0e, 0x1e, 0x63, 0x70, 0x03, 0x02, 0x6b, 0x04, 0x6a, 0xfb, 0x3d, 0x68, 0x50, 0x99, 0xab, 0xbb, 0x04, 0xae, 0xd2, 0xd8, 0x60, 0x40, 0x6f, 0x9b, 0x9a, 0x2c, 0x18, 0x30, 0x41, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x56, 0x02, 0xa7, 0x05, 0x9e, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x43, 0x67, 0xab, 0x94, 0xa2, 0x3f, 0x2b, 0x60, 0x22, 0x22, 0xc0, 0x96, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xfd, 0xa0, 0x89, 0x4e, 0xae, 0xd6, 0xc0, 0x9c, 0x30, 0x31, 0x99, 0x14, 0x9f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0x00, 0x01, 0x00, 0x15, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x01, 0x83, 0x02, 0xe8, 0xfe, 0x23, 0xb6, 0x55, 0x77, 0x6a, 0x8c, 0xac, 0x05, 0xd5, 0xaa, 0xfa, 0xd5, 0x05, 0x2b, 0x5a, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x15, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x43, 0x67, 0xab, 0xab, 0xbf, 0x92, 0x79, 0x79, 0x9d, 0xaa, 0x9c, 0x9e, 0x59, 0x45, 0x04, 0xc3, 0x63, 0x8f, 0xfd, 0xa0, 0x89, 0x4e, 0x9a, 0x9f, 0xd2, 0x02, 0x60, 0x8f, 0x4e, 0xbb, 0xab, 0x99, 0x51, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x66, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x19, 0x01, 0x21, 0x05, 0x04, 0x70, 0xfe, 0x23, 0x63, 0x79, 0x39, 0x47, 0xcc, 0xb8, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0xfb, 0x3d, 0xc2, 0x96, 0xaa, 0xf4, 0x01, 0x0e, 0x04, 0xc3, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x06, 0x14, 0x10, 0x26, 0x00, 0x38, 0xfc, 0x14, 0x10, 0x07, 0x02, 0xcc, 0x05, 0x4d, 0x01, 0x34, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x04, 0xeb, 0x10, 0x27, 0x02, 0xcc, 0x04, 0x70, 0x00, 0x0b, 0x10, 0x06, 0x00, 0x58, 0x02, 0x00, 0x00, 0x01, 0x00, 0x46, 0xff, 0xe3, 0x05, 0x3b, 0x05, 0xca, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x16, 0x12, 0x15, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x37, 0x21, 0x35, 0x21, 0x15, 0x06, 0x02, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x34, 0x02, 0x27, 0x35, 0x21, 0x05, 0x3a, 0xfe, 0xe0, 0x91, 0x80, 0xfe, 0xa6, 0xfe, 0xef, 0xfe, 0xed, 0xfe, 0xa8, 0x82, 0x8e, 0xfe, 0xe1, 0x02, 0x1c, 0xa0, 0xb3, 0xee, 0xc3, 0xc2, 0xee, 0xb2, 0xa0, 0x02, 0x1c, 0x05, 0x18, 0x8d, 0xfe, 0xd8, 0xc2, 0xfe, 0xcb, 0xfe, 0x77, 0x01, 0x8a, 0x01, 0x3e, 0xb8, 0x01, 0x2a, 0x8b, 0xb2, 0xb2, 0x61, 0xfe, 0xb4, 0xca, 0xef, 0xfe, 0xdd, 0x01, 0x22, 0xf0, 0xca, 0x01, 0x4c, 0x61, 0xb2, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xff, 0xe1, 0x04, 0xeb, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x32, 0x12, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x17, 0x16, 0x12, 0x15, 0x10, 0x07, 0x06, 0x21, 0x27, 0x26, 0x27, 0x26, 0x19, 0x01, 0x33, 0x11, 0x14, 0x16, 0x33, 0x02, 0x7f, 0xc2, 0xee, 0x59, 0x3b, 0x63, 0xa2, 0x90, 0x80, 0xad, 0xac, 0xfe, 0xee, 0x45, 0xd1, 0x57, 0x5d, 0xb6, 0x63, 0x78, 0x8d, 0x01, 0x22, 0xf0, 0xca, 0xa6, 0x6d, 0x57, 0x44, 0x01, 0x8d, 0xfe, 0xd8, 0xc2, 0xfe, 0xcb, 0xc5, 0xc4, 0x02, 0x06, 0x74, 0x7a, 0x01, 0x0e, 0x03, 0xf0, 0xfc, 0x10, 0xc2, 0x96, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x05, 0x58, 0x05, 0xf0, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x04, 0x5b, 0x33, 0x13, 0x22, 0x0f, 0xfe, 0xaa, 0xb6, 0xfe, 0x24, 0xc4, 0x01, 0x74, 0x01, 0x2d, 0x51, 0x93, 0x7a, 0x4d, 0x4c, 0x99, 0x42, 0x05, 0x47, 0x0e, 0x18, 0x19, 0xfd, 0xbf, 0xfd, 0x39, 0x02, 0xc7, 0x03, 0x0e, 0xfd, 0x9a, 0x01, 0xf9, 0x88, 0x5c, 0x5b, 0x6e, 0x83, 0x79, 0x36, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x56, 0x05, 0x43, 0x04, 0x7b, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x01, 0x33, 0x01, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x02, 0x51, 0x46, 0x85, 0x70, 0x84, 0x61, 0x44, 0x4c, 0x2e, 0x1e, 0xfe, 0x68, 0xaf, 0x01, 0x3b, 0xfe, 0x13, 0x2b, 0x4f, 0x7a, 0x76, 0xa6, 0xa0, 0x49, 0x33, 0x33, 0x25, 0x12, 0x09, 0x68, 0xc8, 0x7a, 0x9a, 0x48, 0x86, 0x54, 0x04, 0x4e, 0xfc, 0x94, 0x02, 0xc0, 0x34, 0x33, 0x60, 0xbf, 0x86, 0x72, 0x72, 0x3a, 0x54, 0x2a, 0x14, 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x33, 0x15, 0x21, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x01, 0x21, 0x68, 0x04, 0x1f, 0xfe, 0x98, 0xfd, 0xfe, 0x9b, 0xfe, 0x7f, 0x03, 0x66, 0xfb, 0xb7, 0x01, 0x8d, 0xfe, 0xf3, 0x01, 0x75, 0x01, 0x5c, 0xfc, 0xc4, 0x05, 0xd5, 0x9a, 0xfe, 0x11, 0x90, 0xfd, 0xee, 0xaa, 0x9a, 0x02, 0x22, 0x90, 0x01, 0xdf, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x03, 0x33, 0x15, 0x21, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x23, 0x35, 0x21, 0x13, 0x21, 0x66, 0x03, 0x12, 0xe2, 0xaf, 0xfe, 0xe2, 0xfe, 0xe3, 0x02, 0x6e, 0xfc, 0xd7, 0x01, 0x0d, 0xbe, 0x01, 0x2e, 0xf2, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfe, 0xdc, 0x90, 0xfe, 0x8f, 0x93, 0xa8, 0x01, 0x5c, 0x90, 0x01, 0x39, 0x00, 0x01, 0x00, 0x90, 0xff, 0xc1, 0x04, 0x79, 0x05, 0xd5, 0x00, 0x22, 0x00, 0x00, 0x25, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x02, 0x64, 0xad, 0x59, 0x5a, 0x53, 0x54, 0x94, 0x9d, 0x01, 0x5b, 0xfd, 0x49, 0x03, 0x9a, 0xfe, 0x8e, 0x5f, 0x73, 0x58, 0x4e, 0x49, 0x89, 0x89, 0xfc, 0x6b, 0x70, 0x72, 0x78, 0x5f, 0x72, 0x72, 0x6b, 0x4b, 0x4b, 0x8f, 0x86, 0x49, 0x4a, 0x98, 0x01, 0xea, 0xaa, 0x9a, 0xfe, 0x16, 0x38, 0x2a, 0x6d, 0x68, 0x8a, 0xdc, 0x7a, 0x79, 0x13, 0x12, 0x25, 0xc3, 0x31, 0x19, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0xff, 0xc1, 0x04, 0x3c, 0x05, 0xd5, 0x00, 0x22, 0x00, 0x00, 0x25, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0x68, 0x7b, 0x71, 0x73, 0x5f, 0x79, 0x71, 0x70, 0x6c, 0xfc, 0x88, 0x89, 0x49, 0x4d, 0x58, 0x73, 0x60, 0xfe, 0x8e, 0x03, 0x9a, 0xfd, 0x49, 0x01, 0x5a, 0x9c, 0x95, 0x54, 0x52, 0x5a, 0x59, 0x6b, 0x19, 0x19, 0x31, 0xc3, 0x25, 0x12, 0x13, 0x79, 0x7a, 0xdc, 0x8a, 0x68, 0x6d, 0x2a, 0x38, 0x01, 0xea, 0x9a, 0xaa, 0xfe, 0x16, 0x98, 0x4a, 0x49, 0x86, 0x8f, 0x4b, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5d, 0xfe, 0x4c, 0x03, 0xd3, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x09, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x24, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x02, 0x1f, 0xfe, 0x8e, 0x03, 0x12, 0xfd, 0xa8, 0x01, 0x83, 0x9c, 0x95, 0x54, 0x53, 0x5a, 0x5a, 0xab, 0x62, 0xb4, 0x4b, 0x5f, 0x5a, 0x59, 0x55, 0xfc, 0xfe, 0xef, 0x48, 0x4e, 0x58, 0x73, 0x01, 0xdc, 0x01, 0xdc, 0xa8, 0x93, 0xfe, 0x0d, 0xa6, 0x4a, 0x4b, 0x84, 0x8f, 0x4b, 0x4b, 0x32, 0x31, 0xc3, 0x25, 0x13, 0x12, 0xf2, 0xdd, 0x8a, 0x68, 0x6d, 0x2a, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x56, 0x03, 0x84, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x01, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x20, 0x11, 0x34, 0x25, 0x24, 0x35, 0x34, 0x23, 0x30, 0x21, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x20, 0x15, 0x10, 0x05, 0x06, 0x15, 0x14, 0x02, 0x3f, 0x4c, 0x45, 0x47, 0x49, 0x4e, 0x48, 0x4e, 0x57, 0xfe, 0x50, 0x01, 0x6d, 0x01, 0x00, 0xd4, 0xfe, 0xfc, 0x01, 0xb4, 0xfd, 0xa8, 0x03, 0x12, 0xfe, 0xc2, 0x01, 0x4a, 0xfe, 0x5e, 0xcb, 0xfe, 0xee, 0x15, 0x15, 0x2c, 0xb3, 0x20, 0x0d, 0x0e, 0x01, 0x19, 0xee, 0x35, 0x25, 0x62, 0x7c, 0x02, 0x38, 0x93, 0xa8, 0xfe, 0x64, 0xe5, 0xfe, 0xec, 0x31, 0x18, 0x61, 0x8b, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0xdd, 0x05, 0xf0, 0x00, 0x24, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x35, 0x01, 0x37, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x33, 0x15, 0x23, 0x07, 0x01, 0x62, 0x02, 0x7a, 0xfc, 0xab, 0x01, 0x1b, 0x67, 0xfe, 0xca, 0x01, 0xb1, 0x56, 0x21, 0x23, 0x4a, 0x4c, 0x79, 0x55, 0x5f, 0x5f, 0x6c, 0x6e, 0xbf, 0x4f, 0xd1, 0xf8, 0x1f, 0x1c, 0x42, 0x5e, 0xd5, 0x2b, 0xaa, 0xaa, 0xaa, 0x01, 0x40, 0x75, 0x90, 0x6d, 0x48, 0x4c, 0x49, 0x77, 0x4b, 0x4b, 0x21, 0x21, 0x43, 0xcc, 0x31, 0x32, 0xe8, 0xc2, 0x5c, 0x52, 0x49, 0x60, 0x90, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0xff, 0xc1, 0x04, 0x7a, 0x05, 0xd5, 0x00, 0x19, 0x00, 0x00, 0x01, 0x10, 0x20, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x25, 0x36, 0x17, 0x16, 0x10, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x20, 0x24, 0x35, 0x01, 0x09, 0x02, 0xbc, 0xa7, 0x94, 0xfe, 0x2b, 0x03, 0x44, 0xfd, 0x72, 0x01, 0x4e, 0xe6, 0x92, 0x49, 0x35, 0x1a, 0x11, 0x29, 0x89, 0xfd, 0xfd, 0xfe, 0xef, 0x01, 0x90, 0xfe, 0xdb, 0x01, 0x25, 0x86, 0x93, 0x03, 0x2c, 0xaa, 0xfe, 0x25, 0x01, 0x01, 0xd0, 0x68, 0xfe, 0xe0, 0x56, 0x29, 0x1d, 0x24, 0x79, 0xf2, 0xdd, 0x00, 0x01, 0x00, 0x5d, 0xfe, 0x4c, 0x03, 0xd3, 0x04, 0x60, 0x00, 0x1a, 0x00, 0x00, 0x17, 0x16, 0x33, 0x20, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x32, 0x1e, 0x01, 0x10, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x5e, 0x98, 0xba, 0x01, 0x6d, 0xa6, 0x95, 0xfe, 0xc3, 0x02, 0xc9, 0xfd, 0xdc, 0xc7, 0x5f, 0xcd, 0x95, 0x35, 0x19, 0x12, 0x28, 0x89, 0xfc, 0xa9, 0xbe, 0xa7, 0x63, 0x01, 0x25, 0x86, 0x93, 0x03, 0x2c, 0xaa, 0xfe, 0x26, 0x63, 0xd4, 0xfe, 0xe0, 0x56, 0x29, 0x1d, 0x24, 0x79, 0x4a, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xff, 0xe3, 0x03, 0x48, 0x05, 0x9e, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x01, 0xea, 0x01, 0x99, 0x64, 0x62, 0x63, 0x7c, 0xf7, 0x4d, 0x49, 0x48, 0x45, 0x42, 0x4b, 0x47, 0x48, 0xa1, 0x59, 0x33, 0x01, 0x34, 0x4d, 0xad, 0x38, 0x02, 0xce, 0xce, 0xb5, 0xd0, 0x03, 0xe6, 0x7d, 0x1e, 0x77, 0x73, 0xaa, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x28, 0x18, 0x16, 0x72, 0x41, 0x85, 0x62, 0x4c, 0x72, 0x01, 0x0f, 0xa4, 0x01, 0x14, 0xfe, 0xec, 0xa4, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x05, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x10, 0x01, 0x00, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x01, 0x4e, 0xa7, 0xa7, 0x2f, 0x79, 0x49, 0xbd, 0xa6, 0x45, 0x46, 0xfd, 0x21, 0x02, 0x33, 0x33, 0x32, 0x6c, 0xc6, 0x9c, 0x7a, 0xfe, 0xd0, 0x06, 0x0a, 0xaa, 0x42, 0x52, 0x31, 0x70, 0x71, 0x99, 0xfe, 0x57, 0xfe, 0xe4, 0x01, 0x90, 0xf9, 0x85, 0x42, 0x41, 0xef, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x01, 0x6b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xb5, 0xb6, 0xb6, 0x05, 0xd5, 0xf8, 0x81, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x02, 0xd7, 0x05, 0xd5, 0x10, 0x27, 0x01, 0x82, 0x01, 0x6c, 0x00, 0x00, 0x10, 0x06, 0x01, 0x82, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xfe, 0x56, 0x03, 0x40, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x01, 0x4e, 0xb6, 0x01, 0x3c, 0xfe, 0xc4, 0x01, 0x3c, 0xfe, 0xc4, 0xb6, 0xfe, 0xc4, 0x01, 0x3c, 0xfe, 0xc4, 0x01, 0x3c, 0x05, 0xd5, 0xfd, 0x97, 0xa8, 0xf0, 0xaa, 0xfd, 0x2c, 0x02, 0xd4, 0xaa, 0xf0, 0xa8, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6c, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x04, 0x9f, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x09, 0xbc, 0x07, 0x6d, 0x10, 0x27, 0x01, 0x3f, 0x05, 0x1f, 0x00, 0x00, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x08, 0xb8, 0x06, 0x66, 0x10, 0x27, 0x01, 0x40, 0x05, 0x40, 0x00, 0x00, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x07, 0xb6, 0x06, 0x66, 0x10, 0x27, 0x01, 0x40, 0x04, 0x3d, 0x00, 0x00, 0x10, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x66, 0x05, 0x87, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x2d, 0x04, 0x1c, 0x00, 0x00, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x05, 0x48, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x03, 0xf4, 0x00, 0x00, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0xfe, 0x56, 0x02, 0xa4, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x01, 0x51, 0x00, 0x00, 0x10, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x66, 0x06, 0x41, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x2d, 0x04, 0xd6, 0x00, 0x00, 0x10, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x06, 0x0c, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x04, 0xb8, 0x00, 0x00, 0x10, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x05, 0x48, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x03, 0xf4, 0x00, 0x00, 0x10, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x45, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x51, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x02, 0x24, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x02, 0xde, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x02, 0x22, 0x06, 0x66, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0xff, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf0, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x6a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x77, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x66, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x6a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x33, 0x10, 0x26, 0x11, 0x1e, 0x2b, 0x00, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0x6f, 0x01, 0x3b, 0x12, 0x06, 0x00, 0xbe, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x06, 0x11, 0x21, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0x22, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x11, 0x21, 0xff, 0xc5, 0xfe, 0xc8, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x06, 0x11, 0x26, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0x22, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x11, 0x26, 0xff, 0xca, 0xfe, 0xc8, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x60, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x06, 0x11, 0x22, 0x2b, 0x06, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0x22, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x11, 0x22, 0xff, 0xc5, 0xfe, 0xc8, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x06, 0x02, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x33, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x1e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x31, 0x12, 0x26, 0x00, 0xa6, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x4a, 0x01, 0x3b, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x33, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0xf4, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x11, 0x20, 0xff, 0x9e, 0xfe, 0xc1, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x06, 0x8e, 0x07, 0x34, 0x10, 0x27, 0x00, 0x71, 0x02, 0x8e, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x05, 0xf2, 0x10, 0x27, 0x00, 0x71, 0x01, 0xb7, 0xff, 0xfc, 0x12, 0x06, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x6a, 0x05, 0xf0, 0x00, 0x25, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x23, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x35, 0x21, 0x35, 0x04, 0xfd, 0x6d, 0x6d, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xfe, 0x9d, 0x01, 0x63, 0x01, 0x3b, 0x83, 0xed, 0x64, 0x65, 0xe3, 0x7d, 0xf6, 0xf8, 0xf8, 0xf6, 0x61, 0x97, 0x3c, 0xe4, 0xe4, 0xfe, 0xd7, 0x03, 0x0c, 0xfe, 0xd6, 0x58, 0xff, 0x53, 0x55, 0x01, 0x99, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x99, 0x48, 0x46, 0xd7, 0x5f, 0x60, 0xfe, 0xce, 0xfe, 0xd1, 0xfe, 0xd2, 0xfe, 0xce, 0x25, 0x27, 0xb5, 0x58, 0x84, 0xa6, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x7b, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x34, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x17, 0x14, 0x07, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x35, 0x21, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x03, 0x45, 0x95, 0x86, 0x85, 0x94, 0x94, 0x85, 0x86, 0x95, 0xa6, 0x11, 0xa1, 0xb3, 0x1c, 0x34, 0x72, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0x51, 0x13, 0x0f, 0xfd, 0xc4, 0x02, 0x57, 0x14, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe2, 0xba, 0x70, 0xa0, 0x33, 0xa6, 0x02, 0x3d, 0xc8, 0xdc, 0xdc, 0xc8, 0xc7, 0xdc, 0xdc, 0xeb, 0x6e, 0x58, 0x46, 0x5d, 0x40, 0x8c, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0x5f, 0x17, 0x1c, 0x45, 0x47, 0x5e, 0x5b, 0x63, 0x62, 0x01, 0x3a, 0x01, 0x03, 0x01, 0x04, 0x01, 0x3a, 0x62, 0x63, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0xc3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x63, 0x10, 0x26, 0x02, 0x89, 0x43, 0xfd, 0x12, 0x06, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x2b, 0x01, 0x75, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xeb, 0x00, 0x00, 0x04, 0x26, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x02, 0xcb, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x27, 0x02, 0x9d, 0x01, 0x15, 0x00, 0x00, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x03, 0x04, 0x7b, 0x10, 0x26, 0x02, 0x9d, 0x73, 0x00, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x05, 0x44, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x01, 0x0a, 0x01, 0x3b, 0x12, 0x06, 0x01, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x03, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x68, 0xff, 0x12, 0x06, 0x01, 0xad, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0xff, 0xc1, 0x04, 0x79, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x45, 0x01, 0x75, 0x12, 0x06, 0x01, 0x79, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0xc4, 0x06, 0x66, 0x10, 0x26, 0x02, 0x89, 0x18, 0x00, 0x10, 0x06, 0x02, 0x54, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x02, 0x27, 0x06, 0x66, 0x10, 0x27, 0x02, 0x89, 0xff, 0x3b, 0x00, 0x00, 0x11, 0x06, 0x01, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x09, 0xbc, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x3d, 0x05, 0x1f, 0x00, 0x00, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x08, 0xb8, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x5d, 0x05, 0x40, 0x00, 0x00, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x07, 0xb6, 0x06, 0x14, 0x10, 0x27, 0x00, 0x5d, 0x04, 0x3d, 0x00, 0x00, 0x10, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x98, 0x01, 0x76, 0x12, 0x06, 0x00, 0x2a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x63, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x18, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xff, 0xe3, 0x07, 0x5c, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x17, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0x38, 0x37, 0x8a, 0x85, 0x3b, 0x38, 0xb6, 0x5a, 0x57, 0xfd, 0xf8, 0x5d, 0x5a, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfb, 0xec, 0x9f, 0x50, 0x4e, 0x01, 0x4f, 0x4b, 0xa4, 0x02, 0x9f, 0xfd, 0x5a, 0xdf, 0x80, 0x78, 0x78, 0x76, 0xe9, 0x01, 0x0d, 0xfd, 0x39, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0x82, 0x05, 0xf0, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x10, 0x01, 0x00, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x01, 0x6b, 0xb6, 0xb6, 0x32, 0x83, 0x4e, 0xcb, 0xb3, 0x4a, 0x4c, 0xfc, 0xe9, 0x02, 0x5d, 0x36, 0x36, 0x75, 0xd5, 0xa7, 0x9c, 0xfd, 0xba, 0x07, 0x7f, 0xb9, 0x48, 0x57, 0x35, 0x78, 0x7a, 0xa4, 0xfe, 0x37, 0xfe, 0xce, 0x01, 0xae, 0x01, 0x0c, 0x8f, 0x47, 0x46, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xee, 0x04, 0x9b, 0x01, 0x75, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x64, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x10, 0x07, 0x00, 0x43, 0x00, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x73, 0x12, 0x26, 0x00, 0x87, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x05, 0xb9, 0x01, 0x7d, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0x60, 0x07, 0x73, 0x12, 0x26, 0x00, 0xa7, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x05, 0x54, 0x01, 0x7d, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x06, 0x8e, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x05, 0xb9, 0x01, 0x76, 0x12, 0x06, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x06, 0x63, 0x12, 0x26, 0x00, 0xa8, 0x00, 0x00, 0x10, 0x07, 0x00, 0x76, 0x01, 0x41, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xba, 0x05, 0x4f, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x7e, 0x01, 0x76, 0x12, 0x06, 0x00, 0x9a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xa2, 0x04, 0x26, 0x06, 0x63, 0x12, 0x26, 0x00, 0xba, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x19, 0xfd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x70, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0x68, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x64, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x22, 0xff, 0xfe, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x36, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x43, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x03, 0xf4, 0x00, 0x00, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x70, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0x2e, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x63, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x41, 0xff, 0xfd, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x36, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x2f, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x04, 0x32, 0x00, 0x00, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0xff, 0xaf, 0x00, 0x00, 0x02, 0x35, 0x07, 0x70, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x03, 0x03, 0x01, 0x7a, 0xff, 0xff, 0xff, 0xc9, 0x00, 0x00, 0x02, 0x41, 0x06, 0x63, 0x10, 0x27, 0x02, 0xc0, 0x03, 0x0f, 0xff, 0xfd, 0x12, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x38, 0x07, 0x36, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x02, 0xeb, 0x01, 0x3e, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00, 0x02, 0x1a, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x02, 0xd4, 0x00, 0x00, 0x12, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x70, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0xba, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x64, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x29, 0xff, 0xfe, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x36, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x99, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x04, 0x22, 0x00, 0x00, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb3, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x70, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0x06, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x75, 0x00, 0x00, 0x02, 0xf6, 0x06, 0x63, 0x10, 0x27, 0x02, 0xc0, 0x03, 0xbb, 0xff, 0xfd, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x36, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x0d, 0x01, 0x3e, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x08, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x03, 0xc2, 0x00, 0x00, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x70, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0x93, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x64, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x58, 0xff, 0xfe, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x36, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x6e, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x04, 0x34, 0x00, 0x00, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x14, 0x04, 0x2c, 0x05, 0xf0, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x04, 0x00, 0x00, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x14, 0x03, 0x67, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd7, 0x03, 0xc1, 0x00, 0x00, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0x14, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x03, 0xe4, 0x00, 0x00, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0x14, 0x02, 0xa7, 0x05, 0x9e, 0x10, 0x27, 0x02, 0xd7, 0x03, 0x9a, 0x00, 0x00, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, 0xfe, 0x52, 0x04, 0x02, 0x05, 0xf0, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x04, 0x11, 0x14, 0x0e, 0x03, 0x07, 0x35, 0x36, 0x24, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x03, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x02, 0xec, 0x01, 0x15, 0x64, 0xa6, 0xe7, 0xfa, 0x8a, 0xb4, 0x01, 0x13, 0xa6, 0x53, 0x70, 0x65, 0x56, 0x67, 0x93, 0xdf, 0x36, 0x5c, 0x5e, 0x37, 0x20, 0x31, 0x44, 0x41, 0x22, 0xa5, 0xdb, 0xd7, 0xb9, 0x76, 0xb7, 0x70, 0x15, 0x34, 0x63, 0x02, 0xa2, 0x43, 0xfe, 0xdb, 0x70, 0xce, 0xa0, 0x88, 0x60, 0x22, 0xa0, 0x37, 0x8c, 0x99, 0x9d, 0x4f, 0x65, 0x84, 0x33, 0x48, 0xab, 0x6a, 0x1a, 0x41, 0x63, 0x8b, 0x52, 0x37, 0x56, 0x33, 0x22, 0x0c, 0xb8, 0xbe, 0xa4, 0x56, 0xb6, 0x80, 0x3c, 0x66, 0x71, 0x74, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0x4f, 0x03, 0x5d, 0x04, 0x7b, 0x00, 0x34, 0x00, 0x00, 0x01, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x05, 0x07, 0x35, 0x3e, 0x04, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x37, 0x3e, 0x04, 0x35, 0x34, 0x2e, 0x03, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x02, 0x63, 0x3f, 0x65, 0x38, 0x1d, 0x3b, 0x61, 0x89, 0x8d, 0xa1, 0x87, 0x42, 0x92, 0xdc, 0x8e, 0x5a, 0x24, 0x6b, 0x53, 0x36, 0x38, 0xc3, 0xc9, 0x1f, 0x3a, 0x4f, 0x38, 0x29, 0x1c, 0x2c, 0x3d, 0x3a, 0x20, 0x3e, 0x97, 0x84, 0xef, 0x79, 0x65, 0xa5, 0x69, 0x5d, 0x01, 0xcd, 0x08, 0x44, 0x5a, 0x58, 0x25, 0x4b, 0x8a, 0x6c, 0x61, 0x46, 0x3d, 0x27, 0x0f, 0x82, 0x2e, 0x60, 0x5b, 0x62, 0x5b, 0x33, 0x58, 0x70, 0x19, 0x56, 0x8b, 0x55, 0x0d, 0x20, 0x3c, 0x45, 0x66, 0x39, 0x2c, 0x46, 0x2a, 0x1b, 0x0a, 0x3b, 0x5a, 0x9a, 0x85, 0x47, 0x92, 0x61, 0x6e, 0x99, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x84, 0x01, 0x75, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x02, 0xd1, 0x01, 0x75, 0x13, 0x06, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0x97, 0x05, 0xf0, 0x00, 0x13, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x17, 0x32, 0x12, 0x19, 0x01, 0x23, 0x03, 0xe2, 0x8b, 0x8a, 0xa1, 0xc1, 0xb6, 0xb6, 0x48, 0xb9, 0x8c, 0xcd, 0xd1, 0xb4, 0x03, 0x7f, 0xd7, 0xd5, 0xff, 0xde, 0xfc, 0xb2, 0x05, 0xd5, 0xf1, 0x87, 0x86, 0x01, 0xfe, 0xc1, 0xfe, 0xcc, 0xfa, 0xd9, 0x00, 0x03, 0x00, 0x65, 0xff, 0x70, 0x05, 0xa4, 0x06, 0x14, 0x00, 0x07, 0x00, 0x28, 0x00, 0x34, 0x00, 0x00, 0x25, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x22, 0x07, 0x36, 0x33, 0x32, 0x15, 0x10, 0x21, 0x22, 0x27, 0x06, 0x07, 0x23, 0x36, 0x37, 0x26, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x33, 0x00, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x10, 0x27, 0x26, 0x20, 0x07, 0x04, 0x3d, 0x10, 0x21, 0x90, 0x2f, 0x2f, 0xb5, 0x63, 0x7a, 0xdc, 0xfe, 0xcc, 0x42, 0x30, 0x1e, 0x16, 0xb0, 0x1a, 0x3c, 0x2b, 0x34, 0x4f, 0x50, 0x70, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0x70, 0x50, 0x4f, 0x34, 0xa6, 0xfd, 0x26, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x4c, 0x4c, 0x4b, 0xfe, 0xf9, 0x4c, 0x82, 0x05, 0xaf, 0x2d, 0x01, 0x20, 0xb8, 0xce, 0xfe, 0xbf, 0x0f, 0x48, 0x3a, 0x45, 0x93, 0x3c, 0x24, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0x02, 0x5e, 0xfc, 0xe6, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x74, 0x01, 0x96, 0x74, 0x73, 0x73, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0xa2, 0x05, 0xf0, 0x00, 0x0c, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x26, 0x03, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x02, 0x84, 0xa6, 0x60, 0x60, 0x60, 0x60, 0x01, 0x4b, 0x60, 0x61, 0xbf, 0xdc, 0x75, 0x99, 0x56, 0x35, 0xb8, 0x97, 0x55, 0x57, 0x45, 0x62, 0x75, 0xcd, 0x87, 0x7d, 0x99, 0x88, 0x9a, 0x56, 0x56, 0x8c, 0x8c, 0xfd, 0xf5, 0x8c, 0x8c, 0x56, 0x57, 0x9a, 0x9a, 0x3c, 0x4c, 0x75, 0x68, 0xe7, 0x02, 0xc5, 0x4d, 0x4d, 0xfe, 0xf2, 0x4d, 0x4d, 0x4d, 0x4e, 0x86, 0x87, 0x9a, 0x02, 0x27, 0x03, 0x7c, 0x4f, 0x45, 0x48, 0x2d, 0x41, 0x41, 0x88, 0x9e, 0x2b, 0x4d, 0x08, 0x64, 0x68, 0x61, 0xba, 0x80, 0xb2, 0x20, 0x22, 0x63, 0x63, 0x8f, 0xd9, 0x74, 0x74, 0x74, 0x74, 0xd9, 0x8f, 0x63, 0x63, 0x22, 0x1f, 0x46, 0x59, 0x58, 0x82, 0x53, 0x4a, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x00, 0x05, 0x0f, 0x00, 0x0d, 0x00, 0x34, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x02, 0x32, 0x81, 0x4b, 0x4a, 0x4a, 0x4b, 0x01, 0x03, 0x4b, 0x4b, 0x4b, 0x4a, 0xe5, 0x34, 0x2f, 0x41, 0x75, 0x84, 0x49, 0x49, 0x77, 0x77, 0xfe, 0x43, 0x77, 0x77, 0x93, 0x84, 0x82, 0x35, 0x2f, 0x39, 0x91, 0x27, 0x42, 0x41, 0x75, 0x76, 0x41, 0x43, 0x28, 0x02, 0xc5, 0x4d, 0x4d, 0xfe, 0xf2, 0x4d, 0x4d, 0x4d, 0x4e, 0x86, 0x87, 0x4d, 0x4d, 0x02, 0x4a, 0x40, 0x62, 0x99, 0x40, 0x59, 0x20, 0x22, 0x63, 0x63, 0x8f, 0xd9, 0x74, 0x74, 0x74, 0x74, 0xd9, 0x8f, 0xc6, 0x22, 0x23, 0x56, 0x4b, 0x8e, 0x59, 0x49, 0x41, 0xe8, 0x41, 0x41, 0x41, 0x41, 0x74, 0x77, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0xfe, 0x56, 0x04, 0x9c, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x00, 0x05, 0x10, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x04, 0x9c, 0x8e, 0x41, 0x67, 0xe4, 0xd1, 0x5f, 0x22, 0x22, 0xfc, 0x5d, 0x03, 0x51, 0xfc, 0xc4, 0x04, 0x1f, 0xfc, 0xaf, 0x03, 0x66, 0x14, 0xfe, 0xdf, 0x50, 0x25, 0x9c, 0x30, 0x31, 0x99, 0x14, 0x9a, 0x04, 0x91, 0xaa, 0x9a, 0xfb, 0x6f, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x56, 0x03, 0x79, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x05, 0x10, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x03, 0x78, 0x8e, 0x41, 0x66, 0xe5, 0xd2, 0x5e, 0x22, 0x23, 0xfd, 0x7c, 0x02, 0x6f, 0xfd, 0xa8, 0x03, 0x12, 0xfd, 0x92, 0x02, 0x6e, 0x14, 0xfe, 0xdf, 0x50, 0x25, 0x9c, 0x30, 0x31, 0x99, 0x14, 0xa8, 0x03, 0x25, 0x93, 0xa8, 0xfc, 0xdb, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x43, 0x01, 0x75, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xdc, 0x00, 0x00, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x75, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0x00, 0x92, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x33, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x1e, 0x58, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x31, 0x12, 0x26, 0x00, 0xb8, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x68, 0x01, 0x3b, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x33, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x25, 0x5e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0xe9, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x11, 0x25, 0xff, 0xbc, 0xfe, 0xb6, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x01, 0x00, 0x00, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x33, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x20, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x31, 0x12, 0x26, 0x01, 0xf1, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x68, 0x01, 0x3b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0x66, 0x01, 0x3b, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x55, 0xff, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7c, 0xff, 0x70, 0x03, 0x06, 0x06, 0x0e, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x25, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x22, 0x07, 0x36, 0x33, 0x32, 0x15, 0x10, 0x21, 0x22, 0x27, 0x06, 0x07, 0x23, 0x36, 0x37, 0x26, 0x37, 0x11, 0x33, 0x01, 0xa0, 0x0f, 0x21, 0x90, 0x2e, 0x2f, 0xb6, 0x63, 0x7a, 0xdc, 0xfe, 0xcc, 0x42, 0x2f, 0x1f, 0x15, 0xb1, 0x1a, 0x3d, 0x2d, 0x01, 0xa6, 0x82, 0x05, 0xaf, 0x2d, 0x01, 0x20, 0xb8, 0xce, 0xfe, 0xbf, 0x0f, 0x48, 0x3a, 0x45, 0x93, 0x3c, 0x5a, 0x05, 0x30, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x70, 0x05, 0xad, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x22, 0x07, 0x36, 0x33, 0x32, 0x15, 0x10, 0x21, 0x22, 0x27, 0x06, 0x07, 0x23, 0x36, 0x37, 0x26, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x04, 0x46, 0x10, 0x21, 0x90, 0x2f, 0x2f, 0xb5, 0x63, 0x7a, 0xdc, 0xfe, 0xcc, 0x42, 0x30, 0x1e, 0x16, 0xb0, 0x1a, 0x3c, 0x2c, 0x01, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0x50, 0x51, 0x6a, 0xad, 0x59, 0x5a, 0x82, 0x05, 0xaf, 0x2d, 0x01, 0x20, 0xb8, 0xce, 0xfe, 0xbf, 0x0f, 0x48, 0x3a, 0x45, 0x93, 0x3c, 0x5a, 0x01, 0xc0, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x32, 0x32, 0x77, 0x78, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x31, 0xff, 0x70, 0x03, 0x0b, 0x05, 0x9e, 0x00, 0x07, 0x00, 0x21, 0x00, 0x00, 0x25, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x22, 0x07, 0x36, 0x33, 0x32, 0x15, 0x10, 0x21, 0x22, 0x27, 0x06, 0x07, 0x23, 0x36, 0x37, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0xa4, 0x10, 0x21, 0x90, 0x2f, 0x2f, 0xb5, 0x62, 0x7b, 0xdb, 0xfe, 0xcd, 0x42, 0x31, 0x1d, 0x16, 0xb0, 0x1a, 0x3c, 0x2c, 0x79, 0x79, 0xa7, 0x01, 0x55, 0xfe, 0xab, 0x82, 0x05, 0xaf, 0x2d, 0x01, 0x20, 0xb8, 0xce, 0xfe, 0xbf, 0x0f, 0x48, 0x3a, 0x45, 0x93, 0x3c, 0x5a, 0x02, 0xf3, 0x8f, 0x01, 0x3e, 0xfe, 0xc2, 0x8f, 0x00, 0x00, 0x01, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0xae, 0xa5, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0x04, 0x60, 0xfb, 0x8c, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xcb, 0x06, 0x14, 0x00, 0x09, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x10, 0x17, 0x16, 0x20, 0x36, 0x10, 0x26, 0x20, 0x07, 0x13, 0x32, 0x17, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x27, 0x15, 0x23, 0x35, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x00, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0x01, 0x11, 0x4a, 0x4c, 0x01, 0x07, 0x97, 0x97, 0xfe, 0xf9, 0x4c, 0xa7, 0xdc, 0x67, 0xa7, 0x66, 0xdc, 0xb7, 0xe6, 0xe6, 0xb7, 0xdc, 0x66, 0xa7, 0x67, 0xdc, 0xb7, 0x73, 0x72, 0x72, 0x73, 0x04, 0xd4, 0x4b, 0x4b, 0xfe, 0xf9, 0x4c, 0x4a, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x02, 0xfa, 0xfe, 0x6a, 0x74, 0x73, 0xe7, 0x01, 0x96, 0xe7, 0x73, 0x01, 0x0d, 0xc5, 0x02, 0x5e, 0xfd, 0xa2, 0xc5, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0xc5, 0xa8, 0xa8, 0xc5, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0xfc, 0xe9, 0x01, 0x96, 0x74, 0x73, 0x73, 0x74, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xfe, 0x56, 0x06, 0xcb, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x25, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0x03, 0x22, 0x27, 0x11, 0x23, 0x11, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x33, 0x15, 0x36, 0x33, 0x32, 0x12, 0x10, 0x02, 0x00, 0x10, 0x17, 0x16, 0x20, 0x36, 0x10, 0x26, 0x20, 0x07, 0x06, 0x1f, 0x4b, 0x4b, 0xfe, 0xf9, 0x4c, 0x4a, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0xa6, 0xdc, 0x66, 0xa7, 0x67, 0xdc, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0xdc, 0x67, 0xa7, 0x66, 0xdc, 0xb7, 0xe6, 0xe6, 0xfb, 0x2c, 0x4a, 0x4c, 0x01, 0x07, 0x97, 0x97, 0xfe, 0xf9, 0x4c, 0x01, 0x64, 0x01, 0x96, 0x74, 0x73, 0x73, 0x74, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0xfe, 0xf3, 0xc5, 0xfd, 0xae, 0x02, 0x52, 0xc5, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0xc5, 0xaa, 0xaa, 0xc5, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x03, 0x17, 0xfe, 0x6a, 0x74, 0x73, 0xe7, 0x01, 0x96, 0xe7, 0x73, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, 0xff, 0xba, 0x04, 0xf0, 0x06, 0x17, 0x00, 0x12, 0x00, 0x16, 0x00, 0x19, 0x00, 0x00, 0x01, 0x33, 0x13, 0x01, 0x17, 0x09, 0x01, 0x23, 0x03, 0x21, 0x0f, 0x01, 0x23, 0x07, 0x27, 0x23, 0x37, 0x27, 0x37, 0x01, 0x03, 0x33, 0x01, 0x03, 0x21, 0x03, 0x02, 0x0f, 0xcf, 0x78, 0x01, 0x3e, 0x5c, 0xfe, 0x98, 0x01, 0x56, 0xbd, 0x7b, 0xfe, 0x0e, 0xb9, 0x2d, 0x3f, 0x35, 0x4a, 0x02, 0x01, 0x12, 0x2b, 0x02, 0x4e, 0xf7, 0x14, 0x01, 0x4b, 0xab, 0x01, 0x3b, 0x60, 0x05, 0xd5, 0xfe, 0xa1, 0x01, 0xa1, 0x59, 0xfe, 0x27, 0xfc, 0x1b, 0x01, 0x7f, 0xf1, 0x8e, 0x46, 0x46, 0x01, 0x11, 0x38, 0x04, 0xc4, 0xfd, 0x19, 0x01, 0xb1, 0xfe, 0x4f, 0x01, 0x1f, 0x00, 0x02, 0x00, 0x0a, 0xff, 0xba, 0x04, 0xfd, 0x06, 0x17, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x00, 0x17, 0x27, 0x13, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x32, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07, 0x15, 0x26, 0x27, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x20, 0x27, 0x13, 0x01, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x11, 0x14, 0x67, 0x5c, 0xc6, 0x69, 0xaf, 0xaf, 0x01, 0x32, 0x78, 0x6a, 0x37, 0x35, 0x5a, 0x5c, 0x59, 0x29, 0x2c, 0xfd, 0x42, 0x08, 0x0a, 0x7a, 0xe6, 0x75, 0x69, 0x67, 0x5c, 0x5f, 0x6b, 0x6b, 0x76, 0xfe, 0xd5, 0xaf, 0x34, 0x02, 0x8f, 0x01, 0x69, 0x75, 0xe6, 0x7a, 0x7b, 0x46, 0x58, 0x01, 0x05, 0xbb, 0x01, 0x17, 0x01, 0x68, 0xcf, 0xd0, 0x24, 0x12, 0x1b, 0x78, 0x59, 0x76, 0xbb, 0x2b, 0x21, 0xfc, 0x66, 0x0d, 0x0c, 0x9d, 0x2f, 0x2f, 0x5f, 0xd3, 0x48, 0x24, 0x24, 0xc7, 0x01, 0x15, 0x03, 0x5c, 0x2f, 0x9c, 0x9d, 0xfe, 0xd8, 0xad, 0x00, 0x00, 0x02, 0x00, 0x08, 0xff, 0xa2, 0x03, 0xee, 0x04, 0xbc, 0x00, 0x22, 0x00, 0x2b, 0x00, 0x00, 0x17, 0x27, 0x37, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07, 0x15, 0x26, 0x27, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x13, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x5e, 0x56, 0xaa, 0x4c, 0x88, 0x87, 0xeb, 0x4d, 0x49, 0x29, 0x29, 0x50, 0x55, 0x6a, 0x16, 0x16, 0xfe, 0x0b, 0x06, 0x05, 0x59, 0xa2, 0x48, 0x46, 0x47, 0x46, 0x45, 0x4a, 0x4b, 0x53, 0xd8, 0x85, 0x32, 0x01, 0xbc, 0x3f, 0x40, 0xa2, 0x59, 0x59, 0x5e, 0x4e, 0xe6, 0x8d, 0xcc, 0x01, 0x12, 0x9d, 0x9d, 0x11, 0x0a, 0x10, 0x6c, 0x4f, 0x8f, 0x55, 0x0e, 0x0b, 0xfd, 0x5e, 0x08, 0x08, 0x71, 0x15, 0x16, 0x2b, 0xaa, 0x24, 0x12, 0x12, 0x90, 0x01, 0x05, 0x02, 0x56, 0x11, 0x71, 0x72, 0xcd, 0x67, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0xac, 0xac, 0x02, 0x8e, 0xfc, 0xbc, 0xac, 0xac, 0x05, 0xd5, 0xfd, 0x77, 0x90, 0xfd, 0xee, 0xaa, 0x02, 0xbc, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb9, 0xff, 0xba, 0x04, 0xad, 0x06, 0x17, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x15, 0x23, 0x01, 0x11, 0x23, 0x11, 0x01, 0x27, 0x01, 0x11, 0x21, 0x35, 0x21, 0x37, 0x17, 0x09, 0x01, 0x21, 0x04, 0x6b, 0x2f, 0xfe, 0x52, 0xb6, 0xfe, 0x3e, 0x5c, 0x02, 0x1e, 0xfe, 0x23, 0x04, 0x23, 0x32, 0x5c, 0xfd, 0xe2, 0x01, 0x0e, 0xfe, 0xf2, 0x05, 0x69, 0x3e, 0xfd, 0xcc, 0xfd, 0x09, 0x02, 0x07, 0xfd, 0xb3, 0x58, 0x02, 0xc7, 0x02, 0x52, 0xaa, 0x42, 0x59, 0xfe, 0x0b, 0x01, 0x62, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xfe, 0x10, 0x03, 0xb1, 0x04, 0x7b, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x1f, 0x01, 0x16, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x02, 0xbc, 0x2d, 0x2e, 0x9a, 0x39, 0x9a, 0x44, 0x45, 0xca, 0xb9, 0x5c, 0xa2, 0x44, 0x46, 0x97, 0x51, 0x7b, 0x3e, 0x3e, 0x2c, 0x2d, 0x85, 0x38, 0xb3, 0x48, 0x4a, 0x6e, 0x4f, 0x77, 0x90, 0x84, 0x26, 0x44, 0x23, 0x4c, 0x66, 0x40, 0x50, 0xd5, 0x1c, 0x20, 0x0e, 0x10, 0x57, 0x61, 0x5c, 0x59, 0x59, 0x57, 0x75, 0x3f, 0x3f, 0x01, 0x27, 0x4b, 0x28, 0x28, 0x25, 0x0f, 0x24, 0x4a, 0x4b, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x2a, 0x2a, 0x54, 0x40, 0x25, 0x24, 0x21, 0x0e, 0x2c, 0x4b, 0x4c, 0x89, 0x9c, 0x5b, 0x40, 0x13, 0x9f, 0x7e, 0x24, 0x9a, 0x3d, 0x26, 0x5b, 0xf3, 0x1e, 0x10, 0x03, 0x02, 0x12, 0x23, 0xbe, 0x35, 0x1a, 0x1b, 0x2d, 0x2c, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x10, 0x03, 0xc8, 0x04, 0x60, 0x00, 0x18, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x16, 0x17, 0x13, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x2b, 0x01, 0x3d, 0x01, 0x01, 0x21, 0x66, 0x03, 0x12, 0xfd, 0x93, 0x53, 0x2c, 0xee, 0x84, 0x26, 0x44, 0x62, 0x85, 0x4b, 0x67, 0x40, 0x50, 0xd5, 0x37, 0x51, 0x55, 0x02, 0x6f, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfc, 0xdd, 0x10, 0x31, 0xfe, 0xf8, 0x7e, 0x24, 0x9a, 0x3d, 0x26, 0x5b, 0xf3, 0x3f, 0x9c, 0x0c, 0x03, 0x25, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x22, 0x06, 0x07, 0x35, 0x36, 0x3b, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x02, 0x4f, 0x23, 0xb6, 0xd9, 0x7f, 0x8b, 0x8b, 0x7f, 0xe4, 0x3e, 0x9e, 0x47, 0x89, 0x9a, 0xe4, 0xdc, 0xed, 0xee, 0x02, 0x5a, 0xfd, 0xa6, 0x03, 0x00, 0x91, 0x87, 0x88, 0x8f, 0x2a, 0x2c, 0xb6, 0x46, 0xdc, 0xe1, 0xd7, 0xe7, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x03, 0x34, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x00, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x11, 0x23, 0x01, 0x11, 0x5a, 0x7f, 0x8a, 0x44, 0x4c, 0x79, 0x42, 0x4d, 0x4e, 0x46, 0x89, 0x9a, 0xe2, 0x70, 0x77, 0xbf, 0xaf, 0xb5, 0x01, 0xa6, 0x91, 0x87, 0x8d, 0x41, 0x48, 0x15, 0x15, 0x2b, 0xb6, 0x46, 0x6e, 0x74, 0xdb, 0xd5, 0xe5, 0xfe, 0xfc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x28, 0x00, 0x00, 0x01, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x01, 0x6b, 0x01, 0x38, 0xfe, 0xc8, 0x01, 0x23, 0x93, 0x8d, 0x8d, 0x93, 0xfe, 0xdd, 0x01, 0x0d, 0x85, 0x83, 0x83, 0x85, 0xfe, 0x3d, 0x01, 0xd0, 0xd0, 0xe1, 0x73, 0x70, 0x87, 0x94, 0xf5, 0xe2, 0xfe, 0x1e, 0xac, 0xac, 0x02, 0xc9, 0xc9, 0x90, 0xca, 0x87, 0x8b, 0x8c, 0x85, 0x02, 0x66, 0xfe, 0x3e, 0x6f, 0x72, 0x71, 0x70, 0xa6, 0xc0, 0xb1, 0x89, 0xa2, 0x14, 0x20, 0xcb, 0x98, 0xc8, 0xda, 0x01, 0x70, 0x90, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xff, 0xe3, 0x05, 0x3a, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, 0x35, 0x23, 0x35, 0x33, 0x05, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0xa0, 0xb7, 0x02, 0x97, 0xb7, 0x94, 0x94, 0xfe, 0xfc, 0xfe, 0xff, 0xfe, 0xfc, 0x95, 0x95, 0x03, 0x4e, 0xfd, 0x69, 0x9d, 0xaf, 0xaf, 0x9c, 0x05, 0xd5, 0xfd, 0x96, 0x02, 0x6a, 0xfd, 0x96, 0xa4, 0x96, 0xfe, 0xdc, 0xfe, 0xd6, 0x01, 0x2a, 0x01, 0x24, 0x96, 0xa4, 0xa4, 0x7d, 0xf0, 0xd3, 0xd3, 0xf0, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x06, 0x03, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0xff, 0x42, 0x04, 0x17, 0x06, 0x93, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x33, 0x07, 0x33, 0x15, 0x23, 0x03, 0x33, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x07, 0x23, 0x37, 0x23, 0x11, 0x21, 0x01, 0x13, 0x23, 0x11, 0x1b, 0x01, 0x21, 0x11, 0x03, 0x59, 0x99, 0x3b, 0x4f, 0x83, 0x88, 0xf0, 0xfe, 0xdc, 0xa6, 0x01, 0xf6, 0xfd, 0xd5, 0x3a, 0x99, 0x3a, 0x9e, 0x02, 0x69, 0xfe, 0x6a, 0xa6, 0xc3, 0xf7, 0x88, 0xfe, 0x81, 0x06, 0x93, 0xbe, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0xbe, 0xbe, 0x05, 0xd5, 0xfa, 0xd5, 0x02, 0x1d, 0xfd, 0xe3, 0x02, 0xc7, 0x01, 0xba, 0xfe, 0x46, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xff, 0x42, 0x04, 0x0c, 0x05, 0x1e, 0x00, 0x05, 0x00, 0x26, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x03, 0x05, 0x15, 0x21, 0x03, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x23, 0x13, 0x26, 0x27, 0x26, 0x11, 0x10, 0x00, 0x33, 0x32, 0x17, 0x37, 0x33, 0x07, 0x16, 0x17, 0x16, 0x05, 0x13, 0x26, 0x23, 0x22, 0x06, 0x07, 0x1b, 0x01, 0x23, 0x16, 0x03, 0x66, 0x02, 0x4a, 0x0d, 0x0e, 0x64, 0x01, 0x71, 0xfe, 0x5a, 0x86, 0x43, 0x57, 0x60, 0xb3, 0x58, 0x59, 0xbb, 0x60, 0x6f, 0x5a, 0x47, 0x99, 0x62, 0x1e, 0x19, 0x8d, 0x01, 0x0b, 0xe3, 0x32, 0x2d, 0x3f, 0x99, 0x53, 0x34, 0x2a, 0x76, 0xfd, 0xf6, 0x79, 0x12, 0x13, 0x8b, 0xa7, 0x0c, 0x51, 0x64, 0xbb, 0x0a, 0x02, 0x94, 0x97, 0x5a, 0x10, 0x0d, 0xfe, 0xf2, 0x36, 0x5a, 0xfe, 0x97, 0x1c, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x21, 0xc2, 0x01, 0x09, 0x17, 0x1d, 0x9c, 0x01, 0x0a, 0x01, 0x13, 0x01, 0x43, 0x09, 0xac, 0xe0, 0x22, 0x32, 0x92, 0xc5, 0x01, 0x4a, 0x02, 0xae, 0x9e, 0xfe, 0x63, 0x01, 0x0e, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xfe, 0x66, 0x02, 0x17, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x23, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x02, 0x17, 0xac, 0xb9, 0xcc, 0x45, 0x38, 0x79, 0x63, 0xac, 0xac, 0xb6, 0xac, 0x02, 0x77, 0xfd, 0xf1, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x02, 0x0f, 0xa6, 0x02, 0xb8, 0xfd, 0x48, 0x00, 0x02, 0xff, 0xde, 0xfe, 0x56, 0x01, 0xe6, 0x06, 0x14, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0xae, 0xa5, 0x93, 0x93, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0xa3, 0xa3, 0xa5, 0xa5, 0x04, 0x60, 0xfe, 0x08, 0xa4, 0xfe, 0x28, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x01, 0xd8, 0xa4, 0x03, 0xac, 0xe9, 0x00, 0x02, 0x00, 0x67, 0xfe, 0x66, 0x06, 0x05, 0x05, 0xf1, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x35, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x11, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x01, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x04, 0x3b, 0xb0, 0x63, 0x79, 0x3e, 0x45, 0xcd, 0xb8, 0x46, 0xd4, 0x95, 0xf2, 0xfe, 0xce, 0x01, 0x32, 0xf2, 0x95, 0xd4, 0xfd, 0x2f, 0xd3, 0xb8, 0xb8, 0xd4, 0xd4, 0xb8, 0xb8, 0xd3, 0x04, 0xed, 0xe8, 0xfa, 0x93, 0xc2, 0x96, 0xaa, 0xf4, 0x01, 0x0e, 0x7f, 0x84, 0x80, 0x01, 0xab, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0xab, 0x80, 0xfd, 0x78, 0xfe, 0xe3, 0xfe, 0xbb, 0x01, 0x45, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x45, 0xfe, 0xbb, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0xba, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x04, 0xba, 0x3f, 0xa3, 0x93, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0x44, 0x5f, 0x2c, 0xfc, 0x57, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0xfe, 0x56, 0xc0, 0xd6, 0xbc, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0xaa, 0xfb, 0x8c, 0x99, 0x61, 0x03, 0x3d, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x20, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0xac, 0xac, 0x01, 0x9a, 0xe7, 0xe2, 0x75, 0xfd, 0xc8, 0xe4, 0x84, 0x86, 0x86, 0x84, 0x02, 0xbc, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x02, 0x77, 0xa6, 0x02, 0xb8, 0xd6, 0xd8, 0x8d, 0xba, 0x02, 0x4f, 0xfd, 0xee, 0x87, 0x83, 0x83, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x00, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x01, 0xe8, 0x9a, 0xa7, 0x9a, 0x9a, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x01, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0x02, 0x68, 0xa4, 0xfe, 0x3c, 0x01, 0xc4, 0xa4, 0x01, 0xf8, 0xae, 0x66, 0x63, 0x05, 0x05, 0xbd, 0x12, 0x11, 0xce, 0xa1, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf7, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x14, 0x00, 0x00, 0x03, 0x33, 0x17, 0x21, 0x37, 0x33, 0x07, 0x33, 0x15, 0x23, 0x03, 0x11, 0x23, 0x11, 0x03, 0x23, 0x35, 0x33, 0x05, 0x21, 0x17, 0x04, 0xc4, 0x88, 0x01, 0xd7, 0x87, 0xc4, 0x88, 0x8c, 0xf0, 0xf0, 0xb6, 0xf0, 0xf1, 0x8d, 0x02, 0x38, 0xfe, 0xf0, 0x88, 0x05, 0xd5, 0xe0, 0xe0, 0xe0, 0xa4, 0xfe, 0x76, 0xfd, 0x39, 0x02, 0xc7, 0x01, 0x8a, 0xa4, 0xa4, 0xe2, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0xfe, 0x56, 0x04, 0x3d, 0x04, 0x60, 0x00, 0x18, 0x00, 0x1b, 0x00, 0x00, 0x05, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x03, 0x21, 0x35, 0x33, 0x03, 0x33, 0x13, 0x21, 0x13, 0x33, 0x03, 0x33, 0x15, 0x21, 0x2b, 0x01, 0x13, 0x02, 0x51, 0x46, 0x85, 0x70, 0x84, 0x61, 0x44, 0x4c, 0x2e, 0x1e, 0xb9, 0xfe, 0xf4, 0xd8, 0xab, 0xaf, 0xa6, 0x01, 0x2b, 0xa5, 0xb0, 0xa7, 0xd7, 0xfe, 0xf5, 0xad, 0xc5, 0x62, 0x68, 0xc8, 0x7a, 0x9a, 0x48, 0x86, 0x54, 0x01, 0xf2, 0x8f, 0x01, 0xcd, 0xfe, 0x33, 0x01, 0xcd, 0xfe, 0x33, 0x8f, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xf0, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x25, 0x00, 0x00, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x07, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x01, 0xe7, 0xc9, 0x9a, 0x74, 0x64, 0x89, 0xa7, 0xa5, 0xa5, 0x39, 0xa9, 0x7a, 0x9b, 0xb7, 0xe4, 0xe2, 0xe8, 0x96, 0x88, 0x57, 0xa4, 0x4b, 0x5b, 0xab, 0x51, 0xda, 0xd8, 0x02, 0x2b, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x4c, 0x02, 0x7f, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x04, 0x7b, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x35, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x45, 0xa6, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0xfe, 0x00, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x03, 0xb6, 0xaa, 0xfb, 0xa0, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0xfe, 0x15, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2d, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x33, 0x03, 0x81, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0xfd, 0xcc, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0xa6, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x02, 0x52, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xaa, 0x04, 0x60, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x03, 0x81, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xfd, 0xcd, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xa1, 0x95, 0xe5, 0xd2, 0x51, 0x52, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x02, 0x52, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x04, 0x7e, 0xc3, 0xd3, 0x9c, 0x7d, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x13, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x72, 0x46, 0x94, 0x54, 0xe4, 0x01, 0x0c, 0xfe, 0xf1, 0xec, 0x4d, 0x91, 0x45, 0x46, 0x8e, 0x48, 0xa1, 0xb2, 0xb2, 0xa1, 0x48, 0x8e, 0x46, 0x04, 0x33, 0x24, 0x24, 0xfe, 0xc2, 0xfe, 0xf2, 0xfe, 0xee, 0xfe, 0xc6, 0x23, 0x23, 0xac, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0xe3, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0x73, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x27, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x06, 0x15, 0x23, 0x34, 0x37, 0x26, 0x27, 0x26, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x01, 0x16, 0x33, 0x32, 0x35, 0x34, 0x23, 0x22, 0x03, 0x83, 0x46, 0x8d, 0x48, 0xa2, 0xb2, 0x59, 0x06, 0x06, 0x23, 0x38, 0x42, 0x5f, 0x92, 0x43, 0x39, 0x55, 0x4b, 0x8c, 0x48, 0x41, 0x06, 0x89, 0x0a, 0x32, 0x2b, 0x86, 0x01, 0x0f, 0xeb, 0x4d, 0x92, 0xfe, 0xaf, 0x34, 0x46, 0x83, 0x77, 0x5b, 0x04, 0x35, 0xac, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0x72, 0x08, 0x06, 0x51, 0x2c, 0x33, 0x48, 0x3d, 0x59, 0x7d, 0x2f, 0x29, 0x11, 0x39, 0x44, 0x68, 0x51, 0x23, 0x33, 0xa1, 0x01, 0x0c, 0x01, 0x12, 0x01, 0x3a, 0x23, 0xfc, 0x3a, 0x13, 0x39, 0x4b, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0xba, 0x06, 0x14, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x04, 0xba, 0x3f, 0xa3, 0x93, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0x44, 0x5f, 0x2c, 0xfc, 0x57, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0xfe, 0x56, 0xc0, 0xd6, 0xbc, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0x02, 0x5e, 0xf9, 0xd8, 0x99, 0x61, 0x03, 0x3d, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x05, 0x27, 0x06, 0x14, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x45, 0x93, 0xa3, 0xab, 0x98, 0x5f, 0x44, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0xfe, 0x00, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x03, 0xb6, 0xc8, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xfb, 0x82, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0xfe, 0x15, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x22, 0x00, 0x00, 0x13, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x37, 0x05, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x66, 0x76, 0x76, 0xcc, 0xe3, 0x85, 0x86, 0x8d, 0x8d, 0xf1, 0x60, 0xbb, 0x5a, 0x59, 0x5a, 0x59, 0x5f, 0xa5, 0x5c, 0x5c, 0x0b, 0xfd, 0x07, 0xa5, 0x02, 0x4f, 0x0d, 0x54, 0x52, 0x8b, 0x7a, 0x4a, 0x4b, 0x02, 0x5e, 0xfa, 0x92, 0x91, 0xa1, 0xa2, 0xfe, 0xed, 0xfe, 0xf6, 0x9c, 0x9c, 0x2c, 0x2a, 0xae, 0x34, 0x1a, 0x1a, 0x63, 0x64, 0xbe, 0x90, 0x01, 0x9e, 0x57, 0x57, 0x5a, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x02, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x66, 0x02, 0xf9, 0x0b, 0xb8, 0xa5, 0x5f, 0xb3, 0x59, 0x5a, 0xbb, 0x60, 0xf1, 0x01, 0x1a, 0xfe, 0xf5, 0xe3, 0xcc, 0xec, 0xa5, 0x02, 0x95, 0x7a, 0x8b, 0xa6, 0x0d, 0x02, 0x00, 0x5a, 0xbe, 0xc7, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0xfe, 0xc8, 0xfe, 0xf6, 0xfe, 0xed, 0xfe, 0xbd, 0x01, 0x23, 0xc4, 0x97, 0xb4, 0xae, 0x9e, 0x00, 0x02, 0x00, 0x6f, 0xff, 0xe3, 0x05, 0xde, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x34, 0x00, 0x00, 0x25, 0x36, 0x27, 0x36, 0x27, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x01, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x26, 0x27, 0x26, 0x07, 0x06, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x02, 0xf9, 0x5c, 0x02, 0x01, 0x09, 0xfd, 0xd5, 0x1b, 0x1d, 0x4a, 0x7a, 0x97, 0x01, 0x3d, 0x1c, 0x86, 0x85, 0xe3, 0xcd, 0x75, 0x54, 0x18, 0x02, 0xb1, 0x11, 0x18, 0x44, 0xbd, 0x61, 0x57, 0x5a, 0x59, 0x5a, 0xbb, 0x60, 0xf1, 0x8d, 0x20, 0x18, 0xb7, 0xa6, 0x22, 0x22, 0x5e, 0x27, 0x39, 0x9d, 0x4f, 0x4a, 0xd6, 0x8a, 0xcf, 0x3e, 0x38, 0xfe, 0x9c, 0x45, 0x23, 0x5a, 0x02, 0x90, 0x60, 0x76, 0xfe, 0xed, 0xa2, 0xa1, 0x91, 0x67, 0x9c, 0x01, 0xbb, 0x27, 0x23, 0x64, 0x01, 0x01, 0x19, 0x1a, 0x34, 0xae, 0x2a, 0x2c, 0x9c, 0x23, 0x29, 0x75, 0x94, 0x99, 0x31, 0x30, 0x9c, 0x60, 0x5a, 0xc8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x12, 0x06, 0x03, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x12, 0x06, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xff, 0xe3, 0x05, 0x8d, 0x04, 0x7c, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x05, 0x06, 0x02, 0x7b, 0x70, 0x7c, 0xe8, 0xd6, 0x48, 0x4d, 0x4b, 0x51, 0x40, 0x4c, 0x4d, 0x53, 0x88, 0x4d, 0x4b, 0x46, 0x41, 0x7b, 0x85, 0x8b, 0x69, 0x3c, 0x3d, 0x3f, 0x3e, 0x6b, 0x40, 0x49, 0x48, 0x57, 0x58, 0x99, 0x45, 0xb0, 0x66, 0x55, 0x0e, 0xd4, 0xa6, 0x22, 0x22, 0x5f, 0x26, 0x39, 0x9d, 0x4f, 0x4a, 0xfe, 0xfd, 0x3a, 0x02, 0x5c, 0x18, 0x92, 0x6c, 0xad, 0xb6, 0x0e, 0x0e, 0x1c, 0xab, 0x25, 0x13, 0x12, 0x38, 0x38, 0x5a, 0x58, 0x38, 0x33, 0x98, 0x2c, 0x2d, 0x46, 0x40, 0x2e, 0x2e, 0x0d, 0x0d, 0x1d, 0xa7, 0x18, 0x18, 0x4e, 0x42, 0x6a, 0x86, 0x94, 0x99, 0x31, 0x30, 0x9c, 0x60, 0x5a, 0xc8, 0xa6, 0x46, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x4b, 0x04, 0x7c, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x37, 0x36, 0x02, 0xa6, 0xe2, 0x57, 0x59, 0x59, 0x5e, 0xbd, 0x88, 0x4c, 0x4c, 0x46, 0x41, 0x7b, 0x86, 0x8c, 0x68, 0x3d, 0x3d, 0x3f, 0x3e, 0x5e, 0xb1, 0x65, 0x67, 0x36, 0x36, 0x65, 0x70, 0x7c, 0xe8, 0xd7, 0xfe, 0xe6, 0xfe, 0xf4, 0x87, 0x88, 0x03, 0xdc, 0x6e, 0x72, 0xcd, 0xd0, 0x6f, 0x74, 0x38, 0x38, 0x5a, 0x58, 0x38, 0x33, 0x98, 0x2c, 0x2d, 0x46, 0x40, 0x2e, 0x2e, 0xa0, 0x4e, 0x4f, 0x8d, 0x5d, 0x40, 0x41, 0x18, 0x18, 0x92, 0x6c, 0xad, 0xb6, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x9d, 0x9e, 0x00, 0x01, 0xff, 0xde, 0xfe, 0x56, 0x01, 0xe6, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0xae, 0xa5, 0x93, 0x93, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0xa3, 0xa3, 0x04, 0x60, 0xfe, 0x08, 0xa4, 0xfe, 0x28, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x01, 0xd8, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x05, 0x26, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x30, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x17, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x03, 0x45, 0x95, 0x86, 0x85, 0x94, 0x94, 0x85, 0x86, 0x95, 0xa6, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe2, 0xba, 0x70, 0xa0, 0x33, 0x93, 0xa3, 0xab, 0x98, 0x5f, 0x44, 0x02, 0x3d, 0xc8, 0xdc, 0xdc, 0xc8, 0xc7, 0xdc, 0xdc, 0xeb, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0x01, 0x3a, 0x01, 0x03, 0x01, 0x04, 0x01, 0x3a, 0x62, 0x63, 0xc8, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x21, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x17, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x34, 0x12, 0x33, 0x21, 0x03, 0x45, 0xfe, 0xcc, 0x79, 0x87, 0x94, 0x85, 0x86, 0x95, 0xa6, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe2, 0xba, 0x01, 0xe9, 0x02, 0x3d, 0x01, 0x88, 0xcd, 0xbb, 0xc7, 0xdc, 0xdc, 0xeb, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0x01, 0x3a, 0x01, 0x03, 0xf9, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xe1, 0x04, 0x7b, 0x00, 0x1d, 0x00, 0x00, 0x25, 0x11, 0x23, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x4b, 0x8b, 0x01, 0x21, 0x5b, 0xc2, 0x6e, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x5e, 0xb1, 0x54, 0x55, 0xad, 0x59, 0xa2, 0xb2, 0xb2, 0xa2, 0x47, 0x6f, 0x9e, 0x01, 0x11, 0x8c, 0xfd, 0xf0, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x37, 0x37, 0xaa, 0x3e, 0x3e, 0xe3, 0xcd, 0xcd, 0xe3, 0x0f, 0x00, 0x02, 0x00, 0x56, 0xfe, 0x52, 0x03, 0xf4, 0x04, 0x60, 0x00, 0x13, 0x00, 0x23, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x33, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0x25, 0x01, 0x22, 0xad, 0xfe, 0x88, 0x5f, 0x23, 0x35, 0x87, 0x87, 0x87, 0x87, 0x35, 0x23, 0x5f, 0xfe, 0x88, 0xad, 0x01, 0x22, 0x3c, 0x1c, 0x19, 0x19, 0x24, 0x34, 0x34, 0x24, 0x19, 0x19, 0x1c, 0x01, 0xe8, 0x02, 0x78, 0xfc, 0xdc, 0xb1, 0x53, 0x80, 0x63, 0x81, 0x82, 0x82, 0x81, 0x63, 0x80, 0x53, 0xb1, 0x03, 0x24, 0xfa, 0x8e, 0x1b, 0x18, 0x2d, 0x45, 0x49, 0x64, 0x63, 0x63, 0x64, 0x49, 0x45, 0x2d, 0x18, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xe3, 0x03, 0xf4, 0x04, 0x60, 0x00, 0x13, 0x00, 0x23, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x33, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0x25, 0x01, 0x0b, 0xc4, 0xfe, 0x99, 0x41, 0x27, 0x3e, 0x87, 0x87, 0x87, 0x87, 0x3e, 0x27, 0x41, 0xfe, 0x99, 0xc4, 0x01, 0x0b, 0x3c, 0x1c, 0x19, 0x23, 0x1c, 0x32, 0x32, 0x1c, 0x23, 0x19, 0x1c, 0x02, 0xd1, 0x01, 0x8f, 0xfd, 0xea, 0x62, 0x4c, 0x78, 0x3e, 0x82, 0x81, 0x81, 0x82, 0x3e, 0x78, 0x4c, 0x62, 0x02, 0x16, 0xfc, 0x1f, 0x1b, 0x18, 0x2d, 0x21, 0x40, 0x32, 0x46, 0x46, 0x32, 0x40, 0x21, 0x2d, 0x18, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9c, 0xfe, 0x56, 0x03, 0xe9, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x9d, 0xa5, 0x70, 0x6f, 0x87, 0x9b, 0xa6, 0xa6, 0x3c, 0x9f, 0x6a, 0xad, 0xb4, 0x01, 0xba, 0x02, 0xa6, 0xfd, 0x61, 0x9f, 0x9f, 0xbe, 0xa4, 0x02, 0x7b, 0xf9, 0xf6, 0x02, 0x56, 0x66, 0x63, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0x93, 0xa3, 0xe5, 0xd0, 0x5f, 0x45, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x7e, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xcc, 0x65, 0x64, 0xef, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x14, 0x00, 0x21, 0x00, 0x00, 0x01, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x10, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x36, 0x33, 0x32, 0x16, 0x03, 0xf4, 0x93, 0xa3, 0xe5, 0xd2, 0x5f, 0x44, 0xdf, 0x86, 0x9b, 0xa7, 0x93, 0xa3, 0xe5, 0xd0, 0x5f, 0x45, 0x76, 0xd0, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x48, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x02, 0xb2, 0x01, 0x3d, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x7e, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xcc, 0xc9, 0xef, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x01, 0xe8, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0xaf, 0xa5, 0x94, 0x94, 0xa5, 0xa2, 0xa2, 0xa5, 0xa5, 0x04, 0x60, 0xfe, 0x08, 0xa4, 0xfe, 0x3c, 0x01, 0xc4, 0xa4, 0x03, 0xac, 0xe9, 0x00, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x02, 0x30, 0x04, 0x60, 0x10, 0x06, 0x03, 0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x02, 0x44, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x68, 0x01, 0xdc, 0x98, 0x98, 0xfe, 0x24, 0x9f, 0x03, 0xbc, 0xa4, 0xa4, 0xfc, 0xe8, 0xa4, 0xa4, 0x03, 0x18, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x02, 0x96, 0x06, 0x14, 0x00, 0x23, 0x00, 0x00, 0x01, 0x33, 0x11, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x01, 0x1d, 0xa6, 0x01, 0x02, 0x0f, 0x0c, 0x22, 0x10, 0x10, 0x02, 0x71, 0x02, 0x2e, 0x2e, 0x52, 0x12, 0x11, 0xa6, 0x05, 0x05, 0x0f, 0x0c, 0x22, 0x10, 0x10, 0x02, 0x70, 0x01, 0x2e, 0x2e, 0x52, 0x16, 0x14, 0x06, 0x14, 0xfc, 0xed, 0x01, 0x01, 0x09, 0x25, 0x24, 0x52, 0x87, 0x49, 0x4a, 0x04, 0xfd, 0x85, 0x03, 0x02, 0x04, 0x03, 0x09, 0x25, 0x24, 0x52, 0x87, 0x49, 0x4a, 0x06, 0x00, 0x02, 0x00, 0x45, 0x00, 0x00, 0x02, 0xff, 0x06, 0x14, 0x00, 0x11, 0x00, 0x18, 0x00, 0x00, 0x01, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x34, 0x27, 0x23, 0x22, 0x37, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x14, 0x33, 0x01, 0x78, 0xa6, 0xe1, 0xe1, 0xa6, 0x01, 0x37, 0xfc, 0x01, 0x01, 0xdd, 0x30, 0x25, 0x0e, 0x15, 0x31, 0x46, 0x01, 0x53, 0x06, 0x14, 0xfc, 0xfe, 0xa0, 0xfd, 0x8e, 0x02, 0x54, 0x0f, 0x0f, 0xbd, 0xf6, 0x19, 0xfa, 0x84, 0x4b, 0x39, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x02, 0x23, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, 0x53, 0x37, 0x6c, 0x2c, 0x3f, 0xac, 0x89, 0x06, 0x14, 0xf9, 0xce, 0x7c, 0x74, 0x9c, 0xcc, 0xca, 0x06, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x4c, 0x04, 0xb1, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0xf0, 0x5e, 0x74, 0x59, 0x4d, 0x49, 0xfe, 0xee, 0xfc, 0x55, 0x59, 0x5a, 0x5f, 0x4c, 0xb4, 0x62, 0xaa, 0x5a, 0x5a, 0x53, 0x52, 0x96, 0x9d, 0x01, 0x83, 0xfd, 0xac, 0xa5, 0xa5, 0x03, 0x0e, 0x01, 0xdc, 0x38, 0x2b, 0x6c, 0x68, 0x8a, 0xdd, 0xf2, 0x12, 0x13, 0x25, 0xc3, 0x31, 0x32, 0x4b, 0x4b, 0x8f, 0x84, 0x4b, 0x4a, 0xa6, 0x01, 0xf3, 0xfc, 0x33, 0x06, 0x14, 0xfe, 0x4c, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0xe6, 0x06, 0x67, 0x04, 0x62, 0x00, 0x26, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x03, 0x50, 0x3d, 0x58, 0x56, 0x75, 0x9e, 0xab, 0xa7, 0x66, 0x6a, 0x80, 0x4b, 0x4b, 0xa6, 0x67, 0x6b, 0x7f, 0x95, 0xa7, 0xa7, 0x37, 0x51, 0x4f, 0x6d, 0x6d, 0x4e, 0x4c, 0xd8, 0x79, 0x3d, 0x3c, 0xf6, 0xe2, 0x02, 0xa4, 0xfd, 0x62, 0xa2, 0x9c, 0x60, 0x5e, 0xa4, 0x02, 0x7a, 0xfd, 0x62, 0xa2, 0x9c, 0xc0, 0xa2, 0x02, 0x7a, 0xfb, 0x9e, 0xb0, 0x65, 0x33, 0x32, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x06, 0x67, 0x04, 0x62, 0x00, 0x26, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x03, 0x50, 0x3d, 0x58, 0x56, 0x75, 0x9e, 0xab, 0xa7, 0x66, 0x6a, 0x80, 0x4b, 0x4b, 0xa6, 0x67, 0x6b, 0x7f, 0x95, 0xa7, 0xa7, 0x37, 0x51, 0x4f, 0x6d, 0x6d, 0x4e, 0x4c, 0xd8, 0x79, 0x3d, 0x3c, 0xf6, 0xe2, 0x02, 0xa4, 0xfd, 0x62, 0xa2, 0x9c, 0x60, 0x5e, 0xa4, 0x02, 0x7a, 0xfd, 0x62, 0xa2, 0x9c, 0xc0, 0xa2, 0x02, 0x7a, 0xf9, 0xf4, 0x02, 0x5a, 0x65, 0x33, 0x32, 0x3e, 0x3e, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x06, 0x67, 0x04, 0x7b, 0x00, 0x30, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x03, 0xbe, 0x3f, 0xac, 0x75, 0x9e, 0x55, 0x56, 0x4a, 0x49, 0xa3, 0xe4, 0xd1, 0x5f, 0x22, 0x22, 0x01, 0x66, 0x6a, 0x80, 0x96, 0xa6, 0x33, 0x34, 0x6b, 0x7f, 0x4a, 0x4b, 0xa7, 0xa7, 0x39, 0x9e, 0x6d, 0x6e, 0x4c, 0x4e, 0x03, 0x89, 0x7c, 0x76, 0x7b, 0x7a, 0xe2, 0xfd, 0x48, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x02, 0xb2, 0xa1, 0x9c, 0xbe, 0xa4, 0xfd, 0x87, 0x02, 0x9e, 0xa2, 0x4e, 0x4d, 0x5f, 0x60, 0xa3, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x67, 0x62, 0x3e, 0x3e, 0x00, 0x01, 0xff, 0xde, 0xfe, 0x56, 0x03, 0xfa, 0x04, 0x7b, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xfa, 0xa6, 0x6f, 0x70, 0x86, 0x9c, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0xa6, 0x3c, 0xa1, 0x69, 0xae, 0xb2, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x73, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x04, 0x74, 0xae, 0x65, 0x64, 0xef, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0xc3, 0x04, 0x7b, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x03, 0x98, 0x4a, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x22, 0x22, 0x5e, 0x2d, 0x3f, 0xa3, 0xfe, 0xb6, 0x60, 0xd6, 0x02, 0xb2, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x64, 0xef, 0xe8, 0xfd, 0x48, 0x99, 0x31, 0x30, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa1, 0x00, 0x00, 0x03, 0xf4, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x23, 0xa1, 0xf5, 0x01, 0xad, 0xb1, 0xf5, 0xfe, 0x53, 0xb1, 0x04, 0x60, 0xfc, 0x79, 0x03, 0x87, 0xfb, 0xa0, 0x03, 0x6c, 0xfc, 0x94, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x00, 0x01, 0x22, 0x06, 0x07, 0x21, 0x2e, 0x01, 0x03, 0x32, 0x36, 0x35, 0x21, 0x14, 0x16, 0x13, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x02, 0x32, 0x84, 0x86, 0x10, 0x02, 0x35, 0x10, 0x86, 0x84, 0x87, 0x97, 0xfd, 0xc5, 0x97, 0x87, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xf5, 0xf5, 0x03, 0xdf, 0xc1, 0x7f, 0x7f, 0xc1, 0xfc, 0xa0, 0xe8, 0x94, 0x94, 0xe8, 0x03, 0xfc, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x05, 0x87, 0x04, 0x60, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x17, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x05, 0x7a, 0xfe, 0x0c, 0x01, 0xe0, 0xfe, 0x20, 0x02, 0x01, 0xfd, 0x31, 0xfe, 0xdb, 0x96, 0x97, 0x97, 0x96, 0x01, 0x25, 0x26, 0x22, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0xd8, 0x22, 0x04, 0x60, 0x9a, 0xfe, 0xdd, 0x9b, 0xfe, 0x94, 0x9c, 0x8e, 0x8f, 0x01, 0x14, 0x01, 0x12, 0x8e, 0x8f, 0x82, 0x6c, 0x6b, 0xd8, 0xd9, 0x6c, 0x6d, 0x00, 0x00, 0x02, 0x00, 0x85, 0xff, 0xdc, 0x04, 0xb8, 0x04, 0x7c, 0x00, 0x13, 0x00, 0x24, 0x00, 0x00, 0x01, 0x15, 0x14, 0x16, 0x32, 0x37, 0x36, 0x35, 0x10, 0x02, 0x20, 0x02, 0x11, 0x14, 0x17, 0x16, 0x32, 0x36, 0x3d, 0x01, 0x05, 0x10, 0x00, 0x20, 0x00, 0x11, 0x14, 0x06, 0x07, 0x06, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x22, 0x26, 0x02, 0xf4, 0x56, 0x61, 0x22, 0x42, 0xbc, 0xfe, 0x97, 0xb6, 0x42, 0x22, 0x60, 0x56, 0xfe, 0x37, 0x01, 0x22, 0x01, 0xec, 0x01, 0x25, 0x34, 0x2a, 0x57, 0xc2, 0x91, 0x0b, 0x10, 0x8e, 0xc0, 0xc2, 0x02, 0x94, 0xc4, 0xa3, 0xb5, 0x30, 0x5b, 0x9d, 0x01, 0x0f, 0x01, 0x31, 0xfe, 0xd0, 0xfe, 0xf0, 0x9d, 0x5b, 0x30, 0xb5, 0xa3, 0xc4, 0xc8, 0x01, 0x54, 0x01, 0x5c, 0xfe, 0xa4, 0xfe, 0x80, 0x6c, 0xb2, 0x36, 0x70, 0xa3, 0x75, 0x79, 0x9f, 0xed, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x64, 0xfe, 0x56, 0x04, 0x56, 0x06, 0x14, 0x12, 0x06, 0x03, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe5, 0x02, 0x4f, 0x04, 0x60, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x01, 0xa8, 0x67, 0xec, 0x22, 0x32, 0x01, 0x36, 0x4f, 0x8d, 0x96, 0xa6, 0xa6, 0xae, 0xc9, 0x0a, 0xbd, 0x23, 0xcb, 0xbe, 0x02, 0x4e, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe5, 0x02, 0x4f, 0x06, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x01, 0xa8, 0x67, 0xec, 0x22, 0x32, 0x01, 0x36, 0x4f, 0x8f, 0x94, 0xa6, 0xa6, 0xae, 0xc9, 0x0a, 0xbd, 0x23, 0xce, 0xbb, 0x03, 0xf8, 0xf9, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x56, 0x03, 0x1e, 0x04, 0x60, 0x00, 0x16, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x01, 0xa8, 0x67, 0xec, 0x22, 0x32, 0x01, 0x36, 0x4f, 0x8d, 0x96, 0xa6, 0x45, 0x5e, 0x2c, 0x3f, 0xa2, 0x93, 0xae, 0xc9, 0x0a, 0xbd, 0x23, 0xcb, 0xbe, 0x02, 0x4e, 0xfb, 0x8c, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x58, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xf6, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0xa7, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x03, 0xb4, 0x12, 0x11, 0xcb, 0xbe, 0xfc, 0x0a, 0x06, 0x08, 0xae, 0x66, 0x63, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xf6, 0x1c, 0x42, 0x27, 0x8e, 0x96, 0x44, 0x5f, 0xd2, 0xe5, 0xa3, 0x93, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x03, 0xb4, 0x12, 0x11, 0xcb, 0xbe, 0xfd, 0x9e, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x04, 0x74, 0xae, 0x66, 0x63, 0x05, 0x05, 0x00, 0x01, 0x00, 0x76, 0x00, 0x00, 0x03, 0x25, 0x04, 0x7b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x01, 0xb0, 0x94, 0xfe, 0x33, 0x93, 0x93, 0xa3, 0xe5, 0xd2, 0x5f, 0x44, 0x02, 0xe5, 0xfd, 0xbf, 0xa4, 0xa4, 0x02, 0x41, 0xd6, 0xc0, 0x9c, 0x61, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x03, 0x25, 0x04, 0x7b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x02, 0x83, 0xa2, 0xfe, 0x24, 0x94, 0x44, 0x5f, 0xd2, 0xe5, 0xa3, 0x93, 0x02, 0xe5, 0xfd, 0xbf, 0xa4, 0xa4, 0x02, 0x41, 0x99, 0x61, 0x9c, 0xc0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x22, 0x04, 0x60, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0xc5, 0x2b, 0x68, 0x2d, 0x9d, 0xb0, 0x92, 0x42, 0x6f, 0x49, 0x98, 0xa7, 0x01, 0x5e, 0xc4, 0xc0, 0x64, 0xfe, 0x29, 0xb2, 0x6b, 0x73, 0x6a, 0x74, 0x02, 0x0d, 0x0a, 0x74, 0x5d, 0xfe, 0xce, 0x01, 0x1f, 0x80, 0x3a, 0xfe, 0x27, 0x04, 0x60, 0x9e, 0xa5, 0x69, 0x8c, 0x01, 0x9d, 0xfe, 0xaf, 0x56, 0x4e, 0x4d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x22, 0x04, 0x60, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x32, 0x36, 0x37, 0x13, 0x33, 0x03, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x13, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0xa7, 0xa7, 0x98, 0x49, 0x6f, 0x42, 0x92, 0xb0, 0x9d, 0x2d, 0x68, 0x2b, 0x60, 0x64, 0xc0, 0xc4, 0xfe, 0xa2, 0xa7, 0xb2, 0x74, 0x6a, 0x73, 0x6b, 0x04, 0x60, 0xfe, 0x27, 0x3a, 0x80, 0x01, 0x1f, 0xfe, 0xce, 0x5d, 0x74, 0x0a, 0x1b, 0x8c, 0x69, 0xa5, 0x9e, 0x01, 0xec, 0xfe, 0xaf, 0x60, 0x4d, 0x4e, 0x56, 0x00, 0x00, 0x01, 0x00, 0x63, 0xfe, 0x56, 0x03, 0x67, 0x04, 0x7b, 0x00, 0x30, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x30, 0x46, 0x97, 0x51, 0x7b, 0x7c, 0x59, 0x85, 0x38, 0xb1, 0x94, 0xde, 0xc2, 0x5b, 0x4f, 0x12, 0x44, 0x5e, 0xd2, 0xe4, 0xa3, 0x93, 0xb7, 0xae, 0x75, 0x7e, 0x5b, 0x9a, 0x39, 0x9a, 0x89, 0xca, 0xb9, 0x5c, 0xa2, 0x04, 0x3f, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2a, 0x99, 0x89, 0x9c, 0xb6, 0x11, 0x04, 0x0c, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0xfb, 0x6a, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdc, 0xfe, 0x56, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x17, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0xab, 0x9d, 0xaa, 0x9c, 0x9e, 0x59, 0x45, 0x93, 0xa3, 0x3f, 0x2c, 0x5f, 0x43, 0x14, 0x04, 0xc2, 0xbb, 0xab, 0x99, 0x50, 0x68, 0xfb, 0x29, 0xd6, 0xc0, 0x9c, 0x61, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdc, 0xfe, 0x56, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x20, 0x00, 0x00, 0x13, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0xab, 0x9d, 0xaa, 0x9c, 0x9e, 0x59, 0x45, 0x92, 0x92, 0x93, 0xa3, 0x3f, 0x2c, 0x5f, 0x43, 0xa2, 0xa2, 0x9e, 0x04, 0x60, 0x4e, 0xbb, 0xab, 0x99, 0x50, 0x68, 0xfd, 0xa8, 0x03, 0xa4, 0xfe, 0x28, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x01, 0xd8, 0xa4, 0x01, 0x69, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x56, 0x02, 0xe3, 0x04, 0x65, 0x00, 0x13, 0x00, 0x00, 0x05, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x01, 0x6e, 0x45, 0x59, 0x9e, 0x9c, 0xaa, 0x9d, 0x43, 0x5f, 0x2c, 0x3f, 0xa3, 0x93, 0x14, 0x03, 0x28, 0x68, 0x50, 0x99, 0xab, 0xbb, 0xfc, 0xed, 0x99, 0x61, 0x9c, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0x0d, 0xfe, 0x56, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x21, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x20, 0x35, 0x34, 0x3b, 0x01, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x03, 0x23, 0x22, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x52, 0xa4, 0xac, 0x10, 0x30, 0x49, 0xa3, 0xfe, 0xef, 0xf3, 0xab, 0x9d, 0xaa, 0x9c, 0x9e, 0x59, 0x45, 0xb0, 0xa1, 0x6b, 0x02, 0x03, 0x70, 0x63, 0x1e, 0x0e, 0x9b, 0x6f, 0x40, 0x60, 0xd8, 0xd2, 0x04, 0xae, 0xbb, 0xab, 0x99, 0x50, 0x68, 0xfa, 0xa3, 0x33, 0x41, 0x30, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0xc0, 0x02, 0xa7, 0x04, 0x5e, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x11, 0x33, 0x15, 0x23, 0x11, 0x01, 0x87, 0xfe, 0xab, 0x01, 0x55, 0x44, 0x67, 0xaa, 0xaa, 0xbf, 0x92, 0x7a, 0x7a, 0xfe, 0xc0, 0x01, 0x3e, 0x8f, 0x02, 0x60, 0x89, 0x4e, 0x9a, 0x9f, 0xd2, 0xfd, 0xa0, 0x8f, 0xfe, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x56, 0x02, 0xab, 0x05, 0x9e, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x44, 0x5e, 0xb6, 0xc9, 0xa3, 0x93, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xfc, 0x1b, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x03, 0xe5, 0x8f, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xe3, 0x04, 0x91, 0x04, 0x60, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x35, 0x05, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x9d, 0xa5, 0x02, 0x01, 0xa6, 0xa7, 0xa7, 0xa6, 0x3c, 0x9f, 0x6a, 0xad, 0xb4, 0x9d, 0x03, 0x42, 0xfe, 0x00, 0x70, 0x6f, 0x81, 0xa0, 0x02, 0x68, 0x01, 0xf8, 0xfe, 0x08, 0x01, 0xf8, 0xfe, 0x08, 0xa4, 0xfe, 0x3c, 0xac, 0x66, 0x63, 0xf0, 0xe7, 0x0a, 0xa4, 0xa5, 0x02, 0x9f, 0x9f, 0xba, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe2, 0x04, 0x11, 0x04, 0x60, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x36, 0x37, 0x23, 0x35, 0x21, 0x15, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x21, 0x04, 0x10, 0xd4, 0x57, 0x73, 0xff, 0x00, 0xca, 0xcb, 0xff, 0x00, 0x73, 0x57, 0xd5, 0x01, 0x8e, 0x5c, 0x7b, 0x9f, 0x81, 0x82, 0x9e, 0x7a, 0x5c, 0x01, 0x01, 0x88, 0x03, 0xbc, 0x48, 0xeb, 0x98, 0xeb, 0xfe, 0xdc, 0x01, 0x24, 0xeb, 0x98, 0xeb, 0x48, 0xa4, 0xdc, 0x42, 0xd7, 0x8b, 0x9f, 0xc2, 0xc2, 0x9f, 0x8b, 0xd7, 0x42, 0xdc, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0xed, 0x04, 0x62, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x37, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x17, 0x16, 0x03, 0xec, 0x7f, 0x83, 0xc8, 0x3f, 0xa3, 0x49, 0x49, 0xa5, 0x23, 0x24, 0x5c, 0x2e, 0x82, 0x9e, 0x42, 0x42, 0x63, 0x5d, 0x50, 0x96, 0x2e, 0x1e, 0x02, 0x0f, 0xee, 0x8f, 0x92, 0x60, 0x60, 0xd6, 0x02, 0xca, 0xfd, 0x36, 0x99, 0x31, 0x32, 0x02, 0xc4, 0x9e, 0xe8, 0x65, 0x63, 0x1e, 0x96, 0x08, 0x30, 0x5b, 0xab, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x06, 0x00, 0x00, 0x33, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0x37, 0x01, 0x7a, 0xe1, 0x01, 0x7a, 0xb0, 0xfe, 0xc5, 0xfe, 0xc5, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0xac, 0xfc, 0x54, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x21, 0x23, 0x0b, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x05, 0x96, 0xa6, 0xce, 0xcf, 0xc3, 0xcf, 0xce, 0xa6, 0x01, 0x08, 0xc3, 0xd9, 0xda, 0xc3, 0x03, 0x6a, 0xfc, 0x96, 0x03, 0x6a, 0xfc, 0x96, 0x04, 0x60, 0xfc, 0x6a, 0x03, 0x96, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x11, 0x00, 0x00, 0x33, 0x01, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x01, 0x23, 0x09, 0x01, 0x37, 0x01, 0xbb, 0x47, 0x41, 0x43, 0x70, 0x84, 0x61, 0x45, 0x25, 0x29, 0x2b, 0x1e, 0x01, 0x98, 0xb0, 0xfe, 0xc4, 0xfe, 0xc6, 0x04, 0xd2, 0xc7, 0x3e, 0x3d, 0x9a, 0x24, 0x23, 0x87, 0x5e, 0xfb, 0xb2, 0x03, 0x6c, 0xfc, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x00, 0x00, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x08, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x01, 0x11, 0x23, 0x11, 0x5c, 0xc3, 0x01, 0x08, 0x01, 0x10, 0xc3, 0xfe, 0x87, 0xb7, 0x04, 0x60, 0xfe, 0x38, 0x01, 0xc8, 0xfd, 0x90, 0xfe, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x56, 0x04, 0x46, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, 0x66, 0x03, 0x12, 0xfd, 0x92, 0x02, 0x6e, 0x45, 0x5e, 0x2b, 0x40, 0xa2, 0x93, 0xfd, 0x7e, 0x02, 0x6f, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfc, 0xdb, 0xa7, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x14, 0xa8, 0x03, 0x25, 0x00, 0x02, 0x00, 0x4f, 0xff, 0x91, 0x03, 0x79, 0x04, 0x60, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x16, 0x07, 0x06, 0x2b, 0x01, 0x06, 0x15, 0x23, 0x34, 0x37, 0x21, 0x35, 0x01, 0x21, 0x01, 0x33, 0x32, 0x35, 0x34, 0x07, 0x06, 0x66, 0x03, 0x12, 0xfd, 0x92, 0x9d, 0x1e, 0x4c, 0x3b, 0x56, 0x77, 0x34, 0x22, 0x01, 0x38, 0x49, 0x72, 0x5e, 0x03, 0x8a, 0x03, 0xfe, 0xba, 0x02, 0x6f, 0xfd, 0xa8, 0x01, 0xcc, 0x32, 0x7c, 0x3f, 0x4f, 0x04, 0x60, 0xa8, 0xfc, 0xdb, 0xa2, 0x47, 0x37, 0x57, 0x39, 0x57, 0x60, 0x2f, 0x3d, 0x33, 0x3c, 0x3b, 0x34, 0xa8, 0x03, 0x25, 0xfc, 0xc6, 0x36, 0x5d, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0xc4, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x02, 0x03, 0x5f, 0x73, 0x59, 0x4d, 0x49, 0xfe, 0xee, 0xfc, 0x54, 0x59, 0x5a, 0x60, 0x4c, 0xb4, 0x62, 0xab, 0x59, 0x5a, 0x53, 0x54, 0x94, 0x9d, 0x01, 0x83, 0xfd, 0xa8, 0x03, 0x13, 0x01, 0xdc, 0x38, 0x2a, 0x6d, 0x68, 0x8a, 0xdd, 0xf2, 0x12, 0x13, 0x25, 0xc3, 0x31, 0x32, 0x4b, 0x4b, 0x8f, 0x84, 0x4b, 0x4a, 0xa6, 0x01, 0xf3, 0x93, 0xa8, 0x00, 0x00, 0x02, 0x00, 0x62, 0xfe, 0x4c, 0x03, 0xfb, 0x04, 0x60, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x20, 0x37, 0x36, 0x05, 0x16, 0x17, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x23, 0x34, 0x27, 0x30, 0x07, 0x06, 0x37, 0x26, 0x23, 0x22, 0x07, 0x14, 0x33, 0x32, 0x37, 0x01, 0xb6, 0xfe, 0xd3, 0x02, 0x01, 0x01, 0x0d, 0xdd, 0x8e, 0x0b, 0x53, 0x54, 0x94, 0x9d, 0x01, 0x83, 0xfd, 0xa8, 0x03, 0x13, 0xfe, 0x8e, 0x5e, 0x74, 0x5a, 0x4c, 0x49, 0x23, 0x5a, 0x8a, 0x24, 0x12, 0x88, 0x08, 0x70, 0xb1, 0x76, 0x01, 0x8e, 0xab, 0x59, 0xfe, 0x4c, 0xbd, 0xfb, 0x05, 0x04, 0x3b, 0x2a, 0x31, 0x85, 0x4a, 0x4a, 0xa6, 0x01, 0xf3, 0x93, 0xa8, 0xfe, 0x24, 0x38, 0x2b, 0x6c, 0x67, 0x8b, 0x71, 0x55, 0x65, 0xa4, 0x52, 0x38, 0x11, 0x79, 0xfa, 0x2a, 0x4b, 0x2f, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x11, 0x23, 0x01, 0x32, 0x39, 0xad, 0x4d, 0x34, 0x01, 0x33, 0x59, 0xa1, 0x48, 0x47, 0x47, 0x46, 0x45, 0x48, 0x49, 0x4d, 0xf7, 0x7d, 0x62, 0x62, 0x64, 0x99, 0xb6, 0x03, 0x1e, 0x72, 0x4c, 0x62, 0x85, 0x41, 0x72, 0x16, 0x15, 0x2b, 0xac, 0x23, 0x11, 0x12, 0x9d, 0x7d, 0xba, 0xaa, 0x73, 0x77, 0x1e, 0xfd, 0x74, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x14, 0x17, 0x16, 0x33, 0x02, 0x64, 0xb6, 0x99, 0x65, 0x61, 0x63, 0x7c, 0xf7, 0x4d, 0x48, 0x49, 0x45, 0x46, 0x48, 0x46, 0x48, 0xa1, 0x59, 0x33, 0x01, 0x34, 0x4d, 0xad, 0x03, 0x1e, 0xfc, 0xe2, 0x02, 0x8c, 0x1e, 0x77, 0x73, 0xaa, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x2b, 0x15, 0x16, 0x72, 0x41, 0x85, 0x62, 0x4c, 0x72, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x13, 0x33, 0x11, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x34, 0x27, 0x26, 0x23, 0x01, 0x32, 0x01, 0xb6, 0x99, 0x64, 0x62, 0x62, 0x7d, 0xf7, 0x4d, 0x49, 0x48, 0x45, 0x46, 0x47, 0x47, 0x48, 0xa1, 0x59, 0x33, 0x01, 0x34, 0x4d, 0xad, 0x02, 0xf4, 0x03, 0x1e, 0xfd, 0x74, 0x1e, 0x77, 0x73, 0xaa, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x2b, 0x15, 0x16, 0x72, 0x41, 0x85, 0x62, 0x4c, 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0x48, 0x06, 0x14, 0x00, 0x23, 0x00, 0x00, 0x13, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x4f, 0x63, 0x7c, 0xf7, 0x4d, 0x48, 0x49, 0x45, 0x42, 0x4c, 0x46, 0x48, 0x9f, 0x5b, 0x34, 0x34, 0x5c, 0x9e, 0x48, 0x46, 0x48, 0x46, 0x45, 0x49, 0x48, 0x4d, 0xf7, 0x7c, 0x63, 0x04, 0x40, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x28, 0x18, 0x16, 0x72, 0x41, 0x85, 0xfb, 0xe0, 0x85, 0x41, 0x72, 0x16, 0x15, 0x2b, 0xac, 0x23, 0x11, 0x12, 0x9d, 0x7d, 0xba, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x22, 0x27, 0x26, 0x00, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x01, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x10, 0x00, 0x02, 0x70, 0x1e, 0x1d, 0x2b, 0x2a, 0x1e, 0x1d, 0x3b, 0x55, 0x1d, 0x1e, 0x01, 0x2c, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe8, 0xfe, 0x52, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x02, 0xe9, 0x2e, 0x22, 0x22, 0x22, 0x22, 0x2e, 0x2f, 0x42, 0x21, 0x21, 0x02, 0x92, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0xec, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0x01, 0xa4, 0x02, 0xc4, 0x01, 0xa5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xd2, 0x04, 0x60, 0x10, 0x06, 0x03, 0xc6, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x4b, 0x04, 0x7c, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x20, 0x17, 0x16, 0x11, 0x10, 0x00, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x02, 0x0b, 0x6b, 0x3e, 0x3f, 0x3d, 0x3c, 0x69, 0x8b, 0x85, 0x7b, 0x41, 0x46, 0x4b, 0x4d, 0x88, 0xbd, 0x5d, 0x59, 0x59, 0x57, 0xef, 0x01, 0x3e, 0x88, 0x88, 0xfe, 0xf4, 0xfe, 0xe5, 0xd6, 0xe8, 0x7c, 0x70, 0x65, 0x36, 0x36, 0x66, 0x66, 0x03, 0xdc, 0x2e, 0x2e, 0x40, 0x46, 0x2d, 0x2c, 0x98, 0x33, 0x38, 0x58, 0x5a, 0x38, 0x38, 0x74, 0x6f, 0xd0, 0xcd, 0x72, 0x6e, 0xa0, 0x9e, 0x9d, 0xfe, 0xee, 0xfe, 0xf2, 0xfe, 0xc2, 0xb6, 0xad, 0x6c, 0x92, 0x18, 0x18, 0x41, 0x40, 0x5d, 0x8d, 0x4f, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x05, 0x37, 0x06, 0x14, 0x00, 0x27, 0x00, 0x00, 0x25, 0x11, 0x23, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x4b, 0x8b, 0x01, 0x21, 0x5b, 0xc2, 0x6e, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x32, 0x5e, 0x2c, 0x93, 0xa3, 0xe5, 0xd0, 0x5f, 0x45, 0x55, 0xad, 0x59, 0xa2, 0xb2, 0xb2, 0xa2, 0x47, 0x6f, 0x9e, 0x01, 0x11, 0x8c, 0xfd, 0xf0, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x0f, 0x0f, 0x21, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xfe, 0xe5, 0x3e, 0x3e, 0xe3, 0xcd, 0xcd, 0xe3, 0x0f, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x0e, 0x04, 0x60, 0x10, 0x06, 0x03, 0xd1, 0x00, 0x00, 0x00, 0x03, 0xff, 0x0d, 0xfe, 0x56, 0x01, 0xf7, 0x06, 0x14, 0x00, 0x03, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x15, 0x33, 0x11, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x20, 0x35, 0x34, 0x3b, 0x01, 0x07, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0xae, 0xa5, 0xa5, 0xa5, 0xa3, 0xaa, 0x10, 0x32, 0x43, 0xa9, 0xfe, 0xef, 0xf3, 0xae, 0x08, 0xa5, 0x69, 0x73, 0x56, 0x26, 0x1a, 0x06, 0x14, 0xe9, 0xcb, 0xfb, 0xa0, 0x8b, 0x78, 0x47, 0x60, 0xdd, 0xcd, 0x8b, 0x42, 0x41, 0x30, 0x20, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x4c, 0x04, 0x26, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x23, 0x11, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x11, 0x33, 0x04, 0x26, 0xa6, 0xfe, 0x11, 0xd3, 0x02, 0x16, 0xfd, 0xd3, 0xd8, 0x02, 0x01, 0xa6, 0xfe, 0x4c, 0x03, 0x97, 0xfe, 0x1d, 0x02, 0x0c, 0x02, 0x54, 0xfd, 0xdd, 0x02, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x8d, 0x04, 0x60, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0xa7, 0xa6, 0x02, 0x3f, 0xfd, 0x1b, 0x04, 0x60, 0xfc, 0x33, 0x93, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x05, 0x60, 0x06, 0x12, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x01, 0x11, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x02, 0x34, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0x93, 0xa3, 0xe4, 0xd0, 0x5e, 0x45, 0xa7, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0xfd, 0xae, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0xc6, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xf9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x24, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x01, 0x32, 0x39, 0xac, 0x4e, 0x34, 0x01, 0x33, 0x59, 0xa1, 0x48, 0x47, 0x47, 0x46, 0x45, 0x48, 0x49, 0x4d, 0xf7, 0x7d, 0x62, 0x62, 0x64, 0x99, 0xd0, 0xd0, 0xb6, 0xce, 0xcd, 0x03, 0x1e, 0x72, 0x4c, 0x62, 0x85, 0x41, 0x72, 0x16, 0x15, 0x2b, 0xac, 0x23, 0x11, 0x12, 0x9d, 0x7d, 0xba, 0xaa, 0x73, 0x77, 0x1e, 0xd4, 0xa4, 0xfe, 0xec, 0x01, 0x14, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x24, 0x00, 0x00, 0x13, 0x35, 0x33, 0x35, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0xde, 0xd0, 0x99, 0x65, 0x61, 0x63, 0x7c, 0xf7, 0x4d, 0x48, 0x49, 0x45, 0x47, 0x47, 0x46, 0x48, 0xa1, 0x59, 0x33, 0x01, 0x34, 0x4d, 0xad, 0x38, 0xce, 0xce, 0xb6, 0x01, 0x14, 0xa4, 0xd4, 0x1e, 0x77, 0x73, 0xaa, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x2b, 0x15, 0x16, 0x72, 0x41, 0x85, 0x62, 0x4c, 0x72, 0xfe, 0x9a, 0xa4, 0xfe, 0xec, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xfd, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x29, 0x00, 0x00, 0x00, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x10, 0x27, 0x26, 0x20, 0x07, 0x25, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x2b, 0x01, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x01, 0x01, 0x11, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x4c, 0x4c, 0x4b, 0xfe, 0xf9, 0x4c, 0x01, 0xea, 0xa6, 0x03, 0x11, 0xfd, 0x92, 0x02, 0x6e, 0xfc, 0xef, 0x18, 0x8e, 0x34, 0x4f, 0x50, 0x70, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0x70, 0x50, 0x4f, 0xda, 0x02, 0x57, 0x02, 0xfa, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x74, 0x01, 0x96, 0x74, 0x73, 0x73, 0x48, 0x02, 0x5e, 0xfe, 0x4c, 0xa8, 0xfc, 0xdb, 0x93, 0xa8, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0x31, 0x30, 0x4d, 0xfc, 0xf9, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x4c, 0x07, 0x4d, 0x06, 0x14, 0x00, 0x34, 0x00, 0x40, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x04, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x10, 0x27, 0x26, 0x20, 0x07, 0x03, 0xeb, 0xa6, 0x34, 0x4f, 0x50, 0x70, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0x70, 0x50, 0x4f, 0x34, 0xa6, 0x03, 0x12, 0xfe, 0x8e, 0x60, 0x73, 0x58, 0x4e, 0x48, 0xfe, 0xef, 0xfc, 0x55, 0x59, 0x5a, 0x5f, 0x4b, 0xb4, 0x62, 0xab, 0x5a, 0x5a, 0x53, 0x54, 0x95, 0x9c, 0x01, 0x83, 0xfa, 0xce, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x4c, 0x4c, 0x4b, 0xfe, 0xf9, 0x4c, 0x03, 0xcd, 0xfc, 0x33, 0xa8, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0x02, 0x5e, 0xfe, 0x4c, 0xa8, 0xfe, 0x24, 0x38, 0x2a, 0x6d, 0x68, 0x8a, 0xdd, 0xf2, 0x12, 0x13, 0x25, 0xc3, 0x31, 0x32, 0x4b, 0x4b, 0x8f, 0x84, 0x4b, 0x4a, 0xa6, 0x01, 0xf3, 0xd3, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x74, 0x01, 0x96, 0x74, 0x73, 0x73, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xff, 0x91, 0x06, 0xfc, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x33, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x10, 0x27, 0x26, 0x20, 0x07, 0x25, 0x11, 0x01, 0x25, 0x21, 0x15, 0x01, 0x33, 0x12, 0x33, 0x32, 0x15, 0x16, 0x21, 0x23, 0x06, 0x15, 0x23, 0x34, 0x37, 0x21, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x33, 0x01, 0x33, 0x32, 0x35, 0x34, 0x23, 0x06, 0x01, 0x11, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x4c, 0x4c, 0x4b, 0xfe, 0xf9, 0x4c, 0x02, 0x90, 0x02, 0x56, 0xfd, 0xaa, 0x03, 0x10, 0xfd, 0x92, 0x9d, 0x36, 0xc5, 0xcd, 0x01, 0xfe, 0xd4, 0x25, 0x03, 0x8a, 0x03, 0xfe, 0xba, 0x8d, 0x34, 0x4f, 0x50, 0x70, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0x70, 0x50, 0x4f, 0x34, 0xa6, 0x01, 0xca, 0x12, 0x9c, 0x3f, 0x4f, 0x02, 0xfa, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x74, 0x01, 0x96, 0x74, 0x73, 0x73, 0x5f, 0xfc, 0xfa, 0x03, 0x06, 0x93, 0xa8, 0xfc, 0xdb, 0x01, 0x20, 0xf6, 0xbd, 0x33, 0x3c, 0x3b, 0x34, 0xa8, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0x02, 0x5e, 0xfa, 0x7f, 0x36, 0x5b, 0x02, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x05, 0xa0, 0x05, 0x9e, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x17, 0x16, 0x33, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x21, 0x22, 0x67, 0x02, 0x07, 0x75, 0x3f, 0x3f, 0x55, 0xa0, 0x39, 0x9a, 0x89, 0xc9, 0xba, 0x5c, 0xa2, 0x44, 0x46, 0x97, 0x51, 0x7c, 0x7b, 0x58, 0x85, 0x39, 0xb2, 0x93, 0x70, 0x44, 0xed, 0xfd, 0xfd, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x2d, 0x2c, 0x34, 0x49, 0x4d, 0x2a, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2c, 0x97, 0x89, 0x92, 0x65, 0x3e, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x31, 0xfe, 0x56, 0x04, 0x88, 0x06, 0x14, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x30, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x13, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x02, 0x11, 0x21, 0x11, 0x14, 0x17, 0x16, 0x33, 0x01, 0x52, 0x01, 0x52, 0x4e, 0x49, 0xb0, 0x9c, 0x9e, 0x59, 0x22, 0x24, 0x02, 0x49, 0x49, 0xa3, 0x3f, 0x2c, 0x5e, 0x22, 0x23, 0xab, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x01, 0xfb, 0x02, 0xfe, 0xae, 0x21, 0x22, 0x67, 0x05, 0x9e, 0xfe, 0xc2, 0x4e, 0xb5, 0x5b, 0x56, 0x99, 0x28, 0x28, 0x68, 0xfb, 0x29, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x14, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0xfa, 0xfc, 0x01, 0xa2, 0x01, 0x95, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x00, 0x03, 0x00, 0x31, 0xff, 0x70, 0x05, 0x35, 0x05, 0x9e, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x44, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x10, 0x1f, 0x01, 0x36, 0x33, 0x20, 0x17, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x06, 0x15, 0x07, 0x34, 0x37, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x05, 0x26, 0x35, 0x10, 0x37, 0x21, 0x11, 0x14, 0x17, 0x16, 0x33, 0x01, 0x52, 0x01, 0x55, 0x86, 0xe5, 0x4d, 0x49, 0x48, 0x45, 0x46, 0x47, 0x47, 0x48, 0xa1, 0x59, 0x59, 0x59, 0x07, 0x48, 0xb9, 0x01, 0x0d, 0x01, 0x5b, 0x44, 0x8d, 0x4b, 0x42, 0x02, 0x8a, 0x06, 0xfa, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x02, 0xe8, 0x3c, 0x4a, 0x56, 0x13, 0x1c, 0x01, 0x01, 0x76, 0x67, 0x24, 0x04, 0xfe, 0xf4, 0x73, 0x7d, 0xfe, 0xbd, 0x21, 0x22, 0x67, 0x05, 0x9e, 0xfe, 0xc2, 0x7a, 0x95, 0x11, 0x12, 0x23, 0xac, 0x2b, 0x16, 0x15, 0x71, 0x72, 0xfe, 0x66, 0x72, 0x09, 0xab, 0xf6, 0x76, 0x29, 0x1e, 0x12, 0x32, 0x4c, 0x03, 0x4f, 0x41, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0xfa, 0xf9, 0x18, 0x07, 0x0b, 0x27, 0x4b, 0x56, 0x0a, 0x09, 0x9d, 0xf8, 0x01, 0x07, 0x9b, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0xfe, 0x56, 0x05, 0xcb, 0x06, 0x14, 0x00, 0x35, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x3b, 0x01, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x05, 0xca, 0x4a, 0x48, 0xa3, 0xe5, 0xd2, 0x5e, 0x22, 0x23, 0x70, 0x6f, 0x87, 0x9a, 0xa7, 0xfe, 0xf1, 0xa6, 0x9f, 0x9f, 0x4e, 0x4e, 0xaa, 0x9d, 0x9e, 0x5a, 0x23, 0x22, 0x01, 0x0f, 0x02, 0xa5, 0x3b, 0x50, 0x51, 0x69, 0xae, 0x59, 0x59, 0x02, 0xa4, 0xfd, 0x48, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x02, 0xb2, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0x55, 0x56, 0x99, 0x28, 0x28, 0x68, 0x63, 0xae, 0x65, 0x32, 0x32, 0x77, 0x78, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x04, 0xbb, 0x06, 0x14, 0x00, 0x27, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x21, 0xae, 0xa5, 0x01, 0xca, 0x75, 0x3f, 0x3f, 0x54, 0xa0, 0x3a, 0x9a, 0x89, 0xca, 0xb9, 0x5c, 0xa2, 0x44, 0x46, 0x97, 0x51, 0x7b, 0x7b, 0x58, 0x85, 0x39, 0xb2, 0x92, 0x6f, 0x45, 0xec, 0xfd, 0x94, 0x06, 0x14, 0xfa, 0x86, 0x2d, 0x2c, 0x34, 0x49, 0x4d, 0x2a, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2c, 0x97, 0x89, 0x92, 0x65, 0x3e, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x04, 0x65, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x2b, 0x01, 0x13, 0x11, 0x01, 0xae, 0xa5, 0x03, 0x12, 0xfd, 0x91, 0x02, 0x6f, 0xfc, 0xee, 0x17, 0x8e, 0xa5, 0x02, 0x58, 0x06, 0x14, 0xfe, 0x4c, 0xa8, 0xfc, 0xdb, 0x93, 0x03, 0xcd, 0xfc, 0xf9, 0x03, 0x07, 0x00, 0x00, 0x02, 0x00, 0x30, 0xff, 0xe2, 0x03, 0x85, 0x05, 0x1f, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x31, 0x68, 0x83, 0x81, 0x7b, 0x83, 0x81, 0x69, 0xa7, 0x7a, 0x89, 0x89, 0x7b, 0xa6, 0x68, 0x83, 0x81, 0x7b, 0x83, 0x81, 0x69, 0xa7, 0x7a, 0x89, 0x89, 0x7b, 0x02, 0x55, 0xfe, 0x17, 0x01, 0xe9, 0xfe, 0x17, 0x01, 0xe9, 0xfd, 0x8d, 0x02, 0x02, 0xfd, 0xfe, 0x05, 0x3d, 0xfe, 0x17, 0x01, 0xe9, 0xfe, 0x17, 0x01, 0xe9, 0xfd, 0x8d, 0x02, 0x02, 0xfd, 0xfe, 0x00, 0x02, 0x00, 0x30, 0x00, 0xad, 0x03, 0x85, 0x05, 0x1f, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x31, 0x03, 0x54, 0x81, 0xfd, 0xad, 0x80, 0x03, 0x54, 0x81, 0xfd, 0xad, 0x80, 0x02, 0x55, 0xfe, 0x58, 0x01, 0x05, 0xfe, 0xfb, 0x04, 0x72, 0xfe, 0x58, 0x01, 0x05, 0xfe, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x4a, 0x04, 0x1c, 0x06, 0x14, 0x00, 0x19, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x11, 0x10, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x03, 0x75, 0x77, 0xcf, 0xae, 0xb2, 0x44, 0x5f, 0x2c, 0x3f, 0xa3, 0x93, 0xdf, 0x86, 0x9b, 0xa6, 0xa6, 0xac, 0xc9, 0xef, 0xe8, 0x02, 0xc4, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0xfd, 0x42, 0xfe, 0xc3, 0xbe, 0xa4, 0x02, 0x79, 0xf9, 0xec, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x56, 0x04, 0xeb, 0x06, 0x14, 0x00, 0x21, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x11, 0x10, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x06, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x27, 0x03, 0x75, 0x77, 0xcf, 0xae, 0xb2, 0x44, 0x5f, 0x2c, 0x3f, 0xa3, 0x93, 0xdf, 0x86, 0x9b, 0xa6, 0x03, 0x48, 0x5d, 0x2d, 0x3f, 0xa4, 0x8e, 0x04, 0xac, 0xc9, 0xef, 0xe8, 0x02, 0xc4, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0xfd, 0x42, 0xfe, 0xc3, 0xbe, 0xa4, 0x02, 0x79, 0xfb, 0x8e, 0x94, 0x66, 0x9c, 0xb9, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x7e, 0x06, 0x03, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x7d, 0x68, 0x46, 0x47, 0x54, 0x61, 0x6a, 0x6a, 0x25, 0x65, 0x43, 0x6d, 0x70, 0x04, 0x17, 0xfe, 0x85, 0x01, 0x77, 0x59, 0x59, 0x6b, 0x5c, 0xfe, 0x9e, 0x03, 0x67, 0xfe, 0xab, 0x38, 0x38, 0x86, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x7e, 0x06, 0x03, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x7d, 0x68, 0x46, 0x47, 0x54, 0x61, 0x6a, 0x5d, 0x67, 0x90, 0x84, 0x3b, 0x2b, 0x25, 0x65, 0x43, 0x6d, 0x70, 0x04, 0x17, 0xfe, 0x85, 0x01, 0x77, 0x59, 0x59, 0x6b, 0x5c, 0xfe, 0x9e, 0x02, 0x84, 0x78, 0x6b, 0x57, 0x36, 0x56, 0x72, 0x38, 0x38, 0x86, 0x00, 0x02, 0xff, 0xeb, 0x01, 0xad, 0x00, 0xd7, 0x06, 0x03, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x15, 0x23, 0x6e, 0x68, 0x2f, 0x2d, 0x67, 0x28, 0x1c, 0x3c, 0x15, 0x16, 0x68, 0x68, 0x05, 0x0f, 0xfd, 0x82, 0x78, 0x36, 0x36, 0x58, 0x1b, 0x1b, 0x56, 0x03, 0x72, 0x82, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x01, 0xdd, 0x05, 0x1e, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x01, 0xdd, 0x11, 0x2a, 0x19, 0x58, 0x5e, 0x6a, 0x6a, 0x20, 0x69, 0x4c, 0x0b, 0x1a, 0x10, 0x04, 0xaf, 0x0a, 0x09, 0x71, 0x6b, 0xfe, 0xb6, 0x02, 0x73, 0x61, 0x39, 0x37, 0x02, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x02, 0x8d, 0x01, 0xb4, 0x05, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x41, 0x11, 0x29, 0x19, 0x59, 0x5e, 0x69, 0x69, 0x20, 0x69, 0x4c, 0x0b, 0x1a, 0x10, 0x02, 0xfc, 0x0a, 0x09, 0x71, 0x6b, 0x01, 0x4a, 0xfd, 0x8d, 0x61, 0x39, 0x37, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x01, 0xad, 0x02, 0x37, 0x05, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x02, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x41, 0x11, 0x29, 0x19, 0x59, 0x5e, 0x69, 0x2b, 0x3b, 0x1c, 0x28, 0x66, 0x5d, 0x20, 0x69, 0x4c, 0x0b, 0x1a, 0x10, 0x02, 0xfc, 0x0a, 0x09, 0x71, 0x6b, 0x01, 0x4a, 0xfd, 0x8d, 0x0b, 0x56, 0x36, 0x58, 0x6c, 0x78, 0x0b, 0x61, 0x39, 0x37, 0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, 0x02, 0x9c, 0x02, 0x4e, 0x05, 0x0f, 0x00, 0x16, 0x00, 0x21, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x33, 0x07, 0x06, 0x07, 0x06, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x01, 0x72, 0x3c, 0x3f, 0x3c, 0x3d, 0x7c, 0xdb, 0x68, 0x61, 0x36, 0x22, 0x21, 0x24, 0x5c, 0x6f, 0x64, 0x1d, 0x1e, 0x1f, 0xfe, 0xf5, 0x71, 0x43, 0x23, 0x25, 0x25, 0x23, 0x43, 0x71, 0x03, 0xe9, 0x0f, 0x4e, 0x3b, 0x5b, 0x2d, 0x2d, 0x02, 0x73, 0xfe, 0xf7, 0x15, 0x14, 0x3f, 0xa1, 0xab, 0x35, 0x1e, 0x1e, 0xff, 0x00, 0x17, 0x18, 0x2f, 0x2e, 0x18, 0x19, 0x00, 0x01, 0x00, 0x30, 0x02, 0x9c, 0x03, 0x85, 0x05, 0x0f, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x31, 0x68, 0x83, 0x81, 0x7b, 0x83, 0x81, 0x69, 0xa7, 0x7a, 0x89, 0x89, 0x7b, 0x05, 0x0f, 0xfe, 0x17, 0x01, 0xe9, 0xfe, 0x17, 0x01, 0xe9, 0xfd, 0x8d, 0x02, 0x02, 0xfd, 0xfe, 0x00, 0x01, 0x00, 0x22, 0x01, 0xad, 0x02, 0x8d, 0x05, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x01, 0x76, 0x2d, 0x2a, 0x29, 0x46, 0x54, 0x3d, 0x2b, 0x18, 0x18, 0x1d, 0x13, 0xfe, 0xfe, 0x6f, 0xc7, 0xc6, 0x6e, 0x02, 0x62, 0x70, 0x22, 0x23, 0x57, 0x14, 0x14, 0x4b, 0x2f, 0x02, 0x69, 0xfe, 0x16, 0x01, 0xea, 0x00, 0xff, 0xff, 0x00, 0x90, 0x04, 0x74, 0x01, 0x76, 0x06, 0x66, 0x10, 0x06, 0x03, 0x12, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0x04, 0x74, 0x02, 0xc5, 0x06, 0x66, 0x10, 0x26, 0x03, 0x12, 0x00, 0x00, 0x10, 0x07, 0x03, 0x12, 0x01, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0x03, 0xe9, 0x01, 0xa5, 0x05, 0xd5, 0x10, 0x06, 0x07, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0x03, 0xfe, 0x01, 0xa8, 0x05, 0xd5, 0x10, 0x06, 0x07, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb0, 0x04, 0xee, 0x01, 0xb9, 0x06, 0xda, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x13, 0x23, 0x03, 0x35, 0x01, 0x6e, 0x4a, 0x74, 0x94, 0x06, 0xda, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x03, 0xef, 0x01, 0x60, 0x06, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x69, 0x3a, 0x4f, 0x4f, 0x3a, 0x68, 0x48, 0x47, 0x47, 0x48, 0x03, 0xef, 0x7b, 0x58, 0x40, 0x3f, 0x58, 0x7b, 0x50, 0x4f, 0xe6, 0x50, 0x50, 0x00, 0x01, 0x00, 0x69, 0x03, 0xef, 0x01, 0x60, 0x06, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x01, 0x60, 0x68, 0x48, 0x47, 0x47, 0x48, 0x68, 0x3a, 0x4f, 0x4f, 0x3a, 0x03, 0xef, 0x50, 0x50, 0xe6, 0x4f, 0x50, 0x7b, 0x58, 0x3f, 0x40, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x49, 0x06, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x33, 0x32, 0x37, 0x36, 0x35, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x11, 0x23, 0xf8, 0x24, 0x6c, 0x32, 0x20, 0x01, 0x1f, 0x39, 0x65, 0x2e, 0x2c, 0x2d, 0x2c, 0x2b, 0x2e, 0x2e, 0x30, 0x9d, 0x4e, 0x3d, 0x3d, 0x3f, 0x60, 0x74, 0x04, 0x5b, 0x40, 0x2a, 0x37, 0x4b, 0x24, 0x40, 0x0c, 0x0c, 0x18, 0x60, 0x14, 0x09, 0x0a, 0x58, 0x46, 0x68, 0x5f, 0x40, 0x43, 0x11, 0xfe, 0x93, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x49, 0x06, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x14, 0x17, 0x16, 0x33, 0x01, 0xb9, 0x72, 0x61, 0x40, 0x3d, 0x3e, 0x4f, 0x9b, 0x30, 0x2e, 0x2e, 0x2b, 0x2c, 0x2d, 0x2c, 0x2d, 0x66, 0x38, 0x20, 0x01, 0x21, 0x31, 0x6d, 0x04, 0x5b, 0xfe, 0x41, 0x01, 0x6d, 0x11, 0x43, 0x40, 0x5f, 0x68, 0x46, 0x58, 0x0a, 0x09, 0x14, 0x60, 0x18, 0x0c, 0x0c, 0x40, 0x24, 0x4b, 0x37, 0x2a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x04, 0x32, 0x02, 0xaa, 0x06, 0xb0, 0x00, 0x06, 0x00, 0x00, 0x13, 0x25, 0x15, 0x0d, 0x01, 0x15, 0x25, 0xf0, 0x01, 0xb9, 0xfe, 0xbd, 0x01, 0x43, 0xfe, 0x47, 0x05, 0xbb, 0xf5, 0x8b, 0xb4, 0xb4, 0x8b, 0xf5, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x04, 0x32, 0x02, 0xaa, 0x06, 0xb0, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x35, 0x2d, 0x01, 0x35, 0x05, 0x02, 0xa9, 0xfe, 0x47, 0x01, 0x43, 0xfe, 0xbd, 0x01, 0xb9, 0x05, 0x27, 0xf5, 0x8b, 0xb4, 0xb4, 0x8b, 0xf5, 0x00, 0x00, 0x01, 0x00, 0xad, 0x04, 0x7c, 0x02, 0xec, 0x06, 0x66, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x8a, 0x85, 0xdd, 0x7d, 0xa2, 0xa2, 0x7d, 0x06, 0x66, 0xfe, 0x16, 0x01, 0x67, 0xfe, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x04, 0x7c, 0x02, 0xec, 0x06, 0x66, 0x00, 0x06, 0x00, 0x00, 0x01, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x01, 0x8a, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0xdd, 0x04, 0x7c, 0x01, 0xea, 0xfe, 0x99, 0x01, 0x67, 0xfe, 0x16, 0x00, 0x00, 0x01, 0x00, 0xad, 0x04, 0xee, 0x02, 0xec, 0x06, 0x66, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x07, 0x23, 0x01, 0x8a, 0x85, 0xdd, 0x7d, 0xa2, 0xa2, 0x7d, 0x06, 0x66, 0xfe, 0x88, 0xf5, 0xf5, 0x00, 0x00, 0x01, 0x00, 0xad, 0x04, 0xee, 0x02, 0xec, 0x06, 0x66, 0x00, 0x06, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x01, 0x8a, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0xdd, 0x04, 0xee, 0x01, 0x78, 0xf5, 0xf5, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x03, 0xe7, 0x01, 0x3b, 0x06, 0x12, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x3b, 0x7a, 0x06, 0x12, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0xff, 0xff, 0x00, 0xbf, 0x05, 0x62, 0x02, 0xda, 0x05, 0xf6, 0x10, 0x06, 0x00, 0x71, 0x00, 0x00, 0x00, 0x01, 0x01, 0x4d, 0x04, 0xee, 0x02, 0xfd, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x02, 0x4a, 0xb3, 0xfe, 0xdb, 0x8a, 0x06, 0x66, 0xfe, 0x88, 0x00, 0x01, 0x00, 0x99, 0x04, 0xf0, 0x02, 0x49, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x13, 0x23, 0x01, 0x01, 0x4a, 0xfe, 0x8a, 0xfe, 0xdb, 0x06, 0x66, 0xfe, 0x8a, 0x01, 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0xfe, 0xd1, 0x01, 0x3b, 0x00, 0xfc, 0x00, 0x03, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x01, 0x3b, 0x7a, 0xfc, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbf, 0xfe, 0xc0, 0x02, 0xda, 0xff, 0x54, 0x10, 0x07, 0x00, 0x71, 0x00, 0x00, 0xf9, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0xfe, 0x1c, 0x02, 0x49, 0xff, 0x92, 0x00, 0x03, 0x00, 0x00, 0x05, 0x13, 0x23, 0x01, 0x01, 0x4a, 0xfe, 0x8a, 0xfe, 0xdb, 0x6e, 0xfe, 0x8a, 0x01, 0x76, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x4d, 0xfe, 0x1c, 0x02, 0xfd, 0xff, 0x94, 0x00, 0x03, 0x00, 0x00, 0x05, 0x33, 0x01, 0x23, 0x02, 0x4a, 0xb3, 0xfe, 0xdb, 0x8a, 0x6c, 0xfe, 0x88, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x01, 0xa6, 0x04, 0x23, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x01, 0x03, 0x21, 0x03, 0x13, 0x21, 0x01, 0x04, 0xa0, 0x01, 0x41, 0xa1, 0xa1, 0xfe, 0xbf, 0x02, 0xd9, 0x01, 0x4a, 0xfd, 0x27, 0xfe, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0xd9, 0x01, 0xa6, 0x04, 0x23, 0x00, 0x02, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x04, 0xa0, 0x01, 0x41, 0x02, 0xd9, 0x01, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x01, 0xfe, 0x01, 0x60, 0x04, 0x23, 0x10, 0x07, 0x02, 0x80, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x01, 0xfe, 0x01, 0x60, 0x04, 0x23, 0x10, 0x07, 0x02, 0x81, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0xd4, 0x02, 0x98, 0x03, 0x96, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x33, 0x11, 0x33, 0x11, 0x02, 0x97, 0xfe, 0x6b, 0x87, 0x87, 0x02, 0x6a, 0x96, 0x96, 0x01, 0x2c, 0xfe, 0xd4, 0x00, 0x01, 0x01, 0x02, 0x01, 0xd4, 0x02, 0x98, 0x03, 0x96, 0x00, 0x07, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x23, 0x11, 0x23, 0x11, 0x01, 0x02, 0x01, 0x95, 0x87, 0x87, 0x03, 0x00, 0x96, 0x96, 0xfe, 0xd4, 0x01, 0x2c, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xff, 0x02, 0x75, 0x03, 0x55, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x01, 0x24, 0x87, 0xc9, 0xc9, 0x87, 0xca, 0x02, 0x75, 0xe0, 0xe0, 0x96, 0xe0, 0xe0, 0x96, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xdf, 0x01, 0xef, 0x02, 0x75, 0x00, 0x03, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x01, 0xef, 0xfe, 0x6b, 0x01, 0x95, 0x01, 0xdf, 0x96, 0x00, 0x00, 0x01, 0x00, 0xb3, 0x05, 0x29, 0x02, 0xe7, 0x06, 0x48, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0xb3, 0x6a, 0x0a, 0x57, 0x4f, 0x4d, 0x57, 0x0b, 0x6a, 0x08, 0x8f, 0x82, 0x83, 0x8e, 0x06, 0x48, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x00, 0x00, 0x01, 0x01, 0x71, 0x05, 0x44, 0x02, 0x29, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x01, 0x71, 0xb8, 0xb8, 0x06, 0x10, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd6, 0x04, 0xe1, 0x02, 0xc4, 0x07, 0x06, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x02, 0x56, 0x50, 0x39, 0x3b, 0x4e, 0x4e, 0x3b, 0x39, 0x50, 0x6d, 0x8f, 0x67, 0x68, 0x8f, 0x8f, 0x68, 0x67, 0x8f, 0x05, 0xf4, 0x3f, 0x58, 0x57, 0x40, 0x41, 0x57, 0x58, 0x40, 0x73, 0xa0, 0xa0, 0x73, 0x73, 0x9f, 0x9f, 0x00, 0x01, 0x01, 0x2a, 0xfe, 0x75, 0x02, 0x7b, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x21, 0x33, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x8c, 0x6b, 0x28, 0x27, 0x31, 0x31, 0x1d, 0x38, 0x1b, 0x22, 0x3d, 0x1b, 0x6e, 0x67, 0x2f, 0x3d, 0x58, 0x1f, 0x2e, 0x2e, 0x0f, 0x0f, 0x85, 0x0a, 0x0a, 0x57, 0x5d, 0x30, 0x69, 0x00, 0x01, 0x00, 0xa3, 0x05, 0x1d, 0x02, 0xf6, 0x06, 0x37, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x01, 0xc9, 0x33, 0x14, 0x1e, 0x0b, 0x23, 0x20, 0x02, 0x70, 0x02, 0x5b, 0x52, 0x23, 0x39, 0x21, 0x34, 0x14, 0x1d, 0x0c, 0x22, 0x21, 0x01, 0x71, 0x02, 0x5c, 0x52, 0x22, 0x3a, 0x05, 0x5a, 0x37, 0x14, 0x13, 0x49, 0x52, 0x87, 0x93, 0x1c, 0x21, 0x37, 0x14, 0x13, 0x49, 0x52, 0x87, 0x93, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd8, 0x04, 0xee, 0x03, 0x50, 0x06, 0x66, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x03, 0x33, 0x03, 0x23, 0x02, 0xb0, 0xa0, 0xdf, 0x7a, 0x74, 0x99, 0xc9, 0x7b, 0x06, 0x66, 0xfe, 0x88, 0x01, 0x78, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x01, 0xde, 0x02, 0x69, 0x04, 0x08, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x37, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x07, 0x01, 0xfa, 0xa6, 0x22, 0x22, 0x5f, 0x26, 0x39, 0x9e, 0x4e, 0x4a, 0xf9, 0x03, 0x64, 0xa4, 0x94, 0x99, 0x31, 0x30, 0x9c, 0x60, 0x5a, 0xc8, 0xa2, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd7, 0x04, 0xee, 0x02, 0xc2, 0x06, 0x66, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x27, 0x07, 0x23, 0x37, 0x27, 0x33, 0x17, 0x37, 0x33, 0x07, 0x17, 0x02, 0x20, 0x53, 0x54, 0xa2, 0xa3, 0xa3, 0xa2, 0x54, 0x53, 0xa2, 0xa4, 0xa4, 0x04, 0xee, 0x61, 0x61, 0xbb, 0xbd, 0x60, 0x60, 0xbd, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x01, 0xab, 0x02, 0xb1, 0x05, 0x0f, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x00, 0x01, 0x16, 0x15, 0x14, 0x23, 0x22, 0x35, 0x34, 0x37, 0x03, 0x33, 0x17, 0x37, 0x33, 0x01, 0x06, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x01, 0xd1, 0xa1, 0xda, 0xf1, 0xa3, 0xe1, 0x7c, 0xab, 0xa5, 0x7b, 0xfe, 0xdd, 0x7b, 0x7a, 0x74, 0x03, 0xdc, 0xf9, 0xb4, 0x84, 0x84, 0xbf, 0xf2, 0x01, 0x2f, 0xe0, 0xe0, 0xfe, 0x8a, 0xae, 0x98, 0x4d, 0x4d, 0x89, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6d, 0x02, 0x9c, 0x00, 0xd7, 0x06, 0x03, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x6e, 0x68, 0x68, 0x06, 0x03, 0xfc, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x4f, 0x05, 0x2f, 0x00, 0x32, 0x00, 0x00, 0x01, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x02, 0x2c, 0x2c, 0x30, 0x2e, 0x34, 0x4e, 0x27, 0x26, 0x1b, 0x1c, 0x54, 0x24, 0x71, 0x2d, 0x2e, 0x46, 0x45, 0x7b, 0x33, 0x38, 0x37, 0x3d, 0x3a, 0x39, 0x37, 0x37, 0x4a, 0x4f, 0x1d, 0x19, 0x64, 0x24, 0x61, 0x2b, 0x2b, 0x40, 0x3f, 0x75, 0x39, 0x34, 0x33, 0x05, 0x0d, 0x61, 0x16, 0x0b, 0x0b, 0x17, 0x18, 0x2f, 0x24, 0x14, 0x15, 0x12, 0x08, 0x18, 0x2a, 0x2b, 0x4d, 0x57, 0x33, 0x33, 0x0a, 0x0a, 0x13, 0x6b, 0x1e, 0x0f, 0x0f, 0x32, 0x2d, 0x2a, 0x17, 0x14, 0x17, 0x08, 0x15, 0x29, 0x2a, 0x49, 0x58, 0x30, 0x31, 0x09, 0x08, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0xd1, 0x05, 0x0f, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x03, 0x13, 0x23, 0x27, 0x07, 0x23, 0x13, 0x03, 0x33, 0x17, 0x37, 0x02, 0xc5, 0xe5, 0xf1, 0x7b, 0xb9, 0xb8, 0x7c, 0xf7, 0xe2, 0x7b, 0xa9, 0xa8, 0x05, 0x0f, 0xfe, 0xcf, 0xfe, 0xbe, 0xf6, 0xf6, 0x01, 0x48, 0x01, 0x2b, 0xdf, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x49, 0x06, 0x02, 0x10, 0x06, 0x02, 0x83, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, 0x53, 0xfe, 0x6e, 0x02, 0x0c, 0x04, 0xd0, 0x88, 0xfa, 0xa8, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x02, 0x53, 0xfe, 0x6e, 0x01, 0x92, 0x7a, 0x03, 0x9c, 0x88, 0x01, 0x34, 0xfa, 0xa8, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x02, 0x53, 0xfe, 0x6e, 0x01, 0x92, 0x7a, 0x02, 0x68, 0x88, 0x02, 0x68, 0xfa, 0xa8, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x02, 0x53, 0xfe, 0x6e, 0x01, 0x92, 0x7a, 0x01, 0x34, 0x88, 0x03, 0x9c, 0xfa, 0xa8, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x25, 0x11, 0x33, 0x11, 0x21, 0x35, 0x02, 0x53, 0x7a, 0xfd, 0xf4, 0x88, 0x04, 0xd0, 0xfa, 0xa8, 0x88, 0x00, 0xff, 0xff, 0x00, 0xad, 0xfd, 0xec, 0x02, 0xec, 0xff, 0xd6, 0x10, 0x07, 0x02, 0x87, 0x00, 0x00, 0xf9, 0x70, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbf, 0x04, 0xe2, 0x02, 0xda, 0x06, 0x76, 0x12, 0x27, 0x00, 0x71, 0x00, 0x00, 0x00, 0x80, 0x12, 0x06, 0x00, 0x71, 0x00, 0x80, 0xff, 0xff, 0x00, 0x9c, 0x03, 0xe9, 0x03, 0x16, 0x05, 0xd5, 0x12, 0x06, 0x07, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd6, 0xfe, 0x14, 0x02, 0xc4, 0x00, 0x39, 0x10, 0x07, 0x02, 0x9c, 0x00, 0x00, 0xf9, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa3, 0xfe, 0x76, 0x02, 0xf6, 0xff, 0x90, 0x00, 0x21, 0x00, 0x00, 0x01, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x01, 0xc9, 0x33, 0x14, 0x0f, 0x0f, 0x0b, 0x23, 0x10, 0x10, 0x02, 0x70, 0x02, 0x2e, 0x2d, 0x52, 0x23, 0x39, 0x21, 0x34, 0x14, 0x0f, 0x0e, 0x0c, 0x22, 0x10, 0x11, 0x01, 0x71, 0x02, 0x2e, 0x2e, 0x52, 0x22, 0x3a, 0xfe, 0xb3, 0x37, 0x14, 0x0a, 0x09, 0x25, 0x24, 0x52, 0x87, 0x49, 0x4a, 0x1c, 0x21, 0x37, 0x14, 0x0a, 0x09, 0x25, 0x24, 0x52, 0x87, 0x49, 0x4a, 0x1c, 0x00, 0x02, 0xfc, 0xfd, 0x04, 0x7b, 0xfe, 0xad, 0x06, 0x66, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x01, 0x13, 0x23, 0x09, 0x01, 0xfd, 0xaf, 0xfe, 0x8a, 0xfe, 0xdb, 0x01, 0x35, 0x06, 0x66, 0xfe, 0x8a, 0x01, 0x76, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0xb2, 0x04, 0x7b, 0xff, 0x62, 0x06, 0x66, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x17, 0xfe, 0xae, 0xb4, 0xfe, 0xda, 0x8a, 0x81, 0x06, 0x66, 0xfe, 0x88, 0x73, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x14, 0x04, 0x7b, 0xff, 0x53, 0x06, 0x66, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x07, 0x23, 0x05, 0xfd, 0xf1, 0x85, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0x01, 0x1f, 0x06, 0x66, 0xfe, 0x88, 0xf5, 0xf5, 0x73, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x08, 0x05, 0x1d, 0xff, 0x5b, 0x06, 0x37, 0x10, 0x07, 0x02, 0x9e, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x29, 0x05, 0x62, 0xff, 0x44, 0x05, 0xf6, 0x10, 0x07, 0x00, 0x71, 0xfc, 0x6a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x54, 0x05, 0x7c, 0x00, 0x12, 0x06, 0x0b, 0x10, 0x07, 0x07, 0x73, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x12, 0x05, 0x29, 0xff, 0x46, 0x06, 0x48, 0x10, 0x07, 0x02, 0x9a, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0xde, 0x04, 0x7b, 0xfe, 0x85, 0x06, 0x14, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x17, 0xfd, 0xdf, 0xa5, 0xa5, 0x54, 0x06, 0x14, 0xe9, 0xb0, 0x00, 0x00, 0x00, 0x03, 0xfd, 0x27, 0x04, 0x7b, 0xff, 0x3f, 0x06, 0x10, 0x00, 0x03, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0xfe, 0x88, 0xb6, 0xb6, 0xfe, 0xa0, 0xb7, 0xb7, 0x01, 0x0b, 0x06, 0x10, 0xca, 0xca, 0xca, 0xcb, 0x00, 0x00, 0x01, 0xfd, 0x7e, 0x04, 0xf2, 0xff, 0x12, 0x06, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x01, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x15, 0x23, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0xfd, 0x7e, 0x65, 0x5e, 0x5e, 0x73, 0x50, 0x27, 0x20, 0x03, 0x07, 0x6b, 0x1c, 0x2d, 0x29, 0x29, 0x38, 0x40, 0x51, 0x5a, 0x06, 0x48, 0x33, 0x55, 0x43, 0x3d, 0x41, 0x20, 0x1a, 0x09, 0x10, 0x20, 0x0c, 0x28, 0x36, 0x25, 0x22, 0x22, 0x28, 0x15, 0x24, 0x34, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x3a, 0x04, 0xe1, 0xff, 0x28, 0x07, 0x06, 0x10, 0x07, 0x02, 0x9c, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x42, 0x04, 0xee, 0xff, 0xba, 0x06, 0x66, 0x10, 0x07, 0x02, 0x9f, 0xfc, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x17, 0x04, 0x7b, 0xff, 0x56, 0x06, 0x66, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x07, 0xfd, 0xf4, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0xdd, 0x46, 0x04, 0xee, 0x01, 0x78, 0xf5, 0xf5, 0xfe, 0x88, 0x73, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xf6, 0x04, 0xec, 0xfe, 0x71, 0x06, 0xa8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0xfe, 0x70, 0x7a, 0x06, 0xa8, 0xfe, 0x44, 0x01, 0xbc, 0x00, 0xff, 0xff, 0xfd, 0x3e, 0x04, 0xec, 0xff, 0x28, 0x06, 0xa8, 0x10, 0x27, 0x02, 0xbe, 0xff, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xbe, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfc, 0xba, 0x04, 0xee, 0xff, 0x32, 0x06, 0x66, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x13, 0x23, 0x03, 0x21, 0x13, 0x23, 0x03, 0xfd, 0x5a, 0xb9, 0x7a, 0xdf, 0x01, 0xcd, 0xab, 0x7b, 0xc9, 0x06, 0x66, 0xfe, 0x88, 0x01, 0x78, 0xfe, 0x88, 0x01, 0x78, 0xff, 0xff, 0xfd, 0x12, 0x05, 0x29, 0xff, 0x46, 0x07, 0x56, 0x10, 0x27, 0x02, 0xb8, 0x00, 0x00, 0x01, 0x42, 0x10, 0x07, 0x02, 0x9a, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x12, 0x05, 0x29, 0xff, 0x46, 0x06, 0x48, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0xba, 0x6a, 0x0a, 0x58, 0x4e, 0x4d, 0x57, 0x0c, 0x6a, 0x09, 0x8f, 0x01, 0x04, 0x8f, 0x05, 0x29, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x4f, 0x03, 0xe9, 0xff, 0x57, 0x05, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x23, 0x13, 0x33, 0xf3, 0xbe, 0x94, 0x74, 0x03, 0xe9, 0x01, 0x3f, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xce, 0x04, 0xc2, 0xfe, 0xa8, 0x06, 0xc1, 0x00, 0x08, 0x00, 0x00, 0x01, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0xfe, 0xa8, 0xda, 0x65, 0x64, 0xd9, 0x05, 0xc3, 0xfe, 0xff, 0x7b, 0x03, 0x89, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xce, 0x04, 0xc2, 0xfe, 0xa8, 0x06, 0xc1, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x23, 0x14, 0x37, 0x15, 0x22, 0xfd, 0xce, 0xd9, 0x64, 0x65, 0xda, 0x05, 0xc3, 0xfe, 0xfe, 0x89, 0x03, 0x7b, 0x00, 0x01, 0xff, 0x86, 0x04, 0x9a, 0x00, 0x7a, 0x06, 0x12, 0x00, 0x03, 0x00, 0x00, 0x03, 0x33, 0x03, 0x23, 0x3a, 0xb4, 0x6a, 0x8a, 0x06, 0x12, 0xfe, 0x88, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xfd, 0xfd, 0xdf, 0xfe, 0xad, 0xff, 0x55, 0x10, 0x07, 0x00, 0x43, 0xfc, 0x65, 0xf8, 0xef, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xb2, 0xfd, 0xdd, 0xff, 0x62, 0xff, 0x55, 0x10, 0x07, 0x00, 0x76, 0xfc, 0x65, 0xf8, 0xef, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x6d, 0xfe, 0x14, 0xfe, 0x6a, 0xff, 0xce, 0x00, 0x07, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x35, 0x33, 0x11, 0x23, 0xfd, 0xfd, 0x90, 0x90, 0x6c, 0x6c, 0xfe, 0xb5, 0x78, 0xa1, 0xfe, 0x46, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xfd, 0xfe, 0x14, 0xfe, 0xfa, 0xff, 0xce, 0x00, 0x07, 0x00, 0x00, 0x05, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0xfd, 0xfd, 0x6c, 0x90, 0x90, 0x6c, 0x32, 0xa1, 0x78, 0xa1, 0x00, 0x01, 0xfe, 0x7f, 0x05, 0x86, 0x00, 0x39, 0x07, 0x70, 0x00, 0x05, 0x00, 0x00, 0x03, 0x21, 0x35, 0x21, 0x11, 0x23, 0x42, 0xfe, 0xc2, 0x01, 0xb9, 0x7b, 0x06, 0xe8, 0x88, 0xfe, 0x16, 0x00, 0x00, 0x01, 0xff, 0x0b, 0x03, 0x6b, 0x00, 0x6f, 0x04, 0xe0, 0x00, 0x13, 0x00, 0x00, 0x03, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xf5, 0x37, 0x4f, 0x1c, 0x2a, 0x29, 0x0e, 0x0d, 0x78, 0x09, 0x09, 0x4f, 0x53, 0x2b, 0x5f, 0x03, 0xd7, 0x77, 0x2d, 0x2b, 0x37, 0x36, 0x20, 0x3e, 0x1f, 0x26, 0x44, 0x1e, 0x7a, 0x73, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xc0, 0xfe, 0x12, 0xfe, 0x81, 0xff, 0xbe, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0xfe, 0x81, 0x51, 0x70, 0x70, 0x51, 0x24, 0x30, 0x30, 0x24, 0xfe, 0x12, 0x7d, 0x5a, 0x59, 0x7c, 0x78, 0x35, 0x27, 0x28, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x56, 0xfe, 0x14, 0xff, 0x10, 0xff, 0x4d, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x33, 0xfe, 0x70, 0xa0, 0xfe, 0x47, 0x9f, 0x7a, 0xfe, 0x9c, 0x88, 0x88, 0xb1, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x56, 0xfe, 0x14, 0xff, 0x10, 0xff, 0x4d, 0x00, 0x07, 0x00, 0x00, 0x01, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x23, 0xfd, 0xf6, 0x9f, 0x01, 0xb9, 0xa0, 0x7a, 0xfe, 0xc5, 0x88, 0x88, 0xb1, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x6d, 0xfe, 0x14, 0xfe, 0xfa, 0xff, 0xce, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0xfd, 0xfd, 0x90, 0x90, 0x6c, 0x90, 0x90, 0x6c, 0xfe, 0xb5, 0x78, 0xa1, 0xa1, 0x78, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x56, 0xfe, 0x88, 0xff, 0x10, 0xff, 0x10, 0x00, 0x03, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0xfd, 0x57, 0x01, 0xb9, 0xfe, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xba, 0xfe, 0x56, 0xff, 0xd5, 0x00, 0x80, 0x00, 0x0d, 0x00, 0x00, 0x27, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x2b, 0x4a, 0x49, 0xa3, 0xe4, 0xd1, 0x5f, 0x22, 0x22, 0x80, 0x94, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x94, 0x00, 0x00, 0x01, 0xfd, 0xb7, 0xfe, 0x56, 0xff, 0xd3, 0x00, 0x80, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0xfd, 0xb8, 0xa6, 0x22, 0x22, 0x5e, 0xd2, 0xe4, 0xa3, 0x49, 0x4a, 0x80, 0x94, 0x99, 0x31, 0x30, 0x9c, 0x60, 0x60, 0xd6, 0x00, 0x01, 0xfd, 0xde, 0xfe, 0x89, 0xfe, 0x85, 0xff, 0x73, 0x00, 0x03, 0x00, 0x00, 0x05, 0x33, 0x15, 0x23, 0xfd, 0xdf, 0xa5, 0xa5, 0x8d, 0xea, 0xff, 0xff, 0xfd, 0x26, 0xfe, 0x89, 0xff, 0x3d, 0xff, 0x53, 0x10, 0x07, 0x00, 0x6a, 0xfc, 0x65, 0xf9, 0x43, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x70, 0xfe, 0x12, 0xfe, 0xf2, 0xff, 0xbe, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xfe, 0x85, 0x31, 0x23, 0x24, 0x2f, 0x2f, 0x24, 0x23, 0x31, 0x6d, 0x70, 0x51, 0x51, 0x6f, 0x6f, 0x51, 0x51, 0x70, 0xfe, 0xea, 0x26, 0x36, 0x35, 0x27, 0x28, 0x35, 0x36, 0x26, 0x5a, 0x7d, 0x7d, 0x5a, 0x59, 0x7c, 0x7c, 0x00, 0x01, 0xfd, 0xac, 0xfe, 0x14, 0xfe, 0xb4, 0xff, 0x54, 0x00, 0x03, 0x00, 0x00, 0x05, 0x33, 0x03, 0x23, 0xfd, 0xf6, 0xbe, 0x94, 0x74, 0xac, 0xfe, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x6c, 0xfe, 0x75, 0xfe, 0xe1, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x91, 0xfe, 0x75, 0xfe, 0xe1, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xf6, 0xfe, 0x14, 0xfe, 0x71, 0xff, 0xa0, 0x00, 0x03, 0x00, 0x00, 0x05, 0x11, 0x23, 0x11, 0xfe, 0x70, 0x7a, 0x60, 0xfe, 0x74, 0x01, 0x8c, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x3e, 0xfe, 0x50, 0xff, 0x2f, 0xff, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x07, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0xd2, 0x7b, 0xf9, 0x7c, 0x66, 0xfe, 0xb6, 0xc2, 0xc2, 0x01, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xbf, 0xfe, 0x39, 0xff, 0xa3, 0xff, 0x58, 0x00, 0x14, 0x00, 0x00, 0x01, 0x06, 0x23, 0x22, 0x03, 0x34, 0x35, 0x33, 0x16, 0x33, 0x32, 0x37, 0x33, 0x16, 0x17, 0x32, 0x37, 0x33, 0x02, 0x07, 0x22, 0xfe, 0x31, 0x36, 0x68, 0xc4, 0x0f, 0x69, 0x0c, 0x5e, 0x5b, 0x0e, 0x6a, 0x0b, 0x5e, 0x5b, 0x0e, 0x6a, 0x0d, 0xc6, 0x68, 0xfe, 0x8b, 0x52, 0x01, 0x1a, 0x02, 0x03, 0x96, 0x96, 0x95, 0x01, 0x96, 0xfe, 0xe2, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x17, 0xfe, 0x14, 0xff, 0x56, 0xff, 0x8c, 0x11, 0x07, 0x02, 0x89, 0xfc, 0x6a, 0xf9, 0x26, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x12, 0xfe, 0x14, 0xff, 0x51, 0xff, 0x8c, 0x11, 0x07, 0x02, 0x88, 0xfc, 0x65, 0xf9, 0x26, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x12, 0xfe, 0x39, 0xff, 0x46, 0xff, 0x58, 0x10, 0x07, 0x02, 0x9a, 0xfc, 0x5f, 0xf9, 0x10, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x12, 0xfe, 0x36, 0xff, 0x46, 0xff, 0x55, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0xba, 0x6a, 0x0a, 0x58, 0x4e, 0x4d, 0x57, 0x0c, 0x6a, 0x09, 0x8f, 0x01, 0x04, 0x8f, 0xfe, 0x36, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x08, 0xfe, 0x39, 0xff, 0x5b, 0xff, 0x53, 0x10, 0x07, 0x02, 0x9e, 0xfc, 0x65, 0xf9, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x29, 0xfe, 0xc0, 0xff, 0x44, 0xff, 0x54, 0x10, 0x07, 0x02, 0x8f, 0xfc, 0x6a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x54, 0xfe, 0x1d, 0x00, 0x12, 0xfe, 0xac, 0x10, 0x07, 0x00, 0x42, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x54, 0xfe, 0x1d, 0x00, 0x12, 0xff, 0xee, 0x10, 0x07, 0x07, 0x4c, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfb, 0xfe, 0x01, 0xec, 0xff, 0xb6, 0x03, 0x0c, 0x00, 0x1b, 0x00, 0x00, 0x03, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x4b, 0x43, 0x81, 0x47, 0x51, 0x66, 0x13, 0x0a, 0x46, 0x5c, 0x2e, 0x47, 0x7f, 0x42, 0x46, 0x84, 0x4a, 0x30, 0x5a, 0x43, 0x0a, 0x13, 0x69, 0x53, 0x3f, 0x7c, 0x03, 0x0c, 0xae, 0x3b, 0x37, 0x33, 0x0a, 0x04, 0x21, 0x18, 0x3b, 0x3f, 0xae, 0x3c, 0x36, 0x16, 0x1f, 0x05, 0x0a, 0x37, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xb8, 0x01, 0xc4, 0xff, 0x94, 0x02, 0x68, 0x00, 0x03, 0x00, 0x00, 0x03, 0x15, 0x21, 0x35, 0x6c, 0xfe, 0x25, 0x02, 0x68, 0xa4, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfb, 0x6e, 0x01, 0xc4, 0x00, 0x00, 0x02, 0x68, 0x00, 0x03, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0xfb, 0x6f, 0x04, 0x90, 0x01, 0xc4, 0xa4, 0xa4, 0x00, 0x00, 0x00, 0x01, 0xfb, 0xdd, 0xff, 0xa2, 0xff, 0xc3, 0x04, 0xbc, 0x00, 0x03, 0x00, 0x00, 0x05, 0x27, 0x01, 0x17, 0xfc, 0x34, 0x56, 0x03, 0x8f, 0x56, 0x5e, 0x4e, 0x04, 0xcc, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfa, 0xa9, 0xff, 0xba, 0xff, 0x9d, 0x06, 0x17, 0x00, 0x03, 0x00, 0x00, 0x05, 0x27, 0x01, 0x17, 0xfb, 0x06, 0x5c, 0x04, 0x96, 0x5c, 0x46, 0x58, 0x06, 0x05, 0x59, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xe7, 0xfe, 0x12, 0xfe, 0xa9, 0xff, 0xbe, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0xfd, 0xe8, 0x51, 0x6f, 0x6f, 0x51, 0x24, 0x2f, 0x2f, 0x24, 0x42, 0x7d, 0x5a, 0x59, 0x7c, 0x78, 0x35, 0x27, 0x28, 0x35, 0x00, 0x01, 0xfd, 0x3f, 0xfe, 0x5b, 0xff, 0x30, 0xff, 0xa5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0xfd, 0x3f, 0x7c, 0xf9, 0x7b, 0xfe, 0x5b, 0x01, 0x4a, 0xc2, 0xc2, 0xfe, 0xb6, 0x00, 0x00, 0x02, 0xfd, 0x6a, 0xfe, 0x14, 0xff, 0x00, 0xff, 0xd6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x11, 0x21, 0x11, 0x01, 0x35, 0x23, 0x15, 0xff, 0x00, 0xfe, 0x6a, 0x01, 0x2a, 0xbe, 0x2a, 0xfe, 0x3e, 0x01, 0xc2, 0xfe, 0xb6, 0xd2, 0xd2, 0x00, 0x01, 0xfc, 0xbf, 0xfe, 0x39, 0xff, 0xa3, 0xff, 0x58, 0x00, 0x14, 0x00, 0x00, 0x05, 0x36, 0x33, 0x32, 0x13, 0x14, 0x15, 0x23, 0x26, 0x23, 0x22, 0x07, 0x23, 0x26, 0x27, 0x22, 0x07, 0x23, 0x12, 0x37, 0x32, 0xfe, 0x31, 0x36, 0x68, 0xc4, 0x0f, 0x69, 0x0c, 0x5e, 0x5b, 0x0e, 0x6a, 0x0b, 0x5e, 0x5b, 0x0e, 0x6a, 0x0d, 0xc6, 0x68, 0xfa, 0x52, 0xfe, 0xe6, 0x02, 0x03, 0x96, 0x96, 0x95, 0x01, 0x96, 0x01, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x73, 0x04, 0xf3, 0xff, 0x02, 0x06, 0xad, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0xfe, 0x3a, 0x70, 0x56, 0x70, 0x70, 0x56, 0x70, 0x71, 0x56, 0x70, 0x70, 0x56, 0x05, 0x70, 0x7d, 0x60, 0x7d, 0x7d, 0x60, 0x7d, 0x7d, 0x60, 0x7d, 0x7d, 0x60, 0x00, 0x01, 0xfe, 0x38, 0x04, 0xc2, 0xff, 0x37, 0x06, 0xd2, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x27, 0xfe, 0x70, 0x1e, 0x19, 0x84, 0x79, 0x49, 0x42, 0x08, 0x0b, 0x10, 0x32, 0x1d, 0x19, 0x84, 0x79, 0x49, 0x42, 0x08, 0x0b, 0x10, 0x05, 0xc7, 0x1c, 0x30, 0x1c, 0x50, 0x51, 0x02, 0x6e, 0x02, 0x1b, 0x1c, 0x0a, 0x0c, 0x0f, 0x0e, 0x2b, 0x1c, 0x30, 0x1c, 0x50, 0x51, 0x02, 0x6e, 0x02, 0x1b, 0x1c, 0x0a, 0x0c, 0x0f, 0x0e, 0xff, 0xff, 0xfc, 0x54, 0x04, 0x3a, 0x00, 0x12, 0x06, 0x0b, 0x10, 0x27, 0x07, 0x73, 0xfc, 0x66, 0x00, 0x00, 0x10, 0x07, 0x07, 0x73, 0xfc, 0x66, 0xfe, 0xbe, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xfd, 0x04, 0xf0, 0xfe, 0xad, 0x06, 0x66, 0x10, 0x07, 0x00, 0x43, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xb2, 0x04, 0xee, 0xff, 0x62, 0x06, 0x66, 0x10, 0x07, 0x00, 0x76, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x08, 0x05, 0x1d, 0xff, 0x5b, 0x06, 0x37, 0x10, 0x07, 0x02, 0x9e, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xce, 0x04, 0xc2, 0xfe, 0xa8, 0x06, 0xc1, 0x10, 0x06, 0x02, 0xc4, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x36, 0x05, 0x46, 0xff, 0x72, 0x07, 0xd2, 0x10, 0x07, 0x03, 0x1c, 0xfc, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0x56, 0xfe, 0xc5, 0xff, 0xa4, 0x10, 0x07, 0x03, 0x16, 0xfc, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x26, 0x05, 0x1d, 0xff, 0x41, 0x06, 0x49, 0x00, 0x07, 0x00, 0x00, 0x03, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x21, 0xc0, 0x87, 0xfe, 0xf4, 0x87, 0x02, 0x1a, 0x05, 0x1d, 0x96, 0x96, 0x01, 0x2c, 0x00, 0x00, 0x02, 0xfd, 0x68, 0xfe, 0x32, 0xfe, 0xfe, 0xff, 0xb8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0xfe, 0xfe, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x32, 0x78, 0x96, 0x78, 0x00, 0x00, 0x02, 0xfd, 0x5f, 0xfe, 0x14, 0xff, 0x07, 0xff, 0xa0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0xfd, 0x60, 0x87, 0x87, 0x01, 0x20, 0x87, 0x87, 0x60, 0xfe, 0x74, 0x01, 0x8c, 0xfe, 0x74, 0x00, 0x00, 0x01, 0xfd, 0x68, 0xfe, 0x14, 0xfe, 0xfe, 0xff, 0xd6, 0x00, 0x05, 0x00, 0x00, 0x05, 0x21, 0x11, 0x23, 0x11, 0x21, 0xfd, 0x69, 0x01, 0x95, 0x87, 0xfe, 0xf2, 0x2a, 0xfe, 0x3e, 0x01, 0x2c, 0x00, 0x01, 0xfd, 0x0a, 0x04, 0xee, 0xff, 0x5d, 0x06, 0x66, 0x00, 0x27, 0x00, 0x00, 0x01, 0x37, 0x33, 0x07, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0xfe, 0x32, 0x3c, 0x62, 0x60, 0x09, 0x14, 0x0f, 0x0b, 0x23, 0x10, 0x10, 0x02, 0x70, 0x02, 0x2e, 0x2d, 0x52, 0x23, 0x1c, 0x1b, 0x1e, 0x3b, 0x63, 0x60, 0x0c, 0x12, 0x0e, 0x0c, 0x22, 0x10, 0x11, 0x01, 0x71, 0x02, 0x2e, 0x2e, 0x52, 0x22, 0x1d, 0x1b, 0x05, 0xff, 0x67, 0xa9, 0x09, 0x0e, 0x0a, 0x24, 0x25, 0x52, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x1d, 0x67, 0xa8, 0x0b, 0x0d, 0x0a, 0x24, 0x25, 0x52, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x00, 0x03, 0xfd, 0x0a, 0x04, 0x89, 0xff, 0x5d, 0x06, 0xcc, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x00, 0x01, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x07, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0xfe, 0x30, 0x34, 0x16, 0x1c, 0x0b, 0x20, 0x24, 0x71, 0x5d, 0x4d, 0x21, 0x37, 0x2b, 0x33, 0x15, 0x1e, 0x0e, 0x1d, 0x24, 0x70, 0x02, 0x5c, 0x4c, 0x1e, 0x36, 0xd0, 0x87, 0x87, 0xbd, 0x87, 0x87, 0x05, 0x68, 0x21, 0x0e, 0x0b, 0x32, 0x2d, 0x06, 0x65, 0x76, 0x10, 0x1b, 0x1e, 0x0d, 0x0c, 0x33, 0x29, 0x06, 0x64, 0x77, 0x10, 0x2e, 0x96, 0x02, 0x43, 0x96, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x0a, 0x04, 0xc5, 0xff, 0x5d, 0x06, 0x90, 0x10, 0x22, 0x10, 0xed, 0x00, 0xb7, 0x10, 0x03, 0x10, 0xed, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x01, 0xfc, 0xbf, 0xfe, 0x28, 0xff, 0xa7, 0xff, 0xc2, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x37, 0x21, 0x17, 0x23, 0x27, 0x37, 0x33, 0x07, 0x21, 0x27, 0x33, 0x17, 0x07, 0xfe, 0x98, 0x77, 0xfe, 0x49, 0x77, 0x72, 0x9d, 0x9d, 0x72, 0x77, 0x01, 0xb7, 0x77, 0x71, 0x9e, 0x9e, 0xfe, 0x28, 0x9b, 0x9b, 0xcd, 0xcd, 0x9b, 0x9b, 0xcd, 0xcd, 0x00, 0x00, 0x01, 0xfd, 0x7a, 0xfe, 0x14, 0xfe, 0xec, 0xff, 0xa4, 0x00, 0x08, 0x00, 0x00, 0x01, 0x23, 0x35, 0x07, 0x35, 0x37, 0x17, 0x15, 0x27, 0xfe, 0x60, 0x5a, 0x8b, 0xb8, 0xb9, 0x8c, 0xfe, 0x14, 0xe7, 0x84, 0x7e, 0xaf, 0xaf, 0x7e, 0x84, 0x00, 0x00, 0x01, 0xfd, 0xb8, 0x04, 0xe1, 0xfe, 0xae, 0x07, 0x06, 0x00, 0x10, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0xfe, 0xae, 0x3a, 0x26, 0x27, 0x27, 0x26, 0x3a, 0x67, 0x46, 0x48, 0x48, 0x46, 0x67, 0x06, 0x8b, 0x01, 0x2a, 0x2c, 0x40, 0x41, 0x2b, 0x2b, 0x01, 0x7b, 0x01, 0x4f, 0x50, 0xe6, 0x50, 0x4e, 0x01, 0x00, 0xff, 0xff, 0xfd, 0x12, 0x04, 0x60, 0xff, 0x46, 0x06, 0xd8, 0x10, 0x27, 0x02, 0xc2, 0x00, 0x00, 0x00, 0x90, 0x10, 0x06, 0x02, 0xb8, 0x00, 0xe5, 0xff, 0xff, 0xfd, 0x73, 0xfe, 0x14, 0xff, 0x02, 0xff, 0xce, 0x10, 0x07, 0x02, 0xee, 0x00, 0x00, 0xf9, 0x21, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xb8, 0x04, 0xe1, 0xfe, 0xae, 0x07, 0x06, 0x00, 0x12, 0x00, 0x00, 0x01, 0x30, 0x35, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x30, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0xfd, 0xb9, 0x66, 0x47, 0x48, 0x48, 0x47, 0x66, 0x39, 0x26, 0x28, 0x28, 0x26, 0x06, 0x8b, 0x7b, 0x01, 0x4e, 0x50, 0xe6, 0x50, 0x4f, 0x01, 0x7b, 0x01, 0x2b, 0x2b, 0x41, 0x40, 0x2c, 0x2a, 0xff, 0xff, 0xff, 0x43, 0x05, 0x44, 0xff, 0xfb, 0x06, 0x10, 0x10, 0x07, 0x02, 0x9b, 0xfd, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0xe8, 0xfe, 0x12, 0xff, 0x7e, 0xff, 0xbf, 0x00, 0x07, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x16, 0x32, 0x3e, 0x01, 0x26, 0x22, 0x06, 0x37, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x27, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x12, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0xfd, 0x55, 0x30, 0x47, 0x2f, 0x02, 0x31, 0x47, 0x30, 0xde, 0x38, 0xa3, 0x70, 0x70, 0xa4, 0x37, 0x38, 0xa3, 0x70, 0x70, 0xa3, 0xe5, 0x31, 0x31, 0x47, 0x30, 0x30, 0xfe, 0xc3, 0x35, 0x35, 0x4d, 0x37, 0x35, 0x6d, 0x3f, 0x7c, 0xb3, 0x7d, 0x41, 0x40, 0x7d, 0xb3, 0x7c, 0xfe, 0xce, 0x36, 0x4d, 0x36, 0x35, 0x4f, 0x35, 0xff, 0xff, 0xfc, 0xcb, 0xfe, 0x1b, 0x03, 0x35, 0xff, 0x85, 0x10, 0x07, 0x07, 0x74, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xcb, 0x06, 0x6b, 0x03, 0x35, 0x07, 0xd5, 0x10, 0x07, 0x07, 0x74, 0xfd, 0x1b, 0x08, 0x50, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xcb, 0x06, 0xd7, 0x03, 0x35, 0x07, 0x6b, 0x00, 0x03, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0xfc, 0xcb, 0x06, 0x6a, 0xf9, 0x96, 0x07, 0x6b, 0x94, 0x00, 0x00, 0x01, 0xfc, 0xcb, 0xfe, 0xc0, 0x03, 0x35, 0xff, 0x54, 0x00, 0x03, 0x00, 0x00, 0x05, 0x21, 0x15, 0x21, 0xfc, 0xcb, 0x06, 0x6a, 0xf9, 0x96, 0xac, 0x94, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x72, 0x06, 0x0d, 0x02, 0x8e, 0x07, 0x27, 0x00, 0x23, 0x00, 0x00, 0x03, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x04, 0x81, 0x19, 0x48, 0x27, 0x21, 0x5a, 0x30, 0x3f, 0x05, 0x91, 0x03, 0x66, 0x65, 0xb4, 0x52, 0x38, 0x34, 0x51, 0x81, 0x19, 0x48, 0x27, 0x21, 0x57, 0x33, 0x40, 0x04, 0x91, 0x03, 0x66, 0x65, 0xb4, 0x52, 0x38, 0x34, 0x06, 0x4a, 0x37, 0x0b, 0x12, 0x0a, 0x24, 0x30, 0x47, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x22, 0x37, 0x0b, 0x12, 0x0a, 0x24, 0x2c, 0x4b, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xcb, 0x06, 0x04, 0x03, 0x35, 0x07, 0x6e, 0x10, 0x07, 0x07, 0x75, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xd1, 0xfe, 0x28, 0x03, 0x38, 0xff, 0xc2, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x21, 0x27, 0x33, 0x17, 0x07, 0x23, 0x37, 0xfc, 0xd2, 0x05, 0xcd, 0x76, 0x71, 0x9e, 0x9e, 0x71, 0x76, 0xfe, 0xc3, 0x64, 0x9b, 0xcd, 0xcd, 0x9b, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x00, 0x05, 0xd5, 0x10, 0x06, 0x0e, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x03, 0x6f, 0x04, 0x60, 0x10, 0x06, 0x0e, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x80, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0x04, 0xcb, 0xb6, 0xfe, 0xac, 0xb7, 0xfe, 0xac, 0xb6, 0x05, 0xd5, 0xfc, 0xf4, 0x02, 0x62, 0xfa, 0xd5, 0x05, 0x2b, 0xfd, 0x9e, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf5, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0xb5, 0x03, 0x3f, 0xa5, 0xa7, 0xa6, 0xa7, 0xa6, 0x05, 0xd5, 0xfc, 0xf4, 0x02, 0x62, 0xfa, 0xd5, 0x05, 0x2b, 0xfd, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x04, 0x74, 0x01, 0x76, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x1b, 0x01, 0x33, 0x03, 0x90, 0x3a, 0xac, 0x64, 0x04, 0x74, 0x01, 0xf2, 0xfe, 0x0e, 0x00, 0x01, 0x00, 0x90, 0xfe, 0x56, 0x01, 0x76, 0x00, 0x48, 0x00, 0x03, 0x00, 0x00, 0x25, 0x03, 0x23, 0x13, 0x01, 0x76, 0x3b, 0xab, 0x63, 0x48, 0xfe, 0x0e, 0x01, 0xf2, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x06, 0x03, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x10, 0x06, 0x03, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0x8a, 0xfe, 0x56, 0x02, 0x51, 0xff, 0xa4, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x02, 0x50, 0x85, 0x17, 0x18, 0x12, 0x86, 0x09, 0x0b, 0x0d, 0x1f, 0xfe, 0x56, 0x21, 0x1a, 0x2e, 0xe5, 0xe5, 0x0e, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x06, 0x02, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x27, 0x00, 0x79, 0x01, 0x2e, 0xff, 0x84, 0x10, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x27, 0x00, 0x79, 0x00, 0x80, 0xff, 0x84, 0x10, 0x06, 0x02, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, 0xff, 0x12, 0x01, 0x96, 0x04, 0x23, 0x12, 0x06, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x4d, 0x04, 0xee, 0x02, 0xfd, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x02, 0x4a, 0xb3, 0xfe, 0xdb, 0x8a, 0x06, 0x66, 0xfe, 0x88, 0xff, 0xff, 0x00, 0xc1, 0x05, 0x46, 0x02, 0xfd, 0x07, 0xd2, 0x12, 0x26, 0x00, 0x6a, 0x00, 0x00, 0x11, 0x07, 0x03, 0x1b, 0x00, 0x00, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0xf7, 0x00, 0x00, 0x10, 0x06, 0x03, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc5, 0x02, 0x48, 0x01, 0x83, 0x03, 0x46, 0x12, 0x06, 0x00, 0x79, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, 0x00, 0x00, 0x04, 0xea, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0x9c, 0x00, 0x00, 0x10, 0x07, 0x03, 0x2a, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x05, 0x83, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0xa6, 0x00, 0x00, 0x10, 0x07, 0x03, 0x2c, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3e, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0xa1, 0x00, 0x00, 0x10, 0x07, 0x03, 0x2e, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xe3, 0x05, 0x68, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0xa6, 0x00, 0x00, 0x10, 0x06, 0x03, 0x34, 0x24, 0x00, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x05, 0xe9, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0x96, 0x00, 0x00, 0x10, 0x07, 0x03, 0x39, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0x00, 0x00, 0x05, 0x6b, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0x91, 0x00, 0x00, 0x10, 0x06, 0x03, 0x3d, 0x31, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x40, 0x07, 0xd2, 0x10, 0x27, 0x03, 0x1c, 0xff, 0x43, 0x00, 0x00, 0x12, 0x06, 0x03, 0x4d, 0x0e, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0xb5, 0x03, 0x44, 0xfd, 0x72, 0x05, 0xd5, 0xaa, 0xfa, 0xd5, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x21, 0x05, 0x01, 0x33, 0x01, 0x02, 0x76, 0xfe, 0x8f, 0x02, 0xe3, 0xfc, 0x26, 0x02, 0x01, 0xcf, 0x02, 0x00, 0x05, 0x0e, 0xfb, 0x9a, 0xa8, 0x05, 0xd5, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x12, 0x00, 0x21, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x01, 0x22, 0x07, 0x06, 0x11, 0x10, 0x12, 0x33, 0x32, 0x37, 0x36, 0x11, 0x10, 0x27, 0x26, 0x27, 0x20, 0x00, 0x11, 0x10, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x01, 0x98, 0x02, 0x7b, 0xfd, 0x85, 0x01, 0x3e, 0xc6, 0x74, 0x75, 0xe9, 0xc6, 0xc6, 0x74, 0x74, 0x74, 0x74, 0xc6, 0x01, 0x1b, 0x01, 0x52, 0xa9, 0xa9, 0xfe, 0xe5, 0xfe, 0xe5, 0xaa, 0xa9, 0xa9, 0xaa, 0x03, 0x70, 0xaa, 0x02, 0x86, 0xa4, 0xa4, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0xa4, 0xa4, 0x01, 0x1a, 0x01, 0x1b, 0xa4, 0xa4, 0xa4, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xd2, 0xd3, 0xd2, 0xd2, 0x01, 0x62, 0x01, 0x62, 0xd3, 0xd2, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x33, 0x23, 0x01, 0x33, 0x01, 0x23, 0x01, 0xce, 0xc0, 0x02, 0x01, 0xcf, 0x02, 0x00, 0xbd, 0xfe, 0x55, 0x05, 0xd5, 0xfa, 0x2b, 0x05, 0x0e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf2, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x01, 0x13, 0x02, 0x80, 0xfd, 0x80, 0x5e, 0x03, 0x3d, 0xfc, 0xc3, 0x03, 0x3d, 0xfc, 0xc3, 0x03, 0x71, 0xaa, 0x03, 0x0e, 0xaa, 0xfb, 0x7f, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x03, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x35, 0x09, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x01, 0x86, 0x02, 0x91, 0xfc, 0x9e, 0x01, 0xaf, 0xfe, 0x51, 0x03, 0x51, 0xfd, 0x80, 0x01, 0xaf, 0xaa, 0xaa, 0xaa, 0x02, 0x70, 0x02, 0x11, 0xaa, 0xaa, 0xfd, 0xf3, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0x00, 0x00, 0x05, 0x44, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x27, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x03, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x07, 0x15, 0x23, 0x02, 0x7b, 0x87, 0x58, 0x75, 0x75, 0x58, 0x87, 0xb6, 0x87, 0x58, 0x74, 0x74, 0x58, 0x87, 0xb6, 0xdb, 0x8e, 0xaa, 0xaa, 0x8d, 0xdc, 0xb6, 0xdc, 0x8d, 0xa9, 0xa9, 0x8d, 0xdc, 0xb6, 0x04, 0x8e, 0x15, 0x57, 0x73, 0xc6, 0xc5, 0x73, 0x57, 0x15, 0x15, 0x57, 0x73, 0xc5, 0xc6, 0x73, 0x57, 0x15, 0xfc, 0x10, 0x16, 0x86, 0xa0, 0x01, 0x0f, 0x01, 0x0f, 0xa1, 0x87, 0x16, 0x9f, 0x9f, 0x17, 0x86, 0xa1, 0xfe, 0xf1, 0xfe, 0xf2, 0xa1, 0x86, 0x17, 0x9d, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0x00, 0x00, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x36, 0x27, 0x22, 0x27, 0x26, 0x03, 0x11, 0x33, 0x11, 0x10, 0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x02, 0x07, 0x06, 0x23, 0x06, 0x17, 0x02, 0x7b, 0x01, 0x01, 0xc0, 0xaa, 0xa5, 0x04, 0xbf, 0x75, 0x63, 0x7c, 0xb6, 0x7d, 0x63, 0x74, 0xc0, 0x05, 0xa5, 0xa9, 0xc1, 0x01, 0x01, 0x86, 0xb0, 0xd2, 0xcc, 0x01, 0x68, 0x01, 0x99, 0xfe, 0x67, 0xfe, 0xe6, 0xa4, 0x8c, 0x0e, 0x03, 0xf1, 0xfc, 0x0f, 0x0e, 0x8c, 0xa4, 0x01, 0x1a, 0x01, 0x99, 0xfe, 0x67, 0xfe, 0x98, 0xcc, 0xd2, 0x48, 0xee, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x05, 0x3b, 0x05, 0xe7, 0x00, 0x26, 0x00, 0x00, 0x25, 0x15, 0x21, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x02, 0x15, 0x14, 0x17, 0x16, 0x17, 0x15, 0x21, 0x35, 0x21, 0x26, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x11, 0x14, 0x07, 0x06, 0x07, 0x05, 0x3a, 0xfd, 0xe4, 0xa0, 0x59, 0x59, 0x77, 0x77, 0xc2, 0xc3, 0xee, 0x59, 0x5a, 0xa0, 0xfd, 0xe4, 0x01, 0x1f, 0x8e, 0x41, 0x41, 0xac, 0xac, 0x01, 0x13, 0x01, 0x11, 0xad, 0xad, 0x40, 0x40, 0x91, 0xb2, 0xb2, 0xb2, 0x61, 0xa6, 0xa6, 0xca, 0xf0, 0x91, 0x91, 0xfe, 0xdd, 0xef, 0xca, 0xa6, 0xa6, 0x61, 0xb2, 0xb2, 0x8b, 0x95, 0x95, 0xb8, 0x01, 0x3e, 0xc5, 0xc5, 0xc5, 0xc4, 0xfe, 0xcb, 0xc2, 0x94, 0x94, 0x8d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x02, 0x1c, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x02, 0xde, 0x01, 0x75, 0x13, 0x06, 0x03, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x03, 0xff, 0x01, 0x75, 0x13, 0x06, 0x03, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x12, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x03, 0x1b, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x26, 0x03, 0x1b, 0x48, 0x00, 0x12, 0x06, 0x03, 0x49, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0x00, 0xb2, 0x00, 0x00, 0x12, 0x06, 0x03, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x02, 0x56, 0x06, 0x66, 0x12, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x03, 0x1b, 0xff, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0xd2, 0x12, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x03, 0x1c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x04, 0x79, 0x00, 0x0d, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x1b, 0x01, 0x33, 0x03, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x20, 0x02, 0xf9, 0x27, 0x29, 0xa0, 0x78, 0x37, 0x46, 0x43, 0x45, 0x6d, 0x79, 0x40, 0x94, 0x59, 0x94, 0xb9, 0x24, 0x08, 0x20, 0x25, 0x1d, 0x4f, 0x63, 0x55, 0x4b, 0x25, 0x10, 0x29, 0x54, 0x29, 0x80, 0xd3, 0x67, 0x69, 0x72, 0x7f, 0xb2, 0x01, 0x18, 0x02, 0x09, 0xe7, 0xed, 0x6e, 0x8a, 0xb6, 0xdc, 0x69, 0x6b, 0xd5, 0x01, 0xe7, 0x01, 0x25, 0xfd, 0xa1, 0xdb, 0x31, 0x29, 0x30, 0x9c, 0x54, 0x2a, 0x58, 0x6f, 0x57, 0x29, 0x98, 0x9d, 0x01, 0x13, 0x01, 0x26, 0x8a, 0x9a, 0x00, 0x00, 0x02, 0x00, 0xac, 0xfe, 0x56, 0x04, 0x14, 0x06, 0x21, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x10, 0x21, 0x20, 0x11, 0x10, 0x07, 0x16, 0x11, 0x10, 0x21, 0x22, 0x03, 0x16, 0x33, 0x20, 0x11, 0x10, 0x05, 0x35, 0x20, 0x11, 0x34, 0x23, 0x22, 0x11, 0x01, 0x53, 0xa6, 0x01, 0x7f, 0x01, 0x87, 0x9b, 0xfc, 0xfe, 0x4e, 0xbf, 0x50, 0x64, 0xb1, 0x01, 0x04, 0xfe, 0x5e, 0x01, 0x47, 0xd3, 0xeb, 0x45, 0xfe, 0x11, 0x06, 0x03, 0x01, 0xc8, 0xfe, 0x7f, 0xfe, 0xee, 0x64, 0x5a, 0xfe, 0xf5, 0xfe, 0x26, 0x01, 0x4a, 0xad, 0x01, 0x3a, 0x01, 0x1a, 0x16, 0xaa, 0x01, 0x40, 0xdb, 0xfe, 0xc8, 0x00, 0x00, 0x01, 0x00, 0x1c, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x13, 0x01, 0x33, 0x01, 0x11, 0x23, 0x11, 0x01, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x01, 0x45, 0xdc, 0x01, 0x3b, 0xb0, 0xfe, 0x68, 0xa5, 0xfe, 0xf7, 0x27, 0x56, 0x2c, 0x3f, 0xb1, 0x03, 0xb0, 0xfd, 0x4c, 0x03, 0x64, 0xfb, 0xa0, 0xfe, 0x56, 0x01, 0xaa, 0x03, 0x44, 0x7e, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x34, 0x37, 0x36, 0x37, 0x26, 0x35, 0x10, 0x21, 0x32, 0x17, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x03, 0x88, 0x5c, 0xd7, 0xe4, 0xee, 0xba, 0x6a, 0x80, 0x7b, 0x7c, 0xd8, 0xd7, 0x7c, 0x7b, 0x7b, 0x30, 0x43, 0x8c, 0x01, 0x8d, 0xc7, 0x6c, 0xfe, 0x48, 0x3d, 0x31, 0x4e, 0x4d, 0x4d, 0x86, 0x85, 0x9a, 0x51, 0x58, 0x71, 0x3a, 0x05, 0x11, 0x46, 0x75, 0x5c, 0x30, 0x25, 0x70, 0x87, 0xfe, 0xeb, 0xfe, 0xf7, 0x9c, 0x9d, 0x9d, 0x9c, 0x01, 0x13, 0xcc, 0xa5, 0x40, 0x24, 0x4f, 0x8d, 0x01, 0x10, 0x46, 0xfe, 0x28, 0x1d, 0x49, 0x71, 0xcc, 0xcb, 0x72, 0x73, 0xe8, 0xbe, 0xc7, 0x60, 0x67, 0x0b, 0x06, 0x00, 0x00, 0x01, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x00, 0x32, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x01, 0x64, 0x65, 0x36, 0x36, 0x66, 0x66, 0xb0, 0x45, 0x99, 0x58, 0x57, 0x48, 0x49, 0x40, 0x6b, 0x3e, 0x3f, 0x3d, 0x3c, 0x69, 0x8b, 0x85, 0x7b, 0x41, 0x46, 0x4b, 0x4d, 0x88, 0x53, 0x4d, 0x4c, 0x40, 0x51, 0x4b, 0x4d, 0x48, 0xd6, 0x74, 0x74, 0x7c, 0x02, 0x5c, 0x18, 0x41, 0x40, 0x5d, 0x8d, 0x4f, 0x4e, 0x18, 0x18, 0xa7, 0x1d, 0x0d, 0x0d, 0x2e, 0x2e, 0x40, 0x46, 0x2d, 0x2c, 0x98, 0x33, 0x38, 0x58, 0x5a, 0x38, 0x38, 0x12, 0x13, 0x25, 0xab, 0x1c, 0x0e, 0x0e, 0x5b, 0x5b, 0xad, 0x6c, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0xfe, 0x52, 0x03, 0x93, 0x06, 0x14, 0x00, 0x1d, 0x00, 0x00, 0x25, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x20, 0x03, 0x10, 0x01, 0x21, 0x35, 0x21, 0x15, 0x00, 0x11, 0x10, 0x02, 0x83, 0x76, 0x47, 0x4c, 0x42, 0x49, 0x92, 0x3e, 0x26, 0x1d, 0x1d, 0x1d, 0x33, 0xfd, 0xde, 0x01, 0x02, 0x02, 0xfe, 0x21, 0x03, 0x0f, 0xfd, 0x75, 0x7f, 0x01, 0x4b, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0x02, 0x33, 0x01, 0xec, 0x01, 0x59, 0xb9, 0xb9, 0xfe, 0x94, 0xfe, 0x27, 0xfe, 0x69, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x00, 0x15, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0x51, 0x50, 0x6a, 0xad, 0x59, 0x5a, 0x02, 0xa4, 0xfb, 0xb2, 0x04, 0x48, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x32, 0x32, 0x77, 0x78, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe9, 0x04, 0x03, 0x06, 0x24, 0x00, 0x08, 0x00, 0x11, 0x00, 0x21, 0x00, 0x00, 0x01, 0x21, 0x12, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x02, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x03, 0x01, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x03, 0x52, 0xfd, 0xc3, 0x0e, 0x3e, 0x4d, 0x86, 0x87, 0x4b, 0x42, 0x08, 0x1a, 0x30, 0x4d, 0x85, 0x8a, 0x48, 0x3a, 0x11, 0x01, 0x1d, 0xd8, 0x7c, 0x7b, 0x7b, 0x7c, 0xd8, 0xd9, 0x7a, 0x7b, 0x7b, 0x7a, 0x02, 0xc6, 0xfe, 0xd5, 0x7f, 0x9c, 0x9d, 0x8a, 0x01, 0xc9, 0x01, 0x1c, 0x64, 0x9e, 0x9c, 0x7e, 0xfe, 0xfc, 0x02, 0xb4, 0xd4, 0xd3, 0xfe, 0x8a, 0xfe, 0x8b, 0xd4, 0xd5, 0xd5, 0xd4, 0x01, 0x75, 0x01, 0x76, 0xd3, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x95, 0x00, 0x00, 0x02, 0x30, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x03, 0x01, 0x40, 0x1e, 0x20, 0x62, 0x50, 0x64, 0xa2, 0x4a, 0x4a, 0x01, 0x04, 0x60, 0xfd, 0x2b, 0x91, 0x2e, 0x30, 0x9c, 0x60, 0x62, 0xd4, 0x02, 0xca, 0x00, 0x01, 0x00, 0xab, 0x00, 0x00, 0x04, 0x12, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0xac, 0xab, 0x01, 0xb3, 0xc9, 0xfe, 0x73, 0x01, 0xcb, 0xca, 0xfe, 0x8b, 0x7b, 0xab, 0x04, 0x60, 0xfe, 0x2f, 0x01, 0xd1, 0xfe, 0x5a, 0xfd, 0x46, 0x02, 0x42, 0x81, 0xfe, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x17, 0x16, 0x02, 0x3b, 0x01, 0xd1, 0xb0, 0xfe, 0xe6, 0xfe, 0xa4, 0xaf, 0x01, 0xba, 0x43, 0x2a, 0x60, 0x57, 0x69, 0xcc, 0x05, 0x65, 0xfa, 0x9b, 0x03, 0x3c, 0xfc, 0xc4, 0x04, 0x32, 0xc6, 0x7e, 0x9e, 0x02, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x56, 0x04, 0x68, 0x04, 0x60, 0x10, 0x06, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x00, 0x03, 0xb0, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x21, 0x01, 0x33, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x27, 0x33, 0x31, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x76, 0xfe, 0xcd, 0xb2, 0x01, 0x04, 0x6c, 0x5a, 0x45, 0x03, 0x02, 0x16, 0x19, 0x60, 0xa8, 0x3e, 0x29, 0x26, 0x7a, 0xa0, 0x6e, 0x04, 0x60, 0xfc, 0x54, 0x7c, 0xac, 0x81, 0x70, 0x35, 0x64, 0x77, 0x83, 0x59, 0x7c, 0x72, 0x4e, 0xc4, 0xaf, 0xe4, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0xfe, 0x52, 0x03, 0x9b, 0x06, 0x14, 0x00, 0x26, 0x00, 0x00, 0x25, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x20, 0x11, 0x10, 0x25, 0x26, 0x11, 0x34, 0x37, 0x23, 0x35, 0x21, 0x15, 0x20, 0x11, 0x14, 0x05, 0x15, 0x24, 0x13, 0x12, 0x02, 0x91, 0x77, 0x47, 0x4b, 0x42, 0x49, 0x92, 0x3e, 0x26, 0x1d, 0x1d, 0x1c, 0x34, 0xfd, 0xcf, 0x01, 0x2c, 0xfc, 0xc6, 0xbb, 0x02, 0xc6, 0xfd, 0xca, 0x01, 0xdb, 0xfd, 0xff, 0x02, 0x01, 0x7f, 0x01, 0x4b, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0x01, 0xb5, 0x01, 0x2c, 0x58, 0x24, 0x01, 0x04, 0xc5, 0x52, 0xb9, 0xb9, 0xfe, 0xdd, 0xbf, 0x09, 0xaa, 0x16, 0xfe, 0xbc, 0xfe, 0xf1, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0xff, 0xd9, 0x04, 0x23, 0x04, 0x60, 0x00, 0x17, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x43, 0x03, 0xc5, 0x7f, 0x2d, 0x31, 0x0d, 0x28, 0x06, 0x1f, 0x43, 0x21, 0x6c, 0x53, 0xfe, 0x8c, 0xa9, 0x80, 0x04, 0x60, 0xb8, 0xfd, 0x50, 0x48, 0x3f, 0x05, 0x01, 0x85, 0x0d, 0x0c, 0x83, 0xb0, 0x02, 0x9c, 0xfc, 0x58, 0x03, 0xa8, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x34, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0xf8, 0x37, 0x88, 0x35, 0xa4, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0x02, 0xda, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0x03, 0x98, 0x66, 0x5a, 0x23, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xfd, 0xae, 0x03, 0xcf, 0xe7, 0xdd, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x52, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x24, 0x00, 0x00, 0x05, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x02, 0x64, 0xf2, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x4d, 0x92, 0x44, 0x46, 0x8d, 0x48, 0xa2, 0xb2, 0xb2, 0x9e, 0x76, 0x48, 0x4c, 0x43, 0x49, 0x92, 0x3e, 0x26, 0x1d, 0x1d, 0x1c, 0x1d, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x23, 0x23, 0xac, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0xe3, 0x4c, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x5b, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x21, 0x15, 0x23, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x02, 0x34, 0x89, 0x49, 0x4e, 0x9a, 0x86, 0x85, 0x9a, 0x4d, 0x47, 0x8b, 0x02, 0x26, 0xb9, 0x62, 0x7b, 0x7c, 0xd8, 0xd9, 0x7a, 0x7b, 0x7b, 0x66, 0x03, 0xce, 0x6e, 0x73, 0xbe, 0xc9, 0xe7, 0xe8, 0xc8, 0xb7, 0x7a, 0x6e, 0x92, 0xb8, 0x9c, 0xdd, 0xfe, 0xed, 0x9c, 0x9d, 0x9d, 0x9c, 0x01, 0x13, 0x01, 0x15, 0x9b, 0x81, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x03, 0xfc, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x25, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x02, 0x9c, 0x20, 0x62, 0x50, 0x64, 0xa2, 0x4a, 0x4a, 0xfe, 0x86, 0x03, 0xa2, 0xfe, 0x82, 0xcc, 0x30, 0x9c, 0x60, 0x62, 0xd4, 0x02, 0x12, 0xb8, 0xb8, 0xfd, 0xe3, 0x91, 0x00, 0x01, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x04, 0x60, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x27, 0x33, 0x31, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x27, 0x22, 0x27, 0x26, 0x35, 0x03, 0x01, 0x30, 0x2e, 0x31, 0x60, 0x87, 0x5e, 0x36, 0x0d, 0x07, 0x1b, 0x19, 0x5f, 0xa7, 0x3f, 0x29, 0x25, 0x73, 0x8c, 0xe5, 0xa1, 0x5a, 0x59, 0x01, 0x04, 0x60, 0xfd, 0x2b, 0x87, 0x40, 0x45, 0xd0, 0x76, 0xbb, 0x66, 0x80, 0x77, 0x83, 0x5a, 0x7b, 0x73, 0x9a, 0xfd, 0xbb, 0xe4, 0x01, 0x78, 0x76, 0xc5, 0x02, 0xca, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xfe, 0x56, 0x04, 0x56, 0x04, 0x68, 0x00, 0x0a, 0x00, 0x29, 0x00, 0x00, 0x01, 0x22, 0x15, 0x11, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x11, 0x23, 0x11, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x11, 0x10, 0x02, 0xea, 0x3a, 0x55, 0x55, 0x4d, 0x4d, 0x40, 0x30, 0x7e, 0x73, 0x7b, 0x7b, 0x75, 0xb6, 0xa5, 0xb4, 0x77, 0x7b, 0x7b, 0x5b, 0x95, 0x3b, 0x34, 0x4e, 0x4d, 0x46, 0x65, 0x03, 0xcb, 0x91, 0xfd, 0x52, 0x68, 0x5d, 0xdf, 0xd0, 0x70, 0x5b, 0x9d, 0x84, 0x8d, 0xfe, 0xd9, 0xfe, 0xf1, 0xa1, 0x98, 0xfe, 0x6e, 0x01, 0x91, 0x99, 0x9c, 0x01, 0x13, 0x01, 0x1e, 0x92, 0x6d, 0x1c, 0xa3, 0x17, 0x4e, 0x73, 0xbe, 0xca, 0x73, 0x67, 0x02, 0xaf, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x00, 0x35, 0xfe, 0x55, 0x03, 0xf4, 0x04, 0x61, 0x00, 0x17, 0x00, 0x00, 0x05, 0x03, 0x01, 0x23, 0x01, 0x03, 0x26, 0x2b, 0x01, 0x35, 0x17, 0x16, 0x17, 0x13, 0x01, 0x33, 0x01, 0x13, 0x16, 0x3b, 0x01, 0x15, 0x27, 0x26, 0x02, 0x92, 0x85, 0xfe, 0xeb, 0xc3, 0x01, 0x87, 0xa4, 0x2c, 0x8b, 0x2c, 0x3f, 0xe8, 0x3a, 0x86, 0x01, 0x14, 0xc4, 0xfe, 0x79, 0xa4, 0x2c, 0x8b, 0x2c, 0x3f, 0xe9, 0xfa, 0x01, 0x7f, 0xfd, 0xd0, 0x03, 0x18, 0x01, 0xd7, 0x7e, 0x9e, 0x02, 0x07, 0xa7, 0xfe, 0x81, 0x02, 0x30, 0xfc, 0xe8, 0xfe, 0x29, 0x7e, 0x9e, 0x02, 0x07, 0x00, 0x00, 0x01, 0x00, 0x64, 0xfe, 0x56, 0x04, 0x56, 0x04, 0x60, 0x00, 0x1b, 0x00, 0x00, 0x05, 0x26, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x07, 0x11, 0x23, 0x02, 0x0b, 0xd0, 0x60, 0x76, 0xa7, 0x4d, 0x43, 0x6f, 0xa5, 0x76, 0x3c, 0x4c, 0xa8, 0x76, 0x6a, 0xc6, 0xa5, 0x19, 0x25, 0x61, 0x77, 0xf3, 0x02, 0x89, 0xfd, 0x7e, 0xb7, 0x4c, 0x42, 0x0e, 0x03, 0xd5, 0xfc, 0x2c, 0x0e, 0x42, 0x54, 0xaf, 0x02, 0x81, 0xfd, 0x78, 0xfc, 0x6e, 0x63, 0x23, 0xfe, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x04, 0x60, 0x00, 0x1a, 0x00, 0x00, 0x05, 0x20, 0x11, 0x34, 0x13, 0x33, 0x02, 0x15, 0x10, 0x33, 0x32, 0x11, 0x33, 0x10, 0x33, 0x32, 0x11, 0x34, 0x03, 0x33, 0x12, 0x15, 0x10, 0x21, 0x22, 0x03, 0x02, 0x01, 0xef, 0xfe, 0x8b, 0x8b, 0xb2, 0x81, 0xc8, 0xb7, 0x99, 0xb7, 0xc7, 0x80, 0xb2, 0x8c, 0xfe, 0x8a, 0xf5, 0x1d, 0x25, 0x1d, 0x02, 0x52, 0xeb, 0x01, 0x40, 0xfe, 0xc0, 0xf0, 0xfe, 0x4f, 0x02, 0x1a, 0xfd, 0xe6, 0x01, 0xb1, 0xf0, 0x01, 0x40, 0xfe, 0xc0, 0xeb, 0xfd, 0xae, 0x01, 0x2b, 0xfe, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x3e, 0x06, 0x10, 0x12, 0x26, 0x03, 0x4d, 0x0e, 0x00, 0x10, 0x07, 0x00, 0x6a, 0xff, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x1a, 0x00, 0x12, 0x06, 0x03, 0x59, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x1b, 0x70, 0x00, 0x12, 0x06, 0x03, 0x53, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x1b, 0x1f, 0x00, 0x12, 0x06, 0x03, 0x59, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x12, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x03, 0x1b, 0x01, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x02, 0x23, 0x13, 0x01, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0x02, 0xca, 0xfe, 0xb7, 0x79, 0xf5, 0xfd, 0x59, 0xb6, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x48, 0xfc, 0xe3, 0xfe, 0x56, 0x01, 0x84, 0x02, 0xf5, 0xfd, 0x31, 0x00, 0x03, 0x00, 0x96, 0xff, 0xe9, 0x03, 0xdf, 0x06, 0x24, 0x00, 0x0a, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x00, 0x01, 0x32, 0x36, 0x37, 0x36, 0x37, 0x34, 0x23, 0x22, 0x07, 0x06, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x02, 0x37, 0x36, 0x17, 0x1e, 0x01, 0x12, 0x06, 0x07, 0x06, 0x23, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x26, 0x01, 0x45, 0x48, 0xb7, 0x3d, 0x6c, 0x01, 0xb7, 0x6e, 0x53, 0x31, 0x01, 0xbd, 0xdd, 0x35, 0x72, 0xfe, 0x40, 0x7d, 0x64, 0x02, 0x6c, 0x79, 0xbd, 0x94, 0xc4, 0x02, 0x54, 0xe2, 0x50, 0xc9, 0x34, 0x48, 0x9d, 0x81, 0x4e, 0x16, 0x9b, 0x03, 0x70, 0x04, 0x3d, 0x6c, 0x93, 0xde, 0xba, 0x6c, 0xfe, 0xc7, 0xa7, 0xe9, 0x82, 0x5f, 0xd5, 0xd5, 0xa8, 0x03, 0x2c, 0xbe, 0xd5, 0x01, 0x01, 0xe2, 0xfe, 0xe5, 0xb6, 0x96, 0x14, 0xfe, 0xea, 0x80, 0xb0, 0x9c, 0x2d, 0xd1, 0x9e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe9, 0x04, 0x03, 0x06, 0x24, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x20, 0x27, 0x26, 0x11, 0x34, 0x36, 0x33, 0x32, 0x12, 0x10, 0x00, 0x20, 0x02, 0x11, 0x17, 0x15, 0x10, 0x12, 0x20, 0x12, 0x03, 0x50, 0x2c, 0x3c, 0x86, 0x4a, 0x6c, 0x6c, 0x43, 0xf7, 0xfe, 0xeb, 0x76, 0xbd, 0xbb, 0x9d, 0xc4, 0xdd, 0xff, 0x00, 0xfe, 0x53, 0xf0, 0xa9, 0x9e, 0x01, 0x11, 0x94, 0x03, 0x70, 0xf6, 0x7e, 0xaa, 0x89, 0x5a, 0xaa, 0x5a, 0x37, 0xaa, 0x41, 0x69, 0x01, 0x36, 0xa0, 0xde, 0xfe, 0x64, 0xfc, 0xfc, 0xfe, 0x65, 0x01, 0xb6, 0x01, 0xd2, 0x01, 0xa0, 0xfe, 0xf3, 0xfe, 0xbd, 0x01, 0x42, 0x00, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x04, 0xc9, 0x05, 0xdf, 0x00, 0x20, 0x00, 0x00, 0x01, 0x06, 0x03, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x02, 0x27, 0x26, 0x22, 0x07, 0x35, 0x36, 0x32, 0x17, 0x04, 0x13, 0x12, 0x25, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x03, 0xd9, 0x90, 0x4a, 0x26, 0xb7, 0x26, 0x49, 0x90, 0x46, 0x6b, 0x24, 0x1c, 0x64, 0x4d, 0x01, 0x22, 0x41, 0x60, 0x01, 0x03, 0x22, 0x56, 0x25, 0x4b, 0x0f, 0x17, 0x44, 0x77, 0x05, 0x11, 0x48, 0xfe, 0xf3, 0x8d, 0xa5, 0xfd, 0x76, 0x02, 0x8a, 0xa5, 0x8d, 0x01, 0x0d, 0x48, 0x23, 0x09, 0xaa, 0x0a, 0x0d, 0x30, 0xfe, 0x72, 0x01, 0x7b, 0x43, 0x09, 0x20, 0x40, 0x5b, 0x29, 0x2f, 0x42, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x05, 0xf8, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0x96, 0x00, 0x00, 0x10, 0x07, 0x03, 0x66, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, 0x00, 0x00, 0x04, 0xc9, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x4b, 0x01, 0x75, 0x12, 0x06, 0x03, 0x66, 0x00, 0x00, 0x00, 0x03, 0x00, 0x64, 0xfe, 0x56, 0x04, 0x56, 0x06, 0x14, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x00, 0x01, 0x11, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x11, 0x23, 0x11, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x11, 0x13, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x23, 0x03, 0x11, 0x22, 0x07, 0x06, 0x17, 0x16, 0x17, 0x16, 0x02, 0xb0, 0xb3, 0x78, 0x7b, 0x7b, 0x78, 0xb3, 0xa5, 0xb4, 0x77, 0x7b, 0x7b, 0x77, 0xb4, 0xa5, 0x65, 0x45, 0x4c, 0x01, 0x01, 0x4e, 0x45, 0x65, 0xa5, 0x66, 0x45, 0x4e, 0x01, 0x01, 0x4c, 0x45, 0x06, 0x14, 0xfe, 0x63, 0x99, 0x9c, 0xfe, 0xed, 0xfe, 0xed, 0x9c, 0x99, 0xfe, 0x6f, 0x01, 0x91, 0x99, 0x9c, 0x01, 0x13, 0x01, 0x13, 0x9c, 0x99, 0x01, 0x9d, 0xfa, 0x77, 0x67, 0x73, 0xca, 0xc8, 0x75, 0x67, 0xfc, 0xb8, 0x03, 0x48, 0x67, 0x75, 0xc8, 0xca, 0x73, 0x67, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3a, 0xff, 0xe3, 0x05, 0xc9, 0x04, 0x60, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x16, 0x15, 0x10, 0x25, 0x26, 0x03, 0x02, 0x23, 0x20, 0x11, 0x34, 0x37, 0x29, 0x01, 0x06, 0x15, 0x10, 0x33, 0x32, 0x03, 0x33, 0x02, 0x37, 0x36, 0x11, 0x34, 0x3a, 0x05, 0x8e, 0x84, 0x46, 0xfe, 0x8a, 0xf4, 0x1e, 0x25, 0xee, 0xfe, 0x8b, 0x45, 0x03, 0xce, 0xfc, 0xe9, 0x40, 0xc8, 0xbb, 0x04, 0x99, 0x04, 0xbb, 0xc7, 0x03, 0xa8, 0xb8, 0xb8, 0xcf, 0xa4, 0xfd, 0xad, 0x01, 0x01, 0x01, 0x2a, 0xfe, 0xd5, 0x02, 0x52, 0xa4, 0xcf, 0xd1, 0xa7, 0xfe, 0x4f, 0x02, 0x1a, 0xfd, 0xe3, 0x03, 0x03, 0x01, 0xae, 0xa7, 0x00, 0x01, 0x00, 0x64, 0xfe, 0x5b, 0x04, 0x53, 0x04, 0x67, 0x00, 0x39, 0x00, 0x00, 0x05, 0x26, 0x27, 0x26, 0x34, 0x37, 0x07, 0x02, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x04, 0x11, 0x14, 0x07, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x02, 0x07, 0x06, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x03, 0x93, 0xdd, 0x1e, 0x09, 0x0c, 0xaa, 0x57, 0xb4, 0x31, 0x1f, 0x31, 0x01, 0x07, 0x37, 0x0c, 0x18, 0x7f, 0x34, 0x52, 0x3a, 0x52, 0x17, 0x19, 0x01, 0x00, 0x1a, 0xaa, 0x56, 0xb4, 0x32, 0x1f, 0x31, 0xfe, 0xf9, 0x37, 0x0c, 0x18, 0x7f, 0x34, 0x51, 0x22, 0xb8, 0x3f, 0x92, 0x54, 0x56, 0x41, 0x94, 0x0a, 0x20, 0xf0, 0x49, 0x81, 0x35, 0x6c, 0xfe, 0xf7, 0x7c, 0x22, 0x4f, 0x9a, 0x01, 0x09, 0x8a, 0x7a, 0x3a, 0x36, 0x68, 0x6c, 0xe0, 0x30, 0x04, 0x27, 0xfe, 0xc3, 0x5b, 0x4d, 0x6c, 0x01, 0x09, 0x7c, 0x22, 0x4f, 0x9a, 0xfe, 0xf7, 0x8a, 0x7a, 0x3a, 0x36, 0x68, 0x6c, 0xfd, 0xe0, 0x66, 0x24, 0x31, 0xa0, 0x31, 0x00, 0x02, 0x00, 0x67, 0xfe, 0x58, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x02, 0x20, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x11, 0x10, 0x27, 0x03, 0x2a, 0xa6, 0xe2, 0x90, 0xaa, 0xaa, 0xa9, 0x01, 0x1b, 0x01, 0x1b, 0xa9, 0xa9, 0xa9, 0x8f, 0x6f, 0xfe, 0x74, 0x74, 0x75, 0x75, 0x74, 0x01, 0x8c, 0x74, 0x74, 0x74, 0x18, 0xfe, 0x70, 0x01, 0x90, 0x1a, 0xb3, 0xd2, 0x02, 0xc4, 0xd3, 0xd2, 0xd2, 0xd3, 0xfe, 0x9e, 0xfe, 0x9f, 0xd2, 0xb3, 0x05, 0x49, 0xa4, 0xa4, 0xfe, 0xe5, 0xfe, 0xe6, 0xa4, 0xa4, 0xa4, 0xa4, 0x01, 0x1a, 0x01, 0x1b, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x07, 0x06, 0x02, 0x34, 0x85, 0x4d, 0x4e, 0x4d, 0x4d, 0x86, 0x85, 0x9a, 0x4d, 0x4d, 0x34, 0x99, 0xab, 0x60, 0x7b, 0x7b, 0x7a, 0xd9, 0xd8, 0xf7, 0x7b, 0x60, 0x03, 0xdf, 0x73, 0x74, 0xfe, 0x6e, 0x74, 0x73, 0xe8, 0xc8, 0xc7, 0x74, 0x75, 0xfc, 0x09, 0xfe, 0x6e, 0x01, 0x92, 0x1b, 0x7d, 0x9c, 0x01, 0x13, 0x01, 0x14, 0x9c, 0x9c, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0x9c, 0x7b, 0x00, 0x01, 0x00, 0x7d, 0xfe, 0x52, 0x04, 0x34, 0x05, 0xd5, 0x00, 0x24, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x29, 0x01, 0x15, 0x02, 0xf2, 0xf2, 0x56, 0x6f, 0x52, 0x62, 0xb4, 0x6e, 0x50, 0x4b, 0x42, 0x48, 0x93, 0x3e, 0x26, 0x1d, 0x1d, 0x1c, 0x34, 0xfe, 0xe0, 0x80, 0x86, 0xa7, 0x7c, 0x01, 0x52, 0x01, 0x42, 0x05, 0x2b, 0x77, 0x98, 0xfe, 0xcd, 0xfe, 0xb5, 0x7f, 0x98, 0x54, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0xcb, 0xd6, 0x01, 0x65, 0x01, 0x4e, 0xed, 0xb1, 0xaa, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x52, 0x03, 0xe3, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x05, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x02, 0x2a, 0xb8, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x01, 0x82, 0xfe, 0x86, 0xa2, 0xb2, 0xb2, 0x64, 0x75, 0x48, 0x4c, 0x43, 0x48, 0x92, 0x3e, 0x26, 0x1c, 0x1c, 0x1d, 0x1d, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x1f, 0x9c, 0xc7, 0xce, 0xcd, 0xe3, 0x4c, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x29, 0x00, 0x00, 0x00, 0x01, 0xff, 0x53, 0xfe, 0x56, 0x02, 0xf3, 0x06, 0x14, 0x00, 0x27, 0x00, 0x00, 0x33, 0x11, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0xd6, 0x7b, 0x56, 0x98, 0x2c, 0x2d, 0x2c, 0x2e, 0x20, 0x25, 0x25, 0x28, 0x6c, 0x34, 0x43, 0x01, 0x21, 0xfe, 0xdf, 0x7d, 0x59, 0x9b, 0x34, 0x2e, 0x2d, 0x2a, 0x2c, 0x2d, 0x2d, 0x2b, 0x4f, 0x39, 0x4a, 0x04, 0x82, 0xa0, 0x8e, 0x64, 0x09, 0x09, 0x12, 0xa4, 0x1c, 0x0e, 0x0f, 0x3e, 0x51, 0x6f, 0xfe, 0xc9, 0x8f, 0xfd, 0x3f, 0x92, 0xa5, 0x73, 0x0a, 0x0b, 0x16, 0xa4, 0x1f, 0x10, 0x11, 0x4b, 0x5f, 0x00, 0x00, 0x01, 0x00, 0xa1, 0xff, 0xfc, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03, 0x06, 0x17, 0x16, 0x37, 0x15, 0x22, 0x27, 0x26, 0x37, 0x13, 0x01, 0x13, 0x36, 0x27, 0x26, 0x07, 0x35, 0x32, 0x17, 0x16, 0x01, 0xfd, 0x63, 0x02, 0xbe, 0xd2, 0x23, 0x18, 0x3b, 0x76, 0xcf, 0x49, 0x55, 0x11, 0x8b, 0xfd, 0x52, 0x9b, 0x23, 0x19, 0x3b, 0x76, 0xcf, 0x49, 0x55, 0x04, 0x87, 0xfe, 0x5b, 0x01, 0x7e, 0xfd, 0x2c, 0x60, 0x2a, 0x6c, 0x23, 0xbd, 0x46, 0x52, 0xb6, 0x01, 0xda, 0xfe, 0x91, 0x02, 0x90, 0x60, 0x2a, 0x6c, 0x23, 0xbd, 0x46, 0x52, 0x00, 0x01, 0x00, 0xab, 0x00, 0x00, 0x04, 0x14, 0x06, 0x13, 0x00, 0x07, 0x00, 0x00, 0x01, 0x03, 0x23, 0x13, 0x21, 0x13, 0x33, 0x03, 0x04, 0x14, 0xfd, 0xa5, 0xcb, 0xfd, 0x6f, 0xfd, 0xa5, 0xcb, 0x03, 0x70, 0xfc, 0x90, 0x02, 0xc6, 0x03, 0x4d, 0xfd, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x66, 0xfe, 0x56, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x21, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x06, 0x07, 0x35, 0x36, 0x21, 0x20, 0x13, 0x12, 0x11, 0x10, 0x03, 0x23, 0x12, 0x11, 0x10, 0x27, 0x06, 0x07, 0x06, 0x15, 0x11, 0x23, 0x36, 0x11, 0x34, 0x3f, 0x01, 0x02, 0x21, 0x22, 0x02, 0x16, 0x99, 0xb9, 0x5d, 0xbb, 0x01, 0x5b, 0x01, 0xaa, 0xd5, 0xc1, 0xde, 0xca, 0xea, 0x4a, 0x4a, 0x55, 0x3a, 0xb8, 0x02, 0xa3, 0xa9, 0xbb, 0xfe, 0xc6, 0x2b, 0x05, 0x3a, 0xfd, 0x8c, 0x02, 0x49, 0x4b, 0x69, 0xc6, 0xcf, 0xfe, 0xce, 0xfe, 0xec, 0xfd, 0xc2, 0xfe, 0x58, 0xfe, 0x92, 0x01, 0x4c, 0x01, 0xca, 0x01, 0xd1, 0x7d, 0x2f, 0x4d, 0x34, 0xd0, 0xfd, 0xc6, 0x21, 0x02, 0x14, 0xf7, 0x8f, 0x8d, 0x01, 0x04, 0x00, 0x01, 0x00, 0x6b, 0xfe, 0x90, 0x04, 0x21, 0x04, 0x78, 0x00, 0x16, 0x00, 0x00, 0x01, 0x03, 0x23, 0x01, 0x26, 0x27, 0x01, 0x23, 0x01, 0x26, 0x27, 0x26, 0x23, 0x35, 0x20, 0x17, 0x16, 0x13, 0x12, 0x11, 0x23, 0x10, 0x27, 0x03, 0x16, 0xd7, 0xa6, 0x01, 0x40, 0x0d, 0x2d, 0xfe, 0x73, 0xa7, 0x01, 0xe9, 0x58, 0x2a, 0xa9, 0xbe, 0x01, 0x0f, 0xda, 0xc9, 0x9b, 0x69, 0x98, 0x56, 0x01, 0x34, 0xfe, 0xcc, 0x01, 0xc0, 0x23, 0x4d, 0xfd, 0xd0, 0x02, 0xb0, 0x7f, 0x21, 0x84, 0xa4, 0xd8, 0xc8, 0xfe, 0x50, 0xfe, 0xdf, 0xfe, 0x89, 0x01, 0x5e, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x4b, 0x06, 0x52, 0x05, 0xd5, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x10, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x34, 0x13, 0x36, 0x37, 0x33, 0x06, 0x03, 0x06, 0x15, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x11, 0x34, 0x27, 0x02, 0x27, 0x33, 0x16, 0x17, 0x12, 0x06, 0x51, 0x37, 0x3d, 0xc5, 0xa2, 0xf8, 0x6a, 0x7e, 0x58, 0x7c, 0x6d, 0xb9, 0x93, 0x5c, 0x3d, 0x5a, 0x24, 0x23, 0x5a, 0x5b, 0x83, 0xbe, 0x6d, 0x6e, 0x5a, 0x35, 0x53, 0xe0, 0x4b, 0x7a, 0x3c, 0x41, 0x42, 0x70, 0x67, 0x40, 0x40, 0xb3, 0x3f, 0x3f, 0x69, 0x78, 0x3b, 0x40, 0x3c, 0x7a, 0x4c, 0xe1, 0x56, 0x32, 0x5a, 0x02, 0xe0, 0xfe, 0xef, 0xcb, 0xe6, 0xa6, 0x88, 0x64, 0x2a, 0x17, 0x85, 0x18, 0x30, 0x51, 0x80, 0x17, 0x41, 0x5e, 0xad, 0xad, 0x5e, 0x5e, 0xb1, 0xb4, 0x01, 0x98, 0xc9, 0x01, 0x0e, 0x9f, 0x7f, 0x46, 0xfe, 0xbf, 0x9f, 0xb7, 0xfe, 0xcd, 0x6b, 0x6d, 0x69, 0x68, 0xc6, 0xf1, 0xf1, 0xc6, 0x68, 0x69, 0x6d, 0x77, 0x01, 0x27, 0xb7, 0x9f, 0x01, 0x41, 0x46, 0x82, 0x9c, 0xfe, 0xeb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x79, 0xfe, 0x55, 0x05, 0x8a, 0x04, 0x60, 0x00, 0x25, 0x00, 0x00, 0x21, 0x26, 0x03, 0x02, 0x23, 0x20, 0x11, 0x34, 0x13, 0x33, 0x02, 0x15, 0x10, 0x17, 0x16, 0x03, 0x33, 0x02, 0x37, 0x36, 0x11, 0x34, 0x03, 0x33, 0x12, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x04, 0x14, 0xf8, 0x1a, 0x20, 0xf3, 0xfe, 0x8b, 0x79, 0xc4, 0x81, 0xc8, 0xbc, 0x05, 0x99, 0x03, 0xba, 0xc7, 0x80, 0xc4, 0x7a, 0x33, 0x5e, 0xb2, 0x8a, 0xbd, 0x61, 0x64, 0x52, 0x49, 0x7d, 0xb3, 0x01, 0x01, 0x0d, 0xfe, 0xed, 0x02, 0x3a, 0xeb, 0x01, 0x40, 0xfe, 0xc0, 0xf0, 0xfe, 0x97, 0x01, 0x01, 0x01, 0xd4, 0xfe, 0x2b, 0x02, 0x02, 0x01, 0x68, 0xf0, 0x01, 0x40, 0xfe, 0xc0, 0xeb, 0xd1, 0x84, 0xf4, 0x9e, 0x7b, 0x49, 0x25, 0x10, 0x6c, 0x0b, 0x2b, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x56, 0x04, 0xc1, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x13, 0x36, 0x25, 0x02, 0xa1, 0xa2, 0x56, 0x78, 0x63, 0x58, 0xb0, 0xb0, 0x58, 0x5a, 0xc3, 0xc3, 0x3e, 0x5d, 0x5e, 0x99, 0xe6, 0x8d, 0x91, 0xa7, 0x88, 0x01, 0x0a, 0x05, 0x4a, 0x12, 0x84, 0xb9, 0xfe, 0xee, 0xf9, 0xab, 0x98, 0x98, 0x99, 0x01, 0x0b, 0x02, 0xec, 0xf8, 0x81, 0x02, 0x90, 0x84, 0x40, 0x3f, 0xd5, 0xdd, 0x01, 0x47, 0x01, 0x36, 0x01, 0x08, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x18, 0x04, 0x7b, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x02, 0x4a, 0x8b, 0x48, 0x66, 0x54, 0x4b, 0x01, 0x2b, 0x4b, 0x4c, 0xa6, 0xa6, 0x34, 0x4f, 0x51, 0x81, 0xc4, 0x78, 0x7b, 0x8e, 0x72, 0xe4, 0x03, 0xfd, 0x0e, 0x63, 0x8d, 0xd0, 0xbd, 0x81, 0x74, 0x73, 0x74, 0xcb, 0x02, 0x31, 0xf9, 0xf6, 0x02, 0x52, 0x64, 0x30, 0x31, 0xa2, 0xa8, 0xf8, 0xec, 0xc8, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x4b, 0x05, 0x4c, 0x05, 0xd5, 0x00, 0x25, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x02, 0xf8, 0x01, 0x09, 0x9f, 0xab, 0x36, 0x3c, 0x99, 0xaf, 0xd9, 0xa7, 0x41, 0x58, 0x79, 0x70, 0xc4, 0x88, 0x7b, 0x27, 0x31, 0x71, 0x68, 0xb8, 0xb7, 0x68, 0x65, 0xb6, 0xb6, 0x46, 0x5e, 0x5f, 0x04, 0x7b, 0xb3, 0xc2, 0xfe, 0xfd, 0xcc, 0xa1, 0xb2, 0x80, 0x93, 0x45, 0x35, 0x0c, 0x85, 0x16, 0x32, 0x57, 0x7a, 0x6d, 0x68, 0x7f, 0xc0, 0x9d, 0x96, 0x86, 0x81, 0x7e, 0xde, 0xfe, 0x27, 0x05, 0xd5, 0xfd, 0x9a, 0x87, 0x42, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xff, 0xe3, 0x04, 0x1d, 0x04, 0x9a, 0x00, 0x17, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x17, 0x06, 0x02, 0xdb, 0x73, 0x7e, 0x1c, 0x32, 0x1a, 0x21, 0x1a, 0x0f, 0x0c, 0x0a, 0x0e, 0x16, 0x17, 0x1f, 0x1d, 0x1b, 0x17, 0x40, 0x35, 0x42, 0x20, 0xf0, 0x61, 0x72, 0x64, 0xee, 0x7f, 0x59, 0x44, 0x2f, 0x3b, 0x49, 0x4c, 0x7a, 0x56, 0x74, 0x4a, 0x39, 0x52, 0x8d, 0x47, 0x44, 0x2c, 0x19, 0x1c, 0x3e, 0x6a, 0x5c, 0x40, 0x24, 0x41, 0x2d, 0x3a, 0x2b, 0x25, 0x1b, 0x1a, 0x1c, 0x29, 0x38, 0x48, 0x5b, 0x55, 0xbd, 0x81, 0x33, 0x26, 0x7a, 0x31, 0x03, 0x44, 0x98, 0x16, 0x0b, 0x21, 0x1a, 0x20, 0x1b, 0x21, 0x20, 0x15, 0x1c, 0x11, 0x14, 0x06, 0x05, 0x19, 0x14, 0x31, 0x18, 0x32, 0xc0, 0xd4, 0xb0, 0x9c, 0x88, 0x2e, 0x23, 0x41, 0x93, 0x4c, 0x2e, 0x23, 0x5e, 0x59, 0x7f, 0x8c, 0x71, 0x19, 0x17, 0x34, 0x2b, 0x26, 0x02, 0x01, 0x0a, 0x07, 0x22, 0x1a, 0x48, 0x34, 0x42, 0x3b, 0x3b, 0x3d, 0x2f, 0x3f, 0x22, 0x2b, 0x9f, 0x56, 0x68, 0x50, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xfe, 0x56, 0x04, 0x8a, 0x05, 0xf6, 0x00, 0x21, 0x00, 0x00, 0x05, 0x06, 0x23, 0x20, 0x01, 0x00, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x02, 0x01, 0x16, 0x33, 0x20, 0x37, 0x04, 0x7b, 0xe7, 0xf7, 0xfe, 0xd0, 0xfe, 0xda, 0x02, 0x74, 0xa1, 0x62, 0x62, 0x59, 0x93, 0xa2, 0x55, 0x1f, 0x16, 0xd8, 0x28, 0x4d, 0x93, 0xfc, 0xf7, 0x91, 0x92, 0x92, 0xee, 0xfe, 0x48, 0x8d, 0xbf, 0x01, 0x0c, 0xd1, 0xec, 0xbe, 0x01, 0xa3, 0x01, 0xf1, 0xdb, 0x84, 0x9c, 0x8d, 0x65, 0x5d, 0x92, 0x36, 0x3f, 0xa1, 0x66, 0xc2, 0x90, 0x91, 0xf1, 0xd8, 0xb6, 0xfe, 0xf2, 0xfe, 0x85, 0xb5, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xfe, 0x56, 0x03, 0xf9, 0x04, 0x7b, 0x00, 0x20, 0x00, 0x00, 0x01, 0x06, 0x23, 0x22, 0x01, 0x00, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x16, 0x33, 0x32, 0x37, 0x03, 0xec, 0xc4, 0xd2, 0xf7, 0xfe, 0xfb, 0x02, 0x08, 0x96, 0x53, 0x53, 0x4b, 0x7d, 0x8a, 0x48, 0x1b, 0x12, 0xb7, 0x21, 0x41, 0x7e, 0xd6, 0xd1, 0xf8, 0x7c, 0x9e, 0xfe, 0x5e, 0x82, 0x98, 0xe4, 0xb1, 0xfe, 0xef, 0x99, 0x01, 0x79, 0x01, 0x59, 0xc2, 0x6b, 0x7d, 0x6f, 0x53, 0x4b, 0x75, 0x2c, 0x32, 0x81, 0x52, 0x9c, 0xe8, 0xc2, 0xa4, 0x9c, 0xc5, 0xfe, 0xe0, 0xba, 0x90, 0x00, 0x02, 0x00, 0x67, 0x00, 0x00, 0x05, 0x24, 0x05, 0xef, 0x00, 0x02, 0x00, 0x35, 0x00, 0x00, 0x25, 0x21, 0x09, 0x03, 0x26, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1b, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x09, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x21, 0x35, 0x33, 0x32, 0x37, 0x36, 0x01, 0xab, 0x02, 0x2f, 0xfe, 0xec, 0xfe, 0x45, 0x01, 0x5a, 0xfe, 0xf9, 0x11, 0x17, 0x1f, 0x39, 0x16, 0x14, 0x3e, 0x1e, 0x1c, 0x1c, 0x1a, 0x66, 0x44, 0x27, 0x2b, 0xe8, 0xee, 0x2f, 0x23, 0x44, 0x66, 0x1a, 0x1b, 0x1d, 0x1e, 0x3d, 0x15, 0x16, 0x36, 0x22, 0x11, 0x17, 0xfe, 0xf0, 0x01, 0x4f, 0x05, 0x06, 0x1a, 0x3e, 0x40, 0xfb, 0x4a, 0x3f, 0x41, 0x18, 0x0a, 0xaa, 0x01, 0xca, 0xfe, 0x68, 0x02, 0x3d, 0x01, 0xbb, 0x1d, 0x1a, 0x22, 0x04, 0x0a, 0xbb, 0x0b, 0x05, 0x05, 0x43, 0x28, 0x46, 0xfe, 0x81, 0x01, 0x7f, 0x4b, 0x23, 0x43, 0x05, 0x05, 0x0b, 0xbb, 0x0a, 0x04, 0x22, 0x11, 0x26, 0xfe, 0x45, 0xfd, 0xc3, 0x09, 0x08, 0x21, 0xaa, 0xaa, 0x21, 0x0f, 0x00, 0x00, 0x02, 0x00, 0x30, 0x00, 0x00, 0x04, 0x51, 0x04, 0x7b, 0x00, 0x02, 0x00, 0x35, 0x00, 0x00, 0x25, 0x21, 0x03, 0x09, 0x01, 0x03, 0x26, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1b, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x21, 0x35, 0x33, 0x32, 0x37, 0x36, 0x01, 0x71, 0x01, 0x9e, 0xcd, 0xfe, 0x85, 0x01, 0x1a, 0xd7, 0x13, 0x10, 0x1a, 0x30, 0x13, 0x11, 0x35, 0x1a, 0x18, 0x17, 0x16, 0x76, 0x39, 0x22, 0x24, 0xb1, 0xb1, 0x24, 0x22, 0x39, 0x76, 0x16, 0x17, 0x18, 0x1a, 0x35, 0x11, 0x13, 0x30, 0x1a, 0x10, 0x13, 0xdd, 0x01, 0x0f, 0x05, 0x05, 0x16, 0x35, 0x41, 0xfb, 0xe1, 0x41, 0x34, 0x17, 0x05, 0x9e, 0x01, 0x38, 0xfe, 0xee, 0x01, 0xa4, 0x01, 0x3d, 0x1c, 0x0e, 0x19, 0x03, 0x07, 0x8d, 0x08, 0x04, 0x04, 0x33, 0x1e, 0x35, 0xfe, 0xfa, 0x01, 0x06, 0x35, 0x1e, 0x33, 0x04, 0x04, 0x08, 0x8d, 0x07, 0x03, 0x19, 0x0e, 0x1c, 0xfe, 0xb8, 0xfe, 0x67, 0x08, 0x05, 0x19, 0x9e, 0x9e, 0x19, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa2, 0x06, 0x10, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x24, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x00, 0x10, 0x00, 0x23, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x12, 0x10, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x02, 0xd9, 0xfe, 0xf4, 0x4f, 0x32, 0x14, 0x49, 0x4d, 0x6e, 0x75, 0xdd, 0x01, 0x13, 0xfe, 0xed, 0xed, 0xfe, 0xed, 0x94, 0x92, 0x7d, 0x6f, 0x01, 0x85, 0x67, 0x87, 0x90, 0x43, 0x54, 0x88, 0x62, 0x80, 0xb4, 0xa7, 0xa9, 0x5e, 0x5e, 0x5e, 0x5b, 0xac, 0xa9, 0x58, 0x05, 0x2d, 0x02, 0x73, 0x4a, 0xa0, 0x56, 0x22, 0x31, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x9c, 0x9b, 0x01, 0x50, 0x01, 0xde, 0xd2, 0xbb, 0x0a, 0x0a, 0x27, 0xb1, 0x24, 0x08, 0x06, 0xfc, 0x41, 0x01, 0x82, 0xe6, 0x73, 0x74, 0xc0, 0xbd, 0x78, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xec, 0x06, 0x10, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x26, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x13, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x02, 0x58, 0xcc, 0x42, 0x27, 0x12, 0x25, 0x5a, 0x52, 0x6c, 0xb8, 0x72, 0x74, 0x74, 0x72, 0xc5, 0xe6, 0x7b, 0x7a, 0x68, 0x5d, 0x01, 0x2d, 0x56, 0x53, 0x4a, 0x40, 0x53, 0x3f, 0x51, 0x98, 0x4b, 0x4c, 0x83, 0x86, 0x4e, 0x4f, 0x4f, 0x4c, 0x88, 0x85, 0x4a, 0x4b, 0x05, 0x37, 0x02, 0x78, 0x4a, 0xa9, 0x46, 0x36, 0x31, 0xa2, 0xa2, 0xfd, 0xf0, 0xa2, 0xa2, 0x9c, 0x9b, 0x01, 0x50, 0x01, 0xde, 0xd2, 0xbb, 0x0a, 0x0a, 0x27, 0xa7, 0x27, 0x05, 0x06, 0xfc, 0xf8, 0xcd, 0x72, 0x73, 0x73, 0x74, 0xcb, 0xc7, 0x78, 0x73, 0x73, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, 0xfe, 0x56, 0x04, 0x3f, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x23, 0x11, 0x23, 0x11, 0x23, 0x15, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x04, 0x3e, 0xb6, 0xfa, 0xb6, 0xfa, 0xb6, 0x01, 0xb0, 0xb6, 0x04, 0x60, 0xfe, 0xf2, 0x64, 0xfa, 0xa0, 0x05, 0x60, 0x64, 0x01, 0x0e, 0x01, 0x75, 0xfe, 0x8b, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x55, 0x03, 0xac, 0x05, 0xcf, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x23, 0x11, 0x23, 0x11, 0x23, 0x15, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x03, 0xac, 0x9c, 0xce, 0xa7, 0xce, 0x9b, 0x01, 0x69, 0xa7, 0x04, 0x5f, 0xff, 0x00, 0x70, 0xfa, 0x86, 0x05, 0x7a, 0x70, 0x01, 0x00, 0x01, 0x70, 0xfe, 0x90, 0x00, 0x01, 0x00, 0x64, 0xff, 0xf2, 0x04, 0x53, 0x04, 0x67, 0x00, 0x33, 0x00, 0x00, 0x01, 0x02, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x04, 0x11, 0x14, 0x07, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x01, 0xf1, 0x57, 0xb4, 0x31, 0x1f, 0x31, 0x01, 0x07, 0x37, 0x0c, 0x18, 0x7f, 0x34, 0x52, 0x3a, 0x52, 0x17, 0x19, 0x01, 0x00, 0x1a, 0xaa, 0x56, 0xb4, 0x32, 0x1f, 0x31, 0xfe, 0xf9, 0x37, 0x0c, 0x18, 0x7f, 0x34, 0x51, 0x39, 0x52, 0x17, 0x19, 0xff, 0x00, 0x1a, 0x01, 0x99, 0xfe, 0xf7, 0x7c, 0x22, 0x4f, 0x9a, 0x01, 0x09, 0x8a, 0x7a, 0x3a, 0x36, 0x68, 0x6c, 0xe0, 0x30, 0x04, 0x25, 0xfe, 0xc1, 0x5b, 0x4d, 0x6c, 0x01, 0x09, 0x7c, 0x22, 0x4f, 0x9a, 0xfe, 0xf7, 0x8a, 0x7a, 0x3a, 0x36, 0x68, 0x6c, 0xe0, 0x30, 0x04, 0x25, 0x01, 0x3f, 0x5b, 0x4d, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x12, 0x29, 0x01, 0x15, 0x21, 0x20, 0x11, 0x24, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0xa7, 0x51, 0x31, 0x8e, 0x35, 0xa4, 0xb8, 0x72, 0x73, 0x73, 0x72, 0xb8, 0x6c, 0x52, 0x50, 0x34, 0x04, 0x01, 0x04, 0x01, 0xc2, 0xfe, 0x4c, 0xfe, 0x43, 0x02, 0xda, 0x4a, 0x4c, 0xfe, 0xf9, 0x4b, 0x4b, 0x4b, 0x4b, 0x01, 0x07, 0x4c, 0x02, 0x25, 0xd0, 0xa3, 0x62, 0x5e, 0x23, 0xa2, 0xa2, 0xfd, 0xf0, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0xfe, 0x58, 0xaa, 0x02, 0xda, 0x34, 0x01, 0x96, 0x74, 0x73, 0x73, 0x74, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x76, 0x04, 0x7b, 0x00, 0x21, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x15, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x03, 0x76, 0x22, 0x21, 0x59, 0x60, 0xa4, 0x5c, 0x56, 0x10, 0x02, 0x62, 0xfd, 0x9e, 0x10, 0x56, 0x5c, 0xa4, 0x74, 0x45, 0x43, 0x48, 0x5d, 0x60, 0xf2, 0x8c, 0x8d, 0x8d, 0x8c, 0xf2, 0x5b, 0x62, 0x24, 0x24, 0x03, 0xae, 0x0d, 0x0a, 0x1a, 0x63, 0x5c, 0xa9, 0x90, 0xa9, 0x5c, 0x63, 0x1a, 0x19, 0xa7, 0x12, 0x16, 0x9c, 0x9c, 0x02, 0x28, 0x9c, 0x9c, 0x16, 0x08, 0x0c, 0x00, 0x01, 0x00, 0xb0, 0xff, 0xe3, 0x03, 0xc1, 0x04, 0x7b, 0x00, 0x21, 0x00, 0x00, 0x13, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0xb0, 0x24, 0x24, 0x62, 0x5b, 0xf2, 0x8c, 0x8d, 0x8d, 0x8c, 0xf2, 0x60, 0x5d, 0x48, 0x43, 0x45, 0x74, 0xa4, 0x5c, 0x56, 0x10, 0xfd, 0x9e, 0x02, 0x62, 0x10, 0x56, 0x5c, 0xa4, 0x60, 0x59, 0x21, 0x03, 0xae, 0xa3, 0x0c, 0x08, 0x16, 0x9c, 0x9c, 0xfd, 0xd8, 0x9c, 0x9c, 0x16, 0x12, 0xa7, 0x19, 0x1a, 0x63, 0x5c, 0xa9, 0x90, 0xa9, 0x5c, 0x63, 0x1a, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x12, 0x06, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x12, 0x06, 0x00, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x21, 0x09, 0x01, 0x21, 0x11, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0xb5, 0x01, 0x0f, 0x01, 0x57, 0x01, 0x58, 0x01, 0x0f, 0xb1, 0xfe, 0xa5, 0xb6, 0xfe, 0xa5, 0xb0, 0x05, 0xd5, 0xfe, 0x21, 0x01, 0xdf, 0xfa, 0x2b, 0x05, 0x1f, 0xfe, 0x19, 0x01, 0xe7, 0xfa, 0xe1, 0x00, 0x00, 0x01, 0x00, 0x72, 0xfe, 0x56, 0x04, 0x3b, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x11, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x72, 0x00, 0xff, 0xe5, 0xe6, 0x00, 0xff, 0xa7, 0xf8, 0x8a, 0xf9, 0xa7, 0x04, 0x60, 0xfe, 0x7b, 0x01, 0x85, 0xfb, 0xa0, 0x03, 0xb2, 0xfe, 0x60, 0x01, 0xa0, 0xfa, 0xa4, 0x00, 0x00, 0x02, 0x00, 0x4c, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x00, 0x17, 0x11, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x11, 0x21, 0x15, 0x21, 0x15, 0x23, 0x35, 0x23, 0x35, 0x00, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0xa7, 0x51, 0x37, 0x88, 0x35, 0xa4, 0xb8, 0x72, 0x73, 0x73, 0x72, 0xb8, 0x6f, 0x4f, 0x50, 0x34, 0x01, 0xb4, 0xfe, 0x4c, 0xa7, 0x5b, 0x03, 0x35, 0x4a, 0x4c, 0xfe, 0xf9, 0x4b, 0x4b, 0x4b, 0x4b, 0x01, 0x07, 0x4c, 0x90, 0x02, 0xb5, 0xe7, 0x8c, 0x66, 0x5a, 0x23, 0xa2, 0xa2, 0xfd, 0xf0, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0xfe, 0xc8, 0xaa, 0x70, 0x70, 0xaa, 0x01, 0xf4, 0x01, 0x96, 0x74, 0x73, 0x73, 0x74, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x26, 0x03, 0x8d, 0x00, 0x00, 0x10, 0x07, 0x00, 0x79, 0x01, 0xfb, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x27, 0x00, 0x79, 0x00, 0xcd, 0x00, 0x00, 0x12, 0x06, 0x03, 0x91, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6b, 0x12, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x4e, 0x12, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x27, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x66, 0x05, 0x1b, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x05, 0x1b, 0xb8, 0xcd, 0x44, 0x37, 0x79, 0x64, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0xfe, 0x7d, 0x04, 0x16, 0xfe, 0x23, 0x01, 0x78, 0xa7, 0xc8, 0x68, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0x2b, 0xaa, 0xaa, 0xfe, 0x46, 0xe9, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x07, 0x6b, 0x12, 0x26, 0x03, 0xa7, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x36, 0x01, 0x75, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x00, 0x01, 0x15, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x02, 0x07, 0x21, 0x15, 0x21, 0x16, 0x12, 0x33, 0x32, 0x04, 0xa3, 0xbf, 0xf0, 0xfe, 0xd2, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x2e, 0xf4, 0xbb, 0xbe, 0xe6, 0xee, 0xd6, 0x14, 0x02, 0xce, 0xfd, 0x32, 0x14, 0xd6, 0xee, 0xe6, 0x01, 0x46, 0xd3, 0x90, 0x01, 0x9f, 0x01, 0x68, 0x01, 0x67, 0x01, 0x9f, 0x8e, 0xd5, 0xbd, 0xfe, 0xe3, 0xef, 0xaa, 0xef, 0xfe, 0xe4, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x02, 0x1c, 0x07, 0x4e, 0x10, 0x06, 0x00, 0x91, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0xfe, 0x66, 0x01, 0x6b, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4b, 0x00, 0x00, 0x07, 0x5e, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x21, 0x15, 0x10, 0x02, 0x05, 0x35, 0x36, 0x12, 0x11, 0x35, 0x21, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x25, 0x20, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x03, 0xfe, 0xfe, 0x4c, 0xb4, 0xfe, 0xb6, 0xc3, 0x86, 0x03, 0x1f, 0xd3, 0xe2, 0xf5, 0xf5, 0xe2, 0xfe, 0x77, 0x01, 0x80, 0x01, 0x20, 0x8e, 0x92, 0xca, 0x05, 0x2b, 0xb8, 0xfd, 0xca, 0xfd, 0xfb, 0x38, 0xaa, 0x2f, 0x01, 0xa6, 0x02, 0x58, 0xfe, 0xfd, 0x9a, 0xda, 0xdd, 0xde, 0xda, 0xa6, 0x01, 0x11, 0x8b, 0x87, 0xfd, 0xdd, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x07, 0x05, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x36, 0x03, 0xa5, 0xfd, 0xc6, 0xb6, 0xb6, 0x02, 0x3a, 0xb6, 0xd3, 0xe2, 0xf4, 0xf4, 0xe2, 0x01, 0x17, 0x8e, 0x92, 0xca, 0xca, 0x90, 0x90, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfd, 0x9a, 0xda, 0xde, 0xdd, 0xda, 0x01, 0xb7, 0x8b, 0x87, 0xfd, 0xdd, 0x87, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0x00, 0x00, 0x05, 0x1b, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x03, 0xac, 0xa7, 0xc8, 0xb5, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0xfe, 0x7d, 0x04, 0x16, 0xfe, 0x23, 0x03, 0x71, 0xe9, 0xee, 0xfe, 0x66, 0x01, 0x8a, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0x2b, 0xaa, 0xaa, 0xfe, 0x46, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xf9, 0x07, 0x6b, 0x12, 0x26, 0x03, 0xae, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x6b, 0x12, 0x26, 0x03, 0xac, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x68, 0x01, 0x75, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x03, 0xb7, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x23, 0x02, 0x68, 0xfe, 0x4d, 0xb6, 0x02, 0x94, 0xb6, 0xfe, 0x4d, 0x9a, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0x2b, 0xfe, 0xbf, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x13, 0x15, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x03, 0xae, 0x8d, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x93, 0x8d, 0x62, 0xfd, 0x5b, 0x01, 0x2c, 0xe2, 0xf5, 0xed, 0xea, 0xfe, 0x1e, 0x01, 0xb7, 0x8b, 0x87, 0xfd, 0xdd, 0x87, 0x04, 0xa8, 0xa6, 0xfe, 0x40, 0xda, 0xde, 0xdd, 0xda, 0x05, 0xd5, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0xb5, 0x03, 0x44, 0xfd, 0x72, 0x05, 0xd5, 0xaa, 0xfa, 0xd5, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0xbf, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x36, 0x37, 0x12, 0x19, 0x01, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0xa4, 0x02, 0x52, 0xfe, 0x4c, 0x65, 0x15, 0xfe, 0xd3, 0x78, 0x23, 0x57, 0x03, 0x1f, 0x99, 0x99, 0xfc, 0x48, 0x99, 0xaa, 0x04, 0x81, 0xd4, 0xfe, 0x0d, 0xfe, 0xb5, 0x44, 0x2b, 0x3f, 0x78, 0x01, 0x34, 0x02, 0x26, 0x01, 0x1a, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0xfe, 0xbf, 0x01, 0xeb, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x07, 0x9e, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x03, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x03, 0x86, 0xb6, 0x02, 0x65, 0xdd, 0xfe, 0x15, 0x02, 0x0a, 0xbd, 0xfe, 0x44, 0xe8, 0xb6, 0xe8, 0xfe, 0x44, 0xbe, 0x02, 0x0a, 0xfe, 0x16, 0xdc, 0x02, 0x66, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb3, 0xfc, 0x78, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x01, 0xea, 0x01, 0x17, 0xfc, 0xff, 0x03, 0x88, 0x02, 0x4d, 0xfd, 0x1e, 0x00, 0x01, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x25, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x01, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x02, 0x0e, 0xde, 0x01, 0x19, 0x80, 0x76, 0x83, 0x92, 0xfe, 0xc1, 0xd7, 0x6d, 0xff, 0x00, 0x27, 0x89, 0x98, 0x70, 0xa9, 0xbb, 0xa6, 0xb0, 0xb7, 0xbe, 0xa2, 0x8e, 0x93, 0xb2, 0x79, 0x52, 0xb9, 0x66, 0xd4, 0x05, 0xf0, 0xd1, 0xb2, 0x7c, 0xab, 0x21, 0x1f, 0xc4, 0x90, 0xe6, 0xe9, 0x42, 0x1c, 0xd0, 0x59, 0x2b, 0x90, 0x95, 0x84, 0x95, 0xa6, 0x77, 0x70, 0x73, 0x7b, 0x18, 0x4d, 0xc5, 0x28, 0x22, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x04, 0xae, 0xb0, 0xfd, 0xac, 0xf5, 0xb0, 0x02, 0x54, 0x05, 0xd5, 0xfa, 0x2b, 0x04, 0xe1, 0xfb, 0x1f, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x6d, 0x12, 0x26, 0x03, 0xac, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf2, 0x04, 0x76, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x89, 0xea, 0xfd, 0xf8, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0xf5, 0xb6, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb2, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x00, 0x01, 0x00, 0x4b, 0x00, 0x00, 0x04, 0xb5, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x12, 0x11, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x4c, 0xc3, 0x38, 0x4e, 0x03, 0x1f, 0xb6, 0xfe, 0x4c, 0x5c, 0x58, 0xaa, 0x2f, 0xa4, 0x01, 0x02, 0x02, 0x58, 0xfe, 0xfa, 0x2b, 0x05, 0x2b, 0xb8, 0xfd, 0xca, 0xfe, 0xf8, 0xfd, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x04, 0xb5, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfa, 0x2b, 0x05, 0x2b, 0xfa, 0xd5, 0x05, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x4e, 0x13, 0x1d, 0x47, 0xe2, 0x45, 0x38, 0x6b, 0x2a, 0x19, 0x10, 0x29, 0xfe, 0x51, 0xc3, 0x01, 0x4e, 0x01, 0x4f, 0xc4, 0xb5, 0x32, 0x26, 0x5d, 0xaa, 0x1b, 0x11, 0x2a, 0x6a, 0x04, 0x6b, 0xfc, 0x94, 0x03, 0x6c, 0x00, 0x03, 0x00, 0x6c, 0x00, 0x00, 0x05, 0xc6, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x33, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x03, 0x24, 0x00, 0x11, 0x10, 0x00, 0x25, 0x35, 0x33, 0x15, 0x04, 0x00, 0x11, 0x10, 0x00, 0x05, 0x15, 0x23, 0x02, 0xbf, 0xc3, 0xcf, 0xcf, 0xc3, 0xb7, 0xc3, 0xcd, 0xcd, 0xc3, 0xb7, 0xfe, 0xe3, 0xfe, 0xcb, 0x01, 0x35, 0x01, 0x1d, 0xb7, 0x01, 0x1d, 0x01, 0x33, 0xfe, 0xcd, 0xfe, 0xe3, 0xb7, 0x04, 0xa2, 0x14, 0xcc, 0xc5, 0xc5, 0xcb, 0x14, 0x14, 0xcb, 0xc5, 0xc5, 0xcc, 0x14, 0xfc, 0x10, 0x17, 0x01, 0x2b, 0x01, 0x09, 0x01, 0x09, 0x01, 0x2d, 0x17, 0x8b, 0x8b, 0x17, 0xfe, 0xd5, 0xfe, 0xf5, 0xfe, 0xf7, 0xfe, 0xd5, 0x17, 0xb2, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x4f, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x04, 0xb5, 0xfc, 0x00, 0xb6, 0x02, 0x94, 0xb6, 0x99, 0x99, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0xd5, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x11, 0x21, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x11, 0x33, 0x11, 0x03, 0x84, 0xfe, 0x89, 0xa8, 0xc7, 0xb4, 0x70, 0x70, 0x01, 0x52, 0xb7, 0x02, 0x64, 0xe9, 0xee, 0x01, 0x9a, 0xfe, 0x76, 0x9f, 0x9e, 0x02, 0xc7, 0xfa, 0x2b, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x06, 0xff, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x04, 0x34, 0x02, 0x14, 0xb6, 0xf9, 0xb7, 0xb6, 0x02, 0x14, 0xb5, 0xaa, 0x05, 0x2b, 0xfa, 0x2b, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x07, 0x98, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x06, 0xfe, 0xf9, 0xb7, 0xb6, 0x02, 0x14, 0xb5, 0x02, 0x14, 0xb6, 0x99, 0x99, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0xd5, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x05, 0x7c, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x01, 0xc3, 0xfe, 0x73, 0x02, 0x43, 0x01, 0x2c, 0xe2, 0xf5, 0xf5, 0xe2, 0x01, 0x17, 0x47, 0x46, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x91, 0x48, 0x47, 0x05, 0x2b, 0xaa, 0xfd, 0x9a, 0xda, 0xde, 0xdd, 0xda, 0x01, 0xb7, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xa6, 0x05, 0xd5, 0x10, 0x26, 0x03, 0xc0, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x04, 0x3b, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x01, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x03, 0xae, 0x47, 0x46, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x93, 0x46, 0x47, 0xfd, 0x07, 0xb6, 0x01, 0x2c, 0xe2, 0xf5, 0xf5, 0xe2, 0xfe, 0x1e, 0x01, 0xb7, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x04, 0xa8, 0xfd, 0x9a, 0xda, 0xde, 0xdd, 0xda, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe3, 0x04, 0xa0, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x00, 0x13, 0x16, 0x33, 0x32, 0x12, 0x37, 0x21, 0x35, 0x21, 0x26, 0x02, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x22, 0x27, 0x64, 0xbe, 0xe6, 0xee, 0xd6, 0x14, 0xfd, 0x32, 0x02, 0xce, 0x14, 0xd6, 0xee, 0xe6, 0xbe, 0xbb, 0xf4, 0x01, 0x2d, 0x01, 0x60, 0xfe, 0xa0, 0xfe, 0xd3, 0xf0, 0xbf, 0x01, 0x46, 0xbd, 0x01, 0x1c, 0xef, 0xaa, 0xef, 0x01, 0x1d, 0xbd, 0xd5, 0x8e, 0xfe, 0x61, 0xfe, 0x99, 0xfe, 0x98, 0xfe, 0x61, 0x90, 0x00, 0x02, 0x00, 0xbd, 0xff, 0xe3, 0x07, 0x5f, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x26, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x11, 0x10, 0x27, 0x26, 0x01, 0x12, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x04, 0xf1, 0xc6, 0x74, 0x75, 0x75, 0x74, 0xc6, 0xc6, 0x74, 0x74, 0x74, 0x74, 0xfc, 0xce, 0x0d, 0xa2, 0xa2, 0x01, 0x1b, 0x01, 0x1b, 0xa9, 0xa9, 0xa9, 0xa9, 0xfe, 0xe5, 0xfe, 0xe5, 0xa2, 0xa2, 0x0d, 0xfe, 0xef, 0xb6, 0xb6, 0x05, 0x4c, 0xa4, 0xa4, 0xfe, 0xe5, 0xfe, 0xe6, 0xa4, 0xa4, 0xa4, 0xa4, 0x01, 0x1a, 0x01, 0x1b, 0xa4, 0xa4, 0xfd, 0xf3, 0x01, 0x18, 0xcd, 0xcc, 0xd2, 0xd3, 0xfe, 0x9e, 0xfe, 0x9f, 0xd2, 0xd3, 0xcd, 0xcd, 0x01, 0x18, 0xfd, 0x6b, 0x05, 0xd5, 0xfd, 0x6a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x00, 0x04, 0x4c, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x21, 0x11, 0x21, 0x22, 0x06, 0x03, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x23, 0x01, 0x01, 0x72, 0x86, 0x83, 0x01, 0x1b, 0xfe, 0xe5, 0x83, 0x86, 0xf8, 0x01, 0x70, 0x5a, 0xe7, 0xea, 0xe8, 0x01, 0xd1, 0xb6, 0xf3, 0xfe, 0x9d, 0x04, 0x27, 0x83, 0x87, 0x02, 0x12, 0x85, 0xfb, 0x56, 0x02, 0x8d, 0x1a, 0xa9, 0xd7, 0xce, 0xe0, 0xfa, 0x2b, 0x02, 0x77, 0xfd, 0x89, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x37, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x00, 0x01, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x03, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x24, 0x37, 0x36, 0x37, 0x17, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x02, 0x3d, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xef, 0x06, 0x06, 0x04, 0x34, 0x52, 0x01, 0x1b, 0xee, 0x6e, 0x30, 0x2e, 0x2c, 0x28, 0xe1, 0x72, 0x44, 0xb3, 0x11, 0x07, 0x75, 0xbe, 0x85, 0x9b, 0x9a, 0x86, 0x85, 0x9a, 0x9a, 0x04, 0x7b, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x30, 0x01, 0x1c, 0xe5, 0x77, 0x29, 0xa0, 0x76, 0xb9, 0xa0, 0x02, 0x01, 0x11, 0x92, 0x14, 0x01, 0x11, 0x09, 0x2c, 0x75, 0x99, 0x38, 0x77, 0x9c, 0xe7, 0xc9, 0xc9, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xd2, 0x04, 0x60, 0x00, 0x08, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x01, 0x4d, 0xec, 0x71, 0x77, 0x77, 0x71, 0xec, 0xda, 0x5d, 0x77, 0x77, 0x5d, 0xfe, 0x80, 0x01, 0x8b, 0xb1, 0xbf, 0x62, 0x5f, 0x72, 0x7e, 0xcf, 0xc1, 0xfe, 0x66, 0x02, 0x04, 0xfe, 0x8f, 0x5f, 0x5a, 0x5a, 0x5e, 0x01, 0xc9, 0xfe, 0xca, 0x53, 0x4a, 0x4a, 0x4f, 0x93, 0x90, 0x85, 0x67, 0x79, 0x0f, 0x18, 0x98, 0x72, 0x96, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x6f, 0x04, 0x60, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0xa7, 0x02, 0xc7, 0xfd, 0xe0, 0x04, 0x60, 0x93, 0xfc, 0x33, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0xfe, 0xe5, 0x04, 0x9b, 0x04, 0x60, 0x00, 0x06, 0x00, 0x16, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x15, 0x10, 0x07, 0x05, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0x8f, 0x01, 0xe0, 0xfe, 0xa4, 0x6a, 0xfe, 0xf5, 0x52, 0x24, 0x58, 0x02, 0xaa, 0x84, 0x84, 0xfc, 0xcf, 0x85, 0x93, 0x03, 0x3a, 0x8c, 0xfe, 0x64, 0xdc, 0x36, 0x28, 0x55, 0xd3, 0x01, 0xa9, 0xd4, 0xfc, 0x33, 0xfe, 0x52, 0x01, 0x1b, 0xfe, 0xe5, 0x01, 0xae, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x06, 0x3e, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x27, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x02, 0xec, 0xa5, 0x01, 0xb8, 0xc0, 0xfe, 0x97, 0x01, 0x9e, 0xb2, 0xfe, 0xad, 0xa8, 0xa5, 0xa8, 0xfe, 0xac, 0xb1, 0x01, 0x9e, 0xfe, 0x96, 0xc1, 0x01, 0xb8, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x51, 0xfd, 0x4f, 0x02, 0x36, 0xc9, 0xfe, 0x93, 0x01, 0x6d, 0xc9, 0xfd, 0xca, 0x02, 0xb1, 0x01, 0xaf, 0xfd, 0xf2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x00, 0x28, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x02, 0x7b, 0x70, 0x7c, 0xe8, 0xd6, 0x48, 0x98, 0x51, 0x40, 0x99, 0x53, 0x88, 0x98, 0x87, 0x7b, 0x85, 0x8b, 0x69, 0x79, 0x7d, 0x6b, 0x40, 0x91, 0x57, 0x58, 0x99, 0x45, 0xb0, 0xcc, 0x6c, 0x02, 0x5c, 0x18, 0x92, 0x6c, 0xad, 0xb6, 0x1c, 0x1c, 0xab, 0x25, 0x25, 0x70, 0x5a, 0x58, 0x6b, 0x98, 0x59, 0x46, 0x40, 0x5c, 0x1a, 0x1d, 0xa7, 0x18, 0x18, 0x9d, 0x8d, 0x5d, 0x81, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x04, 0x06, 0xa4, 0xfe, 0x1a, 0xd5, 0xa5, 0x01, 0xe5, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0x83, 0xfc, 0x7d, 0x04, 0x60, 0xfc, 0x7f, 0x03, 0x81, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x06, 0x14, 0x12, 0x26, 0x03, 0xcc, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, 0x00, 0x8a, 0xff, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x1d, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0xa7, 0xa5, 0x01, 0xd3, 0xcc, 0xfe, 0x7e, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0xb1, 0xa5, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x4f, 0xfd, 0x51, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x04, 0x02, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x10, 0x07, 0x06, 0x44, 0xa4, 0x33, 0x3d, 0x02, 0xa9, 0xa5, 0xfe, 0xa1, 0x4f, 0x54, 0x99, 0x1c, 0x7e, 0xb1, 0x01, 0xc5, 0xb7, 0xfb, 0xa0, 0x03, 0xcd, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0xa7, 0xf3, 0x01, 0x1e, 0x01, 0x1f, 0xf0, 0xa6, 0xfe, 0xe9, 0xa5, 0xfe, 0xe9, 0xa7, 0x04, 0x60, 0xfd, 0x12, 0x02, 0xee, 0xfb, 0xa0, 0x03, 0xb0, 0xfd, 0x27, 0x02, 0xd9, 0xfc, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x0e, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xa7, 0xa7, 0x02, 0x19, 0xa7, 0xa7, 0xfd, 0xe7, 0xa7, 0x04, 0x60, 0xfe, 0x37, 0x01, 0xc9, 0xfb, 0xa0, 0x02, 0x04, 0xfd, 0xfc, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x0e, 0x04, 0x60, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x04, 0x0e, 0xa7, 0xfd, 0xe7, 0xa7, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0xcd, 0xfc, 0x33, 0x04, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0xfc, 0x04, 0x60, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x36, 0x03, 0xc6, 0xfe, 0x6e, 0xa3, 0xfe, 0x6f, 0x04, 0x60, 0x93, 0xfc, 0x33, 0x03, 0xcd, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x64, 0xfe, 0x56, 0x05, 0xc4, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x33, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x06, 0x01, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x01, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x36, 0x01, 0x11, 0x82, 0x6f, 0x58, 0x67, 0x67, 0x58, 0x6f, 0x82, 0x01, 0xb0, 0x34, 0x75, 0x4b, 0x97, 0xd1, 0xd1, 0x97, 0x4b, 0x75, 0x34, 0xa6, 0x33, 0x76, 0x4b, 0x96, 0xd2, 0xd2, 0x96, 0x4b, 0x76, 0x33, 0x01, 0xb0, 0x82, 0x6f, 0x58, 0x67, 0x67, 0x58, 0x6f, 0x82, 0x02, 0x2f, 0xeb, 0xc7, 0xa8, 0x02, 0x14, 0xa8, 0xc7, 0xfb, 0x3c, 0x02, 0x39, 0x5e, 0x4e, 0x01, 0x35, 0x01, 0x13, 0x01, 0x13, 0x01, 0x3d, 0x4c, 0x5e, 0x02, 0x04, 0xfd, 0xfc, 0x5e, 0x4c, 0xfe, 0xc3, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xcb, 0x4e, 0x5e, 0xfd, 0xc7, 0x03, 0xd9, 0xeb, 0xc7, 0xa8, 0xfd, 0xec, 0xa8, 0xc7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x12, 0x06, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x92, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x04, 0x0e, 0xfc, 0x99, 0xa7, 0x02, 0x19, 0xa7, 0x84, 0x84, 0x04, 0x60, 0xfc, 0x33, 0x03, 0xcd, 0xfc, 0x33, 0xfe, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0x9a, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x21, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x21, 0x11, 0x33, 0x11, 0x02, 0xf4, 0xfe, 0xcb, 0x89, 0x5c, 0x53, 0xa6, 0x2e, 0x30, 0x5e, 0x01, 0x0b, 0xa6, 0x01, 0xd7, 0x5f, 0x56, 0xb8, 0x01, 0x1c, 0xfe, 0xf5, 0x75, 0x3b, 0x3b, 0x01, 0xf6, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x05, 0xf0, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x03, 0x9e, 0x01, 0xab, 0xa6, 0xfa, 0xb8, 0xa7, 0x01, 0xaa, 0xa6, 0x93, 0x03, 0xcd, 0xfb, 0xa0, 0x04, 0x60, 0xfc, 0x33, 0x03, 0xcd, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x06, 0x74, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x05, 0xef, 0xfa, 0xb8, 0xa7, 0x01, 0xaa, 0xa6, 0x01, 0xab, 0xa6, 0x85, 0x85, 0x04, 0x60, 0xfc, 0x33, 0x03, 0xcd, 0xfc, 0x33, 0x03, 0xcd, 0xfc, 0x33, 0xfe, 0x52, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x04, 0xaa, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x17, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x03, 0x19, 0xc1, 0xcf, 0xcf, 0xc1, 0xfe, 0x65, 0xfe, 0xba, 0x01, 0xed, 0xed, 0xed, 0xed, 0x71, 0x76, 0x76, 0x02, 0x97, 0xa3, 0xa8, 0xa8, 0xa4, 0x03, 0xcd, 0x93, 0xfe, 0x37, 0x93, 0xfe, 0x8f, 0x5f, 0x5a, 0x5a, 0x5e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x05, 0x0c, 0x04, 0x7b, 0x10, 0x27, 0x00, 0xf3, 0x03, 0xb8, 0x00, 0x00, 0x10, 0x06, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xd2, 0x04, 0x60, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x36, 0x01, 0x33, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x03, 0x21, 0x76, 0x71, 0xec, 0xec, 0x71, 0x76, 0xfd, 0x86, 0xa7, 0xf3, 0xc1, 0xcf, 0xcf, 0xc1, 0xfe, 0x66, 0x01, 0x4c, 0x5a, 0x5e, 0xfe, 0x8f, 0x5f, 0x03, 0x6e, 0xfe, 0x37, 0xa3, 0xa8, 0xa8, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x00, 0x37, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x27, 0x66, 0x8e, 0x8d, 0x85, 0xbc, 0x12, 0xfe, 0x00, 0x01, 0xfa, 0x0b, 0x8f, 0xb3, 0x8a, 0x91, 0x8d, 0x95, 0xec, 0x01, 0x0f, 0xfe, 0xf8, 0xe7, 0xaa, 0x84, 0xd5, 0x56, 0xab, 0xda, 0x93, 0x69, 0xdf, 0x56, 0xac, 0x46, 0xfe, 0xc3, 0xfe, 0xf1, 0xfe, 0xf2, 0xfe, 0xc2, 0x48, 0x00, 0x00, 0x02, 0x00, 0xad, 0xff, 0xe3, 0x05, 0xab, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, 0x36, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x03, 0xdc, 0x85, 0x9b, 0x9a, 0x86, 0x84, 0x9b, 0x9b, 0xfd, 0xb3, 0x11, 0xe0, 0xd8, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xec, 0x09, 0xbb, 0xa5, 0xa5, 0x03, 0xdf, 0xe7, 0xc9, 0xc9, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0xfe, 0xc2, 0xbe, 0x01, 0x1c, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x2e, 0xf8, 0xfd, 0xf7, 0x04, 0x60, 0xfe, 0x41, 0x00, 0x00, 0x02, 0x00, 0x68, 0x00, 0x00, 0x03, 0xb9, 0x04, 0x60, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x01, 0x14, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x06, 0x03, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x23, 0x01, 0x01, 0x54, 0x73, 0x6b, 0xe0, 0xe0, 0x6b, 0x73, 0xec, 0x01, 0x34, 0x68, 0x8b, 0xc2, 0xc3, 0x01, 0x8a, 0xa6, 0xce, 0xfe, 0xd7, 0x03, 0x1d, 0x53, 0x5e, 0x01, 0x61, 0x5c, 0xfc, 0x8f, 0x01, 0xeb, 0x1a, 0x89, 0x8f, 0xa2, 0xa1, 0xfb, 0xa0, 0x01, 0xd9, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x6b, 0x12, 0x26, 0x03, 0xc9, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x51, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x03, 0xc9, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0xfe, 0x56, 0x04, 0x1c, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x11, 0x14, 0x00, 0x07, 0x35, 0x36, 0x12, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0xc9, 0x9f, 0x9f, 0xa6, 0x01, 0xe7, 0xfe, 0x19, 0x3c, 0xa0, 0x6a, 0xa4, 0xc2, 0xfe, 0xcb, 0xc1, 0x6e, 0xdc, 0x6f, 0x70, 0x8a, 0x97, 0xa6, 0x03, 0xd1, 0x8f, 0x01, 0xb4, 0xfe, 0x4c, 0x8f, 0xfe, 0x6d, 0x65, 0x64, 0xe9, 0xfe, 0xea, 0xe2, 0xfe, 0x59, 0x29, 0x8c, 0x16, 0x01, 0x2e, 0xd2, 0xd0, 0x9f, 0xc4, 0x9e, 0xfe, 0xfb, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x76, 0x06, 0x6d, 0x12, 0x26, 0x03, 0xc7, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x78, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x00, 0x01, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x07, 0x21, 0x15, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x02, 0x60, 0x96, 0x8d, 0x91, 0x8a, 0xb4, 0x8f, 0x0a, 0x01, 0xf9, 0xfe, 0x01, 0x11, 0xbd, 0x85, 0x8d, 0x8e, 0x84, 0xaa, 0xe8, 0xfe, 0xf9, 0x01, 0x0f, 0x04, 0x7b, 0x46, 0xac, 0x56, 0xdf, 0x69, 0x93, 0xda, 0xab, 0x56, 0xaa, 0x48, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x3d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x02, 0x0c, 0x06, 0x10, 0x10, 0x06, 0x00, 0xb1, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x44, 0x00, 0x00, 0x06, 0x13, 0x04, 0x60, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x15, 0x10, 0x07, 0x06, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x44, 0xa4, 0x33, 0x3d, 0x02, 0x8f, 0x9a, 0xc1, 0xd0, 0xd0, 0xc0, 0xfe, 0xbe, 0xfe, 0xbe, 0x4f, 0x55, 0x03, 0x20, 0x71, 0x77, 0x77, 0x71, 0x93, 0x99, 0x1c, 0x7e, 0xb1, 0x01, 0xc5, 0xb7, 0xfe, 0x37, 0xa3, 0xa8, 0xa8, 0xa4, 0x03, 0xcd, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x76, 0x5f, 0x5a, 0x5a, 0x5e, 0xfe, 0x8f, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x0c, 0x04, 0x60, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x03, 0xe0, 0x9a, 0xc0, 0xd1, 0xd0, 0xc0, 0xfe, 0xbe, 0xfe, 0x15, 0xa7, 0xa7, 0x01, 0xeb, 0x01, 0x39, 0x72, 0x77, 0x77, 0x72, 0x92, 0x04, 0x60, 0xfe, 0x37, 0xa3, 0xa8, 0xa8, 0xa4, 0x02, 0x04, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x37, 0x01, 0xc9, 0xfc, 0x33, 0x5f, 0x5a, 0x5a, 0x5e, 0xfe, 0x8f, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x04, 0x15, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0xc9, 0x9f, 0x9f, 0xa6, 0x01, 0xe7, 0xfe, 0x19, 0x3c, 0xa1, 0x69, 0xaa, 0xb6, 0xa6, 0x6f, 0x70, 0x89, 0x98, 0xa6, 0x03, 0xd1, 0x8f, 0x01, 0xb4, 0xfe, 0x4c, 0x8f, 0xfe, 0x6d, 0x65, 0x64, 0xea, 0xed, 0xfe, 0xd0, 0x01, 0x2a, 0x9f, 0x9e, 0xc1, 0xa1, 0xfe, 0xfb, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x1d, 0x06, 0x6d, 0x12, 0x26, 0x03, 0xce, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x64, 0x07, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x06, 0x6b, 0x12, 0x26, 0x03, 0xcc, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x54, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x14, 0x12, 0x26, 0x03, 0xd7, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9a, 0x55, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x0e, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x23, 0x02, 0x18, 0xfe, 0x8f, 0xa7, 0x02, 0x19, 0xa7, 0xfe, 0x8f, 0x85, 0x04, 0x60, 0xfc, 0x33, 0x03, 0xcd, 0xfb, 0xa0, 0xfe, 0xe5, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x52, 0x05, 0xd5, 0x00, 0x34, 0x00, 0x00, 0x05, 0x22, 0x27, 0x26, 0x11, 0x34, 0x13, 0x36, 0x37, 0x33, 0x06, 0x03, 0x06, 0x15, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x11, 0x34, 0x27, 0x02, 0x27, 0x33, 0x16, 0x17, 0x12, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x02, 0x01, 0xbe, 0x6d, 0x6e, 0x5a, 0x35, 0x53, 0xe0, 0x4b, 0x7a, 0x3c, 0x41, 0x42, 0x70, 0x67, 0x40, 0x40, 0xb3, 0x3f, 0x3f, 0x69, 0x78, 0x3b, 0x40, 0x3c, 0x7a, 0x4c, 0xe1, 0x56, 0x32, 0x5a, 0x6e, 0x6f, 0xbc, 0x84, 0x5a, 0x5a, 0x24, 0x23, 0x5a, 0x5b, 0x1d, 0xb1, 0xb4, 0x01, 0x98, 0xc9, 0x01, 0x0e, 0x9f, 0x7f, 0x46, 0xfe, 0xbf, 0x9f, 0xb7, 0xfe, 0xcd, 0x6b, 0x6d, 0x69, 0x68, 0xc6, 0xf1, 0xf1, 0xc6, 0x68, 0x69, 0x6d, 0x77, 0x01, 0x27, 0xb7, 0x9f, 0x01, 0x41, 0x46, 0x82, 0x9c, 0xfe, 0xe7, 0xbe, 0xfe, 0x66, 0xb2, 0xb1, 0x5e, 0x5e, 0xad, 0xad, 0x5e, 0x5e, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x04, 0x60, 0x10, 0x06, 0x03, 0x5d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x05, 0x20, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x35, 0x21, 0x35, 0x33, 0x15, 0x21, 0x15, 0x13, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x02, 0x1c, 0x01, 0x2d, 0xe1, 0xf5, 0xf5, 0xe1, 0xfe, 0x1d, 0xfe, 0xb5, 0x01, 0x4b, 0xb6, 0x01, 0x4c, 0xf8, 0x48, 0x46, 0x92, 0xfe, 0xdc, 0x01, 0x24, 0x92, 0x46, 0x48, 0x04, 0x51, 0xe2, 0xda, 0xde, 0xdd, 0xda, 0x04, 0x51, 0xa4, 0xe0, 0xe0, 0xa4, 0xfd, 0x66, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x04, 0x6a, 0x06, 0x14, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x24, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x05, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x32, 0x16, 0x10, 0x06, 0x23, 0x03, 0xb9, 0x76, 0x71, 0xec, 0xec, 0x71, 0xfd, 0xfd, 0xfe, 0xdb, 0x01, 0x25, 0xa6, 0x01, 0x7e, 0xfe, 0x82, 0xf3, 0xc1, 0xd0, 0xd0, 0xc1, 0xf2, 0xb4, 0x5e, 0xfe, 0x8f, 0x93, 0x03, 0xcd, 0x93, 0x01, 0xb4, 0xfe, 0x4c, 0x93, 0xfe, 0xca, 0xa3, 0xfe, 0xb0, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbd, 0xff, 0xe3, 0x06, 0x66, 0x05, 0xf0, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x12, 0x37, 0x36, 0x21, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x12, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x20, 0x27, 0x26, 0x03, 0x01, 0x74, 0xb6, 0xb6, 0xbd, 0x1b, 0x8d, 0xaf, 0x01, 0x32, 0x78, 0x6a, 0x6c, 0x5d, 0x5c, 0x67, 0x69, 0x75, 0xe6, 0x7a, 0x5d, 0x17, 0x02, 0x6d, 0xfd, 0x8c, 0x07, 0x74, 0x7b, 0xe5, 0x75, 0x69, 0x67, 0x5c, 0x5f, 0x6b, 0x6b, 0x76, 0xfe, 0xce, 0xaf, 0xa7, 0x08, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x01, 0x08, 0xa7, 0xd0, 0x24, 0x23, 0x47, 0xd5, 0x5f, 0x2f, 0x2f, 0x9c, 0x77, 0xc6, 0xaa, 0xfe, 0xf3, 0x94, 0x9d, 0x2f, 0x2f, 0x5f, 0xd3, 0x48, 0x24, 0x24, 0xcf, 0xc6, 0x01, 0x4f, 0x00, 0x00, 0x01, 0x00, 0xad, 0xff, 0xe3, 0x04, 0xf5, 0x04, 0x7b, 0x00, 0x23, 0x00, 0x00, 0x01, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x36, 0x37, 0x36, 0x03, 0xd1, 0x96, 0x8d, 0x91, 0x8a, 0xcf, 0x53, 0x1f, 0x0b, 0x01, 0x9e, 0xfe, 0x5b, 0x0c, 0x8e, 0x4d, 0x6c, 0x8d, 0x8e, 0x84, 0xa9, 0xf3, 0x85, 0x6e, 0x09, 0x85, 0xa5, 0xa5, 0x89, 0x15, 0x6e, 0x87, 0x04, 0x7b, 0x46, 0xac, 0x56, 0xb4, 0x41, 0x57, 0x8f, 0xf4, 0x5e, 0x33, 0x56, 0xaa, 0x48, 0xad, 0x90, 0xe4, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0xca, 0x80, 0x9e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x46, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x33, 0x13, 0x09, 0x01, 0x06, 0x46, 0xcb, 0xfa, 0xfb, 0xb6, 0xfd, 0xfa, 0xcb, 0x02, 0xb5, 0xcf, 0x9f, 0xfe, 0xf9, 0xfe, 0xf9, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0x1b, 0xfd, 0xe5, 0x05, 0xd5, 0xfc, 0xf3, 0x02, 0x37, 0xfd, 0xc9, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x76, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x33, 0x13, 0x0b, 0x01, 0x05, 0x76, 0xb0, 0xd4, 0xcc, 0xa6, 0xce, 0xd5, 0xaf, 0x02, 0x4c, 0xb0, 0x82, 0xda, 0xdb, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x6b, 0x04, 0x60, 0xfd, 0xb9, 0x01, 0xa1, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x08, 0x2c, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x16, 0x00, 0x00, 0x21, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x01, 0x33, 0x13, 0x09, 0x01, 0x08, 0x2c, 0xcb, 0xfa, 0xfb, 0xb6, 0xfd, 0xfa, 0xcb, 0x01, 0x4b, 0xfe, 0x2c, 0xb6, 0xb6, 0x02, 0x22, 0x01, 0x1c, 0xcf, 0x9f, 0xfe, 0xf9, 0xfe, 0xf9, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfc, 0xf3, 0x02, 0x37, 0xfd, 0xc9, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x07, 0x08, 0x04, 0x60, 0x00, 0x13, 0x00, 0x16, 0x00, 0x00, 0x21, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x01, 0x33, 0x13, 0x0b, 0x01, 0x07, 0x08, 0xb0, 0xd4, 0xcc, 0xa6, 0xce, 0xd4, 0xb0, 0x01, 0x00, 0xfe, 0x93, 0xa5, 0xa5, 0x01, 0xb8, 0x01, 0x02, 0xaf, 0x83, 0xdb, 0xdb, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0xe7, 0xfe, 0x19, 0x04, 0x60, 0xfe, 0x17, 0x01, 0xe9, 0xfd, 0xb9, 0x01, 0xa1, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0x00, 0x00, 0x05, 0x44, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x11, 0x23, 0x10, 0x37, 0x36, 0x37, 0x01, 0x21, 0x01, 0x16, 0x17, 0x16, 0x11, 0x23, 0x10, 0x27, 0x26, 0x27, 0x01, 0x21, 0x03, 0x30, 0xb6, 0x84, 0x5a, 0x75, 0xbf, 0xaa, 0x6c, 0x99, 0xfe, 0x7c, 0x04, 0x90, 0xfe, 0x7b, 0x94, 0x68, 0xa9, 0xbf, 0x74, 0x56, 0xdf, 0x01, 0x1e, 0xfd, 0xc3, 0x02, 0x59, 0xfd, 0xa7, 0x02, 0x59, 0x1c, 0x7e, 0xa4, 0xfe, 0xe5, 0x01, 0x62, 0xd2, 0x86, 0x31, 0x02, 0xea, 0xfd, 0x13, 0x32, 0x82, 0xd2, 0xfe, 0x9e, 0x01, 0x1e, 0xa1, 0x7a, 0xca, 0x02, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x00, 0x00, 0x04, 0x09, 0x04, 0x60, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x21, 0x13, 0x09, 0x01, 0x16, 0x17, 0x16, 0x11, 0x23, 0x34, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x15, 0x23, 0x10, 0x37, 0x36, 0x37, 0x01, 0x02, 0xf1, 0xfe, 0x87, 0xbc, 0x01, 0xd4, 0xfe, 0xdc, 0x60, 0x44, 0x7b, 0xb0, 0x4d, 0x34, 0x4e, 0xa5, 0x4b, 0x32, 0x4e, 0xae, 0x7b, 0x43, 0x61, 0xfe, 0xdb, 0x03, 0xb6, 0xfe, 0x96, 0x02, 0x14, 0xfd, 0xcc, 0x26, 0x56, 0x9c, 0xfe, 0xec, 0xc7, 0x74, 0x4f, 0x1a, 0xfe, 0x5c, 0x01, 0xa2, 0x1a, 0x4b, 0x74, 0xc9, 0x01, 0x14, 0x9c, 0x55, 0x27, 0x02, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x06, 0xfe, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x00, 0x09, 0x01, 0x21, 0x01, 0x16, 0x17, 0x16, 0x11, 0x23, 0x10, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x11, 0x23, 0x10, 0x37, 0x36, 0x37, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x05, 0x01, 0x21, 0x03, 0x8a, 0xfe, 0xc3, 0x04, 0x90, 0xfe, 0x7b, 0x94, 0x68, 0xa9, 0xbf, 0x74, 0x56, 0x8a, 0xb6, 0x84, 0x5a, 0x75, 0xc0, 0xab, 0x4c, 0x63, 0xfd, 0xf0, 0xb6, 0xb6, 0x03, 0x2a, 0x01, 0x1e, 0xfd, 0xc3, 0x03, 0x71, 0x02, 0x64, 0xfd, 0x13, 0x32, 0x82, 0xd2, 0xfe, 0x9e, 0x01, 0x1e, 0xa1, 0x7a, 0x20, 0xfd, 0xa7, 0x02, 0x59, 0x1c, 0x7e, 0xa4, 0xfe, 0xe5, 0x01, 0x62, 0xd2, 0x5f, 0x34, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x6e, 0x02, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x05, 0x90, 0x04, 0x60, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x16, 0x17, 0x16, 0x11, 0x23, 0x34, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x15, 0x23, 0x10, 0x37, 0x36, 0x37, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x21, 0x13, 0x02, 0xe5, 0xfd, 0x03, 0xa8, 0xfe, 0xdb, 0x61, 0x43, 0x7b, 0xaf, 0x4d, 0x35, 0x4d, 0xa6, 0x4a, 0x33, 0x4d, 0xaf, 0x7b, 0x19, 0x1c, 0xfe, 0xb6, 0xa5, 0xa5, 0x03, 0x26, 0xfe, 0x87, 0xbc, 0x02, 0x77, 0x01, 0xe9, 0xfd, 0xcc, 0x26, 0x56, 0x9c, 0xfe, 0xec, 0xc7, 0x74, 0x4f, 0x1a, 0xfe, 0x5c, 0x01, 0xa2, 0x1a, 0x4b, 0x74, 0xc9, 0x01, 0x14, 0x9c, 0x1f, 0x18, 0xfe, 0x19, 0x04, 0x60, 0xfe, 0x17, 0x01, 0x3f, 0xfe, 0x96, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x56, 0x04, 0x02, 0x07, 0x7a, 0x00, 0x53, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x17, 0x16, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x35, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x21, 0x22, 0x07, 0x35, 0x36, 0x37, 0x03, 0x33, 0x13, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x10, 0x07, 0x16, 0x17, 0x16, 0x04, 0x01, 0x67, 0x89, 0xb2, 0x3e, 0xa7, 0x20, 0x56, 0xc6, 0x3b, 0x73, 0x68, 0x1d, 0x58, 0x4c, 0x3d, 0x69, 0x35, 0xe3, 0x36, 0x70, 0x43, 0x92, 0x2f, 0x39, 0x69, 0x01, 0x3c, 0x5e, 0x3f, 0x3a, 0xa8, 0x4f, 0xe0, 0x10, 0x4d, 0x15, 0x93, 0x49, 0x6a, 0xfe, 0xe4, 0x94, 0xc8, 0x90, 0x74, 0x8f, 0x67, 0x90, 0x60, 0x1b, 0x0d, 0x15, 0x15, 0x1f, 0x3c, 0x17, 0x1f, 0x23, 0x09, 0x0e, 0x1f, 0x2d, 0x51, 0x96, 0x58, 0x67, 0xf6, 0x7f, 0x4a, 0x4c, 0x01, 0xbe, 0xcf, 0x67, 0x88, 0x08, 0x82, 0x72, 0x0c, 0x0b, 0x02, 0x07, 0x25, 0xa7, 0x27, 0x1b, 0x2c, 0x61, 0x92, 0x7a, 0x51, 0x5e, 0x58, 0x52, 0x6a, 0xbd, 0x37, 0x19, 0xa6, 0x02, 0x26, 0x36, 0x8d, 0xee, 0x4a, 0xb4, 0x2d, 0x0d, 0x01, 0x83, 0xfe, 0x83, 0xde, 0x40, 0x18, 0x27, 0x12, 0x1b, 0x0a, 0x57, 0x05, 0x02, 0x6f, 0xca, 0x18, 0x57, 0x64, 0xa7, 0xfe, 0xfd, 0x45, 0x1e, 0x5c, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0xfe, 0x74, 0x03, 0x68, 0x06, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x10, 0x33, 0x21, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x22, 0x23, 0x35, 0x32, 0x17, 0x32, 0x33, 0x20, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x37, 0x03, 0x33, 0x13, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x04, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x03, 0x67, 0x6a, 0x62, 0x92, 0x3d, 0x97, 0x17, 0x48, 0x58, 0x1e, 0x23, 0x28, 0xa0, 0x29, 0x59, 0x4f, 0x35, 0x59, 0x2c, 0xbd, 0x2d, 0x5e, 0x39, 0x7b, 0xb0, 0x01, 0x0e, 0x51, 0x63, 0x46, 0x36, 0x66, 0x05, 0xa0, 0x0a, 0x1d, 0x1d, 0x13, 0x01, 0x16, 0x54, 0x41, 0x53, 0x82, 0xa6, 0x71, 0x5c, 0x8f, 0x68, 0x90, 0x5f, 0x2a, 0x13, 0x27, 0x49, 0x17, 0x20, 0x2d, 0x0e, 0x1e, 0x2e, 0x51, 0x01, 0x11, 0xd1, 0x64, 0x40, 0x48, 0x01, 0x52, 0x9e, 0x5e, 0x56, 0x08, 0x81, 0x61, 0x1b, 0x09, 0x24, 0x27, 0x8b, 0x22, 0x17, 0x25, 0x52, 0x97, 0x01, 0x0c, 0x60, 0x59, 0x4c, 0x38, 0x2b, 0x08, 0x98, 0x01, 0xa0, 0x51, 0x2a, 0x21, 0x37, 0xa7, 0x1f, 0x0b, 0x01, 0x83, 0xfe, 0x83, 0xde, 0x63, 0x17, 0x32, 0x0a, 0x57, 0x07, 0x6f, 0xca, 0x2f, 0xf2, 0xc4, 0x32, 0x16, 0x40, 0x49, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x15, 0x05, 0xd5, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x01, 0x33, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x06, 0x14, 0x34, 0x17, 0x1c, 0x22, 0x1a, 0x3b, 0x36, 0xff, 0x00, 0xe1, 0xb6, 0xe1, 0xfe, 0x86, 0xb0, 0x01, 0x3b, 0x70, 0xb6, 0x71, 0xd0, 0x47, 0x5d, 0x3c, 0x74, 0x2e, 0x32, 0x05, 0x14, 0x07, 0x03, 0x19, 0x38, 0xa1, 0xfd, 0x0a, 0xfe, 0xca, 0x01, 0x36, 0x04, 0x60, 0xfc, 0x54, 0x03, 0xeb, 0xfc, 0x13, 0x02, 0x72, 0xd4, 0x50, 0x33, 0x10, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xfe, 0x56, 0x06, 0x22, 0x06, 0x1e, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x01, 0x33, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x06, 0x22, 0x35, 0x16, 0x1d, 0x21, 0x1a, 0x3c, 0x36, 0xff, 0xe1, 0xa5, 0xe1, 0xfe, 0x86, 0xaf, 0x01, 0x3c, 0x70, 0xa5, 0x70, 0xd1, 0x46, 0x5e, 0x3b, 0x74, 0x2e, 0x33, 0x03, 0xde, 0x07, 0x03, 0x19, 0x38, 0xa1, 0xfd, 0x0a, 0xfe, 0x56, 0x01, 0xaa, 0x04, 0x60, 0xfc, 0x54, 0x05, 0x6a, 0xfa, 0x94, 0x02, 0x72, 0xd4, 0x50, 0x33, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x12, 0x06, 0x02, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x8a, 0x05, 0xf0, 0x00, 0x12, 0x00, 0x00, 0x01, 0x32, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x23, 0x01, 0x33, 0x09, 0x01, 0x12, 0x36, 0x05, 0x18, 0x39, 0x39, 0x3e, 0x14, 0x16, 0x42, 0x1e, 0x40, 0x4c, 0xfe, 0xa8, 0xcf, 0xfd, 0xff, 0xbe, 0x01, 0xaa, 0x01, 0x19, 0x67, 0x9d, 0x05, 0xf0, 0x15, 0xbb, 0x0a, 0x04, 0x22, 0x43, 0xdd, 0xfc, 0x14, 0x05, 0xd5, 0xfb, 0x17, 0x03, 0x3d, 0x01, 0x32, 0x95, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x04, 0x9c, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x00, 0x01, 0x32, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x23, 0x01, 0x33, 0x01, 0x13, 0x36, 0x37, 0x36, 0x04, 0x3c, 0x2e, 0x32, 0x34, 0x11, 0x23, 0x21, 0x1a, 0x3b, 0x36, 0xff, 0x00, 0xe1, 0xfe, 0x86, 0xaf, 0x01, 0x3c, 0xd0, 0x48, 0x5c, 0x3c, 0x04, 0x7b, 0x10, 0x8d, 0x07, 0x03, 0x19, 0x37, 0xa2, 0xfd, 0x0a, 0x04, 0x60, 0xfc, 0x54, 0x02, 0x70, 0xd5, 0x4f, 0x33, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x8a, 0x07, 0x70, 0x10, 0x27, 0x10, 0xf5, 0x04, 0x67, 0x01, 0x7a, 0x12, 0x06, 0x04, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x04, 0x9c, 0x06, 0x66, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x48, 0x00, 0x00, 0x12, 0x06, 0x04, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xfe, 0x56, 0x06, 0xee, 0x05, 0xf0, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x00, 0x09, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x01, 0x33, 0x1b, 0x01, 0x01, 0x10, 0x07, 0x02, 0x20, 0x03, 0x26, 0x10, 0x37, 0x12, 0x20, 0x13, 0x16, 0x03, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x06, 0xee, 0xfe, 0x45, 0x4a, 0x3f, 0x42, 0x70, 0x84, 0x61, 0x44, 0x26, 0x22, 0x32, 0x6f, 0xfe, 0xc6, 0xaf, 0xe4, 0xe3, 0xfd, 0x86, 0x56, 0x71, 0xfe, 0x33, 0x72, 0x56, 0x56, 0x72, 0x01, 0xcd, 0x71, 0x56, 0xc0, 0x19, 0x32, 0xfe, 0xbc, 0x35, 0x19, 0x1a, 0x34, 0x01, 0x44, 0x33, 0x18, 0x04, 0x60, 0xfb, 0x38, 0xcb, 0x3a, 0x3d, 0x9a, 0x24, 0x21, 0x89, 0x01, 0x37, 0x03, 0x6b, 0xfd, 0x8a, 0x02, 0x76, 0xfe, 0x8a, 0xfe, 0xdd, 0xd0, 0xfe, 0xec, 0x01, 0x13, 0xd1, 0x02, 0x44, 0xd1, 0x01, 0x14, 0xfe, 0xed, 0xd1, 0xfe, 0xde, 0x01, 0x06, 0x72, 0xea, 0xea, 0x74, 0xfe, 0xfb, 0xfe, 0xfc, 0x74, 0xea, 0xea, 0x72, 0x00, 0x00, 0x03, 0x00, 0x65, 0xfe, 0x56, 0x06, 0x4c, 0x04, 0x7b, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x25, 0x00, 0x00, 0x09, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x01, 0x33, 0x1b, 0x01, 0x00, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x02, 0x10, 0x23, 0x22, 0x10, 0x33, 0x06, 0x4c, 0xfe, 0x45, 0x4a, 0x3f, 0x42, 0x70, 0x84, 0x61, 0x44, 0x26, 0x22, 0x32, 0x6f, 0xfe, 0xc6, 0xaf, 0xe4, 0xe3, 0xfd, 0xb6, 0x55, 0x67, 0xb8, 0xba, 0x68, 0x56, 0x56, 0x68, 0xba, 0xb8, 0x67, 0x5a, 0xc5, 0xca, 0xca, 0x04, 0x60, 0xfb, 0x38, 0xcb, 0x3a, 0x3d, 0x9a, 0x24, 0x21, 0x89, 0x01, 0x37, 0x03, 0x6b, 0xfd, 0x8a, 0x02, 0x76, 0xfe, 0xab, 0xfe, 0x48, 0xa7, 0xc9, 0xc8, 0xa6, 0x01, 0xbc, 0xa6, 0xc8, 0xc9, 0xfc, 0xcd, 0x03, 0x60, 0xfc, 0xa0, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x76, 0x05, 0xf0, 0x00, 0x29, 0x00, 0x52, 0x00, 0x00, 0x25, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x07, 0x23, 0x20, 0x27, 0x26, 0x10, 0x37, 0x36, 0x21, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x21, 0x23, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0xed, 0x1b, 0xd4, 0x66, 0x74, 0x74, 0x66, 0xd4, 0x1b, 0x0a, 0x0d, 0x14, 0x18, 0x18, 0x37, 0x18, 0x18, 0x14, 0x0e, 0x09, 0x2a, 0xd3, 0x67, 0x75, 0x75, 0x67, 0xd3, 0x2a, 0x09, 0x0e, 0x14, 0x18, 0x18, 0x37, 0x18, 0x18, 0x14, 0x0e, 0xe4, 0x2a, 0xfe, 0xc4, 0x88, 0xaa, 0xaa, 0x88, 0x01, 0x3c, 0x29, 0x0a, 0x0e, 0x14, 0x18, 0x18, 0x37, 0x18, 0x1c, 0x10, 0x0e, 0x0a, 0x1a, 0x01, 0x3b, 0x89, 0xa9, 0xa9, 0x89, 0xfe, 0xc5, 0x1a, 0x09, 0x0f, 0x14, 0x18, 0x18, 0x37, 0x18, 0x1c, 0x10, 0x0e, 0xc2, 0x91, 0xa4, 0xf2, 0xf3, 0xa4, 0x91, 0x14, 0x0e, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x10, 0x12, 0x91, 0xa4, 0xf3, 0xf2, 0xa4, 0x91, 0x12, 0x10, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x10, 0xa1, 0xaa, 0xd2, 0x02, 0x74, 0xd3, 0xaa, 0x15, 0x0f, 0x15, 0x0c, 0x0b, 0x0b, 0x0e, 0x13, 0x11, 0x13, 0xaa, 0xd3, 0xfe, 0xc6, 0xfe, 0xc7, 0xd2, 0xab, 0x13, 0x11, 0x15, 0x0c, 0x0b, 0x0b, 0x0e, 0x13, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x05, 0x11, 0x04, 0x7b, 0x00, 0x26, 0x00, 0x50, 0x00, 0x00, 0x25, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x07, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x1a, 0x28, 0x91, 0x41, 0x4d, 0x4d, 0x39, 0x99, 0x28, 0x06, 0x0a, 0x10, 0x27, 0x2f, 0x28, 0x10, 0x09, 0x06, 0x29, 0x92, 0x40, 0x4e, 0x4d, 0x41, 0x92, 0x29, 0x06, 0x09, 0x10, 0x28, 0x2f, 0x13, 0x19, 0x0b, 0x09, 0xb5, 0x2a, 0xe7, 0x6c, 0x7b, 0x7b, 0x68, 0xeb, 0x2a, 0x06, 0x08, 0x0c, 0x18, 0x14, 0x2f, 0x13, 0x19, 0x0b, 0x09, 0x06, 0x29, 0xe8, 0x6c, 0x7b, 0x7b, 0x69, 0xeb, 0x29, 0x06, 0x09, 0x0b, 0x19, 0x13, 0x2f, 0x14, 0x18, 0x0c, 0x08, 0xa4, 0x60, 0x74, 0xb7, 0xa7, 0x83, 0x61, 0x0b, 0x0a, 0x11, 0x14, 0x14, 0x11, 0x0a, 0x0b, 0x5f, 0x74, 0xb8, 0xbc, 0x70, 0x5f, 0x0b, 0x0a, 0x11, 0x14, 0x0a, 0x0c, 0x0f, 0x0a, 0x93, 0x89, 0x9c, 0xee, 0xe9, 0xa2, 0x88, 0x0a, 0x0a, 0x0f, 0x0c, 0x0a, 0x0a, 0x0c, 0x0f, 0x0a, 0x0a, 0x88, 0x9c, 0xef, 0xe8, 0xa2, 0x89, 0x0a, 0x0a, 0x0f, 0x0c, 0x0a, 0x0a, 0x0c, 0x0f, 0x0a, 0x00, 0x03, 0x00, 0x6a, 0xff, 0xe3, 0x08, 0x15, 0x07, 0x74, 0x00, 0x34, 0x00, 0x3d, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x15, 0x10, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x11, 0x34, 0x27, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x01, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0x17, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x20, 0x08, 0x14, 0x5c, 0x68, 0xd3, 0x51, 0x64, 0x57, 0x56, 0x6e, 0x6c, 0x6e, 0x6f, 0xae, 0x63, 0x52, 0xd3, 0x68, 0x5c, 0x3c, 0x40, 0x64, 0xe0, 0x71, 0x52, 0x4c, 0xe6, 0x7c, 0x54, 0x44, 0x44, 0x5c, 0x8d, 0x8b, 0x5a, 0x44, 0x43, 0x53, 0x7c, 0xe7, 0x4d, 0x52, 0x71, 0xe1, 0x64, 0x3f, 0x3c, 0xfc, 0xa2, 0xda, 0x79, 0x78, 0xd9, 0xe4, 0x6a, 0x15, 0x92, 0x54, 0x52, 0x84, 0x7a, 0x7d, 0x42, 0x6c, 0x70, 0x01, 0x07, 0x01, 0xfe, 0xf2, 0x8b, 0x9e, 0x44, 0x40, 0x40, 0x44, 0x44, 0x80, 0x44, 0x9d, 0x8b, 0xf2, 0xc6, 0xe2, 0xec, 0x98, 0x6b, 0xf3, 0xe2, 0xb6, 0xfe, 0xba, 0x36, 0x33, 0x33, 0x36, 0x36, 0x33, 0x33, 0x36, 0x01, 0x46, 0xb6, 0xe2, 0xf3, 0x6b, 0x98, 0xec, 0xe2, 0x03, 0x0a, 0xfe, 0xf5, 0x67, 0x03, 0x9d, 0x9e, 0x11, 0x9b, 0x2f, 0x4b, 0x17, 0x86, 0x27, 0x2a, 0x43, 0x00, 0x03, 0x00, 0x88, 0xff, 0xe3, 0x06, 0xde, 0x06, 0x10, 0x00, 0x21, 0x00, 0x2a, 0x00, 0x38, 0x00, 0x00, 0x01, 0x12, 0x11, 0x10, 0x21, 0x22, 0x24, 0x22, 0x04, 0x23, 0x20, 0x11, 0x10, 0x13, 0x33, 0x02, 0x15, 0x10, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x11, 0x34, 0x03, 0x25, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0x17, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x20, 0x06, 0x62, 0x7c, 0xfe, 0x9a, 0x4c, 0xfe, 0xf3, 0xd8, 0xfe, 0xf2, 0x4a, 0xfe, 0x9a, 0x7c, 0xb2, 0x83, 0xbb, 0x38, 0x41, 0x6c, 0x13, 0x5a, 0xe3, 0x5a, 0x12, 0x6d, 0x42, 0x39, 0xbb, 0x84, 0xfe, 0x7b, 0xd9, 0x78, 0x77, 0xd8, 0xe4, 0x6a, 0x15, 0x91, 0x54, 0x52, 0x84, 0x7b, 0x7d, 0x43, 0x6b, 0x70, 0x01, 0x07, 0x03, 0xc5, 0xfe, 0xe3, 0xfe, 0xeb, 0xfe, 0x50, 0xe2, 0xe2, 0x01, 0xb1, 0x01, 0x14, 0x01, 0x1d, 0xfe, 0xb9, 0xfa, 0xfe, 0xfb, 0x38, 0x5b, 0x0c, 0x37, 0x37, 0x0c, 0x5b, 0x38, 0x01, 0x07, 0xf8, 0x01, 0x47, 0xa4, 0xfe, 0xf5, 0x67, 0x03, 0x9d, 0x9e, 0x11, 0x9b, 0x2f, 0x4b, 0x17, 0x86, 0x27, 0x2a, 0x43, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x52, 0x07, 0x33, 0x10, 0x27, 0x11, 0xb5, 0x00, 0x59, 0x01, 0x53, 0x10, 0x06, 0x03, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x05, 0xe0, 0x10, 0x26, 0x11, 0xb5, 0x00, 0x00, 0x10, 0x06, 0x03, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x56, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x23, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x33, 0x21, 0x11, 0x23, 0x03, 0x94, 0x9c, 0xfe, 0xc7, 0xa8, 0xaf, 0xaf, 0xaf, 0x01, 0x32, 0x78, 0x6a, 0x6c, 0x5d, 0x5c, 0x67, 0x69, 0x75, 0xe6, 0x7a, 0x7b, 0x7b, 0x88, 0xd8, 0x01, 0x47, 0xb5, 0xc6, 0xd0, 0x01, 0x53, 0x01, 0x68, 0xcf, 0xd0, 0x24, 0x23, 0x47, 0xd5, 0x5f, 0x2f, 0x2f, 0x9c, 0x9d, 0xfe, 0xd8, 0xfe, 0xd3, 0x82, 0x94, 0xfd, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x56, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x22, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x11, 0x02, 0x56, 0xeb, 0x7f, 0x86, 0x88, 0x87, 0xeb, 0x4d, 0x49, 0x49, 0x44, 0x46, 0x47, 0x46, 0x48, 0xa2, 0x59, 0x59, 0x59, 0x59, 0xa2, 0xdc, 0xb5, 0x96, 0x9f, 0xfa, 0x01, 0x12, 0x9d, 0x9d, 0x11, 0x12, 0x23, 0xac, 0x2b, 0x16, 0x15, 0x71, 0x72, 0xcd, 0xb9, 0x72, 0x71, 0xfd, 0xc3, 0x01, 0xaa, 0x00, 0x01, 0x00, 0x35, 0xff, 0xa5, 0x03, 0x69, 0x03, 0xa7, 0x00, 0x13, 0x00, 0x00, 0x01, 0x07, 0x27, 0x07, 0x17, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x03, 0x69, 0x5a, 0xc2, 0x5f, 0xc2, 0x5a, 0xc2, 0x70, 0x9d, 0x71, 0xc3, 0x5a, 0xc3, 0x5e, 0xc2, 0x5a, 0xc2, 0x5e, 0x9d, 0x5e, 0x02, 0x11, 0xae, 0x7d, 0xb5, 0x7d, 0xae, 0x7d, 0xd8, 0x64, 0xd8, 0x7d, 0xae, 0x7d, 0xb5, 0x7d, 0xae, 0x7d, 0xb5, 0x64, 0xb5, 0x00, 0x01, 0xfc, 0x44, 0x04, 0xde, 0xff, 0x55, 0x06, 0x7a, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x21, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0xfe, 0xda, 0xfe, 0x61, 0x09, 0x0a, 0x11, 0x12, 0x17, 0x15, 0x33, 0x15, 0x17, 0x12, 0x11, 0x0a, 0x09, 0x09, 0x0a, 0x11, 0x12, 0x17, 0x15, 0x1a, 0x01, 0x9e, 0x09, 0x0a, 0x11, 0x12, 0x17, 0x15, 0x33, 0x15, 0x17, 0x12, 0x12, 0x09, 0x09, 0x09, 0x0a, 0x11, 0x12, 0x17, 0x15, 0x05, 0x67, 0x1b, 0x19, 0x1b, 0x12, 0x13, 0x0b, 0x0a, 0x0a, 0x0b, 0x13, 0x12, 0x1b, 0x19, 0x1b, 0x1c, 0x19, 0x1b, 0x12, 0x13, 0x0b, 0x0a, 0x1b, 0x19, 0x1b, 0x12, 0x13, 0x0b, 0x0a, 0x0a, 0x0b, 0x13, 0x15, 0x18, 0x19, 0x1c, 0x1b, 0x19, 0x1b, 0x12, 0x13, 0x0b, 0x0a, 0x00, 0x00, 0x01, 0xfd, 0x53, 0x05, 0x29, 0x00, 0x09, 0x06, 0x4d, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x20, 0x08, 0x6a, 0x15, 0x92, 0x53, 0x52, 0x84, 0x7b, 0x7d, 0x43, 0x6b, 0x70, 0x01, 0x07, 0x05, 0x29, 0x9b, 0x2f, 0x4b, 0x17, 0x86, 0x27, 0x2a, 0x43, 0x00, 0x01, 0xfd, 0xed, 0x04, 0xc2, 0xfe, 0xc8, 0x06, 0x61, 0x00, 0x08, 0x00, 0x00, 0x01, 0x22, 0x11, 0x35, 0x33, 0x15, 0x23, 0x14, 0x37, 0xfe, 0xc8, 0xda, 0xd9, 0x78, 0x79, 0x04, 0xc2, 0x01, 0x0b, 0x94, 0x9e, 0x9d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xed, 0x04, 0xc2, 0xfe, 0xc8, 0x06, 0x61, 0x00, 0x08, 0x00, 0x00, 0x01, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0xfe, 0xc8, 0xda, 0x78, 0x77, 0xd9, 0x05, 0xcd, 0xfe, 0xf5, 0x67, 0x03, 0x9d, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfa, 0x69, 0x04, 0xd9, 0x00, 0x09, 0x06, 0x4d, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x12, 0x21, 0x32, 0x05, 0x04, 0x25, 0x15, 0x24, 0x27, 0x24, 0x27, 0x26, 0x07, 0xfa, 0x69, 0x79, 0x01, 0x84, 0x67, 0x01, 0x25, 0x01, 0x13, 0x01, 0x03, 0xfe, 0x89, 0xd7, 0xfe, 0xf6, 0x5c, 0xc6, 0x89, 0x05, 0x01, 0x01, 0x4c, 0x7b, 0x74, 0x01, 0x86, 0x17, 0x5c, 0x71, 0x07, 0x0c, 0xcf, 0x00, 0x00, 0x00, 0x08, 0xf8, 0xa7, 0xfe, 0x90, 0x02, 0xf3, 0x07, 0x60, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x26, 0x00, 0x33, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x5a, 0x00, 0x67, 0x00, 0x00, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x05, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x05, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x05, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0xfe, 0xe6, 0x6a, 0x0a, 0x57, 0x4e, 0x4e, 0x56, 0x0c, 0x6a, 0x09, 0x8e, 0x01, 0x05, 0x8e, 0x02, 0xe6, 0x6a, 0x0a, 0x57, 0x4f, 0x4d, 0x57, 0x0b, 0x6a, 0x08, 0x8f, 0x01, 0x05, 0x8e, 0xfa, 0x50, 0x6a, 0x0a, 0x58, 0x4e, 0x4d, 0x57, 0x0c, 0x6a, 0x09, 0x8f, 0x01, 0x04, 0x8f, 0x05, 0xc2, 0x6a, 0x0a, 0x57, 0x4f, 0x4d, 0x57, 0x0b, 0x6a, 0x08, 0x8f, 0x01, 0x05, 0x8e, 0xfa, 0x50, 0x6a, 0x0a, 0x58, 0x4e, 0x4d, 0x57, 0x0c, 0x6a, 0x09, 0x8f, 0x01, 0x04, 0x8f, 0x06, 0xf1, 0x6a, 0x0a, 0x57, 0x4f, 0x4d, 0x56, 0x0c, 0x6a, 0x09, 0x8e, 0x01, 0x05, 0x8e, 0xf7, 0xf1, 0x6a, 0x0a, 0x57, 0x4e, 0x4e, 0x56, 0x0c, 0x6a, 0x09, 0x8e, 0x01, 0x05, 0x8e, 0x04, 0x15, 0x6a, 0x0a, 0x57, 0x4e, 0x4e, 0x56, 0x0c, 0x6a, 0x09, 0x8e, 0x01, 0x05, 0x8e, 0x06, 0x41, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0xfe, 0x51, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x8f, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0xfa, 0x01, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x8f, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x02, 0x29, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x8f, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0xfb, 0x98, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf9, 0x1c, 0xfd, 0xc3, 0x02, 0x7c, 0x08, 0x2d, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x23, 0x00, 0x29, 0x00, 0x2f, 0x00, 0x00, 0x27, 0x37, 0x17, 0x13, 0x07, 0x03, 0x01, 0x07, 0x27, 0x03, 0x37, 0x13, 0x01, 0x27, 0x37, 0x25, 0x17, 0x05, 0x01, 0x17, 0x07, 0x05, 0x27, 0x25, 0x01, 0x35, 0x33, 0x05, 0x15, 0x2d, 0x01, 0x15, 0x23, 0x25, 0x35, 0x05, 0x01, 0x23, 0x35, 0x13, 0x33, 0x0b, 0x01, 0x33, 0x15, 0x03, 0x23, 0x13, 0x60, 0x87, 0x6d, 0x64, 0x53, 0x98, 0xfb, 0xeb, 0x87, 0x6d, 0x64, 0x53, 0x98, 0x04, 0x9c, 0x87, 0x6e, 0x01, 0x33, 0x53, 0xff, 0x00, 0xfa, 0xde, 0x86, 0x6d, 0xfe, 0xcb, 0x52, 0x01, 0x00, 0x05, 0xbd, 0x9a, 0x01, 0x20, 0xfe, 0xe0, 0xf9, 0x7c, 0x9b, 0xfe, 0xe0, 0x01, 0x20, 0x03, 0xef, 0xbe, 0x94, 0x74, 0x4a, 0xbe, 0xbe, 0x93, 0x75, 0x4a, 0x5a, 0x96, 0x79, 0xfe, 0xa9, 0x5c, 0x01, 0x1d, 0x05, 0xb5, 0x96, 0x79, 0x01, 0x57, 0x5c, 0xfe, 0xe3, 0xfe, 0xf1, 0x95, 0x7a, 0x6e, 0x5b, 0xa9, 0xfb, 0x77, 0x96, 0x79, 0x6f, 0x5c, 0xa8, 0x02, 0x18, 0xd4, 0xa4, 0x82, 0x52, 0xd4, 0xd4, 0xa4, 0x82, 0x52, 0x02, 0xdf, 0xac, 0x01, 0x40, 0xfe, 0xc0, 0xf8, 0xc2, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x05, 0x63, 0x07, 0x6d, 0x10, 0x26, 0x11, 0xb6, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x76, 0x01, 0x75, 0xff, 0xff, 0x00, 0xad, 0xfe, 0x56, 0x04, 0xb3, 0x06, 0x14, 0x10, 0x26, 0x11, 0xb7, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9a, 0x00, 0x90, 0xff, 0xcc, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x01, 0x6b, 0x01, 0x2c, 0xe2, 0xf5, 0xf5, 0xe2, 0xfe, 0x1e, 0x97, 0x97, 0xb6, 0x97, 0x01, 0xac, 0x47, 0x46, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x93, 0x46, 0x47, 0x04, 0x51, 0xe2, 0xda, 0xde, 0xdd, 0xda, 0x04, 0x51, 0xa4, 0xe0, 0xe0, 0xa4, 0xfd, 0x66, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, 0x00, 0x03, 0xd8, 0x05, 0x9e, 0x00, 0x0a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x37, 0x36, 0x01, 0x11, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x03, 0x27, 0x37, 0x3d, 0x73, 0xed, 0xed, 0x74, 0x3c, 0x37, 0xfe, 0x2c, 0xf4, 0xbb, 0x6d, 0x69, 0x69, 0x67, 0xc1, 0xfe, 0x67, 0x8c, 0x8c, 0xa5, 0x8e, 0x01, 0x4c, 0x5e, 0x2a, 0x2e, 0xfe, 0x97, 0x2e, 0x2b, 0x02, 0xdf, 0xfe, 0xca, 0x55, 0x52, 0xfe, 0xb0, 0x52, 0x52, 0x03, 0xd1, 0x8f, 0x01, 0x3e, 0xfe, 0xc2, 0x8f, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x65, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x17, 0x07, 0x27, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x27, 0x36, 0x37, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x37, 0x27, 0x37, 0x03, 0xe6, 0x7e, 0x5f, 0x84, 0x71, 0xc1, 0xe4, 0xb6, 0x01, 0x9a, 0xe2, 0x73, 0x74, 0xcb, 0x0b, 0x01, 0x8b, 0x7f, 0xe4, 0xe4, 0x67, 0x40, 0xc2, 0x60, 0x03, 0x23, 0x75, 0x7e, 0x7b, 0x53, 0xfd, 0xa8, 0x05, 0xd5, 0x71, 0x72, 0xdb, 0x92, 0x2d, 0x2c, 0x39, 0x86, 0x92, 0xfd, 0xcf, 0x2f, 0xb4, 0x7e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x10, 0x00, 0x29, 0x00, 0x00, 0x25, 0x27, 0x37, 0x17, 0x36, 0x35, 0x34, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x1f, 0x01, 0x07, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x02, 0xd9, 0x7e, 0x63, 0x7c, 0x47, 0x4a, 0x4c, 0xfe, 0xf9, 0x4b, 0x4b, 0x4b, 0x4b, 0x84, 0x3f, 0xfe, 0x85, 0x64, 0x86, 0x4f, 0x61, 0x6f, 0x4f, 0x50, 0x34, 0xa7, 0xa7, 0x34, 0x50, 0x4f, 0x6f, 0xb8, 0x72, 0x73, 0x73, 0x0b, 0x98, 0xa7, 0x5d, 0xa5, 0x73, 0xc5, 0xcb, 0x74, 0x73, 0x74, 0x73, 0xfe, 0x6a, 0x74, 0x73, 0x14, 0xae, 0x5d, 0xb3, 0x2e, 0x30, 0x31, 0x64, 0xfd, 0xae, 0x06, 0x0a, 0xaa, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0xfd, 0xf0, 0xa2, 0x0f, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x07, 0x07, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0xb5, 0x02, 0xab, 0x99, 0xfd, 0x72, 0x05, 0xd5, 0x01, 0x32, 0xfe, 0x24, 0xfa, 0xd5, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x6f, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0xa7, 0x02, 0x43, 0x84, 0xfd, 0xdf, 0x04, 0x60, 0x01, 0x3a, 0xfe, 0x33, 0xfc, 0x33, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x04, 0x71, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x2d, 0xed, 0xed, 0x03, 0x44, 0xfd, 0x71, 0x01, 0xed, 0xfe, 0x13, 0x02, 0x94, 0xaa, 0x02, 0x97, 0xaa, 0xfe, 0x13, 0xaa, 0xfd, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x00, 0x03, 0xe7, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x1f, 0xed, 0xed, 0x02, 0xc7, 0xfd, 0xdf, 0x01, 0x76, 0xfe, 0x8a, 0x01, 0xf4, 0xaa, 0x01, 0xc2, 0x9d, 0xfe, 0xdb, 0xaa, 0xfe, 0x0c, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0x52, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x01, 0x6b, 0xb6, 0x03, 0x44, 0xfd, 0x72, 0x01, 0x77, 0xa7, 0x66, 0x62, 0xb7, 0xce, 0x44, 0x38, 0x78, 0x33, 0x31, 0x6f, 0x70, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xaa, 0xfe, 0x46, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xa4, 0x04, 0x60, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x23, 0x01, 0x4d, 0xa6, 0x02, 0xc7, 0xfd, 0xdf, 0xe1, 0xed, 0x3f, 0x4a, 0x4a, 0x49, 0xa3, 0xae, 0x9b, 0x63, 0x1e, 0x22, 0x22, 0x2c, 0x79, 0x01, 0xe7, 0xfe, 0x19, 0x04, 0x60, 0xaa, 0xfe, 0xc1, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xaa, 0x20, 0x29, 0x00, 0x01, 0x00, 0x24, 0xfe, 0xbf, 0x07, 0xb6, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x01, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x03, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x03, 0x86, 0xb6, 0x02, 0x65, 0xdd, 0xfe, 0x15, 0x01, 0xa8, 0x7b, 0xb2, 0x24, 0xfe, 0x44, 0xe8, 0xb6, 0xe8, 0xfe, 0x44, 0xbe, 0x02, 0x0a, 0xfe, 0x16, 0xdc, 0x02, 0x66, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb3, 0xfd, 0x22, 0xfe, 0x15, 0x01, 0x41, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x01, 0xea, 0x01, 0x17, 0xfc, 0xff, 0x03, 0x88, 0x02, 0x4d, 0xfd, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0xe5, 0x06, 0x50, 0x04, 0x60, 0x00, 0x17, 0x00, 0x00, 0x01, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x27, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x02, 0xec, 0xa5, 0x01, 0xb8, 0xc0, 0xfe, 0x97, 0x01, 0x42, 0x6e, 0xa6, 0x1e, 0xfe, 0xad, 0xa8, 0xa5, 0xa8, 0xfe, 0xac, 0xb1, 0x01, 0x9e, 0xfe, 0x96, 0xc1, 0x01, 0xb8, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x51, 0xfd, 0xe8, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x36, 0xc9, 0xfe, 0x93, 0x01, 0x6d, 0xc9, 0xfd, 0xca, 0x02, 0xb1, 0x01, 0xaf, 0xfd, 0xf2, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x75, 0x04, 0x25, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7a, 0x33, 0x00, 0x12, 0x06, 0x03, 0xab, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xfe, 0x75, 0x03, 0x68, 0x04, 0x7c, 0x10, 0x26, 0x00, 0x7a, 0xd3, 0x00, 0x12, 0x06, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x22, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x03, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x89, 0xea, 0xfd, 0xf8, 0x01, 0xbc, 0x90, 0xb1, 0x3e, 0xfe, 0x2d, 0xf5, 0xb6, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb2, 0xfd, 0x23, 0xfe, 0x15, 0x01, 0x41, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x3b, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x07, 0x11, 0x23, 0xa7, 0xa5, 0x01, 0xd3, 0xcc, 0xfe, 0x7e, 0x01, 0x52, 0x80, 0xa6, 0x32, 0xfe, 0x9a, 0xb1, 0xa5, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x4f, 0xfd, 0xea, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x00, 0x13, 0x33, 0x11, 0x37, 0x11, 0x33, 0x15, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x07, 0x11, 0x23, 0xb5, 0xb6, 0x9b, 0x5a, 0x01, 0x94, 0xea, 0xfd, 0xf8, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0x5a, 0x9b, 0xb6, 0x05, 0xd5, 0xfd, 0x1e, 0xb1, 0x01, 0x54, 0xee, 0x01, 0xcb, 0xfd, 0xb2, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0x25, 0x01, 0x75, 0xb1, 0xfe, 0x16, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x1d, 0x04, 0x60, 0x00, 0x12, 0x00, 0x00, 0x13, 0x33, 0x11, 0x37, 0x35, 0x33, 0x15, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x35, 0x07, 0x11, 0x23, 0xa7, 0xa5, 0x56, 0x5b, 0x01, 0x22, 0xcc, 0xfe, 0x7e, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0x5b, 0x56, 0xa5, 0x04, 0x60, 0xfd, 0xf2, 0x61, 0xdd, 0x76, 0x01, 0x46, 0xfe, 0x4f, 0xfd, 0x51, 0x02, 0x35, 0xfe, 0xc5, 0xd4, 0x61, 0xfe, 0x93, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0x97, 0x97, 0x02, 0x89, 0xea, 0xfd, 0xf8, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0xf5, 0xb6, 0x97, 0x97, 0x05, 0xd5, 0xe0, 0x90, 0xfe, 0x8e, 0x02, 0xe2, 0xfd, 0xb2, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x04, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x1d, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xa7, 0xa5, 0x01, 0x40, 0xfe, 0xc0, 0x01, 0xd3, 0xcc, 0xfe, 0x7e, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0xb1, 0xa5, 0x70, 0x70, 0x06, 0x14, 0x7a, 0x7d, 0xfd, 0x35, 0x02, 0x0e, 0xfe, 0x4f, 0xfd, 0x51, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x05, 0x1d, 0x7d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x06, 0x07, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x21, 0x2d, 0x02, 0x4c, 0x02, 0x89, 0xea, 0xfd, 0xf8, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0xf5, 0xb6, 0xfe, 0x6a, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb2, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x05, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x25, 0x00, 0x00, 0x04, 0xf5, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x21, 0x26, 0x01, 0xff, 0x01, 0xd3, 0xcc, 0xfe, 0x7e, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0xb1, 0xa5, 0xfe, 0xa6, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x4f, 0xfd, 0x51, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x03, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0xb5, 0xb5, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0xe5, 0x04, 0xba, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xae, 0xa5, 0x02, 0x1b, 0xa6, 0xa6, 0xa6, 0xa6, 0xfd, 0xe5, 0xa5, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0xfc, 0x39, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x04, 0xfd, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x07, 0x44, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0x03, 0x44, 0xfd, 0x72, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xaa, 0xfa, 0xd5, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x06, 0x36, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xae, 0xa5, 0x02, 0x1b, 0x02, 0xc7, 0xfd, 0xdf, 0xa6, 0xfd, 0xe5, 0xa5, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0xaa, 0xfc, 0x4a, 0x02, 0x04, 0xfd, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x07, 0x9c, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x04, 0xb5, 0xb6, 0xfd, 0x6c, 0xb6, 0x04, 0x00, 0x01, 0x77, 0xa8, 0x66, 0x62, 0xb8, 0xcd, 0x45, 0x38, 0x79, 0x32, 0x32, 0x70, 0x6f, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0x2b, 0xfa, 0xd5, 0x05, 0xd5, 0xfd, 0x9c, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x06, 0x6b, 0x04, 0x60, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x07, 0x04, 0x14, 0xa6, 0xfd, 0xe5, 0xa5, 0x03, 0x66, 0xe1, 0xed, 0x3f, 0x49, 0x49, 0x49, 0xa3, 0xae, 0x9b, 0x63, 0x1e, 0x22, 0x22, 0x2c, 0x79, 0x01, 0xe7, 0xfe, 0x19, 0x03, 0xc6, 0xfc, 0x3a, 0x04, 0x60, 0xfe, 0x17, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xa4, 0x26, 0x2e, 0x05, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x45, 0x05, 0xf1, 0x00, 0x41, 0x00, 0x59, 0x00, 0x00, 0x25, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x04, 0x33, 0x32, 0x1e, 0x04, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x02, 0x35, 0x34, 0x12, 0x3e, 0x01, 0x37, 0x15, 0x0e, 0x03, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x04, 0x23, 0x22, 0x0e, 0x04, 0x15, 0x14, 0x1e, 0x02, 0x03, 0xc0, 0x33, 0x61, 0x4a, 0x2d, 0x11, 0x26, 0x3d, 0x57, 0x74, 0x4b, 0x46, 0x71, 0x57, 0x3f, 0x29, 0x13, 0x18, 0x38, 0x60, 0x49, 0x22, 0x5e, 0x35, 0x38, 0x5b, 0x2e, 0x2a, 0x6c, 0x37, 0x22, 0x49, 0x4c, 0x4f, 0x26, 0x3c, 0xaf, 0x6d, 0x99, 0xf1, 0xa9, 0x59, 0x51, 0x9b, 0xde, 0x8e, 0x68, 0x9a, 0x64, 0x33, 0x36, 0x6f, 0xab, 0x74, 0x4a, 0x73, 0x9f, 0x39, 0x4b, 0x2b, 0x12, 0x0a, 0x15, 0x20, 0x2b, 0x38, 0x22, 0x2c, 0x41, 0x2e, 0x1e, 0x10, 0x06, 0x24, 0x3b, 0x4c, 0xae, 0x31, 0x89, 0xaa, 0xc4, 0x6b, 0x42, 0x8a, 0x83, 0x74, 0x57, 0x32, 0x32, 0x54, 0x70, 0x7b, 0x7f, 0x3a, 0x53, 0xb4, 0xb2, 0xaa, 0x4a, 0x1a, 0x15, 0x13, 0x1a, 0xa8, 0x17, 0x12, 0x08, 0x14, 0x23, 0x1b, 0x26, 0x34, 0x74, 0xcf, 0x01, 0x1d, 0xa8, 0xa0, 0x01, 0x10, 0xcb, 0x7d, 0x0e, 0xa7, 0x16, 0x66, 0x9a, 0xcd, 0x7c, 0x7d, 0xde, 0xa7, 0x62, 0x19, 0x6d, 0x3a, 0x86, 0x8e, 0x91, 0x45, 0x2f, 0x66, 0x63, 0x59, 0x43, 0x28, 0x2b, 0x47, 0x5b, 0x60, 0x5f, 0x26, 0x62, 0xab, 0x8e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0xec, 0x04, 0x7a, 0x00, 0x3f, 0x00, 0x50, 0x00, 0x00, 0x13, 0x34, 0x3e, 0x02, 0x37, 0x15, 0x0e, 0x03, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x15, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x27, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x05, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x66, 0x43, 0x81, 0xbc, 0x79, 0x54, 0x7c, 0x52, 0x29, 0x2d, 0x57, 0x7c, 0x4f, 0x23, 0x4e, 0x19, 0x21, 0x38, 0x2b, 0x18, 0x24, 0x48, 0x69, 0x45, 0x3b, 0x65, 0x48, 0x29, 0x53, 0x56, 0x20, 0x3d, 0x1b, 0x18, 0x29, 0x25, 0x25, 0x16, 0x0f, 0x22, 0x28, 0x33, 0x21, 0x31, 0x75, 0x3d, 0x1b, 0x3f, 0x41, 0x40, 0x1c, 0x7a, 0xbe, 0x83, 0x44, 0x03, 0x00, 0x1f, 0x28, 0x18, 0x0a, 0x14, 0x1e, 0x24, 0x10, 0x17, 0x28, 0x1e, 0x11, 0x02, 0x28, 0x83, 0xd8, 0x9c, 0x58, 0x03, 0x9b, 0x06, 0x46, 0x72, 0x98, 0x58, 0x62, 0xa0, 0x72, 0x3e, 0x0b, 0x11, 0x25, 0x67, 0x78, 0x82, 0x40, 0x5d, 0x9f, 0x73, 0x41, 0x39, 0x68, 0x92, 0x59, 0x9b, 0xf1, 0x5e, 0x13, 0x0a, 0x04, 0x0a, 0x13, 0x0f, 0x9d, 0x0a, 0x11, 0x0c, 0x07, 0x1c, 0x2c, 0x12, 0x1b, 0x12, 0x09, 0x54, 0x99, 0xd6, 0xb8, 0x26, 0x5e, 0x64, 0x63, 0x2b, 0x4b, 0x69, 0x42, 0x1f, 0x26, 0x48, 0x69, 0x43, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x27, 0x00, 0x7a, 0x01, 0x0f, 0x00, 0x00, 0x12, 0x06, 0x03, 0xb5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x27, 0x00, 0x7a, 0x00, 0x81, 0x00, 0x00, 0x12, 0x06, 0x03, 0xd5, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0xbf, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x8e, 0xb5, 0xb5, 0xb6, 0xfe, 0x23, 0x04, 0x70, 0xfe, 0x23, 0xaa, 0xfe, 0x15, 0x01, 0x41, 0x05, 0x2b, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0xe5, 0x03, 0xfc, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x6a, 0xa6, 0xa6, 0xa3, 0xfe, 0x6f, 0x03, 0xc6, 0xfe, 0x6e, 0x99, 0xfe, 0x4c, 0x01, 0x1b, 0x03, 0xb6, 0xaa, 0xaa, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x08, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x7e, 0xaf, 0xfe, 0x68, 0xaf, 0x01, 0x3b, 0x01, 0x3b, 0xb0, 0x12, 0xfe, 0x44, 0x01, 0xbc, 0x04, 0x4e, 0xfc, 0x94, 0x03, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x00, 0x10, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x15, 0x33, 0x03, 0x7c, 0xee, 0xb6, 0xed, 0xed, 0xfe, 0x24, 0xc4, 0x01, 0x74, 0x01, 0x72, 0xc4, 0xfe, 0x24, 0xee, 0x01, 0x73, 0xfe, 0x8d, 0x01, 0x73, 0xaa, 0xaa, 0x03, 0x0e, 0xfd, 0x9a, 0x02, 0x66, 0xfc, 0xf2, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x10, 0x00, 0x00, 0x09, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x01, 0x33, 0x09, 0x01, 0x04, 0x0c, 0xfe, 0x72, 0xec, 0xec, 0xaf, 0xf6, 0xf6, 0xfe, 0x68, 0xaf, 0x01, 0x3b, 0x01, 0x3b, 0x04, 0x60, 0xfb, 0xb2, 0x58, 0xaa, 0xba, 0xba, 0xaa, 0x58, 0x04, 0x4e, 0xfc, 0x94, 0x03, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0xbf, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x04, 0x50, 0x65, 0xb1, 0x12, 0xfe, 0x86, 0xfe, 0x83, 0xc4, 0x01, 0xe0, 0xfe, 0x5d, 0xc3, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x50, 0xaa, 0xfe, 0x15, 0x01, 0x41, 0x02, 0x7b, 0xfd, 0x85, 0x03, 0x1d, 0x02, 0xb8, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x33, 0x00, 0x00, 0x01, 0x00, 0x35, 0xfe, 0xe5, 0x04, 0x07, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x03, 0xa1, 0x65, 0xa5, 0x1e, 0xfe, 0xdb, 0xfe, 0xda, 0xc3, 0x01, 0x88, 0xfe, 0x99, 0xc4, 0x01, 0x0b, 0x01, 0x0b, 0xc4, 0xfe, 0x93, 0x99, 0xfe, 0x4c, 0x01, 0x1b, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x4a, 0x02, 0x16, 0xfe, 0x71, 0x01, 0x8f, 0xfd, 0xdf, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0xbf, 0x06, 0x8d, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x8d, 0x02, 0x95, 0xb6, 0xb5, 0xb5, 0xfc, 0x00, 0xfe, 0x23, 0x04, 0x70, 0xfe, 0x23, 0xaa, 0x05, 0x2b, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0x05, 0x2b, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0xfe, 0xe5, 0x05, 0xa2, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x39, 0x02, 0x1e, 0xa5, 0xa6, 0xa6, 0xfc, 0x9a, 0xfe, 0x6e, 0x03, 0xc6, 0xfe, 0x6f, 0x99, 0x03, 0xc7, 0xfc, 0x39, 0xfe, 0x4c, 0x01, 0x1b, 0x03, 0xb6, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xfe, 0xbf, 0x04, 0xf0, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x11, 0x33, 0x04, 0x3b, 0xb5, 0xb5, 0xb7, 0xfe, 0x89, 0xa8, 0x65, 0x62, 0xb4, 0x70, 0x70, 0x01, 0x52, 0xb7, 0xaa, 0xfe, 0x15, 0x01, 0x41, 0x02, 0xc7, 0x77, 0x72, 0xee, 0x01, 0x37, 0xfe, 0xd9, 0x9f, 0x9e, 0x02, 0x64, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0xfe, 0xe5, 0x04, 0x40, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x11, 0x33, 0x03, 0x9a, 0xa5, 0xa5, 0xa6, 0xfe, 0xcb, 0x89, 0x5c, 0x53, 0xa6, 0x2e, 0x30, 0x5e, 0x01, 0x0b, 0xa6, 0x99, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x09, 0x5f, 0x56, 0xb8, 0xea, 0xd3, 0x75, 0x3b, 0x3b, 0x01, 0xbe, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x01, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x02, 0x42, 0x35, 0xa8, 0x65, 0x62, 0xb4, 0x70, 0x70, 0x10, 0x81, 0xc1, 0xb7, 0xb7, 0xc1, 0x81, 0x02, 0xc7, 0x77, 0x72, 0xee, 0x01, 0x37, 0xfe, 0xd9, 0x9f, 0x9e, 0x01, 0x39, 0xfe, 0xc7, 0x02, 0x64, 0xfa, 0x2b, 0x02, 0xc7, 0xfe, 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0x9a, 0x04, 0x60, 0x00, 0x18, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x15, 0x23, 0x35, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x01, 0xc6, 0x90, 0x9e, 0xa6, 0xa6, 0x9e, 0x90, 0x07, 0x89, 0x5c, 0x53, 0xa6, 0x2e, 0x27, 0x02, 0xa4, 0xc2, 0xc4, 0x01, 0xbe, 0xfb, 0xa0, 0x02, 0x09, 0xc4, 0xc4, 0x5f, 0x56, 0xb8, 0xea, 0xd3, 0x75, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x01, 0x54, 0x01, 0x78, 0xa7, 0xc8, 0xb5, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0xe9, 0xee, 0xfe, 0x66, 0x01, 0x8a, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xe3, 0x06, 0x5f, 0x05, 0xf0, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x12, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x13, 0x21, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x20, 0x27, 0x26, 0x03, 0x06, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x25, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x01, 0x87, 0x1e, 0x87, 0xa9, 0x01, 0x1b, 0x01, 0x23, 0xa3, 0xa8, 0x01, 0xfb, 0xe5, 0xf6, 0xf7, 0x7d, 0xe3, 0x65, 0x64, 0x76, 0x77, 0x83, 0xfe, 0xc4, 0xb1, 0xa9, 0x09, 0x99, 0x6a, 0x6e, 0x99, 0x43, 0x3c, 0x01, 0x20, 0x03, 0x4f, 0x16, 0x58, 0x75, 0xfe, 0x74, 0x73, 0x57, 0x03, 0x6d, 0x01, 0x0a, 0xa7, 0xd2, 0xd2, 0xdb, 0xfe, 0x84, 0xfe, 0xf4, 0xfe, 0xce, 0x60, 0x5f, 0xd7, 0x46, 0x24, 0x24, 0xcd, 0xc2, 0x01, 0x55, 0x01, 0x67, 0x6b, 0xdf, 0x4c, 0x3e, 0xa0, 0x41, 0x39, 0x02, 0xbf, 0x7c, 0xa4, 0xa4, 0x7c, 0x00, 0x00, 0x02, 0x00, 0x0d, 0xff, 0xe3, 0x04, 0xdc, 0x04, 0x7b, 0x00, 0x25, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x36, 0x82, 0x50, 0x56, 0x8c, 0x2b, 0x33, 0x43, 0x17, 0x69, 0x83, 0xe6, 0xcb, 0x76, 0x77, 0xfd, 0x06, 0x0b, 0x5c, 0x5d, 0xa4, 0x60, 0x5a, 0x59, 0x58, 0x5d, 0x5a, 0x63, 0x5b, 0xf2, 0x8c, 0x85, 0x02, 0xf9, 0x02, 0x49, 0x4b, 0x7a, 0x8b, 0x54, 0x53, 0x0c, 0x02, 0x04, 0x52, 0x5a, 0xac, 0x46, 0x31, 0x97, 0x21, 0x26, 0xc5, 0x82, 0xa1, 0x91, 0x92, 0xfa, 0x5a, 0xbe, 0x64, 0x63, 0x1a, 0x1a, 0x34, 0xae, 0x2c, 0x14, 0x16, 0x9c, 0x94, 0x01, 0x81, 0x97, 0x5a, 0x5a, 0x57, 0x57, 0x9e, 0x00, 0x00, 0x02, 0x00, 0x12, 0xfe, 0x87, 0x06, 0x5f, 0x05, 0xf0, 0x00, 0x07, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x07, 0x12, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x13, 0x21, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x03, 0x06, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x02, 0x4a, 0x03, 0x4f, 0x16, 0x58, 0x75, 0xfe, 0x74, 0x73, 0x57, 0xd9, 0x1e, 0x87, 0xa9, 0x01, 0x1b, 0x01, 0x23, 0xa3, 0xa8, 0x01, 0xfb, 0xe5, 0xf6, 0xf7, 0x7d, 0xe3, 0x65, 0x64, 0x76, 0x62, 0x6c, 0xa0, 0xe9, 0x90, 0xa9, 0x09, 0x99, 0x6a, 0x6e, 0x99, 0x43, 0x3c, 0x03, 0x6d, 0xbf, 0x7c, 0xa4, 0xa4, 0x7c, 0xbf, 0x01, 0x0a, 0xa7, 0xd2, 0xd2, 0xdb, 0xfe, 0x84, 0xfe, 0xf4, 0xfe, 0xce, 0x60, 0x5f, 0xd7, 0x46, 0x24, 0x1e, 0x05, 0xfe, 0xa3, 0x01, 0x63, 0x20, 0xa6, 0xc3, 0x01, 0x54, 0x01, 0x67, 0x6b, 0xdf, 0x4c, 0x3e, 0xa0, 0x41, 0x39, 0x00, 0x00, 0x02, 0x00, 0x0d, 0xfe, 0xb7, 0x04, 0xdc, 0x04, 0x7b, 0x00, 0x08, 0x00, 0x31, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x04, 0x36, 0x02, 0x49, 0x4b, 0x7a, 0x8b, 0x54, 0x53, 0x0c, 0xb2, 0x82, 0x50, 0x56, 0x8c, 0x2b, 0x33, 0x43, 0x17, 0x69, 0x83, 0xe6, 0xcb, 0x76, 0x77, 0xfd, 0x06, 0x0b, 0x5c, 0x5d, 0xa4, 0x60, 0x5a, 0x59, 0x58, 0x5d, 0x5a, 0x47, 0x42, 0x96, 0xae, 0x6f, 0x85, 0x02, 0x94, 0x97, 0x5a, 0x5a, 0x57, 0x57, 0x9e, 0x8f, 0x52, 0x5a, 0xac, 0x46, 0x31, 0x97, 0x21, 0x26, 0xc5, 0x82, 0xa1, 0x91, 0x92, 0xfa, 0x5a, 0xbe, 0x64, 0x63, 0x1a, 0x1a, 0x34, 0xae, 0x2c, 0x14, 0x10, 0x04, 0xfe, 0xd2, 0x01, 0x33, 0x1a, 0x7b, 0x94, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x07, 0x9e, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x05, 0xb8, 0x01, 0x75, 0x12, 0x06, 0x03, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x06, 0x3e, 0x06, 0x48, 0x10, 0x27, 0x02, 0x9a, 0x01, 0x7e, 0x00, 0x00, 0x12, 0x06, 0x03, 0xca, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0xb0, 0x05, 0xd5, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x02, 0x65, 0x7d, 0xa7, 0x66, 0x62, 0xb7, 0xce, 0x44, 0x38, 0x78, 0x33, 0x31, 0x6f, 0x70, 0xfe, 0xae, 0xb6, 0xb6, 0x02, 0x5b, 0xea, 0x03, 0x71, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0x00, 0x00, 0x01, 0x00, 0xab, 0xfe, 0x56, 0x04, 0x14, 0x04, 0x60, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x02, 0x21, 0x12, 0xeb, 0x41, 0x4a, 0x4a, 0x49, 0xa3, 0xad, 0x9a, 0x63, 0x1e, 0x22, 0x22, 0x27, 0x7e, 0xea, 0xa6, 0xa6, 0x01, 0xee, 0xd4, 0x02, 0x77, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xa6, 0x24, 0x29, 0xfe, 0x19, 0x04, 0x60, 0xfe, 0x1d, 0x01, 0xe3, 0x00, 0x00, 0x01, 0x00, 0x30, 0xfe, 0x56, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x35, 0x36, 0x37, 0x12, 0x19, 0x01, 0x21, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0xb4, 0xb6, 0xfe, 0x4c, 0x77, 0x58, 0xfe, 0xb6, 0xbe, 0x3d, 0x69, 0x03, 0x1f, 0xb5, 0xfe, 0xb7, 0x79, 0x05, 0x2b, 0xd4, 0xfe, 0x18, 0xfe, 0xaa, 0xfd, 0x38, 0xa7, 0x2e, 0xa8, 0x01, 0x25, 0x02, 0x35, 0x01, 0x1a, 0xfa, 0xd5, 0xaa, 0xfe, 0x56, 0x00, 0x01, 0x00, 0x29, 0xfe, 0x56, 0x04, 0xa7, 0x04, 0x60, 0x00, 0x14, 0x00, 0x00, 0x25, 0x33, 0x15, 0x01, 0x23, 0x13, 0x23, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x04, 0x01, 0xa6, 0xfe, 0xfb, 0x6f, 0xce, 0xa5, 0xfe, 0xa1, 0x6a, 0x54, 0xfe, 0xea, 0xa1, 0x36, 0x58, 0x02, 0xa9, 0x99, 0x99, 0xfe, 0x56, 0x01, 0xaa, 0x03, 0xc7, 0x86, 0xfe, 0x92, 0xfe, 0xfc, 0xcf, 0x1d, 0x99, 0x1b, 0x7f, 0xcf, 0x01, 0xa7, 0xd4, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x03, 0xff, 0xfd, 0x6c, 0xb6, 0xb6, 0x02, 0x94, 0xb6, 0xb9, 0xcd, 0x44, 0x38, 0x78, 0x33, 0x31, 0x68, 0x02, 0x5f, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x04, 0x14, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x05, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x03, 0x6e, 0xfd, 0xe5, 0xa5, 0xa5, 0x02, 0x1b, 0xa6, 0x4a, 0x49, 0xa3, 0xad, 0x9b, 0x62, 0x1e, 0x22, 0x14, 0x02, 0x18, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0xfb, 0x8c, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x37, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x10, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0xb5, 0xb6, 0xfd, 0x6c, 0xb6, 0xb6, 0x02, 0x94, 0xb6, 0xb5, 0xfe, 0xb7, 0x79, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0xd5, 0xaa, 0xfe, 0x56, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x04, 0xba, 0x04, 0x60, 0x00, 0x10, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0x14, 0xa6, 0xfd, 0xe5, 0xa5, 0xa5, 0x02, 0x1b, 0xa6, 0xa6, 0xfe, 0xfb, 0x6f, 0x02, 0x04, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0xfc, 0x39, 0x99, 0xfe, 0x56, 0x00, 0x01, 0x00, 0x9d, 0xfe, 0xbf, 0x04, 0x3b, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x25, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x03, 0x84, 0xfe, 0x89, 0xa8, 0x65, 0x62, 0xb4, 0x70, 0x70, 0x01, 0x52, 0xb7, 0xb7, 0xb5, 0xaa, 0x02, 0x1d, 0x77, 0x72, 0xee, 0x01, 0x37, 0xfe, 0xd9, 0x9f, 0x9e, 0x02, 0x64, 0xfa, 0x2b, 0xfe, 0xbf, 0x01, 0xeb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0xfe, 0xe5, 0x03, 0x9a, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x25, 0x11, 0x21, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x02, 0xf4, 0xfe, 0xcb, 0x89, 0x5c, 0x53, 0xa6, 0x2e, 0x30, 0x5e, 0x01, 0x0b, 0xa6, 0xa6, 0xa6, 0x99, 0x01, 0x70, 0x5f, 0x56, 0xb8, 0xea, 0xd3, 0x75, 0x3b, 0x3b, 0x01, 0xbe, 0xfb, 0xa0, 0xfe, 0xe5, 0x01, 0xb4, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x06, 0x38, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x25, 0x33, 0x15, 0x01, 0x23, 0x01, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x21, 0x09, 0x01, 0x21, 0x05, 0x82, 0xb5, 0xfe, 0xb7, 0x79, 0x01, 0x0d, 0xb1, 0xfe, 0xa5, 0xb6, 0xfe, 0xa5, 0xb0, 0x01, 0x0f, 0x01, 0x57, 0x01, 0x58, 0x01, 0x0f, 0xaa, 0xaa, 0xfe, 0x56, 0x01, 0xaa, 0x05, 0x1f, 0xfc, 0x00, 0x04, 0x00, 0xfa, 0xe1, 0x05, 0xd5, 0xfc, 0x08, 0x03, 0xf8, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x05, 0x67, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x25, 0x33, 0x15, 0x01, 0x23, 0x13, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x33, 0x09, 0x01, 0x33, 0x04, 0xc1, 0xa5, 0xfe, 0xfb, 0x6e, 0xce, 0xa0, 0xfe, 0xe9, 0xa5, 0xfe, 0xe9, 0xa0, 0xec, 0x01, 0x1e, 0x01, 0x1f, 0xea, 0x99, 0x99, 0xfe, 0x56, 0x01, 0xaa, 0x03, 0xb0, 0xfd, 0x27, 0x02, 0xd9, 0xfc, 0x50, 0x04, 0x60, 0xfd, 0x12, 0x02, 0xee, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x92, 0x10, 0x27, 0x02, 0x9a, 0x00, 0xb9, 0x01, 0x4a, 0x13, 0x06, 0x03, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x1f, 0x10, 0x26, 0x02, 0x9a, 0x47, 0xd7, 0x13, 0x06, 0x03, 0xc4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x4e, 0x12, 0x26, 0x03, 0xa4, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x10, 0x12, 0x26, 0x03, 0xc4, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x06, 0x8e, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x04, 0x7b, 0x12, 0x06, 0x00, 0xa8, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x2a, 0x01, 0x75, 0x13, 0x06, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x48, 0x10, 0x27, 0x02, 0x9a, 0x00, 0x87, 0x00, 0x00, 0x13, 0x06, 0x03, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x06, 0x02, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x9d, 0x01, 0x75, 0x12, 0x06, 0x04, 0x6c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x4c, 0x00, 0x12, 0x06, 0x04, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x07, 0x9e, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x05, 0xaf, 0x01, 0x75, 0x12, 0x06, 0x03, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x06, 0x3e, 0x06, 0x10, 0x10, 0x27, 0x00, 0x6a, 0x01, 0x75, 0x00, 0x00, 0x12, 0x06, 0x03, 0xca, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x25, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x13, 0x01, 0x75, 0x12, 0x06, 0x03, 0xab, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x34, 0x00, 0x12, 0x06, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0xff, 0xc1, 0x04, 0x79, 0x05, 0xd5, 0x12, 0x06, 0x01, 0x79, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0xc4, 0x04, 0x60, 0x12, 0x06, 0x02, 0x54, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0xdc, 0x01, 0x3b, 0x12, 0x06, 0x03, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x05, 0xf5, 0x10, 0x27, 0x00, 0x71, 0x00, 0x83, 0xff, 0xff, 0x12, 0x06, 0x03, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x76, 0x01, 0x75, 0x12, 0x06, 0x03, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x06, 0x10, 0x10, 0x27, 0x00, 0x6a, 0x00, 0x83, 0x00, 0x00, 0x12, 0x06, 0x03, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x4e, 0x12, 0x26, 0x03, 0xb2, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0xa3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x10, 0x12, 0x26, 0x03, 0xd2, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x12, 0x06, 0x02, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x4e, 0x12, 0x26, 0x04, 0x7c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xeb, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x10, 0x12, 0x26, 0x04, 0x7d, 0x00, 0x00, 0x10, 0x06, 0x00, 0x6a, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x04, 0xa0, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x03, 0xf6, 0x01, 0x75, 0x12, 0x06, 0x03, 0xc1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0xe5, 0x00, 0x12, 0x06, 0x03, 0xe1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0x67, 0x01, 0x3b, 0x12, 0x06, 0x03, 0xb7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x55, 0xff, 0x12, 0x06, 0x03, 0xd7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x03, 0xb7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x55, 0x00, 0x12, 0x06, 0x03, 0xd7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xf4, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x03, 0xb7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x66, 0x10, 0x26, 0x02, 0x9f, 0x55, 0x00, 0x12, 0x06, 0x03, 0xd7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x51, 0x01, 0x75, 0x12, 0x06, 0x03, 0xbb, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0x00, 0x00, 0x03, 0x9a, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x55, 0x00, 0x12, 0x06, 0x03, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0xb5, 0x03, 0x44, 0xfd, 0x72, 0xb5, 0xb5, 0x05, 0xd5, 0xaa, 0xfb, 0x7f, 0xfe, 0x15, 0x01, 0x41, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x03, 0x6f, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0xa7, 0x02, 0xc7, 0xfd, 0xdf, 0xa6, 0xa6, 0x04, 0x60, 0xaa, 0xfc, 0xe3, 0xfe, 0x4c, 0x01, 0x1b, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xa6, 0x07, 0x4e, 0x12, 0x26, 0x03, 0xbf, 0x00, 0x00, 0x10, 0x07, 0x10, 0xeb, 0x05, 0x25, 0x01, 0x75, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x05, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x03, 0xdf, 0x00, 0x00, 0x10, 0x07, 0x00, 0x6a, 0x00, 0xee, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0x56, 0x04, 0x71, 0x05, 0xd5, 0x00, 0x19, 0x00, 0x00, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x01, 0x2d, 0xed, 0xed, 0x03, 0x44, 0xfd, 0x71, 0x01, 0xed, 0xfe, 0x13, 0x01, 0x45, 0x40, 0x49, 0xac, 0xe5, 0xd2, 0x5e, 0x45, 0x02, 0x94, 0xaa, 0x02, 0x97, 0xaa, 0xfe, 0x13, 0xaa, 0xfd, 0xec, 0x94, 0xc8, 0x60, 0x6e, 0x9c, 0x61, 0xad, 0x00, 0x00, 0x01, 0x00, 0x32, 0xfe, 0x56, 0x03, 0xe7, 0x04, 0x60, 0x00, 0x19, 0x00, 0x00, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x01, 0x1f, 0xed, 0xed, 0x02, 0xc7, 0xfd, 0xdf, 0x01, 0x76, 0xfe, 0x8a, 0x01, 0x49, 0x3f, 0x4a, 0xad, 0xe4, 0xd2, 0x5f, 0x43, 0x01, 0xf4, 0xaa, 0x01, 0xc2, 0x9d, 0xfe, 0xdb, 0xaa, 0xfe, 0x8c, 0x94, 0xc8, 0x60, 0x6e, 0x9c, 0x61, 0xad, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x66, 0x04, 0xa6, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x25, 0x16, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x04, 0xa6, 0x01, 0x02, 0x0e, 0x4a, 0x5c, 0xcd, 0x45, 0x38, 0x7a, 0x31, 0x24, 0x0a, 0xfe, 0x88, 0xfe, 0x83, 0xc4, 0x01, 0xe0, 0xfe, 0x5d, 0xc3, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x50, 0x1a, 0x02, 0x18, 0xbe, 0x62, 0x7a, 0xaa, 0x4b, 0x35, 0x73, 0x02, 0x78, 0xfd, 0x85, 0x03, 0x1d, 0x02, 0xb8, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x60, 0x00, 0x17, 0x00, 0x00, 0x09, 0x02, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x32, 0x37, 0x3e, 0x01, 0x35, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x03, 0xf4, 0xfe, 0x93, 0x01, 0x47, 0x18, 0x3c, 0x49, 0xb1, 0xad, 0xb0, 0x17, 0x47, 0x2f, 0xfe, 0xde, 0xfe, 0xda, 0xc3, 0x01, 0x88, 0xfe, 0x99, 0xc4, 0x01, 0x0b, 0x01, 0x0b, 0x04, 0x60, 0xfd, 0xdf, 0xfe, 0x17, 0x26, 0x39, 0xcd, 0x61, 0x73, 0x9c, 0x03, 0x0a, 0x6d, 0x98, 0x01, 0xb4, 0xfe, 0x48, 0x02, 0x4a, 0x02, 0x16, 0xfe, 0x71, 0x01, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x01, 0x21, 0x15, 0x21, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x21, 0x35, 0x21, 0x74, 0xc3, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x7a, 0x01, 0x4e, 0xfe, 0xb5, 0x01, 0xa0, 0xc3, 0xfe, 0x86, 0xfe, 0x83, 0xc4, 0x01, 0xa5, 0xfe, 0xb1, 0x01, 0x6e, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x77, 0x90, 0xfd, 0x44, 0x02, 0x7b, 0xfd, 0x85, 0x02, 0xbc, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x33, 0x15, 0x21, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x21, 0x35, 0x01, 0x8b, 0xfe, 0xcb, 0xc4, 0x01, 0x0b, 0x01, 0x0b, 0xc4, 0xfe, 0xcc, 0xf2, 0xfe, 0xfd, 0x01, 0x57, 0xc3, 0xfe, 0xdb, 0xfe, 0xda, 0xc3, 0x01, 0x59, 0xfe, 0xfc, 0x02, 0x94, 0x01, 0xcc, 0xfe, 0x71, 0x01, 0x8f, 0xfe, 0x34, 0x90, 0xfd, 0xfc, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x04, 0x90, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x04, 0x3c, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x33, 0x21, 0x11, 0x21, 0x22, 0x07, 0x06, 0x01, 0x11, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x01, 0x42, 0x47, 0x47, 0x92, 0x01, 0x24, 0xfe, 0xdc, 0x92, 0x47, 0x47, 0x02, 0xfa, 0xfe, 0x1d, 0xe2, 0xf5, 0xf5, 0xe2, 0x01, 0x2d, 0x01, 0xb7, 0x8a, 0x43, 0x44, 0x02, 0x23, 0x43, 0x44, 0x03, 0x93, 0xfa, 0x2b, 0xda, 0xdd, 0xde, 0xda, 0x02, 0x66, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x03, 0x90, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x07, 0x06, 0x01, 0x11, 0x21, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x3b, 0x01, 0x11, 0x01, 0x16, 0x38, 0x3b, 0x74, 0xed, 0xed, 0x73, 0x3c, 0x38, 0x02, 0x7a, 0xfe, 0x66, 0xc0, 0x68, 0x68, 0x68, 0x6d, 0xbb, 0xf4, 0x01, 0x4c, 0x5a, 0x2b, 0x2e, 0x01, 0x69, 0x2e, 0x2a, 0x02, 0xb6, 0xfb, 0xa0, 0x52, 0x52, 0x01, 0x50, 0x52, 0x55, 0x01, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0xff, 0xe3, 0x06, 0x8a, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x30, 0x00, 0x00, 0x01, 0x21, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x13, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x03, 0x86, 0xfe, 0xdc, 0x92, 0x47, 0x47, 0x47, 0x56, 0x74, 0xa2, 0x43, 0x4e, 0x1e, 0x0b, 0x0d, 0x2e, 0x5f, 0x55, 0x63, 0xd6, 0x74, 0x7b, 0xf5, 0xe2, 0x01, 0x2d, 0xb5, 0x38, 0x2f, 0x65, 0x5f, 0x35, 0x38, 0xb6, 0x63, 0x5e, 0xc1, 0xc3, 0x5c, 0x2c, 0x02, 0xc9, 0x43, 0x44, 0xfe, 0xea, 0x50, 0x5f, 0x6d, 0x7d, 0x9f, 0xfe, 0xdd, 0x1d, 0x1c, 0x60, 0x36, 0x31, 0x81, 0x89, 0xca, 0xde, 0xda, 0x02, 0x66, 0xfb, 0xec, 0x8f, 0x5b, 0x4a, 0x4a, 0x4f, 0x9b, 0x02, 0x9f, 0xfd, 0x5a, 0xe0, 0x7f, 0x78, 0x78, 0x39, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x05, 0xce, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x30, 0x00, 0x00, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x13, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x02, 0xea, 0xed, 0x73, 0x3c, 0x38, 0x3b, 0x39, 0x60, 0x85, 0x53, 0x28, 0x2c, 0x3c, 0x54, 0x54, 0x7b, 0x9b, 0x5b, 0x5b, 0x68, 0x6d, 0xbb, 0xf4, 0xa6, 0x38, 0x36, 0x5f, 0x5d, 0x36, 0x38, 0xa6, 0x5a, 0x5e, 0xb9, 0xbe, 0x5a, 0x1c, 0x02, 0x02, 0x2e, 0x2a, 0x5e, 0x5c, 0x3a, 0x39, 0x6d, 0x34, 0x9c, 0xfe, 0xf6, 0x6c, 0x30, 0x31, 0x61, 0x60, 0xa6, 0xaa, 0x52, 0x55, 0x01, 0xc5, 0xfd, 0x61, 0x9f, 0x50, 0x4f, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x78, 0x25, 0x00, 0x01, 0x00, 0xb4, 0xff, 0xe3, 0x06, 0x50, 0x05, 0xf0, 0x00, 0x37, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x4c, 0x53, 0x53, 0x95, 0x9c, 0xa3, 0x86, 0x48, 0x47, 0x49, 0x4a, 0x89, 0x4b, 0xaa, 0x67, 0x67, 0x5a, 0x5b, 0x50, 0xcf, 0x79, 0x79, 0x40, 0x40, 0x76, 0x82, 0x4a, 0x49, 0x39, 0x2f, 0x64, 0x5f, 0x35, 0x39, 0xb6, 0x64, 0x5d, 0xc2, 0xc3, 0x5c, 0x2b, 0x19, 0x1e, 0x01, 0xb2, 0x84, 0x4a, 0x4b, 0xa6, 0x3b, 0x3c, 0x70, 0x73, 0x3d, 0x3e, 0x24, 0x26, 0xb4, 0x20, 0x10, 0x10, 0x68, 0x69, 0xb2, 0x7c, 0x55, 0x56, 0x21, 0x1f, 0x62, 0x62, 0x90, 0x80, 0x5b, 0x4a, 0x4a, 0x4f, 0x9b, 0x02, 0x9f, 0xfd, 0x5a, 0xe0, 0x7f, 0x78, 0x78, 0x38, 0x50, 0x61, 0x00, 0x01, 0x00, 0x99, 0xff, 0xe3, 0x05, 0xa6, 0x04, 0x7c, 0x00, 0x35, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x02, 0xc4, 0x46, 0x41, 0x7b, 0x85, 0x8b, 0x69, 0x3c, 0x3d, 0x3f, 0x3e, 0x6b, 0x40, 0x49, 0x48, 0x57, 0x58, 0x99, 0x45, 0xb0, 0x66, 0x66, 0x36, 0x36, 0x65, 0x75, 0x39, 0x3e, 0x38, 0x37, 0x5e, 0x5e, 0x36, 0x38, 0xa5, 0x5a, 0x5d, 0xba, 0xb3, 0x65, 0x58, 0x01, 0x38, 0x66, 0x38, 0x33, 0x98, 0x2c, 0x2d, 0x46, 0x40, 0x2e, 0x2e, 0x0d, 0x0d, 0x1d, 0xa7, 0x18, 0x18, 0x4e, 0x4f, 0x8d, 0x5d, 0x40, 0x41, 0x18, 0x19, 0x48, 0x4f, 0x48, 0x58, 0x44, 0x45, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x75, 0x65, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0xb6, 0x05, 0xf0, 0x00, 0x29, 0x00, 0x00, 0x21, 0x23, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x23, 0x04, 0x01, 0xb5, 0x53, 0x53, 0x95, 0x9c, 0xa3, 0x86, 0x48, 0x47, 0x49, 0x4a, 0x89, 0x4b, 0xaa, 0x67, 0x67, 0x5a, 0x5b, 0x50, 0xcf, 0x79, 0x79, 0x40, 0x40, 0x76, 0x82, 0x4a, 0x49, 0xb5, 0xb5, 0x01, 0xb1, 0x85, 0x4a, 0x4b, 0xa6, 0x3b, 0x3c, 0x70, 0x73, 0x3d, 0x3e, 0x24, 0x26, 0xb4, 0x20, 0x10, 0x10, 0x68, 0x69, 0xb2, 0x7c, 0x55, 0x56, 0x21, 0x1f, 0x62, 0x61, 0x92, 0xfe, 0xf9, 0xfd, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0xfe, 0x56, 0x04, 0x10, 0x04, 0x7c, 0x00, 0x29, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x03, 0x67, 0xa9, 0xa6, 0xa6, 0x46, 0x41, 0x7b, 0x85, 0x8b, 0x69, 0x3c, 0x3d, 0x3f, 0x3e, 0x6b, 0x40, 0x49, 0x48, 0x57, 0x58, 0x99, 0x45, 0xb0, 0x66, 0x66, 0x36, 0x36, 0x65, 0x72, 0x3c, 0x3e, 0x99, 0xfd, 0xbd, 0x01, 0xaa, 0x01, 0x46, 0x58, 0x38, 0x33, 0x98, 0x2c, 0x2d, 0x46, 0x40, 0x2e, 0x2e, 0x0d, 0x0d, 0x1d, 0xa7, 0x18, 0x18, 0x4e, 0x4f, 0x8d, 0x5d, 0x40, 0x41, 0x18, 0x18, 0x49, 0x4b, 0x6a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0xff, 0xe3, 0x07, 0x03, 0x05, 0xd5, 0x00, 0x21, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x35, 0x36, 0x37, 0x12, 0x19, 0x01, 0x04, 0xb4, 0x39, 0x2f, 0x64, 0x5f, 0x35, 0x39, 0xb6, 0x63, 0x5e, 0xc2, 0xc0, 0x5f, 0x63, 0xfe, 0x4c, 0x77, 0x58, 0xfe, 0xb6, 0xbe, 0x3d, 0x69, 0x05, 0xd5, 0xfb, 0xec, 0x8f, 0x5b, 0x4a, 0x4a, 0x4f, 0x9b, 0x02, 0x9f, 0xfd, 0x5a, 0xe0, 0x7f, 0x78, 0x78, 0x7d, 0xe2, 0x03, 0x71, 0xd4, 0xfe, 0x18, 0xfe, 0xaa, 0xfd, 0x38, 0xa7, 0x2e, 0xa8, 0x01, 0x25, 0x02, 0x35, 0x01, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0xff, 0xe3, 0x06, 0x3d, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x04, 0x01, 0x6e, 0x5d, 0x5d, 0x36, 0x38, 0xa6, 0x5a, 0x5e, 0xb9, 0xb4, 0x64, 0x58, 0xfe, 0xa1, 0x6a, 0x54, 0xfe, 0xea, 0xa1, 0x36, 0x58, 0x04, 0x60, 0xfd, 0x04, 0x57, 0x8a, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x75, 0x65, 0x7b, 0x02, 0x8f, 0x86, 0xfe, 0x92, 0xfe, 0xfc, 0xcf, 0x1d, 0x99, 0x1b, 0x7f, 0xcf, 0x01, 0xa7, 0xd4, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xff, 0xe3, 0x07, 0x5c, 0x05, 0xd5, 0x12, 0x06, 0x01, 0xb8, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xff, 0xe3, 0x06, 0x50, 0x04, 0x60, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x04, 0x14, 0x6e, 0x5c, 0x5e, 0x36, 0x38, 0xa6, 0x5a, 0x5e, 0xba, 0xb3, 0x64, 0x59, 0xfd, 0xe5, 0xa5, 0xa5, 0x02, 0x1b, 0x04, 0x60, 0xfd, 0x04, 0x57, 0x8a, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x75, 0x65, 0x7b, 0xcc, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfc, 0x05, 0xf0, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x20, 0x27, 0x26, 0x10, 0x37, 0x36, 0x21, 0x20, 0x17, 0x15, 0x26, 0x23, 0x20, 0x11, 0x10, 0x21, 0x32, 0x36, 0x35, 0x11, 0x33, 0x04, 0xfb, 0x5a, 0x28, 0x7b, 0x70, 0x88, 0xfe, 0xbf, 0xb1, 0xac, 0xab, 0xb2, 0x01, 0x41, 0x01, 0x0a, 0xca, 0xca, 0xfb, 0xfe, 0x12, 0x01, 0xee, 0xc2, 0x6f, 0xb5, 0x01, 0xba, 0xe0, 0x7f, 0x39, 0x21, 0x1e, 0xd2, 0xcc, 0x02, 0xd0, 0xcd, 0xd2, 0x8e, 0xd7, 0xbf, 0xfd, 0x9f, 0xfd, 0xa0, 0x94, 0xa4, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xd9, 0x04, 0x7b, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x11, 0x35, 0x33, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x66, 0x83, 0x87, 0xf0, 0xbc, 0xa7, 0xab, 0xb0, 0xaa, 0x59, 0x51, 0x51, 0x59, 0xaa, 0xcb, 0xa6, 0xb5, 0xce, 0xea, 0x86, 0x80, 0x02, 0x2f, 0x01, 0x0e, 0x9d, 0xa1, 0x6e, 0xaa, 0x7c, 0x7c, 0x72, 0xfe, 0x7c, 0x72, 0x7c, 0x01, 0x3e, 0xbe, 0xc5, 0xec, 0xe7, 0xa6, 0x9e, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xff, 0xe3, 0x04, 0xdc, 0x05, 0xd5, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x02, 0x8e, 0x39, 0x2f, 0x64, 0x5e, 0x35, 0x39, 0xb6, 0x63, 0x5e, 0xc1, 0xc1, 0x5e, 0x63, 0xfe, 0x23, 0x04, 0x70, 0x05, 0x2b, 0xfc, 0x96, 0x8f, 0x5b, 0x4a, 0x4a, 0x4f, 0x9b, 0x02, 0x9f, 0xfd, 0x5a, 0xe0, 0x7f, 0x78, 0x78, 0x7d, 0xe2, 0x03, 0x71, 0xaa, 0xaa, 0x00, 0x00, 0x01, 0x00, 0x04, 0xff, 0xe3, 0x04, 0x77, 0x04, 0x60, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x02, 0x39, 0x38, 0x37, 0x5e, 0x5e, 0x36, 0x37, 0xa6, 0x5a, 0x5e, 0xb9, 0xb3, 0x65, 0x58, 0xfe, 0x6e, 0x03, 0xc6, 0x03, 0xb6, 0xfd, 0xae, 0x56, 0x46, 0x45, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x75, 0x65, 0x7b, 0x02, 0x7e, 0xaa, 0xaa, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xe3, 0x04, 0x09, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x12, 0x06, 0x03, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xfe, 0x66, 0x04, 0xb5, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x4c, 0xc7, 0x34, 0x4e, 0x03, 0x1f, 0xb8, 0xcd, 0x45, 0x39, 0x78, 0x32, 0x31, 0xfe, 0x4c, 0x5c, 0x58, 0xaa, 0x30, 0xa3, 0xf6, 0x02, 0x64, 0xfe, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4c, 0xc1, 0x04, 0xc3, 0xb8, 0xfd, 0xca, 0xfe, 0xf8, 0xfd, 0x00, 0x01, 0x00, 0x44, 0xfe, 0x56, 0x04, 0x02, 0x04, 0x60, 0x00, 0x18, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x21, 0x15, 0x10, 0x07, 0x06, 0x44, 0xa8, 0x2f, 0x3d, 0x02, 0xa9, 0x93, 0xa2, 0x40, 0x2d, 0x57, 0x29, 0x23, 0xfe, 0xa1, 0x4f, 0x54, 0x99, 0x1d, 0x7d, 0xa6, 0x01, 0xd0, 0xb7, 0xfb, 0x8c, 0xd6, 0xc0, 0x9c, 0x30, 0x29, 0xa1, 0x03, 0xe1, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0x00, 0x00, 0x08, 0x33, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x12, 0x11, 0x35, 0x21, 0x09, 0x01, 0x33, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x21, 0x15, 0x10, 0x03, 0x06, 0x4c, 0xc3, 0x38, 0x4e, 0x03, 0x20, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x50, 0x01, 0xcd, 0xc3, 0xfe, 0x86, 0xfe, 0x83, 0xc4, 0x01, 0xdf, 0xfe, 0xc4, 0xfd, 0xf2, 0x5c, 0x58, 0xaa, 0x2f, 0xa4, 0x01, 0x02, 0x02, 0x58, 0xfe, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x33, 0xfc, 0xf8, 0x02, 0x7b, 0xfd, 0x85, 0x03, 0x1d, 0x02, 0x0e, 0xb8, 0xfd, 0xca, 0xfe, 0xf8, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x06, 0xed, 0x04, 0x60, 0x00, 0x18, 0x00, 0x00, 0x09, 0x02, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x21, 0x15, 0x10, 0x07, 0x06, 0x05, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x17, 0x09, 0x01, 0x06, 0xda, 0xfe, 0x94, 0x01, 0x7f, 0xc3, 0xfe, 0xda, 0xfe, 0xdb, 0xc3, 0x01, 0x87, 0xfe, 0xfc, 0xfe, 0x5e, 0x4f, 0x54, 0xfe, 0xea, 0xa4, 0x33, 0x3d, 0x02, 0xa9, 0x01, 0x01, 0x0a, 0x01, 0x0b, 0x04, 0x60, 0xfd, 0xdf, 0xfd, 0xc1, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x4a, 0x01, 0x83, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x1d, 0x99, 0x1c, 0x7e, 0xb1, 0x01, 0xc5, 0xb7, 0x03, 0xfe, 0x74, 0x01, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x38, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0x01, 0x6d, 0x73, 0xfa, 0xe4, 0xb6, 0x01, 0x9a, 0xe2, 0xe7, 0x05, 0x01, 0x44, 0xc3, 0xfe, 0x50, 0x01, 0xcd, 0xc3, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xfd, 0xb3, 0x8a, 0xfd, 0xa8, 0x05, 0xd5, 0xe3, 0xdb, 0x30, 0x2a, 0x02, 0x18, 0xfd, 0x33, 0xfc, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x05, 0xfe, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x20, 0x00, 0x00, 0x09, 0x02, 0x23, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x01, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x05, 0xeb, 0xfe, 0x93, 0x01, 0x80, 0xc4, 0xfe, 0xea, 0x17, 0x53, 0x72, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0x72, 0x4c, 0x1a, 0x01, 0x07, 0xfe, 0x5a, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0x04, 0x60, 0xfd, 0xdf, 0xfd, 0xc1, 0x01, 0xa1, 0xa8, 0x74, 0xa2, 0x61, 0x64, 0xfd, 0xae, 0x06, 0x0a, 0xaa, 0x64, 0x61, 0xa2, 0x6b, 0x97, 0x01, 0x89, 0xfd, 0x04, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x00, 0x06, 0xf6, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x00, 0x33, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x01, 0x12, 0x10, 0x16, 0x33, 0x21, 0x11, 0x21, 0x22, 0x7a, 0x01, 0x70, 0x5a, 0xe7, 0xea, 0xe8, 0x04, 0x6b, 0xfd, 0x66, 0x02, 0x7e, 0xfd, 0x82, 0x02, 0xaa, 0xfc, 0x9e, 0xf1, 0xfe, 0x9d, 0x32, 0x86, 0x83, 0x01, 0x19, 0xfe, 0xe7, 0x83, 0x02, 0x8d, 0x1a, 0xa9, 0xd7, 0xce, 0xe0, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0x02, 0x77, 0xfd, 0x89, 0x04, 0xaa, 0xfe, 0xfa, 0x87, 0x02, 0x12, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x68, 0xff, 0xe3, 0x06, 0xb8, 0x04, 0x7b, 0x00, 0x1f, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x15, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x01, 0x23, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x36, 0x33, 0x32, 0x12, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x25, 0x14, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x06, 0x06, 0xb8, 0xfd, 0x06, 0x0b, 0xb9, 0xa4, 0x60, 0xb3, 0x58, 0x59, 0xbb, 0x60, 0xf2, 0x8d, 0x89, 0x03, 0xce, 0xfe, 0xd7, 0xb3, 0x01, 0x34, 0x68, 0x8b, 0xc2, 0xc3, 0x02, 0x28, 0x4d, 0x5d, 0xcb, 0xed, 0xa6, 0x02, 0x94, 0x7a, 0x8b, 0xa7, 0x0c, 0xfd, 0x90, 0x73, 0x6b, 0xe0, 0xe0, 0x6b, 0x73, 0x02, 0x5e, 0x5a, 0xbe, 0xc7, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x9c, 0x98, 0xc2, 0xfe, 0x27, 0x01, 0xeb, 0x1a, 0x89, 0x8f, 0xa2, 0xa1, 0x1b, 0xfe, 0xdd, 0xc4, 0x97, 0xb4, 0xae, 0x9e, 0x8a, 0x53, 0x5e, 0x01, 0x61, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0xf8, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x54, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x01, 0x33, 0x17, 0x37, 0x33, 0x01, 0x17, 0x23, 0x27, 0x07, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x27, 0x02, 0x2c, 0x7a, 0x88, 0xc6, 0xea, 0xfe, 0xc6, 0xb4, 0x80, 0x74, 0x8e, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0xf5, 0xb6, 0xb6, 0x01, 0x84, 0xc5, 0x05, 0x8a, 0x97, 0xe2, 0xfe, 0x9b, 0xc8, 0x80, 0xa1, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x05, 0xd5, 0xfd, 0x1e, 0x01, 0xb8, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x1d, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x17, 0x37, 0x33, 0x07, 0x17, 0x23, 0x27, 0x07, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x01, 0xfc, 0x7e, 0x3b, 0x6a, 0xcc, 0xcf, 0x84, 0x80, 0x44, 0x73, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0xb1, 0xa5, 0xa5, 0x01, 0x2a, 0x04, 0x29, 0x40, 0x77, 0xe9, 0x93, 0x4c, 0x81, 0xfd, 0x51, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x04, 0x60, 0xfd, 0xf2, 0x01, 0x50, 0x00, 0x01, 0x00, 0x4b, 0xfe, 0x66, 0x07, 0x9b, 0x05, 0xd5, 0x00, 0x25, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x12, 0x11, 0x35, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x4c, 0xc3, 0x38, 0x4e, 0x03, 0x1f, 0x01, 0x78, 0xa7, 0x66, 0x62, 0xb8, 0xcd, 0x44, 0x37, 0x79, 0x32, 0x32, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0xfe, 0x4c, 0x5c, 0x58, 0xaa, 0x2f, 0xa4, 0x01, 0x02, 0x02, 0x58, 0xfe, 0xfd, 0x9c, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0x2b, 0xb8, 0xfd, 0xca, 0xfe, 0xf8, 0xfd, 0x00, 0x00, 0x01, 0x00, 0x44, 0xfe, 0x56, 0x06, 0x58, 0x04, 0x60, 0x00, 0x27, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x15, 0x10, 0x07, 0x06, 0x44, 0xa4, 0x33, 0x3d, 0x02, 0xa9, 0xe1, 0xed, 0x3f, 0x4a, 0x4a, 0x49, 0xa3, 0xae, 0x9b, 0x63, 0x1e, 0x22, 0x22, 0x28, 0x7d, 0xea, 0xa5, 0xfe, 0xa1, 0x4f, 0x54, 0x99, 0x1c, 0x7e, 0xb1, 0x01, 0xc5, 0xb7, 0xfe, 0x17, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd5, 0x61, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xa6, 0x24, 0x29, 0xfe, 0x19, 0x03, 0xcd, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x07, 0x9c, 0x05, 0xd5, 0x00, 0x21, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0x01, 0x77, 0xa8, 0x66, 0x62, 0xb8, 0xcd, 0x45, 0x38, 0x79, 0x32, 0x32, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfd, 0x9c, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0xfd, 0x39, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x06, 0x65, 0x04, 0x60, 0x00, 0x23, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xa7, 0xa7, 0x02, 0x19, 0xa7, 0xe1, 0xec, 0x3f, 0x4a, 0x4a, 0x49, 0xa2, 0xae, 0x9b, 0x63, 0x1d, 0x23, 0x23, 0x27, 0x7d, 0xea, 0xa7, 0xfd, 0xe7, 0xa7, 0x04, 0x60, 0xfe, 0x37, 0x01, 0xc9, 0xfe, 0x17, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd5, 0x61, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xa6, 0x24, 0x29, 0xfe, 0x19, 0x02, 0x04, 0xfd, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x03, 0xff, 0xfd, 0x6c, 0xb6, 0x04, 0x00, 0xb5, 0xb5, 0x05, 0x2b, 0xfa, 0xd5, 0x05, 0xd5, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0xb4, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x04, 0x0e, 0xa5, 0xa5, 0xa7, 0xfd, 0xe7, 0xa7, 0x04, 0x60, 0xfc, 0x39, 0xfe, 0x4c, 0x01, 0x1b, 0x03, 0xcd, 0xfc, 0x33, 0x04, 0x60, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x00, 0x21, 0x23, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x01, 0x21, 0x03, 0x04, 0x0c, 0xb0, 0x5b, 0xfe, 0x41, 0x5c, 0xaf, 0x01, 0x7a, 0xe1, 0xfe, 0xe3, 0x01, 0x59, 0xad, 0x01, 0x13, 0xfe, 0xed, 0x04, 0x60, 0xfd, 0x47, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0xd2, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x33, 0x01, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x01, 0x03, 0x33, 0x11, 0x0a, 0x01, 0xaa, 0x03, 0x12, 0xfe, 0x2a, 0x01, 0xc2, 0xfe, 0x3e, 0x01, 0xe2, 0xfd, 0x77, 0xfe, 0xde, 0x68, 0x01, 0x71, 0xd1, 0xea, 0x04, 0x60, 0x94, 0xfe, 0xd3, 0x94, 0xfe, 0x88, 0x93, 0x01, 0x13, 0xfe, 0xed, 0x03, 0xcd, 0xfd, 0xda, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x04, 0x7b, 0x00, 0x34, 0x00, 0x3d, 0x00, 0x4a, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x25, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x03, 0xa0, 0x43, 0xbf, 0x76, 0xcc, 0x76, 0x77, 0x02, 0xf9, 0x0b, 0xb7, 0xa5, 0x5e, 0x5a, 0x5a, 0x5a, 0x5a, 0xbc, 0x5f, 0x96, 0x70, 0x70, 0x45, 0x41, 0xc3, 0x81, 0xaa, 0x5e, 0x5f, 0x73, 0x71, 0xe2, 0xe8, 0x4b, 0x4b, 0x88, 0x57, 0xa3, 0x4c, 0x5b, 0x56, 0x55, 0x51, 0x80, 0x5f, 0x61, 0xfd, 0x45, 0x01, 0x4b, 0x4a, 0x7b, 0x8a, 0x52, 0x54, 0x0d, 0x01, 0x45, 0xc8, 0x9b, 0x3a, 0x3a, 0x64, 0x8a, 0x52, 0x54, 0x9b, 0x5a, 0x5e, 0x91, 0x92, 0xfa, 0x5a, 0xbf, 0xc8, 0x1b, 0x1a, 0x35, 0xae, 0x2a, 0x2c, 0x3d, 0x3c, 0x77, 0x78, 0x78, 0x5d, 0x5e, 0xa8, 0xbd, 0x60, 0x60, 0x12, 0x7f, 0x46, 0x45, 0x2e, 0x2e, 0xaa, 0x27, 0x14, 0x13, 0x30, 0x30, 0x01, 0x87, 0x97, 0x5a, 0x5a, 0x57, 0x57, 0x9e, 0x60, 0x66, 0x7b, 0x62, 0x3a, 0x39, 0x6d, 0x6c, 0xb4, 0x29, 0x00, 0x03, 0x00, 0x37, 0x00, 0x00, 0x03, 0xd2, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x23, 0x00, 0x00, 0x25, 0x32, 0x35, 0x34, 0x2b, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, 0x01, 0x34, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x37, 0x14, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x02, 0x39, 0xe8, 0xe8, 0xec, 0xc6, 0xc6, 0x01, 0xae, 0xd4, 0xda, 0xda, 0xd4, 0xa7, 0xc1, 0x72, 0x7e, 0xcf, 0xc1, 0xfe, 0x66, 0x6f, 0x6f, 0x01, 0x8b, 0xb1, 0xbf, 0x99, 0xb5, 0xb4, 0x66, 0xa4, 0x5f, 0x02, 0x9d, 0x91, 0xfe, 0xda, 0xaa, 0xd0, 0x1f, 0x18, 0x98, 0x72, 0x96, 0xa4, 0xf8, 0xa4, 0x02, 0xc4, 0x90, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x46, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf7, 0x04, 0x60, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x01, 0x4e, 0x7f, 0xc3, 0xb7, 0xb7, 0xc3, 0xfe, 0xda, 0x01, 0x18, 0x01, 0x26, 0x01, 0x11, 0xfe, 0xed, 0xfe, 0xdc, 0xfe, 0xe8, 0x03, 0xcd, 0xfc, 0xc7, 0xc7, 0xd6, 0xd5, 0xc7, 0x93, 0xfe, 0xf1, 0xfe, 0xe0, 0xfe, 0xdf, 0xfe, 0xf0, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x03, 0xf7, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x00, 0x13, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x11, 0x23, 0x35, 0x33, 0x21, 0x15, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x11, 0xa7, 0x01, 0x18, 0x01, 0x26, 0x01, 0x11, 0xfe, 0xed, 0xfe, 0xdc, 0xfe, 0xe8, 0x87, 0x87, 0x01, 0x55, 0xae, 0x7f, 0xc3, 0xb7, 0xb7, 0xc3, 0x7f, 0x04, 0x60, 0xfe, 0xf1, 0xfe, 0xe0, 0xfe, 0xdf, 0xfe, 0xf0, 0x01, 0xf5, 0xa4, 0xa4, 0xfe, 0x9f, 0xc7, 0xd6, 0xd5, 0xc7, 0xfe, 0xcc, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x31, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xa7, 0x02, 0x7e, 0xfe, 0x2a, 0x01, 0xc1, 0xfe, 0x3f, 0x01, 0xe1, 0xfd, 0x77, 0x04, 0x60, 0x94, 0xfe, 0xd3, 0x94, 0xfe, 0x88, 0x93, 0x00, 0x01, 0x00, 0x75, 0xff, 0xe3, 0x03, 0x65, 0x04, 0x7c, 0x00, 0x31, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x02, 0x79, 0x65, 0x36, 0x36, 0x67, 0x66, 0xb0, 0x45, 0x99, 0x58, 0x57, 0x48, 0x49, 0x40, 0x6b, 0x3e, 0x40, 0x3e, 0x3c, 0x68, 0x8c, 0x85, 0x7c, 0x40, 0x47, 0x4c, 0x4c, 0x88, 0x54, 0x4d, 0x4c, 0x40, 0x51, 0x4c, 0x4c, 0x48, 0xd6, 0xe8, 0x7c, 0x02, 0x03, 0x18, 0x41, 0x40, 0x5d, 0x8d, 0x4f, 0x4e, 0x18, 0x18, 0xa7, 0x1d, 0x0d, 0x0d, 0x2e, 0x2e, 0x40, 0x46, 0x2d, 0x2c, 0x98, 0x33, 0x38, 0x58, 0x5a, 0x38, 0x38, 0x12, 0x13, 0x25, 0xab, 0x1c, 0x0e, 0x0e, 0xb6, 0xad, 0x6c, 0x92, 0x00, 0x00, 0x02, 0x00, 0xad, 0xfe, 0x4c, 0x01, 0x54, 0x04, 0x60, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x11, 0x35, 0x33, 0x15, 0xae, 0xa5, 0xa5, 0xa5, 0x04, 0x60, 0xfb, 0xa0, 0xfe, 0x4c, 0xe9, 0xe9, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe3, 0x02, 0x3c, 0x04, 0x60, 0x00, 0x10, 0x00, 0x00, 0x3d, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x06, 0x23, 0x22, 0x26, 0x3d, 0x84, 0x46, 0x5d, 0x29, 0x27, 0x88, 0x8f, 0xa7, 0x40, 0x81, 0x3d, 0xb9, 0x3c, 0x3d, 0x4d, 0x46, 0xd7, 0x02, 0x79, 0xfd, 0x87, 0xfe, 0xe6, 0xea, 0x2c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x04, 0x60, 0x10, 0x06, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x03, 0x96, 0x04, 0x7b, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x37, 0x17, 0x07, 0x11, 0x21, 0x15, 0x21, 0x11, 0x07, 0x27, 0x37, 0xa7, 0xa7, 0x7b, 0x45, 0xc0, 0x02, 0x48, 0xfd, 0x11, 0x63, 0x42, 0xa5, 0x04, 0x7b, 0xfe, 0x64, 0x61, 0x6a, 0x97, 0xfe, 0x6b, 0xaa, 0x01, 0xbc, 0x4e, 0x6a, 0x83, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x04, 0x60, 0x10, 0x06, 0x03, 0xd0, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x10, 0x06, 0x03, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x06, 0x02, 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x2d, 0x04, 0x89, 0x04, 0x31, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x00, 0x01, 0x34, 0x26, 0x20, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x03, 0xfc, 0xd0, 0xfe, 0x96, 0xd0, 0xd1, 0xb4, 0xb3, 0xd2, 0x8c, 0xfe, 0xe7, 0xf8, 0xf8, 0xfe, 0xe7, 0x01, 0x19, 0xf8, 0xf8, 0x01, 0x19, 0x02, 0x2f, 0x94, 0xac, 0xab, 0x95, 0x93, 0xac, 0xac, 0x93, 0xf0, 0xfe, 0xee, 0x01, 0x12, 0xf0, 0xf1, 0x01, 0x11, 0xfe, 0xef, 0x00, 0x00, 0x01, 0x00, 0x65, 0x00, 0x74, 0x04, 0x89, 0x03, 0xea, 0x00, 0x18, 0x00, 0x00, 0x25, 0x23, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x20, 0x06, 0x15, 0x14, 0x16, 0x17, 0x23, 0x2e, 0x01, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x11, 0x14, 0x06, 0x04, 0x49, 0x9b, 0x27, 0x27, 0xcd, 0xfe, 0x8f, 0xcc, 0x27, 0x27, 0x9a, 0x20, 0x20, 0x01, 0x1e, 0xf3, 0xf7, 0x01, 0x1a, 0x1f, 0x74, 0x4e, 0x9d, 0x50, 0xb3, 0xc6, 0xc6, 0xb3, 0x50, 0x9d, 0x4e, 0x4d, 0xa5, 0x5d, 0xfd, 0x01, 0x2a, 0xfe, 0xd3, 0xfe, 0xfa, 0x55, 0xa2, 0x00, 0x00, 0x03, 0x00, 0x2d, 0x00, 0x05, 0x04, 0xc6, 0x04, 0x59, 0x00, 0x09, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x00, 0x09, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x35, 0x34, 0x36, 0x37, 0x27, 0x37, 0x03, 0x53, 0xfd, 0xec, 0x26, 0x24, 0xd1, 0xb4, 0x47, 0x69, 0x8b, 0x25, 0x24, 0xd3, 0xbe, 0x41, 0x63, 0x29, 0x88, 0x45, 0xb1, 0x6c, 0xf8, 0x01, 0x19, 0x2e, 0x2f, 0x97, 0x47, 0xa1, 0x45, 0xb2, 0x6c, 0xf8, 0xfe, 0xe6, 0x2f, 0x2e, 0x97, 0x46, 0x01, 0x18, 0x01, 0xe7, 0x29, 0x67, 0x41, 0x93, 0xac, 0x14, 0x5c, 0x2a, 0x67, 0x3e, 0x97, 0xa9, 0x13, 0x14, 0x7d, 0x36, 0x36, 0xfe, 0xef, 0xf1, 0x5d, 0x9f, 0x43, 0x8b, 0x5f, 0x92, 0x35, 0x36, 0x01, 0x12, 0xf0, 0x60, 0xa1, 0x3f, 0x8b, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xfd, 0x04, 0x7b, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x3d, 0x00, 0x00, 0x13, 0x35, 0x21, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x37, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x01, 0x32, 0x37, 0x36, 0x10, 0x27, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x66, 0x02, 0xf9, 0x0b, 0x5c, 0x5b, 0xa5, 0x5f, 0xb4, 0x59, 0x5a, 0xbc, 0x5f, 0x90, 0xda, 0x49, 0x40, 0x5d, 0x5f, 0x7e, 0xd9, 0x7a, 0x7b, 0x7b, 0x7a, 0xd9, 0x7e, 0x5f, 0x5f, 0x3c, 0x46, 0xd1, 0x80, 0xcc, 0x77, 0x76, 0xa6, 0x02, 0x4a, 0x4a, 0x7b, 0x8a, 0x52, 0x54, 0x0d, 0x01, 0xd4, 0x85, 0x4d, 0x4e, 0x4d, 0x4d, 0x86, 0x85, 0x9a, 0x4d, 0x4d, 0x02, 0x00, 0x5a, 0xbe, 0x64, 0x63, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x6e, 0x6d, 0x6e, 0x36, 0x37, 0x9d, 0x9c, 0xfe, 0xed, 0xfe, 0xec, 0x9c, 0x9c, 0x37, 0x38, 0x6c, 0x6b, 0x70, 0x91, 0x92, 0xc4, 0x98, 0x5a, 0x59, 0x57, 0x57, 0x9e, 0xfe, 0xb4, 0x73, 0x74, 0x01, 0x92, 0x74, 0x73, 0xe8, 0xc8, 0xc7, 0x74, 0x75, 0x00, 0x01, 0x00, 0x65, 0x02, 0x2f, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x03, 0x53, 0x9a, 0x85, 0x85, 0x9b, 0xae, 0xf5, 0xd9, 0xd8, 0xf7, 0x02, 0x2f, 0xc7, 0xe9, 0xe7, 0xc9, 0x01, 0x14, 0x01, 0x38, 0xfe, 0xc8, 0xfe, 0xec, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x02, 0x2f, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x01, 0x15, 0x9b, 0x84, 0x86, 0x9a, 0xaf, 0xf6, 0xd9, 0xd8, 0xf6, 0x02, 0x2f, 0xc7, 0xe9, 0xe7, 0xc9, 0xfe, 0xec, 0xfe, 0xc8, 0x01, 0x38, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x87, 0x00, 0x00, 0x03, 0x6b, 0x04, 0x60, 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x10, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x01, 0x2d, 0xe7, 0x52, 0x59, 0x59, 0x52, 0xfe, 0x74, 0x01, 0x8c, 0xa9, 0xae, 0xae, 0xa9, 0xe7, 0xa5, 0x03, 0xc5, 0xfe, 0x98, 0x5e, 0xac, 0x5e, 0x9b, 0xaa, 0xfe, 0xb6, 0xaa, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x03, 0xa8, 0x04, 0x60, 0x00, 0x16, 0x00, 0x21, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x23, 0x13, 0x36, 0x37, 0x36, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x01, 0x89, 0x5f, 0x65, 0x60, 0x62, 0xc3, 0x01, 0x5d, 0xa6, 0x99, 0x57, 0x35, 0x35, 0x39, 0x92, 0xaf, 0x9d, 0x2f, 0x2f, 0x30, 0x01, 0xa9, 0xb3, 0x6b, 0x38, 0x3a, 0x3a, 0x38, 0x6b, 0xb3, 0x02, 0x0d, 0x1b, 0x8c, 0x69, 0xa2, 0x51, 0x50, 0xfb, 0xa0, 0x01, 0xd9, 0x25, 0x24, 0x71, 0xfe, 0xe1, 0x01, 0x32, 0x5e, 0x36, 0x36, 0x01, 0xc9, 0x2a, 0x2a, 0x54, 0x53, 0x2b, 0x2b, 0x00, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x03, 0xa8, 0x04, 0x60, 0x00, 0x16, 0x00, 0x21, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x03, 0x33, 0x13, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x01, 0x89, 0x31, 0x30, 0x2f, 0x2f, 0x9d, 0xaf, 0x92, 0x39, 0x35, 0x35, 0x57, 0x99, 0xa6, 0xfe, 0xa3, 0xc3, 0x62, 0x60, 0x65, 0x01, 0xd7, 0xb3, 0x6b, 0x38, 0x3a, 0x3a, 0x38, 0x6b, 0x02, 0x53, 0x11, 0x36, 0x36, 0x5e, 0x01, 0x32, 0xfe, 0xe1, 0x71, 0x24, 0x25, 0x01, 0xd9, 0xfb, 0xa0, 0x50, 0x51, 0xa2, 0x69, 0x8c, 0xfe, 0x63, 0x01, 0x51, 0x2b, 0x2b, 0x53, 0x54, 0x2a, 0x2a, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x03, 0xfc, 0x04, 0x60, 0x10, 0x06, 0x03, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0xe0, 0x03, 0xac, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x24, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x20, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x01, 0xb5, 0xe9, 0x67, 0xa7, 0xc4, 0xfe, 0x83, 0xc4, 0xa7, 0x7d, 0x8e, 0xa2, 0x02, 0xb3, 0xfd, 0x3b, 0xdb, 0xe0, 0xe0, 0xdb, 0x02, 0xc5, 0xfd, 0x4d, 0xa2, 0x00, 0x01, 0x00, 0x9c, 0x00, 0x4c, 0x04, 0xa7, 0x03, 0xf6, 0x00, 0x13, 0x00, 0x00, 0x25, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x02, 0xff, 0xfd, 0x9e, 0x02, 0x5b, 0x90, 0x8f, 0xab, 0x94, 0xfd, 0xc5, 0x03, 0xf0, 0x9b, 0x5c, 0x59, 0xd8, 0x4c, 0xb8, 0x7c, 0x7c, 0x96, 0xac, 0xb8, 0xb8, 0x42, 0xb2, 0x74, 0xc2, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x9c, 0x00, 0x4e, 0x06, 0x2c, 0x03, 0xf8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x05, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x9d, 0xb5, 0xb5, 0xb5, 0x03, 0x32, 0xfd, 0x9d, 0x02, 0x5c, 0x8f, 0x90, 0xac, 0x93, 0xfd, 0xc4, 0x03, 0xf0, 0x9a, 0x5b, 0x5a, 0xd8, 0x02, 0x78, 0xcc, 0xcc, 0xfe, 0x7a, 0xca, 0xca, 0xa4, 0xb8, 0x7c, 0x7c, 0x94, 0xae, 0xb8, 0xb8, 0x44, 0xb0, 0x76, 0xc0, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0xfe, 0x18, 0x04, 0x33, 0x04, 0x7b, 0x00, 0x26, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x21, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x03, 0x59, 0x6f, 0x6b, 0x6e, 0x6f, 0xcb, 0xfd, 0x9f, 0x02, 0x5b, 0x91, 0x8d, 0xab, 0x94, 0xfd, 0xc6, 0x02, 0x5b, 0x92, 0x45, 0x47, 0x57, 0x55, 0x93, 0xfd, 0xc6, 0x03, 0xf0, 0x9c, 0x5c, 0x59, 0x38, 0x38, 0x01, 0x0c, 0x45, 0xc0, 0x82, 0xaf, 0x5f, 0x5f, 0xb9, 0x72, 0x75, 0x8f, 0xa6, 0xb9, 0x39, 0x39, 0x77, 0x8d, 0x53, 0x53, 0xb9, 0xb9, 0x3f, 0xb0, 0x79, 0x7a, 0x56, 0x55, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0xff, 0xe3, 0x03, 0x5b, 0x04, 0x60, 0x00, 0x17, 0x00, 0x00, 0x37, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x13, 0x25, 0x35, 0x21, 0x15, 0x03, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x20, 0x27, 0x7c, 0x91, 0xbe, 0x73, 0x77, 0x6f, 0x63, 0x72, 0xef, 0xfe, 0x0c, 0x02, 0xb3, 0xef, 0x3f, 0x88, 0x64, 0xce, 0xfe, 0xa4, 0xb5, 0xbd, 0x42, 0x64, 0xbb, 0x64, 0x90, 0x01, 0x3e, 0x01, 0x93, 0x93, 0xfe, 0xc2, 0x4a, 0x9f, 0x6d, 0xa0, 0xb6, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa1, 0x00, 0x00, 0x03, 0x96, 0x04, 0x7b, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0xa1, 0x02, 0xf5, 0xfd, 0xc1, 0x04, 0x7b, 0xaa, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0x88, 0x04, 0x60, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x03, 0x88, 0xa4, 0xfe, 0x48, 0xa4, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0xb7, 0xfc, 0x49, 0x04, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0x00, 0x00, 0x03, 0x6b, 0x04, 0x60, 0x10, 0x06, 0x04, 0xd1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x03, 0xef, 0x04, 0x60, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x33, 0x11, 0x36, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x07, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x27, 0x26, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x17, 0x01, 0xcd, 0xa5, 0x4d, 0x33, 0x4e, 0xae, 0x7a, 0x62, 0xa0, 0xa5, 0x9e, 0x62, 0x7c, 0xb0, 0x4e, 0x33, 0x4b, 0x04, 0x60, 0xfd, 0x31, 0x1a, 0x4d, 0x73, 0xc9, 0x01, 0x2c, 0xfe, 0xd4, 0xfe, 0xec, 0x9c, 0x7d, 0x19, 0xee, 0xee, 0x19, 0x7d, 0x9c, 0x01, 0x14, 0x01, 0x2c, 0xfe, 0xd4, 0xc7, 0x75, 0x4d, 0x1a, 0xff, 0xff, 0x00, 0x44, 0x00, 0x00, 0x04, 0x02, 0x04, 0x60, 0x10, 0x06, 0x03, 0xcf, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x02, 0x9c, 0x03, 0x11, 0x05, 0xe0, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x03, 0x21, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x01, 0x8d, 0x9c, 0x01, 0x38, 0xdd, 0x82, 0x01, 0x43, 0x77, 0x4d, 0xfe, 0x82, 0x4d, 0x79, 0x05, 0x71, 0xfe, 0x60, 0x02, 0x0f, 0xfc, 0xbc, 0xd6, 0xd6, 0x00, 0x02, 0x00, 0x04, 0x02, 0x9c, 0x04, 0x21, 0x05, 0xe0, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x35, 0x21, 0x07, 0x23, 0x01, 0x17, 0x03, 0x21, 0x11, 0x04, 0x16, 0xfe, 0x5c, 0x01, 0x93, 0xfe, 0x6d, 0x01, 0xaf, 0xfd, 0xde, 0xfe, 0xd5, 0x5b, 0x75, 0x01, 0x63, 0x4e, 0xbb, 0x01, 0x05, 0x05, 0xe0, 0x5f, 0xf8, 0x5f, 0xfe, 0xd1, 0x5f, 0xd6, 0xd6, 0x03, 0x44, 0x58, 0xfe, 0x49, 0x01, 0xb7, 0x00, 0x00, 0x03, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xcb, 0x05, 0xe0, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x26, 0x00, 0x00, 0x13, 0x11, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x03, 0x15, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x25, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0xe5, 0xb7, 0x5d, 0x2c, 0x2d, 0x2d, 0x2c, 0x5d, 0xb7, 0xa9, 0x54, 0x29, 0x29, 0x29, 0x29, 0x54, 0xfe, 0xe4, 0x01, 0x25, 0x82, 0x47, 0x48, 0x25, 0x24, 0x47, 0x55, 0x5e, 0x9b, 0x8e, 0xfe, 0xd0, 0x04, 0x2b, 0xfe, 0xce, 0x26, 0x26, 0x4d, 0x4f, 0x25, 0x25, 0x01, 0x58, 0xfc, 0x1f, 0x1f, 0x40, 0x3f, 0x20, 0x1f, 0x5d, 0x36, 0x35, 0x64, 0x4c, 0x2e, 0x2d, 0x0b, 0x12, 0x72, 0x55, 0x70, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x72, 0x02, 0x9c, 0x03, 0x3a, 0x05, 0xe0, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x13, 0x11, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x27, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0xe5, 0x8a, 0xaf, 0x52, 0x51, 0x51, 0x52, 0xaf, 0xfd, 0xeb, 0xf7, 0x72, 0x73, 0x73, 0x74, 0xf5, 0xeb, 0x05, 0x83, 0xfd, 0x76, 0x4e, 0x4f, 0xa9, 0xa8, 0x4e, 0x4e, 0x5d, 0x65, 0x65, 0xd7, 0xd8, 0x66, 0x65, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0x94, 0x05, 0xe0, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x72, 0x02, 0x17, 0xfe, 0x5c, 0x01, 0x93, 0xfe, 0x6d, 0x01, 0xaf, 0xfd, 0xde, 0x05, 0xe0, 0x5f, 0xf8, 0x5f, 0xfe, 0xd1, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x4a, 0x02, 0x9c, 0x02, 0x6d, 0x05, 0xe0, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x02, 0x6c, 0xfd, 0xdf, 0x01, 0xae, 0xfe, 0x6d, 0x01, 0x93, 0xfe, 0x5c, 0x05, 0xe0, 0xfc, 0xbc, 0x5f, 0x01, 0x2f, 0x5f, 0xf8, 0x5f, 0x00, 0x01, 0x00, 0x40, 0x02, 0x8c, 0x03, 0x25, 0x05, 0xef, 0x00, 0x24, 0x00, 0x00, 0x01, 0x35, 0x23, 0x35, 0x21, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x02, 0xb3, 0xbb, 0x01, 0x2d, 0x43, 0x50, 0x4f, 0x5b, 0xc7, 0x70, 0x70, 0x70, 0x70, 0xc7, 0x53, 0x4a, 0x4a, 0x3f, 0x3f, 0x48, 0x47, 0x4e, 0x9c, 0x4e, 0x4e, 0x4e, 0x4e, 0x9c, 0x3c, 0x5f, 0x03, 0x13, 0xe1, 0x5d, 0xfe, 0x99, 0x2f, 0x17, 0x18, 0x72, 0x73, 0xcc, 0xcd, 0x73, 0x72, 0x14, 0x14, 0x27, 0x79, 0x35, 0x1b, 0x1b, 0x55, 0x56, 0xaa, 0xa9, 0x56, 0x55, 0x14, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xf8, 0x05, 0xe0, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x72, 0x73, 0x01, 0x9f, 0x74, 0x74, 0xfe, 0x61, 0x73, 0x05, 0xe0, 0xfe, 0xa9, 0x01, 0x57, 0xfc, 0xbc, 0x01, 0x8e, 0xfe, 0x72, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x00, 0xe5, 0x05, 0xe0, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x72, 0x73, 0x73, 0x05, 0xe0, 0xfc, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc3, 0x01, 0xb6, 0x00, 0xe5, 0x05, 0xe0, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x72, 0x73, 0x3b, 0x3a, 0x80, 0x2c, 0x24, 0x4b, 0x3f, 0x05, 0xe0, 0xfc, 0xf6, 0x97, 0x44, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x03, 0x12, 0x05, 0xe0, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x72, 0x73, 0x01, 0x7b, 0x94, 0xfe, 0x5c, 0x01, 0xc2, 0x97, 0xfe, 0x6a, 0x73, 0x05, 0xe0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0x81, 0x05, 0xe0, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0x72, 0x73, 0x01, 0x9c, 0xfd, 0xf1, 0x05, 0xe0, 0xfd, 0x1b, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x03, 0x79, 0x05, 0xe0, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x11, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x72, 0xaa, 0xd8, 0xda, 0xaa, 0x6f, 0xda, 0x73, 0xdb, 0x6f, 0x05, 0xe0, 0xfd, 0xc7, 0x02, 0x39, 0xfc, 0xbc, 0x02, 0xde, 0xfd, 0xc3, 0x02, 0x3d, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xf4, 0x05, 0xe0, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x23, 0x72, 0x9a, 0x01, 0x78, 0x6f, 0x9b, 0xfe, 0x89, 0x6f, 0x05, 0xe0, 0xfd, 0x45, 0x02, 0xbb, 0xfc, 0xbc, 0x02, 0xbb, 0xfd, 0x45, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xf4, 0x05, 0xe0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x02, 0xf3, 0x6f, 0xfe, 0x88, 0x9a, 0x6f, 0x01, 0x77, 0x05, 0xe0, 0xfc, 0xbc, 0x02, 0xbb, 0xfd, 0x45, 0x03, 0x44, 0xfd, 0x45, 0x02, 0xbb, 0x00, 0x00, 0x02, 0x00, 0x40, 0x02, 0x8c, 0x03, 0x51, 0x05, 0xef, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x24, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x10, 0x01, 0xc9, 0x7c, 0x4a, 0x49, 0x49, 0x4a, 0x7c, 0x7d, 0x49, 0x49, 0x49, 0x49, 0xfe, 0xd1, 0x01, 0x64, 0x6b, 0x6b, 0x6b, 0x6b, 0xfe, 0x9c, 0x6b, 0x6b, 0x05, 0x93, 0x5b, 0x5c, 0x9f, 0x9e, 0x5c, 0x5b, 0x5b, 0x5c, 0x9e, 0x9f, 0x5c, 0x5b, 0x5c, 0x76, 0x76, 0xc6, 0xc5, 0x76, 0x76, 0x75, 0x76, 0x01, 0x8c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0xeb, 0x05, 0xef, 0x00, 0x0f, 0x00, 0x40, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x01, 0x95, 0x67, 0x3d, 0x3d, 0x3d, 0x3d, 0x67, 0x68, 0x3e, 0x3c, 0x3c, 0x3c, 0x8a, 0x4a, 0x31, 0x30, 0x36, 0x22, 0x73, 0x5f, 0x36, 0x37, 0x2b, 0x3e, 0x4a, 0x82, 0x54, 0x50, 0x31, 0x30, 0x56, 0x61, 0x36, 0x37, 0x59, 0x57, 0xa6, 0xa5, 0xb0, 0x37, 0x37, 0x61, 0x61, 0x26, 0x31, 0x4a, 0x42, 0x92, 0x04, 0x29, 0x2b, 0x2b, 0x4c, 0x4b, 0x2c, 0x2b, 0x2b, 0x2c, 0x4b, 0x4c, 0x2b, 0x2b, 0x01, 0x35, 0x02, 0x23, 0x23, 0x2c, 0x26, 0x29, 0x19, 0x24, 0x25, 0x4c, 0x59, 0x18, 0x2b, 0x04, 0x38, 0x3a, 0x36, 0x69, 0x47, 0x32, 0x32, 0x12, 0x13, 0x37, 0x38, 0x50, 0x79, 0x41, 0x41, 0x82, 0x79, 0x50, 0x38, 0x37, 0x13, 0x12, 0x27, 0x32, 0x31, 0x49, 0x2e, 0x2a, 0x00, 0x02, 0x00, 0x72, 0x02, 0x9c, 0x02, 0x95, 0x05, 0xe0, 0x00, 0x09, 0x00, 0x15, 0x00, 0x00, 0x13, 0x11, 0x33, 0x32, 0x37, 0x36, 0x34, 0x27, 0x26, 0x23, 0x25, 0x21, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x23, 0xe5, 0x90, 0x50, 0x2b, 0x2c, 0x2c, 0x2b, 0x50, 0xfe, 0xfd, 0x01, 0x03, 0x8e, 0x49, 0x49, 0x49, 0x49, 0x8e, 0x90, 0x73, 0x05, 0x83, 0xfe, 0xc6, 0x29, 0x29, 0x96, 0x29, 0x29, 0x5d, 0x3f, 0x40, 0xf6, 0x40, 0x3f, 0xfe, 0xb0, 0x00, 0x00, 0x02, 0x00, 0x72, 0x02, 0x9c, 0x03, 0x06, 0x05, 0xe0, 0x00, 0x17, 0x00, 0x20, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x23, 0x27, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0x04, 0x25, 0x22, 0x23, 0x23, 0x74, 0x7a, 0x6d, 0x2a, 0x27, 0x28, 0x44, 0x7c, 0x73, 0x01, 0x03, 0x91, 0x48, 0x47, 0x25, 0x26, 0xfe, 0x9b, 0x90, 0x52, 0x55, 0x55, 0x52, 0x04, 0x24, 0x0c, 0x29, 0x28, 0x47, 0xe4, 0xd6, 0x54, 0x1c, 0x1b, 0xfe, 0x9f, 0x03, 0x44, 0x3c, 0x3c, 0x79, 0x4f, 0x34, 0x34, 0x01, 0x4b, 0xfe, 0xd7, 0x4c, 0x49, 0x4a, 0x4a, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x02, 0x9c, 0x02, 0xc9, 0x05, 0xe0, 0x00, 0x07, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x04, 0x02, 0xcd, 0xfe, 0xd3, 0x73, 0xfe, 0xd3, 0x05, 0xe0, 0x5f, 0xfd, 0x1b, 0x02, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x02, 0x8c, 0x02, 0xed, 0x05, 0xe0, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x65, 0x73, 0x63, 0x6e, 0x6f, 0x31, 0x31, 0x73, 0x52, 0x52, 0xfe, 0xc0, 0x52, 0x52, 0x05, 0xe0, 0xfe, 0x04, 0x86, 0x76, 0x3b, 0x3b, 0x86, 0x01, 0xfc, 0xfd, 0xf6, 0xa3, 0x54, 0x53, 0x53, 0x54, 0xa3, 0x00, 0x00, 0x01, 0x00, 0x26, 0x02, 0x9c, 0x04, 0x57, 0x05, 0xe0, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x27, 0x73, 0xb2, 0xb1, 0x81, 0xb2, 0xb2, 0x75, 0xd6, 0x90, 0xb2, 0xb5, 0x90, 0x05, 0xe0, 0xfd, 0x3d, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0xc3, 0xfc, 0xbc, 0x02, 0xd6, 0xfd, 0x2a, 0x00, 0x02, 0x00, 0x45, 0x02, 0x8c, 0x02, 0x5e, 0x05, 0x1e, 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x37, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x8e, 0x7e, 0x31, 0x31, 0x4a, 0x3e, 0x57, 0x34, 0x35, 0x68, 0x68, 0x24, 0x35, 0x36, 0x4c, 0x63, 0x73, 0x90, 0x8f, 0x92, 0x5f, 0x56, 0x36, 0x34, 0x33, 0x30, 0x3a, 0x36, 0x35, 0x33, 0x8a, 0x44, 0x44, 0x03, 0xd7, 0x1c, 0x1d, 0x45, 0x37, 0x40, 0x3d, 0x3d, 0x64, 0x17, 0x2b, 0xfe, 0x9a, 0x5f, 0x39, 0x1b, 0x1b, 0x6c, 0x5b, 0x69, 0x6c, 0x0a, 0x47, 0x4e, 0x0d, 0x0d, 0x1a, 0x60, 0x15, 0x0b, 0x0b, 0x46, 0x47, 0x00, 0x02, 0x00, 0x45, 0x02, 0x8c, 0x02, 0x5e, 0x05, 0x1e, 0x00, 0x0c, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x07, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x16, 0x7e, 0x31, 0x31, 0x4a, 0x3f, 0x56, 0x34, 0x35, 0x69, 0x69, 0x24, 0x35, 0x36, 0x4c, 0x62, 0x3a, 0x39, 0x48, 0x47, 0x8f, 0x92, 0x5f, 0x56, 0x36, 0x34, 0x33, 0x30, 0x3a, 0x36, 0x36, 0x32, 0x8a, 0x44, 0x45, 0x03, 0xd3, 0x1c, 0x1d, 0x45, 0x37, 0x40, 0x3d, 0x3c, 0x65, 0x17, 0x2b, 0x01, 0x66, 0x5f, 0x39, 0x1b, 0x1b, 0x36, 0x36, 0x5a, 0x6a, 0x36, 0x36, 0x0a, 0x47, 0x4e, 0x0d, 0x0d, 0x1a, 0x60, 0x15, 0x0c, 0x0a, 0x46, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x78, 0x05, 0x1e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x35, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x34, 0x27, 0x26, 0x22, 0x07, 0x02, 0x0f, 0x69, 0x69, 0x21, 0x31, 0x33, 0x46, 0x73, 0x49, 0x48, 0x48, 0x49, 0x73, 0x46, 0x33, 0x31, 0xfe, 0xbe, 0x2f, 0x2f, 0xa6, 0x30, 0x2f, 0x2f, 0x30, 0xa6, 0x2f, 0x04, 0xb0, 0x5f, 0xfd, 0x8d, 0x5e, 0x38, 0x1b, 0x1b, 0x5a, 0x5b, 0x01, 0x28, 0x5b, 0x5a, 0x1b, 0x1b, 0xa1, 0xe4, 0x41, 0x40, 0x40, 0x41, 0xe4, 0x41, 0x40, 0x40, 0x00, 0x00, 0x03, 0x00, 0x45, 0x02, 0x8c, 0x04, 0x38, 0x05, 0x1e, 0x00, 0x33, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x21, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x25, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x02, 0x49, 0x2a, 0x79, 0x4b, 0x7f, 0x4b, 0x4c, 0x01, 0xe0, 0x06, 0x3a, 0x3a, 0x68, 0x3a, 0x72, 0x39, 0x39, 0x3b, 0x3b, 0x3b, 0x60, 0x46, 0x46, 0x2c, 0x29, 0x3d, 0x3d, 0x52, 0x6b, 0x77, 0x48, 0x47, 0x8f, 0x92, 0x2f, 0x30, 0x55, 0x37, 0x67, 0x2f, 0x38, 0x6c, 0x34, 0x50, 0x78, 0xfe, 0x47, 0x01, 0x2e, 0x2f, 0x4d, 0x57, 0x35, 0x34, 0x08, 0xcd, 0x7f, 0x30, 0x31, 0x25, 0x24, 0x3f, 0x57, 0x35, 0x34, 0x02, 0xf3, 0x33, 0x34, 0x51, 0x52, 0x8c, 0x32, 0x6b, 0x38, 0x38, 0x1e, 0x1d, 0x61, 0x18, 0x0c, 0x0c, 0x22, 0x21, 0x43, 0x43, 0x22, 0x21, 0x68, 0x5e, 0x6a, 0x36, 0x36, 0x0a, 0x47, 0x27, 0x27, 0x1a, 0x1a, 0x60, 0x15, 0x16, 0x36, 0xda, 0x54, 0x32, 0x33, 0x31, 0x31, 0x58, 0x36, 0x1c, 0x1d, 0x45, 0x37, 0x20, 0x20, 0x3d, 0x3c, 0x65, 0x17, 0x00, 0x00, 0x02, 0x00, 0x69, 0x02, 0x8c, 0x02, 0xa2, 0x06, 0x03, 0x00, 0x0b, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x32, 0x37, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x33, 0x02, 0x35, 0x2f, 0x2f, 0xa6, 0x30, 0x2e, 0x2e, 0x30, 0xa6, 0x2f, 0xfe, 0xcd, 0x20, 0x65, 0x45, 0x74, 0x48, 0x48, 0x48, 0x48, 0x74, 0x45, 0x65, 0x20, 0x6a, 0x6a, 0x03, 0x63, 0xe4, 0x40, 0x41, 0x41, 0x40, 0xe4, 0x40, 0x41, 0x41, 0x01, 0x8d, 0x38, 0x36, 0x5a, 0x5b, 0xfe, 0xd8, 0x5b, 0x5a, 0x36, 0x38, 0x5e, 0x03, 0x67, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x78, 0x06, 0x03, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x34, 0x27, 0x26, 0x22, 0x07, 0x02, 0x0f, 0x69, 0x69, 0x21, 0x31, 0x33, 0x46, 0x73, 0x48, 0x49, 0x49, 0x48, 0x73, 0x46, 0x33, 0x31, 0xfe, 0xbe, 0x2f, 0x2f, 0xa6, 0x30, 0x2f, 0x2f, 0x30, 0xa6, 0x2f, 0x04, 0xb0, 0x01, 0x53, 0xfc, 0x99, 0x5e, 0x38, 0x1b, 0x1b, 0x5a, 0x5b, 0x01, 0x28, 0x5b, 0x5a, 0x1b, 0x1b, 0xa1, 0xe4, 0x40, 0x41, 0x41, 0x40, 0xe4, 0x40, 0x41, 0x41, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x8d, 0x05, 0x1e, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x01, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x07, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x02, 0x8c, 0xfe, 0x21, 0x07, 0x3a, 0x3a, 0x68, 0x3c, 0x39, 0x37, 0x38, 0x38, 0x3b, 0x3b, 0x3d, 0x98, 0x58, 0x59, 0x54, 0x54, 0x8f, 0x80, 0x4b, 0x4a, 0x68, 0x01, 0x2f, 0x2e, 0x4e, 0x57, 0x34, 0x35, 0x08, 0x03, 0xef, 0x32, 0x6a, 0x38, 0x38, 0x0f, 0x0e, 0x1d, 0x61, 0x18, 0x0c, 0x0c, 0x57, 0x57, 0x95, 0x9a, 0x5b, 0x5a, 0x51, 0x52, 0x6d, 0x54, 0x33, 0x32, 0x31, 0x30, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x8d, 0x05, 0x1e, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x40, 0x01, 0xe0, 0x07, 0x75, 0x67, 0x3d, 0x70, 0x38, 0x39, 0x76, 0x3c, 0x98, 0xb1, 0xa8, 0x8f, 0x80, 0x95, 0x68, 0x01, 0x5e, 0x4d, 0x58, 0x69, 0x07, 0x03, 0xbb, 0x32, 0x6b, 0x6f, 0x1d, 0x1d, 0x61, 0x18, 0x18, 0xae, 0x95, 0x9a, 0xb5, 0xa3, 0x6d, 0x54, 0x65, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0x02, 0x8c, 0x02, 0x25, 0x05, 0x1f, 0x00, 0x32, 0x00, 0x00, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0xe0, 0x40, 0x22, 0x21, 0x41, 0x3f, 0x6f, 0x2b, 0x31, 0x30, 0x37, 0x37, 0x5b, 0x28, 0x43, 0x28, 0x28, 0x27, 0x26, 0x42, 0x58, 0x54, 0x4e, 0x29, 0x2c, 0x30, 0x30, 0x55, 0x35, 0x31, 0x2f, 0x29, 0x33, 0x30, 0x30, 0x2e, 0x87, 0x91, 0x26, 0x28, 0x03, 0xee, 0x0e, 0x24, 0x24, 0x34, 0x4f, 0x2c, 0x2c, 0x07, 0x07, 0x0d, 0x5e, 0x11, 0x0e, 0x19, 0x1a, 0x24, 0x27, 0x19, 0x19, 0x55, 0x1d, 0x1f, 0x31, 0x33, 0x1f, 0x20, 0x0b, 0x0a, 0x15, 0x60, 0x10, 0x07, 0x08, 0x66, 0x61, 0x3c, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x49, 0x02, 0x8c, 0x02, 0x24, 0x05, 0x1f, 0x00, 0x31, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x8f, 0x3f, 0x44, 0x41, 0x40, 0x6e, 0x2b, 0x31, 0x30, 0x38, 0x37, 0x2d, 0x2e, 0x29, 0x43, 0x4f, 0x26, 0x26, 0x42, 0x58, 0x54, 0x4d, 0x29, 0x2d, 0x30, 0x31, 0x55, 0x34, 0x31, 0x30, 0x28, 0x33, 0x5f, 0x2e, 0x86, 0x4a, 0x49, 0x27, 0x27, 0x03, 0xbc, 0x0d, 0x48, 0x34, 0x4f, 0x2d, 0x2b, 0x06, 0x07, 0x0e, 0x5d, 0x10, 0x07, 0x08, 0x34, 0x24, 0x27, 0x19, 0x19, 0x55, 0x1c, 0x20, 0x31, 0x32, 0x20, 0x1f, 0x0a, 0x0b, 0x14, 0x60, 0x0f, 0x10, 0x33, 0x33, 0x61, 0x3c, 0x29, 0x29, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x01, 0xad, 0x02, 0x78, 0x05, 0x1e, 0x00, 0x0d, 0x00, 0x31, 0x00, 0x00, 0x00, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x35, 0x33, 0x02, 0x0f, 0x2e, 0x2f, 0x55, 0x53, 0x2f, 0x2f, 0x2f, 0x2f, 0x53, 0x55, 0x2f, 0x97, 0x48, 0x48, 0x95, 0x37, 0x31, 0x31, 0x2e, 0x2e, 0x2d, 0x2d, 0x2e, 0x67, 0x33, 0x33, 0x20, 0x32, 0x33, 0x46, 0x75, 0x47, 0x48, 0x48, 0x47, 0x75, 0x46, 0x33, 0x32, 0x20, 0x69, 0x03, 0x6d, 0xe0, 0x3d, 0x3e, 0x3e, 0x3d, 0xe0, 0x3d, 0x3e, 0x3e, 0x46, 0xa0, 0x4e, 0x4f, 0x09, 0x08, 0x10, 0x65, 0x19, 0x0c, 0x0b, 0x34, 0x35, 0x6b, 0x33, 0x37, 0x1c, 0x1b, 0x58, 0x58, 0x01, 0x22, 0x58, 0x58, 0x1b, 0x1c, 0x37, 0x5f, 0x00, 0x02, 0x00, 0x6d, 0x01, 0xa8, 0x00, 0xd7, 0x05, 0x0f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x15, 0x35, 0x33, 0x15, 0x6e, 0x68, 0x68, 0x68, 0x05, 0x0f, 0xfd, 0x8d, 0xf4, 0x82, 0x82, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x9d, 0x06, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x69, 0x6a, 0x01, 0x37, 0x85, 0xfe, 0xaf, 0x01, 0x5f, 0x88, 0xfe, 0xbe, 0x6a, 0x06, 0x03, 0xfd, 0xfe, 0x01, 0x0e, 0xfe, 0xdb, 0xfe, 0xb2, 0x01, 0x32, 0xfe, 0xce, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x04, 0x09, 0x05, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x02, 0x6d, 0x68, 0x41, 0x44, 0x50, 0x5d, 0x6a, 0x6a, 0x23, 0x64, 0x45, 0x44, 0x61, 0x18, 0x27, 0x6d, 0x49, 0x64, 0x6b, 0x68, 0x41, 0x43, 0x50, 0x5f, 0x03, 0xfe, 0xfe, 0x9e, 0x01, 0x77, 0x5b, 0x57, 0x6b, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x39, 0x37, 0x45, 0x42, 0x45, 0x42, 0x89, 0x7e, 0xfe, 0x85, 0x01, 0x77, 0x5a, 0x58, 0x6b, 0x00, 0x01, 0x00, 0x69, 0x01, 0xad, 0x02, 0x7e, 0x05, 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x02, 0x7d, 0x2f, 0x2e, 0x66, 0x90, 0x84, 0x3c, 0x2b, 0x46, 0x47, 0x54, 0x61, 0x6a, 0x6a, 0x25, 0x32, 0x33, 0x43, 0x6d, 0x38, 0x38, 0x04, 0x17, 0xfe, 0x7a, 0x78, 0x36, 0x36, 0x58, 0x36, 0x56, 0x01, 0x82, 0x59, 0x59, 0x6b, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x38, 0x1c, 0x1c, 0x42, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x05, 0x1e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x64, 0x54, 0x62, 0x61, 0x55, 0x53, 0x61, 0x61, 0x53, 0x87, 0x9c, 0x9c, 0x87, 0x89, 0x9b, 0x9b, 0x04, 0xc7, 0x81, 0x71, 0x71, 0x81, 0x82, 0x70, 0x6f, 0x83, 0x57, 0xae, 0x9b, 0x9a, 0xaf, 0xaf, 0x9a, 0x9b, 0xae, 0x00, 0x01, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x37, 0x05, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x40, 0x2b, 0x2e, 0x2e, 0x31, 0x94, 0x55, 0x55, 0x54, 0x54, 0x90, 0x34, 0x30, 0x2e, 0x2c, 0x2c, 0x2d, 0x2c, 0x2e, 0x65, 0x38, 0x38, 0x38, 0x38, 0x65, 0x2e, 0x2c, 0x2d, 0x2c, 0x04, 0xf7, 0x14, 0x0a, 0x09, 0x58, 0x58, 0x99, 0x97, 0x59, 0x59, 0x0a, 0x0a, 0x14, 0x5f, 0x18, 0x0c, 0x0c, 0x3f, 0x40, 0xe6, 0x40, 0x3f, 0x0c, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x03, 0xd5, 0x02, 0x88, 0x05, 0x1e, 0x00, 0x10, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x30, 0x02, 0x18, 0x30, 0x31, 0xa7, 0x31, 0x31, 0x6e, 0x9b, 0x89, 0x87, 0x4f, 0x4d, 0x03, 0xd5, 0x6f, 0x42, 0x41, 0x41, 0x40, 0x71, 0x9b, 0xae, 0x57, 0x57, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x03, 0xd5, 0x00, 0x10, 0x00, 0x00, 0x13, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x30, 0xaf, 0x30, 0x31, 0xa7, 0x31, 0x31, 0x6e, 0x9b, 0x88, 0x88, 0x4e, 0x4e, 0x03, 0xd5, 0x6f, 0x42, 0x41, 0x41, 0x40, 0x71, 0x9b, 0xae, 0x57, 0x57, 0x9b, 0x00, 0x02, 0x00, 0x69, 0x01, 0xad, 0x02, 0xa2, 0x05, 0x1e, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x24, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x32, 0x37, 0xd3, 0x6a, 0x6a, 0x20, 0x65, 0x45, 0x74, 0x48, 0x48, 0x48, 0x48, 0x74, 0x45, 0x65, 0x01, 0x42, 0x2f, 0x2f, 0xa6, 0x30, 0x2e, 0x2e, 0x30, 0xa6, 0x2f, 0x02, 0xfa, 0xfe, 0xb3, 0x03, 0x62, 0x5f, 0x38, 0x36, 0x5a, 0x5b, 0xfe, 0xd8, 0x5b, 0x5a, 0x36, 0xa1, 0xe4, 0x40, 0x41, 0x41, 0x40, 0xe4, 0x40, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x02, 0x9c, 0x01, 0xac, 0x05, 0xc1, 0x00, 0x14, 0x00, 0x00, 0x13, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0xd4, 0xd8, 0xd8, 0x2c, 0x40, 0x6c, 0x6c, 0x78, 0x2e, 0x2e, 0x4c, 0x4c, 0x05, 0xc1, 0xb2, 0x50, 0xfe, 0xac, 0x4d, 0x2c, 0x56, 0x2d, 0x2c, 0x76, 0x01, 0x54, 0x50, 0xb2, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0x8c, 0x02, 0x77, 0x05, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x63, 0x68, 0x23, 0x24, 0x46, 0x54, 0x31, 0x31, 0x69, 0x69, 0x26, 0x32, 0x32, 0x43, 0x6d, 0x71, 0x03, 0x94, 0x01, 0x7b, 0xfe, 0x88, 0x59, 0x2c, 0x2d, 0x36, 0x35, 0x5c, 0x01, 0x63, 0xfd, 0x8d, 0x60, 0x39, 0x1c, 0x1b, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0xc7, 0x02, 0xee, 0x04, 0xd4, 0x00, 0x16, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x21, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x01, 0xe3, 0xfe, 0x80, 0x01, 0x7c, 0x5b, 0x2d, 0x2d, 0x36, 0x36, 0x5d, 0xfe, 0x98, 0x02, 0x7b, 0x62, 0x3a, 0x38, 0x44, 0x44, 0x02, 0xc7, 0x67, 0x23, 0x22, 0x46, 0x53, 0x31, 0x30, 0x67, 0x67, 0x25, 0x64, 0x41, 0x6c, 0x38, 0x38, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x8d, 0x04, 0x09, 0x05, 0x10, 0x00, 0x28, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x02, 0x16, 0x27, 0x36, 0x37, 0x4a, 0x63, 0x6c, 0x6a, 0x20, 0x20, 0x42, 0x51, 0x30, 0x2f, 0x68, 0x20, 0x21, 0x43, 0x50, 0x2f, 0x30, 0x68, 0x68, 0x24, 0x32, 0x32, 0x44, 0x46, 0x61, 0x03, 0x15, 0x45, 0x21, 0x22, 0x8a, 0x7f, 0x01, 0x7a, 0xfe, 0x89, 0x5b, 0x2b, 0x2c, 0x36, 0x34, 0x5c, 0x01, 0x63, 0xfe, 0x89, 0x5b, 0x2b, 0x2c, 0x36, 0x36, 0x5a, 0x01, 0x63, 0xfd, 0x8d, 0x62, 0x3b, 0x1b, 0x1c, 0x46, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x02, 0x9c, 0x02, 0x8d, 0x05, 0x0f, 0x00, 0x06, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x22, 0x6f, 0xc7, 0xc6, 0x6e, 0xed, 0x8e, 0x05, 0x0f, 0xfd, 0xf2, 0x02, 0x0e, 0xfd, 0x8d, 0x00, 0x02, 0x00, 0x6c, 0x01, 0xad, 0x02, 0x92, 0x06, 0x0b, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x11, 0x23, 0x11, 0x10, 0x33, 0x32, 0x17, 0x16, 0x07, 0x16, 0x17, 0x12, 0x21, 0x26, 0x27, 0x16, 0x33, 0x32, 0x35, 0x34, 0x05, 0x35, 0x16, 0x35, 0x34, 0x23, 0x22, 0x15, 0xd5, 0x68, 0xf1, 0xf6, 0x01, 0x01, 0x63, 0x9e, 0x01, 0x01, 0xfe, 0xed, 0x77, 0x34, 0x3f, 0x71, 0xa3, 0xfe, 0xf8, 0xcf, 0x85, 0x95, 0x02, 0xc3, 0xfe, 0xea, 0x03, 0x5e, 0x01, 0x00, 0xd8, 0x99, 0x38, 0x33, 0x95, 0xfe, 0xf6, 0x01, 0xb8, 0x61, 0xb0, 0x9e, 0x0c, 0x5f, 0x04, 0xb7, 0x7b, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x01, 0xad, 0x02, 0x8d, 0x05, 0x0f, 0x00, 0x0e, 0x00, 0x00, 0x1b, 0x02, 0x33, 0x01, 0x15, 0x23, 0x35, 0x03, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0xcc, 0x8c, 0xc6, 0x6e, 0xff, 0x00, 0x68, 0xa7, 0x19, 0x36, 0x1c, 0x28, 0x6f, 0x04, 0xad, 0xfe, 0x7c, 0x01, 0xe6, 0xfd, 0x8d, 0xef, 0xef, 0x01, 0xd4, 0x47, 0x58, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x05, 0xef, 0x00, 0x1b, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x35, 0x34, 0x33, 0x32, 0x17, 0x01, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x02, 0x3a, 0x3b, 0x87, 0x90, 0x96, 0x76, 0x42, 0x51, 0x4d, 0x4f, 0xfe, 0xf1, 0x4e, 0x4e, 0x4e, 0x1e, 0x2a, 0x58, 0xfa, 0x7d, 0x45, 0xfe, 0xea, 0x26, 0x1f, 0x31, 0x30, 0x31, 0x55, 0x53, 0x61, 0x33, 0x37, 0x48, 0x24, 0x05, 0x72, 0x28, 0x42, 0x34, 0x1a, 0x15, 0x3f, 0x4b, 0x9c, 0x94, 0x57, 0x58, 0x58, 0x57, 0x9a, 0x72, 0x5d, 0x24, 0x14, 0x2c, 0x4f, 0x98, 0x27, 0xfe, 0xf8, 0x11, 0x28, 0x40, 0xe4, 0x3f, 0x41, 0x82, 0x6a, 0x70, 0x36, 0x39, 0x06, 0x04, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x01, 0xad, 0x02, 0xbc, 0x05, 0x14, 0x00, 0x0a, 0x00, 0x29, 0x00, 0x00, 0x01, 0x22, 0x15, 0x11, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x15, 0x23, 0x35, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x11, 0x34, 0x01, 0xd6, 0x25, 0x37, 0x35, 0x31, 0x32, 0x28, 0x1e, 0x4f, 0x49, 0x4d, 0x4d, 0x49, 0x74, 0x68, 0x71, 0x4b, 0x4d, 0x4d, 0x3a, 0x5d, 0x25, 0x21, 0x30, 0x30, 0x2c, 0x3f, 0x04, 0xbc, 0x51, 0xfe, 0x7f, 0x3a, 0x35, 0x7d, 0x74, 0x3f, 0x33, 0x58, 0x4a, 0x4f, 0xa5, 0x98, 0x5a, 0x55, 0xe2, 0xe1, 0x55, 0x58, 0x9a, 0xa0, 0x52, 0x3d, 0x10, 0x5c, 0x0c, 0x2c, 0x41, 0x6a, 0x71, 0x40, 0x3a, 0x01, 0x81, 0xa9, 0x00, 0x01, 0x00, 0x21, 0x01, 0xad, 0x02, 0x7e, 0x05, 0x10, 0x00, 0x17, 0x00, 0x00, 0x01, 0x27, 0x03, 0x23, 0x13, 0x03, 0x26, 0x2b, 0x01, 0x35, 0x17, 0x16, 0x1f, 0x01, 0x13, 0x33, 0x03, 0x13, 0x16, 0x3b, 0x01, 0x15, 0x27, 0x26, 0x01, 0x9f, 0x55, 0xad, 0x7c, 0xf7, 0x68, 0x1c, 0x57, 0x1c, 0x28, 0x93, 0x24, 0x54, 0xae, 0x7b, 0xf5, 0x66, 0x1c, 0x57, 0x1c, 0x27, 0x93, 0x02, 0x10, 0xd7, 0xfe, 0xc6, 0x01, 0xbc, 0x01, 0x07, 0x47, 0x58, 0x01, 0x04, 0x5d, 0xd7, 0x01, 0x3a, 0xfe, 0x44, 0xfe, 0xf8, 0x46, 0x59, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6d, 0x00, 0x00, 0x00, 0xd7, 0x03, 0x67, 0x12, 0x07, 0x07, 0xa1, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x01, 0xdd, 0x02, 0x82, 0x12, 0x07, 0x02, 0x75, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xf0, 0x02, 0x77, 0x02, 0x73, 0x12, 0x07, 0x05, 0x0e, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x22, 0x00, 0x00, 0x02, 0x8d, 0x02, 0x73, 0x12, 0x07, 0x05, 0x11, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0xff, 0x11, 0x02, 0x92, 0x03, 0x6f, 0x12, 0x07, 0x05, 0x12, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x12, 0xff, 0x11, 0x02, 0x8d, 0x02, 0x73, 0x12, 0x07, 0x05, 0x13, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6c, 0xff, 0x11, 0x02, 0xa4, 0x02, 0x82, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x34, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0xa0, 0x22, 0x56, 0x21, 0x68, 0x73, 0x90, 0x90, 0x73, 0x47, 0x63, 0x22, 0x68, 0x01, 0xcb, 0x5f, 0x52, 0x52, 0x60, 0x60, 0x52, 0x52, 0x5f, 0x02, 0x03, 0x39, 0x32, 0x14, 0xb5, 0xfe, 0xd8, 0xb6, 0x37, 0x38, 0xfe, 0xb3, 0x02, 0x22, 0x81, 0x7b, 0x71, 0x82, 0x82, 0x71, 0x72, 0x81, 0x81, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x11, 0x02, 0xbc, 0x02, 0x78, 0x12, 0x07, 0x05, 0x15, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x21, 0xff, 0x11, 0x02, 0x7e, 0x02, 0x74, 0x12, 0x07, 0x05, 0x16, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2d, 0x04, 0x7b, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x13, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0xa7, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe3, 0xb9, 0x70, 0xa0, 0x33, 0xa6, 0xa6, 0x95, 0x86, 0x85, 0x94, 0x94, 0x85, 0x86, 0x95, 0x02, 0x46, 0x01, 0x1e, 0x01, 0x17, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0xfe, 0xc6, 0xfe, 0xfd, 0xfe, 0xfc, 0xfe, 0xc6, 0x62, 0x63, 0xaa, 0x02, 0x23, 0xc8, 0xdc, 0xdc, 0xc8, 0xc7, 0xdc, 0xdc, 0xff, 0xff, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xf8, 0x05, 0xe0, 0x10, 0x06, 0x04, 0xea, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x02, 0x44, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x68, 0x01, 0xdc, 0x98, 0x98, 0x98, 0x98, 0xfe, 0x24, 0x9f, 0x9f, 0x9f, 0x03, 0xbc, 0xa4, 0xa4, 0xfe, 0xac, 0xa4, 0xfe, 0xe0, 0xa4, 0xa4, 0x01, 0x20, 0xa4, 0x01, 0x54, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2d, 0xfe, 0x56, 0x04, 0xa1, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x22, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x01, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x21, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x01, 0x4e, 0xa7, 0x7a, 0x7a, 0xa7, 0x34, 0x9f, 0x6f, 0xb7, 0x73, 0x5c, 0x13, 0x77, 0x74, 0x0a, 0x68, 0x73, 0xb7, 0x6f, 0x9f, 0x01, 0xfe, 0xfd, 0xcf, 0x07, 0x43, 0x4b, 0x84, 0x83, 0x4c, 0x42, 0xfd, 0xda, 0x02, 0x29, 0x0e, 0x37, 0x4c, 0x83, 0x84, 0x4b, 0x38, 0xa8, 0xfd, 0xae, 0x03, 0xae, 0x90, 0x01, 0xcc, 0xaa, 0x64, 0x61, 0xa2, 0x82, 0xc3, 0x90, 0xea, 0x95, 0xa2, 0x61, 0x01, 0xc0, 0xae, 0x66, 0x74, 0x74, 0x66, 0x01, 0x3e, 0x84, 0x56, 0x74, 0x74, 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0x82, 0xfe, 0x56, 0x01, 0xf8, 0x06, 0x14, 0x00, 0x10, 0x00, 0x00, 0x25, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x27, 0x37, 0x23, 0x11, 0x33, 0x11, 0x01, 0xf7, 0x93, 0xa2, 0x40, 0x2c, 0x5f, 0x22, 0x26, 0x03, 0x01, 0xa5, 0xa5, 0x9a, 0xae, 0xd6, 0xc0, 0x9c, 0x30, 0x36, 0x94, 0x14, 0x06, 0x14, 0xfa, 0x86, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x78, 0x05, 0x1e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x15, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x24, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x32, 0x37, 0xa8, 0x68, 0x68, 0x22, 0x32, 0x32, 0x46, 0x73, 0x48, 0x49, 0x49, 0x48, 0x73, 0x46, 0x32, 0x32, 0x01, 0x42, 0x30, 0x2f, 0xa5, 0x30, 0x30, 0x30, 0x30, 0xa5, 0x2f, 0x02, 0xfa, 0x5f, 0x02, 0x73, 0x5e, 0x38, 0x1b, 0x1b, 0x5a, 0x5b, 0xfe, 0xd8, 0x5b, 0x5a, 0x1b, 0x1b, 0xa1, 0xe4, 0x41, 0x40, 0x40, 0x41, 0xe4, 0x41, 0x40, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x37, 0x05, 0x1e, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x02, 0x36, 0x2c, 0x2c, 0x2d, 0x2d, 0x66, 0x38, 0x38, 0x38, 0x38, 0x66, 0x2d, 0x2d, 0x2c, 0x2c, 0x2b, 0x5e, 0x35, 0x8f, 0xa9, 0xab, 0x94, 0x30, 0x2e, 0x2e, 0x04, 0xf7, 0x60, 0x18, 0x0c, 0x0c, 0x40, 0x3f, 0xe6, 0x3f, 0x40, 0x0c, 0x0c, 0x18, 0x5f, 0x14, 0x14, 0xb2, 0x97, 0x99, 0xb0, 0x09, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x4b, 0x02, 0x37, 0x05, 0x1e, 0x00, 0x07, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x35, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x07, 0x34, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x23, 0x22, 0x01, 0x37, 0x22, 0x2b, 0x53, 0x01, 0x4a, 0x3a, 0x2f, 0x04, 0x56, 0x07, 0x20, 0x1c, 0x54, 0xab, 0x94, 0x2f, 0x2f, 0x2c, 0x2d, 0x2a, 0x2f, 0x2c, 0x2d, 0x66, 0x38, 0x38, 0x38, 0x02, 0x06, 0x2f, 0x6f, 0xa9, 0x01, 0x01, 0xbd, 0x2e, 0x02, 0xee, 0x0b, 0x20, 0x2a, 0x9a, 0x20, 0x26, 0x02, 0x3b, 0x2f, 0x13, 0x1d, 0x5a, 0x96, 0x99, 0xb0, 0x09, 0x0a, 0x14, 0x60, 0x17, 0x0d, 0x0c, 0x3f, 0x40, 0xe6, 0x40, 0x02, 0x05, 0x62, 0x8a, 0x69, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x06, 0x03, 0x00, 0x11, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x37, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x27, 0x07, 0x27, 0x37, 0x27, 0x33, 0x17, 0x37, 0x17, 0x07, 0x01, 0xdb, 0x1d, 0x18, 0x19, 0x17, 0x5f, 0x34, 0x35, 0x63, 0x53, 0x51, 0x63, 0x0f, 0x0f, 0x05, 0x47, 0x21, 0x20, 0x51, 0x50, 0x82, 0x84, 0xa0, 0x9c, 0x7e, 0x0a, 0x0f, 0x0e, 0x19, 0x5a, 0xb5, 0x13, 0x9f, 0x67, 0x82, 0x48, 0xbc, 0x13, 0xa7, 0x04, 0x9c, 0x0a, 0x04, 0x05, 0x3d, 0x3c, 0x6d, 0x6a, 0x7c, 0x7c, 0x6a, 0x44, 0x35, 0x34, 0xa5, 0x50, 0x51, 0x50, 0x61, 0x8f, 0x57, 0x57, 0xae, 0x8f, 0x8c, 0xae, 0x02, 0x01, 0x03, 0x65, 0x3c, 0x38, 0x33, 0x72, 0x51, 0x3e, 0x36, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0x02, 0x8c, 0x02, 0x25, 0x05, 0x1f, 0x00, 0x31, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x01, 0x90, 0x47, 0x26, 0x28, 0x49, 0x4a, 0x87, 0x2d, 0x30, 0x30, 0x32, 0x28, 0x30, 0x30, 0x35, 0x55, 0x31, 0x2f, 0x2c, 0x29, 0x4d, 0x54, 0x57, 0x42, 0x4d, 0x28, 0x27, 0x43, 0x29, 0x2e, 0x2d, 0x37, 0x37, 0x61, 0x2b, 0x6f, 0x40, 0x41, 0x44, 0x03, 0xee, 0x0d, 0x29, 0x29, 0x3c, 0x61, 0x33, 0x33, 0x08, 0x07, 0x10, 0x60, 0x15, 0x0a, 0x0b, 0x20, 0x1f, 0x33, 0x31, 0x1f, 0x1d, 0x55, 0x32, 0x27, 0x24, 0x1a, 0x19, 0x07, 0x07, 0x11, 0x5e, 0x0d, 0x0e, 0x2c, 0x2c, 0x4f, 0x34, 0x48, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x02, 0x9c, 0x01, 0xb0, 0x06, 0x03, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x01, 0xaf, 0x64, 0x38, 0x16, 0x16, 0xac, 0xac, 0x69, 0x63, 0x63, 0x32, 0x31, 0x6b, 0x06, 0x03, 0x55, 0x17, 0x16, 0x3a, 0x38, 0x50, 0xfd, 0xdd, 0x02, 0x23, 0x50, 0x2c, 0x69, 0x2f, 0x30, 0x00, 0x00, 0x01, 0xff, 0xeb, 0x01, 0xad, 0x01, 0x3a, 0x05, 0x0f, 0x00, 0x15, 0x00, 0x00, 0x13, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0xd6, 0x2f, 0x2d, 0x67, 0x28, 0x1c, 0x3c, 0x15, 0x16, 0x67, 0x67, 0x68, 0x63, 0x02, 0x9c, 0x0b, 0x78, 0x36, 0x36, 0x58, 0x1b, 0x1c, 0x55, 0x0b, 0x50, 0x02, 0x23, 0xfd, 0xdd, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x01, 0xad, 0x02, 0x78, 0x05, 0x0f, 0x00, 0x0c, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x35, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x02, 0x0f, 0xb2, 0x53, 0x2f, 0x2f, 0x2f, 0x2f, 0x53, 0x55, 0x2f, 0x2e, 0x69, 0x48, 0x48, 0x95, 0x37, 0x31, 0x31, 0x2e, 0x2e, 0x2d, 0x2d, 0x2e, 0x67, 0x33, 0x33, 0x20, 0x32, 0x33, 0x46, 0x75, 0x47, 0x48, 0x48, 0x47, 0x75, 0x03, 0xdd, 0xeb, 0x3e, 0x3d, 0xe0, 0x3d, 0x3e, 0x3e, 0x3d, 0x01, 0xa2, 0xfd, 0xdb, 0xa0, 0x4e, 0x4f, 0x08, 0x09, 0x10, 0x65, 0x19, 0x0c, 0x0b, 0x34, 0x35, 0x6b, 0x33, 0x37, 0x1c, 0x1b, 0x58, 0x58, 0x91, 0x82, 0x58, 0x58, 0x00, 0x00, 0x01, 0x00, 0x63, 0x01, 0xad, 0x02, 0x77, 0x05, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x63, 0x68, 0x23, 0x24, 0x46, 0x54, 0x31, 0x31, 0x69, 0x69, 0x26, 0x33, 0x31, 0x43, 0x6d, 0x71, 0x03, 0x94, 0x01, 0x7b, 0xfe, 0x88, 0x59, 0x2c, 0x2d, 0x36, 0x35, 0x5c, 0x01, 0x63, 0xfc, 0x9e, 0x01, 0x4f, 0x39, 0x1c, 0x1b, 0x86, 0x00, 0x00, 0x02, 0x00, 0x41, 0x02, 0x9c, 0x01, 0x6e, 0x06, 0x03, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x11, 0x33, 0x15, 0x23, 0x42, 0x66, 0x69, 0x5c, 0x5c, 0x69, 0x69, 0x69, 0x03, 0x99, 0x5c, 0x01, 0x1a, 0xfe, 0xe6, 0x5c, 0xfd, 0xfd, 0x02, 0x6a, 0x82, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6d, 0x02, 0x9c, 0x01, 0x58, 0x05, 0x0f, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0xd6, 0x15, 0x15, 0x3d, 0x1b, 0x28, 0x66, 0x5c, 0x05, 0x0f, 0xfe, 0x70, 0x55, 0x1c, 0x1b, 0x57, 0x6c, 0x77, 0x01, 0x90, 0x00, 0x00, 0x01, 0x00, 0x41, 0x02, 0x9c, 0x01, 0x6e, 0x05, 0x0f, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x42, 0x01, 0x2b, 0x5f, 0x5f, 0xfe, 0xd5, 0x64, 0x04, 0xb3, 0x5c, 0x5c, 0xfe, 0x45, 0x5c, 0x5c, 0x01, 0xbb, 0x00, 0x01, 0x00, 0x41, 0x02, 0x9c, 0x01, 0x6e, 0x05, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x42, 0x01, 0x2b, 0x5f, 0x5f, 0x5f, 0x5f, 0xfe, 0xd5, 0x64, 0x64, 0x64, 0x04, 0xb3, 0x5c, 0x5c, 0xbe, 0x5c, 0xa1, 0x5c, 0x5c, 0xa1, 0x5c, 0xbe, 0x00, 0x00, 0x00, 0x03, 0xff, 0x67, 0x01, 0xad, 0x01, 0x3d, 0x06, 0x03, 0x00, 0x03, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x03, 0x22, 0x35, 0x34, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x27, 0x23, 0x22, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x6e, 0x68, 0x68, 0x5b, 0xac, 0x99, 0x6e, 0x68, 0x67, 0x6d, 0x0a, 0x1f, 0x2d, 0x12, 0x67, 0x44, 0x02, 0x02, 0x46, 0x3c, 0x15, 0x0a, 0x06, 0x03, 0x82, 0xfc, 0x2c, 0x7c, 0x73, 0x02, 0x73, 0xfd, 0x8d, 0x57, 0x3f, 0x23, 0x35, 0x98, 0x1d, 0x24, 0x1b, 0x0d, 0x00, 0x01, 0x00, 0x6d, 0x01, 0xad, 0x01, 0x58, 0x06, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x6e, 0x68, 0x15, 0x15, 0x3d, 0x1b, 0x28, 0x66, 0x5c, 0x02, 0xe4, 0x03, 0x1f, 0xfc, 0xe1, 0x53, 0x56, 0x1b, 0x1b, 0x58, 0x6c, 0x78, 0x00, 0x00, 0x01, 0x00, 0x51, 0x01, 0xad, 0x01, 0x3d, 0x06, 0x03, 0x00, 0x11, 0x00, 0x00, 0x01, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x27, 0x37, 0x23, 0x11, 0x33, 0x11, 0x01, 0x3d, 0x2e, 0x2f, 0x66, 0x28, 0x1c, 0x3b, 0x16, 0x18, 0x03, 0x02, 0x68, 0x68, 0x02, 0xf2, 0x61, 0x78, 0x36, 0x36, 0x58, 0x1b, 0x1e, 0x53, 0x0b, 0x03, 0x67, 0xfc, 0xef, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x02, 0x9c, 0x02, 0x43, 0x05, 0x1e, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0x66, 0x72, 0x01, 0x6b, 0xfe, 0x23, 0x05, 0x1e, 0xfd, 0xdd, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x69, 0x01, 0xad, 0x04, 0x09, 0x05, 0x1e, 0x00, 0x34, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x26, 0x37, 0x34, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x02, 0x5c, 0x27, 0x37, 0x36, 0x49, 0x64, 0x35, 0x36, 0x5c, 0x66, 0x91, 0x84, 0x3c, 0x2b, 0x01, 0x01, 0x41, 0x43, 0x50, 0x2f, 0x30, 0x68, 0x21, 0x20, 0x44, 0x50, 0x2f, 0x2e, 0x6a, 0x6a, 0x23, 0x32, 0x32, 0x45, 0x44, 0x31, 0x30, 0x04, 0x97, 0x45, 0x21, 0x21, 0x45, 0x44, 0x7e, 0xfe, 0x7a, 0x78, 0x6c, 0x58, 0x36, 0x56, 0x30, 0xe8, 0x3d, 0x2d, 0x5a, 0x58, 0x35, 0x36, 0x5c, 0xfe, 0x9e, 0x01, 0x77, 0x5b, 0x2c, 0x2b, 0x35, 0x36, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x39, 0x1c, 0x1b, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x01, 0xad, 0x04, 0x09, 0x05, 0x10, 0x00, 0x28, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x02, 0x16, 0x27, 0x36, 0x37, 0x4a, 0x63, 0x6c, 0x6a, 0x20, 0x20, 0x42, 0x51, 0x30, 0x2f, 0x68, 0x20, 0x21, 0x43, 0x50, 0x2f, 0x30, 0x68, 0x68, 0x24, 0x32, 0x32, 0x44, 0x46, 0x61, 0x03, 0x15, 0x45, 0x22, 0x21, 0x8a, 0x7e, 0x01, 0x7b, 0xfe, 0x89, 0x5b, 0x2b, 0x2c, 0x35, 0x35, 0x5c, 0x01, 0x63, 0xfe, 0x89, 0x5b, 0x2b, 0x2c, 0x36, 0x35, 0x5b, 0x01, 0x63, 0xfc, 0x9d, 0x01, 0x51, 0x3a, 0x1b, 0x1c, 0x46, 0x00, 0x00, 0x00, 0x01, 0xff, 0xeb, 0x01, 0xad, 0x02, 0x82, 0x05, 0x1e, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0xd6, 0x2f, 0x2d, 0x67, 0x28, 0x1c, 0x3c, 0x2b, 0x68, 0x26, 0x65, 0x42, 0x6e, 0x38, 0x39, 0x69, 0x23, 0x24, 0x46, 0x55, 0x30, 0x31, 0x02, 0x91, 0x78, 0x36, 0x36, 0x58, 0x36, 0x56, 0x02, 0x7e, 0x61, 0x38, 0x38, 0x42, 0x44, 0x81, 0xfe, 0x85, 0x01, 0x77, 0x59, 0x2c, 0x2d, 0x35, 0x36, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x01, 0xad, 0x03, 0x00, 0x05, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x02, 0x15, 0x23, 0x23, 0x47, 0x54, 0x31, 0x30, 0x6a, 0x6a, 0x25, 0x32, 0x33, 0x43, 0x6d, 0x38, 0x38, 0x2b, 0x3c, 0x1c, 0x28, 0x66, 0x2e, 0x2f, 0x04, 0x13, 0x59, 0x2c, 0x2d, 0x35, 0x36, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x38, 0x1c, 0x1c, 0x42, 0x44, 0x81, 0xfe, 0x7a, 0x56, 0x36, 0x58, 0x36, 0x36, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x02, 0x9c, 0x02, 0x7e, 0x05, 0x1e, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x23, 0x66, 0x9a, 0x01, 0x0e, 0x6f, 0x9a, 0xfe, 0xf1, 0x6e, 0x05, 0x1e, 0xfe, 0x07, 0x01, 0xf9, 0xfd, 0x7e, 0x01, 0xfa, 0xfe, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x05, 0x1e, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x20, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x16, 0x22, 0x07, 0x06, 0x07, 0x21, 0x26, 0x27, 0x17, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x64, 0x87, 0x4f, 0x4d, 0x4d, 0x4f, 0x87, 0x89, 0x4d, 0x4e, 0x4e, 0x4d, 0xdc, 0xa7, 0x31, 0x2a, 0x06, 0x01, 0x69, 0x06, 0x2a, 0x2c, 0xfe, 0x9e, 0x0a, 0x22, 0x31, 0x55, 0x53, 0x31, 0x22, 0x05, 0x1e, 0x57, 0x57, 0x9b, 0x9a, 0x57, 0x58, 0x58, 0x57, 0x9a, 0x9b, 0x57, 0x57, 0x57, 0x40, 0x39, 0x5c, 0x5b, 0x38, 0xef, 0x45, 0x2d, 0x41, 0x41, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3f, 0x01, 0xae, 0x02, 0x88, 0x06, 0x03, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x17, 0x11, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x11, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x01, 0x2e, 0x88, 0x01, 0x78, 0x88, 0x65, 0x3f, 0x4d, 0x4d, 0x3f, 0x65, 0x88, 0xfe, 0x88, 0x88, 0x64, 0x3c, 0x4e, 0x4e, 0x3c, 0x64, 0x68, 0x30, 0x22, 0x30, 0x30, 0x22, 0x98, 0x2f, 0x20, 0x31, 0x30, 0x21, 0x05, 0xa7, 0x5c, 0x5c, 0x8c, 0x0e, 0x46, 0x57, 0x9b, 0x9a, 0x57, 0x47, 0x0e, 0x85, 0x5c, 0x5c, 0x86, 0x0e, 0x46, 0x57, 0x9a, 0x9b, 0x57, 0x45, 0x0f, 0x5b, 0xfe, 0x2a, 0x0e, 0x2c, 0x41, 0x70, 0x6f, 0x41, 0x2d, 0xfe, 0x39, 0x01, 0xd4, 0x0e, 0x2a, 0x41, 0xe2, 0x40, 0x2b, 0x00, 0x01, 0x00, 0x3f, 0x01, 0xad, 0x02, 0x25, 0x05, 0x1e, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x02, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x02, 0x02, 0x2c, 0x60, 0x32, 0x4e, 0x26, 0x28, 0x1c, 0x1c, 0x54, 0x24, 0x6e, 0x2f, 0x2f, 0x45, 0x46, 0x7b, 0x33, 0x38, 0x0c, 0x2c, 0x3b, 0x84, 0x90, 0x66, 0x2e, 0x2f, 0x3a, 0x38, 0x38, 0x37, 0x4a, 0x4f, 0x1c, 0x1d, 0x61, 0x25, 0x60, 0x56, 0x3f, 0x3f, 0x75, 0x3a, 0x67, 0x04, 0xfd, 0x62, 0x17, 0x16, 0x17, 0x18, 0x2f, 0x24, 0x15, 0x14, 0x12, 0x08, 0x18, 0x2b, 0x2a, 0x4d, 0x57, 0x33, 0x33, 0x09, 0x03, 0x07, 0x56, 0x36, 0x58, 0x36, 0x36, 0x78, 0x22, 0x6a, 0x1d, 0x0f, 0x0f, 0x32, 0x2d, 0x2a, 0x17, 0x16, 0x15, 0x08, 0x14, 0x54, 0x49, 0x58, 0x30, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xeb, 0x01, 0xad, 0x01, 0x9d, 0x06, 0x03, 0x00, 0x17, 0x00, 0x00, 0x13, 0x02, 0x03, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x13, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x6e, 0x01, 0x01, 0x32, 0x2d, 0x6e, 0x63, 0x64, 0x38, 0x15, 0x17, 0x02, 0x2f, 0x2d, 0x67, 0x28, 0x1c, 0x3c, 0x2b, 0x02, 0x91, 0x01, 0x5d, 0x01, 0x4d, 0x65, 0x33, 0x30, 0x55, 0x17, 0x16, 0x3a, 0xfd, 0x4a, 0x78, 0x36, 0x36, 0x58, 0x36, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x01, 0xad, 0x01, 0xac, 0x05, 0xc1, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0xd4, 0xd8, 0xd8, 0x2c, 0x40, 0x6c, 0x2f, 0x2e, 0x67, 0x27, 0x1b, 0x3c, 0x2b, 0x03, 0x78, 0x2e, 0x2e, 0x4c, 0x4c, 0x05, 0xc1, 0xb2, 0x50, 0xfe, 0xac, 0x4d, 0x2c, 0x61, 0x78, 0x36, 0x36, 0x58, 0x36, 0x56, 0x0b, 0x2d, 0x2c, 0x76, 0x01, 0x54, 0x50, 0xb2, 0x00, 0x02, 0x00, 0x54, 0x02, 0x8c, 0x03, 0x35, 0x05, 0x0f, 0x00, 0x17, 0x00, 0x21, 0x00, 0x00, 0x13, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x29, 0x01, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x55, 0x63, 0x68, 0x01, 0x43, 0x69, 0x69, 0x69, 0x69, 0x27, 0x32, 0x32, 0x42, 0x6d, 0x71, 0x01, 0xaa, 0xfe, 0xbe, 0x23, 0x23, 0x46, 0x55, 0x31, 0x2c, 0x03, 0x99, 0x5c, 0x01, 0x1a, 0xfe, 0xe6, 0x01, 0x1a, 0xfe, 0xe6, 0x5c, 0xfd, 0x60, 0x39, 0x1c, 0x1b, 0x86, 0x82, 0x05, 0x02, 0x59, 0x2c, 0x2d, 0x36, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x02, 0x8b, 0x02, 0x90, 0x05, 0x0f, 0x00, 0x26, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x33, 0x15, 0x23, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x40, 0xfb, 0x3e, 0x24, 0x25, 0x32, 0x32, 0x51, 0x52, 0x31, 0x33, 0x26, 0x28, 0x38, 0xf6, 0x85, 0x40, 0x20, 0x1f, 0x51, 0x50, 0xff, 0x00, 0x50, 0x51, 0x1e, 0x1e, 0x43, 0x04, 0xb3, 0x5c, 0x7b, 0x27, 0x3a, 0x3f, 0x4b, 0x59, 0x37, 0x36, 0x36, 0x37, 0x59, 0x52, 0x38, 0x3e, 0x23, 0x7b, 0x5c, 0x38, 0x3f, 0x3e, 0x4c, 0x83, 0x52, 0x52, 0x51, 0x52, 0x80, 0x52, 0x3c, 0x3d, 0x3a, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x8a, 0x02, 0x51, 0x05, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x01, 0x5d, 0x49, 0x41, 0x69, 0x3d, 0x3e, 0x78, 0x78, 0x3f, 0x3d, 0x6a, 0x40, 0x02, 0xe2, 0x50, 0x5a, 0x01, 0x83, 0xfe, 0x73, 0x7b, 0x3e, 0x3f, 0x3f, 0x3e, 0x7b, 0x01, 0x8d, 0xfe, 0x7d, 0x5a, 0x50, 0x00, 0x00, 0x01, 0x00, 0x6d, 0x02, 0x9c, 0x02, 0x79, 0x05, 0x0f, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3f, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x01, 0x43, 0xb7, 0x41, 0x1f, 0x1f, 0x50, 0x51, 0x80, 0x28, 0x66, 0x5c, 0x68, 0x15, 0x17, 0x3b, 0x1d, 0x51, 0x32, 0x31, 0x24, 0x2d, 0x35, 0x2b, 0x04, 0xc4, 0x38, 0x3f, 0x3e, 0x4c, 0x83, 0x52, 0x52, 0x6c, 0x77, 0x01, 0x90, 0xfe, 0x70, 0x55, 0x1c, 0x1c, 0x01, 0x01, 0x36, 0x37, 0x59, 0x51, 0x38, 0x43, 0x1f, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x02, 0x9c, 0x02, 0x8d, 0x05, 0x0f, 0x00, 0x06, 0x00, 0x00, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x13, 0x33, 0x02, 0x8c, 0x6e, 0xc6, 0xc7, 0x6f, 0xef, 0x8e, 0x02, 0x9c, 0x02, 0x0e, 0xfd, 0xf2, 0x02, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x02, 0x9c, 0x02, 0x30, 0x05, 0x0f, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x40, 0x01, 0xf0, 0xfe, 0x77, 0x01, 0x89, 0xfe, 0x02, 0x01, 0x88, 0xfe, 0x86, 0x05, 0x0f, 0x5e, 0xfe, 0x3d, 0x52, 0x5e, 0x01, 0xc3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x01, 0xad, 0x02, 0xb1, 0x05, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x23, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, 0x40, 0x01, 0xf0, 0xfe, 0x77, 0x01, 0x89, 0x01, 0x15, 0x15, 0x3d, 0x1a, 0x27, 0x67, 0x5c, 0xfe, 0x6c, 0x01, 0x88, 0xfe, 0x86, 0x05, 0x0f, 0x5e, 0xfe, 0x3d, 0x52, 0x0b, 0x56, 0x1b, 0x1b, 0x58, 0x6c, 0x78, 0x0b, 0x5e, 0x01, 0xc3, 0x00, 0x00, 0x02, 0x00, 0x31, 0x02, 0x5e, 0x02, 0x30, 0x05, 0x0f, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x06, 0x15, 0x23, 0x34, 0x37, 0x23, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x33, 0x36, 0x33, 0x32, 0x15, 0x14, 0x23, 0x27, 0x33, 0x32, 0x35, 0x34, 0x23, 0x06, 0x01, 0x56, 0x02, 0x56, 0x02, 0xce, 0x01, 0x88, 0xfe, 0x86, 0x01, 0xf0, 0xfe, 0x77, 0x63, 0x23, 0x7c, 0x81, 0xbd, 0x0b, 0x0b, 0x63, 0x28, 0x32, 0x02, 0x9c, 0x1d, 0x21, 0x21, 0x1d, 0x5e, 0x01, 0xc3, 0x52, 0x5e, 0xfe, 0x3d, 0xa2, 0x8a, 0x6a, 0x52, 0x1f, 0x33, 0x01, 0x00, 0x01, 0x00, 0x31, 0x01, 0xa8, 0x02, 0x60, 0x05, 0x0f, 0x00, 0x21, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x13, 0x21, 0x35, 0x21, 0x15, 0x01, 0x44, 0x3c, 0x49, 0x38, 0x31, 0x2e, 0x57, 0x56, 0x9f, 0x35, 0x39, 0x38, 0x3c, 0x2f, 0x72, 0x3e, 0x6c, 0x37, 0x39, 0x34, 0x34, 0x5e, 0x63, 0xf4, 0xfe, 0x86, 0x01, 0xef, 0x03, 0xa7, 0x20, 0x17, 0x3d, 0x3b, 0x4d, 0x7c, 0x43, 0x44, 0x0a, 0x0b, 0x14, 0x6d, 0x1b, 0x1c, 0x2a, 0x2a, 0x50, 0x4a, 0x2a, 0x29, 0x5d, 0x01, 0x18, 0x52, 0x5e, 0x00, 0x03, 0x00, 0x3f, 0x02, 0x8f, 0x02, 0x88, 0x06, 0x0c, 0x00, 0x08, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x13, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x10, 0x37, 0x36, 0x02, 0x18, 0xfe, 0x97, 0x05, 0x2a, 0x31, 0x55, 0x53, 0x31, 0x2a, 0x05, 0x09, 0x26, 0x31, 0xa7, 0x31, 0x27, 0x08, 0xb4, 0x87, 0x4f, 0x4d, 0x4d, 0x4f, 0x87, 0x89, 0x9b, 0x4d, 0x4e, 0x04, 0x2a, 0x80, 0x4d, 0x57, 0x58, 0x4d, 0xde, 0x6d, 0x47, 0x59, 0x58, 0x46, 0x6f, 0x01, 0x83, 0x76, 0x77, 0xfe, 0x5e, 0x77, 0x77, 0xee, 0x01, 0xa2, 0x77, 0x76, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xb8, 0x04, 0xee, 0xff, 0xaf, 0x06, 0x66, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x37, 0x33, 0xfe, 0xd2, 0xfd, 0xe6, 0x01, 0xe2, 0x97, 0x7d, 0x04, 0xee, 0x94, 0xe4, 0x00, 0x01, 0xfc, 0xb8, 0x04, 0xee, 0xff, 0xaf, 0x06, 0x66, 0x00, 0x05, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x21, 0x15, 0xfd, 0x95, 0xdd, 0x7d, 0x98, 0x01, 0xe1, 0x04, 0xee, 0x01, 0x78, 0xe4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xb8, 0x04, 0xee, 0xff, 0xaf, 0x06, 0x66, 0x00, 0x05, 0x00, 0x00, 0x01, 0x13, 0x23, 0x27, 0x21, 0x35, 0xfe, 0xd2, 0xdc, 0x7d, 0x97, 0xfe, 0x1e, 0x06, 0x66, 0xfe, 0x88, 0xe4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xb8, 0x04, 0xee, 0xff, 0xaf, 0x06, 0x66, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x07, 0x23, 0xfd, 0x95, 0x02, 0x19, 0xfe, 0x1f, 0x98, 0x7d, 0x06, 0x66, 0x94, 0xe4, 0x00, 0x01, 0xfc, 0xa1, 0x04, 0xee, 0xff, 0xc5, 0x06, 0x66, 0x00, 0x09, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x07, 0x23, 0x03, 0x33, 0x17, 0xfe, 0x63, 0x85, 0xdd, 0x7d, 0xa2, 0xa2, 0x86, 0xdc, 0x7d, 0xa2, 0x06, 0x66, 0xfe, 0x88, 0xf5, 0xf5, 0x01, 0x78, 0xf5, 0x00, 0x01, 0xfc, 0xa1, 0x04, 0xee, 0xff, 0xc5, 0x06, 0x66, 0x00, 0x09, 0x00, 0x00, 0x01, 0x17, 0x37, 0x33, 0x03, 0x23, 0x27, 0x07, 0x23, 0x13, 0xfe, 0x04, 0xa2, 0xa2, 0x7d, 0xdd, 0x85, 0xa2, 0xa2, 0x7d, 0xdc, 0x06, 0x66, 0xf5, 0xf5, 0xfe, 0x88, 0xf5, 0xf5, 0x01, 0x78, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x13, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd6, 0x04, 0x43, 0x00, 0x01, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x13, 0x03, 0xc3, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd6, 0x03, 0xe5, 0x00, 0x01, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x43, 0x01, 0x75, 0x12, 0x06, 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa5, 0xff, 0xe3, 0x04, 0x2e, 0x07, 0x52, 0x10, 0x27, 0x02, 0xb8, 0x02, 0xc7, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x45, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x25, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x04, 0x2e, 0x06, 0x14, 0x12, 0x26, 0x00, 0x45, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x25, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0xc0, 0x04, 0x2e, 0x06, 0x14, 0x12, 0x26, 0x00, 0x45, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0x81, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x04, 0xa4, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0xc4, 0x01, 0x76, 0x12, 0x06, 0x00, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x03, 0x84, 0x06, 0x66, 0x12, 0x26, 0x00, 0xa9, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x6e, 0x01, 0x75, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x07, 0x89, 0x10, 0x27, 0x02, 0xb8, 0x05, 0x65, 0x01, 0x75, 0x12, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x8a, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x6e, 0x00, 0x01, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x8a, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd4, 0x03, 0xf5, 0x00, 0x01, 0x12, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc1, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xe2, 0x04, 0x6e, 0x00, 0x01, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0xc1, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x27, 0x02, 0xe2, 0x03, 0xf5, 0x00, 0x01, 0x12, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x77, 0x05, 0x1f, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x27, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x52, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x03, 0xeb, 0x06, 0x14, 0x12, 0x26, 0x00, 0x47, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0xf7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x15, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xde, 0x04, 0x6e, 0x00, 0x01, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x15, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x27, 0x02, 0xde, 0x03, 0xf5, 0x00, 0x01, 0x12, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x24, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x07, 0x5e, 0x10, 0x27, 0x11, 0x24, 0xff, 0xdd, 0xff, 0x04, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x23, 0xee, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x07, 0x5e, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x11, 0x23, 0xff, 0xdb, 0xff, 0x04, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x4b, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0xde, 0x04, 0x39, 0x00, 0x37, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x4b, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xde, 0x04, 0x38, 0x00, 0x37, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x76, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0x00, 0xa1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x76, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0x00, 0x8c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x75, 0x04, 0x17, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x2a, 0x01, 0x75, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0x00, 0xab, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x0c, 0x06, 0x48, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x26, 0x02, 0x9a, 0x7a, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x44, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x04, 0x01, 0x74, 0x12, 0x06, 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x07, 0x89, 0x10, 0x27, 0x02, 0xb8, 0x03, 0x7d, 0x01, 0x75, 0x12, 0x06, 0x00, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x18, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8b, 0x01, 0x13, 0x01, 0x22, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x05, 0xf6, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8b, 0x42, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x92, 0x01, 0x73, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa5, 0x00, 0x00, 0x03, 0xf4, 0x07, 0x52, 0x10, 0x27, 0x02, 0xb8, 0x02, 0xc7, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x82, 0x00, 0x00, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x03, 0xf4, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x1a, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x50, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x6a, 0x00, 0xee, 0x01, 0x40, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x03, 0xf4, 0x07, 0x4e, 0x10, 0x27, 0x02, 0xb9, 0x02, 0xc7, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0xfe, 0x74, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0xff, 0x09, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x74, 0x03, 0xf4, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x39, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x10, 0x07, 0x02, 0xdf, 0x04, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x39, 0x03, 0xf4, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x02, 0xdf, 0x04, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0x76, 0x02, 0x52, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0xff, 0x5c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd7, 0xfe, 0x76, 0x02, 0x2a, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb0, 0xff, 0x34, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x02, 0x1d, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x11, 0x21, 0xfe, 0x9c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x02, 0x0c, 0x07, 0x16, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x11, 0x21, 0xfe, 0x8a, 0xfe, 0xbc, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x65, 0x01, 0x76, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x03, 0x04, 0x01, 0x76, 0x12, 0x06, 0x00, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xe0, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x04, 0x26, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x1c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x04, 0xe0, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0xf2, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0xc0, 0x04, 0x26, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x6a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x24, 0x00, 0x00, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x01, 0x5e, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd4, 0x02, 0xd6, 0x00, 0x00, 0x10, 0x06, 0x00, 0x4f, 0x0a, 0x00, 0xff, 0xff, 0x00, 0x02, 0xfe, 0x8a, 0x03, 0xf9, 0x07, 0x6b, 0x10, 0x27, 0x02, 0xb5, 0x02, 0xd9, 0x01, 0x75, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x23, 0x00, 0x01, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0x89, 0x02, 0x18, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0xff, 0x3e, 0x01, 0x3b, 0x10, 0x06, 0x05, 0x87, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x03, 0xf9, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0x80, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf5, 0xfe, 0xc0, 0x02, 0x10, 0x06, 0x14, 0x10, 0x27, 0x02, 0x8f, 0xff, 0x36, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x14, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x02, 0x88, 0x00, 0x88, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe1, 0xfe, 0x14, 0x02, 0x20, 0x06, 0x14, 0x10, 0x27, 0x02, 0x88, 0xff, 0x34, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0xe8, 0x01, 0x76, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x06, 0x66, 0x12, 0x26, 0x00, 0x50, 0x00, 0x00, 0x10, 0x07, 0x00, 0x76, 0x01, 0x6c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0xeb, 0x01, 0x74, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x05, 0x52, 0x00, 0x00, 0x12, 0x06, 0x00, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x05, 0x83, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0xe8, 0x00, 0x00, 0x10, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x06, 0x67, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x05, 0x4f, 0x00, 0x00, 0x10, 0x06, 0x00, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x76, 0x01, 0x75, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x15, 0x00, 0x00, 0x12, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x7e, 0x00, 0x00, 0x10, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x1a, 0x00, 0x00, 0x10, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x04, 0xae, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0xde, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0xc0, 0x03, 0xf4, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x7e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x14, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x27, 0x02, 0x88, 0x00, 0xe5, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x14, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x27, 0x02, 0x88, 0x00, 0x86, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x29, 0x5c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x0c, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x11, 0x29, 0xff, 0xba, 0xfe, 0xb2, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x56, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x27, 0x61, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x0f, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0x64, 0x00, 0xff, 0x10, 0x07, 0x10, 0xed, 0x04, 0x00, 0x00, 0x12, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x24, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x5e, 0x10, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x11, 0x24, 0xff, 0xbc, 0xff, 0x04, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x23, 0x5e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x5e, 0x10, 0x27, 0x11, 0x23, 0xff, 0xc0, 0xff, 0x04, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x28, 0x01, 0x76, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x66, 0x12, 0x26, 0x00, 0x53, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x2d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x10, 0x01, 0x74, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x2f, 0x00, 0x00, 0x12, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x10, 0x01, 0x73, 0x12, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x02, 0xf6, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xae, 0x00, 0x00, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xcc, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x0a, 0x00, 0x00, 0x10, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x02, 0xf6, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x02, 0xd0, 0x00, 0x00, 0x10, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xcc, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0x70, 0x01, 0x3b, 0x10, 0x06, 0x05, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x02, 0xf6, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x15, 0xff, 0x10, 0x06, 0x05, 0xab, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x04, 0xcc, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0xce, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4b, 0xfe, 0xc0, 0x02, 0xf6, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x8c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x3f, 0x01, 0x74, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xbd, 0x00, 0x00, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x89, 0x04, 0x2c, 0x05, 0xf0, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x16, 0x00, 0x00, 0x10, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x8a, 0x03, 0x67, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x03, 0xbb, 0x00, 0x01, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xec, 0x04, 0x65, 0x01, 0x76, 0x10, 0x27, 0x10, 0xf3, 0x03, 0x47, 0x01, 0x92, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x7f, 0x06, 0x66, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, 0x10, 0x26, 0x02, 0x9b, 0x98, 0x56, 0x10, 0x07, 0x00, 0x76, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x08, 0x57, 0x10, 0x26, 0x11, 0x28, 0xe7, 0x00, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x07, 0xc9, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xc2, 0x01, 0xb5, 0x12, 0x06, 0x01, 0x23, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x89, 0x04, 0x2c, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x25, 0x01, 0x74, 0x12, 0x06, 0x05, 0xb2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x8a, 0x03, 0x67, 0x05, 0xde, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xbd, 0xff, 0xca, 0x12, 0x06, 0x05, 0xb3, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x00, 0x01, 0x74, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x07, 0x89, 0x10, 0x27, 0x02, 0xb8, 0x02, 0xcb, 0x01, 0x75, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0x89, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x03, 0xff, 0x00, 0x00, 0x10, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0x89, 0x02, 0xa7, 0x05, 0x9e, 0x10, 0x27, 0x02, 0xd4, 0x03, 0x84, 0x00, 0x00, 0x10, 0x06, 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0xc0, 0x04, 0x6c, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x58, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0xc0, 0x02, 0xd0, 0x05, 0x9e, 0x10, 0x26, 0x02, 0x8f, 0xf5, 0x00, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0x14, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x27, 0x02, 0x88, 0x00, 0x67, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0x14, 0x02, 0xd6, 0x05, 0x9e, 0x10, 0x27, 0x02, 0x88, 0xff, 0xea, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x89, 0x04, 0xa5, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd5, 0x04, 0x72, 0x00, 0x00, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x89, 0x03, 0xe9, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd5, 0x04, 0x08, 0x00, 0x00, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x76, 0x04, 0xa5, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0x00, 0xda, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x76, 0x03, 0xe9, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0x00, 0x81, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x4b, 0x04, 0xa5, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0xde, 0x04, 0x63, 0x00, 0x37, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x4b, 0x03, 0xe9, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0xde, 0x04, 0x03, 0x00, 0x37, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x5a, 0x10, 0x26, 0x11, 0x29, 0x29, 0x00, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0xec, 0x10, 0x26, 0x01, 0x2b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x76, 0x00, 0x87, 0x01, 0x86, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x34, 0x10, 0x26, 0x11, 0x1f, 0x2d, 0x00, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0xf4, 0x10, 0x27, 0x11, 0x1f, 0xff, 0xce, 0xfe, 0xc0, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x7d, 0x12, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9e, 0x00, 0xd5, 0x01, 0x46, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x37, 0x12, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9e, 0x62, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x89, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x89, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x03, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x72, 0x10, 0x27, 0x10, 0xee, 0x05, 0x5c, 0x01, 0x7c, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x6b, 0x10, 0x27, 0x00, 0x43, 0x00, 0xee, 0x00, 0x05, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x72, 0x10, 0x27, 0x10, 0xec, 0x05, 0x5c, 0x01, 0x7c, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x6d, 0x10, 0x27, 0x00, 0x76, 0x01, 0x5f, 0x00, 0x07, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x4e, 0x10, 0x27, 0x00, 0x6a, 0x01, 0xc3, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x10, 0x10, 0x27, 0x00, 0x6a, 0x01, 0x24, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xf3, 0x05, 0x5c, 0x01, 0x73, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0xc0, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0xfe, 0x89, 0x06, 0xe3, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x05, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0xfe, 0x89, 0x05, 0x97, 0x04, 0x60, 0x12, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0xc3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x4f, 0x01, 0x73, 0x12, 0x06, 0x00, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xf2, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x6a, 0x00, 0xb6, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x06, 0x10, 0x12, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x10, 0x06, 0x00, 0x6a, 0x5c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xf0, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0x45, 0x01, 0x75, 0x12, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x06, 0x66, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x10, 0x06, 0x02, 0x88, 0x17, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xfe, 0x89, 0x04, 0x9c, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x5d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0xfe, 0x89, 0x03, 0x79, 0x04, 0x60, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x03, 0xc6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xfe, 0xc0, 0x04, 0x9c, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0xfe, 0xc0, 0x03, 0x79, 0x04, 0x60, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0xc0, 0x03, 0xf4, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x5c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x02, 0xa7, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x57, 0x00, 0x00, 0x10, 0x07, 0x00, 0x6a, 0xff, 0x42, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x07, 0x06, 0x12, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9c, 0x01, 0x22, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x07, 0x06, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9c, 0x74, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0xd8, 0x06, 0x14, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x02, 0x80, 0x03, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x07, 0x89, 0x10, 0x27, 0x02, 0xb8, 0x03, 0x7d, 0x01, 0x75, 0x12, 0x06, 0x01, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x00, 0x18, 0x00, 0x00, 0x21, 0x23, 0x11, 0x07, 0x27, 0x37, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x37, 0x17, 0x05, 0x01, 0x6f, 0xa6, 0x85, 0x42, 0xc7, 0x9f, 0x9f, 0x9c, 0xaa, 0x9d, 0x9e, 0x5a, 0x23, 0x22, 0xc1, 0x43, 0xfe, 0xfc, 0x02, 0x14, 0x68, 0x6a, 0x9d, 0x01, 0x1e, 0x8f, 0x4e, 0xbb, 0xab, 0x99, 0x28, 0x29, 0x67, 0xfe, 0x74, 0x98, 0x69, 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x00, 0x17, 0x00, 0x00, 0x21, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x07, 0x33, 0x15, 0x23, 0x01, 0x6f, 0xa6, 0x9f, 0x9f, 0x9f, 0xa1, 0x0c, 0x40, 0x4e, 0xaa, 0x9d, 0x9e, 0x5a, 0x23, 0x1b, 0x05, 0xe4, 0xe6, 0x03, 0x45, 0x8f, 0x8c, 0x8f, 0x89, 0x46, 0x56, 0x99, 0x28, 0x20, 0x44, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0xff, 0xe3, 0x05, 0x22, 0x05, 0xf2, 0x00, 0x37, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x0e, 0x03, 0x15, 0x11, 0x23, 0x11, 0x34, 0x3e, 0x03, 0x33, 0x32, 0x04, 0x17, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x05, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x07, 0x35, 0x34, 0x36, 0x03, 0x9c, 0x62, 0x9c, 0x3a, 0x5c, 0x55, 0x3a, 0x22, 0xb7, 0x34, 0x5a, 0x81, 0x95, 0x5a, 0xc3, 0x01, 0x11, 0x32, 0xba, 0xe8, 0x3d, 0x5f, 0x74, 0x74, 0x60, 0x3c, 0xee, 0xbe, 0xa2, 0xb5, 0x62, 0x9f, 0x64, 0x58, 0x88, 0x25, 0x3f, 0x52, 0x5a, 0x5a, 0x52, 0x3f, 0x25, 0xc9, 0x04, 0xf4, 0x5a, 0x18, 0x40, 0x68, 0xa7, 0x6f, 0xfc, 0x88, 0x03, 0x91, 0x83, 0xcf, 0x8b, 0x5c, 0x28, 0xc5, 0xbd, 0x7d, 0x5f, 0x2d, 0x43, 0x2d, 0x2d, 0x3e, 0x54, 0x8c, 0x5c, 0xa4, 0xc9, 0x5f, 0xd0, 0x45, 0x46, 0x76, 0x58, 0x35, 0x50, 0x33, 0x29, 0x20, 0x24, 0x32, 0x42, 0x67, 0x43, 0x8f, 0xbb, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x05, 0xf0, 0x10, 0x06, 0x03, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x89, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x3e, 0x00, 0x00, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x89, 0x03, 0xc3, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x03, 0xb7, 0x00, 0x00, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x43, 0x01, 0x75, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x7b, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x03, 0xe5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0x37, 0x06, 0xc5, 0x10, 0x27, 0x11, 0x2a, 0xff, 0xa1, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0xc6, 0x10, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x11, 0x2b, 0xff, 0x9f, 0xfe, 0x8c, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x5b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x31, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0x27, 0x06, 0xe6, 0x10, 0x27, 0x11, 0x31, 0xff, 0xa1, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x75, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x00, 0x10, 0x27, 0x11, 0x2c, 0xff, 0xa1, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x89, 0x04, 0xde, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x84, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x89, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0xa4, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x03, 0xb8, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x04, 0x10, 0x27, 0x11, 0x2e, 0xff, 0x9c, 0xfe, 0xaa, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x04, 0x10, 0x27, 0x11, 0x2f, 0xff, 0x9d, 0xfe, 0xaa, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x8b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x30, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x35, 0x10, 0x27, 0x11, 0x30, 0xff, 0x9f, 0xfe, 0xaa, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x59, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2d, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x03, 0x10, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x11, 0x2d, 0xff, 0x9d, 0xfe, 0xaa, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x89, 0x04, 0xde, 0x07, 0x92, 0x12, 0x26, 0x00, 0xc4, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x89, 0x03, 0xc3, 0x06, 0x1f, 0x12, 0x26, 0x00, 0xc5, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x03, 0xc8, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0x17, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x89, 0x04, 0x0c, 0x04, 0x7b, 0x10, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x17, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x28, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0x28, 0x01, 0x75, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x37, 0x10, 0x27, 0x02, 0x9e, 0x00, 0x88, 0x00, 0x00, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x96, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x6b, 0x06, 0xc5, 0x10, 0x27, 0x11, 0x2a, 0xff, 0xd5, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2b, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0xc6, 0x10, 0x27, 0x11, 0x2b, 0xff, 0xd5, 0xfe, 0x8c, 0x10, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x77, 0x08, 0x5b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x31, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x5c, 0x06, 0xe6, 0x10, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x11, 0x31, 0xff, 0xd5, 0xfe, 0x8b, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x08, 0x75, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2c, 0xec, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x07, 0x00, 0x10, 0x27, 0x11, 0x2c, 0xff, 0xd6, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0x17, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x8c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x89, 0x04, 0x0c, 0x06, 0x66, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x17, 0x00, 0x00, 0x10, 0x26, 0x06, 0x09, 0x00, 0x00, 0x10, 0x06, 0x02, 0x88, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x51, 0x00, 0x00, 0x01, 0xe5, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x02, 0xd3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x01, 0xd1, 0x06, 0x7c, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x02, 0xbf, 0x00, 0x01, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x01, 0x6b, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0xab, 0xfe, 0x89, 0x01, 0x54, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x02, 0xcd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x89, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0xa3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x89, 0x04, 0x03, 0x04, 0x7b, 0x10, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x7b, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2a, 0x61, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x53, 0x06, 0xc5, 0x10, 0x27, 0x11, 0x2a, 0xff, 0xbd, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2b, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0xc6, 0x10, 0x27, 0x11, 0x2b, 0xff, 0xbc, 0xfe, 0x8c, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x5b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x31, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x44, 0x06, 0xe6, 0x10, 0x27, 0x11, 0x31, 0xff, 0xbd, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x75, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2c, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x00, 0x10, 0x27, 0x11, 0x2c, 0xff, 0xbd, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x89, 0x05, 0x44, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x96, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0xa3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x89, 0x04, 0x03, 0x06, 0x66, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x01, 0x00, 0x00, 0x10, 0x26, 0x06, 0x1d, 0x00, 0x00, 0x10, 0x06, 0x02, 0x88, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xec, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x06, 0x66, 0x10, 0x26, 0x00, 0x76, 0x68, 0x00, 0x12, 0x06, 0x01, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xee, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x06, 0x66, 0x10, 0x26, 0x00, 0x43, 0x68, 0x00, 0x12, 0x06, 0x01, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x07, 0xf0, 0x12, 0x26, 0x01, 0x62, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x06, 0x7b, 0x12, 0x26, 0x01, 0x63, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x06, 0x37, 0x10, 0x26, 0x02, 0x9e, 0x68, 0x00, 0x12, 0x06, 0x01, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xfe, 0x89, 0x05, 0x81, 0x06, 0x14, 0x12, 0x26, 0x01, 0x62, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0xa3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x89, 0x04, 0x58, 0x04, 0xeb, 0x12, 0x26, 0x01, 0x63, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x89, 0x04, 0xa5, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x76, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x89, 0x03, 0xe9, 0x04, 0x7b, 0x10, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xec, 0x04, 0x70, 0x01, 0x75, 0x12, 0x06, 0x01, 0x71, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x06, 0x66, 0x10, 0x26, 0x00, 0x76, 0x6f, 0x00, 0x12, 0x06, 0x01, 0x72, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xee, 0x04, 0x70, 0x01, 0x75, 0x12, 0x06, 0x01, 0x71, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x06, 0x66, 0x10, 0x26, 0x00, 0x43, 0x6f, 0x00, 0x12, 0x06, 0x01, 0x72, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x07, 0xf0, 0x12, 0x26, 0x01, 0x71, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x06, 0x7b, 0x12, 0x26, 0x01, 0x72, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0x70, 0x01, 0x75, 0x12, 0x06, 0x01, 0x71, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x06, 0x37, 0x10, 0x26, 0x02, 0x9e, 0x73, 0x00, 0x12, 0x06, 0x01, 0x72, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xfe, 0x89, 0x05, 0xbc, 0x06, 0x14, 0x12, 0x26, 0x01, 0x71, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x76, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xfe, 0x89, 0x04, 0xdf, 0x04, 0xeb, 0x12, 0x26, 0x01, 0x72, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x72, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x00, 0x01, 0x7c, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x6b, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x1e, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfe, 0x89, 0x04, 0x6a, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x04, 0x00, 0x00, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x27, 0x02, 0xd4, 0x04, 0xe8, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0xf7, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x00, 0x01, 0x7c, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x82, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x03, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x37, 0x10, 0x26, 0x02, 0x9e, 0x6b, 0x00, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x80, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0xb5, 0xb6, 0xd1, 0xb5, 0x02, 0x8f, 0xfb, 0x35, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0xd5, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x03, 0x54, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xae, 0xa5, 0xca, 0xa5, 0x91, 0x91, 0xa5, 0xca, 0xa5, 0x91, 0x91, 0x06, 0x14, 0x93, 0x93, 0x93, 0x7d, 0xfa, 0xfc, 0x05, 0x04, 0xfa, 0xfc, 0x05, 0x04, 0x7d, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x61, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfc, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x61, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x34, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x07, 0x07, 0x09, 0x00, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0x00, 0x90, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0b, 0x6a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x18, 0x3d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x06, 0x61, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xff, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x06, 0x61, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0x42, 0x06, 0x66, 0x10, 0x27, 0x03, 0x26, 0x01, 0x64, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x06, 0x42, 0x06, 0x66, 0x10, 0x27, 0x03, 0x26, 0x01, 0x64, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x7b, 0x06, 0x66, 0x10, 0x27, 0x03, 0x26, 0x00, 0x9d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0xb6, 0x06, 0x66, 0x10, 0x27, 0x03, 0x26, 0x00, 0xd8, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x0a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x26, 0x2c, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x05, 0x4a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x26, 0x6c, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x61, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfc, 0x3d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x61, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x34, 0x33, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x1d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x21, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x80, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x9d, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x17, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x04, 0xa9, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2a, 0x00, 0x92, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x04, 0xa9, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2a, 0x00, 0x92, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0x7f, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x02, 0x68, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x06, 0x8f, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x02, 0x78, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0x03, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x01, 0xeb, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0x39, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x02, 0x21, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x61, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0x00, 0x95, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x61, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0x00, 0x92, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x73, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0x00, 0x9d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0x00, 0x8c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x07, 0x18, 0x7a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x52, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2c, 0x00, 0x9d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x4f, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2c, 0x00, 0x9a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x07, 0x1d, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x02, 0x68, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x07, 0x23, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x02, 0x6d, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0xb0, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x01, 0xfb, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0xdc, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x02, 0x27, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0x04, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x2c, 0x01, 0x4f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x62, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x06, 0x1d, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x2c, 0x01, 0x67, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, 0x00, 0x00, 0x02, 0x30, 0x06, 0x61, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xff, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x02, 0x30, 0x06, 0x61, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xff, 0x24, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x02, 0x74, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x09, 0xff, 0x3d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x02, 0x80, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x16, 0xff, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x9b, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x62, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, 0x02, 0xa3, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x50, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x02, 0x30, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x2c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcb, 0x00, 0x00, 0x02, 0x30, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x02, 0x08, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2e, 0x00, 0x9d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x01, 0xfd, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2e, 0x00, 0x92, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x03, 0xde, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x02, 0x72, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x03, 0xde, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x02, 0x72, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x03, 0x67, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x01, 0xfc, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x03, 0x9d, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x02, 0x32, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x02, 0xd2, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x2e, 0x01, 0x67, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x62, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x02, 0xd9, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x2e, 0x01, 0x6d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x61, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfc, 0x6c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x61, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x34, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x4c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x7a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0x00, 0x82, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xff, 0xe3, 0x05, 0x63, 0x06, 0x61, 0x10, 0x26, 0x03, 0x34, 0x20, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xff, 0xe3, 0x05, 0xb4, 0x06, 0x61, 0x10, 0x26, 0x03, 0x34, 0x70, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xff, 0xe3, 0x07, 0x7b, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x02, 0x37, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0xff, 0xe3, 0x07, 0x84, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x02, 0x40, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0xff, 0xe3, 0x06, 0x5b, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x01, 0x17, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xff, 0xe3, 0x06, 0x95, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x01, 0x52, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x61, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfc, 0x37, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x61, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x34, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x23, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x1e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x56, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x17, 0x4e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0b, 0x32, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x18, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0xa9, 0x06, 0x61, 0x10, 0x27, 0x03, 0x39, 0x01, 0x3f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x07, 0x33, 0x06, 0x66, 0x10, 0x27, 0x03, 0x39, 0x02, 0xc9, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x07, 0x4e, 0x06, 0x66, 0x10, 0x27, 0x03, 0x39, 0x02, 0xe4, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x06, 0x7b, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x39, 0x02, 0x11, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x61, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0x01, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x61, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0x01, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x09, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x16, 0x01, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0x01, 0x7a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0x01, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0x01, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0x01, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x81, 0x06, 0x61, 0x10, 0x26, 0x03, 0x3d, 0x46, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0xcd, 0x06, 0x61, 0x10, 0x27, 0x03, 0x3d, 0x00, 0x92, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x07, 0x92, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x02, 0x57, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x07, 0x9d, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x02, 0x62, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0x8a, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x4f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0xba, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x7f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0x5d, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x22, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x62, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x06, 0x95, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x5a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x28, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x06, 0x03, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x28, 0x4c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x06, 0x03, 0x41, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x00, 0xb2, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x06, 0x03, 0x42, 0x00, 0x00, 0xff, 0xff, 0xff, 0x98, 0x00, 0x00, 0x02, 0x30, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x02, 0x56, 0x06, 0x66, 0x10, 0x06, 0x03, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x28, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x06, 0x03, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x28, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x06, 0x03, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x01, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x06, 0x03, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x61, 0x10, 0x26, 0x06, 0x4c, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x61, 0x10, 0x26, 0x06, 0x4d, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0x4e, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0x4f, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0x50, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0x51, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x52, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x53, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x56, 0x04, 0xde, 0x06, 0x61, 0x10, 0x26, 0x06, 0x54, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x56, 0x04, 0xde, 0x06, 0x61, 0x10, 0x26, 0x06, 0x55, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x06, 0x42, 0x06, 0x66, 0x10, 0x26, 0x06, 0x56, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x56, 0x06, 0x42, 0x06, 0x66, 0x10, 0x26, 0x06, 0x57, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x7b, 0x06, 0x66, 0x10, 0x26, 0x06, 0x58, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x05, 0xb6, 0x06, 0x66, 0x10, 0x26, 0x06, 0x59, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x0a, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x5a, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xd4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x56, 0x05, 0x4a, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x5b, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x61, 0x10, 0x26, 0x06, 0x68, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x61, 0x10, 0x26, 0x06, 0x69, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0x6a, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0x6b, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0x6c, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0x6d, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x6e, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x6f, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x52, 0x06, 0x61, 0x10, 0x26, 0x06, 0x70, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x75, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x4f, 0x06, 0x61, 0x10, 0x26, 0x06, 0x71, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x72, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x07, 0x1d, 0x06, 0x66, 0x10, 0x26, 0x06, 0x72, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x03, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x56, 0x07, 0x23, 0x06, 0x66, 0x10, 0x26, 0x06, 0x73, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x03, 0x45, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x06, 0xb0, 0x06, 0x66, 0x10, 0x26, 0x06, 0x74, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0xd3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x06, 0xdc, 0x06, 0x66, 0x10, 0x26, 0x06, 0x75, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x06, 0x04, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x76, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x56, 0x06, 0x1d, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x77, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x61, 0x10, 0x26, 0x06, 0xa0, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x61, 0x10, 0x26, 0x06, 0xa1, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xa2, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xa3, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xa4, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xa5, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x07, 0x6d, 0x10, 0x26, 0x06, 0xa6, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x07, 0x6d, 0x10, 0x26, 0x06, 0xa7, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x81, 0x06, 0x61, 0x10, 0x26, 0x06, 0xa8, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0xcd, 0x06, 0x61, 0x10, 0x26, 0x06, 0xa9, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x07, 0x92, 0x06, 0x66, 0x10, 0x26, 0x06, 0xaa, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x03, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x56, 0x07, 0x9d, 0x06, 0x66, 0x10, 0x26, 0x06, 0xab, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x03, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x06, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xac, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x42, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x06, 0xba, 0x06, 0x66, 0x10, 0x26, 0x06, 0xad, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x72, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x06, 0x5d, 0x07, 0x6d, 0x10, 0x26, 0x06, 0xae, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x15, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x56, 0x06, 0x95, 0x07, 0x6d, 0x10, 0x26, 0x06, 0xaf, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x48, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9a, 0x6e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x05, 0xf6, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x00, 0x71, 0x6d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0xb0, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x04, 0x79, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x40, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x37, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfd, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x37, 0x10, 0x26, 0x06, 0xf3, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x41, 0x01, 0x75, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x31, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x01, 0x3b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x05, 0x19, 0x06, 0x66, 0x10, 0x26, 0x03, 0x26, 0x3b, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x06, 0x66, 0x10, 0x06, 0x03, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x56, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5f, 0x04, 0xc2, 0x02, 0x39, 0x06, 0x61, 0x10, 0x06, 0x06, 0xfc, 0x00, 0x00, 0xff, 0xff, 0x01, 0x8a, 0xfe, 0x56, 0x02, 0x51, 0xff, 0xa4, 0x10, 0x06, 0x03, 0x16, 0x00, 0x00, 0x00, 0x01, 0x01, 0x5f, 0x04, 0xc2, 0x02, 0x39, 0x06, 0x61, 0x00, 0x08, 0x00, 0x00, 0x01, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0x02, 0x39, 0xda, 0x79, 0x78, 0xd9, 0x05, 0xcd, 0xfe, 0xf5, 0x67, 0x03, 0x9d, 0x9e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa3, 0x05, 0x1d, 0x02, 0xf6, 0x06, 0x37, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa3, 0x05, 0x46, 0x02, 0xf6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xed, 0x03, 0x9a, 0x01, 0x84, 0x12, 0x06, 0x00, 0x6a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x42, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x37, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfd, 0x00, 0x82, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x37, 0x10, 0x26, 0x07, 0x02, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x05, 0x56, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x01, 0x3f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, 0x00, 0x00, 0x04, 0xea, 0x06, 0x66, 0x10, 0x06, 0x03, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x05, 0xff, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x01, 0x49, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x05, 0x83, 0x06, 0x66, 0x10, 0x06, 0x03, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x26, 0x03, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xe6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x04, 0xc2, 0x03, 0x37, 0x06, 0x66, 0x10, 0x27, 0x06, 0xfc, 0xff, 0x1c, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa2, 0x04, 0xc2, 0x03, 0x39, 0x06, 0x66, 0x10, 0x27, 0x06, 0xfc, 0xff, 0x43, 0x00, 0x00, 0x10, 0x06, 0x07, 0x33, 0x3b, 0x00, 0xff, 0xff, 0x00, 0xa3, 0x04, 0xc2, 0x02, 0xf6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xed, 0x03, 0x9a, 0x01, 0x84, 0x10, 0x06, 0x06, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xed, 0x00, 0x00, 0x02, 0x30, 0x06, 0x48, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9a, 0xff, 0x3a, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00, 0x02, 0x30, 0x05, 0xf6, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0xff, 0x26, 0x00, 0x00, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x00, 0x02, 0x30, 0x07, 0xd2, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x26, 0xff, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x40, 0x07, 0xd2, 0x10, 0x06, 0x03, 0x25, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x02, 0x39, 0x06, 0x37, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfd, 0xff, 0x43, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x02, 0x3b, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfe, 0xff, 0x45, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x02, 0x2a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x2e, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x02, 0xdd, 0x01, 0x75, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1d, 0x07, 0x31, 0x10, 0x26, 0x03, 0x2e, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0xff, 0x43, 0x01, 0x3b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x02, 0xb7, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x01, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3e, 0x06, 0x66, 0x10, 0x06, 0x03, 0x21, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0x04, 0xc2, 0x03, 0x31, 0x06, 0x66, 0x10, 0x27, 0x07, 0x34, 0xff, 0x12, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0x04, 0xc2, 0x03, 0x53, 0x06, 0x66, 0x10, 0x27, 0x07, 0x34, 0xff, 0x27, 0x00, 0x00, 0x10, 0x06, 0x07, 0x33, 0x56, 0x00, 0xff, 0xff, 0x00, 0xa3, 0x04, 0xc2, 0x02, 0xf6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xed, 0x03, 0x9a, 0x01, 0x84, 0x10, 0x06, 0x07, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x48, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9a, 0x23, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x05, 0xf6, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x00, 0x71, 0x20, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0xd2, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x26, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0xd2, 0x10, 0x06, 0x03, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x61, 0x10, 0x26, 0x03, 0x55, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0x00, 0xa8, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x61, 0x10, 0x26, 0x03, 0x55, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0x00, 0x9f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x37, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfd, 0x23, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfe, 0x17, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x39, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x04, 0x01, 0x75, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x31, 0x10, 0x26, 0x03, 0x39, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x74, 0x01, 0x3b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x06, 0x1a, 0x06, 0x66, 0x10, 0x27, 0x03, 0x39, 0x01, 0xb0, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x05, 0xe9, 0x06, 0x66, 0x10, 0x06, 0x03, 0x23, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x04, 0xb0, 0x06, 0x61, 0x10, 0x27, 0x03, 0x36, 0x00, 0x97, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x05, 0x46, 0x02, 0xd9, 0x07, 0xd2, 0x12, 0x26, 0x00, 0x6a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x00, 0x00, 0x01, 0x6c, 0xff, 0xff, 0x00, 0xc1, 0x05, 0x46, 0x02, 0xfd, 0x07, 0xd2, 0x10, 0x06, 0x03, 0x1c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x04, 0xf0, 0x02, 0x49, 0x06, 0x66, 0x10, 0x06, 0x00, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xbc, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x04, 0x60, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x62, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x37, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfd, 0x01, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x37, 0x10, 0x26, 0x07, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xe3, 0x06, 0x5f, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x01, 0x1c, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xe3, 0x05, 0x68, 0x06, 0x66, 0x10, 0x06, 0x03, 0x22, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x06, 0x5e, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x24, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0x00, 0x00, 0x05, 0x6b, 0x06, 0x66, 0x10, 0x06, 0x03, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, 0xfe, 0x56, 0x05, 0x3b, 0x05, 0xe7, 0x10, 0x26, 0x03, 0x3d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x01, 0x4d, 0x04, 0xee, 0x02, 0xfd, 0x06, 0x66, 0x10, 0x06, 0x00, 0x76, 0x00, 0x00, 0x00, 0x01, 0x01, 0x5f, 0x04, 0xc2, 0x02, 0x39, 0x06, 0x61, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x23, 0x14, 0x37, 0x15, 0x22, 0x01, 0x5f, 0xd9, 0x78, 0x79, 0xda, 0x05, 0xcd, 0x94, 0x9e, 0x9d, 0x03, 0x67, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xdf, 0x02, 0x40, 0x02, 0x83, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x01, 0xe5, 0xfe, 0x1b, 0x02, 0x83, 0xa4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0x01, 0xdf, 0x02, 0x40, 0x02, 0x83, 0x12, 0x06, 0x07, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xe9, 0x04, 0x3b, 0x02, 0x79, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x03, 0xe1, 0xfc, 0x1f, 0x02, 0x79, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xe9, 0x03, 0x40, 0x02, 0x79, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x02, 0xe6, 0xfd, 0x1a, 0x02, 0x79, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xe9, 0x06, 0xda, 0x02, 0x79, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x06, 0x7f, 0xf9, 0x81, 0x02, 0x79, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xe9, 0x07, 0x34, 0x02, 0x79, 0x00, 0x03, 0x00, 0x00, 0x11, 0x21, 0x15, 0x21, 0x07, 0x33, 0xf8, 0xcd, 0x02, 0x79, 0x90, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xea, 0xfe, 0x1d, 0x02, 0xac, 0x06, 0x1d, 0x10, 0x26, 0x00, 0x5f, 0x00, 0x00, 0x10, 0x07, 0x00, 0x5f, 0x01, 0x29, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0xfe, 0x1d, 0x03, 0xac, 0xff, 0xee, 0x10, 0x26, 0x00, 0x42, 0x00, 0x00, 0x10, 0x07, 0x00, 0x42, 0x00, 0x00, 0x01, 0x42, 0x00, 0x01, 0x00, 0x9c, 0x03, 0xe9, 0x01, 0xa5, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x35, 0x13, 0x33, 0x03, 0x01, 0x5a, 0xbd, 0x93, 0x74, 0x4a, 0x03, 0xe9, 0xad, 0x01, 0x3f, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x03, 0xfe, 0x01, 0xa8, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x15, 0x03, 0x23, 0x13, 0xea, 0xbe, 0x94, 0x74, 0x4a, 0x05, 0xd5, 0x98, 0xfe, 0xc1, 0x01, 0x3f, 0x00, 0x01, 0x00, 0x9c, 0xff, 0x12, 0x01, 0xa5, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x00, 0x37, 0x33, 0x15, 0x03, 0x23, 0x13, 0xe6, 0xbe, 0x93, 0x74, 0x49, 0xfe, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x03, 0xfe, 0x01, 0xa8, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x13, 0x23, 0x03, 0x35, 0x01, 0x5e, 0x4a, 0x74, 0x94, 0x05, 0xd5, 0x98, 0xfe, 0xc1, 0x01, 0x3f, 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0x03, 0xe9, 0x03, 0x16, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x35, 0x13, 0x33, 0x03, 0x05, 0x23, 0x35, 0x13, 0x33, 0x03, 0x01, 0x5a, 0xbd, 0x93, 0x74, 0x4a, 0x01, 0x72, 0xbe, 0x93, 0x74, 0x49, 0x03, 0xe9, 0xad, 0x01, 0x3f, 0xfe, 0xc1, 0xad, 0xad, 0x01, 0x3f, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0x03, 0xe9, 0x03, 0x16, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x03, 0x23, 0x13, 0x25, 0x33, 0x15, 0x03, 0x23, 0x13, 0xe6, 0xbe, 0x93, 0x74, 0x49, 0x01, 0x71, 0xbe, 0x93, 0x74, 0x49, 0x05, 0xd5, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xac, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x02, 0x00, 0x9c, 0xff, 0x12, 0x03, 0x16, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x33, 0x15, 0x03, 0x23, 0x13, 0x25, 0x33, 0x15, 0x03, 0x23, 0x13, 0x02, 0x57, 0xbe, 0x93, 0x74, 0x49, 0xfe, 0x8f, 0xbe, 0x93, 0x74, 0x49, 0xfe, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xac, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x02, 0x00, 0x9c, 0x03, 0xe9, 0x03, 0x16, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x15, 0x13, 0x23, 0x03, 0x35, 0x21, 0x15, 0x13, 0x23, 0x03, 0x35, 0x01, 0x5a, 0x4a, 0x74, 0x93, 0x02, 0x2f, 0x49, 0x74, 0x93, 0x05, 0xd5, 0xad, 0xfe, 0xc1, 0x01, 0x3f, 0xad, 0xad, 0xfe, 0xc1, 0x01, 0x3f, 0xad, 0x00, 0x01, 0x00, 0x33, 0xff, 0x3b, 0x03, 0x67, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x01, 0x7e, 0x9e, 0x01, 0x4a, 0xfe, 0xb6, 0x9e, 0xfe, 0xb5, 0x01, 0x4b, 0x05, 0xd5, 0xfe, 0x5c, 0x99, 0xfb, 0xa3, 0x04, 0x5d, 0x99, 0x00, 0x01, 0x00, 0x33, 0xff, 0x3b, 0x03, 0x67, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x25, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x66, 0xfe, 0xb6, 0x9e, 0xfe, 0xb5, 0x01, 0x4b, 0xfe, 0xb5, 0x01, 0x4b, 0x9e, 0x01, 0x4a, 0xfe, 0xb6, 0x01, 0x4a, 0xdf, 0xfe, 0x5c, 0x01, 0xa4, 0x9a, 0x02, 0x1f, 0x99, 0x01, 0xa4, 0xfe, 0x5c, 0x99, 0xfd, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01, 0xd1, 0x03, 0x2b, 0x04, 0x21, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x14, 0x9c, 0x71, 0x70, 0x9a, 0x9b, 0x70, 0x71, 0x9b, 0x02, 0xfa, 0x7c, 0xab, 0xab, 0x7c, 0x7d, 0xac, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01, 0x81, 0x03, 0x73, 0x04, 0x71, 0x00, 0x02, 0x00, 0x00, 0x01, 0x11, 0x01, 0x01, 0x14, 0x02, 0x5f, 0x01, 0x81, 0x02, 0xf0, 0xfe, 0x88, 0x00, 0x00, 0x01, 0x00, 0xd4, 0x00, 0x00, 0x01, 0x95, 0x00, 0xfe, 0x00, 0x03, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0xd4, 0xc0, 0xc0, 0xfe, 0xfe, 0x00, 0x00, 0x02, 0x00, 0xd4, 0x00, 0x00, 0x03, 0xfa, 0x00, 0xfe, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x03, 0x3a, 0xc0, 0xc0, 0xfd, 0x9a, 0xc0, 0xc0, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x03, 0x00, 0xd4, 0x00, 0x00, 0x06, 0x5f, 0x00, 0xfe, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x03, 0x3a, 0xbf, 0xbf, 0x02, 0x65, 0xc0, 0xc0, 0xfb, 0x35, 0xc0, 0xc0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x01, 0x00, 0xc6, 0x02, 0x6b, 0x01, 0x84, 0x03, 0x69, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0xc6, 0xbe, 0xbe, 0x03, 0x69, 0xfe, 0x00, 0x07, 0x00, 0x65, 0xff, 0xe3, 0x09, 0x45, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x27, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x21, 0x33, 0x01, 0x23, 0x13, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x08, 0x0f, 0x4f, 0x5a, 0x5a, 0x4f, 0x4c, 0x59, 0x59, 0x4c, 0x8e, 0xa7, 0xa8, 0x8d, 0x90, 0xa8, 0xa9, 0xfa, 0x1b, 0x8f, 0xa9, 0xa9, 0x8f, 0x8f, 0xa6, 0xa7, 0x03, 0xbb, 0x90, 0xfc, 0xb7, 0x90, 0x1c, 0x4d, 0x59, 0x58, 0x4e, 0x4f, 0x59, 0x5a, 0x03, 0x53, 0x8e, 0xa8, 0xa9, 0x8d, 0x90, 0xa7, 0xa8, 0x8f, 0x4e, 0x59, 0x59, 0x4e, 0x4d, 0x59, 0x59, 0x02, 0x91, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x7f, 0xdc, 0xbb, 0xbb, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x02, 0xe0, 0xdb, 0xbb, 0xbd, 0xda, 0xdb, 0xbc, 0xba, 0xdc, 0xf9, 0xf3, 0x05, 0x8e, 0x95, 0x82, 0x84, 0x94, 0x94, 0x84, 0x81, 0x96, 0xfd, 0x9f, 0xdc, 0xbb, 0xbb, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x7f, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x00, 0x00, 0x09, 0x00, 0x65, 0xff, 0xe3, 0x0c, 0x1a, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x45, 0x00, 0x50, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x00, 0x20, 0x16, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, 0x34, 0x25, 0x33, 0x01, 0x23, 0x12, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x01, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x0a, 0xe4, 0x4e, 0x5a, 0x5a, 0x4e, 0x4d, 0x59, 0x59, 0x4d, 0x8e, 0xa8, 0xa8, 0x8e, 0x90, 0xa7, 0xa8, 0xfd, 0xba, 0x4f, 0x5a, 0x5a, 0x4f, 0x4c, 0x59, 0x59, 0x4c, 0x8e, 0xa7, 0xa8, 0x8d, 0x90, 0xa8, 0xa9, 0xf9, 0x8d, 0x01, 0x1d, 0xa9, 0xa9, 0xfe, 0xe2, 0xa6, 0x04, 0x62, 0x90, 0xfc, 0xb7, 0x90, 0x6a, 0x9b, 0x59, 0x58, 0x9d, 0x59, 0x02, 0xf9, 0x8e, 0xa8, 0xa9, 0x8d, 0x90, 0xa7, 0xa8, 0x8f, 0x4e, 0x59, 0x59, 0x4e, 0x4d, 0x59, 0x59, 0x02, 0x91, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x7f, 0xdc, 0xfe, 0x8a, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x7f, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x7f, 0xdc, 0xfe, 0x8a, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x02, 0xe0, 0xdb, 0xbb, 0xbd, 0xda, 0xdb, 0xbc, 0xba, 0xdc, 0xf9, 0xf3, 0x05, 0x8e, 0x95, 0x82, 0x84, 0x94, 0x94, 0x84, 0x81, 0xfe, 0x35, 0xdc, 0xfe, 0x8a, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x7f, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x00, 0x01, 0x00, 0x24, 0x04, 0x60, 0x01, 0x77, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x1b, 0x01, 0x33, 0x01, 0x24, 0x9c, 0xb6, 0xfe, 0xfc, 0x04, 0x60, 0x01, 0x75, 0xfe, 0x8b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x02, 0x85, 0x05, 0xd5, 0x10, 0x26, 0x07, 0x67, 0x00, 0x00, 0x10, 0x07, 0x07, 0x67, 0x01, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x03, 0x93, 0x05, 0xd5, 0x10, 0x27, 0x07, 0x67, 0x01, 0x0e, 0x00, 0x00, 0x10, 0x26, 0x07, 0x67, 0x00, 0x00, 0x10, 0x07, 0x07, 0x67, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0x04, 0x60, 0x01, 0x77, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x23, 0x01, 0x33, 0x01, 0x76, 0x4e, 0xfe, 0xfc, 0xb7, 0x04, 0x60, 0x01, 0x75, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x02, 0x85, 0x05, 0xd5, 0x10, 0x26, 0x07, 0x6a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x6a, 0x01, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x03, 0x93, 0x05, 0xd5, 0x10, 0x26, 0x07, 0x6a, 0x00, 0x00, 0x10, 0x27, 0x07, 0x6a, 0x02, 0x1c, 0x00, 0x00, 0x10, 0x07, 0x07, 0x6a, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0xfe, 0x1d, 0x02, 0x67, 0xff, 0xc3, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x27, 0x07, 0x23, 0x01, 0x02, 0x67, 0x85, 0xa9, 0xa9, 0x86, 0x01, 0x30, 0xfe, 0x1d, 0xf9, 0xf9, 0x01, 0xa6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0x00, 0x8d, 0x02, 0x35, 0x04, 0x23, 0x00, 0x06, 0x00, 0x00, 0x01, 0x15, 0x09, 0x01, 0x15, 0x01, 0x35, 0x02, 0x34, 0xfe, 0xf1, 0x01, 0x0f, 0xfe, 0x5a, 0x04, 0x23, 0xbf, 0xfe, 0xf4, 0xfe, 0xf4, 0xbf, 0x01, 0xa2, 0x52, 0x00, 0x01, 0x00, 0xad, 0x00, 0x8d, 0x02, 0x54, 0x04, 0x23, 0x00, 0x06, 0x00, 0x00, 0x13, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0xae, 0x01, 0xa6, 0xfe, 0x5a, 0x01, 0x0f, 0xfe, 0xf1, 0x04, 0x23, 0xfe, 0x5e, 0x52, 0xfe, 0x5e, 0xbf, 0x01, 0x0c, 0x01, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xaf, 0x00, 0x04, 0x05, 0x54, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x99, 0x00, 0x4b, 0x10, 0x27, 0x00, 0x11, 0xff, 0xea, 0x02, 0x4e, 0x10, 0x27, 0x00, 0x11, 0x01, 0xe1, 0x00, 0x04, 0x10, 0x27, 0x00, 0x11, 0x03, 0xd0, 0x02, 0x4e, 0x10, 0x07, 0x00, 0x11, 0x01, 0xe1, 0x04, 0xce, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x02, 0xfb, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x04, 0xff, 0x6e, 0x00, 0x00, 0x10, 0x07, 0x00, 0x04, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x84, 0x00, 0x00, 0x03, 0x52, 0x05, 0xf0, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x23, 0x11, 0x06, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x15, 0x03, 0x33, 0x15, 0x23, 0x13, 0x11, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x02, 0x11, 0xac, 0x1c, 0x1d, 0x50, 0x58, 0x55, 0xae, 0x5c, 0xa6, 0xc9, 0x41, 0x51, 0x4f, 0x2b, 0x23, 0x07, 0x05, 0x06, 0xb1, 0xb7, 0xb7, 0xb1, 0x29, 0x33, 0x2e, 0x3b, 0x21, 0x01, 0x91, 0x03, 0xad, 0x08, 0x0d, 0x23, 0x43, 0xbc, 0x39, 0x38, 0xc2, 0x9f, 0x4c, 0x89, 0x56, 0x56, 0x2f, 0x35, 0x19, 0x15, 0x3c, 0x34, 0xfe, 0xf2, 0xfe, 0x05, 0x42, 0xfe, 0x52, 0x2d, 0x35, 0x5e, 0x31, 0x59, 0x37, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x05, 0x7c, 0x03, 0xac, 0x06, 0x0b, 0x10, 0x07, 0x00, 0x42, 0x00, 0x00, 0x07, 0x5f, 0x00, 0x00, 0x00, 0x01, 0xff, 0xaf, 0xfe, 0x1b, 0x06, 0x1a, 0xff, 0x85, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x32, 0x24, 0x37, 0x15, 0x06, 0x04, 0x23, 0x22, 0x24, 0x27, 0x35, 0x16, 0x04, 0x02, 0xe4, 0xd0, 0x01, 0x97, 0xcf, 0xd4, 0xfe, 0x67, 0xc9, 0xc9, 0xfe, 0x69, 0xd4, 0xcf, 0x01, 0x95, 0xfe, 0xb5, 0x68, 0x68, 0x7e, 0x76, 0x76, 0x75, 0x77, 0x7e, 0x69, 0x67, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xaf, 0x06, 0x04, 0x06, 0x1a, 0x07, 0x6e, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x32, 0x04, 0x17, 0x15, 0x26, 0x24, 0x23, 0x22, 0x04, 0x07, 0x35, 0x36, 0x24, 0x02, 0xe4, 0xc9, 0x01, 0x99, 0xd4, 0xcf, 0xfe, 0x69, 0xd0, 0xd0, 0xfe, 0x6b, 0xcf, 0xd4, 0x01, 0x97, 0x07, 0x6e, 0x76, 0x76, 0x7e, 0x68, 0x68, 0x67, 0x69, 0x7e, 0x77, 0x75, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xb2, 0xfe, 0x1d, 0x02, 0x0f, 0x01, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x09, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x01, 0xb6, 0x58, 0xfe, 0xff, 0x01, 0x01, 0x58, 0xd5, 0xd5, 0x59, 0x01, 0xd5, 0xfe, 0x24, 0xfe, 0x24, 0x01, 0x8a, 0xfe, 0x76, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xc5, 0x06, 0xfd, 0x06, 0x83, 0x10, 0x27, 0x00, 0x0d, 0x00, 0x00, 0xfd, 0x7b, 0x10, 0x27, 0x00, 0x0d, 0x03, 0x9a, 0xfd, 0x7b, 0x10, 0x07, 0x00, 0x0d, 0x01, 0xcd, 0x00, 0x93, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc6, 0x02, 0x81, 0x02, 0xe2, 0x03, 0x5f, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0xc7, 0x02, 0x1a, 0xfd, 0xe6, 0x03, 0x5f, 0xde, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xae, 0xff, 0xe3, 0x02, 0x86, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x01, 0xf5, 0x90, 0xfc, 0xb9, 0x90, 0x05, 0xf0, 0xf9, 0xf3, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x21, 0x11, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x01, 0x44, 0xd8, 0xfe, 0x82, 0x01, 0x7e, 0xd8, 0xd8, 0x02, 0x5e, 0xfd, 0x23, 0x8f, 0x07, 0x22, 0x8f, 0xfd, 0x23, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x33, 0x11, 0x9e, 0xd8, 0xd8, 0x01, 0x7e, 0xfe, 0x82, 0xd8, 0x02, 0x5e, 0x4a, 0x02, 0xdd, 0x8f, 0xf8, 0xde, 0x8f, 0x02, 0xdd, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x06, 0x62, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x22, 0xbe, 0x00, 0x10, 0x07, 0x00, 0x22, 0x03, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x04, 0xc3, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x22, 0x00, 0x00, 0x10, 0x07, 0x00, 0x04, 0x02, 0xf6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x04, 0xc3, 0x05, 0xf0, 0x10, 0x27, 0x00, 0x04, 0xff, 0x6e, 0x00, 0x00, 0x10, 0x07, 0x00, 0x22, 0x01, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xff, 0x05, 0x03, 0x3b, 0x04, 0x5d, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x16, 0x33, 0x32, 0x37, 0x07, 0x01, 0x23, 0x13, 0x06, 0x20, 0x27, 0x5a, 0x8b, 0xd2, 0xe2, 0xa1, 0x07, 0xfe, 0xfd, 0x89, 0xee, 0x6a, 0xfe, 0xe3, 0xb4, 0x04, 0x5d, 0x10, 0x10, 0x80, 0xfb, 0x28, 0x04, 0xae, 0x0f, 0x0f, 0x00, 0x00, 0x01, 0x00, 0xd4, 0xff, 0x3b, 0x04, 0x14, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x02, 0x68, 0xc1, 0xea, 0xd3, 0xc2, 0x80, 0xab, 0x7f, 0x05, 0xd5, 0xe8, 0xbe, 0xb8, 0xdd, 0x11, 0xfc, 0xb2, 0x06, 0x1f, 0xf9, 0xe1, 0x06, 0x9a, 0x00, 0x02, 0x00, 0xc2, 0x01, 0xc2, 0x02, 0xd8, 0x04, 0x12, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x11, 0x07, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x02, 0x3a, 0x9d, 0x9d, 0x6a, 0x02, 0x71, 0x9b, 0x9c, 0x72, 0x04, 0x12, 0xfd, 0xb1, 0x01, 0xac, 0x7d, 0x7c, 0xab, 0x00, 0x00, 0x02, 0x00, 0xc2, 0x01, 0xc2, 0x02, 0xd8, 0x04, 0x12, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x27, 0x11, 0x3b, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x01, 0x60, 0x9e, 0x9e, 0x6a, 0x72, 0x9b, 0x9b, 0x70, 0x02, 0x01, 0xc2, 0x01, 0x02, 0x4f, 0xab, 0x7c, 0x7d, 0xac, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xc5, 0x03, 0x63, 0x03, 0x6b, 0x12, 0x07, 0x00, 0x0d, 0x00, 0x00, 0xfd, 0x7b, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0xff, 0x12, 0x02, 0x09, 0x04, 0x23, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0x15, 0x23, 0x35, 0x13, 0x15, 0x13, 0x23, 0x03, 0x35, 0x01, 0xbe, 0xbe, 0xbe, 0x4a, 0x74, 0x94, 0x04, 0x23, 0xfe, 0xfe, 0xfc, 0xdb, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xac, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xaf, 0xfe, 0x1b, 0x06, 0x1a, 0x07, 0x6e, 0x10, 0x26, 0x07, 0x74, 0x00, 0x00, 0x10, 0x06, 0x07, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf2, 0x03, 0x63, 0x07, 0x6f, 0x12, 0x27, 0x00, 0x0d, 0x00, 0x00, 0xfd, 0xa8, 0x10, 0x07, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0xff, 0x42, 0x02, 0xf0, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x12, 0x00, 0x82, 0x00, 0x00, 0x10, 0x27, 0x00, 0x11, 0x01, 0x66, 0x00, 0x00, 0x10, 0x07, 0x00, 0x11, 0xff, 0xdd, 0x04, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xd3, 0x06, 0xda, 0x03, 0x31, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x06, 0xd9, 0x8e, 0xcf, 0x83, 0x86, 0xd4, 0x0e, 0x08, 0x09, 0x14, 0xd2, 0x7e, 0x77, 0xc6, 0x85, 0x8e, 0xcf, 0x84, 0x9e, 0xbd, 0x0d, 0x07, 0x0b, 0x13, 0xd1, 0x7e, 0x75, 0xc2, 0x03, 0x31, 0xb2, 0x4f, 0x44, 0x3b, 0x04, 0x02, 0x02, 0x06, 0x3e, 0x4d, 0x53, 0xb2, 0x4f, 0x45, 0x3c, 0x04, 0x02, 0x03, 0x05, 0x3e, 0x4c, 0xff, 0xff, 0xff, 0xaf, 0xfe, 0x14, 0x06, 0x1a, 0xff, 0x7e, 0x10, 0x07, 0x07, 0x75, 0x00, 0x00, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x18, 0x00, 0xc8, 0x04, 0xf0, 0x05, 0x0d, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x03, 0x4c, 0x90, 0xe0, 0x66, 0xe0, 0xfe, 0xc3, 0x01, 0x3d, 0xe0, 0x65, 0xe1, 0x90, 0xe1, 0x66, 0xe1, 0x01, 0x3e, 0xfe, 0xc2, 0xe1, 0x66, 0x02, 0x29, 0xfe, 0x9f, 0x01, 0x60, 0xf9, 0x72, 0xf9, 0xa0, 0xfa, 0x72, 0xfb, 0x01, 0x62, 0xfe, 0x9e, 0xfa, 0x71, 0xfa, 0xa0, 0xf9, 0x72, 0x00, 0x03, 0x00, 0xe1, 0x01, 0x32, 0x03, 0x57, 0x04, 0xb6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x01, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0xe1, 0xb4, 0x01, 0x0e, 0xb4, 0xb4, 0xb4, 0x02, 0x90, 0xc8, 0xc8, 0xfe, 0xa2, 0xc8, 0xc8, 0x02, 0xbc, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x04, 0xa1, 0x05, 0xd5, 0x10, 0x27, 0x07, 0x67, 0x01, 0x0e, 0x00, 0x00, 0x10, 0x26, 0x07, 0x67, 0x00, 0x00, 0x10, 0x27, 0x07, 0x67, 0x03, 0x2a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x67, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x04, 0x01, 0x42, 0x01, 0x00, 0x04, 0xc7, 0x04, 0xe8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x01, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x01, 0x42, 0xb4, 0x02, 0x1c, 0xb4, 0xfd, 0xe4, 0xb4, 0xb4, 0xb4, 0x02, 0x90, 0xc8, 0xc8, 0xc8, 0xc8, 0xfe, 0x70, 0xc8, 0xc8, 0x03, 0x20, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x42, 0x00, 0xf6, 0x04, 0xc7, 0x04, 0xde, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x13, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x01, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x02, 0xaa, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xfc, 0x8e, 0xb4, 0xc6, 0xb4, 0x02, 0x86, 0xc8, 0xc8, 0xfe, 0x70, 0xc8, 0xc8, 0x03, 0x20, 0xc8, 0xc8, 0xfc, 0xf4, 0xc8, 0xc8, 0x03, 0x0c, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc5, 0x00, 0x00, 0x01, 0x83, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0xbe, 0xbe, 0x05, 0xd5, 0xfe, 0xfc, 0x27, 0xfe, 0x00, 0x00, 0x04, 0x00, 0x5a, 0xfe, 0xe5, 0x05, 0x64, 0x06, 0xef, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x5a, 0xbe, 0xbe, 0x04, 0x4c, 0xbe, 0xbe, 0xfd, 0xda, 0xbe, 0xbe, 0xbe, 0xbe, 0x03, 0x69, 0xfe, 0xfe, 0xfe, 0x04, 0x84, 0xfe, 0xf9, 0xf2, 0xfe, 0x00, 0x05, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x01, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x04, 0x12, 0xb4, 0xb4, 0xb4, 0xfc, 0x8e, 0xb4, 0xc6, 0xb4, 0x01, 0x56, 0x90, 0xfd, 0xa9, 0x02, 0x57, 0x90, 0x02, 0x58, 0xf6, 0xc8, 0xc8, 0x03, 0x20, 0xc8, 0xc8, 0xfc, 0xf4, 0xc8, 0xc8, 0x03, 0x0c, 0xc8, 0xc8, 0xfe, 0x84, 0xfd, 0x66, 0x02, 0x9a, 0xa0, 0x02, 0x9b, 0xfd, 0x65, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc5, 0x00, 0x50, 0x01, 0x83, 0x05, 0x3e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0x05, 0x3e, 0xfe, 0xfd, 0x0e, 0xfe, 0x02, 0xf6, 0xfe, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc5, 0x00, 0x11, 0x01, 0x83, 0x05, 0x77, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0x02, 0x89, 0xfe, 0x03, 0xec, 0xfe, 0xfc, 0x96, 0xfe, 0x03, 0xf0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4e, 0x02, 0x8d, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0xd4, 0xb6, 0x2d, 0x2e, 0x2e, 0x2d, 0xb6, 0x2d, 0x2e, 0x2e, 0x88, 0x91, 0x99, 0x99, 0x91, 0x92, 0x99, 0x99, 0x05, 0x97, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x02, 0x9c, 0x00, 0xd7, 0x06, 0x03, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x11, 0x33, 0x15, 0x23, 0x6e, 0x68, 0x68, 0x68, 0x68, 0x05, 0x0f, 0xfd, 0x8d, 0x03, 0x67, 0x82, 0x00, 0x02, 0x00, 0x38, 0x02, 0x9c, 0x02, 0xa9, 0x05, 0xdf, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x01, 0xad, 0xfe, 0xea, 0x01, 0x16, 0x13, 0x95, 0x79, 0x79, 0x82, 0xfe, 0x8c, 0x05, 0x66, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x02, 0x8d, 0x02, 0x8b, 0x05, 0xdf, 0x00, 0x20, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x80, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x19, 0x1a, 0x90, 0x55, 0x55, 0x58, 0x56, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5e, 0x30, 0x05, 0xdf, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x02, 0x00, 0x52, 0x02, 0x8d, 0x02, 0xa8, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x88, 0x50, 0x2e, 0x2e, 0x2e, 0x2e, 0x50, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x74, 0x3d, 0x3d, 0x09, 0x22, 0x33, 0x35, 0x3d, 0x82, 0x4c, 0x4c, 0x50, 0x4e, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0x04, 0x6d, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x00, 0x01, 0x00, 0x61, 0x02, 0x9c, 0x02, 0x8d, 0x05, 0xdf, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x61, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0x05, 0xdf, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x00, 0x03, 0x00, 0x50, 0x02, 0x8d, 0x02, 0xa2, 0x05, 0xf0, 0x00, 0x0c, 0x00, 0x2a, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x01, 0xcd, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x33, 0x2f, 0x4c, 0x4e, 0x8e, 0x8f, 0x4c, 0x4e, 0x30, 0x31, 0x28, 0x2a, 0x2a, 0x4c, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x4b, 0x4a, 0x2c, 0x2a, 0x04, 0x2a, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4a, 0x02, 0x8d, 0x02, 0x9f, 0x05, 0xf0, 0x00, 0x1f, 0x00, 0x2e, 0x00, 0x00, 0x13, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x82, 0x2d, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3c, 0x09, 0x1f, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x4f, 0x83, 0x96, 0x4e, 0x4f, 0x60, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4d, 0x30, 0x2e, 0x2e, 0x2e, 0x02, 0xae, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x02, 0x9c, 0x03, 0x52, 0x05, 0x6b, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, 0x16, 0x01, 0x3c, 0xfe, 0xc4, 0x5f, 0xfe, 0xc4, 0x01, 0x3c, 0x05, 0x6b, 0xfe, 0xc8, 0x5f, 0xfe, 0xc8, 0x01, 0x38, 0x5f, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x03, 0xd4, 0x03, 0x52, 0x04, 0x33, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x7b, 0x02, 0xd7, 0xfd, 0x29, 0x04, 0x33, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7b, 0x03, 0x61, 0x03, 0x52, 0x04, 0xa5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x7b, 0x02, 0xd7, 0xfd, 0x29, 0x02, 0xd7, 0xfd, 0x29, 0x04, 0xa5, 0x5e, 0x87, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0x05, 0x01, 0x68, 0x06, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x10, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x68, 0x4c, 0x49, 0x49, 0x4c, 0x5b, 0x55, 0x2a, 0x2a, 0x2a, 0x2a, 0x55, 0x06, 0x02, 0x81, 0xfc, 0xfe, 0xfe, 0xfe, 0x80, 0x83, 0x80, 0x7f, 0xfa, 0x7f, 0x7e, 0x84, 0x00, 0x01, 0x00, 0x5c, 0x02, 0x05, 0x01, 0x61, 0x06, 0x02, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x5d, 0x5b, 0x55, 0x2a, 0x2a, 0x2a, 0x2a, 0x55, 0x5b, 0x4b, 0x25, 0x26, 0x26, 0x25, 0x06, 0x02, 0x84, 0x7e, 0x7f, 0xfa, 0x7f, 0x80, 0x83, 0x80, 0x7f, 0x7f, 0x01, 0x02, 0x7e, 0x7e, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x7e, 0x05, 0x1e, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x7d, 0x68, 0x46, 0x47, 0x54, 0x61, 0x6a, 0x6a, 0x25, 0x65, 0x43, 0x6d, 0x70, 0x04, 0x17, 0xfe, 0x85, 0x01, 0x77, 0x59, 0x59, 0x6b, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x38, 0x38, 0x86, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, 0xff, 0xf1, 0x02, 0xa3, 0x03, 0x54, 0x12, 0x07, 0x07, 0xa0, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x00, 0x00, 0x02, 0x7f, 0x03, 0x43, 0x12, 0x07, 0x00, 0x7b, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x02, 0x6f, 0x03, 0x54, 0x12, 0x07, 0x00, 0x74, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x58, 0xff, 0xf1, 0x02, 0x86, 0x03, 0x54, 0x12, 0x07, 0x00, 0x75, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, 0x00, 0x00, 0x02, 0xa9, 0x03, 0x43, 0x12, 0x07, 0x07, 0xa2, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xf1, 0x02, 0x8b, 0x03, 0x43, 0x12, 0x07, 0x07, 0xa3, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xff, 0xf1, 0x02, 0xa8, 0x03, 0x54, 0x12, 0x07, 0x07, 0xa4, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0x00, 0x00, 0x02, 0x8d, 0x03, 0x43, 0x12, 0x07, 0x07, 0xa5, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x50, 0xff, 0xf1, 0x02, 0xa2, 0x03, 0x54, 0x12, 0x07, 0x07, 0xa6, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4a, 0xff, 0xf1, 0x02, 0x9f, 0x03, 0x54, 0x12, 0x07, 0x07, 0xa7, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x00, 0x00, 0x03, 0x52, 0x02, 0xcf, 0x12, 0x07, 0x07, 0xa8, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x01, 0x38, 0x03, 0x52, 0x01, 0x97, 0x12, 0x07, 0x07, 0xa9, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x00, 0xc5, 0x03, 0x52, 0x02, 0x09, 0x12, 0x07, 0x07, 0xaa, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0x69, 0x01, 0x68, 0x03, 0x66, 0x12, 0x07, 0x07, 0xab, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0x69, 0x01, 0x61, 0x03, 0x66, 0x12, 0x07, 0x07, 0xac, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x45, 0xff, 0xf0, 0x02, 0x5e, 0x02, 0x82, 0x12, 0x07, 0x04, 0xf9, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xf0, 0x02, 0x8d, 0x02, 0x82, 0x12, 0x07, 0x04, 0xff, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xf0, 0x02, 0x88, 0x02, 0x82, 0x12, 0x07, 0x05, 0x08, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0xd1, 0x02, 0x73, 0x12, 0x07, 0x02, 0xa5, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xf0, 0x02, 0x8d, 0x02, 0x82, 0x12, 0x07, 0x05, 0x00, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0x7e, 0x03, 0x67, 0x12, 0x07, 0x02, 0x72, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0x9d, 0x03, 0x67, 0x12, 0x07, 0x05, 0x05, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6d, 0x00, 0x00, 0x00, 0xd7, 0x03, 0x67, 0x12, 0x07, 0x02, 0xa3, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x04, 0x09, 0x02, 0x82, 0x12, 0x07, 0x05, 0x06, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0x7e, 0x02, 0x82, 0x12, 0x07, 0x07, 0xad, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0x11, 0x02, 0xa2, 0x02, 0x82, 0x12, 0x07, 0x05, 0x0c, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0x4f, 0x02, 0x93, 0x12, 0x07, 0x02, 0xa4, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x01, 0xac, 0x03, 0x25, 0x12, 0x07, 0x05, 0x0d, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x06, 0x03, 0x05, 0xd6, 0x00, 0x23, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x03, 0x7a, 0x47, 0xa0, 0x59, 0xe5, 0xfe, 0xf8, 0x01, 0x08, 0xe5, 0x5b, 0x9f, 0x46, 0x44, 0x9c, 0x58, 0xad, 0xb8, 0xb8, 0xad, 0x58, 0x9c, 0x44, 0x02, 0x7d, 0xfe, 0x0b, 0x01, 0xe1, 0xfe, 0x1f, 0x02, 0x01, 0xfd, 0x77, 0x01, 0xb8, 0x36, 0x36, 0x01, 0x37, 0x02, 0x1c, 0x01, 0x37, 0x35, 0x36, 0x9f, 0x47, 0x46, 0xea, 0xfe, 0x44, 0xea, 0x46, 0x47, 0x02, 0x0a, 0x80, 0xfe, 0xb5, 0x80, 0xfe, 0x6b, 0x80, 0x00, 0x03, 0x00, 0x67, 0xff, 0xa6, 0x04, 0x45, 0x06, 0x39, 0x00, 0x27, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x00, 0x01, 0x16, 0x17, 0x37, 0x33, 0x07, 0x16, 0x17, 0x15, 0x26, 0x27, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x3f, 0x01, 0x33, 0x07, 0x06, 0x07, 0x06, 0x11, 0x14, 0x17, 0x01, 0x26, 0x27, 0x01, 0x16, 0x17, 0x03, 0x11, 0x3a, 0x38, 0x1b, 0x8c, 0x2b, 0x24, 0x22, 0x35, 0x39, 0xfe, 0xe1, 0x10, 0x6b, 0xbe, 0x54, 0x58, 0xc2, 0x6d, 0x18, 0x18, 0x10, 0x8b, 0x16, 0x3a, 0x34, 0x22, 0x8b, 0x3a, 0x11, 0x0f, 0xa0, 0xa0, 0x90, 0xed, 0x13, 0x8d, 0xcd, 0x82, 0x4f, 0x71, 0x4a, 0x01, 0xfc, 0x38, 0x3d, 0xfe, 0xe1, 0x30, 0x3a, 0x05, 0xeb, 0x08, 0x13, 0x69, 0xa5, 0x16, 0x1c, 0xd5, 0x3c, 0x29, 0xfb, 0x97, 0x5e, 0x5f, 0xd3, 0x48, 0x48, 0x02, 0x3f, 0x57, 0x12, 0x1e, 0x87, 0xe6, 0x12, 0x15, 0xcf, 0x01, 0x67, 0x01, 0x68, 0xd0, 0xb9, 0x14, 0x4b, 0xfc, 0x1f, 0x70, 0x9d, 0xfe, 0xd8, 0xee, 0x94, 0x03, 0xcb, 0x13, 0x04, 0xfb, 0x95, 0x28, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0xff, 0xe4, 0x04, 0x3b, 0x05, 0xf0, 0x00, 0x2c, 0x00, 0x00, 0x25, 0x36, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x17, 0x16, 0x17, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x02, 0xdd, 0x57, 0x4f, 0x5f, 0x54, 0x57, 0xc3, 0x6d, 0xfe, 0xe9, 0xfe, 0xbe, 0x01, 0x42, 0x01, 0x17, 0x6e, 0xc4, 0x55, 0x54, 0xbe, 0x6b, 0xd3, 0xe0, 0x70, 0x54, 0x8a, 0x89, 0x2b, 0x8a, 0x63, 0x0e, 0x22, 0x15, 0x01, 0x18, 0x36, 0x20, 0x73, 0x7d, 0x8a, 0x07, 0x27, 0x2f, 0x5f, 0xd3, 0x48, 0x47, 0x01, 0x9e, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x47, 0x47, 0xd5, 0x5f, 0x5e, 0xfe, 0xc7, 0xfe, 0xd8, 0xfe, 0xd9, 0x9c, 0x75, 0x1e, 0x03, 0x5d, 0x9d, 0x5c, 0x59, 0x04, 0x05, 0xaa, 0x10, 0x0f, 0xb6, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0x00, 0x00, 0x04, 0x51, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x01, 0x4c, 0x03, 0x04, 0xfd, 0xb2, 0x02, 0x15, 0xfd, 0xeb, 0xe1, 0xe1, 0xb6, 0xd4, 0x01, 0x7e, 0x04, 0x57, 0xaa, 0xfe, 0x48, 0xaa, 0xfe, 0xb5, 0x45, 0xfe, 0xc7, 0x01, 0x39, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x74, 0x00, 0x00, 0x03, 0xf2, 0x05, 0xf0, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x10, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x01, 0xfc, 0x01, 0xf6, 0xfc, 0x82, 0xd4, 0xab, 0xab, 0xb3, 0xb3, 0xc1, 0xd1, 0x37, 0x88, 0x47, 0x45, 0x7a, 0x37, 0x85, 0x69, 0x01, 0x60, 0xfe, 0xa0, 0x01, 0x68, 0x01, 0xec, 0xfe, 0xbe, 0xaa, 0xaa, 0x01, 0x42, 0x8f, 0x8f, 0x8f, 0x5f, 0x01, 0x05, 0xf3, 0x1f, 0x1d, 0xb6, 0x29, 0x29, 0x9b, 0xd4, 0x48, 0x8f, 0x8f, 0x8f, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0x42, 0x06, 0x67, 0x05, 0x1e, 0x00, 0x2b, 0x00, 0x00, 0x05, 0x23, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x13, 0x33, 0x07, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x02, 0x84, 0x99, 0x01, 0x49, 0x05, 0x2e, 0x34, 0x6b, 0x7f, 0x4a, 0x4b, 0xa7, 0xa7, 0x38, 0x50, 0x4f, 0x6d, 0x6e, 0x4c, 0x31, 0x21, 0x78, 0x99, 0x4f, 0x52, 0x6c, 0x9e, 0xab, 0xa7, 0x66, 0x6a, 0x80, 0x96, 0xa6, 0xbe, 0x03, 0x78, 0x8d, 0x47, 0x4d, 0x5f, 0x61, 0xa2, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x66, 0x32, 0x31, 0x3e, 0x26, 0x3e, 0x01, 0x45, 0xd6, 0x33, 0xf6, 0xe1, 0xfd, 0x5c, 0x02, 0x9e, 0xa1, 0x9c, 0xbe, 0xa4, 0xfd, 0x87, 0x01, 0x1d, 0x00, 0x00, 0x05, 0x00, 0x69, 0x00, 0x00, 0x04, 0xfa, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x06, 0x00, 0x22, 0x00, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x27, 0x15, 0x13, 0x27, 0x23, 0x15, 0x03, 0x33, 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x05, 0x17, 0x33, 0x35, 0x03, 0x17, 0x35, 0x02, 0x10, 0x47, 0xa4, 0x33, 0x71, 0xb1, 0xf5, 0xbe, 0xcf, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xf4, 0xbe, 0xcf, 0xb1, 0xaf, 0xaf, 0xaf, 0xaf, 0x01, 0xde, 0x32, 0x72, 0x47, 0x47, 0x03, 0xaf, 0xce, 0xce, 0xfe, 0xf2, 0x93, 0x93, 0x03, 0x34, 0xfd, 0xda, 0x02, 0x26, 0xfd, 0xda, 0x7b, 0x93, 0x7b, 0xfd, 0xda, 0x02, 0x26, 0xfd, 0xda, 0x02, 0x26, 0x7b, 0x93, 0x7b, 0x7b, 0x93, 0x93, 0xfe, 0xf2, 0xce, 0xce, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xff, 0xe3, 0x08, 0xd3, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x50, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, 0x16, 0x17, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, 0x60, 0xd7, 0x78, 0x82, 0x82, 0x78, 0x01, 0xad, 0x05, 0x66, 0x6e, 0xd4, 0xd7, 0xab, 0x01, 0x82, 0xd4, 0x6e, 0x4f, 0x15, 0x49, 0x9d, 0x01, 0x41, 0xfe, 0xbf, 0x3f, 0x62, 0x9a, 0x56, 0xa8, 0x52, 0x6e, 0x77, 0x56, 0x91, 0x36, 0x90, 0x81, 0xbe, 0xae, 0x57, 0x98, 0x41, 0x43, 0x8e, 0x4d, 0x74, 0x74, 0x54, 0x7d, 0x35, 0xa7, 0x8b, 0xd2, 0xb6, 0x4d, 0xa5, 0x5b, 0x9a, 0xb5, 0x89, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xfe, 0xcc, 0xc8, 0x6a, 0x71, 0xfd, 0xa8, 0x05, 0xd5, 0x71, 0x52, 0x88, 0x01, 0x3e, 0xfe, 0xc2, 0x8f, 0xfd, 0xa0, 0x89, 0x4e, 0x23, 0x35, 0x35, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2a, 0x99, 0x89, 0x9c, 0xb6, 0x23, 0x23, 0x01, 0x9f, 0xd2, 0x02, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xff, 0xe3, 0x07, 0x62, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x45, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x01, 0x17, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x6b, 0xe4, 0x84, 0x86, 0x86, 0x84, 0x02, 0x79, 0x04, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0x01, 0x9a, 0xe7, 0xe2, 0x75, 0x71, 0x3b, 0x6e, 0x38, 0x52, 0x58, 0x57, 0x59, 0x57, 0x75, 0x7e, 0x5b, 0x9a, 0x39, 0x9a, 0x89, 0xca, 0xb9, 0x5c, 0xa2, 0x44, 0x46, 0x97, 0x51, 0x7c, 0x7b, 0x58, 0x86, 0x38, 0xb1, 0x94, 0xde, 0xc3, 0x51, 0x57, 0x28, 0x05, 0x2f, 0xfd, 0xee, 0x87, 0x01, 0x06, 0x85, 0xfa, 0xd8, 0x07, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x05, 0xd5, 0xd6, 0xd8, 0x8d, 0xba, 0x24, 0x16, 0x90, 0x7e, 0xb4, 0x33, 0x19, 0x1b, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2a, 0x99, 0x89, 0x9c, 0xb6, 0x12, 0x08, 0x00, 0x06, 0x00, 0x35, 0x00, 0x00, 0x06, 0xea, 0x05, 0xd5, 0x00, 0x1f, 0x00, 0x22, 0x00, 0x26, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x13, 0x27, 0x23, 0x35, 0x33, 0x27, 0x33, 0x17, 0x21, 0x37, 0x33, 0x17, 0x21, 0x37, 0x33, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x03, 0x23, 0x03, 0x23, 0x03, 0x23, 0x03, 0x23, 0x35, 0x05, 0x1b, 0x01, 0x01, 0x17, 0x21, 0x37, 0x01, 0x1b, 0x02, 0x07, 0x33, 0x27, 0x21, 0x17, 0x21, 0x37, 0xa4, 0x1b, 0x54, 0x34, 0x2c, 0xb8, 0x2b, 0x01, 0xde, 0x2b, 0xcc, 0x2c, 0x01, 0xdd, 0x2c, 0xb8, 0x2c, 0x33, 0x53, 0x1a, 0x6d, 0x8e, 0xca, 0xe5, 0xc4, 0xb0, 0xc6, 0xe4, 0xca, 0x8f, 0x04, 0x47, 0x94, 0x94, 0xfe, 0x9d, 0x1a, 0x01, 0x69, 0x1a, 0xfb, 0x9d, 0x94, 0x95, 0xce, 0x1a, 0x70, 0x19, 0xfd, 0x91, 0x1a, 0x01, 0x69, 0x1b, 0x04, 0x0f, 0x75, 0x8f, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0x8f, 0x75, 0x8f, 0xfc, 0x80, 0x03, 0x80, 0xfc, 0x80, 0x03, 0x80, 0x8f, 0x8f, 0xfd, 0x67, 0x02, 0x99, 0x01, 0x04, 0x75, 0x75, 0xfe, 0xfc, 0xfd, 0x67, 0x02, 0x99, 0x01, 0x04, 0x75, 0x75, 0x75, 0x75, 0x00, 0x00, 0x00, 0x02, 0x00, 0x55, 0xff, 0xe3, 0x05, 0x59, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x25, 0x32, 0x12, 0x19, 0x01, 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x29, 0x01, 0x22, 0x02, 0x19, 0x01, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x03, 0x33, 0x56, 0x01, 0xd3, 0xe5, 0xec, 0xa6, 0x8d, 0x9e, 0xfe, 0xd2, 0xa5, 0x04, 0xff, 0xfe, 0x31, 0xe6, 0xec, 0xa6, 0x8d, 0x9f, 0x01, 0x31, 0x04, 0xa6, 0x05, 0xd2, 0x03, 0xfe, 0xd6, 0xfe, 0xdc, 0xfe, 0x91, 0x01, 0x56, 0xf0, 0xd3, 0xfa, 0xb2, 0x01, 0x2a, 0x01, 0x24, 0x01, 0x6f, 0xfe, 0xaa, 0xf0, 0xd3, 0x05, 0x4e, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0xc0, 0x04, 0x76, 0x06, 0x14, 0x10, 0x26, 0x00, 0xd3, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe3, 0x04, 0x1b, 0x05, 0xf0, 0x00, 0x31, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x21, 0x07, 0x21, 0x06, 0x14, 0x15, 0x1c, 0x01, 0x17, 0x21, 0x07, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x03, 0x23, 0x37, 0x33, 0x34, 0x26, 0x35, 0x34, 0x36, 0x35, 0x23, 0x37, 0x33, 0x12, 0x00, 0x33, 0x32, 0x16, 0x04, 0x1a, 0x52, 0x98, 0x5c, 0x8d, 0xb6, 0x1c, 0x02, 0x07, 0x32, 0xfe, 0x1c, 0x02, 0x02, 0x01, 0x92, 0x33, 0xfe, 0xb0, 0x1c, 0xb6, 0x8d, 0x5c, 0x98, 0x52, 0x50, 0xa6, 0x57, 0xd5, 0xfe, 0xea, 0x24, 0xbe, 0x32, 0x7d, 0x01, 0x01, 0xaf, 0x32, 0x8c, 0x24, 0x01, 0x17, 0xd4, 0x59, 0xa6, 0x05, 0x62, 0xd5, 0x69, 0x5a, 0xc8, 0xbb, 0x7b, 0x18, 0x2e, 0x23, 0x20, 0x2e, 0x18, 0x7b, 0xbb, 0xca, 0x5a, 0x69, 0xd3, 0x48, 0x48, 0x01, 0x22, 0x01, 0x03, 0x7b, 0x17, 0x2f, 0x20, 0x23, 0x2f, 0x17, 0x7b, 0x01, 0x01, 0x01, 0x22, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x04, 0x94, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x01, 0x33, 0x01, 0x21, 0x15, 0x21, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0xac, 0xaa, 0x02, 0x36, 0xdb, 0xfd, 0xc0, 0x01, 0x7f, 0xfe, 0x83, 0x02, 0x6b, 0xe0, 0xfd, 0xa2, 0xaa, 0x88, 0x03, 0x54, 0x02, 0x81, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x7f, 0x73, 0xfd, 0x1f, 0x02, 0xcf, 0xfd, 0x31, 0x02, 0xe1, 0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x04, 0x83, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x37, 0x17, 0x05, 0x15, 0x37, 0x17, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x25, 0x35, 0x07, 0x27, 0x01, 0xef, 0xfe, 0x23, 0x04, 0x71, 0xfe, 0x23, 0xce, 0x48, 0xfe, 0xea, 0xcf, 0x48, 0xfe, 0xe9, 0xb7, 0xd0, 0x45, 0x01, 0x15, 0xd1, 0x45, 0x03, 0x8d, 0x01, 0x9e, 0xaa, 0xaa, 0xfe, 0xf1, 0xa1, 0x6f, 0xd8, 0x88, 0xa2, 0x6f, 0xd9, 0xfd, 0xb8, 0x01, 0xba, 0xa1, 0x6e, 0xd9, 0x88, 0xa2, 0x6e, 0x00, 0x00, 0x00, 0x05, 0x00, 0xbb, 0xfe, 0x39, 0x08, 0xae, 0x05, 0xf0, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x62, 0x00, 0x77, 0x00, 0x83, 0x00, 0x00, 0x01, 0x27, 0x13, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x05, 0x36, 0x37, 0x13, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x04, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x01, 0x03, 0x06, 0x07, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x06, 0x54, 0xa6, 0x91, 0x1f, 0x38, 0x2c, 0x87, 0x57, 0x43, 0x6e, 0x22, 0x3a, 0x2b, 0x2c, 0x49, 0x52, 0x4e, 0x32, 0x37, 0x2b, 0x1b, 0xde, 0x4e, 0x2c, 0x0b, 0x0e, 0x09, 0x15, 0x1c, 0x38, 0x21, 0x36, 0x15, 0x12, 0x11, 0x10, 0x1a, 0x0b, 0x16, 0x12, 0xfa, 0x5a, 0x0b, 0x0a, 0xa2, 0x2a, 0x1d, 0x1f, 0x16, 0x13, 0x0f, 0x9d, 0x18, 0x5a, 0x3c, 0x6b, 0x9e, 0xb6, 0x01, 0x0f, 0x55, 0x4c, 0x4a, 0x19, 0x17, 0x3c, 0x20, 0x57, 0x37, 0x3e, 0x44, 0x56, 0x43, 0x38, 0x29, 0x2e, 0x58, 0x1d, 0x3a, 0x0d, 0x0e, 0x10, 0x13, 0x46, 0x53, 0x69, 0x45, 0x45, 0x77, 0x5e, 0x42, 0x01, 0xb4, 0xa0, 0x16, 0x13, 0x24, 0x4b, 0x2e, 0x33, 0x30, 0x61, 0x8a, 0x34, 0x27, 0x1a, 0x15, 0x1b, 0x1c, 0x32, 0x77, 0xfd, 0x8d, 0x24, 0x2b, 0x22, 0x0c, 0x0c, 0x15, 0x14, 0x1d, 0x29, 0xfe, 0x39, 0x29, 0x02, 0xd0, 0x97, 0x69, 0x52, 0x6d, 0x3a, 0x33, 0x58, 0x92, 0x77, 0x64, 0x67, 0x37, 0x3f, 0x20, 0x17, 0x32, 0x01, 0xf8, 0x6a, 0x1a, 0x37, 0x23, 0x3d, 0x35, 0x28, 0x36, 0x24, 0x20, 0x1b, 0x36, 0x32, 0x39, 0x54, 0x2f, 0x14, 0x0c, 0x0b, 0xb7, 0x28, 0x32, 0x03, 0x4d, 0x0a, 0x14, 0x16, 0x21, 0x1d, 0x3a, 0x35, 0x53, 0x7d, 0x24, 0x40, 0x7b, 0x6d, 0x62, 0xf5, 0x81, 0x71, 0x8c, 0x82, 0x7e, 0x45, 0x73, 0x2f, 0x34, 0x18, 0x1d, 0x09, 0x0a, 0x2d, 0x13, 0x26, 0x0a, 0x0a, 0x22, 0x17, 0x54, 0x41, 0x42, 0x60, 0x5d, 0x85, 0x03, 0x92, 0xfc, 0x9b, 0x7c, 0x40, 0x1b, 0x38, 0x16, 0x19, 0x86, 0x6e, 0x52, 0x80, 0x6b, 0x63, 0x64, 0x5d, 0x61, 0x43, 0x9c, 0xfb, 0xa0, 0x22, 0x0e, 0x0e, 0x0f, 0x18, 0x0f, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x29, 0xff, 0xe3, 0x04, 0x1a, 0x05, 0xf0, 0x00, 0x29, 0x00, 0x35, 0x00, 0x00, 0x13, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x35, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x25, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0xa6, 0x7d, 0x85, 0x64, 0x6f, 0x3a, 0x4f, 0x1f, 0x2b, 0x31, 0xcc, 0x48, 0x50, 0x7b, 0x68, 0x57, 0x4c, 0x61, 0xa3, 0x71, 0x5f, 0xe3, 0x78, 0x52, 0x42, 0x6b, 0x7b, 0x62, 0x66, 0x43, 0x2d, 0x30, 0x2d, 0x01, 0xf8, 0x3d, 0x18, 0x20, 0x2d, 0x2f, 0x1e, 0x16, 0x02, 0x04, 0x60, 0xf0, 0x4e, 0x6b, 0x42, 0xb1, 0xfe, 0xac, 0x58, 0x60, 0x60, 0x53, 0xb1, 0xe3, 0xab, 0xa3, 0xbf, 0xc2, 0x86, 0x71, 0xa2, 0x4a, 0x3c, 0x93, 0x58, 0x72, 0x7e, 0x68, 0x46, 0xd9, 0x6c, 0xaf, 0x56, 0x31, 0x3f, 0x3f, 0x30, 0x57, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3d, 0x00, 0x00, 0x04, 0x2c, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x31, 0x00, 0x00, 0x13, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x17, 0x33, 0x15, 0x23, 0x16, 0x14, 0x07, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x05, 0x21, 0x15, 0x33, 0x32, 0x37, 0x36, 0x01, 0x21, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x05, 0x21, 0x15, 0x21, 0x36, 0x34, 0x88, 0x4a, 0x4a, 0x01, 0x9a, 0xe2, 0x74, 0x45, 0x1c, 0x52, 0x40, 0x01, 0x01, 0x3f, 0x50, 0x1c, 0x46, 0x74, 0xe2, 0xe4, 0xb6, 0x4b, 0x02, 0xcd, 0xfe, 0x34, 0xe4, 0x7f, 0x45, 0x15, 0xfe, 0x43, 0x01, 0xcc, 0x0f, 0x15, 0x45, 0x7f, 0xe4, 0x01, 0xec, 0xfe, 0x14, 0x01, 0xec, 0x02, 0x03, 0xec, 0x56, 0x74, 0x01, 0x1f, 0x71, 0x44, 0x6a, 0x74, 0x15, 0x2c, 0x15, 0x74, 0x6b, 0x44, 0x71, 0xfd, 0xa8, 0x03, 0x78, 0x74, 0x74, 0x7a, 0x49, 0x16, 0x01, 0x59, 0x1b, 0x15, 0x49, 0xed, 0x56, 0x15, 0x2c, 0x00, 0x00, 0x02, 0x00, 0x53, 0xff, 0x5b, 0x04, 0x39, 0x06, 0x78, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x23, 0x35, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x27, 0x11, 0x36, 0x37, 0x36, 0x37, 0x11, 0x23, 0x35, 0x21, 0x11, 0x06, 0x07, 0x06, 0x07, 0x27, 0x11, 0x06, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x02, 0xad, 0x7e, 0xc9, 0x7b, 0x97, 0x97, 0x7b, 0xc9, 0x7e, 0x5e, 0x57, 0x65, 0x54, 0x55, 0x61, 0x58, 0x60, 0x46, 0x39, 0x41, 0x33, 0x6c, 0x01, 0x05, 0x59, 0x6c, 0x5e, 0x69, 0x7e, 0x78, 0x47, 0x64, 0x64, 0x47, 0xa5, 0x8f, 0x1f, 0xa7, 0xcc, 0x01, 0x6d, 0x01, 0x6e, 0xcd, 0xa6, 0x1f, 0x8f, 0x89, 0x04, 0x1f, 0x24, 0x46, 0xd7, 0x5f, 0x30, 0x2c, 0x04, 0xfb, 0x3f, 0x02, 0x11, 0x12, 0x27, 0x01, 0x91, 0xa6, 0xfd, 0x7f, 0x53, 0x2a, 0x25, 0x05, 0xb2, 0x04, 0xa7, 0x20, 0x6c, 0x99, 0xfe, 0xd1, 0xfe, 0xd2, 0x99, 0x6c, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x85, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x35, 0x21, 0x13, 0x33, 0x13, 0x21, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x13, 0x23, 0x03, 0x21, 0x03, 0x23, 0x13, 0x23, 0x35, 0x33, 0x37, 0x33, 0x07, 0x21, 0x2f, 0x01, 0x33, 0x03, 0x2e, 0x01, 0x12, 0xa3, 0xce, 0xa3, 0x01, 0x12, 0xeb, 0x40, 0xab, 0x84, 0xa2, 0xbc, 0x9a, 0xfe, 0x39, 0x99, 0xc0, 0xa3, 0x83, 0xaa, 0x42, 0xad, 0x3c, 0x01, 0x7f, 0x3e, 0xe1, 0xbd, 0x5e, 0x03, 0x52, 0x7b, 0x02, 0x08, 0xfd, 0xf8, 0x7b, 0xcf, 0x7b, 0xfd, 0xf8, 0x02, 0x08, 0xfd, 0xf8, 0x02, 0x08, 0x7b, 0xcf, 0xcf, 0xcf, 0x7b, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xff, 0xe3, 0x05, 0x2a, 0x05, 0xf0, 0x00, 0x36, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x37, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x33, 0x15, 0x23, 0x06, 0x0f, 0x01, 0x21, 0x15, 0x21, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x24, 0x35, 0x34, 0x37, 0x23, 0x35, 0x01, 0x39, 0x04, 0x14, 0x42, 0x74, 0xfe, 0x62, 0x03, 0x37, 0x0b, 0x0b, 0x36, 0xa2, 0x94, 0x56, 0xb7, 0x68, 0x67, 0xc4, 0x5f, 0xdc, 0xfb, 0x16, 0x9d, 0xe9, 0x5c, 0xc3, 0x3c, 0x02, 0x44, 0xfc, 0xb2, 0x2d, 0xa9, 0x9c, 0x67, 0xd4, 0x6f, 0x73, 0xd8, 0x5f, 0xfd, 0xfe, 0xfa, 0x11, 0x98, 0x02, 0xa1, 0x07, 0x16, 0x4a, 0x2c, 0x7b, 0x08, 0x09, 0x2b, 0x6b, 0x76, 0x80, 0x36, 0x37, 0xc5, 0x26, 0x26, 0xe4, 0xc6, 0x55, 0x42, 0x7b, 0x5c, 0x2a, 0x0d, 0x7b, 0x3b, 0x5e, 0x7e, 0x88, 0x46, 0x45, 0xd0, 0x2f, 0x30, 0xe0, 0xd9, 0x4b, 0x3f, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x94, 0xfe, 0xd3, 0x04, 0x01, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x11, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x11, 0x35, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x01, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x16, 0x04, 0x00, 0x53, 0x97, 0x5b, 0x5b, 0x97, 0x53, 0x51, 0x53, 0x4f, 0x52, 0x5a, 0xa6, 0x69, 0xbe, 0xbf, 0x6d, 0xa0, 0x5b, 0x54, 0x4f, 0x53, 0xfe, 0xb0, 0x01, 0x52, 0x3c, 0x6a, 0x0e, 0x0c, 0x0c, 0x17, 0x61, 0x3c, 0x04, 0xa4, 0xd5, 0x69, 0x5a, 0xfb, 0xf1, 0x5a, 0x69, 0xd3, 0x48, 0x24, 0x22, 0x02, 0xfe, 0xf0, 0x01, 0x15, 0x16, 0x76, 0xd6, 0x01, 0x39, 0x11, 0x01, 0x42, 0xcb, 0x74, 0x17, 0xe8, 0xe2, 0x02, 0x22, 0x24, 0xfb, 0xa4, 0x03, 0xf9, 0x16, 0x43, 0x75, 0xaa, 0xa1, 0x66, 0xb4, 0x6c, 0x43, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x04, 0x83, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x12, 0x04, 0x71, 0xfb, 0x8f, 0x04, 0x71, 0xfe, 0x23, 0xb7, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0x78, 0xaa, 0xfb, 0xf7, 0x04, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x00, 0x04, 0x38, 0x05, 0xd5, 0x00, 0x26, 0x00, 0x00, 0x13, 0x37, 0x21, 0x07, 0x21, 0x16, 0x17, 0x21, 0x07, 0x23, 0x06, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x13, 0x23, 0x03, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x37, 0x21, 0x26, 0x27, 0x26, 0x23, 0x5f, 0x32, 0x03, 0xa6, 0x31, 0xfe, 0xc1, 0x47, 0x13, 0x01, 0x16, 0x31, 0xde, 0x05, 0x36, 0x3b, 0x70, 0x3a, 0x38, 0x34, 0x3b, 0xb8, 0xc3, 0xac, 0x44, 0x3d, 0x3f, 0x6c, 0xc6, 0xe5, 0x83, 0x43, 0x3d, 0x06, 0xfd, 0xf7, 0x32, 0x01, 0xcc, 0x10, 0x28, 0x43, 0x83, 0x05, 0x5a, 0x7b, 0x7b, 0x4e, 0x81, 0x7b, 0x7e, 0x55, 0x5d, 0x24, 0x16, 0x48, 0x44, 0x82, 0xfe, 0x68, 0x01, 0x7f, 0x97, 0x30, 0x31, 0xa6, 0x43, 0x3e, 0x72, 0x7b, 0x43, 0x34, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x05, 0x04, 0xad, 0x05, 0xda, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x10, 0x07, 0x06, 0x21, 0x23, 0x11, 0x07, 0x27, 0x25, 0x35, 0x07, 0x27, 0x25, 0x11, 0x33, 0x11, 0x37, 0x17, 0x05, 0x15, 0x37, 0x17, 0x05, 0x11, 0x20, 0x00, 0x11, 0x04, 0xad, 0xb8, 0xb7, 0xfe, 0x7b, 0x9b, 0xcf, 0x46, 0x01, 0x15, 0xd1, 0x44, 0x01, 0x15, 0xb6, 0xcf, 0x48, 0xfe, 0xe9, 0xd1, 0x48, 0xfe, 0xe7, 0x01, 0x16, 0x01, 0x02, 0x02, 0xf1, 0xfe, 0x7e, 0xb5, 0xb5, 0x02, 0x1e, 0xa1, 0x6e, 0xd8, 0x89, 0xa2, 0x6e, 0xd9, 0x01, 0xe4, 0xfe, 0xaa, 0xa2, 0x6f, 0xd9, 0x88, 0xa3, 0x6f, 0xda, 0xfd, 0xfb, 0x01, 0x18, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x76, 0x05, 0x15, 0xff, 0xd1, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x13, 0x33, 0x07, 0x21, 0x15, 0xfc, 0x77, 0xc4, 0x71, 0x77, 0x02, 0x9b, 0x05, 0x15, 0x00, 0xff, 0x9b, 0x64, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x9d, 0x05, 0x15, 0xff, 0xf7, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x03, 0x21, 0x35, 0x21, 0x27, 0x33, 0x09, 0xfc, 0xa6, 0x02, 0x9b, 0x77, 0x72, 0x05, 0x15, 0x64, 0x9b, 0x00, 0x00, 0x01, 0xfc, 0x9d, 0x04, 0x7a, 0xff, 0xd1, 0x06, 0x14, 0x00, 0x08, 0x00, 0x00, 0x03, 0x21, 0x17, 0x23, 0x27, 0x37, 0x33, 0x07, 0x21, 0x30, 0xfd, 0x65, 0x77, 0x71, 0x9e, 0x9e, 0x71, 0x77, 0x02, 0x9b, 0x05, 0x15, 0x9b, 0xcd, 0xcd, 0x9b, 0x00, 0x01, 0xfc, 0x9d, 0x04, 0x7a, 0xff, 0xd1, 0x06, 0x14, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x21, 0x27, 0x33, 0x17, 0x07, 0x23, 0x37, 0xfc, 0x9d, 0x02, 0x9b, 0x77, 0x72, 0x9d, 0x9d, 0x72, 0x77, 0x05, 0x15, 0x64, 0x9b, 0xcd, 0xcd, 0x9b, 0x00, 0x04, 0xfc, 0x77, 0x04, 0x7b, 0xff, 0xee, 0x06, 0x10, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x17, 0xfc, 0x78, 0xb6, 0xb6, 0x02, 0xbf, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x5c, 0x06, 0x10, 0xca, 0xca, 0xca, 0xca, 0xca, 0xcb, 0x00, 0x00, 0x00, 0x05, 0xfb, 0xc8, 0x04, 0x7b, 0x00, 0x9f, 0x06, 0x10, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x03, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0x18, 0xb6, 0xb6, 0xfb, 0xe0, 0xb7, 0xb7, 0x02, 0xc0, 0xb6, 0xb6, 0xfe, 0xa0, 0xb7, 0xb7, 0x01, 0x0b, 0x06, 0x10, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xcb, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x9d, 0x04, 0x7a, 0xff, 0xd1, 0x06, 0x14, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x17, 0x23, 0x27, 0x37, 0x33, 0x07, 0x21, 0x27, 0x33, 0x17, 0x07, 0x23, 0x37, 0xfd, 0x35, 0x77, 0x71, 0x9e, 0x9e, 0x71, 0x77, 0x02, 0x03, 0x77, 0x72, 0x9d, 0x9d, 0x72, 0x77, 0x05, 0x15, 0x9b, 0xcd, 0xcd, 0x9b, 0x9b, 0xcd, 0xcd, 0x9b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3c, 0xff, 0xcf, 0x07, 0x10, 0x06, 0x04, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x28, 0x00, 0x42, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x37, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x25, 0x33, 0x01, 0x23, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0xda, 0x90, 0x64, 0x4a, 0x41, 0x5c, 0x72, 0xa9, 0xa9, 0x03, 0x89, 0x62, 0x7f, 0x96, 0xb9, 0xb2, 0x98, 0x64, 0x5d, 0x3d, 0x74, 0x59, 0x53, 0x85, 0x40, 0xaf, 0xad, 0x02, 0x6c, 0xc2, 0xfc, 0xa4, 0xc3, 0x05, 0x18, 0x54, 0x64, 0x33, 0x6d, 0x7b, 0x7b, 0x6d, 0x33, 0x64, 0x54, 0x41, 0x76, 0x41, 0xb6, 0xd4, 0xd6, 0xbc, 0x3c, 0x73, 0x03, 0xf6, 0x42, 0x52, 0x43, 0x49, 0x94, 0x82, 0x0a, 0x4d, 0xfe, 0x0d, 0x3e, 0x05, 0x4f, 0x9e, 0x81, 0x96, 0x9b, 0x06, 0x57, 0x5c, 0x20, 0x37, 0xb2, 0x24, 0x1e, 0xca, 0xfa, 0xf9, 0xcb, 0x03, 0x84, 0xb2, 0x34, 0x1e, 0x9c, 0x94, 0x93, 0x9d, 0x1f, 0x34, 0xb1, 0x22, 0x1b, 0xfa, 0xd1, 0xd4, 0xf9, 0x1b, 0x00, 0x04, 0x00, 0x3c, 0xff, 0xcf, 0x07, 0x32, 0x06, 0x04, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x45, 0x00, 0x49, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x34, 0x36, 0x04, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x14, 0x06, 0x23, 0x26, 0x27, 0x35, 0x17, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x27, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x37, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x25, 0x33, 0x01, 0x23, 0x05, 0xb4, 0x7a, 0x72, 0xa6, 0x01, 0x2d, 0x6e, 0x21, 0x64, 0x74, 0xa2, 0x35, 0x5e, 0x2b, 0x8a, 0x7b, 0xb5, 0x99, 0x9e, 0x82, 0x21, 0x84, 0x7d, 0xa0, 0x37, 0x6f, 0xfb, 0xfb, 0x90, 0x64, 0x4a, 0x41, 0x5c, 0x72, 0xa9, 0xa9, 0x03, 0x89, 0x62, 0x7f, 0x96, 0xb9, 0xb2, 0x98, 0x64, 0x5d, 0x3d, 0x74, 0x59, 0x53, 0x85, 0x40, 0xaf, 0xad, 0x02, 0x6c, 0xc2, 0xfc, 0xa4, 0xc3, 0x01, 0x7d, 0x1c, 0x7c, 0xef, 0x8e, 0x01, 0x34, 0xbc, 0x12, 0x39, 0x64, 0x24, 0x2c, 0x18, 0x0a, 0x21, 0x7f, 0xf3, 0x95, 0x06, 0x35, 0xca, 0x13, 0x4c, 0x66, 0x2c, 0x31, 0x1b, 0x02, 0x84, 0x42, 0x52, 0x43, 0x49, 0x94, 0x82, 0x0a, 0x4d, 0xfe, 0x0d, 0x3e, 0x05, 0x4f, 0x9e, 0x81, 0x96, 0x9b, 0x06, 0x57, 0x5c, 0x20, 0x37, 0xb2, 0x24, 0x1e, 0xca, 0xfa, 0xf9, 0xcb, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x21, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x01, 0x11, 0x06, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x04, 0xa3, 0x50, 0xd1, 0x88, 0x92, 0x6d, 0x6d, 0x92, 0x88, 0xd1, 0x50, 0x5f, 0xd6, 0x76, 0xfe, 0xce, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x32, 0x78, 0xd6, 0xfd, 0x56, 0x1f, 0x1c, 0x8d, 0x8d, 0x1c, 0x05, 0x62, 0x76, 0x41, 0x5a, 0x34, 0xfb, 0x2d, 0x34, 0x5a, 0x42, 0x75, 0x48, 0x48, 0x01, 0x9f, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x47, 0xfb, 0x13, 0x04, 0x5b, 0x1b, 0x21, 0xac, 0xfe, 0xba, 0xfe, 0xbb, 0xac, 0x21, 0x00, 0x00, 0xff, 0xff, 0x00, 0xaf, 0xff, 0xe3, 0x07, 0x96, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x72, 0x00, 0x00, 0x10, 0x07, 0x00, 0x26, 0x02, 0xf2, 0x00, 0x00, 0x00, 0x02, 0xff, 0xda, 0x00, 0x00, 0x04, 0x96, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x11, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x27, 0x11, 0x36, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x21, 0x35, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x01, 0x52, 0x42, 0x2e, 0x59, 0x59, 0x2e, 0x42, 0xb5, 0x33, 0x30, 0x49, 0x45, 0x47, 0x46, 0x31, 0x33, 0x33, 0x31, 0x46, 0x47, 0x46, 0x4a, 0x2e, 0x33, 0x02, 0x8f, 0xfc, 0xbc, 0x91, 0x61, 0x86, 0x88, 0x5f, 0x04, 0xb3, 0x1d, 0x3a, 0x72, 0xcd, 0xcd, 0x71, 0x3b, 0x1d, 0x03, 0xd4, 0x7a, 0x6e, 0x04, 0x0b, 0x12, 0x23, 0xac, 0x2b, 0x16, 0x0f, 0x04, 0xfc, 0xa4, 0x04, 0x10, 0x15, 0x2b, 0xaa, 0x24, 0x12, 0x0b, 0x04, 0x2a, 0xaa, 0xde, 0x20, 0x72, 0x9f, 0x01, 0x0e, 0x01, 0x12, 0x9d, 0x6e, 0x00, 0x04, 0x00, 0x36, 0xff, 0xcf, 0x07, 0x1b, 0x06, 0x04, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x32, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x01, 0x23, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x24, 0x20, 0x16, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, 0x34, 0x02, 0xb9, 0x55, 0x64, 0x32, 0x6d, 0x7b, 0x7b, 0x6d, 0x32, 0x64, 0x55, 0x42, 0x75, 0x42, 0xb6, 0xd4, 0xd6, 0xbc, 0x3d, 0x73, 0x02, 0x94, 0xc2, 0xfc, 0xa4, 0xc3, 0x03, 0xfa, 0x57, 0x6a, 0x6a, 0x57, 0x56, 0x6b, 0x6b, 0xfe, 0xfc, 0x01, 0x5c, 0xc4, 0xc4, 0xfe, 0xa4, 0xc3, 0x05, 0x97, 0xb2, 0x34, 0x1e, 0x9c, 0x94, 0x93, 0x9d, 0x1f, 0x34, 0xb1, 0x22, 0x1d, 0xfc, 0xd1, 0xd4, 0xf9, 0x1b, 0x4b, 0xf9, 0xcb, 0x03, 0x04, 0x9e, 0x92, 0x91, 0x9f, 0xa0, 0x01, 0x20, 0xa0, 0x9d, 0xf8, 0xd5, 0xd4, 0xf8, 0xf8, 0xd4, 0xd5, 0x00, 0x03, 0x00, 0x36, 0xff, 0xcf, 0x07, 0x79, 0x06, 0x04, 0x00, 0x13, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x01, 0x23, 0x04, 0xd3, 0xa9, 0x49, 0x48, 0x59, 0x69, 0xa9, 0xa9, 0x05, 0x82, 0x56, 0x8e, 0x91, 0xfd, 0xe6, 0x55, 0x64, 0x32, 0x6d, 0x7b, 0x7b, 0x6d, 0x32, 0x64, 0x55, 0x42, 0x75, 0x42, 0xb6, 0xd4, 0xd6, 0xbc, 0x3d, 0x73, 0x02, 0x94, 0xc2, 0xfc, 0xa4, 0xc3, 0x01, 0x4c, 0x02, 0x10, 0xfd, 0xf5, 0x72, 0x69, 0x81, 0x75, 0x01, 0xf0, 0xfc, 0x90, 0x44, 0x09, 0x50, 0xc1, 0x04, 0xff, 0xb2, 0x34, 0x1e, 0x9c, 0x94, 0x93, 0x9d, 0x1f, 0x34, 0xb1, 0x22, 0x1d, 0xfc, 0xd1, 0xd4, 0xf9, 0x1b, 0x4b, 0xf9, 0xcb, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xe3, 0x04, 0x09, 0x05, 0xf0, 0x10, 0x06, 0x01, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0xd6, 0x04, 0xa0, 0x04, 0xe3, 0x10, 0x07, 0x03, 0xc1, 0x00, 0x00, 0xfe, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0xaf, 0x00, 0x00, 0x06, 0x6f, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x72, 0x00, 0x00, 0x10, 0x07, 0x00, 0x29, 0x02, 0xb6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0xff, 0xe3, 0x06, 0xcb, 0x05, 0xfb, 0x00, 0x6f, 0x00, 0x00, 0x01, 0x0f, 0x01, 0x11, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x11, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x21, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x19, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x03, 0x5f, 0x02, 0x61, 0x01, 0xc6, 0x24, 0x33, 0x3b, 0x44, 0x59, 0x6f, 0x37, 0x12, 0x22, 0x19, 0x21, 0x12, 0x14, 0x1a, 0x21, 0x2b, 0x2e, 0x1e, 0x24, 0x17, 0x14, 0x17, 0x24, 0x17, 0x1e, 0x27, 0x14, 0x32, 0x1a, 0x2e, 0x33, 0x1c, 0x21, 0x31, 0x1a, 0x57, 0x61, 0x40, 0x35, 0x32, 0x1a, 0x19, 0x0c, 0xfe, 0x44, 0x2d, 0x30, 0x53, 0x9c, 0xa6, 0x5e, 0x3c, 0x2e, 0x27, 0x23, 0x30, 0x0e, 0x10, 0x0a, 0x14, 0x08, 0x23, 0x3b, 0x52, 0x49, 0x3f, 0x20, 0x22, 0x7b, 0x53, 0x5a, 0x23, 0x40, 0x09, 0x01, 0x08, 0x09, 0x11, 0x21, 0x1e, 0x15, 0x1a, 0x12, 0x09, 0x07, 0x71, 0x43, 0x67, 0x71, 0x85, 0x27, 0x97, 0x05, 0xea, 0x1f, 0x31, 0xfd, 0xbc, 0xd1, 0x8c, 0x98, 0x49, 0x67, 0x14, 0x29, 0x1d, 0x2a, 0x1a, 0x21, 0x1c, 0x26, 0x21, 0x28, 0x44, 0x3b, 0x77, 0xd6, 0xfe, 0xbd, 0xa5, 0x82, 0x7d, 0x2c, 0x16, 0x37, 0x35, 0x3b, 0x21, 0x5f, 0x27, 0x5d, 0x37, 0x3a, 0x79, 0x7d, 0xa9, 0x5b, 0xb4, 0xcf, 0x9e, 0xa3, 0x5c, 0xae, 0x40, 0x34, 0x3e, 0x23, 0x2c, 0x0f, 0x12, 0x21, 0x2c, 0x0b, 0x27, 0x51, 0x46, 0xaa, 0xa7, 0x00, 0xff, 0x02, 0x6a, 0x16, 0x1a, 0x28, 0x4a, 0x47, 0x1f, 0x34, 0x10, 0x24, 0x24, 0x2c, 0x10, 0x2a, 0x1d, 0x12, 0x29, 0x2f, 0x39, 0x84, 0x79, 0x4b, 0x23, 0x25, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xfe, 0xf9, 0x04, 0xfe, 0x05, 0xd9, 0x00, 0x50, 0x00, 0x00, 0x05, 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x16, 0x17, 0x16, 0x07, 0x02, 0x07, 0x26, 0x27, 0x26, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x17, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x16, 0x17, 0x16, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x36, 0x37, 0x32, 0x17, 0x16, 0x15, 0x10, 0x07, 0x02, 0x23, 0x22, 0x02, 0xd9, 0x5f, 0x24, 0x4f, 0x21, 0x1c, 0x1f, 0x19, 0x17, 0x10, 0x0c, 0x18, 0x19, 0x2d, 0x3f, 0x75, 0x4a, 0x9f, 0x3e, 0x2a, 0x0a, 0x0c, 0x16, 0xb6, 0x47, 0x2a, 0x2f, 0x30, 0x3f, 0x69, 0x14, 0xaa, 0x48, 0x4c, 0x52, 0x49, 0x3f, 0x52, 0x2b, 0x2b, 0x66, 0x62, 0xbe, 0x71, 0x8c, 0x18, 0x1f, 0x05, 0x82, 0x43, 0x42, 0x70, 0x1e, 0x35, 0x42, 0x3f, 0x67, 0x35, 0x1c, 0x1c, 0x63, 0x91, 0xd5, 0xda, 0x8d, 0x35, 0x55, 0xfc, 0x4b, 0x55, 0xcd, 0x8c, 0x51, 0x1f, 0x1f, 0x37, 0x39, 0x7d, 0x77, 0xb2, 0x96, 0x5e, 0x6c, 0x2e, 0x47, 0x89, 0x79, 0x72, 0x5c, 0x5b, 0x34, 0xfe, 0xfa, 0x4f, 0x39, 0x25, 0x23, 0x69, 0x23, 0xde, 0x5e, 0x4d, 0x58, 0x3b, 0x80, 0xa5, 0x79, 0x76, 0x40, 0x63, 0x8d, 0x84, 0x93, 0x7d, 0x07, 0x01, 0x1a, 0x02, 0x65, 0x2e, 0x49, 0x44, 0x5c, 0x1a, 0x16, 0x37, 0x49, 0x3b, 0x3e, 0x32, 0x56, 0xe7, 0xa7, 0x89, 0x75, 0xd3, 0xb0, 0xfe, 0xa2, 0xd3, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x25, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x59, 0xb6, 0xfc, 0x00, 0xb6, 0xfe, 0xf0, 0x01, 0x6a, 0x01, 0xe0, 0x01, 0x6a, 0xfe, 0x96, 0xfe, 0x20, 0xfe, 0x96, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfd, 0x88, 0x02, 0x78, 0xfa, 0x2b, 0x02, 0xdb, 0xfd, 0x25, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x04, 0x14, 0x06, 0x14, 0x00, 0x19, 0x00, 0x00, 0x01, 0x03, 0x23, 0x13, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x03, 0x23, 0x01, 0x33, 0x03, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x04, 0x03, 0x76, 0xa7, 0x76, 0x08, 0x0a, 0x60, 0x55, 0x86, 0xc3, 0x1d, 0x6d, 0xa5, 0x01, 0x11, 0xa5, 0x6b, 0x3f, 0xc4, 0x6c, 0x85, 0x93, 0x08, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9d, 0x2f, 0x48, 0x15, 0x54, 0x5e, 0xc8, 0xa6, 0xfd, 0x93, 0x06, 0x14, 0xfd, 0x9c, 0x5e, 0x6d, 0xa0, 0x91, 0x24, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x04, 0x14, 0x06, 0x14, 0x00, 0x19, 0x00, 0x00, 0x01, 0x33, 0x07, 0x25, 0x17, 0x05, 0x03, 0x36, 0x33, 0x32, 0x16, 0x07, 0x03, 0x23, 0x13, 0x12, 0x23, 0x22, 0x06, 0x07, 0x03, 0x23, 0x13, 0x07, 0x27, 0x37, 0x01, 0x61, 0xa6, 0x28, 0x01, 0x65, 0x0d, 0xfe, 0x7b, 0x2f, 0x99, 0xd0, 0xae, 0x88, 0x29, 0x76, 0xa5, 0x75, 0x37, 0xdf, 0x86, 0xbc, 0x1d, 0x6e, 0xa7, 0xc9, 0xbc, 0x0d, 0xdd, 0x06, 0x14, 0xea, 0x7c, 0x61, 0x88, 0xfe, 0xf5, 0xc9, 0xef, 0xe8, 0xfd, 0x5c, 0x02, 0x9e, 0x01, 0x3d, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x7f, 0x42, 0x63, 0x4c, 0x00, 0x00, 0x01, 0x00, 0x35, 0xff, 0xe1, 0x03, 0x1c, 0x05, 0xf0, 0x00, 0x39, 0x00, 0x00, 0x01, 0x0f, 0x01, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x11, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x03, 0x1c, 0x1b, 0x5e, 0xae, 0x75, 0x80, 0x63, 0x36, 0x32, 0x0f, 0x17, 0x1f, 0x19, 0x1c, 0x07, 0x0a, 0x0a, 0x18, 0x12, 0x35, 0x43, 0x49, 0x38, 0x1e, 0x1c, 0x70, 0x51, 0x57, 0x28, 0x2f, 0x06, 0x12, 0x1c, 0x14, 0x15, 0x18, 0x14, 0x24, 0x50, 0x45, 0x7d, 0x86, 0xa3, 0x1e, 0x70, 0x05, 0xe3, 0x2c, 0x16, 0xfc, 0xfe, 0xfe, 0x86, 0xc2, 0x82, 0x3c, 0x37, 0x44, 0x39, 0x0f, 0x1b, 0x23, 0x07, 0x37, 0x2e, 0x1b, 0x13, 0x4d, 0x3d, 0x86, 0x84, 0xbe, 0x03, 0x11, 0x1a, 0x1d, 0x2e, 0x31, 0x3f, 0x1b, 0x16, 0x04, 0x40, 0x09, 0x27, 0x1f, 0x12, 0x16, 0x28, 0x4d, 0x7f, 0x58, 0x49, 0x28, 0x27, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5f, 0xff, 0xe3, 0x04, 0xbf, 0x05, 0xf0, 0x00, 0x21, 0x00, 0x32, 0x00, 0x00, 0x3f, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x13, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x07, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x07, 0x5f, 0x7e, 0x64, 0x6a, 0x33, 0x77, 0x81, 0x1e, 0x6d, 0x5a, 0x40, 0x38, 0x48, 0x48, 0xc0, 0x48, 0x48, 0x2f, 0xb5, 0xa8, 0xda, 0x30, 0x74, 0x78, 0x32, 0x55, 0x63, 0x62, 0x7f, 0x6f, 0x72, 0x6e, 0x73, 0x70, 0x71, 0xb4, 0x7d, 0x64, 0x81, 0xc0, 0x81, 0x6e, 0x73, 0x5a, 0xa5, 0x27, 0x50, 0x56, 0x89, 0x61, 0x4b, 0x7e, 0x70, 0x92, 0x6d, 0x64, 0xa0, 0x8c, 0x8b, 0x79, 0x6b, 0x94, 0x62, 0xbc, 0x5e, 0xf2, 0xde, 0x4f, 0x50, 0x05, 0x36, 0x38, 0x31, 0x2f, 0x3a, 0xaa, 0x3a, 0x62, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0xff, 0xe3, 0x04, 0xe3, 0x05, 0xf2, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x23, 0x35, 0x22, 0x07, 0x06, 0x07, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x13, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x17, 0x33, 0x32, 0x01, 0xac, 0xe8, 0x63, 0x51, 0x4a, 0x36, 0x5d, 0x4d, 0x3c, 0x08, 0x27, 0x16, 0x63, 0x6d, 0x6d, 0x2f, 0x5b, 0x50, 0x80, 0xeb, 0x4a, 0x3d, 0x32, 0x2f, 0x0c, 0x30, 0x42, 0x17, 0x2c, 0x22, 0x2b, 0x31, 0x0a, 0x05, 0x1f, 0x1e, 0x3a, 0x59, 0xbc, 0x66, 0x40, 0x3c, 0x0d, 0x25, 0x1c, 0x27, 0x1a, 0x0c, 0x0a, 0x06, 0x25, 0x2e, 0x33, 0x44, 0x29, 0x20, 0x20, 0x04, 0x03, 0x12, 0x14, 0x22, 0x32, 0x3b, 0x02, 0x0e, 0x38, 0x01, 0x5f, 0x6e, 0x30, 0x18, 0x19, 0x56, 0x42, 0x9a, 0x52, 0x1e, 0x0e, 0x84, 0x0e, 0xe4, 0x6e, 0x79, 0x23, 0x1f, 0x48, 0x89, 0x08, 0x42, 0x3f, 0x84, 0x18, 0xc1, 0x58, 0x21, 0x24, 0x18, 0x39, 0x42, 0x01, 0x7f, 0xa9, 0x84, 0x80, 0x4d, 0x77, 0x3e, 0x37, 0x6c, 0x1a, 0x10, 0x2e, 0x1b, 0x0b, 0x3b, 0x37, 0x25, 0x2c, 0x3b, 0x28, 0xd3, 0xa7, 0xbd, 0x75, 0x79, 0x2c, 0x44, 0x30, 0x03, 0x00, 0x02, 0xff, 0xe6, 0xff, 0xe3, 0x02, 0x8a, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x26, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x07, 0x23, 0x36, 0x37, 0x26, 0x35, 0x34, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x15, 0x06, 0x07, 0x02, 0x01, 0x12, 0x13, 0x36, 0x35, 0x34, 0x23, 0x06, 0x03, 0x06, 0x01, 0x12, 0x24, 0x4f, 0x34, 0x43, 0x78, 0x36, 0x3f, 0x44, 0x3f, 0x8d, 0x38, 0x44, 0x8c, 0x61, 0x48, 0x09, 0x1c, 0x69, 0x5e, 0x41, 0x6e, 0x71, 0x01, 0x10, 0x41, 0xfe, 0xd9, 0xa8, 0x33, 0x1b, 0x16, 0x62, 0x58, 0x18, 0x01, 0x0c, 0xc8, 0x73, 0x66, 0x35, 0x39, 0x8b, 0x6e, 0x93, 0x89, 0x4e, 0x55, 0x98, 0x98, 0x02, 0x3b, 0x75, 0x51, 0xad, 0x4e, 0x5d, 0xfe, 0x83, 0xfe, 0xf7, 0x01, 0x5c, 0x01, 0x16, 0x93, 0x26, 0x45, 0x57, 0xfd, 0xfa, 0x91, 0x00, 0x02, 0x00, 0x1c, 0xff, 0xe3, 0x05, 0x7f, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0xae, 0xa5, 0xa6, 0xa6, 0x02, 0x6d, 0xfd, 0x93, 0x35, 0x9f, 0x6f, 0xb7, 0xe6, 0xe6, 0xb7, 0x6f, 0x9f, 0x35, 0xa6, 0xa6, 0xa5, 0x91, 0x91, 0x04, 0x25, 0x97, 0xfe, 0xfa, 0x97, 0x97, 0x01, 0x06, 0x06, 0x14, 0x93, 0x93, 0x93, 0x7d, 0xfe, 0xb2, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x05, 0x04, 0xfa, 0xfc, 0x05, 0x04, 0x7d, 0xfb, 0xe3, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0x00, 0x00, 0x02, 0x00, 0xb2, 0x00, 0x00, 0x05, 0x12, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x01, 0x23, 0x09, 0x01, 0x21, 0x01, 0x11, 0x33, 0x11, 0x21, 0x01, 0x11, 0x23, 0x04, 0x9c, 0xfd, 0x62, 0xd6, 0x02, 0x9e, 0xfc, 0xed, 0x01, 0x7c, 0x02, 0x88, 0x5a, 0xfe, 0x84, 0xfd, 0x78, 0x5a, 0x64, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x71, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x2b, 0x04, 0xe1, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x06, 0xfb, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x00, 0x33, 0x35, 0x32, 0x35, 0x11, 0x33, 0x01, 0x11, 0x34, 0x36, 0x33, 0x15, 0x22, 0x15, 0x11, 0x23, 0x01, 0x11, 0x14, 0x06, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x35, 0x21, 0x15, 0x31, 0x84, 0xf5, 0x02, 0x54, 0x8d, 0xa7, 0x84, 0xf5, 0xfd, 0xac, 0x8d, 0x04, 0x66, 0x82, 0x5c, 0x5d, 0x81, 0x81, 0x5d, 0x5c, 0x82, 0x7e, 0x33, 0x2d, 0x2d, 0x33, 0x33, 0x2d, 0x2d, 0x33, 0x7e, 0x01, 0xbc, 0xaa, 0x6b, 0x04, 0xc0, 0xfb, 0x1f, 0x03, 0xcc, 0x80, 0x95, 0xaa, 0x6b, 0xfb, 0x40, 0x04, 0xe1, 0xfc, 0x34, 0x80, 0x95, 0x02, 0x6e, 0x8a, 0xbf, 0xbf, 0x8a, 0x8a, 0xbf, 0xbf, 0x8a, 0x4e, 0x67, 0x67, 0x4e, 0x4e, 0x67, 0x67, 0xfd, 0x44, 0x7b, 0x7b, 0x00, 0x00, 0x04, 0x00, 0xfe, 0x00, 0x00, 0x06, 0x35, 0x05, 0xca, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x16, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x06, 0x23, 0x22, 0x00, 0x11, 0x12, 0x00, 0x33, 0x32, 0x00, 0x11, 0x10, 0x27, 0x05, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x05, 0x70, 0xc4, 0xfe, 0x76, 0xfe, 0xf0, 0xfe, 0xed, 0xfe, 0x7d, 0x05, 0x01, 0x88, 0x01, 0x13, 0x01, 0x13, 0x25, 0xee, 0xec, 0xfe, 0xac, 0x04, 0x01, 0x50, 0xec, 0xec, 0x01, 0x54, 0xa9, 0xfe, 0x0b, 0xa0, 0x59, 0x61, 0x61, 0x59, 0xfe, 0xe1, 0x01, 0x1f, 0x9f, 0xa2, 0xa2, 0x9f, 0xa0, 0x7f, 0x04, 0xf1, 0xdb, 0xfe, 0xce, 0xfe, 0xd0, 0xfe, 0x4c, 0x01, 0xb4, 0x01, 0x30, 0x01, 0x30, 0x01, 0xb6, 0x65, 0xfe, 0x85, 0xfe, 0xf9, 0xfe, 0xfb, 0xfe, 0x87, 0x01, 0x79, 0x01, 0x05, 0x01, 0x09, 0xbb, 0x77, 0xfe, 0xaf, 0x58, 0x51, 0x50, 0x58, 0x64, 0x89, 0x83, 0x85, 0x87, 0xfe, 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xfe, 0x3b, 0x04, 0xbd, 0x03, 0xf6, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x36, 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x01, 0x12, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x10, 0x37, 0x26, 0x35, 0x34, 0x37, 0x03, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x32, 0x37, 0x36, 0x35, 0x34, 0x01, 0xfc, 0x7a, 0x1c, 0x52, 0x9a, 0xc5, 0x77, 0x76, 0x3f, 0x41, 0x8c, 0x6d, 0x9d, 0x5a, 0x45, 0x10, 0x08, 0x25, 0x66, 0x6e, 0x54, 0x3e, 0x23, 0x1c, 0x43, 0xaa, 0xfe, 0xc2, 0x7a, 0x3e, 0x50, 0x76, 0x66, 0x34, 0x39, 0xc9, 0x2a, 0xd1, 0x85, 0x74, 0x1c, 0x2b, 0x29, 0x3b, 0x19, 0x1d, 0x03, 0xc6, 0x82, 0xbe, 0x4d, 0x6b, 0x65, 0x94, 0xbd, 0x4c, 0x50, 0xab, 0xda, 0xd7, 0xa7, 0x3c, 0x2b, 0x1d, 0x28, 0x8c, 0x68, 0xc3, 0x7c, 0x48, 0x3d, 0xfe, 0x79, 0xfe, 0xde, 0x7c, 0x9d, 0x6e, 0x8e, 0x3d, 0x42, 0x86, 0x01, 0x0b, 0xfc, 0x9e, 0x7f, 0xee, 0xa4, 0xfc, 0xef, 0xc6, 0x7b, 0x75, 0x2e, 0x46, 0x01, 0x2f, 0x34, 0x5f, 0x4e, 0x00, 0x00, 0x04, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x32, 0x37, 0x11, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x21, 0x01, 0x11, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0x0e, 0xb6, 0x5a, 0x01, 0x10, 0x15, 0x15, 0x15, 0x15, 0xfd, 0x86, 0x02, 0x4f, 0xe1, 0xe8, 0xe8, 0xe2, 0xe4, 0xfe, 0x96, 0x03, 0x02, 0x36, 0x29, 0x54, 0x53, 0x28, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfd, 0x6a, 0x02, 0x02, 0x92, 0x02, 0x64, 0xdb, 0xd3, 0xd5, 0xda, 0xfd, 0x88, 0x05, 0x5a, 0xfd, 0x99, 0x16, 0x29, 0x56, 0x9f, 0x9e, 0x56, 0x29, 0x00, 0x00, 0x00, 0x04, 0x00, 0x67, 0xfe, 0xf8, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x11, 0x00, 0x19, 0x00, 0x21, 0x00, 0x29, 0x00, 0x00, 0x25, 0x13, 0x23, 0x27, 0x07, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x02, 0x25, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x03, 0x11, 0x06, 0x07, 0x06, 0x10, 0x17, 0x16, 0x01, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x03, 0xd5, 0xef, 0xdb, 0xc7, 0x2e, 0x0f, 0x0f, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xbc, 0xfd, 0x74, 0x61, 0xf5, 0x61, 0x61, 0xf5, 0x61, 0x5f, 0x20, 0x1d, 0x8b, 0x8b, 0x1d, 0x02, 0x94, 0x20, 0x1c, 0x8b, 0x8b, 0x1c, 0x1b, 0xfe, 0xdd, 0xef, 0x03, 0x01, 0x01, 0xa5, 0x01, 0x61, 0x01, 0x62, 0x01, 0xa5, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0xfc, 0xfe, 0x8e, 0x0b, 0x32, 0x32, 0x04, 0xd7, 0x32, 0x32, 0xfb, 0x6a, 0x04, 0x54, 0x1d, 0x25, 0xb6, 0xfd, 0x9c, 0xb5, 0x25, 0x04, 0x35, 0xfb, 0xaf, 0x1d, 0x24, 0xb6, 0x02, 0x63, 0xb6, 0x24, 0x00, 0x00, 0x02, 0x00, 0x3b, 0xff, 0xee, 0x05, 0x80, 0x06, 0x32, 0x00, 0x0c, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x13, 0x03, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x11, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x21, 0x36, 0x3f, 0x01, 0x15, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x02, 0xef, 0x1b, 0x37, 0x81, 0x54, 0x5e, 0x4a, 0x19, 0x53, 0x50, 0x87, 0xb9, 0x4d, 0x1c, 0x2e, 0x2b, 0x3f, 0x8f, 0xa7, 0x63, 0x32, 0x35, 0x18, 0x16, 0x20, 0x17, 0x14, 0x18, 0x10, 0x13, 0x0f, 0x17, 0x3f, 0x5c, 0x4b, 0x33, 0x1e, 0x1d, 0xcf, 0x75, 0x36, 0x09, 0x01, 0x0f, 0x1a, 0x20, 0x30, 0x1a, 0x27, 0x5d, 0xaa, 0x01, 0x05, 0x1b, 0x35, 0x36, 0xa3, 0x7c, 0x76, 0x2e, 0x4f, 0x63, 0x5d, 0x8b, 0x51, 0x4a, 0x6f, 0x17, 0x28, 0x1a, 0x1c, 0x1f, 0x10, 0x1c, 0x20, 0x33, 0x38, 0x35, 0x44, 0x1d, 0x49, 0x05, 0xa1, 0xfd, 0x49, 0x07, 0x61, 0x67, 0xc2, 0xa3, 0x53, 0x1b, 0x14, 0x0f, 0xfb, 0x16, 0x01, 0xe6, 0x09, 0xc0, 0x88, 0x89, 0x44, 0xa3, 0x35, 0x40, 0x37, 0x2a, 0x1a, 0x18, 0x16, 0x1a, 0x1f, 0x27, 0x10, 0x1a, 0x53, 0x3a, 0x79, 0x7d, 0x9e, 0x03, 0x2a, 0x82, 0x37, 0x48, 0x19, 0x30, 0x09, 0x35, 0x0f, 0x23, 0x21, 0x1f, 0x18, 0x2c, 0x49, 0x91, 0x6c, 0xbb, 0x0d, 0x1d, 0x1c, 0x40, 0x1c, 0x1f, 0x33, 0x58, 0xa7, 0xbf, 0x6e, 0x68, 0x30, 0xde, 0xcd, 0x7b, 0x1f, 0x1f, 0x28, 0x32, 0x18, 0x72, 0x3a, 0x3d, 0x1f, 0x4f, 0x00, 0x00, 0x02, 0x00, 0x4a, 0xff, 0xe3, 0x05, 0xc8, 0x05, 0xf1, 0x00, 0x49, 0x00, 0x58, 0x00, 0x00, 0x05, 0x26, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x16, 0x17, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x17, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x37, 0x17, 0x01, 0x16, 0x15, 0x11, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x04, 0x82, 0x4a, 0x14, 0x24, 0x47, 0x26, 0x53, 0x6c, 0x5c, 0x5d, 0x7e, 0x7f, 0x5c, 0x5c, 0x28, 0x2a, 0x39, 0x3a, 0x81, 0x39, 0x3a, 0x3a, 0x39, 0x52, 0x49, 0x3b, 0x39, 0x39, 0x3a, 0x4a, 0x31, 0x88, 0x5c, 0x5c, 0x5c, 0x5c, 0x88, 0x92, 0x5b, 0x1b, 0x0e, 0xbe, 0xa8, 0x65, 0x2a, 0x21, 0x71, 0x3a, 0x3c, 0x70, 0x34, 0x2c, 0x21, 0x18, 0x1d, 0x28, 0x82, 0x26, 0xfc, 0xfa, 0x12, 0x8b, 0x82, 0x45, 0x43, 0x43, 0x16, 0x1c, 0x39, 0x5c, 0x1d, 0xb7, 0x9f, 0x8c, 0x5b, 0xa6, 0x2b, 0x38, 0xc7, 0xce, 0x76, 0x75, 0x75, 0x76, 0xb0, 0x0c, 0x0c, 0x7a, 0x56, 0x57, 0x57, 0x57, 0x96, 0x02, 0x9b, 0x95, 0x58, 0x57, 0x57, 0x56, 0xca, 0x56, 0x57, 0x5c, 0x75, 0x76, 0x9c, 0x9d, 0x75, 0x75, 0x75, 0x23, 0x20, 0x62, 0x57, 0x0e, 0x31, 0xb1, 0x57, 0x7b, 0x7c, 0x5e, 0x31, 0x24, 0x68, 0x7b, 0x83, 0x80, 0x76, 0x43, 0x5b, 0x04, 0x53, 0x4b, 0x5c, 0xfe, 0x95, 0x47, 0x43, 0x68, 0x66, 0x79, 0x97, 0x20, 0x0a, 0x2f, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x94, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x16, 0x17, 0x13, 0x33, 0x03, 0x1e, 0x01, 0x17, 0x13, 0x21, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x11, 0x21, 0x32, 0x37, 0x11, 0x26, 0x23, 0x17, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x25, 0x11, 0x33, 0x11, 0x04, 0x7c, 0x45, 0x3d, 0x3e, 0x6c, 0x29, 0x46, 0x5b, 0x80, 0xb3, 0xed, 0x2f, 0x66, 0x38, 0xb8, 0xfe, 0x74, 0xab, 0x43, 0x7d, 0x6c, 0x12, 0xfe, 0x96, 0x02, 0x63, 0xe7, 0xe2, 0x69, 0x2c, 0xfd, 0xd3, 0x01, 0x24, 0x16, 0x15, 0x15, 0x16, 0x89, 0x3b, 0x26, 0x51, 0x50, 0x26, 0xfd, 0x07, 0xb6, 0x01, 0x7f, 0x97, 0x30, 0x31, 0x2f, 0xc9, 0xfe, 0xe5, 0x02, 0x4f, 0x19, 0x84, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x05, 0xd5, 0xd6, 0xd8, 0xd0, 0x62, 0x29, 0x02, 0xa5, 0xfd, 0x6a, 0x02, 0x02, 0x92, 0x02, 0x17, 0xfd, 0x99, 0x16, 0x29, 0x56, 0x01, 0x3e, 0x55, 0x29, 0x2d, 0xfa, 0xf3, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x98, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x17, 0x37, 0x33, 0x09, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x01, 0x4e, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0x01, 0x04, 0x68, 0x9c, 0xe4, 0xb6, 0x01, 0x9a, 0xe2, 0xe8, 0x46, 0x9c, 0xab, 0xd1, 0xfe, 0xec, 0x01, 0x22, 0xd1, 0xbb, 0xbe, 0xd1, 0x01, 0x28, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xfd, 0x5f, 0x36, 0xfd, 0xa8, 0x05, 0xd5, 0xe3, 0xdb, 0xac, 0x6b, 0xdb, 0xea, 0xfe, 0x86, 0xfe, 0x6b, 0x01, 0x04, 0xfe, 0xfc, 0x01, 0x95, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xff, 0x25, 0x04, 0xcc, 0x06, 0xc7, 0x00, 0x05, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x11, 0x33, 0x13, 0x26, 0x23, 0x13, 0x16, 0x17, 0x16, 0x17, 0x13, 0x23, 0x03, 0x26, 0x27, 0x26, 0x27, 0x01, 0x27, 0x37, 0x23, 0x11, 0x21, 0x32, 0x17, 0x37, 0x25, 0x37, 0x05, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x0b, 0x01, 0x36, 0x37, 0x36, 0x35, 0x34, 0x01, 0x13, 0x23, 0x01, 0x6b, 0xbc, 0xb4, 0x39, 0x53, 0xe3, 0x3b, 0x37, 0x34, 0x3b, 0xb9, 0xc4, 0xac, 0x43, 0x3e, 0x30, 0x4d, 0xfe, 0xd0, 0x64, 0x3f, 0x54, 0x01, 0x9a, 0x72, 0x55, 0x0a, 0xfe, 0xdb, 0x27, 0x01, 0x8a, 0x32, 0x19, 0x14, 0x71, 0x75, 0x70, 0x96, 0x4b, 0x2e, 0x43, 0xfe, 0x12, 0x80, 0x80, 0x05, 0x2f, 0xfd, 0xee, 0x01, 0xf8, 0x1a, 0xfd, 0x8d, 0x16, 0x48, 0x44, 0x82, 0xfe, 0x68, 0x01, 0x7f, 0x97, 0x30, 0x26, 0x09, 0xfc, 0xb0, 0x2c, 0xaf, 0x05, 0xd5, 0x1a, 0x1b, 0x82, 0x6f, 0xae, 0x8c, 0x10, 0x13, 0x6b, 0xd8, 0x8d, 0xba, 0x01, 0xe7, 0xfe, 0x5d, 0x0f, 0x2d, 0x44, 0x83, 0x62, 0xfc, 0x87, 0x01, 0x67, 0x00, 0x00, 0x00, 0x02, 0x00, 0xe9, 0x03, 0x8b, 0x05, 0x8b, 0x05, 0xd8, 0x00, 0x27, 0x00, 0x34, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x37, 0x33, 0x1b, 0x01, 0x33, 0x11, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x02, 0x9c, 0x4d, 0x4e, 0x23, 0x3b, 0x3f, 0x2a, 0x3e, 0x32, 0x65, 0x5f, 0x82, 0x7e, 0x2f, 0x67, 0x40, 0x52, 0x5a, 0x2a, 0x3e, 0x44, 0x32, 0x39, 0x32, 0x65, 0x59, 0x7c, 0x70, 0x2e, 0x5e, 0xbb, 0xa6, 0x91, 0x92, 0xa5, 0x7c, 0x7e, 0x79, 0x7f, 0x7c, 0x05, 0xb7, 0x59, 0x22, 0x13, 0x2a, 0x2f, 0x28, 0x20, 0x0b, 0x09, 0x12, 0x56, 0x41, 0x4f, 0x5b, 0x13, 0x15, 0x60, 0x2a, 0x18, 0x2c, 0x32, 0x2c, 0x2a, 0x0a, 0x09, 0x12, 0x4d, 0x3d, 0x48, 0x5c, 0x0f, 0x05, 0xfe, 0xac, 0x01, 0x54, 0xfd, 0xc8, 0x01, 0x94, 0xfe, 0xd8, 0x01, 0x28, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x07, 0x5f, 0x04, 0x60, 0x00, 0x07, 0x00, 0x13, 0x00, 0x19, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x05, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x04, 0x03, 0x55, 0xfe, 0x99, 0x88, 0xfe, 0x9a, 0x02, 0x97, 0x02, 0x31, 0xfe, 0x46, 0x01, 0xa7, 0xfe, 0x59, 0x01, 0xc4, 0xfd, 0xc5, 0x02, 0xa4, 0x77, 0x01, 0xb0, 0xfd, 0xd9, 0x04, 0x60, 0x80, 0xfc, 0x20, 0x03, 0xe0, 0x60, 0x66, 0xfe, 0xf7, 0x66, 0xfe, 0xbb, 0x66, 0x03, 0x80, 0xfc, 0xe6, 0x66, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x09, 0x03, 0x93, 0x05, 0xa6, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x01, 0x1b, 0x01, 0x33, 0x11, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x11, 0x23, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x03, 0xdc, 0x9d, 0x93, 0x99, 0x65, 0xb0, 0x31, 0xb7, 0x67, 0x65, 0xb7, 0x67, 0xb4, 0x05, 0xd5, 0xff, 0x00, 0x01, 0x00, 0xfd, 0xbe, 0x01, 0xe4, 0xfe, 0xd1, 0x01, 0x2f, 0xfe, 0x1c, 0x02, 0x42, 0x5e, 0xfe, 0x1c, 0x01, 0xe4, 0x5e, 0x00, 0x00, 0x01, 0x00, 0x0e, 0xff, 0x22, 0x04, 0xde, 0x06, 0xc4, 0x00, 0x10, 0x00, 0x00, 0x01, 0x13, 0x25, 0x37, 0x05, 0x01, 0x13, 0x01, 0x33, 0x01, 0x23, 0x0b, 0x01, 0x27, 0x09, 0x01, 0x33, 0x01, 0xa8, 0xe7, 0xfe, 0xdb, 0x27, 0x01, 0x8b, 0xfe, 0xc4, 0x96, 0x01, 0xab, 0xbd, 0xfe, 0x00, 0xcf, 0x8e, 0xe3, 0x64, 0x01, 0x0f, 0xfe, 0xc5, 0xbe, 0x03, 0x4d, 0x02, 0x86, 0x82, 0x6f, 0xae, 0xfc, 0x90, 0xfe, 0x46, 0x04, 0xe9, 0xfa, 0x2b, 0x01, 0x9e, 0xfd, 0x84, 0x2c, 0x02, 0xf5, 0x03, 0x92, 0x00, 0x02, 0x00, 0x52, 0x00, 0x00, 0x05, 0x0a, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x01, 0x23, 0x01, 0x03, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x01, 0x9a, 0x02, 0xe6, 0xd3, 0xfd, 0x1b, 0x60, 0x04, 0x8d, 0xfd, 0x1a, 0x02, 0xfb, 0xfb, 0x49, 0x02, 0xe5, 0xfd, 0x30, 0x64, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x71, 0x64, 0xfa, 0xf3, 0x64, 0x64, 0x05, 0x0d, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0xc4, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x00, 0x17, 0x16, 0x20, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x15, 0x01, 0x32, 0x1e, 0x01, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x4f, 0x99, 0x01, 0x79, 0xae, 0xa7, 0x94, 0xf5, 0x01, 0xc5, 0xfe, 0x3b, 0x01, 0xc5, 0xfd, 0xfd, 0x02, 0xd4, 0xfe, 0x56, 0x01, 0xaa, 0xfe, 0x56, 0x9a, 0xc9, 0x96, 0x7f, 0xa7, 0xe8, 0xa8, 0xbf, 0xa7, 0x63, 0xa3, 0xcc, 0x86, 0x93, 0xa6, 0x01, 0x65, 0x93, 0x01, 0x65, 0x93, 0xa8, 0xfe, 0xb0, 0xa8, 0xfe, 0xb0, 0x61, 0xd4, 0x8a, 0xfe, 0xd3, 0x66, 0x86, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, 0x00, 0x00, 0x05, 0x3b, 0x05, 0xe7, 0x10, 0x06, 0x03, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, 0xff, 0xe3, 0x05, 0x3b, 0x05, 0xca, 0x10, 0x06, 0x01, 0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, 0xfe, 0xce, 0x04, 0x20, 0x06, 0x44, 0x00, 0x55, 0x00, 0x00, 0x01, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x37, 0x33, 0x06, 0x17, 0x16, 0x33, 0x32, 0x37, 0x32, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x10, 0x03, 0x06, 0x21, 0x22, 0x27, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x01, 0x66, 0x56, 0x70, 0x6d, 0x5f, 0x1f, 0x2c, 0x49, 0x16, 0x73, 0x87, 0x17, 0x53, 0x20, 0x16, 0x89, 0x1f, 0x1f, 0x1f, 0x20, 0x75, 0x27, 0x4c, 0x0f, 0x40, 0x0f, 0x40, 0x53, 0x16, 0x36, 0x75, 0x77, 0x61, 0x02, 0x40, 0x2c, 0xe2, 0x5b, 0x21, 0x9f, 0xd9, 0xfe, 0xf4, 0x67, 0x58, 0x01, 0x04, 0x0e, 0x16, 0x20, 0x2b, 0x3e, 0x15, 0x43, 0x4f, 0x49, 0x36, 0x45, 0x10, 0x0a, 0x16, 0x1b, 0x3a, 0x89, 0x69, 0x43, 0x22, 0x23, 0x0f, 0x12, 0x1e, 0x5d, 0x9e, 0x61, 0x54, 0x02, 0xa8, 0x8a, 0x09, 0x79, 0x6a, 0x8d, 0x2e, 0x23, 0x2e, 0x0b, 0x0b, 0x23, 0x19, 0x21, 0xd3, 0x3c, 0x23, 0x21, 0x05, 0x06, 0x16, 0x18, 0x3b, 0x47, 0xa3, 0x81, 0x84, 0x42, 0x03, 0x0e, 0x98, 0x77, 0x80, 0xfe, 0xeb, 0xfe, 0xfa, 0xc8, 0x18, 0x87, 0x1c, 0x2c, 0x10, 0x18, 0x3c, 0x24, 0x3d, 0x2c, 0x23, 0x23, 0x16, 0x77, 0x55, 0x19, 0x1e, 0x74, 0x4b, 0x79, 0x79, 0x98, 0x56, 0x3f, 0x40, 0x21, 0x6a, 0x2e, 0x00, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x01, 0xd6, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x01, 0x2d, 0x1f, 0x20, 0x62, 0x4f, 0x63, 0xa4, 0x48, 0x4a, 0x02, 0xd5, 0x91, 0x2e, 0x30, 0x9c, 0x60, 0x62, 0xd4, 0xfd, 0x36, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x10, 0x06, 0x00, 0x87, 0x00, 0x00, 0x00, 0x03, 0x00, 0x52, 0x00, 0x00, 0x05, 0x49, 0x06, 0x2e, 0x00, 0x32, 0x00, 0x3f, 0x00, 0x52, 0x00, 0x00, 0x01, 0x17, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x29, 0x01, 0x37, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x11, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x05, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x11, 0x14, 0x03, 0x05, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x03, 0xff, 0x07, 0x98, 0x55, 0x56, 0x6d, 0xc6, 0xfe, 0xd4, 0xfd, 0xb4, 0x36, 0x86, 0x79, 0x33, 0x1a, 0x1c, 0xa6, 0x75, 0x45, 0x0a, 0x0b, 0x11, 0x1e, 0x27, 0x17, 0x0f, 0x22, 0x65, 0x90, 0xee, 0x89, 0x08, 0xb2, 0x83, 0x80, 0x2c, 0x41, 0x5c, 0x44, 0xfe, 0xaf, 0xb8, 0x66, 0x4a, 0x3e, 0x26, 0x5b, 0x61, 0x79, 0xfc, 0x01, 0x39, 0x7b, 0x61, 0x5d, 0x2c, 0x4f, 0x4e, 0x29, 0x4c, 0x45, 0x6a, 0x44, 0x41, 0x1c, 0x2a, 0x4f, 0x03, 0x54, 0x10, 0x61, 0x5e, 0x80, 0xae, 0x7d, 0xda, 0x75, 0x86, 0x3b, 0x8b, 0x84, 0xd3, 0x02, 0x83, 0x82, 0x49, 0x4d, 0x0b, 0x3d, 0x05, 0x2c, 0x0d, 0x33, 0x13, 0x21, 0x16, 0x23, 0x56, 0x86, 0x74, 0x9f, 0x27, 0x49, 0x40, 0x1c, 0x1f, 0x33, 0x48, 0x6c, 0x9a, 0x68, 0x4a, 0x33, 0x70, 0x52, 0x81, 0x75, 0x46, 0x2a, 0x1b, 0x18, 0xfd, 0xc2, 0x1d, 0xfd, 0x28, 0x02, 0x1a, 0x1d, 0x30, 0x58, 0xb9, 0x72, 0x56, 0x2c, 0x18, 0x18, 0x06, 0xec, 0x6e, 0xce, 0x00, 0x01, 0x00, 0x75, 0xff, 0xe8, 0x04, 0xb2, 0x05, 0xf0, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x17, 0x36, 0x25, 0x1e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x37, 0x15, 0x06, 0x07, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x37, 0x22, 0x07, 0x06, 0x15, 0x10, 0x17, 0x16, 0x25, 0x37, 0x15, 0x06, 0x07, 0x06, 0x24, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x02, 0x10, 0x40, 0x89, 0x01, 0x11, 0x0a, 0x24, 0x0a, 0x0f, 0x0e, 0x14, 0x5f, 0x7e, 0x5e, 0x35, 0x69, 0x25, 0x1b, 0x15, 0x0a, 0x03, 0x0d, 0x0d, 0x0e, 0x3f, 0x67, 0xb3, 0x17, 0x51, 0x42, 0x1f, 0x29, 0x1e, 0x11, 0x70, 0x42, 0x5f, 0x9f, 0xc8, 0x01, 0x46, 0xe8, 0xc2, 0x5b, 0xad, 0xfe, 0xb4, 0x75, 0x53, 0x2a, 0x2b, 0x55, 0xac, 0x05, 0x35, 0x23, 0x6c, 0x72, 0x1c, 0x77, 0x1f, 0x28, 0x0f, 0x16, 0x21, 0x2e, 0x44, 0x0e, 0x24, 0xbb, 0x0d, 0x22, 0x1c, 0x39, 0x42, 0x47, 0x16, 0x33, 0x32, 0x4b, 0x25, 0x8d, 0x46, 0x6e, 0x1f, 0x23, 0x16, 0x49, 0x23, 0x74, 0x33, 0xb9, 0x74, 0x52, 0x5d, 0x86, 0xda, 0xfe, 0xb9, 0xb0, 0xe1, 0x26, 0x7f, 0x39, 0x88, 0x4b, 0x28, 0x56, 0x82, 0x5c, 0x8f, 0x91, 0xb5, 0xd1, 0xbd, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x70, 0xff, 0xe7, 0x05, 0xb7, 0x05, 0x2d, 0x00, 0x1a, 0x00, 0x29, 0x00, 0x00, 0x25, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x20, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x15, 0x21, 0x22, 0x15, 0x35, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x68, 0x3c, 0x54, 0x87, 0x01, 0x29, 0x89, 0x5f, 0x46, 0x63, 0x55, 0x80, 0xa1, 0xfe, 0xa1, 0xfe, 0xbf, 0xb3, 0xb5, 0x01, 0x43, 0xac, 0xaa, 0x01, 0x43, 0xb5, 0xfb, 0xc3, 0x11, 0x11, 0x03, 0x35, 0x12, 0x3f, 0x56, 0x88, 0x8f, 0x90, 0x89, 0x56, 0x3d, 0xe4, 0x4d, 0x33, 0x54, 0x54, 0x3c, 0x60, 0x78, 0x47, 0x5a, 0xb3, 0x01, 0x41, 0xaf, 0xb0, 0x01, 0x45, 0xae, 0xae, 0xfe, 0xbb, 0xb0, 0x13, 0x49, 0x13, 0x13, 0x01, 0x70, 0x50, 0x33, 0x52, 0x51, 0x34, 0x4f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4e, 0xff, 0xe3, 0x03, 0xf0, 0x04, 0x44, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x00, 0x33, 0x20, 0x11, 0x14, 0x07, 0x06, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x03, 0x20, 0x01, 0x0e, 0x04, 0x1f, 0x35, 0x8e, 0x69, 0x33, 0x5c, 0x15, 0x7a, 0x24, 0x86, 0x5e, 0xfe, 0x8d, 0x64, 0x46, 0x0e, 0x2c, 0x01, 0x30, 0xd8, 0x01, 0x60, 0xb8, 0xbd, 0x61, 0x64, 0xcc, 0x78, 0xa8, 0x33, 0x01, 0x21, 0x01, 0x98, 0x26, 0x22, 0x5e, 0x3e, 0x6e, 0x23, 0x3f, 0x51, 0x7f, 0x59, 0x3e, 0x99, 0x6b, 0x9b, 0x44, 0x4d, 0xfd, 0x01, 0x34, 0xfe, 0xeb, 0xc7, 0x67, 0x69, 0xe0, 0x4d, 0x71, 0xab, 0xcc, 0xfe, 0xed, 0x00, 0x00, 0x00, 0x01, 0x00, 0x91, 0xff, 0xe3, 0x04, 0x13, 0x05, 0xf0, 0x00, 0x45, 0x00, 0x00, 0x01, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x15, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x03, 0xbd, 0x55, 0x1c, 0x0e, 0xa0, 0xe2, 0x81, 0x5e, 0x62, 0x3e, 0x55, 0x78, 0x62, 0xa1, 0x01, 0x61, 0x37, 0x47, 0x59, 0x6f, 0xd9, 0x7a, 0x4c, 0x2e, 0x29, 0x2d, 0x1e, 0x25, 0x15, 0x0c, 0x1a, 0x17, 0x21, 0x27, 0x5c, 0x57, 0x3a, 0x57, 0x48, 0x2a, 0x51, 0x56, 0x70, 0x9a, 0x6f, 0x6b, 0x34, 0x62, 0x57, 0x51, 0xae, 0x74, 0x6a, 0x38, 0x0b, 0x01, 0x49, 0x68, 0x41, 0x11, 0xac, 0x22, 0x25, 0x40, 0x5f, 0xa9, 0xae, 0x8a, 0x6c, 0x18, 0x15, 0x24, 0x3d, 0x50, 0x94, 0x8b, 0x63, 0x7a, 0x53, 0x32, 0x56, 0x4e, 0x2d, 0x32, 0x16, 0x0e, 0x21, 0x1c, 0x24, 0x2b, 0x1f, 0x25, 0x24, 0x2b, 0x40, 0x65, 0x97, 0x7d, 0x4e, 0x30, 0x17, 0x1a, 0x36, 0x1e, 0x1d, 0x39, 0x6e, 0x99, 0xa6, 0x61, 0x5b, 0x75, 0x3e, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xdf, 0x05, 0x76, 0x06, 0x0b, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x17, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x11, 0x21, 0x07, 0x23, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x21, 0x37, 0x21, 0x11, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x1f, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x21, 0x32, 0x17, 0x37, 0x15, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x05, 0x56, 0x20, 0x50, 0x23, 0x34, 0x23, 0x31, 0xcb, 0x39, 0x01, 0x1d, 0x37, 0xe6, 0x25, 0x26, 0x46, 0xb2, 0xf1, 0x73, 0x56, 0x2e, 0x1b, 0x18, 0x29, 0x1c, 0x0c, 0x10, 0x14, 0x11, 0x18, 0x3c, 0x54, 0x61, 0x6f, 0x38, 0x1a, 0x1e, 0xfe, 0xbb, 0x23, 0x01, 0x22, 0x57, 0x38, 0xae, 0x63, 0x40, 0x06, 0x12, 0x16, 0x20, 0x17, 0x22, 0x20, 0x1c, 0x6c, 0x96, 0x01, 0x15, 0x20, 0x3c, 0x8a, 0xa9, 0x80, 0x2c, 0x13, 0x2c, 0x1d, 0x05, 0xf2, 0x13, 0xa3, 0x4b, 0x14, 0x3d, 0x19, 0xfd, 0xdc, 0x44, 0x63, 0x98, 0x84, 0x80, 0x4b, 0xca, 0x5f, 0x34, 0x42, 0x28, 0x1f, 0x1a, 0x0b, 0x14, 0x30, 0x33, 0x1a, 0x42, 0x7b, 0x3e, 0x63, 0x65, 0x82, 0xb9, 0x44, 0x02, 0x49, 0x18, 0x6e, 0x46, 0x54, 0x3d, 0x1f, 0x49, 0x2c, 0x1a, 0x1f, 0x1f, 0x1f, 0x46, 0xb4, 0x77, 0xa7, 0x08, 0x37, 0x4b, 0x2e, 0x16, 0x09, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x03, 0xb9, 0xfc, 0xfc, 0x02, 0x4e, 0xfd, 0xeb, 0x02, 0x15, 0xb6, 0xaa, 0x01, 0xb8, 0xaa, 0x02, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x33, 0xff, 0xc7, 0x07, 0x6f, 0x06, 0x02, 0x00, 0x6b, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x11, 0x34, 0x02, 0x37, 0x06, 0x03, 0x02, 0x03, 0x07, 0x27, 0x02, 0x03, 0x26, 0x27, 0x26, 0x27, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x35, 0x11, 0x26, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x33, 0x16, 0x13, 0x12, 0x13, 0x17, 0x12, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x06, 0x28, 0x14, 0x14, 0x27, 0x18, 0x1a, 0x2f, 0x24, 0x2a, 0x23, 0x26, 0x23, 0x3f, 0x56, 0x8f, 0x33, 0x32, 0x10, 0x05, 0x07, 0x05, 0x9d, 0x6d, 0x6e, 0x32, 0x57, 0x12, 0x35, 0x5c, 0x32, 0x35, 0x38, 0x3f, 0x2e, 0x29, 0x55, 0x48, 0x5a, 0x46, 0x3d, 0x26, 0x1a, 0x16, 0x1f, 0x32, 0x1a, 0x19, 0x3a, 0x27, 0x60, 0x1e, 0x19, 0x41, 0x5e, 0x40, 0x36, 0x37, 0x12, 0x2a, 0x0e, 0x15, 0x19, 0x21, 0x56, 0x6c, 0x81, 0x5f, 0x06, 0x94, 0x65, 0x65, 0x2e, 0x0a, 0x4b, 0x71, 0x73, 0x8d, 0x88, 0xa0, 0x3c, 0x23, 0x1a, 0x10, 0x1b, 0x28, 0x20, 0x07, 0x14, 0x06, 0x0a, 0x04, 0x16, 0x18, 0x1a, 0x17, 0x26, 0x05, 0x1d, 0xfd, 0x35, 0xdc, 0x80, 0x81, 0x2f, 0x16, 0x2c, 0x2c, 0x40, 0x21, 0x3b, 0x44, 0x61, 0x39, 0x37, 0x9e, 0x54, 0x02, 0x01, 0x1e, 0x01, 0x91, 0x1f, 0xb3, 0xfe, 0xc4, 0xfe, 0xc9, 0xfe, 0x56, 0x4d, 0x0f, 0x01, 0xe6, 0x01, 0x3b, 0xa9, 0x6e, 0x77, 0x46, 0xfe, 0x0f, 0xed, 0xbb, 0xb3, 0x5e, 0x4f, 0x3f, 0x2f, 0x2c, 0x25, 0x21, 0x18, 0x3b, 0x3e, 0x6a, 0x79, 0x74, 0x9f, 0x02, 0xd6, 0x58, 0x3c, 0x3b, 0x7d, 0x03, 0x66, 0x3f, 0x45, 0x27, 0x5f, 0x6e, 0xa5, 0xfe, 0xfa, 0xfe, 0xf4, 0xfe, 0xb1, 0x0b, 0x01, 0x48, 0xf4, 0x01, 0x02, 0x97, 0x98, 0x27, 0x1d, 0x1d, 0x27, 0x10, 0x23, 0x09, 0x16, 0x0d, 0x1d, 0x04, 0x18, 0x16, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x5d, 0xff, 0xe7, 0x02, 0xf6, 0x03, 0x29, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x12, 0x03, 0x32, 0x16, 0x15, 0x14, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x12, 0x02, 0x65, 0x4e, 0x47, 0x63, 0x7f, 0x4e, 0x48, 0x62, 0x7f, 0xaf, 0x89, 0xb7, 0xc7, 0x92, 0x89, 0xb6, 0xc6, 0x01, 0xf7, 0x74, 0x7d, 0xfe, 0xfe, 0xcf, 0x74, 0x7b, 0x01, 0x04, 0x01, 0xfd, 0xd8, 0xa3, 0xc6, 0xfe, 0xff, 0xd8, 0xa3, 0xc6, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x21, 0x05, 0xf0, 0x00, 0x34, 0x00, 0x00, 0x09, 0x01, 0x16, 0x15, 0x14, 0x07, 0x34, 0x27, 0x01, 0x07, 0x06, 0x1f, 0x01, 0x16, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x14, 0x17, 0x01, 0x13, 0x27, 0x26, 0x35, 0x34, 0x37, 0x14, 0x1f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x34, 0x2f, 0x01, 0x03, 0x64, 0x01, 0x63, 0x59, 0x81, 0x2d, 0xfd, 0x48, 0x8c, 0x37, 0x3b, 0x9b, 0x5a, 0x37, 0x4e, 0x3e, 0xdc, 0xb0, 0x2a, 0x58, 0x30, 0x7e, 0x8b, 0xd9, 0x59, 0x81, 0x2d, 0x02, 0x2e, 0xfd, 0x68, 0x59, 0x81, 0x2d, 0xa4, 0x59, 0x81, 0x2d, 0x11, 0x02, 0xd0, 0xfe, 0x75, 0x63, 0x31, 0x82, 0x4c, 0x53, 0x32, 0x03, 0x05, 0x9c, 0x3f, 0x42, 0xac, 0x64, 0xd6, 0x2c, 0x3e, 0x38, 0x3f, 0x5d, 0x1d, 0x2f, 0x63, 0x36, 0xbc, 0x8d, 0x9b, 0xf1, 0x63, 0x31, 0x82, 0x4c, 0x53, 0x32, 0xfd, 0x96, 0x01, 0x19, 0x74, 0x63, 0x31, 0x82, 0x4c, 0x53, 0x32, 0xb6, 0x63, 0x31, 0x82, 0x4c, 0x53, 0x32, 0x12, 0x00, 0x00, 0x01, 0xff, 0xfb, 0xff, 0xe3, 0x04, 0xb4, 0x05, 0xf1, 0x00, 0x30, 0x00, 0x00, 0x01, 0x11, 0x33, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x0e, 0x01, 0x23, 0x21, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x3e, 0x01, 0x33, 0x21, 0x11, 0x34, 0x27, 0x2e, 0x01, 0x23, 0x21, 0x22, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x02, 0x33, 0x21, 0x32, 0x16, 0x04, 0x45, 0x47, 0x27, 0x1b, 0x79, 0x0f, 0x12, 0x1f, 0xfc, 0x5b, 0x13, 0x16, 0x15, 0x1e, 0x78, 0x0f, 0x12, 0x21, 0x03, 0x2a, 0x12, 0x12, 0x22, 0x39, 0xfd, 0xbf, 0x35, 0x30, 0x41, 0x1a, 0x14, 0x04, 0x0e, 0x12, 0x17, 0x0b, 0x0a, 0x26, 0x1c, 0x19, 0x02, 0x8e, 0x50, 0x52, 0x04, 0xb6, 0xfc, 0x23, 0x04, 0x24, 0x14, 0x1b, 0x87, 0x12, 0x06, 0x02, 0x14, 0x12, 0x10, 0x22, 0x86, 0x10, 0x06, 0x03, 0x78, 0x32, 0x0d, 0x10, 0x06, 0x04, 0x18, 0x31, 0x5b, 0x47, 0x28, 0x20, 0x14, 0x20, 0x1e, 0x1f, 0x04, 0x57, 0x00, 0x00, 0x01, 0x00, 0x18, 0xff, 0xb8, 0x02, 0xee, 0x05, 0xf0, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x21, 0x32, 0x17, 0x16, 0x14, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x12, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x0e, 0x01, 0x23, 0x21, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x3e, 0x01, 0x33, 0x21, 0x11, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x01, 0x32, 0x01, 0x2e, 0x62, 0x1b, 0x11, 0x0b, 0x2b, 0x22, 0x02, 0x02, 0x37, 0x09, 0x16, 0x28, 0x14, 0x10, 0x06, 0x0c, 0x5a, 0x10, 0x28, 0xfe, 0x95, 0x3f, 0x1f, 0x78, 0x0f, 0x12, 0x20, 0x01, 0x5e, 0xfe, 0xdb, 0x62, 0x40, 0x12, 0x29, 0x0a, 0x15, 0x2a, 0x0e, 0x05, 0x8f, 0x37, 0x23, 0x2a, 0x28, 0x2f, 0x0a, 0x1a, 0x82, 0xfd, 0x24, 0xfe, 0xfb, 0x22, 0x53, 0x1e, 0x1f, 0x61, 0x65, 0x0e, 0x28, 0x10, 0x21, 0x87, 0x10, 0x06, 0x03, 0xcd, 0x71, 0x7e, 0x42, 0x19, 0x1e, 0x3b, 0x06, 0x02, 0x00, 0x00, 0x01, 0x00, 0x4d, 0xff, 0xb8, 0x04, 0x41, 0x05, 0xf0, 0x00, 0x26, 0x00, 0x00, 0x01, 0x21, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x02, 0x33, 0x21, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x17, 0x12, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x35, 0x03, 0xa3, 0xfd, 0x4c, 0x62, 0x40, 0x04, 0x0e, 0x12, 0x17, 0x0b, 0x0b, 0x25, 0x1c, 0x19, 0x02, 0xbd, 0x2f, 0x40, 0x18, 0x05, 0x0b, 0x2b, 0x21, 0x02, 0x01, 0x04, 0x33, 0x09, 0x15, 0x29, 0x15, 0x10, 0x0b, 0x0a, 0x04, 0xa6, 0x71, 0x7e, 0x28, 0x1f, 0x14, 0x1f, 0x1e, 0x20, 0x04, 0x1f, 0x30, 0x1a, 0x0b, 0x10, 0x28, 0x2f, 0x0a, 0x1a, 0x82, 0x26, 0xfd, 0x4a, 0x93, 0x73, 0x21, 0x53, 0x27, 0x44, 0x51, 0x49, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0xa9, 0x65, 0x49, 0x47, 0x64, 0x64, 0x47, 0x49, 0x65, 0x01, 0x5d, 0x88, 0xfd, 0xb1, 0x88, 0x88, 0x01, 0xc7, 0x05, 0x54, 0x51, 0x6f, 0x6f, 0x51, 0x4f, 0x6f, 0x6e, 0xfb, 0x75, 0x79, 0x79, 0x03, 0x35, 0x79, 0x00, 0x02, 0x00, 0x51, 0xff, 0xd5, 0x06, 0x97, 0x05, 0x3b, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x00, 0x12, 0x10, 0x00, 0x33, 0x32, 0x00, 0x10, 0x00, 0x23, 0x22, 0x05, 0x01, 0x15, 0x07, 0x1e, 0x01, 0x15, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x04, 0xe5, 0x01, 0x27, 0xfe, 0xfe, 0x01, 0x28, 0xfe, 0xd8, 0xfe, 0xfe, 0x03, 0x85, 0x01, 0x06, 0xd7, 0x01, 0x02, 0xfe, 0x85, 0xfe, 0xc2, 0xfe, 0xc2, 0xfe, 0x85, 0x01, 0x7b, 0x01, 0x3e, 0xea, 0x01, 0x4e, 0x03, 0x65, 0xfe, 0x48, 0xfe, 0xfd, 0x01, 0x03, 0x01, 0xb8, 0x01, 0x01, 0xc2, 0x01, 0x0a, 0xf4, 0xdd, 0x21, 0x23, 0x10, 0xfe, 0xc5, 0xfe, 0x87, 0x01, 0x79, 0x01, 0x3b, 0x01, 0x3a, 0x01, 0x78, 0xd1, 0x00, 0x00, 0x00, 0x04, 0x00, 0x87, 0x00, 0x00, 0x08, 0x5e, 0x04, 0x60, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x01, 0x03, 0x21, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x09, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x88, 0x02, 0x43, 0xfe, 0x45, 0x01, 0x8f, 0xfe, 0x71, 0x88, 0x03, 0x29, 0xa3, 0x01, 0x46, 0xe6, 0x87, 0x01, 0x52, 0x7c, 0x51, 0xfe, 0x70, 0x51, 0x7e, 0x03, 0x74, 0x81, 0xdc, 0xde, 0x81, 0xfe, 0xe3, 0x01, 0x30, 0x82, 0xf9, 0xfb, 0x82, 0x01, 0x3d, 0x04, 0x60, 0x80, 0xfe, 0xb6, 0x7f, 0xfd, 0xe9, 0x03, 0x08, 0xfe, 0x43, 0x02, 0x35, 0xfc, 0x80, 0xe6, 0xe6, 0x03, 0x80, 0xfe, 0xb3, 0x01, 0x4d, 0xfe, 0x52, 0xfe, 0x2e, 0x01, 0x7d, 0xfe, 0x83, 0x01, 0xde, 0x00, 0x03, 0x00, 0x20, 0xff, 0xf0, 0x04, 0xee, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x25, 0x35, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x11, 0x23, 0x11, 0x14, 0x16, 0x17, 0x16, 0x32, 0x03, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x22, 0x06, 0x15, 0x23, 0x34, 0x36, 0x33, 0x21, 0x15, 0x23, 0x11, 0x14, 0x01, 0x33, 0x11, 0x23, 0x04, 0x94, 0x7c, 0x27, 0x17, 0x08, 0x0d, 0x79, 0x15, 0x12, 0x33, 0xcb, 0x50, 0x07, 0x61, 0x24, 0x41, 0x69, 0x76, 0xe4, 0x26, 0x13, 0x96, 0xfe, 0xd3, 0x37, 0x51, 0x2d, 0x5a, 0x67, 0x95, 0x03, 0xa7, 0xa4, 0xfd, 0x6a, 0x79, 0x79, 0x5a, 0x34, 0x40, 0x27, 0x21, 0x38, 0xa2, 0x02, 0x0c, 0xfd, 0xd6, 0xa6, 0x7a, 0x19, 0x45, 0x01, 0x42, 0xaf, 0x0a, 0xf1, 0x10, 0xca, 0x62, 0xfd, 0x01, 0xe3, 0xfc, 0x04, 0x03, 0xfc, 0x4c, 0x73, 0xa8, 0x7b, 0x64, 0xfe, 0x12, 0x59, 0xfe, 0xaf, 0x03, 0x98, 0x00, 0x02, 0x00, 0x00, 0xfe, 0x73, 0x04, 0xd1, 0x04, 0x7b, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x16, 0x13, 0x12, 0x11, 0x33, 0x10, 0x03, 0x02, 0x03, 0x10, 0x03, 0x02, 0x23, 0x22, 0x07, 0x23, 0x34, 0x37, 0x36, 0x33, 0x20, 0x13, 0x12, 0x13, 0x33, 0x02, 0x03, 0x02, 0x11, 0x01, 0xa8, 0x9c, 0x4d, 0x3e, 0x75, 0x3e, 0x61, 0x2f, 0x3f, 0x7e, 0xb1, 0x98, 0x16, 0x5a, 0x40, 0x49, 0xdc, 0x01, 0x89, 0x7b, 0x63, 0x90, 0x75, 0xb7, 0x3c, 0x3f, 0x04, 0x1d, 0xc1, 0xfe, 0x5c, 0xfe, 0xa7, 0xfe, 0x78, 0x01, 0x9f, 0x01, 0x42, 0x01, 0xfd, 0xfa, 0xbe, 0x02, 0x1b, 0x01, 0x2a, 0x02, 0x57, 0x9f, 0x62, 0x4f, 0x5a, 0xfd, 0x3d, 0x01, 0x9a, 0x01, 0x0e, 0xfe, 0x8f, 0xfe, 0xc9, 0xfe, 0xbe, 0xfd, 0xfd, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xac, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x25, 0x15, 0x21, 0x11, 0x21, 0x11, 0x01, 0x0e, 0xb6, 0x02, 0xe7, 0xfd, 0x73, 0xfe, 0x96, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfa, 0x8f, 0x05, 0xd5, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x68, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x58, 0xb5, 0xfc, 0x02, 0xb6, 0x03, 0xa2, 0xfe, 0x97, 0xfe, 0x21, 0xfe, 0x96, 0x04, 0xb2, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0x8f, 0x05, 0x71, 0xfa, 0x8f, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x16, 0xfe, 0x77, 0x05, 0xb2, 0x05, 0xc1, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x09, 0x02, 0x23, 0x09, 0x02, 0x15, 0x21, 0x09, 0x01, 0x21, 0x15, 0x21, 0x35, 0x09, 0x01, 0x35, 0x01, 0x7c, 0x02, 0xc1, 0xfd, 0x53, 0xea, 0x02, 0xad, 0xfd, 0x3f, 0x05, 0x08, 0xfc, 0x7d, 0x02, 0xad, 0xfd, 0x3f, 0x03, 0xae, 0xfa, 0x65, 0x02, 0xba, 0xfd, 0x62, 0xfe, 0xda, 0x03, 0x59, 0x03, 0x2a, 0xfc, 0xd6, 0xfc, 0xa7, 0x06, 0xe7, 0x64, 0xfc, 0xd6, 0xfc, 0xa7, 0x63, 0x63, 0x03, 0x53, 0x03, 0x15, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x92, 0xff, 0xe3, 0x05, 0x29, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x06, 0x01, 0x47, 0x01, 0x29, 0xfe, 0x23, 0x69, 0xfe, 0x90, 0x01, 0x3b, 0x01, 0x63, 0xfe, 0x9d, 0xfe, 0xc5, 0x84, 0xec, 0x64, 0x65, 0xe2, 0x7d, 0xf7, 0xf8, 0xf8, 0xf7, 0x60, 0x97, 0x04, 0xfe, 0xfe, 0x6f, 0xa6, 0x02, 0x81, 0x53, 0x55, 0xfe, 0x67, 0xfe, 0x93, 0xfe, 0x92, 0xfe, 0x67, 0x48, 0x46, 0xd7, 0x5f, 0x60, 0x01, 0x32, 0x01, 0x2f, 0x01, 0x2e, 0x01, 0x32, 0x25, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x03, 0x4c, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0x4b, 0xb5, 0xfd, 0x71, 0x03, 0x44, 0x05, 0x2b, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x03, 0x4b, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x03, 0x4a, 0xfc, 0xbc, 0x02, 0x8f, 0x05, 0xd5, 0xfa, 0x2b, 0xaa, 0x05, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x21, 0x23, 0x09, 0x01, 0x23, 0x01, 0x11, 0x33, 0x11, 0x04, 0x6a, 0xc4, 0xfe, 0x8c, 0xfe, 0x8e, 0xc4, 0x01, 0xdc, 0xb6, 0x02, 0x66, 0xfd, 0x9a, 0x03, 0x0e, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x04, 0x00, 0x4e, 0x00, 0x00, 0x05, 0xa9, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x02, 0x00, 0x29, 0x01, 0x01, 0x05, 0x03, 0x33, 0x32, 0x37, 0x13, 0x26, 0x23, 0x21, 0x03, 0x33, 0x13, 0x05, 0x03, 0x36, 0x37, 0x36, 0x13, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x23, 0x01, 0x86, 0x98, 0x68, 0x15, 0x43, 0xfe, 0x52, 0xfe, 0x7b, 0xfe, 0x30, 0x01, 0x05, 0x01, 0x59, 0xe2, 0x59, 0xdd, 0x9b, 0xcc, 0x85, 0xdd, 0xfe, 0x97, 0xe2, 0xb6, 0xe2, 0x02, 0x6a, 0xb8, 0x18, 0x17, 0xbb, 0x3a, 0x12, 0x5c, 0x10, 0x05, 0xd5, 0xb5, 0x7c, 0xdf, 0x63, 0x76, 0xfe, 0x7e, 0xfe, 0x96, 0x05, 0xd5, 0x64, 0xfa, 0xf3, 0x41, 0x04, 0x8b, 0x41, 0xfa, 0xf3, 0x05, 0x0d, 0x78, 0xfb, 0xe3, 0x10, 0x13, 0x9d, 0x01, 0x50, 0x66, 0x55, 0xc2, 0x6d, 0x13, 0x00, 0x04, 0x00, 0x51, 0xff, 0xe3, 0x05, 0x1c, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x32, 0x00, 0x00, 0x13, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x13, 0x06, 0x07, 0x06, 0x01, 0x21, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x37, 0x36, 0x00, 0x33, 0x32, 0x17, 0x16, 0x17, 0x13, 0x21, 0x07, 0x03, 0x33, 0x13, 0x01, 0x03, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0xd0, 0x1c, 0x26, 0x1d, 0x30, 0x9e, 0x3c, 0x32, 0x6b, 0x03, 0x1f, 0xfe, 0xd3, 0x1e, 0x46, 0x58, 0x58, 0x70, 0xb7, 0x8e, 0x1f, 0x1f, 0x01, 0x1e, 0xb7, 0x70, 0x47, 0x47, 0x23, 0x6a, 0x01, 0x2d, 0xe5, 0xee, 0x78, 0xef, 0xfd, 0x7a, 0xab, 0x16, 0x17, 0x95, 0x6b, 0x6c, 0x1c, 0x1c, 0x33, 0x31, 0x95, 0x17, 0x02, 0x74, 0x9e, 0x4b, 0x73, 0x4f, 0x3d, 0x20, 0x03, 0x86, 0x20, 0x3d, 0x82, 0xfc, 0xed, 0xa8, 0x64, 0x30, 0x31, 0x01, 0x0c, 0x94, 0x50, 0xb2, 0xb2, 0x01, 0x44, 0x31, 0x30, 0x64, 0x02, 0x5e, 0x64, 0xfa, 0xac, 0x05, 0x54, 0xfe, 0x64, 0xfc, 0x36, 0x03, 0x82, 0x82, 0x9f, 0x9e, 0x4a, 0x74, 0x68, 0x69, 0x00, 0x00, 0x03, 0x00, 0x51, 0xff, 0xe3, 0x04, 0x1e, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x32, 0x00, 0x00, 0x13, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x13, 0x06, 0x07, 0x06, 0x13, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x21, 0x37, 0x21, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0xc4, 0x0b, 0x47, 0x13, 0x1b, 0x91, 0x22, 0x1f, 0x90, 0x97, 0x40, 0x55, 0x6d, 0x72, 0x51, 0x53, 0x15, 0x60, 0x61, 0x62, 0x60, 0xf2, 0x70, 0x51, 0x0d, 0x30, 0xa3, 0xa1, 0xe3, 0xcd, 0x5c, 0x3f, 0x0e, 0x11, 0xfd, 0xce, 0x12, 0x01, 0xcd, 0x0a, 0x34, 0x46, 0x98, 0x43, 0x3c, 0x02, 0x30, 0x3c, 0x37, 0x8d, 0x68, 0x1d, 0x16, 0x03, 0x3a, 0x15, 0x1c, 0x82, 0xfd, 0x4a, 0x15, 0x1f, 0x16, 0x28, 0x75, 0x2a, 0x16, 0x16, 0x9c, 0x6f, 0xa6, 0x44, 0x4d, 0x01, 0x13, 0xa2, 0xa1, 0x91, 0x63, 0x93, 0x46, 0x50, 0x5a, 0x64, 0x38, 0x32, 0x76, 0x52, 0x73, 0x11, 0x00, 0x00, 0x03, 0x00, 0x47, 0x00, 0x00, 0x02, 0x41, 0x06, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x07, 0x23, 0x03, 0x33, 0x13, 0x23, 0x13, 0x21, 0x13, 0x21, 0x01, 0x9b, 0xa6, 0x29, 0xa6, 0xbf, 0x79, 0xa0, 0x79, 0x21, 0xfe, 0xd3, 0xc4, 0x01, 0x2d, 0x06, 0x14, 0xe9, 0xfb, 0x39, 0x03, 0x98, 0xfc, 0x04, 0x04, 0x60, 0x00, 0x03, 0xff, 0x2d, 0xfe, 0x56, 0x02, 0x41, 0x06, 0x14, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x33, 0x07, 0x23, 0x03, 0x13, 0x23, 0x03, 0x06, 0x07, 0x36, 0x37, 0x36, 0x05, 0x23, 0x37, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x01, 0x9b, 0xa6, 0x29, 0xa6, 0x5c, 0xb6, 0x79, 0xbb, 0x1f, 0x30, 0x41, 0x2d, 0x43, 0xfe, 0xf9, 0xc6, 0x12, 0x2d, 0x5e, 0x2b, 0x2b, 0x1a, 0xd1, 0x01, 0x2d, 0xc8, 0x25, 0x5a, 0x5b, 0x06, 0x14, 0xe9, 0xfa, 0xbf, 0x04, 0x12, 0xfb, 0xd0, 0xb5, 0x54, 0x0f, 0x30, 0x48, 0xf4, 0x64, 0x30, 0x31, 0x99, 0x04, 0xac, 0xfb, 0x8c, 0xd6, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x35, 0xff, 0xe3, 0x05, 0x26, 0x05, 0xf0, 0x00, 0x26, 0x00, 0x30, 0x00, 0x00, 0x09, 0x01, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x12, 0x37, 0x03, 0x33, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x03, 0x5b, 0xfe, 0x36, 0x35, 0x40, 0xa8, 0x68, 0x54, 0xfb, 0xe3, 0x81, 0x5d, 0xcd, 0x76, 0xd9, 0x01, 0x14, 0x79, 0x79, 0x2c, 0x2d, 0xc8, 0xa6, 0x4b, 0x94, 0x4c, 0x4e, 0x8e, 0x3d, 0x5f, 0x76, 0x36, 0x2e, 0x51, 0x4d, 0xbf, 0x90, 0x55, 0x96, 0x42, 0x02, 0x40, 0x02, 0x08, 0x59, 0xcb, 0x72, 0x84, 0x01, 0x02, 0x7e, 0x01, 0x1f, 0x95, 0x59, 0x57, 0xfe, 0xed, 0xd7, 0x80, 0xe1, 0x63, 0x3f, 0x7d, 0x3c, 0xa2, 0xc5, 0x24, 0x24, 0xb6, 0x2f, 0x31, 0x6f, 0x58, 0x33, 0x67, 0xce, 0x51, 0xa1, 0x58, 0x92, 0xc2, 0x3f, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x03, 0x2e, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x03, 0x2e, 0xfd, 0x1b, 0x02, 0x3f, 0xfe, 0x3a, 0x01, 0xc6, 0x04, 0x60, 0xfb, 0xa0, 0x93, 0x01, 0x6f, 0x93, 0x01, 0xcb, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xa4, 0x05, 0xf0, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa5, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xb6, 0x05, 0xf0, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa7, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x09, 0x9d, 0x05, 0xf0, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x00, 0x7b, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x07, 0x07, 0xa0, 0x06, 0xfa, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0x9c, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x00, 0x75, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x54, 0xff, 0xe3, 0x06, 0x9c, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x74, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x00, 0x75, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xa2, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa3, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x54, 0xff, 0xe3, 0x06, 0xa2, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x74, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa3, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x58, 0xff, 0xe3, 0x06, 0xa2, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x75, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa3, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x38, 0xff, 0xe3, 0x06, 0xa2, 0x05, 0xf0, 0x10, 0x26, 0x07, 0xa2, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa3, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xbf, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa4, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xe3, 0x06, 0xbf, 0x05, 0xf0, 0x10, 0x26, 0x07, 0xa3, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa4, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xb8, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa6, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x58, 0xff, 0xe3, 0x06, 0xb8, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x75, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa6, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xe3, 0x06, 0xb8, 0x05, 0xf0, 0x10, 0x26, 0x07, 0xa3, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa6, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x61, 0xff, 0xe3, 0x06, 0xb8, 0x05, 0xf0, 0x10, 0x26, 0x07, 0xa5, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa6, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x05, 0x69, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x02, 0xd7, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x01, 0x6c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x42, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x01, 0x6c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x02, 0xd7, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x96, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x39, 0x01, 0xb8, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x05, 0xf0, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x04, 0x84, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x07, 0x5b, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x04, 0x84, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x05, 0xf0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x08, 0xc7, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x04, 0x84, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x05, 0xf0, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x07, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x62, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3b, 0x01, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x06, 0x03, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x04, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x07, 0x6f, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x04, 0x98, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0x9f, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x01, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x03, 0xea, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x01, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x02, 0x96, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x05, 0xa1, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x59, 0x01, 0x95, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x05, 0x2b, 0x06, 0x14, 0x10, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x03, 0xd7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x06, 0x76, 0x06, 0x14, 0x10, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x03, 0xd7, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x05, 0x22, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x07, 0xc1, 0x06, 0x14, 0x10, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x03, 0xd7, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x05, 0x22, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x06, 0x6d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x05, 0xa9, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x5b, 0x01, 0xa2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x05, 0x3f, 0x06, 0x14, 0x10, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x03, 0xec, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x06, 0x8a, 0x06, 0x14, 0x10, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x03, 0xec, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x05, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x50, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6c, 0x00, 0x00, 0x08, 0x8b, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x23, 0x03, 0x11, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x05, 0x96, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfd, 0xcb, 0xfe, 0x7b, 0xfe, 0x91, 0x01, 0x6d, 0x01, 0x87, 0x01, 0x75, 0xdc, 0x01, 0x16, 0x01, 0x02, 0xfe, 0xfe, 0xfe, 0xea, 0xdc, 0xb5, 0xdc, 0xfe, 0xea, 0xfe, 0xfe, 0x01, 0x02, 0x01, 0x16, 0x05, 0xd5, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x01, 0x6a, 0x01, 0x82, 0x01, 0x80, 0x01, 0x69, 0xfa, 0xd1, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xfb, 0x77, 0x04, 0x89, 0xfe, 0xe9, 0xfe, 0xd4, 0xfe, 0xd2, 0xfe, 0xe8, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x01, 0x15, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x23, 0x15, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x01, 0x6b, 0xdb, 0x01, 0x16, 0x01, 0x03, 0xfe, 0xfd, 0xfe, 0xea, 0xdb, 0x41, 0xe6, 0xd8, 0xd9, 0xe5, 0x41, 0x46, 0x8f, 0x84, 0x84, 0x8f, 0xfc, 0x01, 0x75, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfe, 0x8b, 0x01, 0x59, 0xb3, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xb2, 0xc2, 0xcf, 0xd0, 0xc3, 0x02, 0x9e, 0xfd, 0xe8, 0x81, 0x8c, 0x8a, 0x81, 0x01, 0xde, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x00, 0x05, 0x00, 0x6c, 0x00, 0x00, 0x08, 0x8b, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x31, 0x00, 0x43, 0x00, 0x00, 0x01, 0x15, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x03, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x13, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x20, 0x00, 0x11, 0x10, 0x00, 0x01, 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x13, 0x35, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x33, 0x35, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x04, 0xd6, 0x41, 0xe7, 0xd8, 0xd9, 0xe6, 0x41, 0xdc, 0x01, 0x16, 0x01, 0x02, 0xfe, 0xfe, 0xfe, 0xea, 0xdc, 0x47, 0x8f, 0x84, 0x84, 0x8f, 0x47, 0xc0, 0xfd, 0xcb, 0xfe, 0x7b, 0xfe, 0x91, 0x01, 0x6d, 0x01, 0x87, 0x02, 0x35, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfd, 0x06, 0x47, 0x8f, 0x84, 0x84, 0x8f, 0x47, 0xdc, 0xfe, 0xea, 0xfe, 0xfe, 0x01, 0x02, 0x01, 0x16, 0xdc, 0x41, 0xe6, 0xd9, 0xd8, 0xe7, 0x05, 0x2f, 0xb2, 0xc2, 0xcf, 0xd0, 0xc3, 0xb3, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xfc, 0xb0, 0x81, 0x8c, 0x8a, 0x81, 0xfc, 0x09, 0x01, 0x6a, 0x01, 0x82, 0x01, 0x80, 0x01, 0x69, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x01, 0xdf, 0x02, 0x18, 0x81, 0x8a, 0x8c, 0x81, 0x02, 0x9e, 0xb2, 0xfe, 0xe9, 0xfe, 0xd4, 0xfe, 0xd2, 0xfe, 0xe8, 0xb3, 0xc3, 0xd0, 0xcf, 0xc2, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x06, 0x01, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x06, 0x02, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x56, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x04, 0xa3, 0x5c, 0xd0, 0x75, 0xe6, 0xf5, 0xf5, 0xe6, 0x75, 0xd0, 0x5c, 0xb5, 0x0a, 0x0b, 0x6b, 0x76, 0xfe, 0xce, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x32, 0x78, 0xd6, 0x05, 0x62, 0xd5, 0x5f, 0x5e, 0xfe, 0xc7, 0xfe, 0xd8, 0xfe, 0xd9, 0xfe, 0xc7, 0x5e, 0x5f, 0xfd, 0x10, 0x01, 0xb9, 0x04, 0x04, 0x24, 0x01, 0x9f, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, 0xff, 0xe3, 0x06, 0x9c, 0x05, 0xf0, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x27, 0x00, 0x75, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x06, 0x07, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x09, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x04, 0x49, 0xfb, 0xb7, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x09, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x02, 0xdc, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x99, 0xd3, 0x6c, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfb, 0x3c, 0x04, 0xc4, 0xea, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x09, 0x00, 0x00, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfb, 0xb7, 0x04, 0x49, 0xd1, 0x6c, 0x02, 0xaf, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0xff, 0xf9, 0x04, 0x8e, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x05, 0x23, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x03, 0x2d, 0x51, 0xfe, 0x9d, 0x6c, 0xd3, 0x99, 0xd1, 0x6c, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x04, 0xc4, 0xfb, 0x3c, 0xea, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x03, 0x5c, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfc, 0xa4, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xe9, 0x78, 0x00, 0x00, 0x01, 0x01, 0x79, 0xff, 0xef, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x11, 0x07, 0x27, 0x02, 0xdc, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9d, 0x6c, 0xd3, 0xd3, 0x6c, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfc, 0x43, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xea, 0x03, 0xbd, 0xea, 0x78, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x09, 0x00, 0x00, 0x01, 0x37, 0x21, 0x15, 0x21, 0x01, 0x07, 0x01, 0x11, 0x23, 0x01, 0x03, 0x39, 0x01, 0xf4, 0xfe, 0xd7, 0x03, 0x08, 0x6c, 0xfc, 0xf8, 0x98, 0x04, 0x74, 0x3f, 0xa9, 0xfc, 0xa2, 0x78, 0x03, 0x5e, 0xfe, 0xb6, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x09, 0x00, 0x00, 0x01, 0x17, 0x11, 0x23, 0x11, 0x01, 0x27, 0x01, 0x21, 0x35, 0x04, 0xd6, 0x39, 0x98, 0xfc, 0xf8, 0x6c, 0x03, 0x08, 0xfe, 0xd7, 0x04, 0xb3, 0x3f, 0xfd, 0xd4, 0x01, 0x4a, 0xfc, 0xa2, 0x78, 0x03, 0x5e, 0xa9, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x09, 0x00, 0x00, 0x25, 0x07, 0x21, 0x35, 0x21, 0x01, 0x37, 0x01, 0x11, 0x33, 0x05, 0x0f, 0x39, 0xfe, 0x0c, 0x01, 0x29, 0xfc, 0xf8, 0x6c, 0x03, 0x08, 0x98, 0x73, 0x3f, 0xa9, 0x03, 0x5e, 0x78, 0xfc, 0xa2, 0x01, 0x4a, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x09, 0x00, 0x00, 0x25, 0x27, 0x11, 0x33, 0x11, 0x01, 0x17, 0x01, 0x21, 0x15, 0x01, 0x3c, 0x39, 0x98, 0x03, 0x08, 0x6c, 0xfc, 0xf8, 0x01, 0x29, 0x34, 0x3f, 0x02, 0x2c, 0xfe, 0xb6, 0x03, 0x5e, 0x78, 0xfc, 0xa2, 0xa9, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x11, 0x00, 0x00, 0x01, 0x03, 0x27, 0x13, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x13, 0x17, 0x03, 0x21, 0x15, 0x03, 0xd5, 0xb4, 0x85, 0x88, 0xfe, 0x32, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0x27, 0xb4, 0x85, 0x88, 0x01, 0x71, 0x02, 0x2d, 0xfe, 0xa5, 0x55, 0x01, 0x06, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x5b, 0x55, 0xfe, 0xfa, 0xaa, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x11, 0x00, 0x00, 0x01, 0x13, 0x17, 0x03, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x03, 0x27, 0x13, 0x21, 0x35, 0x02, 0x33, 0xb4, 0x86, 0x88, 0x01, 0xcd, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfd, 0xda, 0xb4, 0x86, 0x88, 0xfe, 0x8f, 0x02, 0xd7, 0x01, 0x5b, 0x55, 0xfe, 0xfa, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0xa5, 0x55, 0x01, 0x06, 0xaa, 0x00, 0x01, 0x00, 0x27, 0x00, 0xd3, 0x05, 0xf5, 0x03, 0x50, 0x00, 0x34, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x11, 0x23, 0x11, 0x37, 0x21, 0x15, 0x05, 0x01, 0xbc, 0x1f, 0x2b, 0x24, 0x33, 0x2f, 0x28, 0x2b, 0x3f, 0x13, 0x1f, 0x36, 0x35, 0x46, 0x43, 0x4f, 0x52, 0x40, 0x49, 0x32, 0x36, 0x1f, 0x8e, 0x13, 0x1f, 0x1e, 0x2d, 0x25, 0x32, 0x30, 0x27, 0x2b, 0x20, 0x20, 0x13, 0x1b, 0x39, 0x2d, 0x4e, 0x40, 0x52, 0x4f, 0x43, 0x46, 0x35, 0x90, 0x98, 0x38, 0x01, 0xf5, 0xfe, 0xd7, 0x01, 0xf4, 0x21, 0x15, 0x13, 0x13, 0x15, 0x46, 0x30, 0x4f, 0x3c, 0x3a, 0x22, 0x20, 0x20, 0x25, 0x37, 0x3c, 0x4f, 0x41, 0x30, 0x23, 0x21, 0x17, 0x13, 0x13, 0x14, 0x24, 0x23, 0x30, 0x49, 0x42, 0x35, 0x27, 0x20, 0x20, 0x22, 0x3a, 0xa0, 0xfe, 0xb6, 0x02, 0x2c, 0x3f, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0xd3, 0x05, 0xe1, 0x03, 0x50, 0x00, 0x34, 0x00, 0x00, 0x01, 0x37, 0x25, 0x35, 0x21, 0x17, 0x11, 0x23, 0x11, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x04, 0x4d, 0x90, 0xfe, 0xd7, 0x01, 0xf4, 0x39, 0x98, 0x90, 0x35, 0x47, 0x42, 0x4f, 0x52, 0x40, 0x4e, 0x2e, 0x38, 0x1c, 0x13, 0x1f, 0x21, 0x2a, 0x28, 0x2f, 0x33, 0x25, 0x2d, 0x1d, 0x20, 0x13, 0x8d, 0x1e, 0x36, 0x32, 0x4a, 0x40, 0x52, 0x4f, 0x42, 0x47, 0x35, 0x36, 0x1e, 0x13, 0x3f, 0x2b, 0x28, 0x30, 0x32, 0x25, 0x2a, 0x01, 0xf4, 0xa0, 0x01, 0xa9, 0x3f, 0xfd, 0xd4, 0x01, 0x4a, 0xa0, 0x3a, 0x22, 0x20, 0x20, 0x27, 0x35, 0x42, 0x49, 0x30, 0x23, 0x24, 0x14, 0x13, 0x13, 0x17, 0x21, 0x23, 0x30, 0x41, 0x4f, 0x3c, 0x37, 0x25, 0x20, 0x20, 0x22, 0x3a, 0x3c, 0x4f, 0x30, 0x46, 0x15, 0x13, 0x13, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x11, 0x00, 0x00, 0x13, 0x01, 0x17, 0x07, 0x33, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x23, 0x17, 0x07, 0x01, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0xd8, 0x01, 0x3e, 0x6c, 0xd2, 0x02, 0x99, 0xfd, 0x67, 0xd2, 0x6c, 0xfe, 0xc2, 0xd8, 0xd2, 0x6c, 0xfe, 0x9e, 0x02, 0xaf, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x61, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x01, 0x61, 0xe9, 0x78, 0x01, 0x89, 0x00, 0x00, 0x00, 0x01, 0x01, 0x7a, 0x00, 0x00, 0x04, 0x90, 0x05, 0xdc, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x07, 0x27, 0x15, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x35, 0x07, 0x27, 0x01, 0x03, 0x2d, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0x3e, 0x6c, 0xd2, 0x99, 0xd1, 0x6c, 0x01, 0x3d, 0xd1, 0x6c, 0x01, 0x61, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xf0, 0xfe, 0x9e, 0x78, 0xea, 0xfd, 0x1c, 0x02, 0xe4, 0xea, 0x78, 0x01, 0x62, 0xf0, 0xea, 0x78, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x23, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x33, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xd8, 0xfe, 0xc3, 0x6c, 0xd1, 0xfd, 0x67, 0x02, 0x99, 0xd1, 0x6c, 0x01, 0x3d, 0xd8, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x9f, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0xfe, 0x9f, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x01, 0x01, 0x7a, 0xff, 0xf9, 0x04, 0x90, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x05, 0x01, 0x37, 0x17, 0x35, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x15, 0x37, 0x17, 0x01, 0x02, 0xde, 0xfe, 0x9d, 0x6c, 0xd3, 0xfe, 0xc1, 0x6c, 0xd3, 0x98, 0xd1, 0x6c, 0xfe, 0xc3, 0xd1, 0x6c, 0xfe, 0x9f, 0x07, 0x01, 0x8a, 0x78, 0xea, 0xf0, 0x01, 0x62, 0x78, 0xea, 0x02, 0xe4, 0xfd, 0x1c, 0xea, 0x78, 0xfe, 0x9e, 0xf0, 0xea, 0x78, 0xfe, 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x01, 0x17, 0x09, 0x01, 0x07, 0x01, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0x9f, 0x01, 0x3e, 0x6c, 0xfe, 0xe2, 0x01, 0x1e, 0x6c, 0xfe, 0xc2, 0xfd, 0x61, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x61, 0x78, 0xfe, 0xc2, 0xfe, 0xc2, 0x78, 0x01, 0x61, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x01, 0x27, 0x09, 0x01, 0x37, 0x01, 0x21, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfd, 0x61, 0xfe, 0xc2, 0x6c, 0x01, 0x1f, 0xfe, 0xe1, 0x6c, 0x01, 0x3e, 0x02, 0x9f, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x9f, 0x78, 0x01, 0x3e, 0x01, 0x3e, 0x78, 0xfe, 0x9f, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x11, 0x23, 0x05, 0x06, 0xfc, 0x50, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x03, 0xb0, 0x99, 0x99, 0x02, 0x2d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x59, 0xfc, 0xa4, 0x00, 0x00, 0x01, 0x01, 0x7a, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x11, 0x07, 0x27, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x21, 0x15, 0x21, 0x35, 0x02, 0xb8, 0xd1, 0x6c, 0x01, 0x61, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x01, 0x37, 0xfc, 0xfa, 0xaa, 0x04, 0x1a, 0xea, 0x78, 0x01, 0x8a, 0xfe, 0x76, 0x78, 0xea, 0xfb, 0xe6, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x04, 0xb2, 0xfc, 0x50, 0x99, 0x99, 0x03, 0xb0, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x02, 0x2d, 0xfe, 0xa7, 0x03, 0x5c, 0xfe, 0xa7, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x00, 0x00, 0x01, 0x01, 0x7a, 0xff, 0xf9, 0x04, 0x8e, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x02, 0xb8, 0xfe, 0xca, 0x03, 0x06, 0xfe, 0xc9, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0x05, 0x2b, 0xaa, 0xaa, 0xfb, 0xe6, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xea, 0x00, 0x00, 0x01, 0x01, 0x7a, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x13, 0x00, 0x00, 0x01, 0x37, 0x17, 0x01, 0x21, 0x15, 0x21, 0x35, 0x21, 0x01, 0x37, 0x17, 0x11, 0x07, 0x27, 0x01, 0x33, 0x01, 0x07, 0x27, 0x03, 0x51, 0xd1, 0x6c, 0xfe, 0x9f, 0x01, 0x5b, 0xfc, 0xfa, 0x01, 0x5a, 0xfe, 0x9f, 0x6c, 0xd1, 0xd1, 0x6c, 0x01, 0x61, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x01, 0xc2, 0xea, 0x78, 0xfe, 0x76, 0xaa, 0xaa, 0x01, 0x8a, 0x78, 0xea, 0x03, 0x02, 0xea, 0x78, 0x01, 0x8a, 0xfe, 0x76, 0x78, 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0x9f, 0x04, 0x86, 0x00, 0x25, 0x00, 0x00, 0x01, 0x35, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x20, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x04, 0x91, 0x38, 0x2f, 0x2d, 0x2a, 0x27, 0x28, 0x26, 0x29, 0x23, 0x34, 0x2c, 0x1d, 0xfc, 0xa7, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0xaa, 0x01, 0xa9, 0x14, 0x16, 0x11, 0x10, 0x12, 0x11, 0x11, 0x11, 0x16, 0x14, 0x03, 0xdc, 0xaa, 0x16, 0x15, 0x2d, 0x29, 0x6f, 0x3d, 0x3c, 0x6a, 0x2e, 0x28, 0x1a, 0x16, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x0a, 0x0a, 0x12, 0x11, 0x31, 0x1a, 0x1b, 0x2e, 0x14, 0x12, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x86, 0x00, 0x29, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x01, 0x77, 0x18, 0x14, 0x15, 0x12, 0x10, 0x09, 0x09, 0x09, 0x0b, 0x0e, 0x12, 0x15, 0x14, 0x18, 0x03, 0x3b, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfc, 0xc5, 0x3a, 0x2c, 0x35, 0x23, 0x28, 0x13, 0x14, 0x14, 0x15, 0x26, 0x2b, 0x2d, 0x2f, 0x37, 0x03, 0xdc, 0x0a, 0x0a, 0x12, 0x11, 0x1a, 0x17, 0x1b, 0x1a, 0x17, 0x1c, 0x0f, 0x12, 0x0a, 0x0a, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x16, 0x1a, 0x28, 0x2e, 0x34, 0x36, 0x3c, 0x3d, 0x36, 0x39, 0x29, 0x2d, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0x9f, 0x04, 0x86, 0x00, 0x18, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x07, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x23, 0x35, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x04, 0x1c, 0x75, 0x18, 0x14, 0x16, 0x11, 0x10, 0x09, 0x09, 0x09, 0x09, 0x10, 0x11, 0x16, 0x14, 0x30, 0x14, 0x16, 0x11, 0x0e, 0x0b, 0x09, 0x98, 0x14, 0x14, 0x27, 0x2b, 0x2c, 0x2f, 0x38, 0x3b, 0x2c, 0x34, 0x23, 0x29, 0x12, 0x14, 0x14, 0x14, 0x27, 0x2a, 0x2d, 0x2f, 0x38, 0x75, 0x98, 0xfd, 0xd2, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0xd7, 0x0a, 0x0a, 0x12, 0x11, 0x1a, 0x17, 0x1a, 0x1b, 0x17, 0x1a, 0x11, 0x12, 0x0a, 0x0a, 0x0a, 0x0a, 0x12, 0x0f, 0x1c, 0x17, 0x1b, 0x82, 0x82, 0x3d, 0x36, 0x39, 0x29, 0x2d, 0x15, 0x16, 0x16, 0x1a, 0x28, 0x2e, 0x34, 0x36, 0x3d, 0x3c, 0x36, 0x39, 0x29, 0x2d, 0x15, 0x16, 0xdc, 0xdc, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x86, 0x00, 0x18, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x29, 0x01, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x15, 0x23, 0x35, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x01, 0xec, 0x09, 0x0b, 0x0e, 0x11, 0x16, 0x13, 0x31, 0x14, 0x15, 0x12, 0x10, 0x09, 0x09, 0x09, 0x09, 0x10, 0x12, 0x15, 0x14, 0x18, 0x01, 0x0d, 0x02, 0x2e, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfd, 0xd2, 0x98, 0x75, 0x37, 0x2f, 0x2d, 0x2b, 0x26, 0x15, 0x14, 0x14, 0x13, 0x28, 0x23, 0x35, 0x2c, 0x3a, 0x38, 0x2f, 0x2d, 0x2a, 0x27, 0x15, 0x13, 0x02, 0xd7, 0x82, 0x1b, 0x17, 0x1c, 0x0f, 0x12, 0x0a, 0x0a, 0x0a, 0x0a, 0x12, 0x11, 0x1a, 0x17, 0x1b, 0x1a, 0x17, 0x1a, 0x11, 0x12, 0x0a, 0x0a, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xdc, 0xdc, 0x16, 0x15, 0x2d, 0x29, 0x39, 0x36, 0x3c, 0x3d, 0x36, 0x34, 0x2e, 0x28, 0x1a, 0x16, 0x16, 0x15, 0x2d, 0x29, 0x39, 0x36, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x58, 0x00, 0x00, 0x01, 0x23, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x01, 0x5f, 0x09, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x09, 0x2b, 0x21, 0x1f, 0x20, 0x0a, 0x15, 0x18, 0x16, 0x09, 0x09, 0x05, 0x0e, 0x1d, 0x1e, 0x22, 0x23, 0x28, 0x2b, 0x21, 0x23, 0x1d, 0x1d, 0x0e, 0x04, 0x09, 0x09, 0x16, 0x18, 0x16, 0x09, 0x23, 0x1d, 0x23, 0x28, 0x09, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0x09, 0x0c, 0x0a, 0x0c, 0x09, 0x1c, 0x24, 0x23, 0x51, 0x22, 0x24, 0x1c, 0x1e, 0x0e, 0x04, 0x09, 0x09, 0x0b, 0x0a, 0x19, 0x0a, 0x0c, 0x09, 0x08, 0x05, 0x0d, 0x1f, 0x1c, 0x24, 0x22, 0x51, 0x23, 0x24, 0x1c, 0x09, 0x0b, 0x0a, 0x02, 0x2d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x12, 0x12, 0x24, 0x0a, 0x0c, 0x0c, 0x0a, 0x0c, 0x0d, 0x2d, 0x23, 0x25, 0x11, 0x12, 0x12, 0x14, 0x22, 0x26, 0x2a, 0x0d, 0x0c, 0x0a, 0x0c, 0x0c, 0x0a, 0x27, 0x0f, 0x12, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x06, 0x06, 0x0a, 0x22, 0x14, 0x12, 0x12, 0x14, 0x22, 0x26, 0x2a, 0x0d, 0x0c, 0x0a, 0x06, 0x06, 0x06, 0x06, 0x0a, 0x09, 0x10, 0x2a, 0x26, 0x22, 0x14, 0x12, 0x12, 0x14, 0x22, 0x0a, 0x06, 0x06, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xbe, 0x05, 0xaf, 0x04, 0x46, 0x00, 0x17, 0x00, 0x00, 0x25, 0x27, 0x13, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x13, 0x17, 0x03, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x02, 0xc2, 0x90, 0x64, 0xfe, 0xc0, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0x78, 0x79, 0x90, 0x65, 0x01, 0x40, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0x88, 0xbe, 0x3a, 0x01, 0x35, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x6f, 0x3a, 0xfe, 0xcb, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x00, 0x01, 0x01, 0x0c, 0xff, 0xfc, 0x05, 0x0e, 0x05, 0xd8, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x13, 0x17, 0x03, 0x01, 0x03, 0x37, 0x17, 0x01, 0x27, 0x01, 0x37, 0x13, 0x03, 0xa2, 0xfd, 0x6a, 0x8e, 0x96, 0x55, 0x02, 0x96, 0xae, 0xf2, 0x58, 0xfe, 0x67, 0x50, 0xfe, 0xe1, 0x7d, 0xab, 0x04, 0x08, 0xfe, 0x58, 0x03, 0x78, 0x1d, 0xfd, 0xee, 0x01, 0xa8, 0xfb, 0xb8, 0xbe, 0x8b, 0xfe, 0xc0, 0x10, 0x01, 0xc8, 0x62, 0xfe, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x37, 0x00, 0x00, 0x04, 0x89, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x04, 0x88, 0x99, 0xfe, 0x44, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x04, 0x91, 0xfb, 0x6f, 0x03, 0xe7, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x01, 0x81, 0x00, 0x00, 0x04, 0xd2, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x01, 0x81, 0x02, 0x55, 0xd2, 0x6c, 0x01, 0x62, 0xfe, 0x9e, 0x6c, 0xd2, 0xfe, 0x44, 0x99, 0x04, 0x91, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfc, 0x19, 0x00, 0x00, 0x00, 0x01, 0x01, 0x37, 0xff, 0xe3, 0x04, 0x89, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x04, 0x88, 0xfd, 0xab, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0xbc, 0x99, 0x01, 0x44, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x01, 0x81, 0xff, 0xe3, 0x04, 0xd2, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x01, 0x81, 0x99, 0x01, 0xbc, 0xd2, 0x6c, 0x01, 0x62, 0xfe, 0x9e, 0x6c, 0xd2, 0x01, 0x44, 0x04, 0x91, 0xfc, 0x19, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x01, 0xad, 0xff, 0xf9, 0x05, 0x79, 0x04, 0xd4, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x11, 0x21, 0x35, 0x04, 0x3b, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9e, 0x6c, 0xd2, 0xfe, 0x0b, 0x04, 0xd4, 0xfc, 0x3d, 0xe9, 0x78, 0xfe, 0x77, 0x01, 0x89, 0x78, 0xe9, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x04, 0xb9, 0x05, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x04, 0xb9, 0xfc, 0x9d, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0xca, 0x99, 0x02, 0x2d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x02, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x01, 0xa0, 0x05, 0xc2, 0x05, 0x58, 0x00, 0x26, 0x00, 0x00, 0x01, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x23, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x02, 0x00, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9d, 0x6c, 0xd3, 0x29, 0x29, 0x53, 0x51, 0x63, 0x61, 0xe6, 0x62, 0x63, 0x51, 0x52, 0x29, 0x29, 0x99, 0x3b, 0x3b, 0x36, 0x4e, 0x42, 0xac, 0x46, 0x4a, 0x39, 0x3a, 0x1f, 0x1e, 0x02, 0xb8, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xea, 0x32, 0x7f, 0x70, 0x6b, 0x5f, 0x56, 0x31, 0x2e, 0x2e, 0x31, 0x56, 0x5f, 0x6b, 0x70, 0x7f, 0x5d, 0xa2, 0x42, 0x3b, 0x27, 0x21, 0x21, 0x23, 0x3f, 0x40, 0x53, 0x51, 0x5d, 0x00, 0x01, 0x00, 0x47, 0x01, 0xa0, 0x05, 0xe0, 0x05, 0x58, 0x00, 0x26, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x1d, 0x01, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x04, 0x08, 0x1d, 0x20, 0x39, 0x3a, 0x4a, 0x46, 0xab, 0x43, 0x4d, 0x36, 0x3b, 0x3c, 0x99, 0x29, 0x29, 0x53, 0x51, 0x63, 0x61, 0xe6, 0x62, 0x63, 0x51, 0x52, 0x29, 0x29, 0xd3, 0x6c, 0xfe, 0x9d, 0x51, 0xfe, 0xa0, 0x6c, 0x02, 0xb8, 0x32, 0x5d, 0x51, 0x53, 0x40, 0x3f, 0x23, 0x21, 0x21, 0x27, 0x3b, 0x42, 0xa2, 0x5d, 0x7f, 0x70, 0x6b, 0x5f, 0x56, 0x31, 0x2e, 0x2e, 0x31, 0x56, 0x5f, 0x6b, 0x70, 0x7f, 0x32, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0x00, 0x00, 0x02, 0x00, 0xc7, 0x00, 0x34, 0x05, 0xac, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x05, 0x37, 0x21, 0x15, 0x21, 0x01, 0x07, 0x01, 0x11, 0x23, 0xc8, 0x04, 0xe4, 0xfb, 0x57, 0x39, 0x01, 0xf4, 0xfe, 0xd7, 0x03, 0x08, 0x6c, 0xfc, 0xf8, 0x98, 0x05, 0x72, 0x63, 0x63, 0xfe, 0x3f, 0xa9, 0xfc, 0xa2, 0x78, 0x03, 0x5e, 0xfe, 0xb6, 0x00, 0x02, 0x00, 0x64, 0xff, 0xa1, 0x05, 0xa4, 0x05, 0x63, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x27, 0x37, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x01, 0x27, 0x37, 0x01, 0x21, 0x17, 0x07, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x17, 0x07, 0x21, 0x65, 0x03, 0xaa, 0xd3, 0x6c, 0x01, 0x63, 0x99, 0x99, 0xfe, 0x9d, 0x6c, 0xd3, 0x01, 0x95, 0xfc, 0x56, 0xd2, 0x6c, 0xfe, 0x9e, 0x99, 0x99, 0x01, 0x62, 0x6c, 0xd2, 0x03, 0xaa, 0x01, 0x01, 0xaa, 0xe8, 0x78, 0xfe, 0x78, 0x01, 0x4e, 0xfd, 0x08, 0x01, 0x50, 0xfe, 0x78, 0x78, 0xe8, 0x02, 0x58, 0xe8, 0x78, 0x01, 0x88, 0xfe, 0xb0, 0x02, 0xf8, 0xfe, 0xb2, 0x01, 0x88, 0x78, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbd, 0x00, 0x7f, 0x05, 0x7d, 0x05, 0x70, 0x00, 0x36, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x11, 0x23, 0x11, 0x37, 0x21, 0x15, 0x21, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0xcf, 0x3e, 0x1c, 0x1e, 0x3b, 0x3c, 0x36, 0x4d, 0x43, 0xab, 0x46, 0x4a, 0x39, 0x3c, 0x3b, 0x1e, 0x1e, 0x3c, 0x1f, 0x99, 0x39, 0x01, 0xf5, 0xfe, 0xd7, 0x1f, 0x51, 0x2b, 0x29, 0x29, 0x2b, 0x51, 0x4b, 0x69, 0x5c, 0x78, 0x73, 0x61, 0x65, 0x4f, 0x51, 0x2b, 0x29, 0x29, 0x29, 0x53, 0x04, 0x2b, 0x42, 0x51, 0x51, 0x5d, 0x5a, 0xa2, 0x42, 0x3b, 0x27, 0x21, 0x21, 0x23, 0x3f, 0x42, 0xa2, 0x5a, 0x5d, 0x51, 0x51, 0x42, 0x23, 0xfe, 0xb6, 0x02, 0x2c, 0x40, 0xaa, 0x23, 0x5a, 0x70, 0x70, 0x7f, 0x7c, 0x70, 0x71, 0x59, 0x53, 0x34, 0x2e, 0x2e, 0x30, 0x57, 0x59, 0x71, 0x70, 0x7c, 0x7f, 0x70, 0x6b, 0x5f, 0x00, 0x01, 0x00, 0x8d, 0x00, 0x7f, 0x05, 0x4d, 0x05, 0x70, 0x00, 0x36, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x21, 0x35, 0x21, 0x17, 0x11, 0x23, 0x11, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x04, 0x3c, 0x6c, 0x52, 0x29, 0x29, 0x29, 0x2b, 0x50, 0x50, 0x64, 0x62, 0x73, 0x77, 0x5d, 0x69, 0x4b, 0x50, 0x2b, 0x2a, 0x2a, 0x2a, 0x51, 0x1f, 0xfe, 0xd7, 0x01, 0xf5, 0x39, 0x99, 0x1f, 0x3c, 0x1e, 0x1e, 0x3b, 0x3c, 0x3a, 0x49, 0x47, 0xaa, 0x43, 0x4d, 0x36, 0x3c, 0x3b, 0x1d, 0x1d, 0x04, 0x2b, 0x78, 0x5f, 0x6b, 0x70, 0x7f, 0x7c, 0x70, 0x71, 0x59, 0x57, 0x30, 0x2e, 0x2e, 0x34, 0x53, 0x59, 0x71, 0x70, 0x7c, 0x7f, 0x70, 0x70, 0x5a, 0x23, 0xaa, 0x40, 0xfd, 0xd4, 0x01, 0x4a, 0x23, 0x42, 0x51, 0x51, 0x5d, 0x5a, 0xa2, 0x42, 0x3f, 0x23, 0x21, 0x21, 0x27, 0x3b, 0x42, 0xa2, 0x5a, 0x5d, 0x51, 0x51, 0x00, 0x01, 0x00, 0x5a, 0x02, 0x2d, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x04, 0x49, 0x02, 0x2d, 0x82, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x02, 0xd7, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x5a, 0x05, 0x45, 0xfb, 0xb7, 0xd2, 0x6c, 0xfe, 0x9e, 0x02, 0xd7, 0xaa, 0xe9, 0x78, 0x01, 0x89, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x02, 0xb8, 0x75, 0x01, 0x61, 0x6c, 0xd1, 0x99, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfb, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x03, 0x51, 0x05, 0xdc, 0x00, 0x06, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x03, 0x51, 0x99, 0xd3, 0x6c, 0x01, 0x63, 0x05, 0xdc, 0xfa, 0x24, 0x04, 0xc4, 0xea, 0x78, 0x01, 0x8a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x2d, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfa, 0xbb, 0x04, 0x49, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x2d, 0xaa, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x02, 0xd7, 0x00, 0x06, 0x00, 0x00, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfb, 0xb7, 0x02, 0xd7, 0x82, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x06, 0x00, 0x00, 0x21, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x02, 0xb8, 0x99, 0xd1, 0x6c, 0xfe, 0x9f, 0x05, 0xdc, 0xfb, 0x3c, 0xea, 0x78, 0xfe, 0x76, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x03, 0x51, 0x05, 0xdc, 0x00, 0x06, 0x00, 0x00, 0x21, 0x23, 0x01, 0x37, 0x17, 0x11, 0x33, 0x03, 0x51, 0x75, 0xfe, 0x9d, 0x6c, 0xd3, 0x99, 0x01, 0x8a, 0x78, 0xea, 0x04, 0xc4, 0x00, 0xff, 0xff, 0x00, 0x5a, 0xff, 0xa0, 0x05, 0xaf, 0x05, 0x64, 0x10, 0x27, 0x08, 0x6c, 0x00, 0x00, 0xfe, 0xd4, 0x10, 0x07, 0x08, 0x6e, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, 0xff, 0xf9, 0x05, 0x9c, 0x05, 0xdc, 0x10, 0x27, 0x08, 0x6f, 0x01, 0x0e, 0x00, 0x00, 0x10, 0x07, 0x08, 0x6d, 0xfe, 0xf2, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0xff, 0xa0, 0x05, 0xaf, 0x05, 0x64, 0x10, 0x27, 0x08, 0x6e, 0x00, 0x00, 0xfe, 0xd4, 0x10, 0x07, 0x08, 0x6c, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xa0, 0x05, 0xa0, 0x05, 0x64, 0x00, 0x11, 0x00, 0x00, 0x01, 0x03, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x40, 0xe6, 0x01, 0x62, 0x6c, 0xd2, 0x04, 0x49, 0xfb, 0xb7, 0xc2, 0xc2, 0x04, 0x49, 0xfb, 0xb7, 0xd2, 0x6c, 0xfe, 0x9e, 0x02, 0x82, 0x00, 0xff, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0xd7, 0xd7, 0xaa, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x05, 0x9d, 0x05, 0xdc, 0x00, 0x11, 0x00, 0x00, 0x01, 0x13, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x33, 0x03, 0x04, 0xe5, 0x51, 0x01, 0x62, 0x6c, 0xd2, 0x99, 0xc1, 0xc2, 0x99, 0xd1, 0x6c, 0x01, 0x61, 0x51, 0x04, 0xdc, 0x01, 0x00, 0xfe, 0x76, 0x78, 0xea, 0xfb, 0x3c, 0x04, 0xc4, 0xd8, 0xd8, 0xfb, 0x3c, 0x04, 0xc4, 0xea, 0x78, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x00, 0x6a, 0xff, 0xa0, 0x05, 0xb0, 0x05, 0x64, 0x00, 0x11, 0x00, 0x00, 0x01, 0x17, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x15, 0x04, 0xca, 0xe5, 0xfe, 0x9f, 0x6c, 0xd1, 0xfb, 0xb7, 0x04, 0x49, 0xc1, 0xc1, 0xfb, 0xb7, 0x04, 0x49, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x82, 0xff, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xd7, 0xd7, 0xaa, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0xff, 0xf9, 0x05, 0x9d, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x25, 0x03, 0x23, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x23, 0x03, 0x04, 0xe6, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0x99, 0xc2, 0xc1, 0x99, 0xd2, 0x6c, 0xfe, 0x9e, 0x51, 0xf9, 0xff, 0x00, 0x01, 0x8a, 0x78, 0xea, 0x04, 0xc4, 0xfb, 0x3c, 0xd8, 0xd8, 0x04, 0xc4, 0xfb, 0x3c, 0xea, 0x78, 0xfe, 0x76, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0x00, 0x0e, 0x05, 0xaf, 0x04, 0xf6, 0x10, 0x27, 0x08, 0x9d, 0x00, 0x00, 0xff, 0x42, 0x10, 0x07, 0x08, 0x98, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0x00, 0x0e, 0x05, 0xaf, 0x04, 0xf6, 0x10, 0x27, 0x08, 0x99, 0x00, 0x00, 0xff, 0x42, 0x10, 0x07, 0x08, 0x9c, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x21, 0x07, 0x17, 0x21, 0x25, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x03, 0x92, 0xfd, 0xd6, 0x5e, 0x5e, 0x01, 0xbd, 0x01, 0x08, 0x6d, 0x01, 0xdf, 0xfd, 0xe3, 0x69, 0x75, 0x42, 0xfe, 0xee, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x01, 0xfc, 0x69, 0x75, 0x42, 0x01, 0x33, 0x02, 0xeb, 0x69, 0x69, 0xd2, 0xd2, 0x78, 0xca, 0x4b, 0x7f, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0xca, 0x4b, 0x7f, 0x78, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x5a, 0x00, 0xc1, 0x05, 0xaf, 0x04, 0x43, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x21, 0x00, 0x00, 0x25, 0x27, 0x37, 0x23, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x37, 0x17, 0x07, 0x33, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x13, 0x07, 0x21, 0x37, 0x27, 0x29, 0x01, 0x07, 0x17, 0x21, 0x02, 0xba, 0x7f, 0x37, 0x9e, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x01, 0x32, 0x49, 0x7f, 0x38, 0x9e, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xfe, 0xce, 0x6c, 0x44, 0x01, 0x76, 0x5f, 0x5f, 0xfe, 0x3e, 0xfe, 0x8a, 0x5e, 0x5e, 0x01, 0x32, 0xc1, 0x34, 0xac, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0xe0, 0x34, 0xac, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0x01, 0x4a, 0xd2, 0x69, 0x69, 0x69, 0x69, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x21, 0x37, 0x27, 0x21, 0x05, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x02, 0x77, 0x02, 0x29, 0x5f, 0x5f, 0xfe, 0x44, 0xfe, 0xf7, 0x6d, 0xfe, 0x21, 0x02, 0x1d, 0x6a, 0x74, 0x41, 0x01, 0x11, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xfe, 0x05, 0x69, 0x76, 0x42, 0xfe, 0xcd, 0x02, 0x19, 0x69, 0x69, 0xd2, 0xd2, 0x78, 0xca, 0x4b, 0x7f, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0xca, 0x4b, 0x7f, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x01, 0x68, 0x04, 0x37, 0xfc, 0x35, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x03, 0xcb, 0xfb, 0xc9, 0x5e, 0x02, 0x19, 0x78, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0x78, 0x69, 0x00, 0x00, 0x00, 0x01, 0x01, 0x7a, 0x00, 0x00, 0x04, 0x90, 0x05, 0xdc, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x27, 0x02, 0xa6, 0x6c, 0x53, 0x6c, 0x01, 0x61, 0x51, 0x01, 0x62, 0x6c, 0x54, 0x6c, 0x5e, 0x04, 0xb0, 0xfb, 0x50, 0x04, 0x38, 0x5e, 0x78, 0x01, 0x8a, 0xfe, 0x76, 0x78, 0x5e, 0xfb, 0xc8, 0x04, 0xb0, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x37, 0x27, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x04, 0xa0, 0x5f, 0x5f, 0xfb, 0xc9, 0x03, 0xcb, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xfc, 0x35, 0x02, 0x19, 0x69, 0x69, 0x78, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0x78, 0x00, 0x00, 0x00, 0x01, 0x01, 0x7a, 0xff, 0xf9, 0x04, 0x90, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x17, 0x37, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x11, 0x33, 0x02, 0xa6, 0x5f, 0x5e, 0x6c, 0x54, 0x6c, 0xfe, 0x9e, 0x51, 0xfe, 0x9f, 0x6c, 0x53, 0x6c, 0x01, 0x25, 0x68, 0x68, 0x04, 0xb0, 0xfb, 0xc8, 0x5e, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0x5e, 0x04, 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x01, 0x21, 0x37, 0x27, 0x21, 0x07, 0x05, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x01, 0x68, 0x03, 0x38, 0x5f, 0x5f, 0xfc, 0xc8, 0x5e, 0x03, 0x2a, 0xfd, 0xa0, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x02, 0x60, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x02, 0x19, 0x69, 0x69, 0x69, 0xe1, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x00, 0x00, 0x02, 0x01, 0x7a, 0xff, 0xf0, 0x04, 0x8f, 0x05, 0xdc, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x01, 0x11, 0x17, 0x37, 0x11, 0x27, 0x03, 0x11, 0x07, 0x27, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x02, 0xa6, 0x5e, 0x5f, 0x5f, 0xca, 0x54, 0x6c, 0x01, 0x62, 0x51, 0x01, 0x61, 0x6c, 0x53, 0x53, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9e, 0x6c, 0x04, 0xb0, 0xfc, 0x6c, 0x69, 0x69, 0x03, 0x94, 0x69, 0xfc, 0x7b, 0x02, 0xa4, 0x5d, 0x78, 0x01, 0x89, 0xfe, 0x77, 0x78, 0x5d, 0xfd, 0x5c, 0x5d, 0x78, 0xfe, 0x77, 0x01, 0x89, 0x78, 0x00, 0x00, 0x01, 0x01, 0x03, 0xff, 0xd1, 0x05, 0x6a, 0x04, 0xb3, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x07, 0x01, 0x15, 0x23, 0x11, 0x37, 0x21, 0x15, 0x23, 0x01, 0x07, 0x01, 0x23, 0x01, 0x9b, 0x02, 0xfb, 0x4c, 0xfd, 0x51, 0x98, 0x39, 0x01, 0xf4, 0x76, 0x02, 0xaf, 0x4c, 0xfd, 0x04, 0x86, 0x03, 0x76, 0xfc, 0xb0, 0x55, 0x02, 0xfb, 0x84, 0x02, 0x2c, 0x3f, 0xa9, 0xfd, 0x05, 0x55, 0x03, 0x50, 0x00, 0x01, 0x00, 0xa9, 0xff, 0xd1, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x35, 0x23, 0x01, 0x27, 0x01, 0x23, 0x35, 0x21, 0x17, 0x11, 0x23, 0x35, 0x01, 0x27, 0x04, 0x77, 0x86, 0xfd, 0x05, 0x4d, 0x02, 0xaf, 0x76, 0x01, 0xf4, 0x39, 0x98, 0xfd, 0x51, 0x4c, 0x03, 0x76, 0x94, 0xfc, 0xb0, 0x55, 0x02, 0xfb, 0xa9, 0x3f, 0xfd, 0xd4, 0x84, 0xfd, 0x05, 0x55, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa9, 0x00, 0x34, 0x05, 0x10, 0x05, 0x16, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x37, 0x01, 0x35, 0x33, 0x11, 0x07, 0x21, 0x35, 0x33, 0x01, 0x37, 0x01, 0x33, 0x04, 0x77, 0xfd, 0x05, 0x4c, 0x02, 0xaf, 0x98, 0x39, 0xfe, 0x0c, 0x76, 0xfd, 0x51, 0x4d, 0x02, 0xfb, 0x86, 0x01, 0x71, 0x03, 0x50, 0x55, 0xfd, 0x05, 0x84, 0xfd, 0xd4, 0x3f, 0xa9, 0x02, 0xfb, 0x55, 0xfc, 0xb0, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x6a, 0x05, 0x16, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x15, 0x33, 0x01, 0x17, 0x01, 0x33, 0x15, 0x21, 0x27, 0x11, 0x33, 0x15, 0x01, 0x17, 0x01, 0x9b, 0x86, 0x02, 0xfc, 0x4c, 0xfd, 0x51, 0x76, 0xfe, 0x0c, 0x39, 0x98, 0x02, 0xaf, 0x4c, 0x01, 0x71, 0x94, 0x03, 0x50, 0x55, 0xfd, 0x05, 0xa9, 0x3f, 0x02, 0x2c, 0x84, 0x02, 0xfb, 0x55, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x17, 0x21, 0x15, 0x21, 0x07, 0x01, 0x35, 0x01, 0x17, 0x21, 0x15, 0x21, 0x01, 0x40, 0x04, 0x5f, 0xfb, 0xa1, 0x7c, 0x03, 0xe3, 0xfc, 0x89, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x03, 0x77, 0xfc, 0x1d, 0x02, 0xbe, 0x78, 0x8a, 0x78, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x78, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x27, 0x21, 0x35, 0x21, 0x37, 0x01, 0x15, 0x01, 0x27, 0x21, 0x35, 0x21, 0x04, 0xc9, 0xfb, 0xa0, 0x04, 0x60, 0x7c, 0xfc, 0x1c, 0x03, 0x78, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xfc, 0x88, 0x03, 0xe4, 0x02, 0x46, 0x78, 0x8a, 0x78, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x78, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x18, 0x00, 0x00, 0x01, 0x23, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x23, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x33, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x05, 0x9f, 0x24, 0x3f, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x63, 0x59, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x7d, 0x3f, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x63, 0x02, 0x2d, 0x46, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x6e, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x46, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x18, 0x00, 0x00, 0x13, 0x35, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x33, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x23, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x69, 0x63, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x3f, 0x7d, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0x59, 0x63, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x3f, 0x02, 0x2d, 0xaa, 0x6e, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x46, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x6e, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x19, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x07, 0x27, 0x02, 0xdc, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x01, 0x0a, 0xfe, 0xf6, 0x01, 0x0a, 0xfe, 0xf6, 0x99, 0xfe, 0xf7, 0x01, 0x09, 0xfe, 0xf7, 0x01, 0x09, 0xd3, 0x6c, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfe, 0x8e, 0xaa, 0xaa, 0xaa, 0xfe, 0xac, 0x01, 0x54, 0xaa, 0xaa, 0xaa, 0x01, 0x72, 0xea, 0x78, 0x00, 0x01, 0x01, 0x79, 0xff, 0xf9, 0x04, 0x8e, 0x05, 0xd5, 0x00, 0x19, 0x00, 0x00, 0x05, 0x23, 0x01, 0x37, 0x17, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x37, 0x17, 0x03, 0x2b, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xf6, 0x01, 0x0a, 0xfe, 0xf6, 0x01, 0x0a, 0x99, 0x01, 0x09, 0xfe, 0xf7, 0x01, 0x09, 0xfe, 0xf7, 0xd3, 0x6c, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x01, 0x72, 0xaa, 0xaa, 0xaa, 0x01, 0x54, 0xfe, 0xac, 0xaa, 0xaa, 0xaa, 0xfe, 0x8e, 0xea, 0x78, 0x00, 0x00, 0x03, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0x4c, 0xfe, 0xb4, 0xd2, 0x6c, 0x01, 0x7f, 0xe6, 0x99, 0xe5, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x01, 0x61, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x03, 0x01, 0x79, 0x00, 0x00, 0x04, 0x90, 0x05, 0xdc, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x33, 0x15, 0x23, 0x15, 0x33, 0x11, 0x23, 0x02, 0xdc, 0x51, 0x01, 0x62, 0x6c, 0xd2, 0x99, 0xd3, 0x6c, 0x01, 0x3f, 0x99, 0x99, 0x99, 0x99, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfe, 0x8e, 0x01, 0x72, 0xea, 0x78, 0xfe, 0x56, 0xfe, 0xaa, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x25, 0x33, 0x15, 0x23, 0x27, 0x15, 0x23, 0x35, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xb4, 0x01, 0x4c, 0xd1, 0x6c, 0x01, 0x61, 0xfc, 0x3a, 0xe5, 0xe5, 0x99, 0xe6, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0xfe, 0x77, 0x28, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x03, 0x01, 0x79, 0xff, 0xf9, 0x04, 0x90, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x05, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x03, 0x35, 0x33, 0x15, 0x03, 0x11, 0x33, 0x11, 0x02, 0xdc, 0xfe, 0x9d, 0x6c, 0xd3, 0x99, 0xd2, 0x6c, 0xfe, 0x9e, 0x75, 0x99, 0x99, 0x99, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x01, 0x72, 0xfe, 0x8e, 0xea, 0x78, 0xfe, 0x76, 0x03, 0x34, 0xfe, 0xfe, 0x01, 0xa8, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0x00, 0xcb, 0x05, 0xa0, 0x04, 0x39, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x17, 0x07, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x17, 0x07, 0x05, 0x9f, 0xfc, 0x56, 0xd3, 0x6c, 0xfe, 0x9d, 0x99, 0x99, 0x01, 0x63, 0x6c, 0xd3, 0x02, 0xd7, 0xaa, 0xea, 0x78, 0x01, 0x8a, 0xfe, 0x7e, 0x03, 0x5c, 0xfe, 0x80, 0x01, 0x8a, 0x78, 0xea, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcb, 0x05, 0xa9, 0x04, 0x39, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x21, 0x27, 0x37, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x01, 0x27, 0x37, 0x21, 0x69, 0x03, 0xaa, 0xd3, 0x6c, 0x01, 0x63, 0x99, 0x99, 0xfe, 0x9d, 0x6c, 0xd3, 0xfc, 0x56, 0x02, 0xd7, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x80, 0xfc, 0xa4, 0x01, 0x82, 0xfe, 0x76, 0x78, 0xea, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x86, 0x05, 0xa0, 0x04, 0x7e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x03, 0x13, 0x35, 0x21, 0x11, 0x21, 0x13, 0x09, 0x01, 0x11, 0x21, 0x11, 0x21, 0x01, 0xa1, 0xf0, 0xf0, 0x03, 0xa4, 0xfc, 0x5c, 0x5a, 0xfe, 0x37, 0x01, 0xc9, 0x03, 0xa4, 0xfc, 0x5c, 0x03, 0x8c, 0xfe, 0xf6, 0xfe, 0xf6, 0x83, 0x01, 0x0e, 0xfd, 0x7d, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0xfe, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x0b, 0x01, 0x33, 0x11, 0x33, 0x11, 0x05, 0x09, 0x01, 0x23, 0x11, 0x21, 0x11, 0x03, 0xf4, 0xf0, 0xef, 0x76, 0xf3, 0xfd, 0xbd, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0xfe, 0x59, 0x04, 0x70, 0x01, 0x0a, 0xfe, 0xf6, 0xfb, 0xf4, 0x04, 0x0c, 0x64, 0x01, 0xfc, 0xfe, 0x04, 0xfb, 0xf4, 0x04, 0x0c, 0x00, 0x02, 0x00, 0x40, 0x00, 0x86, 0x05, 0xaf, 0x04, 0x7e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x13, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x04, 0x3f, 0xfc, 0x5c, 0x03, 0xa4, 0xf0, 0xfe, 0xb6, 0xfc, 0x5c, 0x03, 0xa4, 0x01, 0xc9, 0x03, 0x8c, 0x83, 0xfe, 0xf2, 0x83, 0x01, 0x0a, 0xfe, 0x04, 0x01, 0x11, 0x01, 0xd6, 0x01, 0x11, 0xfe, 0x04, 0x00, 0x00, 0x02, 0x01, 0x3b, 0xff, 0xcd, 0x04, 0xce, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x13, 0x01, 0x33, 0x11, 0x21, 0x11, 0x33, 0x01, 0x03, 0xf4, 0x76, 0xf3, 0x76, 0xef, 0xfe, 0x37, 0xf6, 0x01, 0xa7, 0xf5, 0xfe, 0x37, 0x01, 0x65, 0x04, 0x0c, 0xfb, 0xf4, 0xfe, 0xf6, 0x01, 0x6e, 0x04, 0x0c, 0xfb, 0xf4, 0xfe, 0x04, 0x00, 0x04, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x09, 0x01, 0x23, 0x03, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x11, 0x01, 0x11, 0x21, 0x11, 0x05, 0x23, 0x15, 0x33, 0x03, 0xd8, 0xfe, 0x59, 0xf6, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0x5a, 0x76, 0xf0, 0xef, 0x76, 0x01, 0x4d, 0xfe, 0x59, 0x01, 0x4d, 0xf3, 0xf3, 0x02, 0x24, 0x01, 0xe8, 0x01, 0xfc, 0xfe, 0x04, 0xfe, 0x7c, 0x01, 0xe8, 0x01, 0x0a, 0xfe, 0xf6, 0xfe, 0x18, 0xfe, 0xd4, 0xfe, 0xa4, 0x01, 0x5c, 0x64, 0x94, 0x00, 0x00, 0x02, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x23, 0x09, 0x01, 0x23, 0x11, 0x33, 0x05, 0x23, 0x15, 0x21, 0x35, 0x23, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x04, 0x8c, 0xfc, 0xf1, 0xb4, 0xf6, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0xb4, 0xfd, 0xff, 0xb4, 0x02, 0x5b, 0xb4, 0x76, 0xf0, 0xef, 0x76, 0x01, 0x5c, 0x02, 0xb0, 0x01, 0xfc, 0xfe, 0x04, 0xfd, 0x50, 0x64, 0x94, 0x94, 0x03, 0x78, 0x01, 0x0a, 0xfe, 0xf6, 0x00, 0x00, 0x03, 0x01, 0x20, 0x00, 0x00, 0x04, 0xe9, 0x06, 0x08, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x19, 0x00, 0x00, 0x25, 0x23, 0x15, 0x21, 0x35, 0x23, 0x11, 0x33, 0x27, 0x21, 0x07, 0x33, 0x01, 0x21, 0x11, 0x33, 0x11, 0x21, 0x09, 0x01, 0x21, 0x11, 0x33, 0x01, 0x33, 0x27, 0x02, 0x8b, 0xb4, 0x02, 0x5b, 0xb4, 0x91, 0x5a, 0xfe, 0x9f, 0x5a, 0x91, 0x02, 0x01, 0xfc, 0xf1, 0xb4, 0xfe, 0xef, 0x01, 0xe4, 0x01, 0xe4, 0xfe, 0xf0, 0xb4, 0xfe, 0x10, 0xd1, 0x69, 0xf8, 0x94, 0x94, 0x03, 0x5a, 0x64, 0x64, 0xfb, 0xae, 0x01, 0x5c, 0x02, 0x92, 0x02, 0x1a, 0xfd, 0xe6, 0xfd, 0x6e, 0x03, 0xaa, 0x74, 0x00, 0x03, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x11, 0x00, 0x18, 0x00, 0x00, 0x25, 0x23, 0x15, 0x21, 0x11, 0x07, 0x33, 0x01, 0x21, 0x11, 0x33, 0x11, 0x23, 0x09, 0x01, 0x23, 0x11, 0x33, 0x01, 0x11, 0x21, 0x35, 0x23, 0x11, 0x33, 0x02, 0x7d, 0xa6, 0x01, 0x00, 0xc2, 0x68, 0x02, 0x0f, 0xfc, 0xf1, 0xa6, 0xe8, 0x01, 0xc9, 0x01, 0xc9, 0xe8, 0xa7, 0xfe, 0xa5, 0x01, 0x01, 0xa7, 0x69, 0xf8, 0x94, 0x04, 0xe4, 0xd8, 0xfb, 0x90, 0x01, 0x5c, 0x02, 0xb0, 0x01, 0xfc, 0xfe, 0x04, 0xfd, 0x50, 0x03, 0xec, 0xfb, 0x1c, 0x94, 0x03, 0x78, 0x00, 0x03, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x11, 0x00, 0x17, 0x00, 0x00, 0x25, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x11, 0x05, 0x21, 0x11, 0x23, 0x13, 0x23, 0x09, 0x01, 0x23, 0x13, 0x23, 0x03, 0x33, 0x0b, 0x01, 0x33, 0x37, 0x03, 0x7e, 0x76, 0xf0, 0xef, 0x76, 0x01, 0x4d, 0xfe, 0x59, 0xf6, 0xfc, 0xfc, 0x01, 0xc9, 0x01, 0xc9, 0xfc, 0xfc, 0xf5, 0x61, 0x7d, 0xf0, 0xef, 0x7c, 0x73, 0x64, 0x02, 0xf4, 0x01, 0x0a, 0xfe, 0xf6, 0xfd, 0x0c, 0x64, 0x02, 0xf4, 0x01, 0x18, 0x01, 0xfc, 0xfe, 0x04, 0xfe, 0xe8, 0x01, 0x7c, 0x01, 0x0a, 0xfe, 0xf6, 0x80, 0x00, 0x00, 0x03, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x1f, 0x00, 0x00, 0x25, 0x23, 0x15, 0x21, 0x35, 0x23, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x01, 0x21, 0x11, 0x33, 0x11, 0x23, 0x13, 0x23, 0x09, 0x01, 0x23, 0x13, 0x23, 0x11, 0x33, 0x01, 0x33, 0x0b, 0x01, 0x33, 0x37, 0x02, 0x8b, 0xb4, 0x02, 0x5b, 0xb4, 0x76, 0xf0, 0xef, 0x76, 0x02, 0x01, 0xfc, 0xf1, 0xb4, 0xf6, 0xfc, 0xfc, 0x01, 0xc9, 0x01, 0xc9, 0xfc, 0xfc, 0xf5, 0xb4, 0xfe, 0xeb, 0x7d, 0xf0, 0xef, 0x7c, 0x73, 0xf8, 0x94, 0x94, 0x02, 0x60, 0x01, 0x0a, 0xfe, 0xf6, 0xfc, 0xa8, 0x01, 0x5c, 0x01, 0x98, 0x01, 0x18, 0x01, 0xfc, 0xfe, 0x04, 0xfe, 0xe8, 0xfe, 0x68, 0x03, 0x14, 0x01, 0x0a, 0xfe, 0xf6, 0x80, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0x86, 0x05, 0xd7, 0x04, 0x7e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x37, 0x11, 0x21, 0x15, 0x21, 0x11, 0x09, 0x01, 0x11, 0x21, 0x15, 0x03, 0x35, 0x23, 0x11, 0x33, 0x35, 0x21, 0x15, 0x13, 0x03, 0x15, 0x69, 0x01, 0x39, 0x02, 0x6c, 0x01, 0xc9, 0xfe, 0x37, 0xfd, 0x94, 0x5a, 0x85, 0x85, 0x03, 0x20, 0xef, 0xef, 0xcf, 0x03, 0x66, 0xc8, 0x01, 0x11, 0xfe, 0x04, 0xfe, 0x04, 0x01, 0x11, 0xc8, 0x02, 0x3a, 0xc8, 0xfd, 0x62, 0xc8, 0x83, 0x01, 0x0a, 0x01, 0x0a, 0x83, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x05, 0xac, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x23, 0x11, 0x01, 0x37, 0x21, 0x15, 0x21, 0x01, 0x07, 0x01, 0x11, 0x23, 0x05, 0xac, 0xfb, 0x1b, 0x59, 0x01, 0x05, 0x39, 0x01, 0xf4, 0xfe, 0xd7, 0x03, 0x08, 0x6c, 0xfc, 0xf8, 0x98, 0x05, 0xd5, 0x63, 0xfa, 0x8e, 0x05, 0xd5, 0xfe, 0x9f, 0x3f, 0xa9, 0xfc, 0xa2, 0x78, 0x03, 0x5e, 0xfe, 0xb6, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x05, 0xac, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x35, 0x21, 0x11, 0x33, 0x11, 0x01, 0x07, 0x21, 0x35, 0x21, 0x01, 0x37, 0x01, 0x11, 0x33, 0x6e, 0x04, 0xe5, 0x59, 0xfe, 0xfb, 0x39, 0xfe, 0x0c, 0x01, 0x29, 0xfc, 0xf8, 0x6c, 0x03, 0x08, 0x98, 0x63, 0x05, 0x72, 0xfa, 0x2b, 0x01, 0x61, 0x3f, 0xa9, 0x03, 0x5e, 0x78, 0xfc, 0xa2, 0x01, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x3b, 0xff, 0xcd, 0x04, 0xce, 0x06, 0x08, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x11, 0x23, 0x1b, 0x01, 0x27, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x09, 0x01, 0x23, 0x03, 0x7e, 0x76, 0xf0, 0xef, 0x76, 0x76, 0xef, 0xf0, 0x1c, 0xf5, 0xfe, 0x37, 0xfe, 0x37, 0xf6, 0xf6, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0x01, 0x65, 0x03, 0x0b, 0x01, 0x0a, 0xfe, 0xf6, 0xfc, 0xf5, 0xfe, 0xf6, 0x01, 0x0a, 0x64, 0xfe, 0x04, 0x01, 0xfc, 0x02, 0x43, 0x01, 0xfc, 0xfe, 0x04, 0x00, 0x00, 0x03, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x29, 0x00, 0x35, 0x00, 0x41, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x27, 0x37, 0x01, 0x24, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x26, 0x27, 0x26, 0x27, 0x13, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xc4, 0x05, 0x09, 0x18, 0x2d, 0x2c, 0x3a, 0x37, 0x84, 0x34, 0x3d, 0x29, 0x2d, 0x18, 0x09, 0x06, 0xab, 0xab, 0x06, 0x09, 0x18, 0x2d, 0x2c, 0x3a, 0x37, 0x84, 0x34, 0x3c, 0x2a, 0x2d, 0x18, 0x09, 0x05, 0x01, 0x3c, 0xd1, 0x6c, 0x01, 0x61, 0xfc, 0xbc, 0x4a, 0x1f, 0x25, 0x16, 0x17, 0x0d, 0x01, 0x47, 0x0f, 0x16, 0x1a, 0x20, 0x5d, 0xfe, 0xbc, 0x0d, 0x16, 0x1b, 0x20, 0x1f, 0x4a, 0x20, 0x20, 0x1a, 0x17, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0x18, 0x18, 0x40, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x40, 0x18, 0x18, 0xaa, 0x1a, 0x19, 0x40, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x40, 0x19, 0x1a, 0xe9, 0x78, 0xfe, 0x77, 0x9d, 0x0f, 0x12, 0x1a, 0x1c, 0x1e, 0x23, 0x17, 0x1c, 0x10, 0xfe, 0xf0, 0x1d, 0x1a, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, 0xff, 0xf9, 0x05, 0x9c, 0x05, 0xdc, 0x10, 0x27, 0x08, 0x6d, 0x01, 0x0e, 0x00, 0x00, 0x10, 0x07, 0x08, 0x6f, 0xfe, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x74, 0x05, 0xaf, 0x06, 0x90, 0x00, 0x19, 0x00, 0x00, 0x01, 0x07, 0x17, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x15, 0x07, 0x17, 0x05, 0xae, 0xe5, 0xe5, 0xfe, 0x9f, 0x6c, 0xd1, 0xfb, 0xb7, 0x04, 0x49, 0xc1, 0xc1, 0xfb, 0xb7, 0x04, 0x49, 0xc1, 0xc1, 0xfb, 0xb7, 0x04, 0x49, 0xd1, 0x6c, 0x01, 0x61, 0xe5, 0xe5, 0x02, 0x55, 0xff, 0xff, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xd7, 0xd7, 0xaa, 0xd7, 0xd7, 0xaa, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xc0, 0x05, 0xa0, 0x04, 0x44, 0x00, 0x11, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0xfb, 0x99, 0x01, 0xb5, 0xfe, 0x4b, 0x99, 0xfe, 0x05, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x6d, 0xfe, 0x93, 0xaa, 0xfe, 0x93, 0x01, 0x6d, 0xe9, 0x78, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0x06, 0x99, 0xfe, 0x4a, 0x01, 0xb6, 0x99, 0x01, 0xfa, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x93, 0x01, 0x6d, 0xaa, 0x01, 0x6d, 0xfe, 0x93, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x02, 0xb8, 0x99, 0x01, 0x61, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0x9f, 0x99, 0xfe, 0x9e, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0xd7, 0x01, 0x6d, 0xfe, 0x93, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x93, 0x01, 0x6d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xc0, 0x05, 0xa0, 0x04, 0x44, 0x00, 0x19, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0x7d, 0x99, 0x99, 0x99, 0x01, 0x01, 0xfe, 0xff, 0x99, 0x99, 0x99, 0xfe, 0x83, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0xaa, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xe9, 0x78, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x19, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0x84, 0x99, 0x99, 0x99, 0xfe, 0xfe, 0x01, 0x02, 0x99, 0x99, 0x99, 0x01, 0x7c, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xaa, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x02, 0x59, 0x7e, 0x5a, 0x7e, 0x01, 0x03, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xfd, 0x7e, 0x5a, 0x7e, 0xfe, 0xfd, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0xd7, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x00, 0x02, 0x00, 0x31, 0x00, 0xc4, 0x05, 0xa0, 0x04, 0x40, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x07, 0x05, 0x11, 0x09, 0x01, 0x11, 0x21, 0x15, 0x01, 0x7b, 0xe1, 0x01, 0x29, 0xfe, 0x6f, 0x01, 0x91, 0x03, 0xdc, 0x01, 0x88, 0x01, 0xf4, 0xfa, 0x41, 0xfe, 0x83, 0x01, 0xbe, 0x01, 0xbe, 0xfe, 0x83, 0x82, 0x00, 0x02, 0x00, 0x69, 0x00, 0xc4, 0x05, 0xd7, 0x04, 0x40, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0x37, 0x27, 0x03, 0x21, 0x35, 0x21, 0x11, 0x09, 0x01, 0x04, 0x8e, 0xe0, 0xe0, 0x48, 0xfc, 0x23, 0x03, 0xdd, 0x01, 0x91, 0xfe, 0x6f, 0x01, 0x88, 0xfa, 0xfa, 0xfe, 0xc5, 0x82, 0x01, 0x7d, 0xfe, 0x42, 0xfe, 0x42, 0x00, 0x03, 0x00, 0x31, 0x00, 0xc4, 0x05, 0xd7, 0x04, 0x40, 0x00, 0x02, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x37, 0x27, 0x01, 0x11, 0x07, 0x05, 0x21, 0x11, 0x09, 0x01, 0x11, 0x21, 0x11, 0x09, 0x01, 0x04, 0x8e, 0xe0, 0xe0, 0xfc, 0xed, 0xe1, 0x03, 0xac, 0xfd, 0x7d, 0xfe, 0x6f, 0x01, 0x91, 0x02, 0x83, 0x01, 0x91, 0xfe, 0x6f, 0x01, 0x88, 0xfa, 0xfa, 0xfe, 0x0c, 0x01, 0xf4, 0xfa, 0x41, 0xfe, 0x83, 0x01, 0xbe, 0x01, 0xbe, 0xfe, 0x83, 0x01, 0x7d, 0xfe, 0x42, 0xfe, 0x42, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x13, 0x21, 0x13, 0x01, 0x33, 0x13, 0x21, 0x13, 0x33, 0x01, 0x02, 0x76, 0xf8, 0xfe, 0x11, 0x90, 0xfd, 0xff, 0xc0, 0x7a, 0x02, 0x5e, 0x7b, 0xbd, 0xfe, 0x00, 0xc7, 0x02, 0xe7, 0xfc, 0x52, 0x05, 0xd5, 0xfe, 0x81, 0x01, 0x7f, 0xfa, 0x2b, 0x00, 0x01, 0x00, 0x79, 0xff, 0xe3, 0x03, 0xfd, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x10, 0x12, 0x33, 0x32, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x02, 0x7a, 0xee, 0xe2, 0xe2, 0x78, 0x3b, 0x1e, 0xb6, 0x10, 0x19, 0x47, 0x8d, 0x8c, 0x8e, 0x8e, 0x8c, 0x8d, 0x47, 0x19, 0x10, 0xb6, 0x1e, 0x3b, 0x78, 0xe2, 0xe2, 0xee, 0x02, 0xe9, 0x01, 0x7a, 0x01, 0x8d, 0xc6, 0x63, 0x90, 0x49, 0x37, 0x99, 0xfe, 0xcd, 0xfe, 0xcc, 0xfe, 0xcc, 0xfe, 0xcd, 0x99, 0x37, 0x49, 0x90, 0x63, 0xc5, 0x01, 0x8c, 0x00, 0x00, 0x02, 0x00, 0x55, 0xff, 0xe3, 0x03, 0x64, 0x05, 0x4c, 0x00, 0x20, 0x00, 0x30, 0x00, 0x00, 0x05, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x02, 0x07, 0x06, 0x01, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x23, 0x22, 0x07, 0x06, 0x01, 0x89, 0x7f, 0x52, 0x62, 0x56, 0x59, 0xa0, 0x69, 0x53, 0x31, 0x21, 0x0c, 0x1d, 0x40, 0xa9, 0x40, 0x63, 0x68, 0x5e, 0xf1, 0x67, 0x30, 0x17, 0x39, 0x92, 0x74, 0xfe, 0xe1, 0x28, 0x2a, 0x41, 0x3a, 0x2e, 0x40, 0x30, 0x28, 0x14, 0x51, 0x8a, 0x77, 0x34, 0x21, 0x1d, 0x55, 0x65, 0xb7, 0xbe, 0x94, 0x98, 0x49, 0x2b, 0x48, 0x51, 0x5c, 0x87, 0x4e, 0xad, 0x2c, 0xa8, 0x1f, 0xf6, 0x74, 0xad, 0x71, 0x83, 0xfe, 0xb8, 0x9c, 0x7a, 0x01, 0x53, 0x64, 0x36, 0x39, 0x2d, 0x3e, 0x65, 0x53, 0x59, 0xd7, 0xae, 0x6c, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x04, 0x17, 0xfc, 0x9e, 0x02, 0xac, 0xfd, 0x54, 0x02, 0xac, 0xfd, 0x54, 0x05, 0xd5, 0xfa, 0x2b, 0xaa, 0x01, 0xec, 0xaa, 0x01, 0xeb, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0xff, 0xa2, 0x04, 0x17, 0x06, 0x35, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x07, 0x23, 0x37, 0x23, 0x35, 0x33, 0x13, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x37, 0x33, 0x0f, 0x01, 0x03, 0x33, 0x11, 0x01, 0x03, 0x21, 0x11, 0x04, 0x17, 0xfd, 0x90, 0x1a, 0x99, 0x1a, 0x59, 0x89, 0x88, 0xfe, 0xef, 0x01, 0x40, 0x89, 0xfe, 0x37, 0x01, 0xf8, 0x1b, 0x99, 0x1b, 0x2f, 0x89, 0xd3, 0xfe, 0xff, 0x89, 0x01, 0x8a, 0x05, 0xd5, 0xfa, 0x2b, 0x5e, 0x5e, 0xaa, 0x01, 0xec, 0xaa, 0x01, 0xeb, 0xaa, 0x60, 0x60, 0xaa, 0xfe, 0x15, 0x01, 0xeb, 0xfd, 0x6b, 0xfe, 0x14, 0x01, 0xec, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8b, 0xff, 0xec, 0x05, 0xbb, 0x05, 0xae, 0x00, 0x1b, 0x00, 0x28, 0x00, 0x36, 0x00, 0x00, 0x01, 0x37, 0x33, 0x07, 0x16, 0x17, 0x16, 0x10, 0x02, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x26, 0x10, 0x12, 0x24, 0x33, 0x32, 0x17, 0x16, 0x09, 0x01, 0x27, 0x26, 0x23, 0x22, 0x04, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x09, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x24, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x04, 0x87, 0x50, 0x60, 0x73, 0x5e, 0x3e, 0x5a, 0xb4, 0xfe, 0xc3, 0xa6, 0xa9, 0x9e, 0x32, 0x2c, 0x71, 0x5e, 0x99, 0x39, 0x2a, 0x59, 0xb2, 0x01, 0x3c, 0xa9, 0xa6, 0x9f, 0x10, 0xfd, 0x1b, 0x02, 0xa9, 0x0d, 0x83, 0x89, 0x8b, 0xfe, 0xfa, 0x4a, 0x48, 0x01, 0x01, 0x48, 0x21, 0x03, 0x10, 0xfd, 0x51, 0x23, 0x29, 0x82, 0x8b, 0x89, 0x01, 0x06, 0x4a, 0x4a, 0x01, 0x01, 0x4a, 0x34, 0x05, 0x3b, 0x6e, 0x9d, 0x53, 0x7a, 0xb2, 0xfe, 0x80, 0xfe, 0x9d, 0xbe, 0x5f, 0x1e, 0x27, 0x9c, 0xd2, 0x42, 0x54, 0xb1, 0x01, 0x80, 0x01, 0x63, 0xbe, 0x5f, 0x0a, 0xfb, 0xe9, 0x03, 0xa5, 0x08, 0x4e, 0x9d, 0x93, 0x91, 0x9b, 0x9b, 0x91, 0x40, 0x03, 0x44, 0xfc, 0x52, 0x1f, 0x18, 0x4f, 0x9d, 0x93, 0x91, 0x9b, 0x9b, 0x91, 0x67, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfa, 0x00, 0x00, 0x04, 0xd7, 0x05, 0xc1, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x21, 0x01, 0x33, 0x01, 0x21, 0x02, 0x68, 0xfe, 0x87, 0x02, 0xf1, 0xfe, 0x24, 0xc9, 0x02, 0x09, 0xfb, 0x25, 0x04, 0xee, 0xfb, 0xc4, 0x05, 0x0f, 0xfa, 0x3f, 0x00, 0x02, 0xff, 0xfa, 0x00, 0x00, 0x04, 0xd7, 0x05, 0xc1, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x25, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x02, 0x68, 0x01, 0x78, 0xfd, 0x0f, 0x01, 0x15, 0xfd, 0xf7, 0x04, 0xdb, 0xfd, 0xf7, 0xd3, 0x04, 0x3c, 0xfa, 0xf1, 0x05, 0xc1, 0xfa, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x01, 0x35, 0x06, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0x7c, 0x7d, 0x43, 0x3a, 0x08, 0x04, 0x76, 0x02, 0x73, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x00, 0x03, 0x00, 0x9d, 0xfe, 0xe5, 0x05, 0xa9, 0x06, 0xaf, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x03, 0x16, 0x33, 0x21, 0x15, 0x21, 0x22, 0x27, 0x03, 0x27, 0x13, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x24, 0x3b, 0x01, 0x01, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x13, 0x37, 0x13, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x04, 0x5c, 0x87, 0x42, 0x01, 0x07, 0xfe, 0xc5, 0xa6, 0x01, 0xe1, 0xfd, 0xea, 0x9e, 0x20, 0x21, 0x02, 0x73, 0xfd, 0x8d, 0x3b, 0x38, 0x5a, 0x87, 0x56, 0x28, 0x27, 0xa0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0xd2, 0xfd, 0x2e, 0x3f, 0x4c, 0x74, 0x1a, 0x1a, 0x90, 0x36, 0xa5, 0x9e, 0x85, 0x7c, 0x70, 0x50, 0x42, 0x06, 0xaf, 0x37, 0xca, 0x9f, 0xfe, 0x04, 0xa0, 0xfe, 0x1d, 0x05, 0x9f, 0x0b, 0xfe, 0xee, 0x37, 0x01, 0x08, 0x13, 0x18, 0x63, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0xfc, 0xc5, 0x4a, 0x78, 0x91, 0x48, 0x10, 0x0d, 0x01, 0xb8, 0xa0, 0x01, 0xfc, 0x4e, 0x47, 0x92, 0x78, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x04, 0x67, 0x00, 0x16, 0x00, 0x00, 0x25, 0x20, 0x24, 0x35, 0x34, 0x24, 0x29, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x21, 0x15, 0x02, 0xda, 0xfe, 0xf6, 0xfe, 0xf3, 0x01, 0x0d, 0x01, 0x0a, 0x01, 0x8e, 0xfe, 0x72, 0xd1, 0x5e, 0x46, 0x1b, 0x03, 0x1e, 0xfc, 0xe2, 0x21, 0x40, 0x67, 0xc8, 0x01, 0x8e, 0x9b, 0xf6, 0xf0, 0xf0, 0xf6, 0x8e, 0x01, 0x01, 0x4f, 0x3a, 0x85, 0x8e, 0x91, 0x30, 0x51, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x04, 0x12, 0x15, 0x14, 0x02, 0x04, 0x23, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x35, 0x05, 0x11, 0x06, 0x39, 0x43, 0x7e, 0x7b, 0x85, 0xfd, 0x8d, 0x02, 0x73, 0xad, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xad, 0xfd, 0x8d, 0x02, 0x73, 0x85, 0x7b, 0x7d, 0x44, 0x3a, 0x08, 0xfb, 0x8a, 0x03, 0x27, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0xfe, 0xa0, 0xbb, 0xb9, 0xfe, 0xa0, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x00, 0x03, 0x00, 0x9d, 0xfe, 0xe5, 0x05, 0xa9, 0x06, 0xaf, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x13, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x13, 0x17, 0x03, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x04, 0x2b, 0x01, 0x01, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x07, 0x03, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x01, 0xea, 0x87, 0x41, 0xfe, 0xfa, 0x01, 0x3a, 0xa7, 0xfe, 0x1f, 0x02, 0x15, 0x9f, 0x21, 0x20, 0xfd, 0x8d, 0x02, 0x73, 0x3a, 0x39, 0x5a, 0x87, 0x56, 0x27, 0x28, 0x9f, 0xab, 0xab, 0xfe, 0xc1, 0xad, 0xd3, 0x02, 0xd3, 0x3f, 0x4c, 0x75, 0x1a, 0x1a, 0x90, 0x35, 0xa6, 0x9f, 0x84, 0x7c, 0x71, 0x50, 0x42, 0xfe, 0xe5, 0x37, 0xca, 0x9f, 0x01, 0xfc, 0xa0, 0x01, 0xe3, 0x05, 0x9f, 0x0b, 0x01, 0x12, 0x37, 0xfe, 0xf8, 0x13, 0x18, 0x63, 0xfe, 0xa0, 0xbb, 0xb9, 0xfe, 0xa0, 0xc8, 0x03, 0x3b, 0x4a, 0x78, 0x91, 0x48, 0x10, 0x0d, 0xfe, 0x48, 0xa0, 0xfe, 0x04, 0x4e, 0x47, 0x92, 0x78, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x04, 0x67, 0x00, 0x16, 0x00, 0x00, 0x01, 0x20, 0x04, 0x15, 0x14, 0x04, 0x29, 0x01, 0x35, 0x25, 0x32, 0x37, 0x36, 0x37, 0x21, 0x35, 0x05, 0x26, 0x27, 0x26, 0x07, 0x21, 0x35, 0x02, 0x51, 0x01, 0x0a, 0x01, 0x0d, 0xfe, 0xf3, 0xfe, 0xf6, 0xfe, 0x72, 0x01, 0x8e, 0xd1, 0x5e, 0x46, 0x1b, 0xfc, 0xe2, 0x03, 0x1e, 0x22, 0x3f, 0x68, 0xc7, 0xfe, 0x72, 0x04, 0x67, 0xf6, 0xf1, 0xef, 0xf6, 0x8e, 0x01, 0x50, 0x3a, 0x85, 0x8e, 0x01, 0x91, 0x31, 0x52, 0x01, 0x8e, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x03, 0x87, 0x03, 0xe2, 0x00, 0x03, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x02, 0x79, 0x03, 0xe2, 0xfc, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, 0xfe, 0x77, 0x04, 0xe6, 0x05, 0xc1, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x8c, 0x04, 0x5a, 0xd8, 0xfd, 0x56, 0xd8, 0x05, 0xc1, 0xf8, 0xb6, 0x06, 0x7d, 0xf9, 0x83, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, 0xfe, 0x77, 0x04, 0xe6, 0x05, 0xc1, 0x00, 0x07, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x8c, 0xd8, 0x02, 0xaa, 0xd8, 0xfe, 0x77, 0x07, 0x4a, 0xf9, 0x83, 0x06, 0x7d, 0xf8, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x16, 0xfe, 0x77, 0x04, 0xb6, 0x05, 0xc1, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x09, 0x01, 0x21, 0x15, 0x21, 0x35, 0x09, 0x01, 0x32, 0x04, 0x6c, 0xfc, 0xa1, 0x02, 0x5c, 0xfd, 0x90, 0x03, 0x8a, 0xfb, 0x61, 0x02, 0x8d, 0xfd, 0x8f, 0x05, 0xc1, 0xc1, 0xfd, 0x33, 0xfd, 0x04, 0xc0, 0x95, 0x03, 0x21, 0x02, 0xe3, 0x00, 0x01, 0x00, 0xc3, 0x02, 0x2d, 0x05, 0x46, 0x02, 0xd7, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0xd7, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x35, 0x21, 0x15, 0x03, 0x50, 0x97, 0xfe, 0x0a, 0x01, 0xf6, 0x97, 0x01, 0xf5, 0xfe, 0x0b, 0xfd, 0x73, 0x04, 0x82, 0x01, 0x83, 0xaa, 0x01, 0x83, 0xfe, 0x7d, 0xaa, 0x02, 0xd7, 0xaa, 0xaa, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x19, 0x01, 0x33, 0x15, 0x23, 0x03, 0x50, 0x01, 0xf5, 0xfe, 0x0b, 0x97, 0xfe, 0x0a, 0x01, 0xf6, 0x97, 0x97, 0x04, 0xa0, 0xfe, 0x05, 0xaa, 0xfe, 0x05, 0x01, 0xfb, 0xaa, 0x01, 0xfb, 0x01, 0x35, 0xcc, 0xff, 0xff, 0x00, 0x00, 0xff, 0x42, 0x02, 0x6d, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x12, 0x00, 0x00, 0xff, 0xff, 0x01, 0x62, 0xff, 0x92, 0x03, 0xd0, 0x06, 0x25, 0x10, 0x07, 0x00, 0x3f, 0x01, 0x63, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0xeb, 0x00, 0x00, 0x05, 0x1e, 0x05, 0x04, 0x00, 0x11, 0x00, 0x00, 0x01, 0x25, 0x37, 0x05, 0x11, 0x33, 0x11, 0x25, 0x17, 0x0d, 0x01, 0x07, 0x25, 0x11, 0x23, 0x11, 0x05, 0x27, 0x02, 0x6c, 0xfe, 0x7f, 0x4d, 0x01, 0x81, 0x97, 0x01, 0x81, 0x4c, 0xfe, 0x7f, 0x01, 0x81, 0x4c, 0xfe, 0x7f, 0x97, 0xfe, 0x7f, 0x4d, 0x02, 0x82, 0xf7, 0x93, 0xf7, 0x01, 0xef, 0xfe, 0x11, 0xf7, 0x93, 0xf7, 0xf7, 0x93, 0xf7, 0xfe, 0x11, 0x01, 0xef, 0xf7, 0x93, 0x00, 0xff, 0xff, 0x01, 0x23, 0x01, 0x47, 0x03, 0x5f, 0x03, 0xc2, 0x10, 0x07, 0x00, 0x72, 0x00, 0x74, 0xfd, 0xd2, 0x00, 0x00, 0xff, 0xff, 0x01, 0x35, 0x01, 0x59, 0x03, 0x4d, 0x03, 0xa9, 0x10, 0x06, 0x07, 0x57, 0x21, 0x88, 0x00, 0x01, 0x00, 0x36, 0xff, 0xd7, 0x04, 0x97, 0x06, 0x7d, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x01, 0x23, 0x01, 0x07, 0x27, 0x25, 0x13, 0x03, 0xec, 0xaa, 0x67, 0xfd, 0xe9, 0x3b, 0xfe, 0xe1, 0x71, 0x16, 0x00, 0xff, 0xe6, 0x06, 0x7d, 0x60, 0xf9, 0xba, 0x03, 0x73, 0x2d, 0x50, 0x62, 0xfd, 0x3b, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xd7, 0x04, 0x97, 0x07, 0x76, 0x12, 0x26, 0x08, 0xf6, 0x00, 0x00, 0x10, 0x07, 0x00, 0x75, 0x00, 0x68, 0x01, 0x86, 0xff, 0xff, 0x00, 0x36, 0xff, 0xd7, 0x04, 0x97, 0x07, 0x65, 0x12, 0x26, 0x08, 0xf6, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa2, 0x00, 0x68, 0x01, 0x86, 0x00, 0x02, 0x00, 0xc6, 0x00, 0xe5, 0x04, 0x5f, 0x03, 0xe5, 0x00, 0x0b, 0x00, 0x31, 0x00, 0x00, 0x01, 0x32, 0x37, 0x02, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x05, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x12, 0x33, 0x01, 0xda, 0x95, 0x59, 0x72, 0x7c, 0x5a, 0x2e, 0x30, 0x30, 0x33, 0x02, 0xda, 0x46, 0x41, 0x31, 0x31, 0x2e, 0x1c, 0x2c, 0x3d, 0x35, 0x41, 0x69, 0x79, 0x50, 0x55, 0x55, 0x4a, 0x81, 0x42, 0x30, 0x39, 0x27, 0x24, 0x24, 0x3c, 0x35, 0x42, 0x68, 0x44, 0x3a, 0x85, 0x68, 0x72, 0x7b, 0x01, 0x6b, 0xf0, 0x01, 0x06, 0x48, 0x4d, 0x66, 0x70, 0x45, 0x46, 0x02, 0x84, 0x1e, 0x1b, 0x3f, 0x24, 0x54, 0x78, 0x35, 0x40, 0x65, 0x6a, 0xaf, 0xa8, 0x72, 0x65, 0x1e, 0x21, 0x39, 0x33, 0x45, 0x78, 0x35, 0x40, 0x83, 0xf0, 0xfe, 0xfa, 0x00, 0x00, 0x03, 0x00, 0xc6, 0x00, 0xe5, 0x05, 0x3a, 0x03, 0xe5, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x25, 0x32, 0x37, 0x02, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x22, 0x07, 0x12, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x48, 0x1c, 0x2c, 0x3d, 0x35, 0x42, 0x68, 0x79, 0x50, 0x55, 0x55, 0x4b, 0x80, 0x42, 0x30, 0x39, 0x27, 0x24, 0x24, 0x3c, 0x35, 0x43, 0x67, 0x7a, 0x50, 0x54, 0x54, 0x4c, 0x80, 0x41, 0x31, 0x31, 0xfe, 0x64, 0x95, 0x59, 0x72, 0x7c, 0x5a, 0x2e, 0x31, 0x31, 0x33, 0x02, 0xa0, 0x86, 0x67, 0x71, 0x7c, 0x5a, 0x2e, 0x31, 0x31, 0x32, 0x01, 0x5d, 0x24, 0x54, 0x78, 0x35, 0x40, 0x65, 0x6a, 0xaf, 0xa8, 0x72, 0x65, 0x1e, 0x21, 0x39, 0x33, 0x45, 0x78, 0x35, 0x40, 0x65, 0x6a, 0xaf, 0xa8, 0x72, 0x65, 0x1e, 0x1b, 0x4d, 0xf0, 0x01, 0x06, 0x48, 0x4d, 0x66, 0x70, 0x45, 0x46, 0x01, 0xf4, 0xf0, 0xfe, 0xfa, 0x48, 0x4d, 0x66, 0x70, 0x45, 0x46, 0x00, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xcb, 0x05, 0x0a, 0x05, 0x49, 0x00, 0x05, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x21, 0x05, 0x0a, 0xfb, 0xf5, 0x99, 0x03, 0x72, 0xcb, 0x04, 0x7e, 0xfc, 0x2c, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x25, 0x15, 0x21, 0x01, 0x33, 0x01, 0x05, 0xa8, 0xfa, 0xf6, 0x03, 0x59, 0xda, 0xfd, 0x1d, 0xca, 0xca, 0x05, 0xd5, 0xfa, 0xf5, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0x94, 0x05, 0xa9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x26, 0x27, 0x26, 0x27, 0x01, 0x13, 0x01, 0x33, 0x01, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x16, 0x15, 0x23, 0x34, 0x27, 0x21, 0x01, 0x26, 0x27, 0x37, 0x16, 0x03, 0xf0, 0x23, 0x43, 0x3a, 0x4e, 0xfe, 0xec, 0xcc, 0x01, 0x3d, 0xda, 0xfe, 0x78, 0x65, 0x4a, 0x54, 0x26, 0x01, 0x36, 0xfe, 0xe8, 0x04, 0x7e, 0x05, 0xfc, 0x8d, 0x01, 0xd8, 0x1b, 0x1c, 0x48, 0x1a, 0xca, 0x8b, 0x86, 0x73, 0x5e, 0xfe, 0x1e, 0x02, 0xe3, 0x02, 0x28, 0xfd, 0x52, 0x73, 0x93, 0xa7, 0xb0, 0xca, 0x35, 0x37, 0x37, 0x35, 0x03, 0x36, 0x15, 0x14, 0x75, 0x13, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd5, 0xff, 0xfa, 0x05, 0x46, 0x05, 0xd1, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x00, 0x09, 0x01, 0x37, 0x01, 0x26, 0x27, 0x37, 0x16, 0x17, 0x25, 0x15, 0x05, 0x16, 0x07, 0x15, 0x06, 0x07, 0x05, 0x15, 0x25, 0x06, 0x07, 0x27, 0x36, 0x13, 0x09, 0x01, 0x36, 0x37, 0x36, 0x03, 0x1a, 0xfd, 0xbb, 0x02, 0x02, 0x4d, 0x17, 0x1a, 0x7d, 0x1a, 0x17, 0x01, 0xa5, 0xfe, 0xaf, 0x3f, 0x06, 0x06, 0x40, 0x01, 0x5e, 0xfe, 0x54, 0x19, 0x1b, 0x78, 0x1c, 0x6c, 0xfe, 0x14, 0x01, 0xe4, 0x2f, 0x04, 0x06, 0x01, 0x34, 0x01, 0x52, 0xc0, 0x01, 0x57, 0x21, 0x1e, 0x4c, 0x21, 0x24, 0xee, 0xd2, 0xbe, 0xb3, 0xc6, 0x09, 0xa1, 0x93, 0xbf, 0xd2, 0xf1, 0x26, 0x21, 0x4c, 0x20, 0x02, 0xe9, 0xfe, 0xe7, 0xfe, 0xf0, 0x7b, 0x81, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x84, 0xfe, 0x4a, 0x02, 0x15, 0x06, 0x2b, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x01, 0x85, 0x90, 0x90, 0x06, 0x2b, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5b, 0xfe, 0x4a, 0x03, 0x3f, 0x06, 0x2b, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x37, 0x17, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x85, 0x90, 0xe2, 0x48, 0xfe, 0xd6, 0x90, 0xe4, 0x45, 0x02, 0x56, 0x03, 0xd5, 0xfc, 0x9c, 0xb0, 0x6f, 0xe7, 0xfc, 0x29, 0x03, 0x67, 0xb1, 0x6e, 0x00, 0x00, 0x02, 0x00, 0xf4, 0xfe, 0x4a, 0x02, 0xa5, 0x06, 0x2b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0xf5, 0x90, 0x90, 0x01, 0x20, 0x90, 0x90, 0x06, 0x2b, 0xf8, 0x1f, 0x07, 0xe1, 0xf8, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x5b, 0xfe, 0x4a, 0x03, 0x3f, 0x06, 0x2b, 0x00, 0x13, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x37, 0x11, 0x33, 0x11, 0x37, 0x17, 0x07, 0x11, 0x23, 0x11, 0x07, 0x11, 0x23, 0x11, 0x07, 0x27, 0xf5, 0x90, 0x90, 0x90, 0x52, 0x48, 0x9a, 0x90, 0x90, 0x90, 0x54, 0x45, 0x01, 0xe6, 0x04, 0x45, 0xfc, 0x2b, 0x71, 0x03, 0x64, 0xfd, 0x0c, 0x40, 0x6f, 0x78, 0xfb, 0xba, 0x03, 0xd7, 0x70, 0xfc, 0x99, 0x02, 0xf7, 0x41, 0x6e, 0x00, 0x00, 0x01, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x06, 0x00, 0x00, 0x33, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0xee, 0x01, 0x44, 0xe2, 0x01, 0x44, 0xb0, 0xfe, 0xfb, 0xfe, 0xfa, 0x04, 0xa2, 0xfb, 0x5e, 0x03, 0xac, 0xfc, 0x54, 0x00, 0x01, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x06, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0xee, 0xaf, 0x01, 0x06, 0x01, 0x05, 0xb0, 0xfe, 0xbc, 0xe2, 0x04, 0xa2, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0x5e, 0x00, 0x00, 0x01, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x11, 0x00, 0x00, 0x13, 0x10, 0x12, 0x33, 0x32, 0x12, 0x19, 0x01, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0xee, 0xdc, 0xd9, 0xd8, 0xdd, 0x9b, 0x85, 0x95, 0x95, 0x86, 0x9a, 0x02, 0x50, 0x01, 0x28, 0x01, 0x2a, 0xfe, 0xd6, 0xfe, 0xd8, 0xfd, 0xb0, 0x02, 0x37, 0xf4, 0xd3, 0xd3, 0xf4, 0xfd, 0xc9, 0x00, 0x00, 0x01, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x11, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0xee, 0x9a, 0x86, 0x95, 0x95, 0x85, 0x9b, 0xdd, 0xd8, 0xd9, 0xdc, 0x02, 0x52, 0x02, 0x50, 0xfd, 0xc9, 0xf4, 0xd3, 0xd3, 0xf4, 0x02, 0x37, 0xfd, 0xb0, 0xfe, 0xd8, 0xfe, 0xd6, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x15, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x01, 0xb3, 0x07, 0x92, 0x88, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x3a, 0x08, 0x91, 0x88, 0x72, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x04, 0xe2, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfa, 0xb0, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xfe, 0x4d, 0x05, 0x46, 0x06, 0x0e, 0x10, 0x26, 0x09, 0x07, 0x00, 0x00, 0x10, 0x07, 0x09, 0x07, 0x01, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xfe, 0x4d, 0x07, 0x34, 0x06, 0x0e, 0x10, 0x26, 0x09, 0x07, 0x00, 0x00, 0x10, 0x27, 0x09, 0x07, 0x01, 0xee, 0x00, 0x00, 0x10, 0x07, 0x09, 0x07, 0x03, 0xdc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x03, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0xb3, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x7c, 0x37, 0x28, 0x3e, 0x40, 0x21, 0x28, 0xaa, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x04, 0xe2, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0x92, 0x9c, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0xfd, 0x9b, 0x10, 0x2f, 0x48, 0x67, 0x6a, 0x47, 0x24, 0x12, 0xfe, 0x34, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x68, 0x67, 0x48, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x69, 0xfe, 0x4d, 0x05, 0x46, 0x06, 0x0e, 0x00, 0x4d, 0x00, 0x51, 0x00, 0x5a, 0x00, 0x63, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x21, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x21, 0x13, 0x21, 0x03, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x03, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0xb3, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0x01, 0x57, 0x0e, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x0f, 0x34, 0x40, 0x07, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x86, 0x0f, 0x33, 0x40, 0x07, 0x0d, 0xfe, 0xa8, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x7b, 0x01, 0x58, 0x16, 0xfe, 0xa8, 0xab, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x02, 0xbf, 0x13, 0x36, 0x28, 0x3e, 0x40, 0x21, 0x04, 0xe2, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xe2, 0x01, 0x37, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0x92, 0x9c, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x24, 0xfe, 0xc3, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x30, 0x19, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0xfd, 0x92, 0x01, 0xf1, 0xfe, 0x21, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x68, 0x67, 0x48, 0x24, 0x01, 0xba, 0xfe, 0x2b, 0x10, 0x2f, 0x48, 0x67, 0x6a, 0x47, 0x24, 0x00, 0x05, 0x00, 0x69, 0xfe, 0x4d, 0x07, 0x34, 0x06, 0x0e, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x7e, 0x00, 0x87, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x21, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x21, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x13, 0x21, 0x03, 0x29, 0x01, 0x13, 0x21, 0x03, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x03, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0xb3, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0x01, 0x57, 0x0e, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x0f, 0x34, 0x40, 0x07, 0x0c, 0x01, 0x57, 0x0e, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x32, 0x11, 0x85, 0x0f, 0x34, 0x3f, 0x08, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x07, 0x4b, 0x47, 0x43, 0x45, 0x40, 0x32, 0x11, 0x85, 0x0f, 0x33, 0x40, 0x07, 0x0d, 0xfe, 0xa8, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x86, 0x0f, 0x33, 0x40, 0x07, 0x0d, 0xfe, 0xa8, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x03, 0xc1, 0x16, 0xfe, 0xa8, 0x15, 0xfe, 0x11, 0x01, 0x58, 0x16, 0xfe, 0xa8, 0xab, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x04, 0xad, 0x13, 0x36, 0x28, 0x3e, 0x40, 0x21, 0x04, 0xe2, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xe2, 0x01, 0x37, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xe2, 0x01, 0x37, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0x92, 0x9c, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x24, 0xfe, 0xc3, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x24, 0xfe, 0xc3, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x30, 0x19, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0xfd, 0x92, 0x01, 0xf1, 0xfe, 0x0f, 0x01, 0xf1, 0xfe, 0x21, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x68, 0x67, 0x48, 0x24, 0x01, 0xba, 0xfe, 0x2b, 0x10, 0x2f, 0x48, 0x67, 0x6a, 0x47, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4c, 0x03, 0xc3, 0x06, 0x0f, 0x00, 0x33, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x1d, 0x01, 0x37, 0x17, 0x07, 0x23, 0x27, 0x37, 0x17, 0x35, 0x34, 0x27, 0x26, 0x27, 0x03, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x06, 0x07, 0x06, 0x15, 0x23, 0x34, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x34, 0x3f, 0x07, 0x0e, 0x50, 0x38, 0x6c, 0x54, 0x41, 0xab, 0x31, 0xa9, 0x41, 0x53, 0x47, 0x2e, 0x28, 0x27, 0x08, 0x8f, 0x41, 0x47, 0x74, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x27, 0x3a, 0x2a, 0x4d, 0x5c, 0x62, 0x4e, 0x61, 0x10, 0x07, 0x90, 0x40, 0x48, 0x73, 0x12, 0x04, 0xf6, 0x82, 0xaf, 0xfe, 0xb3, 0x18, 0x3f, 0x75, 0x9c, 0x1e, 0x5d, 0x48, 0xbd, 0xbd, 0x48, 0x5d, 0x1e, 0x73, 0x4d, 0x33, 0x0b, 0xfc, 0x67, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x03, 0x88, 0x10, 0x2e, 0x56, 0x72, 0x9b, 0x6d, 0x56, 0x11, 0x01, 0x5f, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0xb4, 0x06, 0x0e, 0x00, 0x08, 0x00, 0x11, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x25, 0x34, 0x27, 0x03, 0x3e, 0x01, 0x37, 0x27, 0x37, 0x13, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x37, 0x17, 0x07, 0x06, 0x07, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x01, 0x8b, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x01, 0x5a, 0x89, 0x14, 0x37, 0x49, 0x08, 0x79, 0x41, 0x61, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x50, 0x44, 0x62, 0x41, 0x41, 0x97, 0x17, 0x36, 0x4d, 0x68, 0x0d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x01, 0x4a, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x67, 0x68, 0x48, 0x24, 0xe6, 0x99, 0x3b, 0xfe, 0x2b, 0x10, 0x65, 0x13, 0x88, 0x48, 0x02, 0x5d, 0x82, 0xaf, 0xfe, 0xd6, 0x16, 0x4d, 0x6f, 0x7c, 0x48, 0x48, 0xa7, 0x43, 0x3f, 0x5a, 0x13, 0xfe, 0xbe, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0x01, 0x3c, 0xa4, 0x88, 0x7a, 0x8f, 0x00, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0xb6, 0x06, 0x0e, 0x00, 0x08, 0x00, 0x12, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x2e, 0x01, 0x27, 0x03, 0x3e, 0x01, 0x37, 0x07, 0x27, 0x13, 0x26, 0x23, 0x22, 0x07, 0x03, 0x1e, 0x01, 0x1f, 0x01, 0x07, 0x27, 0x14, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x01, 0x8b, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x01, 0x49, 0x20, 0x30, 0x28, 0x14, 0x37, 0x5f, 0x06, 0x4b, 0x40, 0xa0, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x59, 0x7d, 0x10, 0x94, 0x41, 0x44, 0xae, 0x68, 0x0d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x01, 0x4a, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x67, 0x68, 0x48, 0x24, 0x01, 0x36, 0x42, 0x30, 0x12, 0xfe, 0x2b, 0x10, 0x82, 0x40, 0x54, 0x48, 0x02, 0xef, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x9d, 0x3f, 0xa4, 0x48, 0x4b, 0x7c, 0xc0, 0x13, 0xfe, 0xbe, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0x01, 0x3c, 0xa4, 0x88, 0x7a, 0x8f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0x00, 0xcd, 0x04, 0x28, 0x04, 0xd5, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xa8, 0xfe, 0x85, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xa5, 0xfe, 0x85, 0x10, 0x07, 0x09, 0xa1, 0x01, 0x26, 0x01, 0x8f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0x00, 0xcd, 0x04, 0x28, 0x04, 0xd5, 0x10, 0x27, 0x09, 0xa1, 0x01, 0x26, 0xfe, 0x85, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xa5, 0x01, 0x8f, 0x10, 0x07, 0x09, 0xa1, 0xff, 0xa8, 0x01, 0x8f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0x00, 0xcd, 0x01, 0x4f, 0x04, 0xd6, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xcc, 0x01, 0x90, 0x10, 0x07, 0x09, 0xa1, 0xff, 0xcc, 0xfe, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0x00, 0xcd, 0x04, 0x28, 0x04, 0xd5, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xa5, 0x01, 0x8f, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xa8, 0x01, 0x8f, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xa5, 0xfe, 0x85, 0x10, 0x07, 0x09, 0xa1, 0xff, 0xa8, 0xfe, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0x02, 0x2d, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x27, 0x09, 0xa1, 0x01, 0xdf, 0x01, 0x24, 0x10, 0x06, 0x08, 0xee, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x9f, 0x05, 0x46, 0x04, 0x6a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x05, 0x21, 0x15, 0x21, 0x04, 0x87, 0xbe, 0xbe, 0x01, 0xbe, 0xbe, 0xfc, 0x3b, 0x03, 0x03, 0xfc, 0xfd, 0x01, 0x9d, 0xfe, 0x03, 0xcb, 0xfe, 0x95, 0xaa, 0x00, 0xff, 0xff, 0x00, 0xc2, 0x00, 0x9f, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x26, 0x08, 0xee, 0x00, 0x00, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfd, 0xfe, 0x57, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0x01, 0x24, 0x10, 0x27, 0x09, 0xa1, 0x03, 0xc2, 0xfe, 0x57, 0x10, 0x07, 0x09, 0xa1, 0x03, 0xc3, 0x01, 0x24, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x9f, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x26, 0x09, 0x18, 0x00, 0x00, 0x10, 0x27, 0x09, 0xa1, 0x01, 0xde, 0xfe, 0x57, 0x10, 0x07, 0x09, 0xa1, 0x01, 0xdf, 0x01, 0x24, 0x00, 0x01, 0x00, 0xc3, 0x01, 0xd3, 0x05, 0x46, 0x03, 0x32, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x03, 0x32, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x00, 0x01, 0x00, 0xc3, 0x01, 0xd3, 0x05, 0x46, 0x03, 0x32, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0xc3, 0x5d, 0x98, 0x4e, 0x54, 0x8c, 0x0d, 0x05, 0x05, 0x0a, 0x84, 0x63, 0x58, 0xa1, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x06, 0x09, 0x84, 0x63, 0x57, 0xa1, 0x5f, 0x03, 0x32, 0x55, 0x4b, 0x3d, 0x06, 0x02, 0x02, 0x05, 0x3b, 0x45, 0x4e, 0xb3, 0x54, 0x4c, 0x3d, 0x06, 0x02, 0x03, 0x04, 0x3b, 0x45, 0x4e, 0x00, 0x01, 0x00, 0x91, 0x01, 0x31, 0x05, 0x77, 0x03, 0xd4, 0x00, 0x29, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x1e, 0x01, 0x33, 0x15, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x2e, 0x01, 0x23, 0x37, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x02, 0xe7, 0x49, 0x8f, 0x40, 0x4a, 0x5a, 0x01, 0x5e, 0x46, 0x5f, 0x8c, 0x53, 0x5a, 0x80, 0x63, 0x6c, 0xaf, 0x37, 0x3a, 0x9e, 0x41, 0x4a, 0x5a, 0x02, 0x5e, 0x46, 0x01, 0x5e, 0x8d, 0x53, 0x5a, 0x80, 0x63, 0x6c, 0xb1, 0x02, 0x2e, 0x74, 0x74, 0x6c, 0x48, 0x3d, 0x59, 0x9b, 0x4f, 0x9a, 0x48, 0x4c, 0xa2, 0x5c, 0x7d, 0x58, 0x5b, 0x8d, 0x6c, 0x48, 0x3d, 0x59, 0x9b, 0x4f, 0x9a, 0x48, 0x4c, 0xa2, 0x5c, 0x7d, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x57, 0x05, 0x46, 0x04, 0xad, 0x00, 0x11, 0x00, 0x00, 0x01, 0x02, 0x23, 0x22, 0x03, 0x02, 0x27, 0x22, 0x03, 0x23, 0x12, 0x33, 0x32, 0x13, 0x12, 0x17, 0x32, 0x13, 0x05, 0x45, 0x6f, 0xe2, 0xcf, 0x59, 0x5c, 0x5c, 0x68, 0x50, 0x99, 0x6f, 0xe2, 0xcf, 0x5a, 0x5b, 0x5c, 0x68, 0x50, 0x02, 0xd7, 0xfd, 0x80, 0x01, 0xd6, 0x01, 0xdc, 0x01, 0xfe, 0x23, 0x02, 0x80, 0xfe, 0x2a, 0xfe, 0x24, 0x01, 0x01, 0xdd, 0x00, 0x00, 0x01, 0x00, 0xbb, 0x00, 0x00, 0x01, 0xf8, 0x05, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x23, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x01, 0xf8, 0xa2, 0x46, 0x3d, 0x34, 0x03, 0x04, 0x02, 0x05, 0x36, 0x44, 0x4c, 0xa2, 0x46, 0x3e, 0x35, 0x05, 0x02, 0x02, 0x05, 0x36, 0x43, 0x68, 0xb4, 0x60, 0x6e, 0x92, 0x0a, 0x08, 0x06, 0x0e, 0x9c, 0x5e, 0x58, 0xac, 0x62, 0x6a, 0xb2, 0x62, 0x6e, 0x92, 0x0c, 0x04, 0x06, 0x10, 0x9a, 0x5e, 0x56, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9d, 0x05, 0x46, 0x04, 0x6c, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x13, 0x17, 0x03, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x03, 0x27, 0x02, 0x9c, 0x5a, 0x3c, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x54, 0x6c, 0x9c, 0x8b, 0x97, 0x5b, 0x3e, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x56, 0x6d, 0x9a, 0x8b, 0x02, 0x53, 0x20, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x2b, 0x01, 0x7e, 0x46, 0xfe, 0x8c, 0x20, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x2c, 0xfe, 0x85, 0x46, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x10, 0x05, 0x46, 0x03, 0xa2, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x6f, 0xb3, 0x4e, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x01, 0x88, 0xa8, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x03, 0xf4, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xf4, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x09, 0x3d, 0x4b, 0xfe, 0x6b, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x62, 0x05, 0x46, 0x04, 0xd3, 0x00, 0x25, 0x00, 0x26, 0x00, 0x00, 0x01, 0x03, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x23, 0x35, 0x21, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x13, 0x01, 0x04, 0x83, 0xb7, 0x1c, 0x21, 0x41, 0x53, 0x9d, 0x0b, 0x5e, 0xa1, 0x58, 0x3b, 0x48, 0x82, 0x02, 0x5c, 0xfd, 0x3e, 0xa7, 0x7b, 0x61, 0xff, 0x01, 0x70, 0xa6, 0x83, 0x50, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x2d, 0xd7, 0xfd, 0xbe, 0x04, 0x6f, 0xfe, 0xe9, 0x0b, 0x2d, 0x58, 0x22, 0xb2, 0x4f, 0x45, 0x16, 0xba, 0xaa, 0xfe, 0x64, 0x9a, 0xaa, 0xf3, 0x38, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x16, 0x01, 0x49, 0xfc, 0x8d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0xb8, 0x05, 0x46, 0x04, 0xc1, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0xc1, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0xfe, 0x6b, 0xaa, 0xcb, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x18, 0x05, 0x46, 0x04, 0xc1, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x33, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0xfc, 0xab, 0xd0, 0x01, 0x6d, 0xbc, 0xfd, 0xd7, 0x02, 0xca, 0x7e, 0x64, 0x11, 0xe7, 0xfe, 0x77, 0xbb, 0x02, 0x44, 0xfd, 0x1b, 0x95, 0x64, 0x04, 0xc1, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0xfc, 0x4c, 0xaa, 0xcb, 0xaa, 0x8a, 0x73, 0x17, 0xaa, 0xcb, 0xaa, 0xa0, 0x73, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xf6, 0x05, 0x46, 0x05, 0x42, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x37, 0x17, 0x03, 0xf2, 0x09, 0x08, 0x43, 0x57, 0x42, 0x66, 0x5e, 0xa1, 0x58, 0x23, 0x27, 0x52, 0x01, 0xf3, 0xfd, 0xbb, 0x62, 0x02, 0xa7, 0xfd, 0x08, 0x5e, 0x83, 0x37, 0xe0, 0x01, 0x32, 0x62, 0xfe, 0x6c, 0x01, 0xe6, 0x6a, 0x2d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x59, 0x78, 0x84, 0x04, 0x22, 0x01, 0x25, 0x1e, 0x5d, 0xb2, 0x4f, 0x45, 0x07, 0xab, 0xaa, 0xcb, 0xaa, 0xc2, 0x4e, 0x74, 0xaa, 0xcb, 0xaa, 0xda, 0x14, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x25, 0xfa, 0x4e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x10, 0x05, 0x46, 0x03, 0xf4, 0x00, 0x1d, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x08, 0x05, 0x06, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x02, 0x6f, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x01, 0xda, 0xb2, 0x4f, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x04, 0x02, 0x03, 0x06, 0x3d, 0x4b, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x05, 0x05, 0x46, 0x04, 0xff, 0x00, 0x34, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x03, 0x27, 0x13, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x32, 0x1f, 0x01, 0x13, 0x17, 0x03, 0xa9, 0x33, 0x27, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x39, 0x45, 0x42, 0x84, 0x51, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x76, 0x70, 0x11, 0x7f, 0x94, 0x7c, 0x33, 0x27, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x3a, 0x45, 0x41, 0x83, 0x51, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0xae, 0x91, 0x10, 0x7f, 0x93, 0x03, 0x61, 0x0d, 0x4b, 0x55, 0xb2, 0x4f, 0x45, 0x14, 0xbb, 0x38, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x09, 0xfe, 0x98, 0x40, 0x01, 0x5e, 0x0d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x14, 0xbb, 0x38, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x07, 0x01, 0x66, 0x40, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0xb8, 0x05, 0x46, 0x04, 0xc9, 0x00, 0x1a, 0x00, 0x35, 0x00, 0x39, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa2, 0x57, 0x65, 0x81, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0xb2, 0x2e, 0x4d, 0x98, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x4c, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0x01, 0xd2, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0xfc, 0xee, 0xaa, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x79, 0x05, 0x46, 0x04, 0xd1, 0x00, 0x1a, 0x00, 0x35, 0x00, 0x50, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa2, 0x57, 0x65, 0x81, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0xb2, 0x2e, 0x4d, 0x98, 0x01, 0xd7, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0x01, 0xd2, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0x01, 0xd2, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0x00, 0x03, 0x00, 0xc3, 0x00, 0xb8, 0x05, 0x46, 0x04, 0xc1, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x3f, 0x02, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x26, 0x27, 0x01, 0x15, 0x21, 0x35, 0x01, 0x15, 0x21, 0x35, 0xc3, 0x5d, 0x98, 0x4e, 0x54, 0x8c, 0x13, 0x0e, 0x84, 0x63, 0x58, 0xa1, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x0f, 0x84, 0x63, 0x57, 0xa1, 0x5f, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0xc1, 0x55, 0x4b, 0x3f, 0x07, 0x06, 0x3b, 0x45, 0x4e, 0xb2, 0x53, 0x4c, 0x3d, 0x06, 0x02, 0x07, 0x3b, 0x45, 0x4f, 0xfe, 0xc8, 0xaa, 0xaa, 0xfe, 0x8b, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc2, 0x00, 0xd7, 0x05, 0x46, 0x04, 0x2b, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x01, 0x20, 0x25, 0x35, 0x04, 0x05, 0x20, 0x25, 0x15, 0x04, 0x05, 0x20, 0x05, 0x15, 0x24, 0x25, 0x04, 0x05, 0x35, 0x24, 0x03, 0x05, 0xfe, 0xfe, 0xfe, 0xbf, 0x01, 0x43, 0x01, 0x00, 0x01, 0x09, 0x01, 0x36, 0xfe, 0xc5, 0xfe, 0xfd, 0x01, 0x07, 0x01, 0x38, 0xfe, 0xc6, 0xfe, 0xfb, 0xfe, 0xfd, 0xfe, 0xc0, 0x01, 0x44, 0x02, 0xd3, 0xa6, 0xb2, 0x95, 0x11, 0xa6, 0xb2, 0x97, 0xb3, 0xa6, 0xb2, 0x97, 0x0f, 0x02, 0xa4, 0xb2, 0x97, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x36, 0x05, 0x46, 0x04, 0xce, 0x00, 0x1c, 0x00, 0x39, 0x00, 0x00, 0x25, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x15, 0x23, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x35, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x13, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x15, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x03, 0x05, 0x3c, 0x29, 0x32, 0x1b, 0x18, 0x04, 0x01, 0x72, 0xef, 0x0d, 0x1a, 0x31, 0x4d, 0x50, 0xb9, 0x51, 0x4d, 0x31, 0x1b, 0x0b, 0xf0, 0x01, 0x73, 0x04, 0x18, 0x1b, 0x32, 0x29, 0x3d, 0x3d, 0x29, 0x32, 0x1b, 0x18, 0x04, 0xfe, 0x8d, 0xf0, 0x0b, 0x1b, 0x31, 0x4d, 0x51, 0xb9, 0x50, 0x4d, 0x31, 0x1a, 0x0d, 0xef, 0xfe, 0x8e, 0x04, 0x18, 0x1b, 0x32, 0x29, 0xd9, 0x04, 0x1e, 0x2c, 0x43, 0x45, 0x5b, 0xa8, 0x3c, 0x30, 0x5b, 0x32, 0x33, 0x33, 0x32, 0x5b, 0x33, 0x39, 0xa8, 0x5c, 0x44, 0x44, 0x2b, 0x1e, 0x03, 0x4e, 0x04, 0x1e, 0x2b, 0x44, 0x44, 0x5c, 0xa8, 0x39, 0x33, 0x5b, 0x32, 0x33, 0x33, 0x32, 0x5b, 0x30, 0x3c, 0xa8, 0x5b, 0x45, 0x43, 0x2c, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x04, 0xce, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x15, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x15, 0x21, 0x03, 0x05, 0x3d, 0x29, 0x32, 0x1b, 0x18, 0x04, 0xfe, 0x8d, 0xf0, 0x0b, 0x1b, 0x31, 0x4d, 0x51, 0xb9, 0x50, 0x4d, 0x31, 0x1a, 0x0d, 0xef, 0xfe, 0x8e, 0x04, 0x18, 0x1b, 0x32, 0x29, 0xfd, 0x82, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x2b, 0x04, 0x1e, 0x2b, 0x44, 0x44, 0x5c, 0xa8, 0x39, 0x33, 0x5b, 0x32, 0x33, 0x33, 0x32, 0x5b, 0x30, 0x3c, 0xa8, 0x5b, 0x45, 0x43, 0x2c, 0x1e, 0xfd, 0xe3, 0xaa, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x04, 0xff, 0x10, 0x27, 0x09, 0xa1, 0x01, 0xe0, 0x01, 0xb9, 0x10, 0x06, 0x00, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x02, 0x05, 0x46, 0x04, 0xff, 0x10, 0x27, 0x09, 0xa1, 0x01, 0xde, 0xfd, 0xba, 0x10, 0x26, 0x00, 0x20, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x01, 0xdf, 0x01, 0xb9, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x05, 0x05, 0x48, 0x04, 0xff, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0x01, 0xb9, 0x10, 0x26, 0x00, 0x20, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x03, 0xc5, 0xfd, 0xbd, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x05, 0x05, 0x47, 0x04, 0xff, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0xfd, 0xbd, 0x10, 0x26, 0x00, 0x20, 0x02, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x03, 0xc3, 0x01, 0xb9, 0xff, 0xff, 0x00, 0xba, 0x01, 0x36, 0x06, 0x7a, 0x03, 0xcf, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xf5, 0xfe, 0xee, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xf5, 0x00, 0x89, 0x10, 0x07, 0x00, 0x20, 0x01, 0x35, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb8, 0x01, 0x36, 0x06, 0x7b, 0x03, 0xcc, 0x10, 0x26, 0x00, 0x20, 0xf5, 0x00, 0x10, 0x27, 0x09, 0xa1, 0x04, 0xf8, 0x00, 0x86, 0x10, 0x07, 0x09, 0xa1, 0x04, 0xf8, 0xfe, 0xee, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x03, 0xa2, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x17, 0x33, 0x36, 0x35, 0x26, 0x27, 0x17, 0x21, 0x15, 0x21, 0x35, 0x21, 0x26, 0x35, 0x34, 0x37, 0x21, 0x35, 0x21, 0x15, 0x21, 0x16, 0x17, 0x14, 0x02, 0x9c, 0x2f, 0x2e, 0xda, 0x2f, 0x01, 0x2e, 0x7e, 0x01, 0x52, 0xfb, 0x7e, 0x01, 0x58, 0x16, 0x18, 0xfe, 0xa6, 0x04, 0x82, 0xfe, 0xaf, 0x17, 0x01, 0x02, 0xfa, 0x30, 0x49, 0x47, 0x30, 0x30, 0x47, 0x47, 0x32, 0xf0, 0xaa, 0xaa, 0x3f, 0x38, 0x3e, 0x3b, 0xa8, 0xa8, 0x1a, 0x5f, 0x38, 0x00, 0x00, 0x04, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x15, 0x00, 0x03, 0x00, 0x07, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x27, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x45, 0x41, 0x5a, 0x5a, 0x83, 0x5a, 0x5b, 0x41, 0x35, 0x60, 0x24, 0x25, 0x26, 0x98, 0x6d, 0x6f, 0x93, 0x96, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0x44, 0x62, 0x46, 0x45, 0x60, 0x60, 0x8b, 0x62, 0x71, 0x2b, 0x28, 0x28, 0x64, 0x3a, 0x73, 0xa1, 0x9e, 0x76, 0x76, 0xa3, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x15, 0x26, 0x23, 0x06, 0x07, 0x35, 0x36, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x42, 0xe7, 0xca, 0xca, 0xe7, 0xe5, 0xce, 0xd2, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x03, 0xeb, 0x97, 0xb2, 0x97, 0x02, 0x95, 0xb2, 0x97, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x7f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x13, 0x33, 0x13, 0x23, 0x0b, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0x07, 0xea, 0xa2, 0xe9, 0x8f, 0xab, 0xa5, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x02, 0x82, 0x02, 0x9d, 0xfd, 0x63, 0x01, 0xd9, 0xfe, 0x27, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x7f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0x07, 0x96, 0xa5, 0xab, 0x8f, 0xe9, 0xa2, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x05, 0x1f, 0xfe, 0x27, 0x01, 0xd9, 0xfd, 0x63, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0xca, 0x00, 0x03, 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x07, 0x13, 0x27, 0x07, 0x13, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0xe1, 0x01, 0x0d, 0x54, 0x55, 0x01, 0x0c, 0xda, 0x55, 0xdc, 0xdb, 0x54, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0x4e, 0x01, 0x1c, 0xfe, 0xe4, 0xb0, 0xfe, 0xe4, 0xb0, 0xb0, 0x01, 0x1c, 0x00, 0x00, 0x04, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0xd4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x03, 0x21, 0x03, 0x33, 0x01, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x42, 0x95, 0x01, 0x2c, 0xc8, 0x64, 0x01, 0x04, 0xfd, 0x94, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0xc0, 0xfe, 0x4e, 0x02, 0x66, 0xfd, 0x1f, 0x00, 0x07, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x1c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x30, 0x00, 0x37, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x03, 0x15, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x35, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x16, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x2d, 0x38, 0x21, 0x18, 0x62, 0x62, 0x3c, 0x39, 0x39, 0x39, 0x3d, 0xd6, 0xfe, 0xee, 0x46, 0x3b, 0x23, 0x41, 0x1f, 0x20, 0x43, 0x23, 0x57, 0x65, 0x60, 0x52, 0x49, 0x55, 0x3c, 0x36, 0x2c, 0x31, 0x41, 0xb3, 0x3c, 0x3c, 0x12, 0x3a, 0x28, 0x41, 0x53, 0x53, 0x41, 0x28, 0x3a, 0xb9, 0x36, 0x5f, 0x36, 0x36, 0x5f, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0xbc, 0x37, 0x1e, 0x24, 0x24, 0x33, 0xfe, 0xa0, 0x01, 0x60, 0x33, 0x1c, 0x44, 0x3d, 0xfe, 0xaa, 0x20, 0x44, 0x48, 0x13, 0x12, 0x3e, 0x0f, 0x10, 0x70, 0x60, 0x63, 0x74, 0x69, 0x47, 0x36, 0x42, 0x3f, 0x39, 0x69, 0xda, 0xfd, 0xd0, 0x3d, 0x24, 0x23, 0x74, 0xbe, 0x75, 0x23, 0x67, 0x93, 0x53, 0x53, 0x93, 0x53, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x5c, 0x1e, 0x54, 0x38, 0x4d, 0x52, 0x50, 0x32, 0x33, 0x3e, 0x49, 0x50, 0x32, 0x34, 0x3d, 0x48, 0x51, 0x51, 0x1b, 0x4d, 0x35, 0x35, 0x4a, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0x3d, 0x3d, 0x3a, 0x78, 0x6f, 0xfe, 0xb5, 0x01, 0x48, 0x4f, 0x4d, 0x5d, 0x51, 0xfe, 0xca, 0x01, 0x48, 0x50, 0x4c, 0x5e, 0x50, 0xfe, 0xca, 0x02, 0x25, 0x55, 0x32, 0x30, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0xda, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x33, 0x15, 0x23, 0x37, 0x23, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x15, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0xfc, 0x5b, 0x5b, 0x58, 0x56, 0x1a, 0x28, 0x29, 0x19, 0x17, 0x3b, 0x30, 0x24, 0x50, 0x2c, 0x2a, 0x57, 0x2e, 0x53, 0x65, 0x21, 0x28, 0x28, 0x15, 0x12, 0x03, 0x03, 0x03, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x03, 0x01, 0x7f, 0xc8, 0x4e, 0x32, 0x41, 0x2b, 0x2c, 0x1b, 0x2f, 0x18, 0x2d, 0x37, 0x23, 0x21, 0x5e, 0x1c, 0x1c, 0x61, 0x4f, 0x26, 0x45, 0x2b, 0x2b, 0x17, 0x1b, 0x0d, 0x0a, 0x1e, 0x1a, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x27, 0x05, 0x46, 0x04, 0xdd, 0x00, 0x13, 0x00, 0x00, 0x13, 0x21, 0x13, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0xc3, 0x02, 0xb7, 0xe6, 0x71, 0x9d, 0x01, 0x11, 0xfe, 0x74, 0xaf, 0x02, 0x3b, 0xfd, 0x47, 0xe8, 0x70, 0x9c, 0xfe, 0xf3, 0x01, 0x8b, 0xaf, 0xfd, 0xc6, 0x03, 0xa2, 0x01, 0x3b, 0x66, 0xd5, 0xa8, 0xf0, 0xaa, 0xfe, 0xc7, 0x66, 0xd3, 0xaa, 0xf0, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0xb8, 0x05, 0x46, 0x04, 0x4c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0xd7, 0xaa, 0x02, 0x1f, 0xaa, 0xfd, 0xc0, 0xaa, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xce, 0x05, 0x46, 0x05, 0x34, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x03, 0x39, 0xfd, 0x8a, 0x02, 0xc9, 0x73, 0x8a, 0x49, 0x01, 0x05, 0xfe, 0xa7, 0x66, 0x01, 0xbf, 0xfd, 0xf0, 0x63, 0x02, 0x73, 0xfd, 0x38, 0x74, 0x8a, 0x4a, 0xfe, 0xfa, 0x01, 0x5b, 0x64, 0xfe, 0x41, 0x02, 0x11, 0x03, 0xa2, 0xaa, 0xe8, 0x54, 0x94, 0xaa, 0xcb, 0xaa, 0xcb, 0xaa, 0xea, 0x54, 0x96, 0xaa, 0xcb, 0xaa, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x09, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x94, 0xaa, 0x02, 0x1f, 0xaa, 0xfc, 0x4b, 0xaa, 0x02, 0x1f, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x09, 0x01, 0x21, 0x15, 0x21, 0x05, 0x45, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xf8, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0xfc, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0x15, 0x21, 0x35, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x61, 0x01, 0x21, 0xfb, 0x7e, 0x03, 0xf8, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0xfd, 0xc7, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0xff, 0x56, 0x05, 0x46, 0x05, 0x1b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x33, 0x21, 0x15, 0x21, 0x09, 0x02, 0x15, 0x01, 0x35, 0x09, 0x01, 0x21, 0x15, 0x21, 0xc4, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0xaa, 0x05, 0x15, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0xfc, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0xff, 0x56, 0x05, 0x46, 0x05, 0x1b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x15, 0x21, 0x35, 0x11, 0x35, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0x15, 0x21, 0x35, 0x05, 0x46, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0x22, 0xfb, 0x7e, 0xaa, 0xaa, 0x04, 0x6b, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0xfd, 0xc7, 0xaa, 0xaa, 0x00, 0x02, 0x00, 0xc4, 0xfe, 0xb1, 0x05, 0x46, 0x05, 0x1b, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x01, 0xf0, 0xfe, 0xd4, 0x01, 0xab, 0x56, 0xfd, 0xff, 0x02, 0x81, 0x7b, 0x7c, 0x24, 0x01, 0x2e, 0xfe, 0x52, 0x56, 0x02, 0x04, 0xfd, 0x7d, 0x7c, 0x7c, 0x03, 0x7b, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xaa, 0xaa, 0x73, 0xaa, 0xa4, 0x73, 0x31, 0xaa, 0x73, 0xaa, 0xa5, 0x74, 0x05, 0x46, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc4, 0xfe, 0xb1, 0x05, 0x46, 0x05, 0x1b, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x01, 0xf0, 0xfe, 0xd4, 0x01, 0xab, 0x56, 0xfd, 0xff, 0x02, 0x81, 0x7b, 0x7c, 0x24, 0x01, 0x2e, 0xfe, 0x52, 0x56, 0x02, 0x04, 0xfd, 0x7d, 0x7c, 0x7c, 0xfe, 0xf9, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xaa, 0xaa, 0x73, 0xaa, 0xa4, 0x73, 0x31, 0xaa, 0x73, 0xaa, 0xa5, 0x74, 0x05, 0x46, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x02, 0x00, 0x85, 0x00, 0x2e, 0x07, 0x04, 0x04, 0xdf, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x07, 0x04, 0xfd, 0x19, 0x02, 0xe7, 0xfc, 0x36, 0x03, 0xca, 0xfd, 0x4c, 0xfd, 0x18, 0x02, 0xe8, 0xfc, 0x36, 0x03, 0xca, 0x04, 0x11, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0xce, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0x00, 0x02, 0x00, 0x85, 0x00, 0x2e, 0x07, 0x04, 0x04, 0xdf, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x86, 0x03, 0xca, 0xfc, 0x36, 0x02, 0xe7, 0x33, 0x03, 0xca, 0xfc, 0x36, 0x02, 0xe7, 0x04, 0x11, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x01, 0x90, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0xb9, 0x06, 0x12, 0x00, 0x19, 0x00, 0x27, 0x00, 0x00, 0x01, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x21, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x13, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x10, 0x17, 0x16, 0x02, 0x3c, 0x26, 0x1f, 0x50, 0x2f, 0x43, 0x43, 0x2f, 0x50, 0x1f, 0x26, 0xfe, 0xe0, 0x25, 0x1f, 0x50, 0x2f, 0x43, 0x43, 0x2f, 0x50, 0x1f, 0x25, 0x90, 0x13, 0x0f, 0x3b, 0x3a, 0x10, 0x13, 0x14, 0x10, 0x3a, 0x3b, 0x0f, 0x06, 0x12, 0x47, 0x46, 0xa3, 0x9e, 0xe2, 0xdf, 0xe0, 0xe3, 0x9e, 0xa2, 0x47, 0x47, 0x47, 0x47, 0xa2, 0x9e, 0xe3, 0xe0, 0xdf, 0xe2, 0x9e, 0xa3, 0x46, 0x47, 0xfa, 0x32, 0x3b, 0x3b, 0xe2, 0x01, 0xce, 0xe1, 0x3b, 0x3c, 0x3c, 0x3b, 0xe1, 0xfe, 0x32, 0xe2, 0x3b, 0x00, 0x00, 0x01, 0x00, 0xc2, 0x00, 0x1a, 0x05, 0x46, 0x04, 0xe8, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x06, 0x07, 0x35, 0x36, 0x3f, 0x01, 0x26, 0x25, 0x35, 0x04, 0x37, 0x13, 0x17, 0x07, 0x36, 0x37, 0x15, 0x06, 0x0f, 0x01, 0x16, 0x05, 0x15, 0x24, 0x07, 0x03, 0x27, 0x02, 0x1b, 0xa2, 0xb5, 0xee, 0xca, 0x5b, 0xf0, 0xfe, 0xdc, 0x01, 0x86, 0xe6, 0xb1, 0x85, 0x79, 0xa4, 0xb5, 0xec, 0xcd, 0x5a, 0xf5, 0x01, 0x1f, 0xfe, 0x79, 0xe6, 0xb0, 0x86, 0x01, 0x5d, 0x29, 0x5d, 0xb2, 0x6f, 0x26, 0xb6, 0x0e, 0x97, 0xb2, 0xaf, 0x0a, 0x01, 0x62, 0x52, 0xf4, 0x29, 0x60, 0xb2, 0x71, 0x25, 0xb5, 0x0d, 0x98, 0xb2, 0xaf, 0x0b, 0xfe, 0x9f, 0x52, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x05, 0x05, 0x46, 0x05, 0x64, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x05, 0x15, 0x25, 0x03, 0x27, 0x13, 0x25, 0x35, 0x01, 0x13, 0x17, 0x07, 0x25, 0x15, 0x05, 0x07, 0x0d, 0x01, 0x03, 0x40, 0x02, 0x05, 0xfd, 0xbb, 0x8a, 0x7a, 0x85, 0xfe, 0x42, 0x02, 0xcc, 0x9b, 0x7b, 0x62, 0x01, 0x02, 0xfe, 0xa1, 0xb4, 0xfe, 0x72, 0x01, 0x1d, 0x01, 0xdf, 0xcb, 0xb6, 0xea, 0xfe, 0xbd, 0x40, 0x01, 0x36, 0xb4, 0xa6, 0x01, 0x20, 0x01, 0x6f, 0x40, 0xe6, 0x68, 0xb6, 0x8b, 0x47, 0x9d, 0x70, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xa0, 0x05, 0x46, 0x04, 0xff, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x25, 0x35, 0x05, 0x13, 0x17, 0x03, 0x05, 0x15, 0x01, 0x03, 0x27, 0x37, 0x05, 0x35, 0x25, 0x37, 0x2d, 0x01, 0x02, 0xc8, 0xfd, 0xfb, 0x02, 0x46, 0x89, 0x7a, 0x84, 0x01, 0xbd, 0xfd, 0x35, 0x9c, 0x7a, 0x62, 0xfe, 0xfd, 0x01, 0x5f, 0xb4, 0x01, 0x8e, 0xfe, 0xe4, 0x03, 0x25, 0xcb, 0xb6, 0xea, 0x01, 0x43, 0x40, 0xfe, 0xca, 0xb4, 0xa6, 0xfe, 0xe0, 0xfe, 0x91, 0x40, 0xe6, 0x68, 0xb6, 0x8b, 0x47, 0x9d, 0x70, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x2f, 0x05, 0x46, 0x05, 0x56, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x0d, 0x01, 0x03, 0x21, 0x35, 0x21, 0x13, 0x25, 0x35, 0x25, 0x13, 0x17, 0x07, 0x25, 0x15, 0x05, 0x03, 0x05, 0x15, 0x25, 0x03, 0x21, 0x15, 0x21, 0x07, 0x27, 0x03, 0x37, 0xfe, 0xae, 0x01, 0x11, 0xdc, 0xfe, 0xa9, 0x01, 0x91, 0x6c, 0xfe, 0x03, 0x02, 0xb6, 0x6a, 0x94, 0x41, 0x01, 0x0f, 0xfe, 0xaf, 0x67, 0x01, 0xb8, 0xfe, 0x12, 0x5c, 0x02, 0x4a, 0xfd, 0x7d, 0x45, 0x93, 0x03, 0x4f, 0x6c, 0x55, 0xfd, 0x72, 0xaa, 0x01, 0x43, 0xa2, 0xaa, 0xdd, 0x01, 0x40, 0x3d, 0xc7, 0x56, 0xb0, 0x6c, 0xfe, 0xd1, 0x8c, 0xb2, 0x9e, 0xfe, 0xed, 0xaa, 0xd1, 0x3d, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x2f, 0x05, 0x46, 0x05, 0x56, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x37, 0x27, 0x01, 0x23, 0x35, 0x21, 0x37, 0x05, 0x35, 0x25, 0x37, 0x25, 0x35, 0x05, 0x13, 0x17, 0x03, 0x05, 0x15, 0x05, 0x03, 0x21, 0x15, 0x21, 0x07, 0x27, 0x03, 0x36, 0xee, 0xc0, 0xfe, 0x4d, 0xee, 0x01, 0x27, 0x4e, 0xfe, 0x8b, 0x01, 0xb7, 0x52, 0xfd, 0xf7, 0x02, 0x3f, 0x77, 0x94, 0x73, 0x01, 0xab, 0xfd, 0xaf, 0x62, 0x02, 0xb3, 0xfd, 0x14, 0x46, 0x94, 0x02, 0x97, 0x4c, 0x3e, 0xfc, 0xdf, 0xaa, 0xec, 0x77, 0xb2, 0x8b, 0xf5, 0xa7, 0xb0, 0xb7, 0x01, 0x65, 0x3d, 0xfe, 0xa8, 0x88, 0xaa, 0xbd, 0xfe, 0xd8, 0xaa, 0xd1, 0x3d, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x90, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x57, 0x63, 0x84, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa1, 0x58, 0x63, 0x84, 0x0a, 0x04, 0x06, 0x0d, 0x8c, 0x54, 0x4e, 0x98, 0x5c, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xf0, 0xb4, 0x4e, 0x44, 0x3a, 0x04, 0x04, 0x02, 0x06, 0x3c, 0x4c, 0x54, 0xb4, 0x4e, 0x44, 0x3a, 0x06, 0x02, 0x02, 0x06, 0x3c, 0x4a, 0x03, 0x5e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc4, 0xff, 0xb0, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x0b, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x0b, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0xfb, 0xdc, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x61, 0x01, 0x0e, 0xb2, 0x4e, 0x46, 0x3c, 0x04, 0x04, 0x06, 0x3e, 0x4c, 0x54, 0xb2, 0x4e, 0x46, 0x3c, 0x04, 0x04, 0x06, 0x3e, 0x4c, 0x03, 0x3e, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x50, 0x00, 0x31, 0x00, 0x34, 0x00, 0x00, 0x25, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x13, 0x25, 0x35, 0x25, 0x13, 0x17, 0x07, 0x25, 0x15, 0x05, 0x03, 0x05, 0x15, 0x25, 0x03, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x07, 0x27, 0x01, 0x0d, 0x01, 0x02, 0x2d, 0x1b, 0x0c, 0x4f, 0x9b, 0x58, 0x5e, 0xa1, 0x58, 0x22, 0x27, 0x60, 0xfd, 0xff, 0x02, 0xbb, 0x69, 0x95, 0x3f, 0x01, 0x08, 0xfe, 0xb4, 0x67, 0x01, 0xb3, 0xfe, 0x17, 0x60, 0x06, 0x0a, 0x04, 0x06, 0x0d, 0x8c, 0x54, 0x4e, 0x98, 0x5d, 0x5f, 0xa1, 0x57, 0x63, 0x84, 0x09, 0x06, 0x05, 0x0e, 0x1f, 0x48, 0x95, 0x01, 0x51, 0xfe, 0xaa, 0x01, 0x13, 0x2d, 0x03, 0x4c, 0x54, 0xb4, 0x4e, 0x44, 0x07, 0x01, 0x1d, 0xa3, 0xaa, 0xde, 0x01, 0x39, 0x41, 0xbb, 0x54, 0xb0, 0x6a, 0xfe, 0xcd, 0x8a, 0xb2, 0x9c, 0xfe, 0xe3, 0x02, 0x06, 0x02, 0x02, 0x06, 0x3c, 0x4a, 0x56, 0xb4, 0x4e, 0x44, 0x3a, 0x04, 0x04, 0x02, 0x06, 0x0d, 0xd8, 0x3c, 0x03, 0xec, 0x6e, 0x57, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x2f, 0x05, 0x46, 0x05, 0x56, 0x00, 0x31, 0x00, 0x34, 0x00, 0x00, 0x01, 0x05, 0x15, 0x05, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x27, 0x37, 0x06, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x05, 0x35, 0x25, 0x37, 0x25, 0x35, 0x05, 0x13, 0x17, 0x03, 0x37, 0x27, 0x03, 0xa1, 0x01, 0xa4, 0xfd, 0xb6, 0x54, 0x2b, 0x30, 0x0a, 0x04, 0x06, 0x0d, 0x8c, 0x54, 0x4e, 0x98, 0x5d, 0x5f, 0xa1, 0x57, 0x63, 0x84, 0x09, 0x06, 0x05, 0x0e, 0x41, 0x34, 0x5e, 0x94, 0x4e, 0x32, 0x32, 0x4d, 0x58, 0x5e, 0x51, 0x45, 0x4b, 0x36, 0xfe, 0x8a, 0x01, 0xb8, 0x55, 0xfd, 0xf3, 0x02, 0x43, 0x73, 0x94, 0xd1, 0xe8, 0xb9, 0x03, 0xbf, 0x86, 0xaa, 0xbb, 0xf7, 0x0d, 0x16, 0x04, 0x02, 0x02, 0x06, 0x3e, 0x4c, 0x54, 0xb2, 0x4e, 0x46, 0x3c, 0x04, 0x02, 0x02, 0x06, 0x1d, 0x0f, 0xfe, 0xf1, 0x3d, 0xdf, 0x09, 0x18, 0x26, 0x54, 0xb2, 0x4e, 0x23, 0x1e, 0x04, 0xa1, 0x77, 0xb2, 0x8b, 0xf4, 0xa8, 0xb0, 0xb8, 0x01, 0x66, 0x3d, 0xfd, 0x80, 0x4a, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xbb, 0xff, 0x4e, 0x05, 0x46, 0x05, 0x7d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x09, 0x03, 0x15, 0x01, 0x35, 0x01, 0xc4, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0x19, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x02, 0x27, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x03, 0xbb, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x02, 0x00, 0xbb, 0xff, 0x4e, 0x05, 0x46, 0x05, 0x7d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x09, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x3d, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x87, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x02, 0x27, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x01, 0xf6, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0xbb, 0xfe, 0x6d, 0x05, 0x46, 0x06, 0x60, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x00, 0x2d, 0x02, 0x03, 0x25, 0x35, 0x25, 0x13, 0x17, 0x03, 0x25, 0x15, 0x05, 0x03, 0x05, 0x15, 0x25, 0x07, 0x05, 0x15, 0x05, 0x03, 0x27, 0x13, 0x05, 0x35, 0x25, 0x13, 0x25, 0x35, 0x05, 0x13, 0x0d, 0x01, 0x02, 0xf8, 0x01, 0x2c, 0xfe, 0xfa, 0x57, 0xfd, 0xf4, 0x02, 0x7c, 0x51, 0x95, 0x3e, 0x01, 0x5e, 0xfe, 0x7a, 0x3a, 0x01, 0xc0, 0xfe, 0x1d, 0x1a, 0x02, 0x06, 0xfd, 0x8c, 0x51, 0x96, 0x3e, 0xfe, 0x9b, 0x01, 0x8d, 0x39, 0xfe, 0x3a, 0x01, 0xe9, 0x62, 0xfe, 0xce, 0x01, 0x0d, 0xb3, 0x5f, 0x54, 0x01, 0x57, 0xa7, 0xaa, 0xca, 0x01, 0x88, 0x26, 0xfe, 0xd4, 0x6f, 0xb0, 0x7d, 0xfe, 0xe4, 0x8e, 0xb2, 0x9a, 0x81, 0xa5, 0xaa, 0xc8, 0xfe, 0x77, 0x26, 0x01, 0x2d, 0x72, 0xb2, 0x7e, 0x01, 0x18, 0x91, 0xb0, 0x9b, 0x01, 0xde, 0x62, 0x55, 0x00, 0x00, 0x00, 0x03, 0x00, 0xbb, 0xfe, 0x6d, 0x05, 0x46, 0x06, 0x60, 0x00, 0x02, 0x00, 0x05, 0x00, 0x21, 0x00, 0x00, 0x01, 0x07, 0x17, 0x01, 0x37, 0x2f, 0x01, 0x25, 0x35, 0x05, 0x13, 0x17, 0x03, 0x05, 0x15, 0x05, 0x07, 0x25, 0x15, 0x05, 0x07, 0x05, 0x15, 0x25, 0x03, 0x27, 0x13, 0x25, 0x35, 0x25, 0x37, 0x05, 0x35, 0x25, 0x02, 0x7a, 0x9d, 0x89, 0x01, 0x29, 0x95, 0x83, 0x94, 0xfd, 0xb7, 0x02, 0x6c, 0x58, 0x95, 0x5a, 0x01, 0x83, 0xfe, 0x21, 0x1e, 0x01, 0xf4, 0xfd, 0xe5, 0x28, 0x02, 0x43, 0xfd, 0x9b, 0x57, 0x96, 0x59, 0xfe, 0x77, 0x01, 0xe6, 0x1e, 0xfe, 0x05, 0x02, 0x22, 0x01, 0x44, 0x32, 0x2c, 0x02, 0xa3, 0x2f, 0x2a, 0x2f, 0xbc, 0xb0, 0xc5, 0x01, 0xa8, 0x26, 0xfe, 0x4f, 0x7b, 0xaa, 0x98, 0x94, 0x9f, 0xb0, 0xad, 0xc2, 0xb8, 0xb2, 0xc4, 0xfe, 0x5b, 0x26, 0x01, 0xae, 0x7d, 0xaa, 0x9a, 0x94, 0xa2, 0xb2, 0xad, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xb2, 0x05, 0x46, 0x05, 0x50, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x45, 0xfe, 0x9a, 0xfe, 0x27, 0x01, 0xd5, 0x01, 0x6a, 0xfe, 0x97, 0xfc, 0xe7, 0x03, 0x1b, 0x01, 0x67, 0x04, 0x61, 0xfe, 0x81, 0x61, 0x5e, 0xfe, 0x7e, 0xef, 0x02, 0x00, 0x7c, 0xa6, 0x7c, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xb2, 0x05, 0x46, 0x05, 0x50, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0xc3, 0x01, 0x67, 0x03, 0x1b, 0xfc, 0xe7, 0xfe, 0x97, 0x01, 0x6a, 0x01, 0xd5, 0xfe, 0x27, 0x04, 0x61, 0xef, 0xfe, 0x00, 0x7c, 0xa6, 0x7c, 0xfe, 0x00, 0xef, 0x01, 0x82, 0x5e, 0x61, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x57, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x21, 0x15, 0x00, 0x25, 0x35, 0x04, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x45, 0xfe, 0x90, 0xfc, 0xee, 0x03, 0x01, 0x01, 0x81, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0xd7, 0x01, 0xbe, 0x91, 0xae, 0x85, 0x02, 0xdf, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x57, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x33, 0x00, 0x25, 0x15, 0x04, 0x01, 0x11, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0xc3, 0x01, 0x81, 0x03, 0x01, 0xfc, 0xee, 0xfe, 0x90, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0x01, 0xa1, 0x85, 0xae, 0x91, 0xfe, 0x42, 0x05, 0x57, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x52, 0x05, 0x46, 0x05, 0x57, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0xb1, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x04, 0x24, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x52, 0x05, 0x46, 0x05, 0x57, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0xb1, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x04, 0x24, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x83, 0x05, 0x46, 0x06, 0x1d, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x26, 0x25, 0x35, 0x24, 0x25, 0x01, 0x17, 0x03, 0x36, 0x37, 0x15, 0x06, 0x07, 0x03, 0x04, 0x17, 0x15, 0x02, 0x25, 0x03, 0x27, 0x01, 0x06, 0x07, 0x16, 0x17, 0x02, 0xa3, 0xd8, 0xfe, 0xf8, 0x01, 0x96, 0x01, 0x25, 0x01, 0x01, 0x76, 0xa7, 0x8e, 0x69, 0xa7, 0xc1, 0x7d, 0x01, 0x06, 0xdf, 0xcc, 0xfe, 0xa8, 0xd3, 0x76, 0x01, 0x47, 0x88, 0x91, 0x71, 0x6a, 0x01, 0xb0, 0x55, 0x29, 0xa6, 0x3f, 0xa5, 0x02, 0x65, 0x4b, 0xfe, 0x74, 0x75, 0x95, 0xef, 0xb3, 0x75, 0xfe, 0xd4, 0x7f, 0xed, 0xef, 0x01, 0x22, 0xa6, 0xfe, 0x09, 0x4b, 0x03, 0x0a, 0x39, 0x1e, 0x17, 0x27, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xe5, 0x05, 0x46, 0x05, 0x7f, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x16, 0x05, 0x15, 0x04, 0x05, 0x01, 0x27, 0x13, 0x06, 0x07, 0x35, 0x36, 0x37, 0x13, 0x24, 0x27, 0x35, 0x12, 0x05, 0x13, 0x17, 0x01, 0x36, 0x37, 0x26, 0x27, 0x03, 0x65, 0xd8, 0x01, 0x08, 0xfe, 0x6a, 0xfe, 0xdc, 0xfe, 0xfe, 0x76, 0xa7, 0x8e, 0x69, 0xa8, 0xc0, 0x7e, 0xfe, 0xf9, 0xdf, 0xcd, 0x01, 0x57, 0xd4, 0x75, 0xfe, 0xb9, 0x88, 0x91, 0x70, 0x6a, 0x03, 0x52, 0x55, 0x29, 0xa6, 0x3f, 0xa5, 0xfd, 0x9b, 0x4b, 0x01, 0x8c, 0x75, 0x95, 0xef, 0xb3, 0x75, 0x01, 0x2c, 0x7f, 0xed, 0xef, 0xfe, 0xde, 0xa6, 0x01, 0xf7, 0x4b, 0xfc, 0xf6, 0x39, 0x1e, 0x17, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb7, 0x00, 0xa3, 0x05, 0x51, 0x04, 0x5f, 0x00, 0x13, 0x00, 0x00, 0x25, 0x21, 0x22, 0x02, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x05, 0x51, 0xfd, 0x15, 0xb6, 0xf8, 0x7c, 0x7c, 0xb4, 0x02, 0xed, 0xfd, 0x13, 0x7a, 0xab, 0x54, 0x57, 0x7a, 0x02, 0xed, 0xa3, 0x01, 0x16, 0xc8, 0xc6, 0x8d, 0x8b, 0x96, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x00, 0x00, 0x01, 0x00, 0xb7, 0x00, 0xa3, 0x05, 0x51, 0x04, 0x5f, 0x00, 0x13, 0x00, 0x00, 0x37, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x02, 0x23, 0xb8, 0x02, 0xec, 0x7b, 0x56, 0x55, 0xab, 0x7b, 0xfd, 0x14, 0x02, 0xec, 0xb4, 0x7d, 0x7c, 0xf9, 0xb5, 0xa3, 0x96, 0x60, 0x5e, 0x8a, 0x88, 0xc0, 0x96, 0x8b, 0x8d, 0xc6, 0xc8, 0xfe, 0xea, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb7, 0xff, 0x3b, 0x05, 0x51, 0x05, 0xcf, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x1b, 0x01, 0x33, 0x03, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x03, 0x23, 0x13, 0x22, 0x02, 0x35, 0x34, 0x37, 0x36, 0x33, 0x03, 0x45, 0xe1, 0x7a, 0xab, 0x54, 0x57, 0x7a, 0x2b, 0xdf, 0x67, 0x99, 0x67, 0x01, 0x4a, 0xfe, 0x8d, 0xb6, 0x02, 0x29, 0xfd, 0xae, 0x65, 0x99, 0x65, 0xb4, 0xfa, 0x7c, 0x7c, 0xb4, 0x03, 0xc9, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x03, 0x26, 0x01, 0x70, 0xfe, 0x90, 0x96, 0xfd, 0x70, 0x96, 0xfe, 0x98, 0x01, 0x68, 0x01, 0x16, 0xc8, 0xc6, 0x8d, 0x8b, 0x00, 0x02, 0x00, 0xb7, 0xff, 0x33, 0x05, 0x51, 0x05, 0xc7, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x0b, 0x01, 0x23, 0x13, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x13, 0x33, 0x03, 0x32, 0x12, 0x15, 0x14, 0x07, 0x06, 0x23, 0x02, 0xc3, 0xe1, 0x7b, 0xab, 0x55, 0x56, 0x7b, 0x2b, 0xdf, 0x67, 0x99, 0x67, 0xfe, 0xb7, 0x01, 0x72, 0xb6, 0xfd, 0xd8, 0x02, 0x52, 0x64, 0x99, 0x64, 0xb4, 0xfa, 0x7c, 0x7d, 0xb4, 0x01, 0x39, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0xfc, 0xda, 0xfe, 0x90, 0x01, 0x70, 0x96, 0x02, 0x90, 0x96, 0x01, 0x68, 0xfe, 0x98, 0xfe, 0xea, 0xc8, 0xc6, 0x8d, 0x8b, 0x00, 0x02, 0x00, 0xab, 0x00, 0x00, 0x05, 0x46, 0x04, 0xe8, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x01, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0xda, 0x04, 0x6b, 0xfb, 0x95, 0x04, 0x6b, 0xfd, 0x14, 0xb5, 0x7c, 0x7d, 0x7d, 0x7c, 0xb4, 0x02, 0xed, 0xfd, 0x13, 0x7b, 0xab, 0x56, 0x56, 0x7a, 0x02, 0xed, 0x96, 0x96, 0x01, 0x2c, 0x8b, 0x8b, 0xc8, 0xc6, 0x8d, 0x8b, 0x96, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x5e, 0x04, 0xe8, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x11, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0xc3, 0x04, 0x6c, 0xfb, 0x94, 0x02, 0xed, 0x7a, 0x57, 0x55, 0xab, 0x7b, 0xfd, 0x13, 0x02, 0xed, 0xb4, 0x7c, 0x7d, 0x7d, 0x7c, 0xb5, 0x96, 0x96, 0x01, 0x2c, 0x96, 0x60, 0x5e, 0x8a, 0x88, 0xc0, 0x96, 0x8b, 0x8d, 0xc6, 0xc8, 0x8b, 0x8b, 0x00, 0x02, 0x00, 0xab, 0xff, 0x13, 0x05, 0x46, 0x05, 0xd7, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x01, 0x21, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x02, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x23, 0x35, 0x21, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x03, 0x6f, 0xfe, 0xe9, 0x7b, 0xab, 0x56, 0x56, 0x7a, 0x23, 0x8d, 0x02, 0x3d, 0xfd, 0x8b, 0x37, 0x02, 0xac, 0xfd, 0x1c, 0x58, 0x79, 0x45, 0xfb, 0x01, 0x32, 0x38, 0xa7, 0x75, 0x7d, 0x7d, 0x7c, 0xb4, 0x01, 0x4f, 0x58, 0x79, 0x44, 0x01, 0x11, 0xfe, 0xb7, 0x04, 0x52, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x96, 0x96, 0x96, 0xed, 0x35, 0xb8, 0x96, 0x96, 0x08, 0x83, 0x8b, 0xc8, 0xc6, 0x8d, 0x8b, 0xef, 0x37, 0xb8, 0x96, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x13, 0x05, 0x5e, 0x05, 0xd7, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x03, 0x08, 0xa8, 0x7a, 0x57, 0x55, 0x55, 0x3b, 0x4e, 0x89, 0xfd, 0x54, 0x02, 0xe4, 0x58, 0x79, 0x4c, 0x66, 0x4e, 0x7d, 0x7d, 0x7c, 0xb5, 0xde, 0x38, 0x02, 0x96, 0xfd, 0x32, 0x58, 0x79, 0x45, 0xfe, 0xee, 0x01, 0x49, 0x38, 0xfe, 0x7f, 0x01, 0xb8, 0x01, 0xc2, 0x60, 0x5e, 0x8a, 0x88, 0x60, 0x43, 0x14, 0x09, 0x96, 0xef, 0x37, 0xcb, 0x20, 0x58, 0x8d, 0xc6, 0xc8, 0x8b, 0x8b, 0x96, 0x96, 0xed, 0x35, 0xb8, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0xab, 0xff, 0x6a, 0x05, 0x46, 0x04, 0xe9, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x02, 0x7d, 0xfe, 0x5d, 0x02, 0x08, 0x66, 0x6c, 0x28, 0x01, 0xb9, 0xfd, 0xe1, 0x65, 0x6c, 0x02, 0xf0, 0xfd, 0x14, 0xb5, 0x7c, 0x7d, 0x7d, 0x7c, 0xb4, 0x02, 0xed, 0xfd, 0x13, 0x7b, 0xab, 0x56, 0x56, 0x7a, 0x02, 0xed, 0x96, 0x96, 0x5a, 0x3c, 0x96, 0x96, 0x5a, 0x01, 0x69, 0x8b, 0x8b, 0xc8, 0xc6, 0x8d, 0x8b, 0x96, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0xab, 0xff, 0x6a, 0x05, 0x46, 0x04, 0xe9, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x02, 0x7d, 0xfe, 0x5d, 0x02, 0x08, 0x66, 0x6c, 0x28, 0x01, 0xb9, 0xfd, 0xe1, 0x65, 0x6c, 0xfe, 0x56, 0x02, 0xed, 0x7a, 0x57, 0x55, 0xab, 0x7b, 0xfd, 0x13, 0x02, 0xed, 0xb4, 0x7c, 0x7d, 0x7d, 0x7c, 0xb5, 0x96, 0x96, 0x5a, 0x3c, 0x96, 0x96, 0x5a, 0x01, 0x69, 0x96, 0x60, 0x5e, 0x8a, 0x88, 0xc0, 0x96, 0x8b, 0x8d, 0xc6, 0xc8, 0x8b, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x37, 0x35, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0xee, 0x9a, 0x86, 0x95, 0x95, 0x85, 0x9b, 0xdd, 0xd8, 0xd9, 0xdc, 0xd6, 0xb0, 0x36, 0x68, 0x01, 0x3f, 0xfe, 0xc1, 0x68, 0x36, 0x02, 0x52, 0x02, 0x50, 0xfd, 0xc9, 0xf4, 0xd3, 0xd3, 0xf4, 0x02, 0x37, 0xfd, 0xb0, 0xfe, 0xd8, 0xfe, 0xd6, 0x01, 0x2a, 0xca, 0x2d, 0xc5, 0x3c, 0x75, 0x55, 0x74, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x10, 0x26, 0x09, 0x06, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x01, 0x7e, 0xff, 0x33, 0x00, 0x02, 0x00, 0xed, 0x00, 0x05, 0x04, 0x58, 0x04, 0xa7, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0xee, 0x9a, 0x86, 0x95, 0x95, 0x85, 0x9b, 0xdd, 0xd8, 0xd9, 0xdc, 0x01, 0xe2, 0x99, 0x99, 0x5b, 0x99, 0x99, 0x02, 0x57, 0x02, 0x50, 0xfd, 0xc9, 0xf4, 0xd3, 0xd3, 0xf4, 0x02, 0x37, 0xfd, 0xb0, 0xfe, 0xd8, 0xfe, 0xd6, 0x01, 0x2a, 0x01, 0xe1, 0xab, 0x64, 0xab, 0xab, 0x64, 0xab, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0x8b, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfc, 0x17, 0x03, 0xe9, 0xfb, 0x7e, 0x04, 0x8b, 0xaa, 0xfc, 0xc9, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0x8b, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x05, 0x45, 0xfb, 0x7e, 0x03, 0xe9, 0xfc, 0x17, 0x04, 0x8b, 0xfb, 0x75, 0xaa, 0x03, 0x37, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x56, 0x05, 0x46, 0x05, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfc, 0x17, 0x03, 0xe9, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x05, 0x0b, 0xaa, 0xfc, 0xc9, 0xaa, 0x80, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x56, 0x05, 0x46, 0x05, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x01, 0x15, 0x21, 0x35, 0x05, 0x45, 0xfb, 0x7e, 0x03, 0xe9, 0xfc, 0x17, 0x04, 0x82, 0xfb, 0x7e, 0x05, 0x0b, 0xfb, 0x75, 0xaa, 0x03, 0x37, 0xaa, 0xfa, 0xf5, 0xaa, 0xaa, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x04, 0xdb, 0x05, 0x02, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x04, 0xdb, 0x99, 0xfd, 0x1a, 0x99, 0x05, 0x02, 0xfa, 0xfe, 0x04, 0x58, 0xfb, 0xa8, 0x05, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x04, 0xdb, 0x05, 0x02, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0xc3, 0x99, 0x02, 0xe6, 0x99, 0x05, 0x02, 0xfb, 0xa8, 0x04, 0x58, 0xfa, 0xfe, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x19, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x05, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x03, 0x64, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x01, 0x9f, 0x01, 0x40, 0xfe, 0xc0, 0x99, 0xfe, 0xbf, 0x01, 0x41, 0x04, 0x8e, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x84, 0xfe, 0x9b, 0xaa, 0xfe, 0x9b, 0x01, 0x65, 0xaa, 0x01, 0x65, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x77, 0x03, 0x1a, 0xfc, 0xe6, 0x01, 0xed, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x02, 0xd7, 0xaa, 0x02, 0x61, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x19, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x07, 0x17, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x03, 0x64, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x02, 0xa2, 0xe4, 0xe3, 0x6c, 0xe3, 0xe3, 0x6d, 0xe4, 0xe3, 0x6c, 0xe3, 0xe3, 0x04, 0x8e, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0xfe, 0xbe, 0xfc, 0xfc, 0x78, 0xfc, 0xfd, 0x79, 0xfc, 0xfc, 0x78, 0xfc, 0xfd, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x09, 0x01, 0x17, 0x01, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0xb5, 0x02, 0x32, 0x6c, 0xfd, 0xce, 0x01, 0x43, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x01, 0x86, 0x02, 0x70, 0x78, 0xfd, 0x90, 0x03, 0x80, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x12, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x02, 0xa5, 0xbe, 0xbe, 0xbf, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x03, 0x01, 0xfe, 0x02, 0x8b, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x04, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x09, 0x00, 0x18, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x27, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x04, 0x48, 0x63, 0x63, 0x90, 0x63, 0x64, 0x47, 0x3a, 0x6a, 0x27, 0x29, 0x2a, 0xa7, 0x79, 0x79, 0xa2, 0xa5, 0xd8, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x03, 0x41, 0x6f, 0x50, 0x4f, 0x6d, 0x6d, 0x9e, 0x70, 0x81, 0x31, 0x2e, 0x2d, 0x72, 0x42, 0x84, 0xb7, 0xb4, 0x87, 0x86, 0xba, 0xcc, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x11, 0x00, 0x2b, 0x00, 0x45, 0x00, 0x00, 0x01, 0x0d, 0x01, 0x07, 0x25, 0x11, 0x23, 0x11, 0x05, 0x27, 0x2d, 0x01, 0x37, 0x05, 0x11, 0x33, 0x11, 0x25, 0x02, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x04, 0x72, 0xfe, 0xdd, 0x01, 0x23, 0x2f, 0xfe, 0xef, 0x5c, 0xfe, 0xf0, 0x2f, 0x01, 0x23, 0xfe, 0xdd, 0x2f, 0x01, 0x10, 0x5c, 0x01, 0x11, 0xdf, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x03, 0x31, 0xaf, 0xb0, 0x58, 0xb7, 0xfe, 0xad, 0x01, 0x53, 0xb7, 0x58, 0xb0, 0xaf, 0x59, 0xb7, 0x01, 0x53, 0xfe, 0xad, 0xb7, 0x01, 0x04, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x21, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0xe4, 0x02, 0x40, 0xfd, 0xc0, 0x02, 0x40, 0xfd, 0xc0, 0x01, 0x80, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x03, 0x6a, 0x88, 0xc0, 0x88, 0x02, 0xf4, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x19, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x13, 0x21, 0x15, 0x21, 0x03, 0x64, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x32, 0x02, 0x41, 0xfd, 0xbf, 0x04, 0x8e, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0xfe, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x2f, 0x03, 0xaa, 0xfb, 0xcf, 0x04, 0xb8, 0xfb, 0x48, 0x02, 0xa9, 0x01, 0x40, 0xfe, 0xc0, 0x99, 0xfe, 0xbf, 0x01, 0x41, 0x04, 0x89, 0xfb, 0xf0, 0x04, 0x10, 0x9b, 0xfa, 0xbf, 0x04, 0x59, 0xfe, 0x9b, 0xaa, 0xfe, 0x9b, 0x01, 0x65, 0xaa, 0x01, 0x65, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x03, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x77, 0x03, 0x1a, 0xfc, 0xe6, 0x48, 0x03, 0xaa, 0xfb, 0xcf, 0x04, 0xb8, 0xfb, 0x48, 0x02, 0xd7, 0xaa, 0x02, 0x5c, 0xfb, 0xf0, 0x04, 0x10, 0x9b, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x09, 0x02, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x37, 0x09, 0x01, 0x25, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x04, 0xb7, 0xfe, 0xb9, 0x01, 0x47, 0x6d, 0xfe, 0xba, 0xfe, 0xba, 0x6c, 0x01, 0x46, 0xfe, 0xba, 0x6c, 0x01, 0x46, 0x01, 0x46, 0xfc, 0xe5, 0x03, 0xaa, 0xfb, 0xcf, 0x04, 0xb8, 0xfb, 0x48, 0x03, 0xec, 0xfe, 0x96, 0xfe, 0x96, 0x78, 0x01, 0x6a, 0xfe, 0x95, 0x79, 0x01, 0x6a, 0x01, 0x6a, 0x79, 0xfe, 0x95, 0x01, 0x6b, 0x24, 0xfb, 0xf0, 0x04, 0x10, 0x9b, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x02, 0xa5, 0xbe, 0xbe, 0xfe, 0x8a, 0x03, 0xaa, 0xfb, 0xcf, 0x04, 0xb8, 0xfb, 0x48, 0x03, 0x01, 0xfe, 0x02, 0x86, 0xfb, 0xf0, 0x04, 0x10, 0x9b, 0xfa, 0xbf, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x9e, 0x72, 0x04, 0x99, 0xfb, 0x67, 0x05, 0x9a, 0xfd, 0x75, 0x7f, 0xfd, 0x70, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x05, 0xa9, 0x72, 0xfb, 0x67, 0x04, 0x99, 0x72, 0x02, 0x90, 0x7f, 0x02, 0x8b, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x05, 0xa8, 0xfd, 0xb4, 0x73, 0xfd, 0xb5, 0x05, 0x9a, 0x7f, 0xfa, 0xe5, 0x05, 0x1b, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x33, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x9e, 0x02, 0x4b, 0x73, 0x02, 0x4c, 0x7f, 0x05, 0x1b, 0xfa, 0xe5, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x03, 0x23, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x9e, 0x72, 0x02, 0x13, 0xfd, 0xed, 0x05, 0x9a, 0xfd, 0x75, 0x7f, 0xfd, 0x70, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x03, 0x23, 0x05, 0x9a, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x10, 0x72, 0x72, 0x02, 0x13, 0xfd, 0xed, 0x02, 0x13, 0xfd, 0xed, 0x05, 0x9a, 0xfe, 0x24, 0x7f, 0xe4, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x10, 0x72, 0x72, 0x04, 0x99, 0xfb, 0x67, 0x04, 0x99, 0xfb, 0x67, 0x05, 0x9a, 0xfe, 0x24, 0x7f, 0xe4, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x23, 0x11, 0x33, 0x01, 0xdd, 0x72, 0x03, 0x5a, 0xfc, 0xa6, 0xfe, 0xc1, 0x72, 0x72, 0x05, 0x9a, 0xfd, 0x75, 0x7f, 0xfd, 0x70, 0x05, 0x9a, 0x00, 0x03, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x23, 0x11, 0x33, 0x01, 0x10, 0x72, 0x72, 0x02, 0x0c, 0x73, 0x02, 0x1a, 0xfd, 0xe6, 0xfe, 0xc0, 0x72, 0x72, 0x05, 0x9a, 0xfa, 0x66, 0x05, 0x9a, 0xfd, 0x75, 0x7f, 0xfd, 0x70, 0x05, 0x9a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x10, 0x72, 0x72, 0x01, 0x3f, 0x72, 0x72, 0x03, 0x5a, 0xfc, 0xa6, 0x03, 0x5a, 0xfc, 0xa6, 0x05, 0x9a, 0xfa, 0x66, 0x05, 0x9a, 0xfe, 0x24, 0x7f, 0xe4, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xaf, 0x05, 0xa9, 0x05, 0xeb, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x01, 0x17, 0x01, 0x21, 0x15, 0x21, 0x01, 0x27, 0x01, 0x21, 0x11, 0x9e, 0x72, 0x01, 0xef, 0x01, 0x32, 0x67, 0xfe, 0xe5, 0x02, 0x2c, 0xfd, 0x9f, 0xfe, 0xcd, 0x68, 0x01, 0x1d, 0xfe, 0x46, 0x05, 0x9a, 0xfd, 0x75, 0x02, 0xdc, 0x35, 0xfd, 0x59, 0x7f, 0xfd, 0x1f, 0x36, 0x02, 0xab, 0xfd, 0x70, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xaf, 0x05, 0xa9, 0x05, 0xeb, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x01, 0x17, 0x03, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x13, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x03, 0x37, 0x21, 0x15, 0x04, 0x31, 0x67, 0xd2, 0x01, 0xe3, 0xfd, 0xe8, 0x5f, 0x02, 0x77, 0xfd, 0x54, 0xe8, 0x68, 0xd2, 0xfe, 0x91, 0x72, 0x72, 0x02, 0x38, 0x94, 0x5f, 0xfd, 0xfd, 0x05, 0xeb, 0x35, 0xfe, 0x08, 0x7f, 0xe4, 0x7f, 0xfd, 0xd3, 0x36, 0x01, 0xf7, 0xfe, 0x24, 0x05, 0x9a, 0xfe, 0x24, 0xfe, 0x9d, 0xe4, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xaf, 0x05, 0xa9, 0x05, 0xeb, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x17, 0x01, 0x21, 0x15, 0x21, 0x01, 0x27, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x01, 0x23, 0x11, 0x33, 0x04, 0xf5, 0x67, 0xfe, 0xe5, 0x01, 0x68, 0xfe, 0x63, 0xfe, 0xcd, 0x67, 0x01, 0x1d, 0xfe, 0xc0, 0x72, 0x72, 0x01, 0x75, 0xfd, 0x4c, 0x72, 0x72, 0x05, 0xeb, 0x35, 0xfd, 0x59, 0x7f, 0xfd, 0x1f, 0x36, 0x02, 0xab, 0xfd, 0x70, 0x05, 0x9a, 0xfd, 0x75, 0xfc, 0xf1, 0x05, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x9d, 0xff, 0xaf, 0x05, 0xa9, 0x05, 0xeb, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x13, 0x17, 0x03, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x13, 0x23, 0x01, 0x23, 0x11, 0x33, 0x01, 0x37, 0x21, 0x15, 0x02, 0x4f, 0x72, 0x72, 0x01, 0xc2, 0xe9, 0x67, 0xd2, 0x01, 0x1a, 0xfe, 0xb1, 0x5f, 0x01, 0xae, 0xfe, 0x1d, 0xe8, 0x68, 0xd2, 0xf9, 0xfe, 0xc1, 0x72, 0x72, 0x02, 0x6d, 0x5f, 0xfe, 0x73, 0x05, 0x9a, 0xfe, 0x24, 0x02, 0x2d, 0x35, 0xfe, 0x08, 0x7f, 0xe4, 0x7f, 0xfd, 0xd3, 0x36, 0x01, 0xf7, 0xfe, 0x24, 0x05, 0x9a, 0xfc, 0xc1, 0xe4, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xa7, 0x05, 0x37, 0x05, 0x5d, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x35, 0x24, 0x25, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x05, 0x04, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x24, 0xc3, 0x01, 0x72, 0x01, 0x20, 0xb4, 0x5b, 0x37, 0x45, 0x38, 0x48, 0x32, 0x67, 0x51, 0x90, 0x7a, 0x9f, 0x85, 0xcd, 0xfe, 0xaf, 0x01, 0x51, 0xcd, 0x85, 0x9f, 0x7a, 0x90, 0x51, 0x67, 0x32, 0x48, 0x38, 0x45, 0x37, 0x5b, 0xb4, 0xfe, 0xe0, 0x02, 0x2e, 0xa8, 0x28, 0x59, 0x37, 0x4f, 0x30, 0x3c, 0x30, 0x3a, 0x3e, 0x7e, 0x6a, 0xa0, 0x79, 0x9f, 0x5b, 0x8c, 0x3c, 0x3c, 0x8c, 0x5b, 0x9f, 0x79, 0xa0, 0x6a, 0x7e, 0x3e, 0x3a, 0x30, 0x3c, 0x30, 0x4f, 0x37, 0x59, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xa7, 0x05, 0x37, 0x05, 0x5d, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x25, 0x24, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x04, 0x05, 0x05, 0x37, 0xfe, 0x8e, 0xfe, 0xe0, 0xb4, 0x5b, 0x37, 0x45, 0x38, 0x48, 0x32, 0x67, 0x51, 0x90, 0x7a, 0x9f, 0x85, 0xcd, 0x01, 0x51, 0xfe, 0xaf, 0xcd, 0x85, 0x9f, 0x7a, 0x90, 0x51, 0x67, 0x32, 0x48, 0x38, 0x45, 0x37, 0x5b, 0xb4, 0x01, 0x20, 0x01, 0x72, 0x02, 0x2e, 0x28, 0x59, 0x37, 0x4f, 0x30, 0x3c, 0x30, 0x3a, 0x3e, 0x7e, 0x6a, 0xa0, 0x79, 0x9f, 0x5b, 0x8c, 0x3c, 0x3c, 0x8c, 0x5b, 0x9f, 0x79, 0xa0, 0x6a, 0x7e, 0x3e, 0x3a, 0x30, 0x3c, 0x30, 0x4f, 0x37, 0x59, 0x28, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x1e, 0x05, 0x46, 0x04, 0xe6, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x01, 0x11, 0x09, 0x02, 0x35, 0x01, 0x04, 0xac, 0xfc, 0xf8, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x20, 0x02, 0xc4, 0xfe, 0x9e, 0xfd, 0x9c, 0x02, 0x11, 0xa6, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x1e, 0x05, 0x46, 0x04, 0xe6, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x03, 0x11, 0x01, 0x15, 0x01, 0x5c, 0x03, 0x08, 0xfc, 0xf8, 0x99, 0x04, 0x82, 0x01, 0x20, 0x01, 0x62, 0x01, 0x62, 0xfc, 0x3a, 0x04, 0xc8, 0xfd, 0xef, 0xa6, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x9e, 0x05, 0x46, 0x05, 0x64, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x03, 0x11, 0x09, 0x02, 0x35, 0x01, 0xc3, 0x04, 0x82, 0x99, 0xfc, 0xf8, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x62, 0xaa, 0xaa, 0x02, 0x00, 0x02, 0xc4, 0xfe, 0x9e, 0xfd, 0x9c, 0x02, 0x11, 0xa6, 0x02, 0x11, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x9e, 0x05, 0x46, 0x05, 0x64, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x09, 0x02, 0x03, 0x11, 0x01, 0x15, 0xc3, 0x04, 0x82, 0xfc, 0x17, 0x03, 0x08, 0xfc, 0xf8, 0x99, 0x04, 0x82, 0x62, 0xaa, 0xaa, 0x02, 0x00, 0x01, 0x62, 0x01, 0x62, 0xfc, 0x3a, 0x04, 0xc8, 0xfd, 0xef, 0xa6, 0x00, 0x02, 0x00, 0x6c, 0x01, 0x67, 0x06, 0xc7, 0x03, 0xa2, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x27, 0x26, 0x27, 0x21, 0x06, 0x07, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x17, 0x16, 0x17, 0x21, 0x36, 0x04, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x05, 0x0f, 0x4b, 0xd3, 0x99, 0x96, 0xda, 0x49, 0x2e, 0x11, 0xfd, 0x96, 0x12, 0x2e, 0x4c, 0xd9, 0x92, 0x95, 0xd4, 0x4e, 0x2f, 0x11, 0x02, 0x6a, 0x12, 0xfc, 0xc1, 0x67, 0x47, 0x47, 0x68, 0x47, 0x03, 0x4f, 0x53, 0xa8, 0xef, 0xa4, 0x51, 0x33, 0x43, 0x42, 0x33, 0x52, 0xa2, 0xf2, 0xa7, 0x55, 0x34, 0x43, 0x44, 0x0e, 0x50, 0x72, 0x4f, 0x4f, 0x71, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6c, 0x01, 0x67, 0x06, 0xc7, 0x03, 0xa2, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x17, 0x16, 0x17, 0x21, 0x36, 0x37, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x27, 0x26, 0x27, 0x21, 0x06, 0x24, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x02, 0x24, 0x4b, 0xd3, 0x99, 0x96, 0xda, 0x49, 0x2e, 0x11, 0x02, 0x6a, 0x12, 0x2e, 0x4c, 0xd9, 0x92, 0x95, 0xd4, 0x4e, 0x2f, 0x11, 0xfd, 0x96, 0x12, 0x03, 0x3f, 0x67, 0x47, 0x47, 0x67, 0x48, 0x01, 0xba, 0x53, 0xa8, 0xef, 0xa4, 0x51, 0x33, 0x43, 0x42, 0x33, 0x52, 0xa2, 0xf2, 0xa7, 0x55, 0x34, 0x43, 0x44, 0x0e, 0x50, 0x72, 0x4f, 0x4f, 0x71, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x58, 0x01, 0x67, 0x05, 0xb1, 0x03, 0xa2, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x00, 0x13, 0x37, 0x21, 0x36, 0x37, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x26, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x58, 0x01, 0x03, 0x60, 0x11, 0x2c, 0x52, 0xd4, 0x94, 0x92, 0xd9, 0x4b, 0x2f, 0x11, 0x01, 0x71, 0x47, 0x68, 0x48, 0x48, 0x68, 0x47, 0x02, 0x2e, 0xa8, 0x44, 0x2f, 0x59, 0xa7, 0xf2, 0xa2, 0x52, 0x33, 0x42, 0x8e, 0x50, 0x51, 0x71, 0x4f, 0x4f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x6c, 0xff, 0xa0, 0x05, 0x9c, 0x05, 0x64, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x05, 0x21, 0x15, 0x21, 0x03, 0x23, 0x11, 0x33, 0x25, 0x21, 0x35, 0x21, 0x02, 0xb9, 0x97, 0x97, 0x01, 0x0a, 0x01, 0xd9, 0xfe, 0x27, 0x73, 0x97, 0x97, 0xfe, 0xf5, 0xfe, 0x28, 0x01, 0xd8, 0x05, 0x64, 0xfd, 0xf3, 0x80, 0xaa, 0xfd, 0x73, 0x02, 0x0d, 0x80, 0xaa, 0x00, 0x00, 0x01, 0x00, 0xd6, 0x00, 0x00, 0x02, 0xea, 0x05, 0x9b, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x02, 0x19, 0x72, 0xd1, 0x02, 0x13, 0xd0, 0x05, 0x1c, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x92, 0x05, 0xec, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x33, 0x35, 0x21, 0x15, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0xb4, 0x03, 0xdd, 0xfc, 0x5c, 0xb0, 0x01, 0x06, 0x01, 0x05, 0xb0, 0xfe, 0xbb, 0xe1, 0xaa, 0xaa, 0x05, 0xec, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0x5e, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x92, 0x05, 0xec, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x13, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0xb4, 0x03, 0xdd, 0xfc, 0x23, 0x39, 0x01, 0x45, 0xe1, 0x01, 0x45, 0xb0, 0xfe, 0xfb, 0xfe, 0xfa, 0x05, 0xec, 0xaa, 0xfa, 0xbe, 0x04, 0xa2, 0xfb, 0x5e, 0x03, 0xac, 0xfc, 0x54, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x92, 0x05, 0xec, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x17, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0xb4, 0x03, 0xdd, 0xfc, 0x23, 0x39, 0xb0, 0x01, 0x06, 0x01, 0x05, 0xb0, 0xfe, 0xbb, 0xe1, 0x05, 0xec, 0xaa, 0xa0, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0x5e, 0x00, 0x02, 0x00, 0xfe, 0x00, 0x00, 0x05, 0x0a, 0x04, 0x7e, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x17, 0x33, 0x01, 0x11, 0x21, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x05, 0x0a, 0xfb, 0xf5, 0x99, 0x51, 0x4d, 0x95, 0xd6, 0x3f, 0x21, 0x10, 0xf9, 0xfc, 0x8e, 0x02, 0x0b, 0x0e, 0x18, 0x37, 0xba, 0x80, 0x39, 0x04, 0x7e, 0xfe, 0xeb, 0x12, 0x25, 0x46, 0xee, 0xa4, 0x56, 0x5a, 0x02, 0x44, 0xfd, 0xbc, 0x41, 0x3f, 0x8f, 0xce, 0x3d, 0x1b, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0x00, 0x00, 0x05, 0x0a, 0x04, 0x7e, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x09, 0x01, 0x21, 0x05, 0x35, 0x01, 0x33, 0x11, 0x04, 0x71, 0xfd, 0x27, 0x02, 0xd9, 0xfc, 0x8e, 0x03, 0x72, 0x99, 0x03, 0xd4, 0xfc, 0xd6, 0xaa, 0xaa, 0x03, 0xd4, 0xfb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x77, 0x05, 0xee, 0x05, 0xc1, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x03, 0x58, 0x02, 0x95, 0xb6, 0xfd, 0xbd, 0xfd, 0xbd, 0xb6, 0x02, 0x93, 0x05, 0xc1, 0xf8, 0xb6, 0x06, 0x77, 0xf9, 0x89, 0x07, 0x4a, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x77, 0x05, 0xee, 0x05, 0xc1, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x02, 0x90, 0xfd, 0x6b, 0xb6, 0x02, 0x43, 0x02, 0x43, 0xb6, 0xfd, 0x6d, 0xfe, 0x77, 0x07, 0x4a, 0xf9, 0x89, 0x06, 0x77, 0xf8, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x7e, 0xfe, 0x77, 0x05, 0x6a, 0x05, 0xc1, 0x00, 0x10, 0x00, 0x00, 0x01, 0x22, 0x04, 0x15, 0x11, 0x23, 0x11, 0x10, 0x00, 0x20, 0x00, 0x19, 0x01, 0x23, 0x11, 0x34, 0x24, 0x02, 0xf4, 0xc5, 0xfe, 0xea, 0x9b, 0x01, 0x90, 0x01, 0xcc, 0x01, 0x90, 0x9b, 0xfe, 0xec, 0x05, 0x1d, 0xe3, 0xfc, 0xfb, 0x39, 0x04, 0xe0, 0x01, 0x42, 0x01, 0x28, 0xfe, 0xd8, 0xfe, 0xbe, 0xfb, 0x20, 0x04, 0xc7, 0xfa, 0xe5, 0x00, 0x01, 0x00, 0x7e, 0xfe, 0x77, 0x05, 0x6a, 0x05, 0xc1, 0x00, 0x10, 0x00, 0x00, 0x05, 0x32, 0x24, 0x35, 0x11, 0x33, 0x11, 0x10, 0x00, 0x20, 0x00, 0x19, 0x01, 0x33, 0x11, 0x14, 0x04, 0x02, 0xf4, 0xc5, 0x01, 0x16, 0x9b, 0xfe, 0x70, 0xfe, 0x34, 0xfe, 0x70, 0x9b, 0x01, 0x14, 0xe5, 0xe3, 0xfc, 0x04, 0xc7, 0xfb, 0x20, 0xfe, 0xbe, 0xfe, 0xd8, 0x01, 0x28, 0x01, 0x42, 0x04, 0xe0, 0xfb, 0x39, 0xfa, 0xe5, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x23, 0x03, 0x8a, 0x06, 0x75, 0x12, 0x06, 0x0a, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc5, 0x02, 0x48, 0x01, 0x83, 0x03, 0x46, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0x03, 0x46, 0xfe, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x31, 0x03, 0xa2, 0x04, 0x19, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x07, 0x13, 0x27, 0x07, 0x13, 0xe0, 0x01, 0x0d, 0x54, 0x55, 0x01, 0x0c, 0xda, 0x54, 0xdb, 0xdb, 0x54, 0x02, 0xfd, 0x01, 0x1c, 0xfe, 0xe4, 0xb0, 0xfe, 0xe4, 0xb0, 0xb0, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x1e, 0x05, 0x46, 0x04, 0xe7, 0x00, 0x03, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x03, 0x21, 0x35, 0x21, 0x01, 0x37, 0x09, 0x01, 0x17, 0x01, 0x21, 0x15, 0x21, 0x01, 0x07, 0x09, 0x01, 0x27, 0x02, 0x96, 0xdd, 0xdd, 0xdd, 0xdd, 0x4a, 0xfe, 0x77, 0x01, 0x89, 0xfe, 0xb0, 0x6c, 0x01, 0x9c, 0x01, 0x9c, 0x6c, 0xfe, 0xb1, 0x01, 0x88, 0xfe, 0x78, 0x01, 0x4f, 0x6c, 0xfe, 0x64, 0xfe, 0x64, 0x6c, 0x01, 0x13, 0xf5, 0x04, 0xc9, 0xf6, 0xfe, 0x3c, 0xaa, 0x01, 0x75, 0x78, 0xfe, 0x36, 0x01, 0xca, 0x78, 0xfe, 0x8b, 0xaa, 0xfe, 0x8b, 0x78, 0x01, 0xca, 0xfe, 0x36, 0x78, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x05, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x00, 0x17, 0x11, 0x09, 0x01, 0x11, 0x01, 0x27, 0x01, 0x11, 0x09, 0x01, 0x11, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0x8c, 0xfe, 0x4e, 0x02, 0xc9, 0x01, 0xb2, 0x3e, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xfa, 0x80, 0x02, 0x4e, 0x71, 0x01, 0x5e, 0xfd, 0x44, 0x01, 0x5e, 0xfe, 0xa2, 0x02, 0xc6, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x15, 0x09, 0x01, 0x11, 0x09, 0x01, 0x15, 0x01, 0x21, 0x01, 0x11, 0x06, 0x70, 0xfd, 0x2a, 0xfd, 0x29, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0xb5, 0xfe, 0xe9, 0xfe, 0x4e, 0xa2, 0xe0, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xdd, 0xfe, 0x1c, 0x01, 0x5e, 0xfd, 0x44, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x09, 0x01, 0x11, 0x09, 0x01, 0x35, 0x01, 0x21, 0x01, 0x11, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0xfd, 0x29, 0x02, 0x4b, 0x01, 0x17, 0x01, 0xb2, 0x04, 0x62, 0xe0, 0xfd, 0xb2, 0x02, 0x4e, 0xfa, 0x80, 0x02, 0x50, 0xfd, 0xb0, 0xdd, 0x01, 0xe4, 0xfe, 0xa2, 0x02, 0xbc, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x07, 0x00, 0x00, 0x17, 0x35, 0x09, 0x01, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x02, 0x4b, 0xfd, 0xb5, 0x05, 0xad, 0xfd, 0x2a, 0x3e, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0xdd, 0xfb, 0x5d, 0xdd, 0x02, 0x50, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x07, 0x00, 0x00, 0x05, 0x09, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x06, 0x70, 0xfd, 0x2a, 0xfd, 0x29, 0x05, 0xad, 0xfd, 0xb5, 0x02, 0x4b, 0x3e, 0x02, 0x50, 0xfd, 0xb0, 0xdd, 0x04, 0xa3, 0xdd, 0xfe, 0x1e, 0xfe, 0x1f, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x03, 0xf4, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x3f, 0x02, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x26, 0x27, 0x01, 0x15, 0x21, 0x35, 0xc3, 0x5d, 0x98, 0x4e, 0x54, 0x8c, 0x13, 0x0e, 0x84, 0x63, 0x58, 0xa1, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x0f, 0x84, 0x63, 0x57, 0xa1, 0x5f, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xf4, 0x55, 0x4b, 0x3d, 0x09, 0x06, 0x3b, 0x45, 0x4e, 0xb2, 0x53, 0x4c, 0x3d, 0x06, 0x02, 0x07, 0x3b, 0x45, 0x4f, 0xfe, 0xc8, 0xaa, 0xaa, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x04, 0xed, 0x04, 0xa2, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x00, 0x13, 0x12, 0x01, 0x33, 0x00, 0x03, 0x23, 0x02, 0x59, 0xc2, 0x01, 0x4f, 0x39, 0x42, 0x01, 0x46, 0xc2, 0xfe, 0x65, 0x5b, 0xa8, 0x5b, 0x04, 0xa2, 0xfe, 0x90, 0xfe, 0x25, 0x01, 0xda, 0x01, 0x71, 0xfe, 0x81, 0xfc, 0xdd, 0x03, 0x23, 0x00, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x04, 0xed, 0x04, 0xa2, 0x00, 0x0a, 0x00, 0x00, 0x33, 0x00, 0x13, 0x33, 0x12, 0x01, 0x23, 0x00, 0x03, 0x02, 0x01, 0x59, 0x01, 0x9b, 0x5b, 0xa8, 0x5b, 0x01, 0x9b, 0xc2, 0xfe, 0xba, 0x42, 0x39, 0xfe, 0xb1, 0x01, 0x7f, 0x03, 0x23, 0xfc, 0xdd, 0xfe, 0x81, 0x01, 0x71, 0x01, 0xda, 0xfe, 0x25, 0xfe, 0x90, 0x00, 0x02, 0x00, 0xab, 0xff, 0xfa, 0x05, 0x46, 0x05, 0x0a, 0x00, 0x13, 0x00, 0x29, 0x00, 0x00, 0x01, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x21, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x05, 0x45, 0xfd, 0xad, 0x34, 0x24, 0x24, 0x48, 0x34, 0x02, 0x53, 0xfd, 0xac, 0x73, 0x51, 0x50, 0xa0, 0x74, 0x02, 0x54, 0xfd, 0xad, 0xf4, 0xa9, 0xaa, 0xaa, 0xa7, 0xf4, 0x02, 0x55, 0xfd, 0xac, 0xb4, 0x7c, 0x7d, 0x7d, 0x7c, 0xb5, 0x02, 0x53, 0x03, 0x0c, 0x28, 0x29, 0x39, 0x3a, 0x50, 0xaa, 0x5a, 0x58, 0x82, 0x80, 0xb4, 0xfc, 0x44, 0xbd, 0xbe, 0x01, 0x0d, 0x01, 0x0c, 0xbf, 0xbd, 0xaa, 0x8b, 0x8d, 0xc6, 0xc8, 0x8b, 0x8b, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xfa, 0x05, 0x5e, 0x05, 0x0a, 0x00, 0x13, 0x00, 0x29, 0x00, 0x00, 0x13, 0x35, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0xc3, 0x02, 0x54, 0x74, 0xa0, 0x50, 0x51, 0x73, 0xfd, 0xac, 0x02, 0x53, 0x34, 0x48, 0x24, 0x24, 0x34, 0xfd, 0xad, 0x02, 0x53, 0xb5, 0x7c, 0x7d, 0x7d, 0x7c, 0xb4, 0xfd, 0xac, 0x02, 0x55, 0xf4, 0xa7, 0xaa, 0xaa, 0xa9, 0xf4, 0x03, 0x0c, 0xaa, 0xb4, 0x80, 0x82, 0x58, 0x5a, 0xaa, 0x50, 0x3a, 0x39, 0x29, 0x28, 0xfc, 0xee, 0xaa, 0x8b, 0x8b, 0xc8, 0xc6, 0x8d, 0x8b, 0xaa, 0xbd, 0xbf, 0xfe, 0xf4, 0xfe, 0xf3, 0xbe, 0xbd, 0x00, 0x00, 0x02, 0x00, 0xbd, 0x00, 0x00, 0x05, 0x4c, 0x05, 0x4e, 0x00, 0x11, 0x00, 0x24, 0x00, 0x00, 0x21, 0x11, 0x34, 0x26, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x10, 0x00, 0x20, 0x17, 0x16, 0x19, 0x01, 0x23, 0x11, 0x34, 0x27, 0x26, 0x20, 0x07, 0x06, 0x15, 0x11, 0x03, 0x80, 0x48, 0x68, 0x48, 0x99, 0x51, 0x4f, 0x75, 0x73, 0xa2, 0xfc, 0xa4, 0x01, 0x56, 0x01, 0xe2, 0xad, 0xa9, 0x99, 0x7c, 0x7e, 0xfe, 0x98, 0x7c, 0x7e, 0x02, 0xc6, 0x3a, 0x50, 0x50, 0x3a, 0xfd, 0x3a, 0x02, 0xc8, 0x80, 0x5a, 0x58, 0xb2, 0x80, 0xfd, 0x38, 0x02, 0xc6, 0x01, 0x10, 0x01, 0x78, 0xbc, 0xba, 0xfe, 0xf0, 0xfd, 0x38, 0x02, 0xc8, 0xc8, 0x8a, 0x8a, 0x8a, 0x8a, 0xca, 0xfd, 0x3a, 0x00, 0x00, 0x00, 0x02, 0x00, 0xbd, 0xff, 0xe3, 0x05, 0x4c, 0x05, 0x31, 0x00, 0x11, 0x00, 0x24, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x10, 0x00, 0x20, 0x27, 0x26, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x11, 0x02, 0x88, 0x48, 0x68, 0x48, 0x99, 0x51, 0x4f, 0x75, 0x73, 0xa2, 0x03, 0x5c, 0xfe, 0xaa, 0xfe, 0x1e, 0xad, 0xa9, 0x99, 0x7c, 0x7e, 0x01, 0x68, 0x7c, 0x7e, 0x05, 0x31, 0xfd, 0x3a, 0x3a, 0x50, 0x50, 0x3a, 0x02, 0xc6, 0xfd, 0x38, 0x80, 0x5a, 0x58, 0xb2, 0x80, 0x02, 0xc8, 0xfd, 0x3a, 0xfe, 0xf0, 0xfe, 0x88, 0xbc, 0xba, 0x01, 0x10, 0x02, 0xc8, 0xfd, 0x38, 0xc8, 0x8a, 0x8a, 0x8a, 0x8a, 0xca, 0x02, 0xc6, 0x00, 0x01, 0x01, 0x56, 0x00, 0x00, 0x04, 0xb3, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x17, 0x16, 0x15, 0x11, 0x23, 0x04, 0x19, 0x51, 0x34, 0x43, 0x99, 0x44, 0x34, 0x51, 0x99, 0x7e, 0x61, 0x83, 0x99, 0x84, 0x61, 0x7c, 0x99, 0x02, 0x9f, 0x80, 0x59, 0x3a, 0x14, 0xfc, 0x3a, 0x03, 0xc6, 0x13, 0x3a, 0x5a, 0x80, 0xfd, 0x61, 0x02, 0x9d, 0xc8, 0x8c, 0x6c, 0x17, 0x01, 0x61, 0xfe, 0x9f, 0x17, 0x6c, 0x8a, 0xc8, 0xfd, 0x61, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x34, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x27, 0x35, 0x23, 0x15, 0x03, 0xea, 0x99, 0x99, 0x99, 0xfe, 0xa4, 0x01, 0x5c, 0xfe, 0xa4, 0x01, 0x5c, 0x99, 0x99, 0x99, 0x01, 0x5b, 0xfe, 0xa5, 0x01, 0x5b, 0xfe, 0xa5, 0x99, 0x99, 0xcc, 0x02, 0x2c, 0xfd, 0xd4, 0x02, 0x2c, 0xaa, 0xf0, 0xa8, 0x02, 0x33, 0xfd, 0xcd, 0x02, 0x33, 0xfd, 0xcd, 0xa8, 0xf0, 0xaa, 0xaa, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x5e, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x04, 0x2d, 0xbe, 0xbe, 0x01, 0x18, 0xfc, 0x5f, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0x00, 0xfe, 0x01, 0xee, 0xfe, 0x91, 0xfe, 0x93, 0xb6, 0x01, 0xd1, 0xa6, 0x01, 0xd1, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x5e, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x01, 0x1d, 0xbe, 0xbe, 0x5a, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x9f, 0x03, 0x00, 0xfe, 0x01, 0xee, 0xb6, 0xfe, 0x2f, 0xa6, 0xfe, 0x2f, 0xb6, 0x01, 0x6d, 0x00, 0x03, 0x00, 0x85, 0x00, 0x2e, 0x09, 0xb8, 0x04, 0xdf, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x09, 0xb8, 0xfd, 0x18, 0x02, 0xe8, 0xfc, 0x35, 0x03, 0xcb, 0xfd, 0x4c, 0xfd, 0x19, 0x02, 0xe7, 0xfc, 0x36, 0x03, 0xca, 0xfd, 0x4b, 0xfd, 0x19, 0x02, 0xe7, 0xfc, 0x36, 0x03, 0xca, 0x04, 0x11, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0xce, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0xce, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x85, 0x00, 0x2e, 0x09, 0xb8, 0x04, 0xdf, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x85, 0x03, 0xca, 0xfc, 0x36, 0x02, 0xe8, 0x33, 0x03, 0xca, 0xfc, 0x36, 0x02, 0xe8, 0x35, 0x03, 0xcb, 0xfc, 0x35, 0x02, 0xe8, 0x04, 0x11, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x01, 0x90, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x01, 0x90, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x2e, 0x05, 0x46, 0x06, 0xd4, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x00, 0x13, 0x09, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0x11, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0xc3, 0x03, 0x61, 0xfc, 0x9f, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xfe, 0xde, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x03, 0xfe, 0xaa, 0x03, 0x4e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x2e, 0x05, 0x46, 0x06, 0xd4, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0x9f, 0xfe, 0xdf, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xfe, 0xde, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x02, 0x39, 0xaa, 0xaa, 0x03, 0xf8, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x15, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x35, 0x21, 0x15, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0xfe, 0xde, 0x04, 0x82, 0xb0, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x02, 0x39, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x37, 0x09, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0xc3, 0x03, 0x61, 0xfc, 0x9f, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xb0, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x03, 0xfe, 0xaa, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x57, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x05, 0x35, 0x24, 0x01, 0x11, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x15, 0x00, 0x05, 0x04, 0x05, 0x45, 0xfe, 0x7f, 0xfc, 0xff, 0x03, 0x12, 0x01, 0x70, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x04, 0x80, 0xfe, 0x5f, 0x85, 0xae, 0x91, 0x01, 0xbe, 0xfa, 0xa9, 0xd7, 0x01, 0x80, 0x7c, 0xa6, 0x84, 0x01, 0x78, 0xd7, 0xfe, 0xe5, 0x5d, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x57, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x13, 0x35, 0x00, 0x05, 0x15, 0x24, 0x01, 0x00, 0x25, 0x24, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0xc3, 0x01, 0x70, 0x03, 0x12, 0xfc, 0xff, 0xfe, 0x7f, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0xfe, 0xa7, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x04, 0x80, 0xd7, 0xfe, 0x42, 0x91, 0xae, 0x85, 0xfd, 0x21, 0x01, 0x1b, 0x5d, 0x5d, 0x01, 0x1b, 0xd7, 0xfe, 0x88, 0x84, 0xa6, 0x7c, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x93, 0x05, 0x46, 0x06, 0x1d, 0x00, 0x21, 0x00, 0x26, 0x00, 0x00, 0x21, 0x15, 0x02, 0x25, 0x01, 0x27, 0x13, 0x26, 0x27, 0x35, 0x16, 0x17, 0x37, 0x26, 0x25, 0x35, 0x24, 0x25, 0x13, 0x17, 0x03, 0x36, 0x37, 0x15, 0x06, 0x0f, 0x01, 0x04, 0x17, 0x15, 0x26, 0x25, 0x07, 0x04, 0x01, 0x37, 0x06, 0x07, 0x16, 0x05, 0x45, 0xf2, 0xfe, 0x59, 0xff, 0x00, 0x76, 0xf4, 0xa7, 0xc0, 0xe6, 0xc4, 0x39, 0xd8, 0xfe, 0xf5, 0x01, 0x8a, 0x01, 0x1b, 0xde, 0x75, 0x95, 0xaa, 0x75, 0xb4, 0xcc, 0x5e, 0x01, 0x01, 0xdd, 0xc4, 0xfe, 0xa6, 0x39, 0x01, 0x70, 0xfe, 0x88, 0x2b, 0x66, 0x6b, 0x55, 0xd7, 0x01, 0x25, 0xa4, 0xfd, 0xa1, 0x4b, 0x02, 0x41, 0x36, 0x23, 0xae, 0x28, 0x41, 0x87, 0x46, 0x2b, 0xa6, 0x3c, 0x7a, 0x02, 0x0c, 0x4b, 0xfe, 0x9f, 0x64, 0x82, 0xd7, 0x94, 0x60, 0xdf, 0x67, 0xb6, 0xd7, 0xd6, 0x87, 0x88, 0x94, 0x01, 0xe2, 0x66, 0x23, 0x17, 0x12, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x93, 0x05, 0x46, 0x06, 0x1d, 0x00, 0x21, 0x00, 0x26, 0x00, 0x00, 0x13, 0x35, 0x16, 0x05, 0x13, 0x17, 0x03, 0x16, 0x17, 0x15, 0x04, 0x0f, 0x01, 0x24, 0x25, 0x15, 0x04, 0x05, 0x03, 0x27, 0x13, 0x06, 0x07, 0x35, 0x36, 0x3f, 0x01, 0x04, 0x07, 0x35, 0x36, 0x25, 0x37, 0x24, 0x05, 0x07, 0x36, 0x37, 0x26, 0xc3, 0xe2, 0x01, 0xa8, 0xf9, 0x75, 0xea, 0xac, 0xc8, 0xfe, 0xd9, 0xea, 0x50, 0x01, 0x0b, 0x01, 0x56, 0xfe, 0x65, 0xfe, 0xd8, 0xd6, 0x76, 0x81, 0x8b, 0x69, 0x96, 0xce, 0x5a, 0xfe, 0xea, 0xa8, 0xf7, 0x01, 0x22, 0x32, 0xfe, 0xc1, 0x01, 0xc4, 0x0c, 0x21, 0x20, 0x1b, 0x04, 0x80, 0xd7, 0xfb, 0x8c, 0x02, 0x4d, 0x4b, 0xfd, 0xd6, 0x2e, 0x1f, 0xa6, 0x30, 0x51, 0xbd, 0x74, 0x3b, 0xae, 0x4c, 0x9e, 0xfe, 0x05, 0x4b, 0x01, 0x31, 0x67, 0x7f, 0xd7, 0xa2, 0x76, 0xd5, 0x7d, 0xb7, 0xd7, 0xcb, 0x69, 0x77, 0x69, 0x90, 0x1b, 0x08, 0x07, 0x06, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xdf, 0x05, 0x46, 0x06, 0x23, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x11, 0x21, 0x03, 0x13, 0x21, 0x11, 0x03, 0xdf, 0x90, 0x4f, 0x01, 0x25, 0xfe, 0xa4, 0xc7, 0x02, 0x23, 0xfd, 0xa6, 0x2a, 0x02, 0x84, 0xfd, 0x46, 0x62, 0x90, 0x4f, 0xfe, 0xdb, 0x01, 0x5c, 0x29, 0xfe, 0x7b, 0x02, 0xba, 0xfe, 0xc7, 0xfe, 0x16, 0x06, 0x23, 0x3a, 0xf5, 0xaa, 0xfd, 0x98, 0xaa, 0x80, 0xaa, 0xfe, 0xd1, 0x3a, 0xf5, 0xaa, 0x80, 0x03, 0xbc, 0xfc, 0xee, 0x02, 0x68, 0xfd, 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xdf, 0x05, 0x46, 0x06, 0x23, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x11, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x17, 0x03, 0x21, 0x11, 0x03, 0xdf, 0x90, 0x4f, 0x01, 0x25, 0xfd, 0xa6, 0x2a, 0x02, 0x84, 0xfd, 0x46, 0x62, 0x90, 0x4f, 0xfe, 0xdb, 0x01, 0x5c, 0x29, 0xfe, 0x7b, 0x01, 0xbc, 0xc7, 0xfd, 0x7d, 0x02, 0xba, 0x6c, 0xc7, 0x01, 0x8a, 0x06, 0x23, 0x3a, 0xf5, 0xfc, 0x44, 0x80, 0xaa, 0xfe, 0xd1, 0x3a, 0xf5, 0xaa, 0x80, 0xaa, 0x02, 0x68, 0xaa, 0xaa, 0xfd, 0x98, 0x02, 0x68, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0x3f, 0x05, 0x46, 0x04, 0xf4, 0x00, 0x14, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0xc3, 0x04, 0x82, 0xfc, 0x17, 0x03, 0xe9, 0xfe, 0x80, 0x18, 0x45, 0x01, 0xad, 0xfd, 0xe7, 0x84, 0x7d, 0x46, 0xfe, 0x52, 0x02, 0x1a, 0x51, 0xfd, 0x95, 0x04, 0xf4, 0xaa, 0xfd, 0x98, 0xaa, 0x13, 0x6d, 0xaa, 0xcf, 0x62, 0x6d, 0xaa, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0x3f, 0x05, 0x46, 0x04, 0xf4, 0x00, 0x14, 0x00, 0x00, 0x25, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x17, 0x07, 0x05, 0x45, 0xfd, 0xe7, 0x84, 0x7d, 0x46, 0xfe, 0x52, 0x02, 0x1a, 0x51, 0xfd, 0x95, 0x03, 0xe9, 0xfc, 0x17, 0x04, 0x82, 0xfe, 0x80, 0x18, 0x45, 0xb8, 0xaa, 0xcf, 0x62, 0x6d, 0xaa, 0x80, 0xaa, 0x02, 0x68, 0xaa, 0xfc, 0x44, 0x13, 0x6d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xe5, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x25, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x02, 0x9c, 0x59, 0x3d, 0x4f, 0x9b, 0x58, 0x5e, 0xa1, 0x58, 0x54, 0x6c, 0x63, 0x8b, 0x5e, 0x5b, 0x3d, 0x4e, 0x98, 0x5d, 0x5f, 0xa1, 0x57, 0x57, 0x6d, 0x61, 0x8c, 0x03, 0x07, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x11, 0x1f, 0x4c, 0x54, 0xb4, 0x4e, 0x44, 0x2a, 0xf3, 0x46, 0xe9, 0x20, 0x4a, 0x56, 0xb4, 0x4e, 0x44, 0x2b, 0xf0, 0x46, 0x04, 0xcd, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xe5, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x25, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x02, 0x9c, 0x59, 0x3d, 0x4f, 0x9b, 0x58, 0x5e, 0xa1, 0x58, 0x54, 0x6c, 0x63, 0x8b, 0x5e, 0x5b, 0x3d, 0x4e, 0x98, 0x5d, 0x5f, 0xa1, 0x57, 0x57, 0x6d, 0x61, 0x8c, 0xfe, 0x85, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x11, 0x1f, 0x4c, 0x54, 0xb4, 0x4e, 0x44, 0x2a, 0xf3, 0x46, 0xe9, 0x20, 0x4a, 0x56, 0xb4, 0x4e, 0x44, 0x2b, 0xf0, 0x46, 0x04, 0xcd, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xa6, 0x05, 0x46, 0x05, 0x57, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x00, 0x05, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x02, 0x9c, 0x5a, 0x3c, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x54, 0x6c, 0x63, 0x8c, 0x5f, 0x5b, 0x3e, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x56, 0x6d, 0x62, 0x8b, 0x03, 0x07, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0x2e, 0x20, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x2b, 0xf3, 0x46, 0xe9, 0x20, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x2c, 0xf1, 0x46, 0x05, 0x94, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x02, 0x00, 0xca, 0xfe, 0xa2, 0x05, 0x4d, 0x05, 0x57, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x00, 0x05, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0x02, 0xa3, 0x59, 0x3d, 0x4f, 0x9b, 0x59, 0x5f, 0xa1, 0x57, 0x54, 0x6d, 0x62, 0x8c, 0x5f, 0x5b, 0x3e, 0x4e, 0x98, 0x5c, 0x5e, 0xa1, 0x58, 0x56, 0x6d, 0x61, 0x8c, 0xfe, 0x85, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xad, 0xfe, 0x53, 0x33, 0x20, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x2b, 0xf4, 0x46, 0xea, 0x20, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x2c, 0xf0, 0x46, 0x05, 0x98, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xf6, 0x05, 0x46, 0x06, 0x0c, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x17, 0x03, 0x37, 0x11, 0x25, 0x03, 0x27, 0x13, 0x25, 0x35, 0x01, 0x13, 0x11, 0x07, 0x03, 0x27, 0x13, 0x05, 0x04, 0x6a, 0x8e, 0x76, 0xc3, 0xfd, 0xf4, 0xc6, 0x8e, 0xc6, 0xfe, 0x18, 0x02, 0xf8, 0xf1, 0x7d, 0xbb, 0x8e, 0x82, 0xfe, 0x3c, 0x06, 0x0c, 0x40, 0xfe, 0xc1, 0x59, 0xfb, 0x38, 0xf0, 0xfd, 0xe8, 0x40, 0x02, 0x19, 0xe0, 0xa6, 0x01, 0x5c, 0xfc, 0xef, 0x02, 0xc4, 0x39, 0xfe, 0x04, 0x40, 0x01, 0x61, 0xce, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xf6, 0x05, 0x46, 0x06, 0x0c, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x27, 0x13, 0x07, 0x11, 0x05, 0x13, 0x17, 0x03, 0x05, 0x15, 0x01, 0x03, 0x11, 0x37, 0x13, 0x17, 0x03, 0x25, 0x01, 0x9f, 0x8e, 0x75, 0xc3, 0x02, 0x0d, 0xc5, 0x8e, 0xc6, 0x01, 0xe8, 0xfd, 0x09, 0xf2, 0x7d, 0xbc, 0x8e, 0x82, 0x01, 0xc3, 0xfe, 0xf6, 0x40, 0x01, 0x3f, 0x59, 0x04, 0xc8, 0xf0, 0x02, 0x18, 0x40, 0xfd, 0xe7, 0xe0, 0xa6, 0xfe, 0xa4, 0x03, 0x11, 0xfd, 0x3c, 0x39, 0x01, 0xfc, 0x40, 0xfe, 0x9f, 0xce, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x7d, 0x05, 0x46, 0x06, 0x85, 0x00, 0x03, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x11, 0x07, 0x03, 0x01, 0x35, 0x21, 0x13, 0x25, 0x35, 0x01, 0x13, 0x17, 0x03, 0x37, 0x11, 0x25, 0x03, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x01, 0x13, 0x05, 0x04, 0xac, 0x7f, 0xbb, 0xfd, 0x51, 0x01, 0x56, 0x90, 0xfe, 0x1a, 0x02, 0xf5, 0xae, 0x8e, 0x74, 0xc5, 0xfd, 0xf2, 0x78, 0x02, 0x86, 0xfd, 0x3b, 0x6a, 0x8e, 0x52, 0x01, 0x0a, 0x81, 0xfe, 0x3f, 0x01, 0x9e, 0x02, 0xc4, 0x3a, 0xfe, 0x05, 0xfd, 0x71, 0xaa, 0x01, 0x86, 0xdf, 0xa6, 0x01, 0x5b, 0x01, 0xd7, 0x40, 0xfe, 0xc5, 0x5a, 0xfb, 0x38, 0xf1, 0xfe, 0xbb, 0xaa, 0xfe, 0xdf, 0x40, 0xe1, 0x02, 0xd0, 0x01, 0x5f, 0xcd, 0x00, 0x00, 0x00, 0x03, 0x00, 0xbf, 0xfe, 0x7d, 0x05, 0x42, 0x06, 0x85, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x00, 0x37, 0x11, 0x01, 0x13, 0x17, 0x03, 0x05, 0x15, 0x01, 0x03, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x23, 0x35, 0x33, 0x37, 0x13, 0x25, 0x11, 0x37, 0x01, 0x03, 0x25, 0xc0, 0x02, 0x61, 0xd2, 0x8e, 0xd2, 0x01, 0x93, 0xfd, 0x80, 0x76, 0x02, 0xf6, 0xfc, 0xcb, 0x6b, 0x8e, 0x53, 0xa7, 0xe6, 0x54, 0xec, 0xfe, 0x73, 0xf4, 0x01, 0x27, 0x60, 0x01, 0x4c, 0x9c, 0x04, 0xc8, 0xfe, 0xe9, 0x02, 0x38, 0x40, 0xfd, 0xc7, 0xb9, 0xa6, 0xfe, 0xdb, 0xfe, 0xc0, 0xaa, 0xfe, 0xdf, 0x40, 0xe1, 0xaa, 0xe4, 0x02, 0x81, 0xb5, 0xfd, 0x3c, 0x70, 0x01, 0x5e, 0xfe, 0xfc, 0x98, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x3a, 0xff, 0x42, 0x03, 0xf9, 0x05, 0xb8, 0x10, 0x27, 0x09, 0xa1, 0x02, 0x75, 0xfc, 0xfa, 0x10, 0x27, 0x09, 0xa1, 0x02, 0x75, 0x02, 0x72, 0x10, 0x07, 0x09, 0xa1, 0x02, 0x75, 0xff, 0xb6, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd4, 0x01, 0xfe, 0x06, 0x5e, 0x02, 0xfc, 0x10, 0x26, 0x09, 0xa1, 0x0f, 0xb6, 0x10, 0x27, 0x09, 0xa1, 0x02, 0x75, 0xff, 0xb6, 0x10, 0x07, 0x09, 0xa1, 0x04, 0xdb, 0xff, 0xb6, 0xff, 0xff, 0x00, 0xd4, 0xff, 0x42, 0x06, 0x5e, 0x05, 0xb8, 0x10, 0x27, 0x09, 0xa1, 0x00, 0x0f, 0xfc, 0xfa, 0x10, 0x27, 0x09, 0xa1, 0x04, 0xdb, 0x02, 0x72, 0x10, 0x07, 0x09, 0xa1, 0x02, 0x75, 0xff, 0xb6, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd4, 0xff, 0x42, 0x06, 0x5e, 0x05, 0xb8, 0x10, 0x27, 0x09, 0xa1, 0x04, 0xdb, 0xfc, 0xfa, 0x10, 0x27, 0x09, 0xa1, 0x00, 0x0f, 0x02, 0x72, 0x10, 0x07, 0x09, 0xa1, 0x02, 0x75, 0xff, 0xb6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xff, 0xec, 0x06, 0xe4, 0x05, 0xae, 0x00, 0x21, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x27, 0x26, 0x01, 0xdf, 0xfe, 0x70, 0x01, 0x8e, 0x0d, 0x46, 0x54, 0x01, 0x41, 0xad, 0x02, 0x72, 0xfd, 0x8d, 0x85, 0x7c, 0x7c, 0x44, 0x3a, 0x07, 0x04, 0x75, 0xfb, 0x8d, 0x06, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8e, 0xad, 0xfe, 0xbf, 0x54, 0x41, 0x02, 0x73, 0xa0, 0x94, 0x8f, 0xb0, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0xb0, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x16, 0x12, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x10, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x0e, 0x01, 0x02, 0x07, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x01, 0x35, 0x06, 0x7b, 0xfa, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0xf9, 0x7d, 0x08, 0x03, 0xe6, 0x90, 0x90, 0x02, 0x73, 0x4a, 0xfe, 0xfd, 0x9a, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0x01, 0x74, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x9c, 0xfe, 0xfe, 0x5d, 0x01, 0x10, 0xfd, 0x40, 0x01, 0x10, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x04, 0x67, 0x00, 0x19, 0x00, 0x00, 0x25, 0x20, 0x24, 0x10, 0x24, 0x29, 0x01, 0x15, 0x21, 0x22, 0x07, 0x06, 0x07, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x16, 0x17, 0x16, 0x33, 0x21, 0x15, 0x02, 0xda, 0xfe, 0xf6, 0xfe, 0xf3, 0x01, 0x0d, 0x01, 0x0a, 0x01, 0x8e, 0xfe, 0x72, 0xcf, 0x60, 0x47, 0x1a, 0x02, 0x9e, 0x80, 0x80, 0xfd, 0x62, 0x22, 0x3f, 0x66, 0xc9, 0x01, 0x8e, 0x9b, 0xf6, 0x01, 0xe0, 0xf6, 0x8e, 0x51, 0x3b, 0x84, 0xac, 0xfe, 0x1a, 0xac, 0x91, 0x30, 0x51, 0x8e, 0x00, 0xff, 0xff, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x07, 0x48, 0x10, 0x26, 0x08, 0xe4, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x01, 0xff, 0x04, 0x02, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x06, 0xd2, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x11, 0x21, 0x35, 0x21, 0x01, 0x35, 0x06, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0x7c, 0x7d, 0x43, 0x3a, 0x08, 0x04, 0x76, 0xfb, 0x2e, 0x04, 0xd2, 0x02, 0x73, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x03, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x05, 0x7d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x00, 0x25, 0x20, 0x24, 0x35, 0x34, 0x24, 0x29, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x21, 0x15, 0x11, 0x21, 0x35, 0x21, 0x02, 0xda, 0xfe, 0xf6, 0xfe, 0xf3, 0x01, 0x0d, 0x01, 0x0a, 0x01, 0x8e, 0xfe, 0x72, 0xd1, 0x5e, 0x46, 0x1b, 0x03, 0x1e, 0xfc, 0xe2, 0x21, 0x40, 0x67, 0xc8, 0x01, 0x8e, 0xfc, 0x7e, 0x03, 0x82, 0x9b, 0xf6, 0xf0, 0xf0, 0xf6, 0x8e, 0x01, 0x01, 0x4f, 0x3a, 0x85, 0x8e, 0x91, 0x30, 0x51, 0x8e, 0x04, 0x56, 0x8c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xda, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x11, 0x21, 0x35, 0x21, 0x01, 0x35, 0x06, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0x7c, 0x7d, 0x43, 0x3a, 0x08, 0x04, 0x76, 0xfb, 0x2e, 0x04, 0xd2, 0x02, 0x73, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0xfc, 0x67, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x01, 0x35, 0x04, 0x73, 0xfb, 0xbc, 0x10, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0x7c, 0x7d, 0x43, 0x0d, 0x0b, 0x04, 0x4c, 0xfb, 0x8d, 0x02, 0x73, 0xa0, 0x22, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x1b, 0x1a, 0xa0, 0x00, 0x01, 0x00, 0x4f, 0xff, 0xec, 0x06, 0xe4, 0x05, 0xae, 0x00, 0x21, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x04, 0x23, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x04, 0x17, 0x16, 0x05, 0x54, 0x01, 0x90, 0xfe, 0x72, 0x0d, 0x46, 0x54, 0xfe, 0xbf, 0xac, 0xfd, 0x8d, 0x02, 0x73, 0x85, 0x7c, 0x7c, 0x44, 0x3a, 0x07, 0xfb, 0x8b, 0x04, 0x74, 0x07, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0xfd, 0x8d, 0x02, 0x73, 0xac, 0x01, 0x41, 0x54, 0x41, 0x03, 0x27, 0xa0, 0x94, 0x8f, 0xb0, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0xb0, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x26, 0x02, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x21, 0x35, 0x21, 0x3e, 0x01, 0x12, 0x37, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x05, 0x11, 0x06, 0x7c, 0xf9, 0x85, 0xfd, 0x8d, 0x02, 0x73, 0xad, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xad, 0xfd, 0x8d, 0x02, 0x73, 0x85, 0xf8, 0x7e, 0x08, 0xfc, 0x1a, 0x90, 0x90, 0x03, 0x27, 0x4a, 0x01, 0x03, 0x9a, 0x01, 0x9f, 0xc6, 0xfe, 0xa0, 0xfe, 0x8c, 0xfe, 0xa0, 0xc8, 0x9f, 0x01, 0x9c, 0x01, 0x02, 0x5d, 0xfe, 0xf0, 0x02, 0xc0, 0xfe, 0xf0, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x04, 0x67, 0x00, 0x19, 0x00, 0x00, 0x01, 0x20, 0x04, 0x10, 0x04, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x37, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x26, 0x27, 0x26, 0x23, 0x25, 0x35, 0x02, 0x51, 0x01, 0x0a, 0x01, 0x0d, 0xfe, 0xf3, 0xfe, 0xf6, 0xfe, 0x72, 0x01, 0x8e, 0xcf, 0x60, 0x46, 0x1b, 0xfd, 0x62, 0x80, 0x80, 0x02, 0x9e, 0x21, 0x40, 0x67, 0xc8, 0xfe, 0x72, 0x04, 0x67, 0xf6, 0xfe, 0x20, 0xf6, 0x8e, 0x51, 0x3a, 0x85, 0xac, 0x01, 0xe6, 0xac, 0x91, 0x30, 0x50, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x06, 0xd2, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x04, 0x12, 0x15, 0x14, 0x02, 0x04, 0x23, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x05, 0x11, 0x06, 0x39, 0x43, 0x7e, 0x7b, 0x85, 0xfd, 0x8d, 0x02, 0x73, 0xad, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xad, 0xfd, 0x8d, 0x02, 0x73, 0x85, 0x7b, 0x7d, 0x44, 0x3a, 0x08, 0xfb, 0x8a, 0x04, 0xd1, 0xfb, 0x2f, 0x04, 0xd1, 0x03, 0x27, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0xfe, 0xa0, 0xbb, 0xb9, 0xfe, 0xa0, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x03, 0x0b, 0xa0, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x05, 0x7d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x20, 0x04, 0x15, 0x14, 0x04, 0x29, 0x01, 0x35, 0x25, 0x32, 0x37, 0x36, 0x37, 0x21, 0x35, 0x05, 0x26, 0x27, 0x26, 0x07, 0x21, 0x35, 0x25, 0x21, 0x35, 0x21, 0x02, 0x51, 0x01, 0x0a, 0x01, 0x0d, 0xfe, 0xf3, 0xfe, 0xf6, 0xfe, 0x72, 0x01, 0x8e, 0xd1, 0x5e, 0x46, 0x1b, 0xfc, 0xe2, 0x03, 0x1e, 0x22, 0x3f, 0x68, 0xc7, 0xfe, 0x72, 0x03, 0x82, 0xfc, 0x7e, 0x03, 0x82, 0x04, 0x67, 0xf6, 0xf1, 0xef, 0xf6, 0x8e, 0x01, 0x50, 0x3a, 0x85, 0x8e, 0x01, 0x91, 0x31, 0x52, 0x01, 0x8e, 0x8a, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x83, 0x05, 0xc2, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x05, 0x82, 0xfb, 0xda, 0x04, 0x26, 0xfb, 0x41, 0x04, 0xbf, 0xfb, 0xda, 0x04, 0x26, 0x02, 0x82, 0xfe, 0x28, 0xaa, 0x05, 0xc2, 0xaa, 0xfe, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x42, 0xff, 0xdc, 0x04, 0x15, 0x04, 0x1c, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x23, 0x00, 0x00, 0x01, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x00, 0x05, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x02, 0x2a, 0xa8, 0x80, 0x6a, 0x59, 0x6a, 0x63, 0xfe, 0xe3, 0xc7, 0xa5, 0x7f, 0x6a, 0x59, 0x69, 0x64, 0x01, 0x1c, 0x01, 0x94, 0x5a, 0x74, 0x91, 0xd2, 0x40, 0x59, 0x59, 0x71, 0x93, 0xd2, 0x3e, 0x04, 0x17, 0x71, 0x76, 0x63, 0x76, 0x8d, 0xba, 0xdd, 0xfe, 0xc4, 0x6f, 0x76, 0x63, 0x76, 0x8d, 0xba, 0xdf, 0x01, 0x3c, 0xd5, 0x48, 0xe9, 0xa5, 0x80, 0x63, 0x62, 0x47, 0xe9, 0xa3, 0x80, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x66, 0x01, 0x4c, 0x03, 0xe4, 0x03, 0x8c, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x01, 0x35, 0x05, 0x11, 0x01, 0x15, 0x02, 0x5f, 0xfe, 0x08, 0x01, 0x84, 0x01, 0xf8, 0x02, 0x7a, 0xfe, 0xd2, 0x01, 0x4a, 0xc2, 0xfa, 0x01, 0x2e, 0xfe, 0xb6, 0xc2, 0x00, 0x00, 0x02, 0x00, 0x83, 0x00, 0x00, 0x04, 0x0f, 0x04, 0xc4, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x09, 0x01, 0x11, 0x25, 0x21, 0x11, 0x09, 0x01, 0x83, 0x01, 0xc6, 0x01, 0xc6, 0xfd, 0x0a, 0x02, 0x60, 0xfe, 0xd0, 0xfe, 0xd0, 0x02, 0xa0, 0x02, 0x24, 0xfd, 0xdc, 0xfd, 0x60, 0xaa, 0x01, 0xd5, 0x01, 0x79, 0xfe, 0x87, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x03, 0xda, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x07, 0x00, 0x00, 0x01, 0x03, 0x27, 0x01, 0x33, 0x01, 0x07, 0x03, 0x02, 0xdc, 0xf7, 0x6c, 0x01, 0x63, 0x51, 0x01, 0x61, 0x6c, 0xf5, 0x04, 0xea, 0xfe, 0xf0, 0x78, 0x01, 0x8a, 0xfe, 0x76, 0x78, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x02, 0x02, 0x00, 0x07, 0x00, 0x00, 0x25, 0x33, 0x13, 0x17, 0x01, 0x23, 0x01, 0x37, 0x02, 0xdc, 0x51, 0xf5, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9d, 0x6c, 0xf2, 0x01, 0x10, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0x00, 0x00, 0xff, 0xff, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x03, 0x3f, 0x10, 0x26, 0x11, 0x49, 0x00, 0x00, 0x10, 0x07, 0x09, 0xdf, 0x00, 0x00, 0xfc, 0x26, 0xff, 0xff, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x04, 0x1b, 0x10, 0x27, 0x11, 0x49, 0x00, 0x00, 0x00, 0xdc, 0x10, 0x26, 0x11, 0x49, 0x00, 0xd7, 0x10, 0x07, 0x09, 0xdf, 0x00, 0x00, 0xfc, 0x26, 0x00, 0x01, 0x01, 0x1b, 0xff, 0xc5, 0x02, 0x69, 0x06, 0x4e, 0x00, 0x19, 0x00, 0x00, 0x01, 0x17, 0x06, 0x14, 0x17, 0x16, 0x14, 0x07, 0x06, 0x14, 0x17, 0x16, 0x14, 0x07, 0x27, 0x36, 0x34, 0x27, 0x26, 0x34, 0x37, 0x36, 0x34, 0x27, 0x26, 0x34, 0x01, 0x8b, 0x6e, 0x45, 0x45, 0x6f, 0x6f, 0x45, 0x45, 0x6f, 0x6f, 0x6e, 0x45, 0x45, 0x6f, 0x6f, 0x45, 0x45, 0x6f, 0x06, 0x4e, 0x76, 0x4f, 0x70, 0x50, 0x81, 0xf8, 0x81, 0x50, 0x6f, 0x50, 0x81, 0xf9, 0x81, 0x76, 0x4f, 0x70, 0x50, 0x81, 0xf8, 0x81, 0x50, 0x70, 0x50, 0x81, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x23, 0x9e, 0x01, 0x7e, 0xd8, 0xa6, 0x06, 0x14, 0x8f, 0xf9, 0x6d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb3, 0xfe, 0xf2, 0x02, 0x31, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x02, 0x31, 0xa6, 0xd8, 0x06, 0x14, 0xf8, 0xde, 0x06, 0x93, 0x8f, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x33, 0x15, 0x9e, 0xa6, 0xd8, 0xfe, 0xf2, 0x07, 0x22, 0xf9, 0x6d, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb3, 0xfe, 0xf2, 0x02, 0x31, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x35, 0x33, 0x11, 0x33, 0x02, 0x31, 0xfe, 0x82, 0xd8, 0xa6, 0xfe, 0xf2, 0x8f, 0x06, 0x93, 0x00, 0x00, 0x02, 0x02, 0xa8, 0xff, 0x62, 0x05, 0x78, 0x02, 0x82, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x13, 0x35, 0x21, 0x15, 0x02, 0xa8, 0x82, 0x82, 0xb4, 0x02, 0x1c, 0x01, 0xba, 0xfd, 0xa8, 0x02, 0x90, 0x90, 0x90, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0x62, 0x03, 0x2a, 0x02, 0x82, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x05, 0x33, 0x11, 0x23, 0x02, 0x76, 0xfd, 0xe4, 0x02, 0x4e, 0x82, 0x82, 0x02, 0x82, 0x90, 0x90, 0xc8, 0xfd, 0xa8, 0x00, 0x00, 0x02, 0x02, 0xa8, 0x01, 0xf2, 0x05, 0x78, 0x05, 0x12, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x25, 0x23, 0x11, 0x33, 0x03, 0x5c, 0x02, 0x1c, 0xfd, 0xb2, 0x82, 0x82, 0x01, 0xf2, 0x90, 0x90, 0xc8, 0x02, 0x58, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x01, 0xf2, 0x03, 0x2a, 0x05, 0x12, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x25, 0x23, 0x11, 0x33, 0x02, 0x76, 0xfd, 0xe4, 0x02, 0xd0, 0x82, 0x82, 0x02, 0x82, 0x90, 0x90, 0x38, 0x02, 0x58, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x01, 0x1f, 0x05, 0x46, 0x03, 0x5e, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x23, 0x11, 0x05, 0x45, 0xfc, 0x15, 0x97, 0x03, 0x5e, 0xaa, 0xfe, 0x6b, 0x02, 0x3f, 0x00, 0x02, 0x00, 0x05, 0x01, 0x02, 0x03, 0xad, 0x05, 0x12, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x24, 0x05, 0x02, 0x13, 0x04, 0x25, 0x12, 0x03, 0x12, 0x03, 0x04, 0x25, 0x02, 0x13, 0x24, 0x7e, 0x01, 0x5a, 0x01, 0x5b, 0x7c, 0x7c, 0xfe, 0xa5, 0xfe, 0xa6, 0x7c, 0xf5, 0xa6, 0xa6, 0x01, 0xd4, 0x01, 0xd3, 0xa5, 0xa5, 0xfe, 0x2c, 0x01, 0x8a, 0x89, 0x89, 0x01, 0x80, 0x01, 0x82, 0x8a, 0x8a, 0xfe, 0x7e, 0xfd, 0xf8, 0x01, 0xf4, 0x02, 0x1c, 0xb1, 0xb1, 0xfe, 0x0c, 0xfd, 0xe5, 0xb1, 0x00, 0x06, 0x00, 0xde, 0x00, 0x01, 0x06, 0x55, 0x06, 0x13, 0x00, 0x03, 0x00, 0x31, 0x00, 0x3b, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x59, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x14, 0x16, 0x33, 0x13, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x33, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, 0x15, 0x11, 0x15, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x14, 0x01, 0x0b, 0xfe, 0xf5, 0xa6, 0xea, 0xa6, 0xa6, 0x72, 0x99, 0x99, 0x72, 0xa6, 0xa6, 0xea, 0xa6, 0x01, 0x0b, 0xa6, 0x75, 0x76, 0xa5, 0xa5, 0x73, 0x99, 0x99, 0x73, 0xa5, 0xa5, 0x76, 0x75, 0xa6, 0xfe, 0x70, 0x58, 0x3e, 0x3d, 0x58, 0x58, 0x3e, 0x95, 0x95, 0x3e, 0x58, 0x58, 0x3e, 0x3d, 0x58, 0x02, 0x15, 0x96, 0x3e, 0x58, 0x58, 0x7c, 0x58, 0x58, 0x7c, 0x58, 0x58, 0x3e, 0x02, 0x76, 0x01, 0x28, 0xfe, 0x44, 0xaa, 0x80, 0xb7, 0xb8, 0x83, 0x80, 0xba, 0x01, 0x28, 0xba, 0x81, 0x82, 0xb8, 0xb7, 0x80, 0xaa, 0xaa, 0x80, 0xb7, 0xb8, 0x82, 0x81, 0xba, 0xfe, 0xd8, 0xba, 0x80, 0x83, 0xb8, 0xb7, 0x80, 0xaa, 0x02, 0x50, 0xa7, 0x45, 0x61, 0x61, 0x8a, 0x62, 0xfd, 0xb0, 0x62, 0x44, 0x45, 0x62, 0x62, 0x44, 0x02, 0xf7, 0x62, 0x8a, 0x61, 0x61, 0x45, 0xfd, 0x09, 0xa7, 0x44, 0x62, 0x62, 0x45, 0x44, 0x62, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x01, 0x1f, 0x05, 0x46, 0x03, 0x5e, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x11, 0x33, 0x11, 0x21, 0x05, 0x45, 0xfb, 0x7e, 0x97, 0x03, 0xeb, 0x01, 0x1f, 0x02, 0x3f, 0xfe, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0x03, 0x67, 0x02, 0xe8, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x02, 0xe7, 0xfe, 0x39, 0x82, 0x02, 0x49, 0x05, 0x84, 0xfd, 0xe3, 0x02, 0xad, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0x03, 0x67, 0x02, 0xc2, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x13, 0x35, 0x21, 0x11, 0x23, 0x11, 0x79, 0x02, 0x49, 0x82, 0x05, 0x84, 0x90, 0xfd, 0x53, 0x02, 0x1d, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xff, 0x70, 0x02, 0xe8, 0x02, 0x1d, 0x00, 0x05, 0x00, 0x00, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x02, 0xe7, 0xfd, 0xb7, 0x82, 0x90, 0x02, 0xad, 0xfd, 0xe3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0xff, 0x70, 0x02, 0xc2, 0x02, 0x1d, 0x00, 0x05, 0x00, 0x00, 0x33, 0x21, 0x11, 0x33, 0x11, 0x21, 0x79, 0x01, 0xc7, 0x82, 0xfd, 0xb7, 0x02, 0x1d, 0xfd, 0x53, 0x00, 0x00, 0x00, 0x01, 0x01, 0x83, 0xfe, 0x00, 0x03, 0x95, 0x07, 0x6c, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x34, 0x37, 0x1a, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x03, 0x02, 0x15, 0x30, 0x11, 0x01, 0x84, 0x03, 0x0a, 0xab, 0xb6, 0x48, 0x5a, 0x39, 0x32, 0x27, 0x19, 0x15, 0x0e, 0x05, 0x08, 0x0f, 0x5d, 0x10, 0x07, 0xfe, 0x00, 0x05, 0x08, 0x24, 0x81, 0x02, 0x03, 0x01, 0xbc, 0x54, 0x41, 0x36, 0x3f, 0x13, 0x10, 0x26, 0x0f, 0x48, 0xfd, 0x95, 0xfe, 0xd3, 0x02, 0xfa, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x25, 0xfe, 0x1a, 0x02, 0x37, 0x07, 0x89, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x0a, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x13, 0x12, 0x35, 0x30, 0x11, 0x02, 0x36, 0x03, 0x0a, 0xab, 0xb6, 0x48, 0x5a, 0x39, 0x32, 0x27, 0x19, 0x15, 0x0e, 0x05, 0x08, 0x0f, 0x5d, 0x10, 0x07, 0x07, 0x89, 0xfa, 0xf5, 0x24, 0x81, 0xfd, 0xfd, 0xfe, 0x44, 0x54, 0x41, 0x36, 0x3f, 0x13, 0x10, 0x26, 0x0f, 0x48, 0x02, 0x6b, 0x01, 0x2d, 0x02, 0x05, 0x6b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8c, 0x01, 0xd0, 0x07, 0xc0, 0x04, 0x9a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x27, 0x01, 0x33, 0x01, 0x07, 0x01, 0x25, 0x21, 0x35, 0x29, 0x02, 0x15, 0x21, 0x03, 0xfe, 0xfe, 0x55, 0x6c, 0x02, 0x17, 0x50, 0x02, 0x15, 0x6c, 0xfe, 0x57, 0xfe, 0xb3, 0xfd, 0x8b, 0x02, 0x75, 0x02, 0x49, 0x02, 0x76, 0xfd, 0x8a, 0x03, 0xa8, 0xfe, 0x28, 0x78, 0x02, 0x52, 0xfd, 0xae, 0x78, 0x01, 0xd8, 0x48, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8c, 0x00, 0x00, 0x07, 0xc0, 0x04, 0x9a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x01, 0x21, 0x15, 0x21, 0x01, 0x21, 0x25, 0x21, 0x15, 0x21, 0x8c, 0x02, 0x75, 0x02, 0x9a, 0x02, 0x25, 0xfd, 0x8b, 0xfd, 0x66, 0xfd, 0xdb, 0x04, 0xbe, 0x02, 0x76, 0xfd, 0x8a, 0x04, 0x9a, 0xfc, 0x10, 0xaa, 0x03, 0xf0, 0xaa, 0xaa, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x00, 0x0a, 0x2e, 0x06, 0x14, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x00, 0x33, 0x11, 0x21, 0x09, 0x02, 0x11, 0x33, 0x09, 0x01, 0x29, 0x01, 0x09, 0x01, 0x21, 0x09, 0x03, 0x33, 0x09, 0x01, 0x8c, 0x06, 0xe5, 0x02, 0xbd, 0xfd, 0x43, 0xf9, 0xa1, 0x7e, 0x02, 0x38, 0xfd, 0xc8, 0x04, 0x6f, 0xfc, 0x4f, 0x01, 0xd9, 0xfe, 0x27, 0x03, 0xb1, 0xfe, 0x28, 0x02, 0x94, 0xfd, 0xc9, 0x02, 0x37, 0x7f, 0x02, 0x37, 0xfd, 0xc9, 0x06, 0x14, 0xfc, 0xf6, 0xfc, 0xf6, 0x05, 0x80, 0xfb, 0x14, 0x02, 0x76, 0x02, 0x76, 0xfd, 0xf3, 0xfd, 0x21, 0x02, 0x0d, 0x02, 0xdf, 0xfd, 0x8a, 0xfd, 0x8a, 0x02, 0x74, 0x02, 0x78, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x00, 0x07, 0xc0, 0x06, 0x14, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x01, 0x11, 0x33, 0x09, 0x01, 0x29, 0x01, 0x09, 0x01, 0x21, 0x09, 0x03, 0x33, 0x11, 0x8c, 0x07, 0x34, 0xf9, 0x52, 0x7e, 0x02, 0x38, 0xfd, 0xc8, 0x04, 0x6f, 0xfc, 0x4f, 0x01, 0xd9, 0xfe, 0x27, 0x03, 0xb1, 0xfe, 0x28, 0x02, 0x94, 0xfd, 0xc9, 0x02, 0x37, 0x7f, 0x06, 0x14, 0xf9, 0xec, 0x05, 0x80, 0xfb, 0x14, 0x02, 0x76, 0x02, 0x76, 0xfd, 0xf3, 0xfd, 0x21, 0x02, 0x0d, 0x02, 0xdf, 0xfd, 0x8a, 0xfd, 0x8a, 0x04, 0xec, 0x00, 0x00, 0x2b, 0x00, 0x6c, 0x00, 0x00, 0x09, 0xf9, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x53, 0x00, 0x5f, 0x00, 0x6b, 0x00, 0x77, 0x00, 0x83, 0x00, 0x8f, 0x00, 0x9b, 0x00, 0xa7, 0x00, 0xb3, 0x00, 0xbf, 0x00, 0xcb, 0x00, 0xd7, 0x00, 0xe3, 0x00, 0xef, 0x00, 0xfb, 0x01, 0x07, 0x01, 0x13, 0x01, 0x1f, 0x01, 0x2b, 0x01, 0x37, 0x01, 0x43, 0x01, 0x4f, 0x01, 0x5b, 0x01, 0x67, 0x01, 0x73, 0x01, 0x7f, 0x01, 0x8b, 0x01, 0x97, 0x01, 0xa3, 0x01, 0xaf, 0x01, 0xbb, 0x01, 0xc7, 0x01, 0xd3, 0x01, 0xe4, 0x01, 0xf0, 0x01, 0xfc, 0x02, 0x08, 0x00, 0x00, 0x01, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x21, 0x22, 0x13, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x25, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x25, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x27, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x27, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x32, 0x15, 0x11, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x23, 0x22, 0x3d, 0x01, 0x34, 0x33, 0x13, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x22, 0x3d, 0x01, 0x34, 0x33, 0x21, 0x32, 0x1d, 0x01, 0x14, 0x23, 0x01, 0x33, 0x07, 0xff, 0xc6, 0xc6, 0xf8, 0x01, 0xc7, 0x84, 0x43, 0x07, 0xff, 0x41, 0x41, 0xf8, 0x01, 0x43, 0xe9, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0xc9, 0x21, 0x44, 0x20, 0x20, 0x44, 0x21, 0x01, 0x29, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xfe, 0x72, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0x01, 0x8d, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0x01, 0x66, 0x21, 0xe2, 0x22, 0x22, 0xe2, 0x21, 0xf9, 0x09, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0xc6, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0xc6, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0xc7, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0x20, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc6, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0xc7, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0xc6, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0x21, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc6, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0x01, 0x01, 0x21, 0x7e, 0x21, 0x21, 0x7e, 0x21, 0x21, 0x21, 0x21, 0xde, 0x26, 0x20, 0x21, 0x21, 0x85, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc9, 0x21, 0x44, 0x20, 0x20, 0x44, 0x21, 0xfa, 0x48, 0x22, 0x22, 0x03, 0x9d, 0x21, 0x21, 0x05, 0xd5, 0xdd, 0xfb, 0xe5, 0xdd, 0xdd, 0x04, 0x1b, 0xdd, 0xdd, 0xfb, 0xe5, 0x4a, 0x4a, 0x04, 0x1b, 0x4a, 0xfc, 0x1c, 0x49, 0x25, 0x25, 0x49, 0x26, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xb7, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xb7, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xb7, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xb4, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xdb, 0x25, 0xfe, 0xde, 0x25, 0x25, 0x95, 0x20, 0x25, 0x49, 0x25, 0xfd, 0x48, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x94, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, 0xa2, 0x06, 0x14, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x00, 0x29, 0x01, 0x09, 0x01, 0x21, 0x07, 0x23, 0x09, 0x01, 0x33, 0x09, 0x02, 0x11, 0x09, 0x01, 0x03, 0x23, 0x09, 0x01, 0x33, 0x01, 0x09, 0xa2, 0xf9, 0x1b, 0xfd, 0x44, 0x02, 0xbc, 0x06, 0xe5, 0x85, 0x7f, 0xfd, 0xc9, 0x02, 0x37, 0x7f, 0xfb, 0x12, 0x01, 0xd9, 0x01, 0xd8, 0xfe, 0x28, 0xfe, 0x27, 0xbb, 0x80, 0xfd, 0xc9, 0x02, 0x37, 0x80, 0x02, 0x37, 0x03, 0x0a, 0x03, 0x0a, 0x94, 0xfd, 0x8a, 0xfd, 0x8a, 0x04, 0xec, 0xfd, 0xf3, 0x02, 0x0d, 0xfb, 0x14, 0x02, 0x0d, 0xfd, 0xf3, 0x04, 0xec, 0xfd, 0x88, 0xfd, 0x8c, 0x02, 0x76, 0x00, 0x05, 0x00, 0x87, 0xff, 0x46, 0x05, 0xc3, 0x05, 0xfc, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x13, 0x09, 0x01, 0x11, 0x09, 0x01, 0x03, 0x11, 0x09, 0x01, 0x11, 0x01, 0x03, 0x37, 0x01, 0x07, 0x11, 0x17, 0x01, 0x27, 0x01, 0x33, 0x11, 0x23, 0xee, 0x02, 0x37, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0xc9, 0x67, 0x02, 0x9e, 0x02, 0x9d, 0xfd, 0x63, 0x23, 0x34, 0x01, 0xae, 0x33, 0x33, 0xfe, 0x52, 0x34, 0xfe, 0x52, 0x67, 0x67, 0x01, 0x35, 0xfe, 0x95, 0x01, 0x6b, 0x02, 0xd8, 0x01, 0x6b, 0xfe, 0x95, 0xfc, 0xe6, 0x03, 0x5c, 0x01, 0xad, 0xfe, 0x53, 0xfc, 0xa4, 0xfe, 0x53, 0x05, 0x41, 0x63, 0xfe, 0xec, 0x63, 0xfe, 0x5c, 0x63, 0xfe, 0xec, 0x63, 0x02, 0xfa, 0xfd, 0xd8, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x02, 0x30, 0x04, 0x60, 0x10, 0x06, 0x03, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x10, 0x06, 0x03, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x04, 0x60, 0x10, 0x06, 0x03, 0x5d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x04, 0x79, 0x10, 0x06, 0x03, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, 0xfe, 0x2e, 0x05, 0x5d, 0x00, 0xd0, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x15, 0x23, 0x11, 0x21, 0x11, 0x23, 0x35, 0x21, 0x01, 0x8c, 0x02, 0x5c, 0x01, 0x74, 0xdc, 0xfc, 0x74, 0xdd, 0x01, 0x75, 0xfe, 0xd8, 0x01, 0xf8, 0xaa, 0xfe, 0x08, 0x01, 0xf8, 0xaa, 0x00, 0x02, 0x00, 0x8c, 0x00, 0x00, 0x07, 0xe5, 0x05, 0xfb, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x01, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x01, 0x21, 0x35, 0x21, 0x05, 0x35, 0x21, 0x15, 0x05, 0x4b, 0x01, 0x9d, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xb3, 0xfd, 0x66, 0xfd, 0x8b, 0x02, 0x25, 0x02, 0x99, 0x02, 0x76, 0x04, 0x9a, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfc, 0x10, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x06, 0x2a, 0x05, 0xd0, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x21, 0x09, 0x01, 0x21, 0x09, 0x03, 0x21, 0x09, 0x01, 0x01, 0xdd, 0x02, 0x8f, 0x01, 0x48, 0xfe, 0xb8, 0xfd, 0x71, 0xfe, 0xb8, 0x01, 0x0d, 0xfe, 0x7e, 0x01, 0x82, 0x03, 0x05, 0x01, 0x83, 0xfe, 0x7e, 0x72, 0x02, 0x76, 0x02, 0x76, 0xfd, 0x8a, 0xfd, 0x18, 0x02, 0xe8, 0x02, 0xe8, 0xfd, 0x18, 0xfd, 0x18, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x92, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x35, 0x10, 0x13, 0x12, 0x13, 0x33, 0x02, 0x03, 0x02, 0x11, 0x01, 0x4e, 0xb0, 0x90, 0xa8, 0x95, 0x90, 0xea, 0x51, 0x72, 0xfd, 0xfc, 0xea, 0x03, 0x97, 0x01, 0xe2, 0x02, 0x30, 0x01, 0x03, 0xfd, 0xf3, 0xfe, 0x86, 0xfd, 0xee, 0xfc, 0xed, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x01, 0x4e, 0x07, 0x89, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x9e, 0xb0, 0xb0, 0x07, 0x89, 0xf6, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0x14, 0x02, 0xfc, 0x07, 0x89, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x15, 0x10, 0x13, 0x12, 0x13, 0x23, 0x02, 0x03, 0x02, 0x11, 0x35, 0x01, 0x4e, 0x72, 0x84, 0xb7, 0x90, 0xbb, 0x82, 0x90, 0x07, 0x89, 0xea, 0xfc, 0xa5, 0xfe, 0x57, 0xfe, 0x14, 0xfe, 0x65, 0x01, 0x45, 0x01, 0xee, 0x02, 0x26, 0x03, 0x32, 0xea, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x92, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x35, 0x10, 0x03, 0x02, 0x03, 0x33, 0x12, 0x13, 0x12, 0x11, 0x15, 0x02, 0x4c, 0x73, 0x51, 0xea, 0x90, 0x96, 0xa7, 0x90, 0xfd, 0xfc, 0xea, 0x03, 0x13, 0x02, 0x12, 0x01, 0x79, 0x02, 0x0e, 0xfe, 0xfd, 0xfd, 0xd0, 0xfe, 0x1e, 0xfc, 0x69, 0xea, 0x00, 0x00, 0x01, 0x02, 0x4b, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x89, 0x00, 0x04, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x30, 0x02, 0xfb, 0xaf, 0x07, 0x89, 0xf6, 0x73, 0x09, 0x8d, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0x14, 0x02, 0xfc, 0x07, 0x89, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x10, 0x03, 0x02, 0x03, 0x23, 0x12, 0x13, 0x12, 0x11, 0x02, 0x4c, 0xaf, 0x90, 0x81, 0xbc, 0x90, 0xb7, 0x84, 0x73, 0x07, 0x89, 0xea, 0xfc, 0xcd, 0xfd, 0xdb, 0xfe, 0x12, 0xfe, 0xbb, 0x01, 0x9b, 0x01, 0xec, 0x01, 0xa9, 0x03, 0x5b, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x6d, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x11, 0x21, 0x15, 0x21, 0x01, 0x4e, 0xb0, 0x02, 0x5d, 0xfe, 0x53, 0xfd, 0xfc, 0x09, 0x71, 0xc3, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x01, 0x4e, 0x07, 0x89, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x9e, 0xb0, 0xb0, 0x07, 0x89, 0xf6, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0x14, 0x02, 0xfc, 0x07, 0x89, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x4e, 0x01, 0xad, 0xfd, 0xa3, 0x07, 0x89, 0xf7, 0x4e, 0xc3, 0x09, 0x75, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x6d, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, 0x4c, 0xfe, 0x52, 0x02, 0x5d, 0xfd, 0xfc, 0x08, 0xae, 0xc3, 0xf6, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4b, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x7a, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x02, 0x4c, 0xaf, 0xaf, 0x07, 0x7a, 0xf6, 0x82, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0x14, 0x02, 0xfc, 0x07, 0x7a, 0x00, 0x05, 0x00, 0x00, 0x01, 0x33, 0x11, 0x21, 0x35, 0x21, 0x02, 0x4c, 0xaf, 0xfd, 0xa3, 0x01, 0xae, 0x07, 0x7a, 0xf6, 0x9a, 0xc3, 0x00, 0x01, 0x02, 0x5f, 0xfd, 0xea, 0x04, 0xd0, 0x07, 0x6d, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x23, 0x11, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x03, 0x07, 0xa7, 0x63, 0x6d, 0xa8, 0xf7, 0xfd, 0x5b, 0x3d, 0x33, 0xfd, 0xea, 0x07, 0x75, 0xdf, 0x91, 0x9e, 0xb0, 0x66, 0x57, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x97, 0xfd, 0xfc, 0x03, 0x07, 0x07, 0x86, 0x00, 0x18, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x19, 0x01, 0x23, 0x11, 0x10, 0x27, 0x26, 0x2f, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x10, 0x07, 0x06, 0x02, 0x52, 0x34, 0x26, 0x5b, 0xa7, 0x64, 0x43, 0xeb, 0x37, 0x37, 0xe9, 0x45, 0x64, 0xa7, 0x5b, 0x24, 0x02, 0xc1, 0x20, 0x3d, 0x93, 0xfe, 0x43, 0xfd, 0xe8, 0x02, 0x0c, 0x01, 0xb7, 0x5f, 0x41, 0x04, 0x01, 0xbb, 0x45, 0x63, 0x01, 0xb3, 0x02, 0x0c, 0xfd, 0xe8, 0xfe, 0x48, 0x98, 0x3c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5f, 0xfe, 0x14, 0x04, 0xd0, 0x07, 0x86, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x03, 0x07, 0x33, 0x3d, 0x5b, 0xfd, 0xf7, 0xa6, 0x6f, 0x63, 0x07, 0x86, 0xf8, 0x94, 0x9a, 0x56, 0x66, 0xb0, 0x9e, 0x8f, 0xe1, 0x07, 0x64, 0x00, 0x00, 0x01, 0x02, 0x5f, 0xfd, 0xf4, 0x03, 0x07, 0x07, 0x8c, 0x00, 0x03, 0x00, 0x00, 0x01, 0x23, 0x11, 0x33, 0x03, 0x07, 0xa7, 0xa7, 0xfd, 0xf4, 0x09, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x97, 0xfd, 0xea, 0x03, 0x07, 0x07, 0x6d, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x02, 0x60, 0x34, 0x3d, 0x5b, 0xfd, 0xf8, 0xa7, 0x6d, 0x64, 0xfd, 0xea, 0x07, 0x7d, 0x99, 0x57, 0x66, 0xb0, 0x9e, 0x91, 0xdf, 0xf8, 0x8b, 0x00, 0x00, 0x01, 0x02, 0x5f, 0xfd, 0xfc, 0x04, 0xd0, 0x07, 0x86, 0x00, 0x18, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x19, 0x01, 0x33, 0x11, 0x10, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x07, 0x06, 0x07, 0x06, 0x19, 0x01, 0x23, 0x11, 0x10, 0x37, 0x36, 0x03, 0x14, 0x36, 0x24, 0x5a, 0xa7, 0x63, 0x45, 0xe9, 0x37, 0x37, 0xeb, 0x43, 0x63, 0xa7, 0x5a, 0x26, 0x02, 0xc1, 0x21, 0x3c, 0x98, 0x01, 0xb8, 0x02, 0x18, 0xfd, 0xf4, 0xfe, 0x4d, 0x63, 0x45, 0xbb, 0x01, 0x04, 0x41, 0x5f, 0xfe, 0x49, 0xfd, 0xf4, 0x02, 0x18, 0x01, 0xbd, 0x93, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x97, 0xfe, 0x14, 0x03, 0x07, 0x07, 0x86, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x02, 0x60, 0xa7, 0x64, 0x6f, 0xa5, 0xf8, 0xfd, 0x5b, 0x3d, 0x34, 0x07, 0x86, 0xf8, 0x9c, 0xe1, 0x8f, 0x9e, 0xb0, 0x66, 0x56, 0x9a, 0x00, 0x00, 0x00, 0x01, 0x01, 0x83, 0xfe, 0x00, 0x02, 0x37, 0x07, 0x89, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x01, 0x84, 0xb2, 0xfe, 0x00, 0x09, 0x89, 0xf6, 0x77, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x86, 0x05, 0xa0, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, 0x25, 0x09, 0x01, 0x11, 0x21, 0x11, 0x21, 0x03, 0x21, 0x03, 0x35, 0x03, 0x13, 0x35, 0x21, 0x13, 0x23, 0x03, 0x01, 0xfb, 0xfe, 0x37, 0x01, 0xc9, 0x01, 0xfe, 0x01, 0xa7, 0x01, 0xfc, 0x5c, 0x5a, 0xf0, 0xf0, 0x03, 0xa4, 0x01, 0xf3, 0x01, 0x86, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0x02, 0x68, 0xfb, 0xc2, 0x01, 0x72, 0x83, 0xfe, 0xf6, 0xfe, 0xf6, 0x83, 0x03, 0x76, 0xfd, 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x27, 0x04, 0xc4, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x09, 0x01, 0x21, 0x11, 0x21, 0x06, 0x26, 0xfa, 0x81, 0x02, 0xbf, 0x02, 0xc0, 0xfa, 0x81, 0x05, 0x7f, 0x02, 0xa0, 0x02, 0x24, 0xfb, 0x3c, 0x01, 0xf8, 0x00, 0x00, 0x04, 0x00, 0x87, 0xff, 0x46, 0x05, 0xc3, 0x05, 0xfc, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x00, 0x13, 0x09, 0x01, 0x11, 0x09, 0x01, 0x03, 0x11, 0x09, 0x01, 0x11, 0x01, 0x00, 0x14, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x02, 0x10, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x10, 0x0e, 0x01, 0x22, 0x26, 0xee, 0x02, 0x37, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0xc9, 0x67, 0x02, 0x9e, 0x02, 0x9d, 0xfd, 0x63, 0xfe, 0x96, 0x30, 0x31, 0x53, 0x53, 0xc5, 0x53, 0x53, 0x31, 0x30, 0x30, 0x31, 0x53, 0x53, 0xc5, 0x53, 0x53, 0x31, 0x97, 0x7c, 0xd7, 0xfc, 0xd6, 0x7c, 0x7c, 0xd6, 0xfc, 0xd7, 0x01, 0x35, 0xfe, 0x95, 0x01, 0x6b, 0x02, 0xd8, 0x01, 0x6b, 0xfe, 0x95, 0xfc, 0xe6, 0x03, 0x5c, 0x01, 0xad, 0xfe, 0x53, 0xfc, 0xa4, 0xfe, 0x53, 0x03, 0xc8, 0xda, 0x5d, 0x5c, 0x36, 0x36, 0x36, 0x36, 0x5c, 0x5d, 0xda, 0x5d, 0x5c, 0x36, 0x36, 0x36, 0x36, 0x5c, 0xfe, 0xaa, 0x01, 0x18, 0xee, 0x8a, 0x8a, 0xee, 0xfe, 0xe8, 0xee, 0x8a, 0x8a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x9a, 0x05, 0x85, 0x03, 0x8e, 0x10, 0x06, 0x0a, 0xda, 0x00, 0x00, 0x00, 0x03, 0x00, 0x50, 0xfe, 0xf7, 0x04, 0x54, 0x02, 0x5a, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x03, 0x85, 0xb6, 0x2d, 0x2e, 0x2e, 0x2d, 0xb6, 0x2d, 0x2e, 0x2e, 0x88, 0x91, 0x99, 0x99, 0x91, 0x92, 0x99, 0x99, 0xfe, 0x81, 0xc9, 0xcf, 0x7b, 0x02, 0x01, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8e, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x07, 0x27, 0x25, 0x35, 0x33, 0x15, 0x25, 0x17, 0x05, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x01, 0x4e, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xfa, 0x1e, 0x01, 0x18, 0xa7, 0x01, 0x06, 0x1e, 0xfe, 0xdc, 0x02, 0x33, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0x03, 0xb6, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x04, 0xe6, 0x5d, 0x63, 0x68, 0xc0, 0x83, 0x61, 0x61, 0x6d, 0xfc, 0x40, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0x00, 0x01, 0x00, 0x83, 0xfe, 0x2e, 0x04, 0x0f, 0x00, 0xd0, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x01, 0x1b, 0x02, 0x5c, 0x98, 0xfc, 0x74, 0x98, 0xfe, 0xd8, 0x01, 0xf8, 0xfd, 0x5e, 0x02, 0xa2, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x01, 0x56, 0xc3, 0xd5, 0xe8, 0x91, 0xc4, 0xfd, 0xd5, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfd, 0xff, 0x02, 0x7e, 0x2b, 0x98, 0x2f, 0xfc, 0xe6, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x38, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x21, 0x15, 0x21, 0x35, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x02, 0x13, 0x01, 0x89, 0xfd, 0x9f, 0x4a, 0xec, 0x1e, 0x37, 0x2b, 0x56, 0x46, 0x35, 0x77, 0x67, 0x57, 0x83, 0x36, 0x93, 0xb1, 0x2b, 0x38, 0x0f, 0xa0, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfd, 0xff, 0x8e, 0x81, 0x4d, 0xf1, 0x22, 0x3f, 0x55, 0x28, 0x3f, 0x4e, 0x26, 0x3a, 0xab, 0x24, 0x1f, 0x97, 0x7d, 0x3a, 0x69, 0x46, 0x12, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x44, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x05, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x03, 0x59, 0x0c, 0x6a, 0xc2, 0xb0, 0x39, 0x7b, 0x4f, 0x52, 0x70, 0x3e, 0x69, 0x67, 0x60, 0x59, 0x7e, 0x83, 0x50, 0x50, 0x53, 0x52, 0x2f, 0x6d, 0x60, 0x55, 0x7b, 0x37, 0x91, 0xad, 0x5d, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x96, 0x03, 0x81, 0x5d, 0x8d, 0x9c, 0x17, 0x1b, 0xa8, 0x30, 0x1c, 0x4f, 0x4c, 0x47, 0x4e, 0x8c, 0x3c, 0x3a, 0x3c, 0x3f, 0x15, 0x20, 0x97, 0x18, 0x14, 0x89, 0x73, 0x51, 0x72, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x25, 0x03, 0x33, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x02, 0x78, 0xf2, 0xf2, 0x15, 0xb9, 0x7f, 0x7f, 0xa4, 0xfe, 0x70, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x4f, 0xfe, 0x82, 0x02, 0x48, 0xfd, 0xb8, 0x8d, 0xd3, 0xd3, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x39, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x21, 0x15, 0x21, 0x15, 0x06, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x01, 0x6f, 0x02, 0x03, 0xfe, 0x98, 0x03, 0x39, 0x1b, 0x9f, 0xba, 0xc0, 0xab, 0x39, 0x78, 0x4f, 0x55, 0x6c, 0x3d, 0x5d, 0x6a, 0x6a, 0x5d, 0x2d, 0x5b, 0x50, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x01, 0x19, 0x8e, 0xab, 0x01, 0x0a, 0xb0, 0x95, 0x98, 0xac, 0x14, 0x18, 0xac, 0x2f, 0x1b, 0x61, 0x55, 0x56, 0x61, 0x14, 0x25, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x40, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x02, 0x5d, 0x46, 0x53, 0x53, 0x46, 0x46, 0x53, 0x53, 0xbf, 0x4b, 0x58, 0x2a, 0x6b, 0x72, 0x05, 0x08, 0x73, 0x46, 0x90, 0xa8, 0xaf, 0x90, 0xa6, 0xad, 0xd2, 0xb4, 0x30, 0x60, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x9f, 0x62, 0x5b, 0x5a, 0x62, 0x62, 0x5a, 0x5b, 0x62, 0x01, 0x9d, 0x9c, 0x23, 0x16, 0x94, 0x50, 0x0b, 0x3d, 0xb1, 0x94, 0x91, 0xb3, 0xfd, 0xe7, 0xda, 0x01, 0x0b, 0x13, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x01, 0x46, 0x02, 0x67, 0xfe, 0xb8, 0xad, 0x01, 0x2f, 0xfe, 0x5f, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x01, 0x19, 0x4b, 0xfc, 0xa3, 0x03, 0x1a, 0x00, 0x05, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x25, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x02, 0x6a, 0x4c, 0x55, 0x55, 0x4c, 0x4b, 0x56, 0x56, 0xfe, 0xe6, 0x04, 0x5f, 0xa4, 0x8e, 0x8d, 0xa4, 0x5f, 0x03, 0x0d, 0x6a, 0xaa, 0x9c, 0x9c, 0xab, 0x6a, 0x4f, 0x48, 0x46, 0x43, 0x4a, 0x4a, 0x43, 0x46, 0x48, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xe6, 0x50, 0x49, 0x49, 0x50, 0x51, 0x48, 0x49, 0x50, 0x49, 0x01, 0x76, 0x53, 0x74, 0x88, 0x88, 0x74, 0x53, 0x76, 0x01, 0x03, 0x83, 0x5c, 0x8a, 0x97, 0x97, 0x8a, 0x5c, 0x83, 0xc1, 0x3d, 0x42, 0x42, 0x3d, 0x3e, 0x42, 0x42, 0x00, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x34, 0x00, 0x40, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x36, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x02, 0x23, 0x22, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x01, 0x68, 0x4c, 0x57, 0x2a, 0x6b, 0x72, 0x05, 0x09, 0x74, 0x47, 0x8f, 0xa7, 0xae, 0x90, 0xa7, 0xac, 0xd2, 0xb4, 0x30, 0x60, 0xc3, 0x47, 0x52, 0x52, 0x47, 0x46, 0x53, 0x53, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfd, 0x8b, 0x9c, 0x24, 0x15, 0x93, 0x4f, 0x0d, 0x3c, 0xaf, 0x94, 0x91, 0xb4, 0xfd, 0xe8, 0xda, 0xfe, 0xf6, 0x13, 0x01, 0xb4, 0x62, 0x5b, 0x5b, 0x62, 0x62, 0x5b, 0x5b, 0x62, 0x00, 0x05, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x32, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x13, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0xb8, 0x8e, 0x9b, 0xaa, 0x69, 0x8f, 0xfe, 0x6b, 0x02, 0xb7, 0x3a, 0x3e, 0x3e, 0x3a, 0x39, 0x3e, 0x3e, 0x39, 0x75, 0x7a, 0x7a, 0x75, 0x76, 0x7b, 0x7b, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfe, 0x3e, 0x02, 0x3e, 0x27, 0x89, 0x2a, 0xfd, 0x36, 0x80, 0x02, 0xde, 0x97, 0xa3, 0xa2, 0x97, 0x97, 0xa2, 0xa3, 0x97, 0x7b, 0xe4, 0xd1, 0xd0, 0xe4, 0xe4, 0xd0, 0xd1, 0xe4, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x12, 0x04, 0x7a, 0x01, 0xf0, 0xac, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x04, 0x7a, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x03, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x03, 0x52, 0x01, 0x16, 0xfd, 0x3d, 0x01, 0x0b, 0xfd, 0x3e, 0x01, 0x15, 0x01, 0xf0, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x03, 0x52, 0x01, 0x16, 0xfd, 0x3d, 0x01, 0x0b, 0xfd, 0x3e, 0x01, 0x15, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x03, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0x90, 0x90, 0x90, 0x90, 0xfd, 0x96, 0x03, 0x0c, 0xfc, 0xf4, 0x03, 0xc0, 0x02, 0xb2, 0xfd, 0x4e, 0x03, 0x66, 0x03, 0x0c, 0xfc, 0xf4, 0x00, 0x00, 0x03, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0xfd, 0x96, 0x03, 0x0c, 0xfc, 0xf4, 0x03, 0xc0, 0x02, 0xb2, 0xfd, 0x4e, 0x03, 0x66, 0x03, 0x0c, 0xfc, 0xf4, 0x00, 0x04, 0xff, 0xed, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x13, 0xa9, 0xa2, 0xa1, 0xa2, 0xa1, 0xa2, 0xaa, 0x01, 0xf0, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x69, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0xa9, 0xa2, 0xa1, 0xa2, 0xa0, 0xa2, 0xab, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x04, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x05, 0x96, 0x02, 0x32, 0xfd, 0xce, 0xf8, 0x00, 0x02, 0x32, 0xfd, 0xce, 0x05, 0x73, 0x01, 0xd9, 0xfe, 0x27, 0xfd, 0x73, 0x01, 0xd9, 0xfe, 0x27, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0x05, 0x96, 0x02, 0x32, 0xfd, 0xce, 0xf8, 0x00, 0x02, 0x32, 0xfd, 0xce, 0x05, 0x73, 0x01, 0xd9, 0xfe, 0x27, 0xfd, 0x73, 0x01, 0xd9, 0xfe, 0x27, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x02, 0x86, 0xfe, 0x0a, 0xfd, 0x96, 0x05, 0x06, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x02, 0x86, 0xfe, 0x0a, 0xfd, 0x96, 0x05, 0x5c, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0x02, 0xce, 0xfe, 0x52, 0xfd, 0x96, 0x05, 0x06, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x02, 0xce, 0xfe, 0x52, 0xfd, 0x96, 0x05, 0x5c, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x02, 0x9c, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x02, 0x84, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x02, 0xf2, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x02, 0x84, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0xfa, 0xa4, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x02, 0x9c, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x02, 0xcc, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x02, 0xf2, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x02, 0xcc, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0xfa, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0x01, 0xf0, 0x05, 0xd8, 0xfa, 0xd4, 0xac, 0x00, 0x01, 0x01, 0xe2, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0x01, 0x9a, 0x06, 0x2e, 0xfb, 0x2a, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, 0x01, 0x9a, 0x01, 0x20, 0x01, 0xae, 0x01, 0xf0, 0x05, 0xd8, 0xfa, 0xd4, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0x01, 0xae, 0x01, 0x9a, 0x06, 0x2e, 0xfb, 0x2a, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0x28, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x33, 0x11, 0x12, 0x01, 0xf4, 0x90, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xf9, 0xd2, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x21, 0x11, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0x28, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xf9, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x0a, 0x32, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x0a, 0x32, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x48, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0x05, 0xd8, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0x48, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x05, 0x06, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x0a, 0x32, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x48, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x06, 0x2e, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x48, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x05, 0x5c, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x0a, 0x32, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xf5, 0xce, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xf5, 0xce, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x48, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0x28, 0xfb, 0xa6, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x48, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xfa, 0xfa, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xf5, 0xce, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x48, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xf9, 0xd2, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x48, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfa, 0xa4, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xf5, 0xce, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x04, 0x7a, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x02, 0x84, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x56, 0xac, 0xfb, 0xa6, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x02, 0x86, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x56, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x04, 0x7a, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x04, 0x7a, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x02, 0xcc, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x56, 0xac, 0xfb, 0xa6, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x02, 0xce, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x56, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x04, 0x7a, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0x56, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x35, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfd, 0x7a, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0x56, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0x56, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfd, 0x32, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0x56, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0x72, 0x90, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0xf0, 0xfb, 0xa6, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x23, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0x48, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0x56, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x48, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x56, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x48, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0x56, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x48, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x56, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x02, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x33, 0x35, 0x21, 0x15, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0xf0, 0xac, 0xac, 0xac, 0xac, 0x00, 0x02, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x02, 0x72, 0x01, 0xf6, 0xfb, 0x86, 0x01, 0xf4, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x02, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0x90, 0x90, 0x02, 0xf2, 0x04, 0xd6, 0xfb, 0x2a, 0xfa, 0xa4, 0x04, 0x04, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0x02, 0xf2, 0x04, 0xd6, 0xfb, 0x2a, 0xfa, 0xa4, 0x04, 0x04, 0xfb, 0xfc, 0x00, 0x02, 0xff, 0xee, 0x01, 0x44, 0x04, 0x68, 0x03, 0x48, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x12, 0x04, 0x7a, 0xfb, 0x86, 0x04, 0x7a, 0x02, 0x9c, 0xac, 0xac, 0xfe, 0xa8, 0xac, 0xac, 0x00, 0x00, 0x02, 0x01, 0x52, 0xfd, 0x96, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x52, 0x90, 0x90, 0x90, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x03, 0x48, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x02, 0x86, 0xfe, 0x0a, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x05, 0xb2, 0xac, 0xac, 0xac, 0xfc, 0x52, 0x00, 0x00, 0x01, 0x01, 0x52, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0x52, 0x03, 0x16, 0xfe, 0x9a, 0x90, 0x90, 0xfd, 0x96, 0x05, 0x06, 0xac, 0xfb, 0xa6, 0x04, 0x5a, 0xfb, 0xa6, 0x00, 0x00, 0x02, 0x01, 0x52, 0xfd, 0x96, 0x04, 0x68, 0x03, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x52, 0x03, 0x16, 0xfd, 0x7a, 0x90, 0x01, 0xf6, 0xfe, 0x9a, 0xfd, 0x96, 0x05, 0xb2, 0xac, 0xfa, 0xfa, 0x04, 0x5a, 0xac, 0xfc, 0x52, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x03, 0x48, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0xfe, 0x0c, 0x02, 0x84, 0xfd, 0x96, 0x03, 0xae, 0xac, 0xac, 0xac, 0xfa, 0x4e, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x03, 0x03, 0x02, 0x9c, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x12, 0x03, 0x14, 0x90, 0x90, 0x90, 0x01, 0xf0, 0xac, 0xfa, 0xfa, 0x04, 0x5a, 0xfb, 0xa6, 0x04, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0xfd, 0x96, 0x03, 0x03, 0x03, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, 0x72, 0xfd, 0x7c, 0x03, 0x14, 0xfe, 0x50, 0xfe, 0x9c, 0x01, 0xf4, 0xfd, 0x96, 0x05, 0x06, 0xac, 0xfa, 0x4e, 0x03, 0xae, 0xac, 0xfb, 0xa6, 0x00, 0x01, 0x01, 0xe2, 0x01, 0x44, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0x01, 0xf6, 0x01, 0x44, 0x06, 0x84, 0xfb, 0x80, 0xac, 0xac, 0xac, 0x00, 0x00, 0x00, 0x01, 0x01, 0x52, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x52, 0x90, 0x90, 0x90, 0x01, 0x66, 0x01, 0xf0, 0x05, 0xd8, 0xfa, 0xd4, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x00, 0x00, 0x02, 0x01, 0x52, 0x01, 0x44, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0x72, 0x90, 0x01, 0x66, 0xfc, 0xea, 0x90, 0x02, 0x86, 0x02, 0x9c, 0x05, 0x2c, 0xfb, 0x80, 0xac, 0xfe, 0xa8, 0x06, 0x84, 0xfa, 0x28, 0xac, 0x00, 0x01, 0xff, 0xee, 0x01, 0x44, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x12, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0x44, 0xac, 0xac, 0xac, 0x04, 0x80, 0xf9, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0x05, 0x2c, 0xfa, 0x28, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x01, 0x44, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x11, 0x33, 0x11, 0x12, 0x01, 0x64, 0x90, 0xfe, 0x0c, 0x02, 0x84, 0x90, 0x02, 0x9c, 0xac, 0x04, 0x80, 0xfa, 0xd4, 0xfe, 0xa8, 0xac, 0x05, 0xd8, 0xf9, 0x7c, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x0a, 0x32, 0xfb, 0x80, 0xac, 0xac, 0xac, 0xfc, 0x52, 0x00, 0x02, 0x01, 0x52, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x52, 0x90, 0x90, 0x90, 0x01, 0x66, 0xfe, 0x9a, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x0a, 0x32, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x03, 0x01, 0x52, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x02, 0x72, 0x90, 0x01, 0x66, 0xfc, 0xea, 0x90, 0x90, 0x01, 0xf6, 0xfe, 0x9a, 0x02, 0x9c, 0x05, 0x2c, 0xfb, 0x80, 0xac, 0xfa, 0xfa, 0x0a, 0x32, 0xf5, 0xce, 0x04, 0x5a, 0xac, 0xfc, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0xfd, 0x96, 0x03, 0xae, 0xac, 0xac, 0xac, 0x04, 0x80, 0xf5, 0xce, 0x00, 0x02, 0xff, 0xee, 0xfd, 0x96, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x52, 0xfe, 0x9c, 0x01, 0x64, 0x90, 0x90, 0x90, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xf5, 0xce, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0xfd, 0x96, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x03, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x64, 0x90, 0x90, 0xfe, 0x9c, 0x01, 0xf4, 0x90, 0x90, 0x02, 0x9c, 0xac, 0x04, 0x80, 0xfa, 0xd4, 0xfa, 0xfa, 0x03, 0xae, 0xac, 0xfb, 0xa6, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x02, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x03, 0x48, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0xe2, 0xfe, 0x0c, 0x04, 0x7a, 0xfe, 0x0a, 0xfd, 0x7c, 0x04, 0x7a, 0xfd, 0x96, 0x03, 0xae, 0xac, 0xac, 0xfc, 0x52, 0x05, 0x06, 0xac, 0xac, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x12, 0x04, 0x7a, 0xfe, 0x9a, 0x90, 0x90, 0x90, 0x01, 0xf0, 0xac, 0xac, 0xfb, 0xa6, 0x04, 0x5a, 0xfb, 0xa6, 0x04, 0x5a, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x03, 0x48, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x12, 0x04, 0x7a, 0xfc, 0xea, 0xfe, 0x9c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x9a, 0x02, 0x9c, 0xac, 0xac, 0xfa, 0xfa, 0x03, 0xae, 0xac, 0xfb, 0xa6, 0x04, 0x5a, 0xac, 0xfc, 0x52, 0x00, 0x02, 0xff, 0xee, 0x01, 0x44, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x12, 0x04, 0x7a, 0xfb, 0x86, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0x44, 0xac, 0xac, 0x01, 0x58, 0xac, 0x04, 0x80, 0xfb, 0x80, 0xac, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x12, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0x66, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x01, 0x44, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x12, 0x04, 0x7a, 0xfb, 0x86, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0x66, 0x01, 0x44, 0xac, 0xac, 0x01, 0x58, 0xac, 0x04, 0x80, 0xfa, 0xd4, 0x05, 0x2c, 0xfb, 0x80, 0xac, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x03, 0xae, 0xac, 0xac, 0xac, 0x04, 0x80, 0xfb, 0x80, 0xac, 0xac, 0xac, 0xfc, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x13, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x12, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0x66, 0xfe, 0x9a, 0x90, 0x90, 0x90, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x04, 0x5a, 0xfb, 0xa6, 0x04, 0x5a, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0x72, 0x01, 0xf6, 0xfe, 0x9a, 0xfe, 0x50, 0xfe, 0x9c, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0x66, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xfc, 0x52, 0x03, 0xae, 0xac, 0xfb, 0xa6, 0x05, 0x06, 0xac, 0x04, 0x80, 0xfa, 0xd4, 0x05, 0x2c, 0xfb, 0x80, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x11, 0x34, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x11, 0x01, 0xe2, 0x49, 0x52, 0x97, 0x01, 0x54, 0xfe, 0xac, 0x50, 0x52, 0xfd, 0x96, 0x03, 0x60, 0xa1, 0x7f, 0x86, 0xac, 0x7e, 0x7c, 0xfc, 0xa0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x02, 0x9c, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x34, 0x27, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x01, 0xe2, 0x29, 0x29, 0x50, 0xfe, 0xae, 0x01, 0x52, 0x98, 0x51, 0x49, 0xfd, 0x96, 0x03, 0x60, 0x7e, 0x3d, 0x3f, 0xac, 0x86, 0x78, 0xa8, 0xfc, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x35, 0x21, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x12, 0x01, 0x52, 0x50, 0x52, 0x90, 0x49, 0x51, 0x98, 0x01, 0xf0, 0xac, 0x7e, 0x7c, 0x04, 0x32, 0xfb, 0xce, 0xa8, 0x78, 0x86, 0x00, 0x01, 0x01, 0xe2, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x04, 0x68, 0xfe, 0xac, 0x97, 0x52, 0x49, 0x90, 0x52, 0x50, 0x01, 0x54, 0x01, 0xf0, 0x86, 0x78, 0xa8, 0x04, 0x32, 0xfb, 0xce, 0x7c, 0x7e, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9d, 0xfd, 0x96, 0x04, 0xb8, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x33, 0x01, 0x62, 0x04, 0x7a, 0xa0, 0xfb, 0x86, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9d, 0xfd, 0x96, 0x04, 0xb8, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x23, 0x01, 0x33, 0x04, 0xb8, 0xa0, 0xfb, 0x86, 0xa0, 0xfd, 0x96, 0x0a, 0x32, 0x00, 0x01, 0xff, 0x9d, 0xfd, 0x96, 0x04, 0xb8, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x04, 0xb8, 0xa0, 0xfe, 0x12, 0xfe, 0x14, 0xa0, 0x02, 0x3d, 0xfd, 0xc3, 0xa0, 0x01, 0xec, 0x01, 0xee, 0xa0, 0xfd, 0xc3, 0xfd, 0x96, 0x04, 0x63, 0xfb, 0x9d, 0x05, 0x19, 0x05, 0x19, 0xfb, 0x9d, 0x04, 0x63, 0xfa, 0xe7, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x02, 0x3d, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x12, 0x02, 0x4e, 0x01, 0xf0, 0xac, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0x02, 0x46, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0x02, 0x46, 0x05, 0x82, 0xfa, 0x7e, 0x00, 0x00, 0x01, 0x02, 0x3c, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x02, 0x3c, 0x02, 0x2c, 0x01, 0xf0, 0xac, 0xac, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x02, 0x46, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0xfd, 0x96, 0x04, 0xb0, 0xfb, 0x50, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x02, 0x3d, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0x4e, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x00, 0x01, 0x01, 0x9a, 0x02, 0x46, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0x02, 0x46, 0x05, 0x82, 0xfa, 0x7e, 0x00, 0x01, 0x02, 0x3c, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x02, 0x3c, 0x02, 0x2c, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x02, 0x46, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfd, 0x96, 0x04, 0xb0, 0xfb, 0x50, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x12, 0x02, 0x4e, 0x02, 0x2c, 0xfd, 0xd4, 0x01, 0xf0, 0xac, 0x56, 0xfe, 0xa8, 0x56, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x9a, 0x48, 0x90, 0x48, 0xfd, 0x96, 0x04, 0xb0, 0x05, 0x82, 0xfa, 0x7e, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x03, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x12, 0x02, 0x4e, 0x02, 0x2c, 0xfd, 0xd4, 0x01, 0x9a, 0x01, 0x58, 0x56, 0xac, 0x56, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0xe2, 0x48, 0x01, 0x20, 0x48, 0xfd, 0x96, 0x04, 0xb0, 0x05, 0x82, 0xfa, 0x7e, 0xfb, 0x50, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x02, 0x14, 0x05, 0x9c, 0x06, 0x28, 0x10, 0x07, 0x0a, 0xad, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0xff, 0x05, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x01, 0x05, 0xfe, 0xfb, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0xff, 0xf6, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x01, 0xf6, 0xfe, 0x0a, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x01, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x03, 0x0f, 0xfc, 0xf1, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x02, 0x14, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x03, 0x19, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x05, 0x19, 0xfa, 0xe7, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x04, 0x1e, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x06, 0x1e, 0xf9, 0xe2, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x05, 0x23, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x07, 0x23, 0xf8, 0xdd, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x04, 0xe6, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x04, 0xf8, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x04, 0x30, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x04, 0x42, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x03, 0x7b, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x03, 0x8c, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x02, 0xc5, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd6, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x02, 0x0f, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0x20, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x01, 0x59, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x01, 0x6b, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x00, 0xa3, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x33, 0x11, 0x12, 0xb5, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0xff, 0xff, 0x02, 0xc4, 0xfe, 0x00, 0x05, 0x9b, 0x06, 0x28, 0x10, 0x07, 0x0a, 0xb5, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xee, 0xfe, 0x00, 0x04, 0xe6, 0x06, 0x28, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x04, 0x30, 0xb6, 0xfc, 0x73, 0xb5, 0xb6, 0xb6, 0xfc, 0x74, 0xb5, 0x03, 0x8d, 0xb6, 0xfc, 0x73, 0xb5, 0xb6, 0xb6, 0xfc, 0x74, 0xb5, 0x03, 0x8d, 0xb6, 0xfc, 0x73, 0xb5, 0xb6, 0xb6, 0xfc, 0x74, 0xb5, 0xfe, 0x00, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6d, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6e, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6d, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6e, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6d, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x96, 0x06, 0x28, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x2f, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x57, 0x00, 0x5f, 0x00, 0x67, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x7f, 0x00, 0x87, 0x00, 0x8f, 0x00, 0x97, 0x00, 0x9f, 0x00, 0xa7, 0x00, 0xaf, 0x00, 0xb7, 0x00, 0xbf, 0x00, 0xc7, 0x00, 0xcf, 0x00, 0xd7, 0x00, 0xdf, 0x00, 0xe7, 0x00, 0xef, 0x00, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x13, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0xa3, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x04, 0x04, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfc, 0x78, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfb, 0x0e, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x04, 0x04, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfc, 0x78, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfb, 0x0e, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x04, 0x04, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfc, 0x78, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfb, 0x0e, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x04, 0x04, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfc, 0x78, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x05, 0x28, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0x00, 0x00, 0x07, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x03, 0x11, 0x33, 0x11, 0x23, 0x11, 0x33, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x19, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x12, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0x02, 0x21, 0xb6, 0x02, 0x22, 0xb6, 0xb6, 0xfd, 0xde, 0xb5, 0xb5, 0xb5, 0x02, 0xd7, 0xb6, 0xb6, 0xfe, 0x94, 0xb6, 0xb6, 0xfe, 0x95, 0xb5, 0xb5, 0x02, 0xd7, 0xb6, 0xb6, 0xfe, 0x94, 0xb6, 0xb6, 0xfe, 0x00, 0x01, 0x6d, 0x01, 0x05, 0x01, 0xd6, 0x01, 0x05, 0x01, 0xd6, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xf7, 0xd8, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x05, 0xb6, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfd, 0x8d, 0x01, 0x05, 0xfd, 0x8e, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfd, 0x8d, 0x01, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x05, 0x23, 0x05, 0x9c, 0x06, 0x28, 0x10, 0x07, 0x0a, 0xaa, 0x00, 0x00, 0x07, 0x23, 0x00, 0x00, 0xff, 0xff, 0x04, 0xe5, 0xfe, 0x00, 0x05, 0x9b, 0x06, 0x28, 0x10, 0x07, 0x0a, 0xb8, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x02, 0xc6, 0x02, 0x14, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd7, 0xfe, 0x00, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xfe, 0x00, 0x05, 0x9c, 0x02, 0x14, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x02, 0xc4, 0x02, 0xd8, 0xfe, 0x00, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x01, 0xff, 0xee, 0x02, 0x14, 0x02, 0xc6, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd7, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x05, 0x9c, 0xfa, 0x52, 0x02, 0xd7, 0x02, 0xd7, 0xfe, 0x00, 0x08, 0x28, 0xfb, 0xec, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x07, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd7, 0x02, 0xd7, 0xfd, 0x28, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0xfb, 0xec, 0x04, 0x14, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x05, 0x9c, 0xfd, 0x29, 0xfd, 0x29, 0x06, 0x28, 0xfb, 0xec, 0xfb, 0xec, 0x08, 0x28, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x05, 0x00, 0x00, 0x03, 0x21, 0x11, 0x21, 0x11, 0x21, 0x12, 0x05, 0xae, 0xfd, 0x28, 0xfd, 0x2a, 0x06, 0x28, 0xf7, 0xd8, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0x02, 0x14, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x02, 0xc4, 0x02, 0xd8, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x07, 0x00, 0x00, 0x03, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x12, 0x02, 0xd6, 0x02, 0xd8, 0xfd, 0x29, 0xfd, 0x29, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0xfb, 0xec, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x05, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd6, 0x02, 0xd8, 0xfe, 0x00, 0x04, 0x14, 0x04, 0x14, 0xf7, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0xa7, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x04, 0xb2, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0x8a, 0x05, 0x3c, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x25, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x21, 0x22, 0x15, 0x03, 0x11, 0x10, 0x29, 0x01, 0x20, 0x19, 0x01, 0x10, 0x29, 0x01, 0x20, 0x01, 0x0e, 0xcd, 0x03, 0x17, 0xce, 0xce, 0xfc, 0xe9, 0xcd, 0x67, 0x01, 0x34, 0x03, 0x17, 0x01, 0x34, 0xfe, 0xcc, 0xfc, 0xe9, 0xfe, 0xcc, 0x5a, 0xe4, 0xe4, 0x03, 0x74, 0xe4, 0xe4, 0xfc, 0x8c, 0x03, 0x74, 0x01, 0x56, 0xfe, 0xaa, 0xfc, 0x8c, 0xfe, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x10, 0x27, 0x0a, 0xd3, 0x00, 0xf6, 0x00, 0x00, 0x10, 0x06, 0x0a, 0xca, 0x00, 0x00, 0x00, 0x06, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfb, 0x4e, 0x04, 0xb2, 0xfb, 0x4e, 0x04, 0xb2, 0xfb, 0x4e, 0x04, 0xb2, 0xfb, 0x4e, 0x04, 0xb2, 0xfb, 0x4e, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0xb0, 0x72, 0xb2, 0x72, 0xb0, 0x72, 0xb2, 0x72, 0xb0, 0x00, 0x06, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0xa7, 0x05, 0x7f, 0xfe, 0xfe, 0x9e, 0x9e, 0xfe, 0xf9, 0xa0, 0xa0, 0xfe, 0xfb, 0x9e, 0x9e, 0xfe, 0xf9, 0xa0, 0xa0, 0xfe, 0xfb, 0x9f, 0x9f, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x74, 0x05, 0x38, 0xfa, 0xc8, 0x05, 0x38, 0xfa, 0xc8, 0x05, 0x38, 0xfa, 0xc8, 0x05, 0x38, 0xfa, 0xc8, 0x05, 0x38, 0x00, 0x00, 0x1a, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x67, 0x00, 0x00, 0x05, 0x33, 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x11, 0x21, 0x11, 0x02, 0x11, 0xa0, 0xa0, 0x01, 0x07, 0x9e, 0x9e, 0x01, 0x05, 0xa0, 0xa0, 0xfc, 0xf1, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x01, 0x03, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x01, 0x07, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x01, 0x05, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x01, 0x07, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0xfb, 0x83, 0x05, 0x7f, 0x88, 0xae, 0xae, 0xae, 0xae, 0xae, 0x03, 0xdc, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0xfe, 0x2e, 0xae, 0x03, 0xdc, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0x02, 0xb8, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0x02, 0xb8, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0x02, 0xb8, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0xfe, 0x2e, 0xae, 0xfe, 0xde, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x08, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x01, 0x15, 0x33, 0x03, 0x15, 0x01, 0x33, 0x01, 0x15, 0x01, 0x37, 0x01, 0x15, 0x01, 0x37, 0x35, 0x01, 0x33, 0x01, 0x35, 0x01, 0x33, 0x01, 0x35, 0x01, 0x33, 0x17, 0x35, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0xcb, 0xcb, 0x01, 0x5d, 0xe2, 0xfd, 0xc1, 0x02, 0xd1, 0xe2, 0xfc, 0x4d, 0x04, 0x45, 0x6d, 0xfb, 0xbb, 0x92, 0x03, 0xb3, 0xfd, 0x2f, 0x91, 0x02, 0x40, 0xfe, 0xa2, 0x92, 0xcc, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x01, 0x54, 0xe2, 0x02, 0x7f, 0xfc, 0xfe, 0x7d, 0x04, 0x1c, 0xfc, 0xfc, 0xdf, 0x01, 0x05, 0x3c, 0x7f, 0xfb, 0x42, 0x01, 0x7f, 0x04, 0xbd, 0xfb, 0xe4, 0xfc, 0x03, 0x20, 0xfd, 0x81, 0xfc, 0x01, 0x83, 0xe2, 0xe2, 0x00, 0x00, 0x00, 0x08, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x33, 0x35, 0x05, 0x33, 0x01, 0x35, 0x01, 0x17, 0x01, 0x35, 0x01, 0x17, 0x01, 0x35, 0x23, 0x01, 0x35, 0x01, 0x23, 0x01, 0x35, 0x01, 0x23, 0x01, 0x35, 0x37, 0x23, 0xa7, 0x05, 0x7f, 0xfe, 0xce, 0xcc, 0xfd, 0xc0, 0xe2, 0x01, 0x5e, 0xfc, 0x4d, 0xe2, 0x02, 0xd1, 0xfb, 0x4e, 0x6d, 0x04, 0x45, 0x6d, 0xfb, 0xbb, 0x03, 0xb3, 0xe2, 0xfd, 0x2f, 0x02, 0x3f, 0xe2, 0xfe, 0xa3, 0xcb, 0xcb, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0xe2, 0xe2, 0x01, 0x83, 0xfc, 0xfd, 0x81, 0x01, 0x03, 0x21, 0xfc, 0xfb, 0xe4, 0x01, 0x04, 0xbe, 0x7f, 0xfb, 0x43, 0xa1, 0x04, 0x1c, 0xfc, 0xe0, 0xa1, 0x02, 0x7f, 0xfe, 0x7d, 0xa1, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x41, 0x00, 0x46, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5c, 0x00, 0x61, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x00, 0x01, 0x17, 0x37, 0x27, 0x23, 0x11, 0x17, 0x37, 0x27, 0x07, 0x01, 0x17, 0x37, 0x27, 0x23, 0x03, 0x17, 0x37, 0x27, 0x03, 0x17, 0x37, 0x27, 0x07, 0x01, 0x17, 0x37, 0x27, 0x23, 0x03, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x35, 0x23, 0x03, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x03, 0x33, 0x37, 0x27, 0x07, 0x01, 0x17, 0x37, 0x35, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x33, 0x37, 0x27, 0x01, 0x17, 0x37, 0x35, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x33, 0x37, 0x27, 0x05, 0x17, 0x33, 0x35, 0x27, 0x01, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x2d, 0x70, 0x30, 0x6d, 0x2d, 0x71, 0x71, 0x2d, 0x01, 0x2e, 0x71, 0x71, 0x2f, 0x84, 0xe8, 0x71, 0x70, 0x71, 0xe5, 0x2d, 0x71, 0x71, 0x2d, 0x02, 0xa1, 0x72, 0x71, 0x30, 0x83, 0xe9, 0x71, 0x71, 0x71, 0xfe, 0xd6, 0x71, 0x70, 0x71, 0xfe, 0xd6, 0x71, 0x72, 0x72, 0x03, 0x2f, 0x70, 0x2d, 0x6d, 0xe9, 0x6f, 0x71, 0x6f, 0xfe, 0xd4, 0x70, 0x71, 0x6f, 0xfe, 0xd6, 0x70, 0x70, 0x70, 0xfe, 0xd6, 0x70, 0x71, 0x6f, 0xfe, 0xd4, 0x71, 0x70, 0x70, 0xe6, 0x6e, 0x2f, 0x70, 0x2d, 0x04, 0x14, 0x71, 0x2d, 0x2e, 0xfe, 0xd6, 0x71, 0x71, 0x71, 0xfe, 0xd6, 0x72, 0x6f, 0x71, 0xfe, 0xd7, 0x71, 0x72, 0x72, 0xfe, 0xd5, 0x2f, 0x85, 0x2e, 0x71, 0x02, 0x75, 0x70, 0x2e, 0x2e, 0xfe, 0xd7, 0x71, 0x70, 0x71, 0xfe, 0xd6, 0x2f, 0x84, 0x30, 0x71, 0x01, 0x02, 0x2f, 0x6e, 0x2e, 0xfb, 0x15, 0x05, 0x7f, 0x04, 0x33, 0x31, 0x7c, 0x34, 0xfd, 0xe4, 0x32, 0x7e, 0x7e, 0x31, 0x01, 0x4f, 0x7e, 0x7e, 0x34, 0xfe, 0xff, 0x7e, 0x7c, 0x7e, 0xfc, 0xcc, 0x31, 0x7e, 0x7d, 0x31, 0x02, 0xec, 0x7e, 0x7e, 0x34, 0xfe, 0xfd, 0x7d, 0x7d, 0x7e, 0xfe, 0xb5, 0x7e, 0x7d, 0x7d, 0xfe, 0xb6, 0x7e, 0x7e, 0x7e, 0x01, 0xec, 0x7c, 0x31, 0x7f, 0xfe, 0xfd, 0x7c, 0x7e, 0x7c, 0xfe, 0xb4, 0x7d, 0x7e, 0x7c, 0xfe, 0xb6, 0x7c, 0x7c, 0x7c, 0xfe, 0xb5, 0x7c, 0x7e, 0x7c, 0xfe, 0xb4, 0x7c, 0x7d, 0x7d, 0xfe, 0x81, 0x34, 0x7c, 0x31, 0x02, 0xed, 0x7e, 0x32, 0x99, 0x31, 0xfe, 0xb4, 0x7e, 0x7e, 0x7e, 0xfe, 0xb5, 0x7e, 0x7c, 0x7e, 0xfe, 0xb5, 0x7e, 0x7e, 0x7e, 0xfe, 0xb4, 0x34, 0x34, 0x7e, 0x01, 0x1e, 0x7e, 0x31, 0x99, 0x31, 0xfe, 0xb5, 0x7d, 0x7c, 0x7e, 0xfe, 0xb5, 0x34, 0x34, 0x7e, 0x7e, 0x34, 0x7f, 0x31, 0xfe, 0xde, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x16, 0x04, 0x3a, 0x04, 0x12, 0x00, 0x03, 0x00, 0x00, 0x37, 0x11, 0x21, 0x11, 0xa7, 0x03, 0x93, 0x16, 0x03, 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x16, 0x04, 0x3a, 0x04, 0x12, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x02, 0xc5, 0xfd, 0x3b, 0x67, 0x03, 0x93, 0x88, 0x03, 0x18, 0xfc, 0x76, 0x03, 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x9a, 0x06, 0x27, 0x03, 0x8e, 0x00, 0x03, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x06, 0x26, 0xfa, 0x81, 0x05, 0x7f, 0x9a, 0x02, 0xf4, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x9a, 0x06, 0x27, 0x03, 0x8e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x05, 0x21, 0x11, 0x21, 0x05, 0xc0, 0xfb, 0x4e, 0x05, 0x18, 0xfa, 0x81, 0x05, 0x7f, 0x01, 0x0c, 0x02, 0x10, 0xfd, 0xf0, 0x72, 0x02, 0xf4, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0x06, 0x03, 0x4f, 0x05, 0x22, 0x00, 0x03, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0xa7, 0x02, 0xa8, 0xfa, 0x06, 0x1c, 0xf9, 0xe4, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x06, 0x03, 0x4f, 0x05, 0x22, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x01, 0xda, 0xfe, 0x26, 0x67, 0x02, 0xa8, 0x88, 0x05, 0x38, 0xfa, 0x56, 0x06, 0x1c, 0xf9, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x9a, 0x05, 0x85, 0x03, 0x8e, 0x00, 0x03, 0x00, 0x00, 0x25, 0x21, 0x01, 0x21, 0x04, 0x22, 0xfb, 0xe3, 0x01, 0x63, 0x04, 0x1c, 0x9a, 0x02, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x9a, 0x05, 0x85, 0x03, 0x8e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x13, 0x21, 0x03, 0x05, 0x21, 0x01, 0x21, 0x03, 0xf2, 0xf5, 0xfc, 0xb1, 0xf6, 0x03, 0x80, 0xfb, 0xe3, 0x01, 0x63, 0x04, 0x1c, 0x01, 0x0c, 0x02, 0x10, 0xfd, 0xf0, 0x72, 0x02, 0xf4, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x09, 0x01, 0x05, 0x02, 0xbf, 0x02, 0xc0, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x17, 0x21, 0x09, 0x03, 0x9f, 0x04, 0x4b, 0xfd, 0xda, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0x8a, 0x04, 0xca, 0xfa, 0xc4, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x37, 0x09, 0x01, 0x05, 0x01, 0xca, 0x01, 0xc9, 0x16, 0x03, 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x37, 0x21, 0x09, 0x03, 0x9f, 0x02, 0x5f, 0xfe, 0xd1, 0xfe, 0x36, 0x01, 0xca, 0x01, 0xc9, 0x88, 0x02, 0xa6, 0xfc, 0xe8, 0x03, 0xfc, 0xfc, 0x04, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x11, 0x01, 0x05, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x17, 0x09, 0x01, 0x03, 0x11, 0x01, 0x6c, 0x04, 0x4b, 0xfb, 0xb5, 0x67, 0x05, 0x7f, 0x52, 0x02, 0x66, 0x02, 0x66, 0xfa, 0x8a, 0x06, 0x20, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x37, 0x11, 0x01, 0x05, 0x03, 0x93, 0x16, 0x03, 0xfc, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x37, 0x09, 0x01, 0x03, 0x11, 0x01, 0x6c, 0x02, 0x5f, 0xfd, 0xa1, 0x67, 0x03, 0x93, 0xc1, 0x01, 0x53, 0x01, 0x53, 0xfc, 0xaf, 0x03, 0xfc, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x05, 0x85, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x37, 0x11, 0x01, 0x05, 0x05, 0x7f, 0x16, 0x03, 0xfc, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x05, 0x85, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x37, 0x09, 0x01, 0x03, 0x11, 0x01, 0x6c, 0x04, 0x18, 0xfb, 0xe8, 0x67, 0x05, 0x7f, 0xc1, 0x01, 0x53, 0x01, 0x53, 0xfc, 0xaf, 0x03, 0xfc, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x13, 0x21, 0x01, 0x05, 0x05, 0x7f, 0xfd, 0x40, 0x05, 0x24, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x09, 0x01, 0x25, 0x21, 0x01, 0x9f, 0x02, 0x25, 0x02, 0x26, 0xfb, 0x1b, 0x05, 0x7f, 0xfd, 0x40, 0x04, 0xb2, 0xfb, 0x36, 0x04, 0xca, 0x72, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x13, 0x21, 0x01, 0x05, 0x03, 0x93, 0xfe, 0x37, 0x04, 0x12, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x09, 0x01, 0x25, 0x21, 0x01, 0x9f, 0x01, 0x30, 0x01, 0x2f, 0xfd, 0x07, 0x03, 0x93, 0xfe, 0x37, 0x03, 0xa0, 0xfd, 0x5a, 0x02, 0xa6, 0x72, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x13, 0x01, 0x11, 0x05, 0x05, 0x7f, 0x02, 0x14, 0x03, 0x10, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x01, 0x11, 0x09, 0x01, 0x11, 0xd3, 0x04, 0x4b, 0xfa, 0xe7, 0x05, 0x7f, 0x02, 0x14, 0xfd, 0x9a, 0x04, 0xcc, 0xfd, 0x9a, 0x03, 0x10, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x13, 0x01, 0x11, 0x05, 0x03, 0x93, 0x02, 0x14, 0x01, 0xfe, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x01, 0x11, 0x09, 0x01, 0x11, 0xd3, 0x02, 0x5e, 0xfc, 0xd4, 0x03, 0x93, 0x02, 0x14, 0xfe, 0xad, 0x02, 0xa6, 0xfe, 0xad, 0x01, 0xfe, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x05, 0x85, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x13, 0x01, 0x11, 0x05, 0x05, 0x7f, 0x02, 0x14, 0x01, 0xfe, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x05, 0x85, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x09, 0x01, 0x11, 0x09, 0x01, 0x11, 0x01, 0x06, 0x04, 0x18, 0xfa, 0xe7, 0x05, 0x7f, 0x02, 0x14, 0xfe, 0xad, 0x02, 0xa6, 0xfe, 0xad, 0x01, 0xfe, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x03, 0x00, 0x00, 0x13, 0x09, 0x02, 0x05, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x09, 0x06, 0x8e, 0x02, 0x36, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0xfd, 0x88, 0x02, 0x78, 0x02, 0x78, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x0b, 0x01, 0x1e, 0x01, 0xa6, 0x01, 0xa6, 0xfe, 0x5a, 0xfd, 0xca, 0x02, 0x36, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0x29, 0x01, 0xd7, 0xfd, 0x88, 0x02, 0x78, 0x02, 0x78, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x03, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x00, 0x24, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x00, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x00, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x01, 0x5b, 0xe5, 0x71, 0x73, 0x73, 0x71, 0xe5, 0xe5, 0x71, 0x73, 0x73, 0x71, 0xfe, 0x8e, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0x6b, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0xef, 0x02, 0x4a, 0x92, 0x4a, 0x4a, 0x92, 0xfd, 0xb6, 0x92, 0x4a, 0x4a, 0x03, 0x36, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0xc0, 0x02, 0xfe, 0xc0, 0x60, 0x60, 0xfb, 0xff, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xe2, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0x00, 0x00, 0x02, 0x00, 0x05, 0xfe, 0x23, 0x03, 0x8a, 0x06, 0x75, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x09, 0x07, 0x01, 0xc7, 0xfe, 0xa6, 0x01, 0x5a, 0x01, 0x5b, 0xfe, 0xa5, 0x01, 0xc2, 0xfe, 0x3e, 0xfe, 0x3e, 0x05, 0x81, 0xfc, 0xcf, 0xfc, 0xc7, 0x03, 0x39, 0x04, 0x25, 0xfb, 0xdb, 0xfb, 0xd3, 0x04, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x00, 0x12, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x00, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0xce, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0x6b, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0x03, 0x93, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0xc0, 0x02, 0xfe, 0xc0, 0x60, 0x60, 0xfb, 0xff, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xe2, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x66, 0xff, 0x01, 0x05, 0xe2, 0x05, 0x27, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x2f, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x00, 0x25, 0x16, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x27, 0x05, 0x36, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x07, 0x13, 0x26, 0x27, 0x26, 0x27, 0x37, 0x16, 0x17, 0x16, 0x17, 0x25, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x37, 0x13, 0x16, 0x32, 0x37, 0x17, 0x06, 0x22, 0x27, 0x01, 0x36, 0x34, 0x27, 0x37, 0x16, 0x14, 0x07, 0x01, 0x26, 0x22, 0x07, 0x27, 0x36, 0x32, 0x17, 0x01, 0x06, 0x14, 0x17, 0x07, 0x26, 0x34, 0x37, 0x01, 0x39, 0x27, 0x35, 0x29, 0x33, 0x2c, 0x3f, 0x34, 0x43, 0x30, 0x03, 0x78, 0x32, 0x29, 0x2f, 0x2d, 0x5a, 0x35, 0x3e, 0x33, 0x40, 0x8c, 0x27, 0x35, 0x29, 0x32, 0x2b, 0x40, 0x33, 0x43, 0x30, 0xfc, 0x89, 0x33, 0x29, 0x35, 0x27, 0x5a, 0x2c, 0x47, 0x34, 0x3f, 0xd5, 0x44, 0x8b, 0x44, 0x23, 0x56, 0xad, 0x56, 0x02, 0xf6, 0x0e, 0x0e, 0x63, 0x12, 0x12, 0xfd, 0xdd, 0x44, 0x8b, 0x44, 0x23, 0x56, 0xad, 0x56, 0xfd, 0x0c, 0x0f, 0x0f, 0x63, 0x12, 0x12, 0x8f, 0x3c, 0x31, 0x26, 0x20, 0x6a, 0x28, 0x30, 0x3d, 0x4a, 0x75, 0x20, 0x26, 0x2c, 0x41, 0x3d, 0x4e, 0x3a, 0x30, 0x28, 0x04, 0x27, 0x3c, 0x31, 0x26, 0x20, 0x6a, 0x28, 0x30, 0x3d, 0x4a, 0x75, 0x20, 0x26, 0x31, 0x3c, 0x3e, 0x45, 0x42, 0x30, 0x28, 0xfa, 0xd4, 0x16, 0x16, 0x6e, 0x1b, 0x1b, 0x02, 0x5f, 0x49, 0xa0, 0x49, 0x27, 0x5b, 0xca, 0x5b, 0x03, 0x4a, 0x16, 0x16, 0x6e, 0x1b, 0x1b, 0xfd, 0xa1, 0x49, 0xa0, 0x49, 0x27, 0x5b, 0xca, 0x5b, 0x00, 0x00, 0x06, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x25, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x00, 0x36, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x13, 0x11, 0x16, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x06, 0x07, 0x06, 0x10, 0x17, 0x01, 0x11, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x17, 0x11, 0x36, 0x37, 0x36, 0x37, 0x11, 0x26, 0x27, 0x26, 0x17, 0x11, 0x36, 0x10, 0x65, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0x0a, 0x14, 0x17, 0x3a, 0x3b, 0x3b, 0x3a, 0x17, 0x7b, 0x9a, 0x9a, 0x01, 0x6d, 0x28, 0x27, 0x28, 0x28, 0x28, 0x28, 0x27, 0xdd, 0x3b, 0x39, 0x18, 0x15, 0x15, 0x18, 0x39, 0xcc, 0x99, 0x52, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xe2, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0x04, 0xc5, 0xfb, 0xbe, 0x0f, 0x0f, 0x25, 0x17, 0x04, 0xf6, 0x17, 0x25, 0x0f, 0x6d, 0xb1, 0xfd, 0xdc, 0xb1, 0x04, 0x5b, 0xfa, 0xd0, 0x07, 0x07, 0x05, 0x30, 0x07, 0x24, 0xfb, 0x0a, 0x17, 0x25, 0x0f, 0x10, 0x04, 0x40, 0x10, 0x0f, 0x25, 0xa2, 0xfc, 0x7c, 0xb1, 0x02, 0x22, 0x00, 0x00, 0x00, 0x04, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x37, 0x00, 0x00, 0x00, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x10, 0x27, 0x26, 0x23, 0x22, 0x07, 0x02, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x00, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x00, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x02, 0x56, 0x67, 0x33, 0x34, 0x34, 0x33, 0x67, 0x67, 0x33, 0x34, 0x34, 0x33, 0xd5, 0x9e, 0x4f, 0x4f, 0x4f, 0x4f, 0x9e, 0x9e, 0x4f, 0x4f, 0x4f, 0x4f, 0xfe, 0x48, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0x6b, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0x02, 0x98, 0xfe, 0xf8, 0x42, 0x21, 0x21, 0x42, 0x01, 0x08, 0x42, 0x21, 0x21, 0xfe, 0x6f, 0x01, 0x96, 0x65, 0x33, 0x33, 0x65, 0xfe, 0x6a, 0x65, 0x33, 0x33, 0x02, 0xaf, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0xc0, 0x02, 0xfe, 0xc0, 0x60, 0x60, 0xfb, 0xff, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xe2, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x17, 0x00, 0x00, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x65, 0x5e, 0x5e, 0xa4, 0xa3, 0xbd, 0xbc, 0xa3, 0xa3, 0x5e, 0x5f, 0x5f, 0x5e, 0xa3, 0xa3, 0xbc, 0xbd, 0xa3, 0xa4, 0x5e, 0x5e, 0x02, 0x12, 0xd1, 0xb6, 0xb5, 0x69, 0x69, 0x69, 0x69, 0xb5, 0xb6, 0xd1, 0xd1, 0xb6, 0xb5, 0x69, 0x69, 0x69, 0x69, 0xb5, 0xb6, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x05, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x02, 0x03, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x61, 0x60, 0xc0, 0x02, 0xfe, 0xc0, 0x60, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x01, 0x22, 0x07, 0x04, 0x10, 0x05, 0x16, 0x33, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x02, 0x03, 0x96, 0x94, 0xfe, 0xd4, 0x01, 0x2c, 0x94, 0x96, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x04, 0xdd, 0x60, 0xc0, 0xfd, 0x02, 0xc0, 0x60, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x01, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x04, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x04, 0x59, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0xd4, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x02, 0x3e, 0x01, 0x7f, 0xc0, 0x60, 0x60, 0xc0, 0xfe, 0x81, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x03, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x53, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x02, 0x3e, 0xfe, 0x81, 0xc0, 0x60, 0x60, 0xc0, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0b, 0x00, 0x18, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x20, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x01, 0x22, 0x07, 0x04, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x11, 0x21, 0x65, 0xbc, 0x01, 0x47, 0x01, 0x79, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xfe, 0x87, 0xfe, 0xb9, 0x02, 0x03, 0x96, 0x94, 0xfe, 0xd4, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfd, 0xaa, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x04, 0xdd, 0x60, 0xc0, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0xc0, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x20, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x01, 0x22, 0x07, 0x04, 0x11, 0x21, 0x65, 0xbc, 0x01, 0x47, 0x01, 0x79, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xfe, 0x87, 0xfe, 0xb9, 0x02, 0x03, 0x96, 0x94, 0xfe, 0xd4, 0x02, 0x56, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x04, 0xdd, 0x60, 0xc0, 0xfe, 0x81, 0x00, 0x01, 0x00, 0x64, 0xfe, 0xff, 0x03, 0x24, 0x05, 0x29, 0x00, 0x07, 0x00, 0x00, 0x36, 0x10, 0x25, 0x36, 0x33, 0x11, 0x22, 0x27, 0x65, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xaf, 0x52, 0x03, 0x84, 0xe2, 0x71, 0xf9, 0xd6, 0x71, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xff, 0x03, 0x67, 0x05, 0x29, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x05, 0x06, 0x23, 0x11, 0x32, 0x17, 0x03, 0x66, 0xfe, 0xa0, 0xaf, 0xb0, 0xb0, 0xaf, 0x03, 0xd6, 0xfc, 0x7c, 0xe2, 0x71, 0x06, 0x2a, 0x71, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xec, 0x05, 0x0b, 0x06, 0x28, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x11, 0x21, 0x11, 0x01, 0xce, 0x9a, 0xe2, 0x9a, 0x9a, 0x6f, 0x72, 0x9b, 0xfe, 0xd9, 0x04, 0x64, 0x02, 0xfa, 0x7d, 0xac, 0xac, 0x7d, 0x7c, 0xab, 0xab, 0xfc, 0x76, 0x06, 0x3c, 0xf9, 0xc4, 0x00, 0x00, 0x03, 0x00, 0xa7, 0xfe, 0x00, 0x06, 0x55, 0x06, 0x28, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x00, 0x24, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x00, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x01, 0x11, 0x21, 0x11, 0x01, 0x28, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0x6b, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0xfe, 0x88, 0x05, 0xae, 0x95, 0x02, 0xfe, 0xc0, 0x60, 0x60, 0xc0, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0x04, 0x01, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0xe2, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xf9, 0x48, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x02, 0x14, 0x06, 0x55, 0x06, 0x28, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x13, 0x11, 0x21, 0x11, 0x23, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x04, 0x11, 0x29, 0x01, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0xa7, 0x05, 0xae, 0x17, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0xfe, 0xa0, 0x05, 0x15, 0xfb, 0x54, 0x01, 0x2c, 0x95, 0x95, 0x95, 0x95, 0x01, 0x2c, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0x01, 0xc2, 0xe2, 0x71, 0x71, 0xe2, 0xfe, 0x3e, 0x01, 0x7e, 0xc1, 0x60, 0x60, 0xc1, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x00, 0x06, 0x55, 0x02, 0x14, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x13, 0x11, 0x33, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x11, 0x33, 0x11, 0x01, 0x21, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x24, 0xa7, 0x18, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0x17, 0xfa, 0xd3, 0x04, 0xac, 0xfe, 0xd4, 0x95, 0x95, 0x95, 0x95, 0xfe, 0xd4, 0xfe, 0x00, 0x04, 0x14, 0xfe, 0x3e, 0xe2, 0x71, 0x71, 0xe2, 0x01, 0xc2, 0xfb, 0xec, 0x04, 0x14, 0xfe, 0x82, 0xc1, 0x60, 0x60, 0xc1, 0x00, 0x00, 0x01, 0x00, 0x05, 0x02, 0x14, 0x02, 0xc5, 0x05, 0x29, 0x00, 0x09, 0x00, 0x00, 0x13, 0x10, 0x25, 0x36, 0x33, 0x15, 0x22, 0x07, 0x04, 0x11, 0x05, 0x01, 0x60, 0xb0, 0xaf, 0x95, 0x95, 0xfe, 0xd5, 0x02, 0x14, 0x01, 0xc2, 0xe2, 0x71, 0x76, 0x60, 0xc0, 0xfe, 0x81, 0x00, 0x01, 0x00, 0x05, 0x02, 0x14, 0x02, 0xc5, 0x05, 0x29, 0x00, 0x09, 0x00, 0x00, 0x13, 0x32, 0x17, 0x04, 0x11, 0x23, 0x10, 0x25, 0x26, 0x23, 0x05, 0xb0, 0xaf, 0x01, 0x60, 0x69, 0xfe, 0xd4, 0x94, 0x96, 0x05, 0x29, 0x71, 0xe2, 0xfe, 0x3e, 0x01, 0x7f, 0xc0, 0x60, 0x00, 0x01, 0x00, 0x05, 0xfe, 0xff, 0x02, 0xc5, 0x02, 0x14, 0x00, 0x09, 0x00, 0x00, 0x13, 0x35, 0x32, 0x37, 0x24, 0x11, 0x33, 0x10, 0x05, 0x06, 0x05, 0x96, 0x94, 0x01, 0x2c, 0x69, 0xfe, 0xa0, 0xaf, 0xfe, 0xff, 0x76, 0x60, 0xc0, 0x01, 0x7f, 0xfe, 0x3e, 0xe2, 0x71, 0x00, 0x01, 0x00, 0x05, 0xfe, 0xff, 0x02, 0xc5, 0x02, 0x14, 0x00, 0x09, 0x00, 0x00, 0x01, 0x22, 0x27, 0x24, 0x11, 0x33, 0x10, 0x05, 0x16, 0x33, 0x02, 0xc4, 0xaf, 0xb0, 0xfe, 0xa0, 0x6a, 0x01, 0x2b, 0x95, 0x95, 0xfe, 0xff, 0x71, 0xe2, 0x01, 0xc2, 0xfe, 0x81, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x02, 0x14, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x11, 0x00, 0x00, 0x13, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x11, 0x23, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x04, 0x11, 0x65, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0x6a, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0xd4, 0x02, 0x14, 0x01, 0xc2, 0xe2, 0x71, 0x71, 0xe2, 0xfe, 0x3e, 0x01, 0x7f, 0xc0, 0x60, 0x60, 0xc0, 0xfe, 0x81, 0x00, 0x01, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x02, 0x14, 0x00, 0x12, 0x00, 0x00, 0x13, 0x30, 0x33, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x11, 0x33, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x24, 0x65, 0x69, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0x6a, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0xfe, 0xa0, 0x02, 0x14, 0xfe, 0x81, 0xc0, 0x60, 0x60, 0xc0, 0x01, 0x7f, 0xfe, 0x3e, 0xe2, 0x71, 0x71, 0xe2, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x01, 0x11, 0x05, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x11, 0x01, 0x05, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x11, 0x21, 0x05, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x13, 0x21, 0x11, 0x05, 0x05, 0x7f, 0x05, 0x24, 0xf9, 0xe0, 0x00, 0x02, 0x01, 0x14, 0x01, 0xd1, 0x03, 0x2b, 0x04, 0x21, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x01, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x01, 0x49, 0x7d, 0xb4, 0x7c, 0x7c, 0x59, 0x5b, 0x7d, 0x35, 0x9c, 0x71, 0x70, 0x9a, 0x9b, 0xe1, 0x9b, 0x02, 0xfa, 0x64, 0x8a, 0x8a, 0x64, 0x63, 0x89, 0x89, 0x63, 0x7c, 0xab, 0xab, 0x7c, 0x7d, 0xac, 0xac, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfd, 0x40, 0x02, 0x5a, 0xfd, 0xa6, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x02, 0x58, 0xfd, 0xa8, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x01, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfb, 0x4e, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfd, 0x74, 0x02, 0x26, 0xfd, 0xda, 0xfd, 0x74, 0x02, 0x25, 0xfd, 0xdb, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0xfa, 0xc4, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x21, 0x09, 0x03, 0x02, 0x3f, 0x4e, 0x70, 0x4d, 0x4d, 0x71, 0xfe, 0x13, 0x04, 0x4b, 0xfd, 0xda, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0x01, 0x2c, 0x7c, 0x56, 0x56, 0x7c, 0x56, 0xfe, 0xa0, 0x04, 0xca, 0xfa, 0xc4, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x05, 0x21, 0x09, 0x03, 0x02, 0xc4, 0x02, 0x26, 0xfd, 0xda, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0x8a, 0x04, 0xca, 0xfa, 0xc4, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x17, 0x21, 0x11, 0x09, 0x02, 0x9f, 0x02, 0x25, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0x8a, 0x04, 0xca, 0xfa, 0xc4, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x64, 0xfe, 0x00, 0x07, 0xaa, 0x06, 0x28, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x12, 0x10, 0x01, 0x16, 0x20, 0x37, 0x00, 0x10, 0x01, 0x26, 0x20, 0x07, 0x00, 0x10, 0x01, 0x36, 0x20, 0x17, 0x00, 0x10, 0x01, 0x06, 0x20, 0x27, 0xd9, 0x01, 0x98, 0xcb, 0x01, 0x97, 0xcb, 0x01, 0x98, 0xfe, 0x68, 0xcb, 0xfe, 0x69, 0xcb, 0xfd, 0xf4, 0x01, 0xd1, 0xe9, 0x01, 0xd1, 0xe9, 0x01, 0xd1, 0xfe, 0x2f, 0xe9, 0xfe, 0x2f, 0xe9, 0x04, 0x1e, 0xfb, 0xec, 0xfe, 0xfb, 0x83, 0x83, 0x01, 0x05, 0x04, 0x14, 0x01, 0x05, 0x83, 0x83, 0xfa, 0x9d, 0x04, 0xa8, 0x01, 0x2a, 0x96, 0x96, 0xfe, 0xd6, 0xfb, 0x58, 0xfe, 0xd6, 0x96, 0x96, 0x00, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0x01, 0x0e, 0x04, 0xb2, 0xfd, 0xda, 0xfd, 0x74, 0x67, 0x05, 0x7f, 0xfa, 0xe8, 0x02, 0x25, 0xfd, 0xdb, 0x8a, 0x05, 0x3c, 0xfd, 0x29, 0xfd, 0x29, 0x06, 0x20, 0xf9, 0xe0, 0x03, 0x49, 0x02, 0x65, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x0e, 0x02, 0x8c, 0x02, 0x26, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0xfa, 0xe8, 0x02, 0x25, 0xfd, 0xdb, 0x02, 0x4d, 0xfd, 0x29, 0x05, 0x3c, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x02, 0x65, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x0e, 0x02, 0x25, 0x02, 0x8d, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0xfd, 0x74, 0x02, 0x26, 0xfd, 0xda, 0x8a, 0x02, 0xd7, 0x02, 0x65, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x02, 0x65, 0x00, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0x01, 0x0e, 0x04, 0xb2, 0xfd, 0x73, 0xfd, 0xdb, 0x67, 0x05, 0x7f, 0xfd, 0x74, 0x02, 0x26, 0xfd, 0xda, 0x8a, 0x02, 0x65, 0x02, 0xd7, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x03, 0x49, 0x02, 0x65, 0x00, 0x03, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x20, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x01, 0x06, 0x07, 0x04, 0x03, 0x21, 0x05, 0x12, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x27, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x01, 0xcf, 0x7b, 0x7b, 0xfe, 0xeb, 0x15, 0x02, 0x20, 0xfd, 0xe0, 0x15, 0x01, 0x15, 0x95, 0x95, 0x95, 0x95, 0x01, 0x2c, 0xfe, 0xd4, 0x7b, 0x7c, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x04, 0xda, 0x0e, 0x4f, 0xb2, 0xfe, 0xac, 0x72, 0xfe, 0xac, 0xb2, 0x60, 0x60, 0xc1, 0x02, 0xfc, 0xc1, 0x4f, 0x0e, 0xfd, 0x2b, 0x00, 0x03, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x05, 0x36, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x04, 0x03, 0x21, 0x05, 0x12, 0x05, 0x16, 0x17, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x02, 0x36, 0x7c, 0x7b, 0x01, 0x2c, 0xfe, 0xd4, 0x95, 0x95, 0x95, 0x95, 0xfe, 0xeb, 0x15, 0x02, 0x87, 0xfd, 0x79, 0x15, 0x01, 0x15, 0x7b, 0x7b, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x5e, 0x0e, 0x4f, 0xc1, 0x02, 0xfc, 0xc1, 0x60, 0x60, 0xb2, 0xfe, 0xac, 0x72, 0xfe, 0xac, 0xb2, 0x4f, 0x0e, 0x02, 0x63, 0x00, 0x00, 0x03, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x10, 0x05, 0x16, 0x17, 0x11, 0x21, 0x02, 0x25, 0x26, 0x23, 0x22, 0x07, 0x01, 0x36, 0x37, 0x24, 0x13, 0x21, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x53, 0x01, 0x2c, 0x7b, 0x7b, 0x02, 0x88, 0x14, 0xfe, 0xea, 0x95, 0x95, 0x95, 0x95, 0x01, 0x5d, 0x7c, 0x7b, 0x01, 0x16, 0x14, 0xfd, 0xdf, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x03, 0xbc, 0xfd, 0x04, 0xc1, 0x4f, 0x0e, 0x02, 0xd5, 0x01, 0x54, 0xb2, 0x60, 0x60, 0xfb, 0x25, 0x0e, 0x4f, 0xb2, 0x01, 0x54, 0x00, 0x00, 0x03, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x13, 0x21, 0x11, 0x06, 0x07, 0x01, 0x02, 0x25, 0x26, 0x27, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x53, 0x01, 0x2c, 0x95, 0x95, 0x95, 0x95, 0x01, 0x16, 0x14, 0xfd, 0x78, 0x7b, 0x7b, 0x03, 0x7e, 0x14, 0xfe, 0xea, 0x7b, 0x7c, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x03, 0xbc, 0xfd, 0x04, 0xc1, 0x60, 0x60, 0xb2, 0x01, 0x54, 0x02, 0xd5, 0x0e, 0x4f, 0xfd, 0xfa, 0x01, 0x54, 0xb2, 0x4f, 0x0e, 0xfd, 0x9d, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x37, 0x01, 0x21, 0x03, 0x11, 0x21, 0x6c, 0x04, 0x18, 0xfb, 0xe8, 0x67, 0x05, 0x7f, 0x20, 0x04, 0x92, 0xfa, 0x52, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x09, 0x01, 0x11, 0x25, 0x21, 0x11, 0x01, 0x06, 0x04, 0x18, 0xfa, 0xe7, 0x05, 0x7f, 0x04, 0xb2, 0xfb, 0x6e, 0x04, 0x92, 0x72, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x17, 0x21, 0x01, 0x03, 0x11, 0x01, 0x6c, 0x04, 0x18, 0xfb, 0xe8, 0x67, 0x05, 0x7f, 0x8a, 0x04, 0x92, 0xfa, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x79, 0x05, 0x53, 0x04, 0xaf, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x03, 0xde, 0xfc, 0x22, 0x67, 0x04, 0xac, 0x15, 0x04, 0x52, 0xfb, 0x3c, 0x05, 0x36, 0xfa, 0xca, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0x79, 0x05, 0x53, 0x04, 0xaf, 0x00, 0x03, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0xa7, 0x04, 0xac, 0x87, 0x05, 0x36, 0xfa, 0xca, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xdd, 0x04, 0x9f, 0x04, 0x4b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x03, 0x2a, 0xfc, 0xd6, 0x67, 0x03, 0xf8, 0x4f, 0x03, 0x8a, 0xfc, 0x04, 0x04, 0x6e, 0xfb, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0xdd, 0x04, 0x9f, 0x04, 0x4b, 0x00, 0x03, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0xa7, 0x03, 0xf8, 0x23, 0x04, 0x6e, 0xfb, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x05, 0x21, 0x11, 0x09, 0x01, 0x11, 0x01, 0x06, 0x04, 0x18, 0xfa, 0xe7, 0x05, 0x7f, 0x8a, 0x04, 0x92, 0xfa, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x09, 0x00, 0x99, 0x00, 0x00, 0x05, 0xda, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x49, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x05, 0x17, 0x15, 0x07, 0x27, 0x25, 0x17, 0x07, 0x23, 0x26, 0x27, 0x35, 0x05, 0x32, 0x1f, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x25, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x03, 0x33, 0x16, 0x17, 0x15, 0x07, 0x27, 0x35, 0x25, 0x33, 0x17, 0x15, 0x07, 0x27, 0x35, 0x25, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x03, 0x1b, 0x45, 0x05, 0x05, 0x45, 0x06, 0x01, 0xff, 0x34, 0xdf, 0x37, 0xfd, 0x4a, 0xe3, 0x37, 0x03, 0xb4, 0x29, 0x01, 0xf8, 0xbc, 0x50, 0x0c, 0xac, 0x3f, 0x2a, 0x9d, 0x58, 0x20, 0xa5, 0x3c, 0xfd, 0x90, 0x01, 0x31, 0x06, 0x06, 0xfe, 0xcf, 0x05, 0x04, 0x03, 0x01, 0x36, 0x07, 0x07, 0xfe, 0xca, 0x06, 0x3f, 0x02, 0x79, 0x66, 0x37, 0xdf, 0xfd, 0xf0, 0x03, 0x35, 0xde, 0x37, 0x01, 0xe5, 0x45, 0x05, 0x05, 0x45, 0x06, 0x05, 0xd5, 0x06, 0xfe, 0xa2, 0x06, 0x06, 0x01, 0x5e, 0x9b, 0x3f, 0x03, 0xfe, 0x3f, 0xee, 0xfe, 0x40, 0xc7, 0x37, 0x04, 0xb5, 0xe1, 0x60, 0xbd, 0x64, 0x17, 0xa7, 0x3f, 0x5c, 0xb5, 0x67, 0x1b, 0xfe, 0xed, 0x06, 0x4f, 0x06, 0x06, 0x4f, 0x06, 0x06, 0x4f, 0x06, 0x06, 0x4f, 0xfe, 0xe8, 0x82, 0x79, 0x03, 0x3e, 0xfd, 0x04, 0x2a, 0x3c, 0x03, 0xfe, 0x3f, 0x04, 0x76, 0x06, 0xfe, 0xa2, 0x06, 0x06, 0x01, 0x5e, 0x00, 0x01, 0x00, 0x5d, 0xff, 0xfb, 0x06, 0xd5, 0x02, 0xe1, 0x00, 0x22, 0x00, 0x00, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x36, 0x33, 0x16, 0x15, 0x14, 0x07, 0x16, 0x1d, 0x01, 0x06, 0x23, 0x21, 0x35, 0x32, 0x37, 0x36, 0x3b, 0x01, 0x27, 0x34, 0x3f, 0x01, 0x17, 0x27, 0x34, 0x3f, 0x01, 0x32, 0x17, 0x36, 0x04, 0x76, 0x14, 0xc3, 0x69, 0x13, 0x23, 0x31, 0x7a, 0x1f, 0x5d, 0x11, 0x48, 0xf9, 0xe2, 0x33, 0x79, 0x29, 0x2f, 0x1d, 0x0a, 0x90, 0x23, 0x26, 0x05, 0xb8, 0x3c, 0x2b, 0x2a, 0x6c, 0x02, 0xe1, 0xe8, 0x56, 0x23, 0x1b, 0x6d, 0x31, 0x34, 0x17, 0x48, 0x1a, 0x65, 0x09, 0xae, 0x27, 0x31, 0x6c, 0x31, 0x04, 0x04, 0x0c, 0x93, 0x5a, 0x08, 0x2b, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x06, 0x1b, 0x05, 0xd5, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x33, 0x17, 0x15, 0x33, 0x20, 0x13, 0x16, 0x1d, 0x01, 0x23, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x15, 0x14, 0x07, 0x27, 0x26, 0x23, 0x11, 0x14, 0x0f, 0x01, 0x22, 0x2f, 0x01, 0x35, 0x37, 0x33, 0x17, 0x15, 0x16, 0x3b, 0x01, 0x32, 0x3f, 0x01, 0x11, 0x22, 0x07, 0x06, 0x23, 0x27, 0x35, 0x37, 0x23, 0x26, 0x27, 0x23, 0x22, 0x0f, 0x01, 0x23, 0x35, 0x36, 0x37, 0x36, 0x21, 0x35, 0x03, 0x30, 0x34, 0x06, 0x02, 0x01, 0x8c, 0xfc, 0x26, 0x01, 0x14, 0x11, 0x20, 0x33, 0x28, 0x87, 0x64, 0x08, 0x1d, 0x88, 0x7b, 0x5f, 0x1b, 0x52, 0x21, 0x02, 0x05, 0x27, 0x05, 0x09, 0x38, 0x09, 0x32, 0x12, 0x05, 0xbe, 0x4d, 0x10, 0x0c, 0x06, 0x06, 0x04, 0x3c, 0xb1, 0x3d, 0x59, 0x1e, 0x12, 0x03, 0x34, 0xad, 0xd7, 0x01, 0x19, 0x05, 0xd5, 0x06, 0x7d, 0xfe, 0x1a, 0x56, 0x0d, 0x08, 0x0f, 0x2e, 0x18, 0x65, 0x33, 0x0f, 0x02, 0x42, 0x3d, 0xfd, 0x53, 0x65, 0x18, 0x02, 0x60, 0x1c, 0x1a, 0x06, 0x06, 0x0c, 0x65, 0x39, 0x2a, 0x02, 0xa4, 0x3d, 0x39, 0x06, 0x0c, 0x33, 0x40, 0x1b, 0x3d, 0x12, 0x02, 0x90, 0xda, 0xdf, 0x7d, 0x00, 0x1a, 0x00, 0x99, 0xff, 0xff, 0x05, 0xdc, 0x07, 0x6b, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x43, 0x00, 0x60, 0x00, 0x8c, 0x00, 0xb7, 0x00, 0xe3, 0x01, 0x0e, 0x01, 0x3a, 0x01, 0x64, 0x01, 0x90, 0x01, 0xbb, 0x01, 0xe6, 0x02, 0x0f, 0x02, 0x3b, 0x02, 0x65, 0x02, 0x6d, 0x02, 0x75, 0x02, 0x7d, 0x02, 0xa9, 0x02, 0xd3, 0x02, 0xfd, 0x03, 0x27, 0x03, 0x53, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x37, 0x33, 0x06, 0x07, 0x26, 0x27, 0x33, 0x16, 0x33, 0x32, 0x37, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x07, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x03, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x06, 0x13, 0x36, 0x37, 0x32, 0x1f, 0x01, 0x16, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x20, 0x24, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x34, 0x37, 0x01, 0x17, 0x27, 0x26, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x05, 0x17, 0x27, 0x26, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x13, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x14, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x14, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x05, 0x17, 0x27, 0x34, 0x33, 0x32, 0x15, 0x07, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x03, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x05, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x1f, 0x01, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x14, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x37, 0x17, 0x27, 0x34, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x37, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x13, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x05, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x17, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x01, 0x17, 0x27, 0x26, 0x33, 0x32, 0x15, 0x07, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x14, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x05, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x03, 0x96, 0x07, 0x07, 0x3c, 0x16, 0x17, 0x05, 0x73, 0x71, 0x08, 0x15, 0x21, 0x36, 0x07, 0x6e, 0x26, 0x01, 0x03, 0x26, 0x23, 0x03, 0x03, 0xf9, 0x25, 0x02, 0x02, 0x27, 0x24, 0x03, 0x03, 0x3a, 0x22, 0x02, 0x03, 0x23, 0x21, 0x01, 0x01, 0xb6, 0x70, 0xde, 0x9e, 0x9c, 0xe0, 0x70, 0x5b, 0x7d, 0x02, 0x03, 0x36, 0x28, 0x3b, 0x71, 0x54, 0x52, 0x7d, 0x3c, 0x28, 0x32, 0x82, 0x13, 0x17, 0x85, 0x77, 0x2c, 0x02, 0x4a, 0x44, 0x12, 0x16, 0x64, 0x4e, 0x80, 0xff, 0xfe, 0x92, 0xff, 0x00, 0x80, 0x53, 0x6a, 0x12, 0x12, 0x44, 0x44, 0xfd, 0xe5, 0x25, 0x05, 0x01, 0x0d, 0x10, 0x02, 0x05, 0x24, 0x03, 0x04, 0x0e, 0x07, 0x2b, 0x2a, 0x08, 0x0e, 0x04, 0x03, 0x24, 0x05, 0x01, 0x0f, 0x0c, 0x04, 0x24, 0x02, 0x05, 0x0c, 0x08, 0x29, 0x2c, 0x06, 0x0d, 0x05, 0x01, 0x0a, 0x21, 0x05, 0x02, 0x1b, 0x02, 0x05, 0x21, 0x04, 0x03, 0x0d, 0x06, 0x28, 0x26, 0x06, 0x0b, 0x04, 0x03, 0x1f, 0x03, 0x01, 0x0c, 0x0c, 0x04, 0x20, 0x03, 0x03, 0x0c, 0x07, 0x25, 0x26, 0x07, 0x0d, 0x03, 0x03, 0x0f, 0x21, 0x05, 0x02, 0x0d, 0x0e, 0x01, 0x06, 0x21, 0x03, 0x05, 0x0b, 0x06, 0x27, 0x25, 0x07, 0x0a, 0x06, 0x02, 0x20, 0x05, 0x01, 0x0e, 0x0b, 0x04, 0x20, 0x03, 0x03, 0x0d, 0x08, 0x25, 0x26, 0x07, 0x0d, 0x03, 0x5c, 0x21, 0x06, 0x01, 0x1b, 0x02, 0x06, 0x22, 0x03, 0x04, 0x0c, 0x06, 0x27, 0x25, 0x07, 0x0b, 0x06, 0x01, 0x21, 0x05, 0x01, 0x0d, 0x0c, 0x05, 0x20, 0x03, 0x04, 0x0b, 0x07, 0x25, 0x26, 0x07, 0x0c, 0x04, 0xfc, 0x37, 0x11, 0x02, 0x01, 0x06, 0x07, 0x01, 0x02, 0x12, 0x01, 0x01, 0x08, 0x03, 0x16, 0x15, 0x04, 0x08, 0x01, 0x01, 0x11, 0x01, 0x06, 0x05, 0x02, 0x11, 0x02, 0x03, 0x05, 0x03, 0x15, 0x16, 0x02, 0x07, 0x01, 0x02, 0xc8, 0x12, 0x02, 0x01, 0x10, 0x01, 0x03, 0x13, 0x02, 0x02, 0x08, 0x04, 0x17, 0x16, 0x04, 0x07, 0x02, 0x02, 0x13, 0x03, 0x0e, 0x02, 0x12, 0x02, 0x02, 0x07, 0x03, 0x17, 0x17, 0x04, 0x08, 0x02, 0xfd, 0x0e, 0x12, 0x04, 0x06, 0x08, 0x04, 0x11, 0x03, 0x02, 0x07, 0x05, 0x14, 0x14, 0x04, 0x06, 0x02, 0x03, 0x11, 0x03, 0x01, 0x08, 0x06, 0x04, 0x12, 0x02, 0x02, 0x06, 0x03, 0x14, 0x14, 0x04, 0x07, 0x02, 0x53, 0x12, 0x04, 0x01, 0x0f, 0x01, 0x03, 0x11, 0x03, 0x02, 0x06, 0x03, 0x15, 0x14, 0x04, 0x06, 0x02, 0x03, 0x11, 0x03, 0x01, 0x07, 0x07, 0x03, 0x11, 0x02, 0x02, 0x07, 0x05, 0x13, 0x13, 0x05, 0x07, 0x02, 0x01, 0x00, 0x11, 0x02, 0x01, 0x0f, 0x01, 0x03, 0x11, 0x01, 0x03, 0x07, 0x04, 0x14, 0x13, 0x05, 0x07, 0x03, 0x01, 0x11, 0x03, 0x01, 0x08, 0x06, 0x02, 0x11, 0x02, 0x01, 0x07, 0x04, 0x14, 0x15, 0x03, 0x07, 0x01, 0x64, 0x11, 0x02, 0x02, 0x0f, 0x01, 0x03, 0x12, 0x01, 0x02, 0x07, 0x03, 0x15, 0x15, 0x03, 0x07, 0x02, 0x01, 0x11, 0x02, 0x06, 0x06, 0x02, 0x11, 0x02, 0x03, 0x05, 0x04, 0x13, 0x14, 0x03, 0x05, 0x03, 0xde, 0x13, 0x02, 0x06, 0x08, 0x01, 0x03, 0x14, 0x01, 0x04, 0x07, 0x05, 0x17, 0x16, 0x06, 0x07, 0x04, 0x02, 0x12, 0x02, 0x01, 0x08, 0x06, 0x02, 0x13, 0x02, 0x02, 0x07, 0x04, 0x16, 0x17, 0x03, 0x07, 0x02, 0x52, 0x13, 0x02, 0x01, 0x10, 0x01, 0x04, 0x14, 0x02, 0x02, 0x07, 0x03, 0x17, 0x16, 0x04, 0x07, 0x02, 0x02, 0x14, 0x03, 0x01, 0x0e, 0x02, 0x13, 0x01, 0x03, 0x07, 0x04, 0x17, 0x18, 0x03, 0x08, 0x02, 0x9c, 0x21, 0x02, 0x02, 0x25, 0x1f, 0x03, 0x03, 0xfe, 0xd8, 0x22, 0x02, 0x03, 0x23, 0x21, 0x01, 0x01, 0xe3, 0x22, 0x02, 0x02, 0x25, 0x1f, 0x03, 0x03, 0x01, 0x3d, 0x20, 0x05, 0x01, 0x0d, 0x0d, 0x06, 0x20, 0x03, 0x05, 0x0b, 0x06, 0x26, 0x25, 0x07, 0x0b, 0x05, 0x03, 0x20, 0x04, 0x02, 0x0d, 0x0c, 0x05, 0x20, 0x03, 0x04, 0x0d, 0x08, 0x26, 0x27, 0x07, 0x0d, 0x04, 0xfc, 0xb3, 0x12, 0x02, 0x01, 0x10, 0x01, 0x04, 0x13, 0x03, 0x02, 0x08, 0x04, 0x17, 0x16, 0x04, 0x07, 0x02, 0x03, 0x13, 0x04, 0x0e, 0x02, 0x12, 0x02, 0x02, 0x07, 0x03, 0x17, 0x18, 0x03, 0x08, 0x02, 0xfe, 0x7c, 0x14, 0x03, 0x01, 0x10, 0x01, 0x02, 0x13, 0x01, 0x02, 0x07, 0x02, 0x18, 0x17, 0x03, 0x07, 0x02, 0x01, 0x13, 0x01, 0x01, 0x0e, 0x03, 0x14, 0x01, 0x02, 0x08, 0x05, 0x16, 0x17, 0x04, 0x08, 0x02, 0x03, 0xc5, 0x14, 0x03, 0x01, 0x10, 0x01, 0x03, 0x13, 0x02, 0x02, 0x07, 0x02, 0x18, 0x17, 0x03, 0x07, 0x02, 0x02, 0x13, 0x02, 0x01, 0x0e, 0x03, 0x14, 0x01, 0x03, 0x07, 0x05, 0x16, 0x17, 0x04, 0x08, 0x02, 0xfc, 0xa4, 0x22, 0x05, 0x02, 0x0d, 0x0e, 0x02, 0x05, 0x21, 0x03, 0x05, 0x0b, 0x06, 0x27, 0x25, 0x07, 0x0a, 0x06, 0x02, 0x20, 0x04, 0x01, 0x0d, 0x0b, 0x04, 0x21, 0x02, 0x03, 0x0d, 0x07, 0x26, 0x26, 0x08, 0x0e, 0x03, 0x03, 0x89, 0x01, 0x26, 0x45, 0x05, 0x07, 0x43, 0x26, 0x56, 0x02, 0x2a, 0x2c, 0x03, 0x03, 0x29, 0x2d, 0x04, 0x02, 0x29, 0x2d, 0x03, 0x03, 0x2a, 0x2c, 0xfe, 0x12, 0x02, 0x25, 0x26, 0x02, 0x02, 0x25, 0x26, 0x9e, 0x66, 0x93, 0x91, 0xd0, 0xd0, 0x91, 0x93, 0x66, 0x55, 0x20, 0x33, 0x48, 0x68, 0x66, 0x65, 0x65, 0x66, 0x68, 0x48, 0x32, 0x1e, 0x01, 0xd9, 0x70, 0x18, 0x75, 0x13, 0x5e, 0xe8, 0x51, 0x18, 0x10, 0x1c, 0x46, 0x73, 0xa5, 0xa3, 0xe6, 0xe6, 0xa3, 0xa5, 0x73, 0x4b, 0x1a, 0x0f, 0x16, 0x51, 0xe8, 0x47, 0xfd, 0x68, 0x21, 0x39, 0x0f, 0x0f, 0x39, 0x21, 0x04, 0x11, 0x0b, 0x03, 0x15, 0x16, 0x03, 0x0c, 0x0f, 0x02, 0x21, 0x37, 0x10, 0x10, 0x37, 0x21, 0x02, 0x0f, 0x0c, 0x03, 0x16, 0x15, 0x03, 0x0b, 0x11, 0x01, 0xd1, 0x1f, 0x34, 0x0d, 0x0d, 0x34, 0x1f, 0x03, 0x10, 0x07, 0x05, 0x14, 0x13, 0x03, 0x09, 0x0e, 0x02, 0x1e, 0x32, 0x0f, 0x0f, 0x32, 0x1e, 0x02, 0x0e, 0x09, 0x03, 0x13, 0x14, 0x05, 0x07, 0x10, 0x4b, 0x1f, 0x34, 0x0e, 0x0e, 0x34, 0x1f, 0x03, 0x10, 0x07, 0x03, 0x15, 0x13, 0x04, 0x09, 0x0e, 0x02, 0x1e, 0x32, 0x0e, 0x0e, 0x32, 0x1e, 0x02, 0x0e, 0x09, 0x04, 0x13, 0x15, 0x03, 0x07, 0x10, 0x01, 0x1b, 0x1e, 0x32, 0x0e, 0x0e, 0x32, 0x1e, 0x02, 0x0e, 0x09, 0x04, 0x13, 0x14, 0x03, 0x09, 0x0f, 0x03, 0x1d, 0x31, 0x0e, 0x0e, 0x31, 0x1d, 0x03, 0x0f, 0x09, 0x03, 0x14, 0x13, 0x04, 0x09, 0x0e, 0x02, 0x9a, 0x10, 0x1c, 0x06, 0x06, 0x1c, 0x10, 0x01, 0x07, 0x06, 0x02, 0x09, 0x0b, 0x02, 0x04, 0x08, 0x02, 0x0e, 0x19, 0x07, 0x07, 0x19, 0x0e, 0x02, 0x08, 0x04, 0x02, 0x0b, 0x09, 0x02, 0x06, 0x07, 0xfe, 0xe3, 0x11, 0x1d, 0x0a, 0x0a, 0x1d, 0x11, 0x03, 0x0a, 0x05, 0x01, 0x0d, 0x0a, 0x03, 0x06, 0x07, 0x01, 0x11, 0x1e, 0x07, 0x07, 0x1e, 0x11, 0x01, 0x07, 0x06, 0x03, 0x0a, 0x0d, 0x01, 0x05, 0x0a, 0xa8, 0x10, 0x1c, 0x07, 0x07, 0x1c, 0x10, 0x02, 0x07, 0x06, 0x02, 0x09, 0x0b, 0x02, 0x05, 0x08, 0x02, 0x0f, 0x1a, 0x08, 0x08, 0x1a, 0x0f, 0x02, 0x08, 0x05, 0x02, 0x0b, 0x09, 0x02, 0x06, 0x07, 0x01, 0x18, 0x10, 0x1c, 0x06, 0x06, 0x1c, 0x10, 0x02, 0x08, 0x04, 0x03, 0x0a, 0x0a, 0x02, 0x05, 0x07, 0x01, 0x0f, 0x19, 0x08, 0x08, 0x19, 0x0f, 0x01, 0x07, 0x05, 0x02, 0x0a, 0x0a, 0x03, 0x04, 0x08, 0x18, 0x0f, 0x1b, 0x07, 0x07, 0x1b, 0x0f, 0x02, 0x08, 0x05, 0x01, 0x0a, 0x0b, 0x01, 0x06, 0x07, 0x01, 0x10, 0x1b, 0x08, 0x08, 0x1b, 0x10, 0x01, 0x07, 0x06, 0x01, 0x0b, 0x0a, 0x01, 0x06, 0x07, 0xa1, 0x0f, 0x1b, 0x07, 0x07, 0x1b, 0x0f, 0x01, 0x07, 0x04, 0x01, 0x0c, 0x0a, 0x01, 0x0c, 0x01, 0x0f, 0x1b, 0x07, 0x07, 0x1b, 0x0f, 0x01, 0x0c, 0x01, 0x0a, 0x0c, 0x01, 0x04, 0x07, 0x37, 0x12, 0x1f, 0x07, 0x07, 0x1f, 0x12, 0x01, 0x08, 0x05, 0x02, 0x0c, 0x0c, 0x02, 0x05, 0x08, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x1d, 0x12, 0x01, 0x08, 0x05, 0x02, 0x0c, 0x0c, 0x02, 0x05, 0x08, 0xd9, 0x12, 0x1f, 0x07, 0x07, 0x1f, 0x12, 0x01, 0x08, 0x05, 0x02, 0x0b, 0x0c, 0x02, 0x05, 0x0a, 0x03, 0x10, 0x1c, 0x09, 0x09, 0x1c, 0x10, 0x03, 0x0a, 0x05, 0x02, 0x0c, 0x0b, 0x02, 0x06, 0x07, 0xfa, 0xe0, 0x02, 0x25, 0x26, 0x02, 0x02, 0x25, 0x26, 0xe2, 0x02, 0x25, 0x27, 0x02, 0x03, 0x25, 0x26, 0x02, 0x02, 0x25, 0x27, 0x02, 0x03, 0x25, 0x26, 0x01, 0x81, 0x1d, 0x32, 0x0e, 0x0e, 0x32, 0x1d, 0x03, 0x0f, 0x09, 0x03, 0x13, 0x14, 0x03, 0x0a, 0x0e, 0x04, 0x1b, 0x2f, 0x0f, 0x0f, 0x2f, 0x1b, 0x04, 0x0e, 0x0a, 0x03, 0x14, 0x13, 0x03, 0x09, 0x0f, 0x02, 0x67, 0x12, 0x1e, 0x08, 0x08, 0x1e, 0x12, 0x01, 0x0a, 0x04, 0x02, 0x0b, 0x0c, 0x02, 0x06, 0x08, 0x02, 0x11, 0x1d, 0x09, 0x09, 0x1d, 0x11, 0x02, 0x08, 0x06, 0x02, 0x0c, 0x0b, 0x02, 0x04, 0x0a, 0xfb, 0x12, 0x1f, 0x07, 0x07, 0x1f, 0x12, 0x01, 0x08, 0x05, 0x03, 0x0b, 0x0c, 0x02, 0x05, 0x09, 0x01, 0x12, 0x1c, 0x0a, 0x0a, 0x1c, 0x12, 0x01, 0x09, 0x05, 0x02, 0x0c, 0x0b, 0x03, 0x05, 0x08, 0x01, 0x82, 0x11, 0x1e, 0x08, 0x08, 0x1e, 0x11, 0x02, 0x08, 0x07, 0x01, 0x0b, 0x0c, 0x02, 0x05, 0x09, 0x01, 0x11, 0x1c, 0x09, 0x09, 0x1c, 0x11, 0x01, 0x09, 0x05, 0x02, 0x0c, 0x0b, 0x01, 0x07, 0x08, 0xfd, 0x7f, 0x1f, 0x34, 0x0e, 0x0e, 0x34, 0x1f, 0x03, 0x10, 0x07, 0x04, 0x14, 0x13, 0x03, 0x0a, 0x0e, 0x03, 0x1d, 0x32, 0x0e, 0x0e, 0x32, 0x1d, 0x03, 0x0e, 0x0a, 0x03, 0x13, 0x14, 0x04, 0x07, 0x10, 0x00, 0x0f, 0x00, 0x75, 0x00, 0x00, 0x05, 0xff, 0x07, 0x0b, 0x00, 0x17, 0x00, 0x2d, 0x00, 0x3e, 0x00, 0x4f, 0x00, 0x60, 0x00, 0x71, 0x00, 0x82, 0x00, 0x93, 0x00, 0xa4, 0x00, 0xb5, 0x00, 0xc6, 0x00, 0xd7, 0x00, 0xe8, 0x00, 0xf9, 0x01, 0x0a, 0x00, 0x00, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x2b, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x3f, 0x02, 0x36, 0x33, 0x32, 0x33, 0x16, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x23, 0x22, 0x07, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x01, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x01, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x25, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x02, 0x0a, 0x29, 0x17, 0x12, 0x2d, 0x13, 0x56, 0x6f, 0x14, 0x2f, 0x22, 0x2a, 0x36, 0x25, 0x0b, 0x5a, 0x7b, 0x03, 0x03, 0x38, 0xec, 0x47, 0x08, 0x05, 0x0c, 0x0d, 0x1b, 0x27, 0x2f, 0x41, 0x2e, 0x4a, 0x04, 0x1d, 0x1c, 0x2c, 0x31, 0x44, 0xdf, 0x1a, 0x0d, 0x07, 0x18, 0x0a, 0x0b, 0x21, 0x0b, 0x01, 0x17, 0x0c, 0x97, 0x1a, 0x0d, 0x07, 0x18, 0x09, 0x0c, 0x21, 0x0b, 0x01, 0x17, 0x0c, 0x7c, 0x19, 0x0e, 0x06, 0x17, 0x09, 0x0d, 0x1f, 0x0d, 0x01, 0x17, 0x0c, 0x8c, 0x19, 0x0d, 0x07, 0x18, 0x09, 0x0c, 0x20, 0x0c, 0x01, 0x17, 0x0c, 0x02, 0x1a, 0x0d, 0x07, 0x18, 0x09, 0x0d, 0x1f, 0x0d, 0x17, 0x0c, 0xab, 0x1b, 0x0d, 0x06, 0x17, 0x0a, 0x0c, 0x20, 0x0c, 0x01, 0x18, 0x0c, 0x01, 0x62, 0x19, 0x0e, 0x06, 0x17, 0x09, 0x0d, 0x1f, 0x0d, 0x01, 0x17, 0x0c, 0xaf, 0x1a, 0x0d, 0x07, 0x18, 0x0a, 0x0b, 0x21, 0x0b, 0x01, 0x17, 0x0c, 0xae, 0x1a, 0x0e, 0x06, 0x17, 0x0a, 0x0c, 0x20, 0x0c, 0x01, 0x18, 0x0b, 0xfd, 0x9a, 0x1a, 0x0d, 0x07, 0x18, 0x0a, 0x0b, 0x21, 0x0b, 0x01, 0x17, 0x0c, 0xf6, 0x1a, 0x0d, 0x06, 0x17, 0x09, 0x0d, 0x1f, 0x0d, 0x01, 0x18, 0x0b, 0x01, 0x05, 0x1b, 0x0d, 0x06, 0x17, 0x0a, 0x0c, 0x20, 0x0c, 0x01, 0x18, 0x0b, 0xea, 0x19, 0x0d, 0x06, 0x17, 0x09, 0x0c, 0x20, 0x0d, 0x01, 0x18, 0x0c, 0x02, 0x20, 0x37, 0x51, 0x3d, 0x4b, 0x47, 0x3c, 0x1a, 0x73, 0x07, 0x2d, 0x38, 0x50, 0x5a, 0x79, 0x39, 0x0e, 0x7a, 0x0c, 0x80, 0x5f, 0x65, 0x22, 0x22, 0x16, 0x10, 0x12, 0x23, 0x2f, 0x32, 0x64, 0x74, 0x1a, 0x1b, 0x30, 0x26, 0x32, 0x01, 0x6a, 0x1f, 0x0c, 0x0f, 0x06, 0x1f, 0x12, 0x07, 0x2c, 0x0e, 0x03, 0x1f, 0x14, 0x08, 0x01, 0x3a, 0x1e, 0x0c, 0x0f, 0x07, 0x1e, 0x13, 0x08, 0x2e, 0x0c, 0x05, 0x1e, 0x14, 0x08, 0x01, 0x34, 0x1f, 0x0c, 0x0e, 0x07, 0x1e, 0x14, 0x07, 0x2e, 0x0c, 0x05, 0x1e, 0x14, 0x08, 0x01, 0x3d, 0x1f, 0x0c, 0x0f, 0x06, 0x1f, 0x12, 0x07, 0x2c, 0x0d, 0x04, 0x1f, 0x14, 0x08, 0xfd, 0x02, 0x1f, 0x0c, 0x0f, 0x06, 0x1f, 0x12, 0x07, 0x2c, 0x0e, 0x03, 0x20, 0x13, 0x08, 0xfe, 0xfc, 0x1f, 0x0c, 0x0e, 0x06, 0x20, 0x12, 0x07, 0x2d, 0x0d, 0x04, 0x1f, 0x13, 0x08, 0x02, 0x07, 0x1e, 0x0c, 0x0f, 0x07, 0x1e, 0x13, 0x07, 0x2d, 0x0c, 0x05, 0x1e, 0x15, 0x07, 0xfa, 0x1e, 0x0c, 0x0f, 0x07, 0x1e, 0x13, 0x07, 0x2d, 0x0c, 0x05, 0x1e, 0x15, 0x07, 0x01, 0x04, 0x20, 0x0c, 0x0e, 0x06, 0x1f, 0x12, 0x08, 0x2d, 0x0d, 0x04, 0x1f, 0x13, 0x09, 0xfb, 0x0c, 0x1e, 0x0c, 0x0f, 0x07, 0x1e, 0x13, 0x08, 0x2e, 0x0c, 0x05, 0x1e, 0x14, 0x08, 0xd3, 0x1e, 0x0c, 0x0e, 0x07, 0x1e, 0x14, 0x07, 0x2e, 0x0c, 0x05, 0x1e, 0x14, 0x07, 0xe7, 0x1f, 0x0c, 0x0e, 0x06, 0x20, 0x12, 0x07, 0x2c, 0x0e, 0x03, 0x20, 0x13, 0x08, 0xca, 0x1f, 0x0c, 0x0e, 0x06, 0x20, 0x12, 0x07, 0x2d, 0x0d, 0x03, 0x20, 0x13, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xff, 0xf7, 0x05, 0xfd, 0x05, 0xc9, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x78, 0x02, 0x1b, 0xa7, 0xa8, 0x02, 0x1b, 0xfe, 0x4c, 0xa7, 0xfe, 0x4a, 0xfe, 0x4b, 0xa6, 0x03, 0x90, 0x02, 0x39, 0xfd, 0xc7, 0xfe, 0x9f, 0xfd, 0xc8, 0x01, 0x60, 0xfe, 0xa0, 0x02, 0x38, 0x00, 0x00, 0x02, 0x00, 0x77, 0xff, 0xf7, 0x05, 0xfd, 0x05, 0xc9, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x37, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x0b, 0x01, 0x21, 0x78, 0x02, 0x1b, 0xa7, 0xa8, 0x02, 0x1b, 0xfe, 0x4c, 0xa7, 0xfe, 0x4a, 0xfe, 0x4b, 0xa6, 0x3d, 0x7e, 0x01, 0x50, 0x01, 0x5a, 0x89, 0x01, 0x67, 0xfe, 0x4b, 0x83, 0x80, 0xfe, 0x49, 0x03, 0x90, 0x02, 0x39, 0xfd, 0xc7, 0xfe, 0x9f, 0xfd, 0xc8, 0x01, 0x60, 0xfe, 0xa0, 0x02, 0x38, 0x15, 0xfe, 0x4e, 0x01, 0x0c, 0xfe, 0xe6, 0x01, 0xc2, 0x01, 0x18, 0x01, 0xb7, 0xfe, 0x49, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x04, 0x03, 0x87, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x01, 0x16, 0x17, 0x14, 0x07, 0x09, 0x01, 0x37, 0x13, 0x25, 0x37, 0x01, 0x26, 0x35, 0x34, 0x37, 0x01, 0x36, 0x03, 0x52, 0x33, 0x02, 0x08, 0xfd, 0xbd, 0x01, 0xbc, 0x4e, 0x22, 0xfe, 0x65, 0xc9, 0xfe, 0x14, 0x11, 0x3b, 0x02, 0x51, 0x09, 0x05, 0xd5, 0x02, 0x36, 0x24, 0x0c, 0xfd, 0x85, 0xfd, 0xf4, 0xe6, 0xfe, 0x38, 0x27, 0x5e, 0x02, 0x34, 0x17, 0x17, 0x1b, 0x3f, 0x02, 0x86, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xd9, 0x00, 0x19, 0x00, 0x00, 0x13, 0x21, 0x32, 0x15, 0x14, 0x07, 0x09, 0x01, 0x37, 0x13, 0x25, 0x37, 0x01, 0x26, 0x35, 0x34, 0x37, 0x01, 0x21, 0x11, 0x06, 0x07, 0x26, 0x27, 0x11, 0x36, 0xd5, 0x04, 0xc2, 0x3a, 0x19, 0xfd, 0xfb, 0x01, 0xb6, 0x50, 0x21, 0xfe, 0x60, 0xd0, 0xfe, 0x24, 0x0e, 0x2f, 0x01, 0xb4, 0xfc, 0x18, 0x01, 0x41, 0x3f, 0x01, 0x01, 0x05, 0xd9, 0x53, 0x22, 0x1b, 0xfd, 0xc5, 0xfe, 0x1b, 0xd5, 0xfe, 0x3d, 0x22, 0x6c, 0x02, 0x16, 0x10, 0x2d, 0x1c, 0x32, 0x01, 0xdf, 0xfa, 0xfc, 0x44, 0x01, 0x01, 0x43, 0x05, 0x5b, 0x39, 0x00, 0x00, 0x00, 0x03, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x20, 0x04, 0x02, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x05, 0xdb, 0xfe, 0x76, 0xfe, 0xe8, 0xfe, 0xea, 0xfe, 0x76, 0xb5, 0x01, 0x44, 0xa7, 0xaa, 0x01, 0x44, 0xb4, 0xfb, 0x00, 0x01, 0x62, 0x01, 0xf8, 0x01, 0x63, 0xa2, 0xfe, 0xdc, 0xfe, 0xce, 0xfe, 0xdd, 0xa2, 0x03, 0x07, 0x62, 0x46, 0x45, 0x63, 0x2d, 0x51, 0x54, 0x52, 0x2c, 0x02, 0xec, 0xfe, 0xc9, 0xfe, 0x4b, 0x01, 0xb5, 0x01, 0x37, 0xc2, 0x01, 0x69, 0xc1, 0xc1, 0xfe, 0x99, 0xc4, 0xfe, 0xe8, 0xfe, 0x77, 0x01, 0x89, 0x01, 0x18, 0xb1, 0x01, 0x42, 0xae, 0xae, 0xfe, 0xbe, 0xb1, 0x4e, 0x6d, 0x6d, 0x4e, 0x31, 0x5a, 0x30, 0x30, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x00, 0x00, 0x05, 0xf6, 0x05, 0xd1, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x43, 0x00, 0x00, 0x00, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x25, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x25, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x24, 0x20, 0x04, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x10, 0x37, 0x36, 0x37, 0x26, 0x35, 0x34, 0x00, 0x21, 0x20, 0x00, 0x15, 0x14, 0x05, 0x1f, 0x85, 0x5d, 0x5d, 0x43, 0x41, 0x5e, 0xfc, 0x0c, 0x41, 0x5e, 0x5e, 0x41, 0x43, 0x5d, 0x5d, 0x03, 0xae, 0x17, 0x14, 0x52, 0xa4, 0x75, 0x74, 0xa4, 0x51, 0x49, 0x64, 0x6d, 0xfe, 0xd2, 0xfe, 0x50, 0xfe, 0xd2, 0x6d, 0x71, 0x4e, 0x51, 0xa4, 0x75, 0x73, 0xa5, 0x52, 0x11, 0x11, 0x6e, 0x01, 0x93, 0x01, 0x21, 0x01, 0x24, 0x01, 0x93, 0x01, 0xe9, 0x67, 0x4a, 0x49, 0x67, 0x67, 0x49, 0x4a, 0x67, 0x67, 0x4a, 0x49, 0x68, 0x68, 0x49, 0x4a, 0x67, 0x55, 0x11, 0x16, 0x5c, 0x82, 0x81, 0xb7, 0xb7, 0x81, 0x82, 0x5c, 0x51, 0x09, 0x73, 0x99, 0xb4, 0xfd, 0xfd, 0xb4, 0x99, 0x72, 0x04, 0x57, 0x5c, 0xfe, 0xfc, 0xb7, 0xb7, 0x01, 0x04, 0x5c, 0x11, 0x0f, 0x8e, 0xb6, 0xf8, 0x01, 0x5e, 0xfe, 0xa2, 0xf8, 0xb1, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x00, 0x00, 0x05, 0xf6, 0x05, 0xc9, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x41, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x14, 0x00, 0x21, 0x20, 0x00, 0x35, 0x34, 0x37, 0x26, 0x27, 0x26, 0x10, 0x36, 0x33, 0x32, 0x16, 0x10, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x04, 0x20, 0x24, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x10, 0x36, 0x33, 0x32, 0x16, 0x10, 0x07, 0x06, 0x07, 0x16, 0x05, 0x7c, 0x5e, 0x41, 0x43, 0x5d, 0x5d, 0x85, 0x5d, 0xfc, 0xac, 0x5d, 0x43, 0x41, 0x5e, 0x5e, 0x41, 0x43, 0x5d, 0x03, 0xb9, 0xfe, 0x6d, 0xfe, 0xdc, 0xfe, 0xdf, 0xfe, 0x6d, 0x6e, 0x11, 0x11, 0x52, 0xa5, 0x73, 0x75, 0xa4, 0x51, 0x4e, 0x71, 0x6d, 0x01, 0x2e, 0x01, 0xb0, 0x01, 0x2e, 0x6d, 0x64, 0x49, 0x51, 0xa4, 0x74, 0x75, 0xa4, 0x52, 0x14, 0x17, 0x68, 0x04, 0x91, 0x49, 0x68, 0x68, 0x49, 0x4a, 0x67, 0x67, 0x4a, 0x4a, 0x67, 0x67, 0x4a, 0x49, 0x67, 0x67, 0xfe, 0x0c, 0xf7, 0xfe, 0xa3, 0x01, 0x5d, 0xf7, 0xb4, 0x8d, 0x0f, 0x12, 0x5b, 0x01, 0x02, 0xb6, 0xb6, 0xfe, 0xfe, 0x5b, 0x58, 0x03, 0x72, 0x97, 0xb4, 0xfb, 0xfb, 0xb4, 0x98, 0x71, 0x09, 0x51, 0x5c, 0x01, 0x02, 0xb6, 0xb6, 0xfe, 0xfe, 0x5c, 0x16, 0x11, 0x8b, 0x00, 0x00, 0x02, 0x00, 0x70, 0xff, 0xfd, 0x04, 0x65, 0x05, 0xc6, 0x00, 0x0b, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x37, 0x16, 0x17, 0x16, 0x10, 0x00, 0x23, 0x22, 0x00, 0x10, 0x00, 0x33, 0x32, 0x17, 0x13, 0x17, 0x02, 0x45, 0x80, 0xb5, 0xb5, 0x80, 0x80, 0xb5, 0xb3, 0xab, 0x11, 0x10, 0x89, 0xfe, 0xed, 0xc4, 0xc1, 0xfe, 0xec, 0x01, 0x11, 0xc4, 0x57, 0x4b, 0xf3, 0x8b, 0x03, 0x5f, 0xc8, 0x90, 0x8e, 0xc9, 0xc9, 0x8e, 0x90, 0xc8, 0x3b, 0x10, 0x13, 0x99, 0xfe, 0x50, 0xfe, 0xcf, 0x01, 0x31, 0x01, 0xb0, 0x01, 0x32, 0x1d, 0x01, 0xd3, 0x59, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x00, 0x01, 0x06, 0xdb, 0x05, 0xc9, 0x00, 0x08, 0x00, 0x11, 0x00, 0x31, 0x00, 0x00, 0x01, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x00, 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x36, 0x34, 0x01, 0x16, 0x15, 0x14, 0x02, 0x23, 0x22, 0x02, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x26, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0xfb, 0x6c, 0x98, 0x98, 0xd8, 0x98, 0x97, 0x03, 0x54, 0xda, 0x97, 0x97, 0x6d, 0x6c, 0x98, 0xfd, 0x11, 0x23, 0xe8, 0xa4, 0xa3, 0xe8, 0xe6, 0xa5, 0xa6, 0x73, 0x02, 0x02, 0xc6, 0x19, 0xe5, 0xa5, 0xa6, 0xe6, 0xe7, 0xa5, 0xa3, 0x74, 0x0a, 0x0a, 0x02, 0xda, 0xa9, 0xf0, 0xa9, 0xa9, 0xf0, 0xa9, 0x02, 0x5a, 0xa9, 0xf0, 0xa9, 0xa9, 0xf0, 0xfd, 0xe4, 0x54, 0x64, 0xb5, 0xfe, 0xff, 0x01, 0x01, 0xb5, 0xb7, 0x01, 0x01, 0x80, 0x03, 0x02, 0x89, 0x49, 0x55, 0xb7, 0x01, 0x01, 0xfe, 0xff, 0xb7, 0xb5, 0xfe, 0xff, 0x81, 0x0b, 0x0c, 0x00, 0x00, 0x0e, 0x00, 0x7e, 0x00, 0x00, 0x08, 0x7a, 0x05, 0xd5, 0x00, 0x23, 0x00, 0x35, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x59, 0x00, 0x65, 0x00, 0x72, 0x00, 0x80, 0x00, 0x8d, 0x00, 0x9a, 0x00, 0xa7, 0x00, 0xb5, 0x00, 0xc5, 0x00, 0xd9, 0x00, 0x00, 0x01, 0x33, 0x04, 0x17, 0x16, 0x15, 0x06, 0x23, 0x22, 0x27, 0x25, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x21, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x05, 0x06, 0x23, 0x22, 0x27, 0x34, 0x37, 0x36, 0x01, 0x35, 0x33, 0x15, 0x14, 0x17, 0x16, 0x19, 0x01, 0x21, 0x11, 0x10, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x03, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x02, 0x16, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x36, 0x37, 0x36, 0x33, 0x32, 0x01, 0x16, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x36, 0x37, 0x36, 0x16, 0x01, 0x1e, 0x01, 0x0e, 0x01, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x04, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x24, 0x36, 0x16, 0x17, 0x16, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x35, 0x34, 0x25, 0x36, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x36, 0x01, 0x3e, 0x01, 0x17, 0x1e, 0x01, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x04, 0x78, 0x08, 0x02, 0x1f, 0xe7, 0xf4, 0x20, 0x5d, 0x06, 0x06, 0xfe, 0x92, 0x36, 0x0b, 0x3d, 0x1f, 0xfc, 0x0d, 0x1f, 0x3d, 0x0b, 0x37, 0xfe, 0x92, 0x07, 0x05, 0x5c, 0x21, 0xf5, 0xe6, 0x02, 0xf8, 0x81, 0xd9, 0xd0, 0xfa, 0x02, 0xd1, 0xd8, 0x82, 0x9a, 0xd4, 0x95, 0x97, 0xd3, 0xd2, 0x98, 0x96, 0xd3, 0x02, 0x34, 0x76, 0x55, 0x54, 0x76, 0x76, 0x54, 0x55, 0x76, 0x90, 0x1c, 0x16, 0x15, 0x1d, 0x1d, 0x15, 0x16, 0x1c, 0x1c, 0x16, 0x15, 0x1d, 0x1d, 0x15, 0x16, 0x1c, 0xbc, 0x18, 0x06, 0x11, 0x11, 0x29, 0x0d, 0x0c, 0x07, 0x11, 0x0d, 0x10, 0x04, 0x01, 0x72, 0x0d, 0x06, 0x12, 0x0d, 0x10, 0x04, 0x18, 0x0e, 0x0c, 0x07, 0x11, 0x11, 0x29, 0xfe, 0x3e, 0x16, 0x12, 0x0d, 0x26, 0x13, 0x14, 0x10, 0x02, 0x08, 0x25, 0x02, 0x1c, 0x27, 0x0f, 0x02, 0x08, 0x24, 0x14, 0x14, 0x13, 0x06, 0x08, 0xfd, 0xea, 0x27, 0x26, 0x07, 0x06, 0x12, 0x14, 0x15, 0x25, 0x08, 0x02, 0x02, 0x3f, 0x14, 0x24, 0x08, 0x02, 0x0f, 0x14, 0x13, 0x27, 0x06, 0x06, 0x13, 0xfe, 0x46, 0x0d, 0x29, 0x11, 0x11, 0x08, 0x0e, 0x0c, 0x19, 0x04, 0x10, 0x0d, 0x11, 0x05, 0x01, 0x57, 0x0e, 0x18, 0x04, 0x10, 0x0d, 0x12, 0x04, 0x0b, 0x0c, 0x18, 0x05, 0x10, 0x0d, 0x11, 0x04, 0x05, 0xd5, 0x11, 0x9b, 0xa4, 0xaa, 0x99, 0x01, 0x8c, 0x12, 0x2b, 0x13, 0x19, 0x47, 0x20, 0x17, 0x03, 0x03, 0x17, 0x20, 0x47, 0x18, 0x14, 0x2b, 0x12, 0x8c, 0x01, 0x99, 0xaa, 0xa4, 0x99, 0xfe, 0x76, 0x4b, 0x98, 0x4b, 0x39, 0x5f, 0xfe, 0xe2, 0xfe, 0x16, 0x01, 0xea, 0x01, 0x1e, 0x5f, 0x39, 0x4b, 0x98, 0x4b, 0xfd, 0xdd, 0xa7, 0xea, 0xea, 0xa7, 0xa6, 0xec, 0xec, 0xa5, 0x5d, 0x84, 0x84, 0x5d, 0x5f, 0x83, 0x83, 0xde, 0x16, 0x22, 0x22, 0x16, 0x18, 0x22, 0x22, 0xfd, 0x73, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0x22, 0x02, 0x57, 0x26, 0x2e, 0x0d, 0x0f, 0x07, 0x13, 0x14, 0x2d, 0x0f, 0x0a, 0xfd, 0xec, 0x13, 0x2e, 0x0f, 0x0a, 0x04, 0x14, 0x13, 0x2d, 0x0e, 0x0d, 0x06, 0x01, 0x61, 0x08, 0x29, 0x2c, 0x15, 0x06, 0x07, 0x22, 0x0d, 0x09, 0x09, 0x16, 0x15, 0xc3, 0x0e, 0x22, 0x0d, 0x08, 0x09, 0x16, 0x15, 0x08, 0x07, 0x29, 0x17, 0x16, 0x06, 0x0e, 0x14, 0x16, 0x18, 0x29, 0x08, 0x06, 0x15, 0x16, 0x09, 0x08, 0x0d, 0xec, 0x07, 0x15, 0x16, 0x09, 0x08, 0x0d, 0x21, 0x08, 0x07, 0x15, 0x16, 0x16, 0x29, 0xfe, 0x94, 0x12, 0x07, 0x0d, 0x0e, 0x2f, 0x11, 0x14, 0x04, 0x0a, 0x0f, 0x1c, 0x05, 0x11, 0x02, 0x0c, 0x13, 0x04, 0x0a, 0x0f, 0x1b, 0x04, 0x12, 0x10, 0x13, 0x04, 0x0c, 0x0d, 0x1c, 0x05, 0x11, 0x00, 0x10, 0x00, 0x82, 0x00, 0x00, 0x08, 0x7f, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x59, 0x00, 0x64, 0x00, 0x70, 0x00, 0x7c, 0x00, 0x88, 0x00, 0x94, 0x00, 0xa6, 0x00, 0xca, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x35, 0x23, 0x15, 0x06, 0x07, 0x06, 0x15, 0x11, 0x21, 0x11, 0x34, 0x27, 0x26, 0x27, 0x35, 0x23, 0x15, 0x07, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x16, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x02, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x02, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x03, 0x0e, 0x01, 0x17, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x01, 0x0e, 0x01, 0x17, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x01, 0x06, 0x16, 0x17, 0x16, 0x36, 0x37, 0x36, 0x26, 0x27, 0x26, 0x06, 0x05, 0x06, 0x16, 0x17, 0x16, 0x3e, 0x01, 0x26, 0x27, 0x26, 0x06, 0x05, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x07, 0x0e, 0x01, 0x25, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x07, 0x0e, 0x01, 0x01, 0x16, 0x36, 0x37, 0x36, 0x26, 0x27, 0x26, 0x06, 0x07, 0x06, 0x16, 0x01, 0x16, 0x36, 0x37, 0x36, 0x26, 0x27, 0x26, 0x06, 0x07, 0x06, 0x16, 0x13, 0x35, 0x33, 0x15, 0x14, 0x17, 0x16, 0x19, 0x01, 0x21, 0x11, 0x10, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x25, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x05, 0x23, 0x22, 0x27, 0x36, 0x37, 0x36, 0x25, 0x16, 0x32, 0x37, 0x04, 0x17, 0x16, 0x17, 0x06, 0x2b, 0x01, 0x25, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x15, 0x14, 0x07, 0x06, 0x15, 0x14, 0x17, 0x05, 0x16, 0x33, 0x32, 0x37, 0x26, 0x27, 0x24, 0x25, 0x27, 0x15, 0x23, 0x04, 0x05, 0x06, 0x07, 0x16, 0x33, 0x32, 0x37, 0x25, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x03, 0x88, 0x2c, 0x0e, 0xb7, 0xaf, 0x05, 0x0d, 0xb0, 0xb6, 0x07, 0x33, 0xeb, 0x95, 0xce, 0xcf, 0x94, 0x93, 0xd0, 0xcf, 0xe6, 0xa5, 0x74, 0x74, 0xa5, 0x74, 0xa9, 0x29, 0x1d, 0x1d, 0x29, 0x1d, 0x1d, 0x29, 0x1d, 0x1d, 0x29, 0x1d, 0xf3, 0x10, 0x07, 0x0b, 0x0e, 0x28, 0x11, 0x11, 0x05, 0x0c, 0x0b, 0x29, 0x01, 0x37, 0x11, 0x07, 0x0c, 0x0d, 0x28, 0x11, 0x11, 0x06, 0x0c, 0x0c, 0x28, 0xfe, 0x2f, 0x06, 0x14, 0x13, 0x14, 0x24, 0x07, 0x06, 0x12, 0x15, 0x14, 0x24, 0x02, 0x0c, 0x06, 0x12, 0x14, 0x13, 0x25, 0x0c, 0x12, 0x14, 0x12, 0x25, 0xfd, 0xe6, 0x07, 0x24, 0x15, 0x14, 0x12, 0x06, 0x07, 0x24, 0x14, 0x13, 0x14, 0x02, 0x19, 0x06, 0x26, 0x12, 0x14, 0x12, 0x06, 0x06, 0x25, 0x13, 0x14, 0x12, 0xfe, 0x6b, 0x11, 0x29, 0x0b, 0x0e, 0x07, 0x11, 0x11, 0x28, 0x0e, 0x0b, 0x07, 0x01, 0x58, 0x11, 0x28, 0x0c, 0x0c, 0x06, 0x11, 0x11, 0x28, 0x0d, 0x0c, 0x07, 0x4d, 0x79, 0xca, 0xc2, 0xfa, 0x68, 0xc3, 0xca, 0x79, 0xfe, 0xcb, 0x17, 0x43, 0x1a, 0x35, 0xfe, 0xaf, 0x09, 0x6d, 0x3b, 0x0c, 0xdf, 0xe0, 0x02, 0x09, 0x15, 0x2b, 0x16, 0x02, 0x08, 0xe0, 0xdf, 0x0b, 0x3a, 0x6c, 0x09, 0xfe, 0xae, 0x35, 0x1a, 0x43, 0x17, 0x17, 0x23, 0x30, 0x1c, 0x1c, 0x01, 0x25, 0x0d, 0x0e, 0x42, 0x38, 0x09, 0xd4, 0xfe, 0xe6, 0xfe, 0x54, 0x2b, 0x31, 0xfe, 0x53, 0xfe, 0xe6, 0xd4, 0x08, 0x37, 0x43, 0x0d, 0x0e, 0x01, 0x25, 0x1c, 0x1c, 0x30, 0x22, 0x03, 0xc2, 0x40, 0x8e, 0x40, 0x31, 0x41, 0xf1, 0xfe, 0x65, 0x01, 0x9b, 0xf1, 0x41, 0x31, 0x40, 0x8e, 0x40, 0x48, 0xe7, 0xa3, 0xa4, 0xe6, 0xe6, 0xa4, 0xa3, 0xe7, 0xad, 0x81, 0xb8, 0x80, 0x80, 0xb8, 0x01, 0x14, 0x20, 0x2e, 0x20, 0x20, 0x2e, 0xfd, 0xb5, 0x20, 0x2e, 0x20, 0x20, 0x2e, 0x02, 0x45, 0x0d, 0x2d, 0x13, 0x12, 0x08, 0x0d, 0x0f, 0x2d, 0x13, 0x11, 0x07, 0xfd, 0xff, 0x0e, 0x2d, 0x13, 0x13, 0x07, 0x0f, 0x0d, 0x2c, 0x13, 0x13, 0x07, 0x01, 0x31, 0x16, 0x29, 0x07, 0x07, 0x14, 0x17, 0x16, 0x29, 0x07, 0x07, 0x16, 0xd5, 0x15, 0x29, 0x07, 0x07, 0x15, 0x2c, 0x28, 0x08, 0x07, 0x14, 0x39, 0x17, 0x14, 0x07, 0x07, 0x29, 0x15, 0x16, 0x16, 0x07, 0x08, 0x28, 0xa9, 0x15, 0x16, 0x07, 0x07, 0x29, 0x16, 0x15, 0x16, 0x07, 0x07, 0x29, 0xfe, 0x75, 0x0f, 0x07, 0x13, 0x13, 0x2d, 0x0d, 0x0e, 0x07, 0x13, 0x13, 0x2c, 0x01, 0xe6, 0x0d, 0x08, 0x12, 0x13, 0x2d, 0x0d, 0x0f, 0x08, 0x12, 0x13, 0x2d, 0x01, 0x20, 0x47, 0x9c, 0x37, 0x37, 0x57, 0xfe, 0xf5, 0xfe, 0x36, 0x01, 0xca, 0x01, 0x0b, 0x57, 0x37, 0x37, 0x9c, 0x47, 0xe5, 0x06, 0x12, 0x20, 0x44, 0x26, 0x1a, 0x26, 0x0b, 0xa5, 0xcb, 0xc7, 0x65, 0x8b, 0x11, 0x01, 0x01, 0x11, 0x8b, 0x65, 0xc7, 0xcb, 0xa5, 0x0b, 0x26, 0x1a, 0x26, 0x44, 0x20, 0x12, 0x06, 0x1c, 0x12, 0x22, 0x28, 0x3d, 0x16, 0x15, 0x14, 0x13, 0x88, 0x06, 0x97, 0x9d, 0x70, 0x81, 0x19, 0x01, 0x01, 0x19, 0x81, 0x70, 0x9d, 0x97, 0x06, 0x88, 0x13, 0x14, 0x15, 0x16, 0x3d, 0x28, 0x22, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa5, 0x00, 0x00, 0x05, 0xd0, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x17, 0x11, 0x07, 0x21, 0x27, 0x11, 0x17, 0x11, 0x21, 0x11, 0xab, 0x05, 0x1e, 0x07, 0x07, 0xfa, 0xe2, 0x05, 0x63, 0x04, 0x63, 0x05, 0xd5, 0x07, 0xfa, 0x38, 0x06, 0x06, 0x05, 0xc8, 0x68, 0xfb, 0x08, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa4, 0x00, 0x00, 0x05, 0xd1, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x00, 0x13, 0x21, 0x17, 0x11, 0x07, 0x21, 0x27, 0x11, 0x17, 0x11, 0x21, 0x11, 0x07, 0x15, 0x06, 0x07, 0x00, 0x03, 0x06, 0x23, 0x06, 0x23, 0x02, 0x2b, 0x01, 0x35, 0x37, 0x32, 0x17, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0xaa, 0x05, 0x21, 0x06, 0x06, 0xfa, 0xdf, 0x05, 0x64, 0x04, 0x63, 0x7a, 0x44, 0x25, 0xfe, 0xda, 0x38, 0x05, 0x0f, 0x69, 0x0c, 0x5b, 0xb8, 0x15, 0x92, 0x88, 0x41, 0x06, 0x2e, 0x38, 0x59, 0x8b, 0x57, 0x05, 0xd5, 0x06, 0xfa, 0x38, 0x07, 0x07, 0x05, 0xc8, 0x68, 0xfb, 0x08, 0x04, 0xf8, 0x9e, 0x06, 0x41, 0x3a, 0xfe, 0x46, 0xfe, 0xbd, 0x3b, 0x2f, 0x01, 0x02, 0x07, 0x49, 0x83, 0xa6, 0x74, 0xb3, 0xbb, 0x78, 0x00, 0x03, 0x00, 0xa4, 0x00, 0x00, 0x05, 0xd1, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x00, 0x13, 0x21, 0x17, 0x11, 0x07, 0x21, 0x27, 0x11, 0x17, 0x11, 0x21, 0x11, 0x05, 0x09, 0x01, 0x17, 0x09, 0x01, 0x15, 0x07, 0x01, 0x23, 0x01, 0x23, 0x27, 0x09, 0x01, 0xaa, 0x05, 0x21, 0x06, 0x06, 0xfa, 0xdf, 0x05, 0x64, 0x04, 0x63, 0xfc, 0x5e, 0x01, 0x72, 0x01, 0x6e, 0x56, 0xfe, 0x91, 0x01, 0x6f, 0x52, 0xfe, 0x8e, 0x04, 0xfe, 0x92, 0x04, 0x51, 0x01, 0x6e, 0xfe, 0x92, 0x05, 0xd5, 0x06, 0xfa, 0x38, 0x07, 0x07, 0x05, 0xc8, 0x68, 0xfb, 0x08, 0x04, 0xf8, 0x86, 0xfe, 0x69, 0x01, 0x97, 0x5b, 0xfe, 0x65, 0xfe, 0x66, 0x03, 0x5b, 0x01, 0x97, 0xfe, 0x6c, 0x5b, 0x01, 0x9a, 0x01, 0x9b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, 0x00, 0xa0, 0x03, 0x4a, 0x05, 0x40, 0x00, 0x14, 0x00, 0x00, 0x13, 0x33, 0x01, 0x36, 0x13, 0x32, 0x37, 0x33, 0x17, 0x09, 0x01, 0x15, 0x07, 0x01, 0x23, 0x01, 0x23, 0x27, 0x01, 0x00, 0x35, 0xd9, 0x04, 0x01, 0x0c, 0x0a, 0xfd, 0x04, 0x05, 0x04, 0x4d, 0xfe, 0xf0, 0x01, 0x10, 0x4f, 0xfe, 0xf2, 0x02, 0xfe, 0xf1, 0x03, 0x4e, 0x01, 0x12, 0xfe, 0xee, 0x05, 0x40, 0xfe, 0x0b, 0x08, 0x01, 0xde, 0x0f, 0x55, 0xfe, 0x04, 0xfe, 0x07, 0x03, 0x53, 0x01, 0xf7, 0xfe, 0x0b, 0x56, 0x01, 0xf9, 0x01, 0xf5, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x5a, 0x00, 0x00, 0x06, 0x43, 0x07, 0x76, 0x00, 0x08, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x01, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x01, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x25, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x17, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x01, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x05, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x17, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x25, 0x33, 0x17, 0x15, 0x33, 0x20, 0x13, 0x16, 0x1d, 0x01, 0x23, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x15, 0x14, 0x07, 0x27, 0x26, 0x23, 0x11, 0x14, 0x0f, 0x01, 0x22, 0x2f, 0x01, 0x35, 0x37, 0x33, 0x17, 0x15, 0x16, 0x3b, 0x01, 0x32, 0x3f, 0x01, 0x11, 0x22, 0x07, 0x06, 0x23, 0x27, 0x35, 0x37, 0x23, 0x26, 0x27, 0x23, 0x22, 0x0f, 0x01, 0x23, 0x35, 0x36, 0x37, 0x36, 0x21, 0x35, 0x01, 0xa7, 0x03, 0x1b, 0x53, 0x06, 0x34, 0x02, 0x1a, 0x02, 0x1a, 0x53, 0x06, 0x33, 0x01, 0xe8, 0x02, 0x1b, 0x53, 0x05, 0x34, 0xde, 0x04, 0x1b, 0x53, 0x05, 0x35, 0x01, 0xe8, 0x03, 0x1a, 0x54, 0x05, 0x35, 0x01, 0x09, 0x02, 0x19, 0x54, 0x06, 0x34, 0x52, 0x03, 0x1b, 0x53, 0x05, 0x34, 0xfd, 0xe6, 0x34, 0x06, 0x02, 0x01, 0x8c, 0xfc, 0x26, 0x01, 0x14, 0x11, 0x20, 0x33, 0x28, 0x87, 0x64, 0x08, 0x1d, 0x88, 0x7b, 0x5f, 0x1b, 0x52, 0x21, 0x02, 0x05, 0x27, 0x05, 0x09, 0x38, 0x09, 0x32, 0x12, 0x05, 0xbe, 0x4d, 0x10, 0x0c, 0x06, 0x06, 0x04, 0x3c, 0xb1, 0x3d, 0x59, 0x1e, 0x12, 0x03, 0x34, 0xad, 0xd7, 0x01, 0x19, 0x06, 0x01, 0xcf, 0x0a, 0x23, 0x02, 0x38, 0x01, 0x64, 0xcf, 0x08, 0x23, 0x03, 0x37, 0xe3, 0xcf, 0x08, 0x24, 0x03, 0x36, 0xb9, 0xcf, 0x08, 0x24, 0x02, 0x38, 0x01, 0x3b, 0xce, 0x07, 0x24, 0x03, 0x37, 0x69, 0xcf, 0x07, 0x24, 0x03, 0x37, 0xeb, 0xcf, 0x09, 0x23, 0x02, 0x39, 0x9a, 0x05, 0x70, 0xfe, 0x50, 0x4c, 0x0c, 0x07, 0x0d, 0x29, 0x16, 0x5a, 0x2e, 0x0d, 0x02, 0x3b, 0x36, 0xfd, 0x9f, 0x5a, 0x15, 0x02, 0x56, 0x18, 0x17, 0x06, 0x06, 0x0a, 0x5a, 0x33, 0x25, 0x02, 0x59, 0x36, 0x33, 0x05, 0x0b, 0x2e, 0x38, 0x19, 0x37, 0x10, 0x02, 0x80, 0xc2, 0xc6, 0x70, 0x00, 0x09, 0x00, 0x88, 0x00, 0x00, 0x05, 0xeb, 0x05, 0xd9, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x33, 0x00, 0x44, 0x00, 0x4d, 0x00, 0x79, 0x00, 0x7f, 0x00, 0x8f, 0x00, 0x00, 0x01, 0x14, 0x15, 0x14, 0x17, 0x21, 0x36, 0x37, 0x34, 0x23, 0x21, 0x06, 0x13, 0x16, 0x17, 0x21, 0x36, 0x3f, 0x01, 0x06, 0x07, 0x36, 0x37, 0x36, 0x35, 0x34, 0x35, 0x26, 0x23, 0x27, 0x06, 0x07, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x01, 0x33, 0x14, 0x06, 0x07, 0x14, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x27, 0x34, 0x35, 0x34, 0x36, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x16, 0x05, 0x36, 0x37, 0x32, 0x17, 0x15, 0x14, 0x05, 0x07, 0x17, 0x14, 0x07, 0x21, 0x26, 0x3d, 0x01, 0x37, 0x35, 0x24, 0x2f, 0x01, 0x35, 0x36, 0x33, 0x16, 0x17, 0x26, 0x11, 0x34, 0x33, 0x21, 0x16, 0x15, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x27, 0x01, 0x16, 0x17, 0x21, 0x36, 0x37, 0x01, 0x06, 0x07, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x35, 0x33, 0x1e, 0x01, 0x15, 0x01, 0x06, 0x0d, 0x04, 0x0e, 0x0a, 0x03, 0x1b, 0xfc, 0x10, 0x19, 0x38, 0x05, 0x0e, 0x03, 0x8f, 0x0c, 0x08, 0x41, 0x08, 0x34, 0x4e, 0x2c, 0x1a, 0x01, 0x1d, 0x33, 0x02, 0x01, 0x31, 0x35, 0x3e, 0x28, 0x49, 0x1d, 0x2d, 0x07, 0x34, 0x22, 0x11, 0x61, 0x31, 0x1a, 0x16, 0x6c, 0xfd, 0x78, 0x08, 0x58, 0x01, 0x7a, 0x04, 0x08, 0x11, 0x62, 0x1e, 0x08, 0x63, 0xfe, 0xf9, 0xa5, 0xaa, 0x9d, 0x9f, 0x1f, 0x53, 0xfc, 0x9e, 0x21, 0x02, 0xf2, 0xe4, 0x5c, 0x10, 0x06, 0xfe, 0xbc, 0x71, 0x02, 0x0f, 0xfe, 0x26, 0x0f, 0x03, 0xfe, 0x8e, 0x2c, 0x03, 0x03, 0x11, 0x4c, 0xc1, 0xb5, 0x30, 0x03, 0xf7, 0x1d, 0x31, 0x81, 0x4e, 0x1f, 0x65, 0x30, 0x3c, 0x06, 0x10, 0xfc, 0x8d, 0x06, 0x09, 0x03, 0xd6, 0x0a, 0x03, 0xfe, 0xbc, 0x05, 0x11, 0x39, 0x0a, 0x05, 0x02, 0x48, 0x33, 0x05, 0x09, 0x39, 0x02, 0xb4, 0x06, 0x07, 0x37, 0x48, 0x34, 0x58, 0x16, 0x04, 0xfe, 0xcd, 0x1a, 0x12, 0x16, 0x16, 0xc7, 0x6d, 0x86, 0x01, 0x4d, 0x37, 0x52, 0x06, 0x05, 0x11, 0x56, 0x1c, 0x20, 0x2f, 0x82, 0x4d, 0x28, 0x01, 0x3d, 0x48, 0x3a, 0x0d, 0x1f, 0x2c, 0x71, 0x4c, 0x55, 0x44, 0x03, 0x29, 0x38, 0x88, 0x57, 0x71, 0x6b, 0xb1, 0x92, 0x65, 0x2d, 0x50, 0x05, 0x06, 0x65, 0x78, 0xfa, 0xf3, 0x0d, 0x0b, 0x10, 0x97, 0x4e, 0x57, 0x18, 0x0a, 0x0a, 0x0a, 0x10, 0x3d, 0x24, 0x0a, 0x0f, 0x08, 0x07, 0x10, 0x06, 0x02, 0x02, 0x55, 0x12, 0x0d, 0x04, 0x0b, 0x09, 0x14, 0xfe, 0x01, 0x2f, 0x30, 0x02, 0x18, 0x63, 0x9b, 0x99, 0x29, 0x16, 0x48, 0x04, 0x01, 0x3f, 0x1a, 0x12, 0x13, 0x19, 0x01, 0xf5, 0x32, 0x1c, 0x40, 0x5b, 0x6e, 0x44, 0x46, 0x38, 0x54, 0x24, 0x2e, 0x4a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9a, 0x00, 0x01, 0x05, 0xdb, 0x05, 0xd9, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x00, 0x09, 0x01, 0x13, 0x07, 0x21, 0x27, 0x13, 0x09, 0x01, 0x03, 0x21, 0x03, 0x01, 0x03, 0x41, 0x02, 0x4e, 0x4b, 0x02, 0xfa, 0xc8, 0x05, 0x4f, 0x02, 0x55, 0xfe, 0x05, 0x44, 0x04, 0x75, 0x40, 0xfe, 0x07, 0x05, 0xd9, 0xfe, 0x77, 0xfb, 0xb4, 0x03, 0x06, 0x04, 0x4c, 0x01, 0x86, 0xfe, 0x35, 0xfc, 0x5f, 0x03, 0xa1, 0x01, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9a, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xd0, 0x00, 0x09, 0x00, 0x00, 0x09, 0x01, 0x13, 0x17, 0x07, 0x21, 0x27, 0x13, 0x00, 0x37, 0x03, 0x3f, 0x02, 0x4b, 0x4e, 0x02, 0x02, 0xfa, 0xc8, 0x05, 0x51, 0x02, 0x3e, 0x12, 0x05, 0xd0, 0xfe, 0x77, 0xfb, 0xbf, 0x03, 0x03, 0x06, 0x04, 0x44, 0x01, 0x80, 0x06, 0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x05, 0xe6, 0x05, 0xd4, 0x00, 0x53, 0x00, 0x00, 0x01, 0x03, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x32, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x03, 0x25, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x03, 0x16, 0x15, 0x10, 0x07, 0x23, 0x36, 0x11, 0x34, 0x27, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x03, 0x1f, 0xc2, 0x43, 0x4f, 0x22, 0x22, 0x4f, 0x3b, 0x27, 0x3c, 0x34, 0x53, 0x32, 0x0c, 0x52, 0xb3, 0x01, 0x24, 0x46, 0x40, 0x34, 0x2f, 0x20, 0x1f, 0x3f, 0x06, 0x10, 0x61, 0x21, 0x0b, 0x0a, 0x1e, 0x33, 0x39, 0x1e, 0x20, 0x5f, 0x44, 0xbb, 0x08, 0x64, 0x56, 0x84, 0x07, 0xb9, 0x46, 0x5e, 0x20, 0x1e, 0x39, 0x32, 0x1f, 0x0b, 0x09, 0x21, 0x61, 0x11, 0x06, 0x3f, 0x20, 0x1f, 0x30, 0x32, 0x41, 0x46, 0x03, 0x08, 0x01, 0x34, 0x68, 0x6f, 0x6b, 0x40, 0x16, 0x52, 0x52, 0x72, 0x2a, 0x25, 0x7f, 0x74, 0xfe, 0xeb, 0x65, 0x1c, 0x11, 0x0c, 0x1b, 0x42, 0x42, 0x15, 0x15, 0x39, 0x27, 0x1d, 0x11, 0x37, 0x2a, 0x1f, 0x24, 0x25, 0x1b, 0x29, 0x0c, 0x22, 0x66, 0x01, 0x16, 0x58, 0x53, 0xfe, 0xdd, 0xe7, 0xf2, 0x01, 0x35, 0x45, 0x49, 0xfe, 0xea, 0x66, 0x22, 0x0c, 0x29, 0x1b, 0x25, 0x23, 0x1e, 0x2c, 0x37, 0x11, 0x1d, 0x27, 0x39, 0x15, 0x14, 0x43, 0x42, 0x1b, 0x0c, 0x11, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x01, 0x1e, 0x05, 0xdb, 0x04, 0x98, 0x00, 0x3e, 0x00, 0x45, 0x00, 0x00, 0x01, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x16, 0x13, 0x33, 0x17, 0x07, 0x23, 0x06, 0x07, 0x22, 0x27, 0x34, 0x33, 0x16, 0x33, 0x32, 0x33, 0x32, 0x37, 0x26, 0x27, 0x23, 0x22, 0x07, 0x16, 0x15, 0x06, 0x05, 0x24, 0x03, 0x34, 0x37, 0x16, 0x17, 0x15, 0x07, 0x14, 0x17, 0x32, 0x37, 0x12, 0x25, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x36, 0x37, 0x32, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x03, 0x06, 0x15, 0x14, 0x17, 0x35, 0x26, 0x05, 0x16, 0x64, 0x12, 0x42, 0x9f, 0x12, 0xe7, 0x31, 0x18, 0x11, 0x29, 0x03, 0x0f, 0x89, 0x58, 0x16, 0x12, 0x0e, 0x33, 0x02, 0x01, 0x45, 0x0c, 0xec, 0x06, 0x03, 0x76, 0x3d, 0x79, 0x08, 0xfe, 0xd3, 0xfd, 0xd7, 0x28, 0x3b, 0x2e, 0x07, 0x0b, 0x65, 0x50, 0x0c, 0x30, 0x01, 0x0c, 0xb0, 0x25, 0x53, 0x5a, 0x37, 0x41, 0x46, 0x34, 0x22, 0x79, 0x01, 0xce, 0x1d, 0x04, 0x98, 0x05, 0x73, 0x57, 0x19, 0x24, 0x2c, 0x1b, 0xfe, 0xf0, 0x4a, 0x0d, 0xae, 0x09, 0x5d, 0x54, 0x2d, 0x4d, 0x4d, 0xf1, 0x6d, 0x40, 0x65, 0xf6, 0x10, 0x03, 0x01, 0x64, 0x3a, 0x09, 0x03, 0x2c, 0x17, 0x27, 0x5a, 0x0c, 0x4d, 0x01, 0xde, 0x14, 0x06, 0xa0, 0x08, 0x27, 0x63, 0x4d, 0x14, 0x26, 0x54, 0x29, 0x24, 0x24, 0x0d, 0x3c, 0xfe, 0xa5, 0x08, 0x09, 0x84, 0x49, 0x03, 0xb5, 0x00, 0x01, 0x00, 0x9a, 0x00, 0xe7, 0x05, 0xdb, 0x04, 0x8d, 0x00, 0x32, 0x00, 0x00, 0x25, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x33, 0x37, 0x23, 0x26, 0x27, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x3b, 0x01, 0x37, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x21, 0x37, 0x21, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x21, 0x36, 0x37, 0x36, 0x33, 0x21, 0x32, 0x16, 0x15, 0x05, 0x97, 0xfd, 0x95, 0x27, 0x37, 0x19, 0x17, 0x10, 0x11, 0x31, 0x03, 0x7a, 0x2a, 0x17, 0x1c, 0x1a, 0x2d, 0x18, 0xa2, 0x01, 0xe8, 0x3d, 0x38, 0x1b, 0x16, 0x12, 0x14, 0x01, 0x30, 0x02, 0xfd, 0x4f, 0x26, 0x38, 0x1a, 0x2d, 0x17, 0x02, 0xdb, 0x07, 0x0f, 0x1c, 0x26, 0x01, 0x51, 0x26, 0x37, 0xe7, 0x3e, 0x2b, 0x1b, 0x32, 0x0d, 0x0a, 0x03, 0x0c, 0x02, 0x1a, 0x1e, 0x2c, 0x1b, 0x32, 0x1c, 0x0a, 0x3d, 0x2c, 0x1a, 0x32, 0x0e, 0x0b, 0x02, 0x0a, 0x3d, 0x2c, 0x1b, 0x33, 0x1a, 0x16, 0x11, 0x1f, 0x3e, 0x2c, 0x00, 0x01, 0x00, 0x9a, 0x00, 0xe7, 0x05, 0xdb, 0x04, 0x8d, 0x00, 0x32, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x21, 0x32, 0x17, 0x16, 0x17, 0x21, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x17, 0x21, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x23, 0x17, 0x33, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x9b, 0x38, 0x25, 0x01, 0x51, 0x27, 0x1b, 0x0f, 0x07, 0x02, 0xdb, 0x17, 0x2d, 0x1a, 0x37, 0x27, 0xfd, 0x50, 0x01, 0x01, 0x31, 0x13, 0x12, 0x17, 0x19, 0x37, 0x3d, 0xe7, 0xa2, 0x18, 0x2d, 0x19, 0x1b, 0x16, 0x2c, 0x79, 0x04, 0x30, 0x11, 0x10, 0x16, 0x1a, 0x37, 0x26, 0xfd, 0x94, 0x04, 0x23, 0x2c, 0x3e, 0x1f, 0x11, 0x16, 0x1a, 0x33, 0x1b, 0x2c, 0x3d, 0x0a, 0x02, 0x0b, 0x0e, 0x32, 0x1a, 0x2c, 0x3d, 0x0a, 0x1c, 0x32, 0x1b, 0x2c, 0x1e, 0x1a, 0x02, 0x0c, 0x03, 0x0a, 0x0d, 0x32, 0x1b, 0x2b, 0x3e, 0x00, 0x00, 0x02, 0x00, 0xa0, 0x00, 0xd4, 0x05, 0xd6, 0x04, 0x8d, 0x00, 0x22, 0x00, 0x44, 0x00, 0x00, 0x25, 0x13, 0x34, 0x26, 0x23, 0x21, 0x22, 0x07, 0x21, 0x30, 0x23, 0x22, 0x14, 0x33, 0x21, 0x07, 0x21, 0x22, 0x15, 0x14, 0x33, 0x21, 0x07, 0x23, 0x22, 0x15, 0x14, 0x3b, 0x01, 0x07, 0x23, 0x22, 0x15, 0x14, 0x33, 0x07, 0x26, 0x27, 0x36, 0x37, 0x33, 0x37, 0x23, 0x26, 0x27, 0x36, 0x37, 0x33, 0x37, 0x21, 0x22, 0x27, 0x36, 0x37, 0x21, 0x37, 0x21, 0x26, 0x27, 0x36, 0x33, 0x21, 0x36, 0x37, 0x21, 0x32, 0x16, 0x15, 0x03, 0x05, 0x6e, 0x41, 0x2b, 0x1e, 0xfe, 0xc3, 0x31, 0x15, 0xfd, 0x2a, 0x03, 0x48, 0x4b, 0x02, 0xb2, 0x0b, 0xfe, 0xc1, 0x4b, 0x4b, 0x01, 0x1b, 0x08, 0xc7, 0x4b, 0x4b, 0x9c, 0x11, 0x38, 0x4a, 0x4a, 0x19, 0x53, 0x01, 0x01, 0x53, 0x43, 0x03, 0x99, 0x54, 0x01, 0x01, 0x54, 0xcd, 0x01, 0xfe, 0xe6, 0x54, 0x01, 0x01, 0x54, 0x01, 0x44, 0x04, 0xfd, 0x50, 0x53, 0x01, 0x01, 0x53, 0x02, 0xdb, 0x1d, 0x3b, 0x01, 0x51, 0x25, 0x38, 0x43, 0xf1, 0x03, 0x15, 0x25, 0x33, 0x39, 0x92, 0x4c, 0x4b, 0x49, 0x4f, 0x4b, 0x48, 0x4c, 0x4b, 0x49, 0x1d, 0x01, 0x68, 0x67, 0x01, 0x0e, 0x01, 0x68, 0x67, 0x01, 0x13, 0x68, 0x67, 0x01, 0x0f, 0x01, 0x68, 0x67, 0x45, 0x02, 0x3f, 0x2d, 0xfc, 0xb3, 0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x03, 0xde, 0x05, 0xca, 0x00, 0x21, 0x00, 0x44, 0x00, 0x00, 0x37, 0x05, 0x32, 0x36, 0x35, 0x11, 0x34, 0x27, 0x11, 0x36, 0x23, 0x22, 0x15, 0x11, 0x27, 0x11, 0x34, 0x23, 0x22, 0x15, 0x11, 0x27, 0x35, 0x34, 0x23, 0x22, 0x1d, 0x01, 0x27, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x36, 0x37, 0x16, 0x17, 0x15, 0x17, 0x35, 0x36, 0x37, 0x16, 0x17, 0x15, 0x17, 0x11, 0x34, 0x37, 0x16, 0x17, 0x11, 0x17, 0x11, 0x36, 0x37, 0x16, 0x15, 0x11, 0x16, 0x17, 0x11, 0x14, 0x06, 0x23, 0x25, 0x13, 0x9f, 0x02, 0xc6, 0x21, 0x2f, 0x35, 0x02, 0x42, 0x42, 0x44, 0x45, 0x41, 0x47, 0x43, 0x41, 0x45, 0x43, 0x42, 0x1a, 0x01, 0x5e, 0x5c, 0x01, 0x0d, 0x01, 0x5d, 0x5d, 0x01, 0x10, 0x5f, 0x5c, 0x01, 0x0e, 0x01, 0x5d, 0x5d, 0x3d, 0x02, 0x38, 0x28, 0xfd, 0x06, 0x01, 0x73, 0x4a, 0x31, 0x20, 0x01, 0x62, 0x36, 0x16, 0x03, 0x27, 0x53, 0x53, 0xfd, 0x02, 0x0d, 0x01, 0x63, 0x52, 0x52, 0xfe, 0xc4, 0x09, 0xdf, 0x53, 0x53, 0xae, 0x12, 0x3f, 0x53, 0x53, 0x1c, 0x5c, 0x01, 0x01, 0x5c, 0x4b, 0x04, 0xac, 0x5c, 0x01, 0x01, 0x5c, 0xe4, 0x03, 0x01, 0x3b, 0x5c, 0x01, 0x01, 0x5c, 0xfe, 0x96, 0x04, 0x02, 0xfd, 0x5d, 0x01, 0x01, 0x5d, 0xfc, 0xd4, 0x21, 0x41, 0xfe, 0x8a, 0x2a, 0x3e, 0x4b, 0x02, 0x9b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9f, 0x00, 0xd3, 0x05, 0xd6, 0x04, 0x8d, 0x00, 0x21, 0x00, 0x43, 0x00, 0x00, 0x25, 0x32, 0x35, 0x34, 0x2b, 0x01, 0x27, 0x33, 0x32, 0x35, 0x34, 0x2b, 0x01, 0x27, 0x21, 0x32, 0x35, 0x34, 0x23, 0x21, 0x27, 0x21, 0x32, 0x34, 0x2b, 0x01, 0x21, 0x26, 0x23, 0x21, 0x22, 0x06, 0x15, 0x13, 0x07, 0x03, 0x34, 0x36, 0x33, 0x21, 0x16, 0x17, 0x21, 0x32, 0x17, 0x06, 0x07, 0x21, 0x17, 0x21, 0x16, 0x17, 0x06, 0x23, 0x21, 0x17, 0x33, 0x16, 0x17, 0x06, 0x07, 0x23, 0x17, 0x33, 0x16, 0x17, 0x06, 0x07, 0x03, 0x61, 0x4b, 0x4b, 0x39, 0x10, 0x9d, 0x4a, 0x4a, 0xc9, 0x08, 0x01, 0x1c, 0x4a, 0x4a, 0xfe, 0xc1, 0x0c, 0x02, 0xb1, 0x4b, 0x47, 0x04, 0xfd, 0x2a, 0x14, 0x30, 0xfe, 0xc1, 0x1d, 0x2c, 0x43, 0x24, 0x44, 0x38, 0x26, 0x01, 0x51, 0x3a, 0x1e, 0x02, 0xda, 0x54, 0x01, 0x01, 0x54, 0xfd, 0x50, 0x04, 0x01, 0x45, 0x53, 0x01, 0x01, 0x53, 0xfe, 0xe5, 0x03, 0xcd, 0x53, 0x01, 0x01, 0x53, 0x9b, 0x04, 0x43, 0x53, 0x01, 0x01, 0x53, 0xf1, 0x49, 0x4b, 0x4c, 0x48, 0x4b, 0x4f, 0x49, 0x4b, 0x4c, 0x92, 0x39, 0x33, 0x25, 0xfc, 0xeb, 0x1e, 0x03, 0x4e, 0x2d, 0x3f, 0x02, 0x45, 0x67, 0x68, 0x01, 0x0f, 0x01, 0x67, 0x68, 0x13, 0x01, 0x67, 0x68, 0x01, 0x0e, 0x01, 0x67, 0x69, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x84, 0xff, 0xf9, 0x03, 0xde, 0x05, 0xc2, 0x00, 0x21, 0x00, 0x43, 0x00, 0x00, 0x13, 0x14, 0x33, 0x32, 0x3d, 0x01, 0x37, 0x15, 0x14, 0x33, 0x32, 0x3d, 0x01, 0x37, 0x11, 0x14, 0x33, 0x32, 0x35, 0x11, 0x37, 0x11, 0x14, 0x33, 0x32, 0x27, 0x11, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x05, 0x27, 0x25, 0x32, 0x16, 0x15, 0x11, 0x06, 0x07, 0x11, 0x14, 0x07, 0x26, 0x27, 0x11, 0x07, 0x11, 0x06, 0x07, 0x26, 0x35, 0x11, 0x07, 0x15, 0x06, 0x07, 0x26, 0x27, 0x35, 0x07, 0x15, 0x06, 0x07, 0x26, 0x27, 0x9f, 0x42, 0x43, 0x45, 0x41, 0x43, 0x47, 0x41, 0x45, 0x44, 0x42, 0x42, 0x02, 0x35, 0x2f, 0x21, 0xfd, 0x3a, 0x1b, 0x02, 0xfa, 0x28, 0x38, 0x02, 0x3d, 0x5d, 0x5d, 0x01, 0x0e, 0x01, 0x5c, 0x5f, 0x10, 0x01, 0x5d, 0x5d, 0x01, 0x0d, 0x01, 0x5c, 0x5e, 0x01, 0x02, 0xb3, 0x53, 0x53, 0x3d, 0x14, 0xae, 0x53, 0x53, 0xdd, 0x09, 0xfe, 0xc6, 0x53, 0x53, 0x01, 0x62, 0x0d, 0xfd, 0x01, 0x53, 0x53, 0x03, 0x27, 0x17, 0x36, 0x01, 0x61, 0x21, 0x30, 0x4a, 0x29, 0x4b, 0x3e, 0x2a, 0xfe, 0x8a, 0x42, 0x20, 0xfc, 0xd4, 0x5c, 0x01, 0x01, 0x5c, 0x02, 0xfc, 0x04, 0xfe, 0x98, 0x5d, 0x01, 0x01, 0x5d, 0x01, 0x3a, 0x02, 0xe4, 0x5d, 0x01, 0x01, 0x5d, 0xab, 0x04, 0x4a, 0x5d, 0x01, 0x01, 0x5d, 0x00, 0x00, 0x1d, 0x00, 0x70, 0x00, 0x00, 0x06, 0x04, 0x05, 0xd8, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x8b, 0x00, 0x95, 0x00, 0xa4, 0x00, 0xb3, 0x00, 0xba, 0x00, 0xc1, 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe3, 0x00, 0xe7, 0x00, 0xeb, 0x00, 0xef, 0x00, 0xf3, 0x00, 0xf7, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x03, 0x01, 0x07, 0x01, 0x0b, 0x01, 0x1a, 0x01, 0x26, 0x01, 0x2a, 0x01, 0x2e, 0x01, 0x32, 0x01, 0x36, 0x01, 0x3a, 0x01, 0x3e, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x17, 0x15, 0x14, 0x07, 0x33, 0x36, 0x35, 0x36, 0x3b, 0x01, 0x32, 0x15, 0x16, 0x1d, 0x01, 0x06, 0x23, 0x27, 0x06, 0x07, 0x15, 0x17, 0x37, 0x16, 0x15, 0x14, 0x07, 0x14, 0x2b, 0x01, 0x22, 0x2f, 0x01, 0x06, 0x23, 0x22, 0x27, 0x06, 0x15, 0x06, 0x2b, 0x01, 0x22, 0x35, 0x26, 0x35, 0x34, 0x37, 0x17, 0x37, 0x35, 0x25, 0x07, 0x22, 0x27, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x1f, 0x01, 0x35, 0x27, 0x37, 0x26, 0x35, 0x36, 0x37, 0x36, 0x01, 0x14, 0x17, 0x33, 0x35, 0x26, 0x35, 0x36, 0x3b, 0x01, 0x17, 0x07, 0x17, 0x15, 0x07, 0x15, 0x14, 0x17, 0x16, 0x1d, 0x01, 0x17, 0x33, 0x37, 0x34, 0x37, 0x36, 0x35, 0x27, 0x37, 0x35, 0x27, 0x37, 0x16, 0x1d, 0x01, 0x07, 0x17, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x20, 0x07, 0x06, 0x05, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x34, 0x21, 0x16, 0x17, 0x06, 0x23, 0x22, 0x27, 0x34, 0x35, 0x34, 0x13, 0x33, 0x36, 0x33, 0x17, 0x36, 0x35, 0x26, 0x35, 0x26, 0x23, 0x06, 0x07, 0x06, 0x15, 0x25, 0x06, 0x23, 0x06, 0x15, 0x17, 0x37, 0x16, 0x17, 0x35, 0x34, 0x27, 0x26, 0x35, 0x26, 0x05, 0x17, 0x15, 0x07, 0x26, 0x35, 0x34, 0x37, 0x16, 0x15, 0x14, 0x07, 0x27, 0x35, 0x03, 0x16, 0x33, 0x36, 0x37, 0x26, 0x35, 0x34, 0x37, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x26, 0x27, 0x26, 0x27, 0x16, 0x15, 0x14, 0x37, 0x16, 0x17, 0x33, 0x35, 0x26, 0x05, 0x15, 0x32, 0x3f, 0x01, 0x22, 0x07, 0x05, 0x15, 0x17, 0x35, 0x25, 0x15, 0x37, 0x35, 0x05, 0x15, 0x17, 0x35, 0x33, 0x15, 0x37, 0x27, 0x07, 0x15, 0x37, 0x27, 0x07, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x07, 0x15, 0x17, 0x35, 0x17, 0x15, 0x33, 0x35, 0x07, 0x15, 0x33, 0x35, 0x05, 0x27, 0x07, 0x15, 0x16, 0x15, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x26, 0x35, 0x06, 0x25, 0x07, 0x16, 0x15, 0x14, 0x17, 0x32, 0x3f, 0x01, 0x26, 0x23, 0x07, 0x25, 0x07, 0x17, 0x35, 0x07, 0x15, 0x17, 0x35, 0x27, 0x15, 0x17, 0x35, 0x17, 0x15, 0x37, 0x35, 0x37, 0x15, 0x37, 0x35, 0x37, 0x15, 0x37, 0x35, 0x03, 0x4a, 0x01, 0x12, 0x83, 0x35, 0x5b, 0x05, 0x16, 0x05, 0x90, 0x28, 0x20, 0x07, 0x39, 0x3f, 0x18, 0x38, 0x50, 0xe0, 0x37, 0xd2, 0x3f, 0x56, 0x45, 0x3a, 0x05, 0x2e, 0x3e, 0xac, 0x44, 0x9b, 0x9d, 0x41, 0xbc, 0x2e, 0x28, 0x0c, 0x33, 0x44, 0x50, 0x44, 0xce, 0xfe, 0xee, 0x61, 0x3e, 0x07, 0x40, 0x03, 0x23, 0x1e, 0x2b, 0x36, 0x78, 0x17, 0x0b, 0x60, 0x1f, 0xed, 0x5d, 0xfe, 0xbe, 0x3e, 0x07, 0x1c, 0x0a, 0x0b, 0x0c, 0x11, 0x0b, 0x1c, 0x11, 0x8a, 0x3e, 0x5b, 0x50, 0x72, 0xb1, 0x1d, 0x17, 0x1e, 0x0c, 0x1c, 0x17, 0x1c, 0x05, 0x40, 0xca, 0x73, 0x65, 0x22, 0xfe, 0xcf, 0x5e, 0x12, 0x01, 0x4c, 0x29, 0x02, 0x32, 0x51, 0x06, 0x46, 0x20, 0x01, 0xa0, 0xb7, 0x06, 0x22, 0x56, 0x3b, 0x3d, 0xd4, 0x05, 0xfc, 0x16, 0x5c, 0x1c, 0x3f, 0x06, 0x12, 0x19, 0x2f, 0xe0, 0xfc, 0x85, 0x0f, 0x0d, 0x2f, 0x2a, 0x55, 0x39, 0xd9, 0x5b, 0xb7, 0x16, 0x02, 0x27, 0x0d, 0x2e, 0x22, 0x6e, 0x3f, 0x24, 0x2d, 0xf0, 0x29, 0xc0, 0xc4, 0x26, 0x01, 0x1a, 0x21, 0x19, 0x44, 0x68, 0x32, 0xac, 0x0b, 0x06, 0x29, 0x14, 0x0e, 0x12, 0x17, 0x05, 0x08, 0x01, 0x60, 0x0e, 0x02, 0x17, 0x0c, 0x15, 0xfe, 0xba, 0x10, 0x01, 0x07, 0x17, 0xfe, 0xf4, 0x16, 0xb8, 0x18, 0x02, 0x3f, 0x14, 0x02, 0x68, 0x1d, 0x12, 0x16, 0x94, 0x16, 0x68, 0x16, 0x45, 0x1d, 0xfe, 0x2d, 0x67, 0x06, 0x3e, 0x05, 0x0d, 0x11, 0x3f, 0x8c, 0x1e, 0x11, 0xa7, 0x02, 0xc0, 0x10, 0xcc, 0x2e, 0x12, 0x0b, 0x38, 0x05, 0x1c, 0x56, 0xfd, 0xe0, 0x03, 0x1a, 0x16, 0x16, 0x65, 0x17, 0xb7, 0x19, 0x0d, 0x17, 0x12, 0x17, 0x05, 0xd8, 0xc1, 0x6c, 0x54, 0x45, 0x72, 0x66, 0x5e, 0x06, 0x35, 0x2e, 0x3e, 0x3d, 0x39, 0x7c, 0x35, 0x22, 0x18, 0x2d, 0x07, 0x6c, 0x29, 0x12, 0x64, 0x0d, 0x12, 0x2c, 0x26, 0x3e, 0x76, 0x76, 0x5d, 0x63, 0x63, 0x63, 0x19, 0x57, 0x70, 0x43, 0x2d, 0x2b, 0x0d, 0x0d, 0x64, 0x12, 0x95, 0x07, 0x38, 0x0d, 0x1b, 0x42, 0x70, 0x70, 0x3e, 0x06, 0x57, 0x5d, 0x6f, 0xd8, 0xe6, 0x61, 0x1d, 0xfe, 0x78, 0x76, 0x75, 0x50, 0x70, 0x38, 0x32, 0x13, 0x2c, 0x8e, 0x44, 0xa8, 0x0c, 0x5e, 0x1e, 0x38, 0x2c, 0x18, 0x0d, 0x1a, 0x5e, 0x42, 0x24, 0x4b, 0xbb, 0x9c, 0x12, 0x2b, 0x14, 0x0b, 0x22, 0x31, 0xae, 0x18, 0x52, 0x5b, 0x2b, 0xd2, 0x65, 0x2a, 0xf1, 0x3b, 0xd0, 0x0d, 0x32, 0x0b, 0x0d, 0x9b, 0x9b, 0x57, 0x0a, 0x51, 0x97, 0x9b, 0x03, 0x02, 0x50, 0xfe, 0x12, 0x82, 0x05, 0x08, 0x0a, 0x49, 0x26, 0x3f, 0x09, 0x67, 0x70, 0x13, 0xeb, 0x6f, 0x25, 0x19, 0x0b, 0x05, 0x12, 0x77, 0x0d, 0x5e, 0x19, 0x53, 0x41, 0x24, 0x0d, 0x07, 0x9f, 0x32, 0x0c, 0x39, 0x69, 0x2d, 0x35, 0x6e, 0x30, 0x08, 0x32, 0xa2, 0xfe, 0x86, 0xc7, 0x0e, 0xbf, 0x0a, 0x0c, 0x41, 0x69, 0x26, 0xae, 0x49, 0x16, 0x59, 0x5e, 0x50, 0x5d, 0x44, 0x13, 0x9b, 0x25, 0x88, 0x5c, 0x3f, 0x3f, 0x5c, 0x4f, 0x57, 0x43, 0x0d, 0x2c, 0x05, 0x2c, 0x05, 0x31, 0x0a, 0x2f, 0x0f, 0x32, 0x05, 0x31, 0x31, 0x08, 0x2f, 0x06, 0x3d, 0x02, 0x3b, 0x06, 0x37, 0x37, 0x37, 0x37, 0x3d, 0x33, 0x05, 0x32, 0x0e, 0x31, 0x38, 0x07, 0x31, 0x31, 0x7b, 0x05, 0x05, 0x13, 0x39, 0x30, 0x38, 0x68, 0x4e, 0x1d, 0x25, 0x1e, 0x62, 0x5c, 0x44, 0x68, 0x2c, 0x0f, 0x29, 0x68, 0x3f, 0x12, 0x05, 0xcc, 0x31, 0x06, 0x37, 0x49, 0x32, 0x06, 0x31, 0x21, 0x31, 0x07, 0x32, 0x18, 0x32, 0x06, 0x32, 0x04, 0x32, 0x05, 0x33, 0x0a, 0x32, 0x07, 0x31, 0x00, 0x00, 0x01, 0x00, 0x9a, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xd8, 0x00, 0x26, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x01, 0x07, 0x14, 0x17, 0x25, 0x32, 0x17, 0x15, 0x14, 0x23, 0x05, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x34, 0x37, 0x00, 0x37, 0x36, 0x35, 0x34, 0x27, 0x23, 0x05, 0x22, 0x27, 0x35, 0x34, 0x37, 0x33, 0x03, 0xd5, 0x81, 0x65, 0x2f, 0x6f, 0xfd, 0xae, 0x0a, 0x57, 0x03, 0x16, 0x46, 0x08, 0x5e, 0xfc, 0xf7, 0x91, 0x61, 0x18, 0x7d, 0x02, 0x2f, 0x12, 0x0a, 0x58, 0x0a, 0xfd, 0x09, 0x33, 0x0a, 0x58, 0x0d, 0x05, 0xd8, 0x8d, 0x4d, 0x4f, 0x8a, 0x62, 0xfd, 0xa0, 0x3e, 0x59, 0x1a, 0xd1, 0x61, 0x03, 0x59, 0xc6, 0xae, 0x35, 0x38, 0x18, 0x8a, 0x6c, 0x02, 0x37, 0x1b, 0x1b, 0x16, 0x50, 0x20, 0xcc, 0x50, 0x1e, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x11, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x46, 0x00, 0x58, 0x00, 0x00, 0x01, 0x20, 0x13, 0x16, 0x15, 0x10, 0x05, 0x06, 0x2b, 0x01, 0x20, 0x03, 0x26, 0x3d, 0x01, 0x10, 0x01, 0x36, 0x05, 0x26, 0x23, 0x20, 0x03, 0x06, 0x15, 0x10, 0x17, 0x16, 0x33, 0x20, 0x13, 0x36, 0x3d, 0x01, 0x10, 0x25, 0x26, 0x01, 0x23, 0x22, 0x27, 0x13, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x13, 0x06, 0x01, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x10, 0x25, 0x36, 0x37, 0x13, 0x06, 0x25, 0x16, 0x17, 0x21, 0x26, 0x27, 0x26, 0x27, 0x13, 0x16, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x03, 0x2e, 0x01, 0x59, 0xee, 0x66, 0xfe, 0xe3, 0xae, 0xbf, 0x1d, 0xfe, 0xaa, 0xec, 0x59, 0x01, 0x30, 0xa7, 0x01, 0xe8, 0x96, 0x96, 0xfe, 0xf2, 0xd4, 0x71, 0xfb, 0xa0, 0xc9, 0x01, 0x33, 0xd2, 0x50, 0xfe, 0xce, 0x04, 0xfe, 0xf2, 0x19, 0x97, 0x7f, 0xbc, 0x2b, 0x32, 0x08, 0x2d, 0x29, 0xbf, 0x7f, 0xfe, 0xfd, 0x56, 0xfe, 0x82, 0x01, 0x02, 0x10, 0x11, 0xbd, 0x06, 0x02, 0x45, 0x56, 0x03, 0xfe, 0x80, 0x01, 0x1c, 0x1e, 0x27, 0xbd, 0x71, 0xfe, 0x75, 0x49, 0x33, 0x16, 0x3d, 0x25, 0x29, 0x07, 0x48, 0x33, 0x12, 0x41, 0x23, 0x05, 0xd8, 0xfe, 0x8d, 0xaf, 0xd6, 0xfe, 0xb0, 0xfd, 0x93, 0x01, 0x83, 0xae, 0xb2, 0x1c, 0x01, 0x53, 0x01, 0x02, 0x84, 0xac, 0x5d, 0xfe, 0xd9, 0xb1, 0xc2, 0xfe, 0xc4, 0xe2, 0x8a, 0x01, 0x5a, 0x96, 0xa6, 0x0f, 0x01, 0x59, 0xe0, 0x04, 0xfb, 0x48, 0x59, 0x01, 0x6f, 0x1f, 0x1d, 0xfe, 0x92, 0x58, 0x03, 0x28, 0x49, 0x5f, 0x05, 0x10, 0x01, 0x20, 0xdb, 0x0d, 0x0c, 0xfe, 0x92, 0x04, 0x8f, 0x91, 0xb0, 0x3b, 0x2e, 0x32, 0x19, 0x01, 0x6c, 0x4f, 0xfe, 0xcf, 0x50, 0x25, 0x2e, 0x47, 0x36, 0x1f, 0x52, 0x25, 0x26, 0x05, 0x49, 0x38, 0x1c, 0x00, 0x00, 0x06, 0x00, 0x5a, 0x00, 0x00, 0x06, 0x1b, 0x05, 0xd8, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x4e, 0x00, 0x6c, 0x00, 0x8d, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x36, 0x37, 0x16, 0x15, 0x14, 0x06, 0x07, 0x26, 0x35, 0x34, 0x03, 0x26, 0x23, 0x22, 0x06, 0x07, 0x26, 0x27, 0x36, 0x33, 0x32, 0x16, 0x17, 0x06, 0x01, 0x14, 0x16, 0x17, 0x06, 0x07, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x16, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x33, 0x16, 0x17, 0x16, 0x11, 0x15, 0x2e, 0x01, 0x23, 0x06, 0x07, 0x27, 0x36, 0x35, 0x34, 0x27, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x27, 0x26, 0x27, 0x12, 0x37, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x2b, 0x01, 0x22, 0x23, 0x22, 0x06, 0x03, 0xcc, 0x3d, 0x41, 0x01, 0x21, 0x20, 0x02, 0x6d, 0x4d, 0x09, 0x0c, 0x39, 0x44, 0x07, 0x52, 0x37, 0x1e, 0x13, 0x4e, 0x69, 0x06, 0x78, 0x42, 0x16, 0xfe, 0x57, 0x52, 0x3f, 0x03, 0x0e, 0x5e, 0x64, 0x02, 0x26, 0x03, 0x61, 0x62, 0x96, 0x29, 0x2d, 0x94, 0x52, 0x01, 0x37, 0x6b, 0x53, 0x57, 0x6f, 0x73, 0x4c, 0x48, 0x32, 0xa5, 0x34, 0x2b, 0x19, 0x3e, 0x1f, 0x1d, 0x1c, 0x1a, 0x3a, 0x18, 0x32, 0x38, 0x90, 0x3e, 0x48, 0xfe, 0xc9, 0x92, 0x53, 0x0f, 0x3e, 0x03, 0x5f, 0x6c, 0xaf, 0x0b, 0xbd, 0x65, 0xa5, 0x75, 0x3f, 0x01, 0x39, 0xa3, 0x4c, 0x30, 0x16, 0xfb, 0xf9, 0x04, 0x6d, 0x62, 0xa2, 0x10, 0x02, 0x27, 0x02, 0x0f, 0xf9, 0xa0, 0x1e, 0x22, 0x5b, 0xac, 0x01, 0x3c, 0x02, 0x3a, 0x65, 0x96, 0x0c, 0x03, 0x04, 0x73, 0xa0, 0x01, 0x91, 0x28, 0x8b, 0x41, 0x0c, 0x0c, 0x0e, 0x05, 0x13, 0x12, 0x5f, 0xc3, 0x25, 0x18, 0x19, 0x0e, 0x02, 0x0d, 0x23, 0x04, 0x2b, 0x16, 0x1c, 0x42, 0x05, 0x37, 0x21, 0xfe, 0xea, 0x4e, 0x8f, 0x20, 0x26, 0x22, 0x2e, 0xcb, 0x4f, 0x10, 0x0f, 0x06, 0xfd, 0xb2, 0x53, 0x06, 0x24, 0xaa, 0x02, 0x58, 0x45, 0x2f, 0x4b, 0x28, 0x41, 0x61, 0x5d, 0x64, 0x4c, 0x50, 0x2a, 0x18, 0x17, 0x27, 0x46, 0x43, 0x61, 0x59, 0x72, 0x3d, 0x05, 0xa0, 0x43, 0xd9, 0x34, 0x34, 0x6d, 0x6f, 0x0a, 0x43, 0x82, 0xfe, 0xff, 0x0a, 0x9d, 0xb6, 0x0a, 0x93, 0x28, 0x07, 0x07, 0x46, 0x19, 0x4b, 0x1f, 0x9c, 0x57, 0x59, 0x1a, 0x8e, 0xfc, 0x46, 0x18, 0x19, 0x95, 0xa1, 0x76, 0x02, 0x62, 0x89, 0x01, 0x0e, 0x70, 0x68, 0xb4, 0x27, 0x55, 0x44, 0x98, 0x27, 0x52, 0x1d, 0x3c, 0x09, 0x0a, 0x24, 0x88, 0x93, 0x00, 0x17, 0x00, 0x5a, 0xff, 0xfc, 0x04, 0x77, 0x05, 0xd1, 0x00, 0x07, 0x00, 0x1d, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x3f, 0x00, 0x56, 0x00, 0x6d, 0x00, 0x83, 0x00, 0xa2, 0x00, 0xad, 0x00, 0xb2, 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xc1, 0x00, 0xc9, 0x00, 0xd0, 0x00, 0xd5, 0x00, 0xda, 0x00, 0xdf, 0x00, 0xe5, 0x00, 0xed, 0x00, 0xf4, 0x01, 0x23, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x26, 0x17, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x37, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x06, 0x07, 0x26, 0x27, 0x36, 0x35, 0x34, 0x01, 0x06, 0x07, 0x23, 0x26, 0x37, 0x03, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x06, 0x23, 0x22, 0x27, 0x35, 0x26, 0x35, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, 0x04, 0x07, 0x23, 0x26, 0x27, 0x15, 0x27, 0x35, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, 0x04, 0x15, 0x14, 0x07, 0x27, 0x36, 0x35, 0x34, 0x27, 0x34, 0x03, 0x15, 0x27, 0x35, 0x24, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, 0x17, 0x06, 0x04, 0x17, 0x06, 0x07, 0x27, 0x36, 0x35, 0x34, 0x07, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, 0x04, 0x17, 0x06, 0x07, 0x26, 0x27, 0x36, 0x35, 0x34, 0x27, 0x15, 0x27, 0x13, 0x15, 0x27, 0x35, 0x24, 0x35, 0x36, 0x37, 0x33, 0x32, 0x17, 0x07, 0x17, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x04, 0x17, 0x06, 0x07, 0x26, 0x27, 0x36, 0x27, 0x36, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x26, 0x34, 0x37, 0x22, 0x0e, 0x01, 0x05, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x07, 0x37, 0x26, 0x27, 0x14, 0x15, 0x14, 0x07, 0x17, 0x35, 0x34, 0x27, 0x06, 0x07, 0x17, 0x36, 0x35, 0x34, 0x05, 0x17, 0x36, 0x37, 0x06, 0x07, 0x17, 0x36, 0x37, 0x06, 0x07, 0x17, 0x36, 0x37, 0x06, 0x1f, 0x01, 0x35, 0x34, 0x37, 0x06, 0x17, 0x37, 0x26, 0x35, 0x34, 0x35, 0x06, 0x15, 0x3f, 0x01, 0x26, 0x27, 0x14, 0x15, 0x14, 0x17, 0x15, 0x27, 0x35, 0x26, 0x23, 0x22, 0x07, 0x22, 0x27, 0x36, 0x25, 0x16, 0x17, 0x16, 0x33, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x31, 0x14, 0x31, 0x15, 0x36, 0x37, 0x04, 0x17, 0x06, 0x23, 0x26, 0x23, 0x22, 0x03, 0x02, 0x04, 0x0a, 0x0b, 0x16, 0x09, 0x47, 0x06, 0x07, 0x3c, 0x31, 0x17, 0x14, 0x52, 0x61, 0x20, 0x37, 0x0a, 0x0c, 0xb8, 0x0b, 0x01, 0x7f, 0x3f, 0x8e, 0xf7, 0xfe, 0xae, 0x56, 0x1c, 0x0d, 0x01, 0x4d, 0x5d, 0x18, 0x0c, 0x09, 0x05, 0x1f, 0xd8, 0x0a, 0x18, 0x1e, 0x03, 0x9d, 0x04, 0x3a, 0x29, 0x28, 0x37, 0x01, 0x17, 0x02, 0x0e, 0x17, 0x68, 0x43, 0xfc, 0x04, 0x02, 0x73, 0x2f, 0x4e, 0x9d, 0x01, 0x8a, 0x65, 0x2c, 0x3e, 0x01, 0x48, 0x43, 0xfe, 0xb7, 0x02, 0x04, 0x66, 0x45, 0x5f, 0xba, 0x01, 0x09, 0x02, 0x37, 0x02, 0x04, 0x87, 0x5e, 0x93, 0xe4, 0xf2, 0x05, 0x01, 0x65, 0x41, 0x42, 0x93, 0x01, 0xe0, 0x02, 0x03, 0x9d, 0x1e, 0x34, 0x9e, 0xaa, 0x43, 0x43, 0x43, 0xfe, 0xa7, 0x0c, 0xb8, 0x08, 0x37, 0x2e, 0x62, 0x53, 0x15, 0x15, 0x33, 0x3b, 0x07, 0x07, 0x25, 0x02, 0x89, 0x06, 0x06, 0x9d, 0x39, 0x64, 0xed, 0x02, 0x0b, 0xfe, 0x9e, 0x10, 0x1d, 0x11, 0x0e, 0x0e, 0x10, 0x1e, 0x10, 0x01, 0x8d, 0x69, 0x27, 0x19, 0x57, 0x88, 0x68, 0x22, 0x26, 0x56, 0x71, 0x48, 0x0f, 0x2c, 0x37, 0x75, 0x30, 0x01, 0x37, 0x23, 0x5d, 0x13, 0x36, 0x37, 0x2d, 0x2f, 0x36, 0x27, 0xfd, 0x5d, 0x19, 0x28, 0x68, 0x52, 0x28, 0x26, 0x22, 0x68, 0x5a, 0x12, 0x2c, 0x0f, 0x48, 0x4b, 0x0e, 0x38, 0x2e, 0x43, 0x3a, 0x37, 0x14, 0x23, 0x5d, 0x36, 0x2f, 0x2d, 0xce, 0x43, 0x29, 0x40, 0x20, 0x26, 0xf0, 0x50, 0x4c, 0x01, 0x3c, 0x14, 0x50, 0x02, 0x01, 0x03, 0x02, 0x12, 0x14, 0x14, 0x25, 0x26, 0x25, 0x15, 0x14, 0x12, 0x03, 0x02, 0x4f, 0x15, 0x01, 0x3b, 0x4c, 0x50, 0xf0, 0x26, 0x21, 0x3d, 0x04, 0x20, 0x08, 0x04, 0x09, 0x0a, 0x14, 0x3f, 0x02, 0x18, 0x05, 0x17, 0x19, 0x3e, 0x02, 0x04, 0x7d, 0x3e, 0x20, 0x11, 0x09, 0x14, 0x2a, 0x30, 0xfc, 0x74, 0x22, 0x3c, 0x48, 0x23, 0x03, 0xa6, 0x0b, 0x08, 0x05, 0x09, 0x09, 0xfc, 0x2d, 0x38, 0x1a, 0x38, 0x29, 0x1e, 0x36, 0x31, 0x18, 0x0d, 0x06, 0x15, 0x15, 0x29, 0x36, 0x66, 0x38, 0xad, 0x5a, 0x0d, 0x5c, 0x2b, 0x48, 0x44, 0x20, 0x13, 0x09, 0x1a, 0x27, 0x2a, 0x3e, 0x4a, 0x2e, 0x0e, 0x0b, 0x11, 0x1d, 0x05, 0x05, 0x17, 0x01, 0x99, 0x8c, 0x0d, 0x89, 0x26, 0x62, 0x35, 0x16, 0x14, 0x07, 0x0f, 0x1d, 0x02, 0x02, 0x34, 0x43, 0x55, 0x45, 0x20, 0x1b, 0x27, 0x1a, 0x27, 0xa4, 0x21, 0x60, 0x39, 0x1e, 0x0c, 0x07, 0x21, 0x2c, 0x28, 0x4d, 0x54, 0x45, 0x15, 0x0f, 0x0b, 0x1e, 0x2a, 0x21, 0x1d, 0x85, 0x0c, 0x02, 0x04, 0x7f, 0x08, 0x7d, 0x15, 0x71, 0x7e, 0x04, 0x3d, 0x18, 0x17, 0x05, 0x18, 0x02, 0x2f, 0x2b, 0x29, 0x66, 0x5b, 0x14, 0x10, 0x0f, 0x1c, 0x34, 0x1f, 0x02, 0x66, 0x12, 0x20, 0x11, 0x21, 0x42, 0x22, 0x11, 0x20, 0x3c, 0x40, 0x30, 0x26, 0x39, 0x15, 0x63, 0x3f, 0x22, 0x56, 0x2b, 0x80, 0x47, 0x13, 0x6f, 0x4d, 0x93, 0x4b, 0x08, 0x7e, 0x61, 0x11, 0x0f, 0x84, 0x3f, 0x0b, 0x0c, 0x7d, 0x62, 0x89, 0x39, 0x19, 0x65, 0x5c, 0x0d, 0x50, 0x26, 0x30, 0x40, 0x11, 0x6b, 0x22, 0x3f, 0x63, 0x2a, 0x89, 0x13, 0x47, 0x80, 0x45, 0x89, 0x08, 0x06, 0x4a, 0x8e, 0x58, 0x8d, 0x0b, 0x3f, 0x84, 0x0f, 0x11, 0x65, 0x7d, 0x04, 0x19, 0x39, 0x89, 0x0d, 0x0d, 0x5c, 0xab, 0xce, 0x06, 0xc2, 0x34, 0x0c, 0xa5, 0x5c, 0x06, 0x36, 0x1e, 0x01, 0x18, 0x01, 0x02, 0x0a, 0x27, 0x16, 0x15, 0x27, 0x16, 0x16, 0x27, 0x15, 0x16, 0x27, 0x0a, 0x02, 0x01, 0x01, 0x16, 0x1e, 0x36, 0x06, 0x5c, 0xa5, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x04, 0xc7, 0x05, 0xd9, 0x00, 0x08, 0x00, 0x28, 0x00, 0x00, 0x01, 0x26, 0x27, 0x06, 0x07, 0x16, 0x17, 0x36, 0x35, 0x03, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x15, 0x14, 0x07, 0x33, 0x32, 0x37, 0x11, 0x26, 0x2b, 0x02, 0x11, 0x14, 0x17, 0x21, 0x36, 0x35, 0x11, 0x2b, 0x01, 0x22, 0x07, 0x11, 0x16, 0x33, 0x03, 0x20, 0x02, 0x6d, 0x6d, 0x01, 0x07, 0x67, 0x6f, 0xb1, 0x6b, 0x0b, 0x03, 0xb5, 0xb6, 0x03, 0x76, 0x93, 0xa3, 0x9c, 0x98, 0xa1, 0x05, 0x94, 0x59, 0xfe, 0xc9, 0x59, 0x97, 0x06, 0xa1, 0x98, 0x9d, 0xa2, 0x04, 0xde, 0xb1, 0x02, 0x02, 0xb1, 0x8e, 0x71, 0x58, 0x9f, 0xfe, 0xf1, 0x65, 0xb8, 0xf3, 0x02, 0x02, 0xf3, 0x0e, 0xb7, 0x58, 0x63, 0xfe, 0xf7, 0x36, 0xfe, 0x0c, 0xb5, 0xae, 0xae, 0xb5, 0x01, 0xf4, 0x36, 0x01, 0x09, 0x63, 0x00, 0x00, 0x03, 0x00, 0x99, 0xff, 0xfd, 0x04, 0x14, 0x05, 0xd9, 0x00, 0x03, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x15, 0x33, 0x35, 0x27, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x05, 0x15, 0x21, 0x11, 0x17, 0x15, 0x27, 0x03, 0x23, 0x11, 0x27, 0x35, 0x17, 0x11, 0x21, 0x35, 0x21, 0x35, 0x23, 0x35, 0x13, 0x33, 0x11, 0x33, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x15, 0x33, 0x01, 0xf5, 0xb6, 0xa5, 0x9a, 0x71, 0x71, 0x08, 0x01, 0x6c, 0xfe, 0x8c, 0x81, 0x7a, 0x01, 0xa0, 0x79, 0x79, 0xfe, 0x93, 0x01, 0x6d, 0x6a, 0x94, 0x40, 0xf1, 0xf1, 0x40, 0xf0, 0xf0, 0x05, 0x40, 0x3c, 0x3c, 0x33, 0x66, 0x66, 0xa2, 0x58, 0x01, 0xaf, 0xfd, 0xe8, 0x8b, 0x9c, 0x85, 0xfe, 0xee, 0x01, 0xbc, 0x86, 0x9b, 0x82, 0x01, 0x71, 0xb0, 0x58, 0xa2, 0xfc, 0xcf, 0x01, 0xbb, 0x47, 0x63, 0x63, 0x47, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x05, 0x0c, 0x07, 0x4a, 0x00, 0x07, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x01, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x37, 0x33, 0x09, 0x01, 0x23, 0x03, 0x11, 0x23, 0x11, 0x03, 0x23, 0x09, 0x01, 0x33, 0x02, 0xd7, 0xbc, 0x69, 0x72, 0x72, 0x69, 0xfe, 0xb0, 0x01, 0x50, 0xba, 0xbf, 0xbf, 0xba, 0xbc, 0xc4, 0xc6, 0xfe, 0x90, 0x01, 0x83, 0xc5, 0xd7, 0x95, 0xe5, 0xc5, 0x01, 0x8b, 0xfe, 0x96, 0xc6, 0x06, 0xa7, 0xfd, 0xd8, 0x90, 0x01, 0x08, 0x90, 0xfc, 0x04, 0x04, 0x9f, 0xdf, 0xd8, 0xd9, 0xde, 0xfe, 0xcd, 0xed, 0xfe, 0x42, 0xfe, 0x28, 0x01, 0x06, 0xfe, 0xfa, 0x01, 0x17, 0xfe, 0xe9, 0x01, 0xe1, 0x01, 0xb5, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x03, 0x54, 0x05, 0xd7, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x17, 0x15, 0x33, 0x17, 0x15, 0x07, 0x23, 0x15, 0x21, 0x17, 0x15, 0x07, 0x21, 0x11, 0x07, 0x23, 0x27, 0x11, 0x21, 0x27, 0x35, 0x37, 0x21, 0x35, 0x23, 0x27, 0x35, 0x37, 0x33, 0x35, 0x01, 0xa8, 0x9a, 0x05, 0x95, 0x04, 0x04, 0x95, 0x01, 0x07, 0x05, 0x05, 0xfe, 0xf9, 0x05, 0x9a, 0x06, 0xfe, 0xfc, 0x05, 0x05, 0x01, 0x04, 0x92, 0x05, 0x05, 0x92, 0x05, 0xd7, 0x05, 0x9b, 0x06, 0x94, 0x06, 0x71, 0x06, 0x98, 0x05, 0xfc, 0x82, 0x05, 0x05, 0x03, 0x7e, 0x05, 0x98, 0x06, 0x71, 0x06, 0x94, 0x06, 0x9b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0xff, 0xfd, 0x05, 0xdc, 0x05, 0xd5, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x21, 0x17, 0x15, 0x07, 0x23, 0x11, 0x21, 0x35, 0x37, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x35, 0x21, 0x11, 0x33, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x37, 0x33, 0x11, 0x21, 0x15, 0x07, 0x23, 0x27, 0x11, 0x37, 0x33, 0x17, 0x15, 0x21, 0x11, 0x23, 0x27, 0x35, 0x02, 0x75, 0x01, 0x8a, 0x06, 0x06, 0x90, 0x02, 0x02, 0x06, 0x5f, 0x05, 0x05, 0x5f, 0x06, 0xfd, 0xfe, 0x90, 0x06, 0x06, 0xfe, 0x76, 0x05, 0x05, 0x99, 0xfd, 0xfd, 0x05, 0x68, 0x05, 0x05, 0x68, 0x05, 0x02, 0x03, 0x99, 0x05, 0x05, 0xd5, 0x06, 0x77, 0x06, 0xfd, 0xd1, 0xa1, 0x06, 0x06, 0xfe, 0x49, 0x06, 0x06, 0x9e, 0xfd, 0xc8, 0x06, 0x6a, 0x06, 0x06, 0x6a, 0x06, 0x02, 0x38, 0x9e, 0x06, 0x06, 0x01, 0xb7, 0x06, 0x06, 0xa1, 0x02, 0x2f, 0x06, 0x77, 0x00, 0x02, 0x00, 0xa0, 0x00, 0x00, 0x05, 0xd6, 0x05, 0xd8, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x33, 0x32, 0x17, 0x23, 0x27, 0x20, 0x03, 0x06, 0x15, 0x10, 0x05, 0x16, 0x33, 0x37, 0x15, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x20, 0x03, 0x26, 0x35, 0x10, 0x25, 0x36, 0x01, 0x33, 0x32, 0x17, 0x33, 0x15, 0x07, 0x16, 0x15, 0x27, 0x07, 0x23, 0x35, 0x37, 0x27, 0x35, 0x33, 0x03, 0x40, 0x12, 0xc7, 0xbd, 0x05, 0xd7, 0xfe, 0xcb, 0xbc, 0x55, 0x01, 0x34, 0x7b, 0x8c, 0xe7, 0x90, 0x7c, 0x49, 0x30, 0x19, 0xfe, 0xb5, 0xd6, 0x77, 0x01, 0x5f, 0x9b, 0x02, 0x3f, 0x03, 0x05, 0x38, 0xbc, 0x97, 0x3a, 0x9f, 0x98, 0x03, 0x3c, 0x9b, 0xc0, 0x05, 0xd8, 0x92, 0x36, 0xfe, 0xca, 0x9e, 0xb9, 0xfe, 0x92, 0xd6, 0x47, 0x32, 0x06, 0x6b, 0x1a, 0x0b, 0x01, 0x3e, 0xc0, 0xe9, 0x01, 0xaa, 0xee, 0x59, 0xfe, 0x33, 0xc9, 0x03, 0x7e, 0xbb, 0x11, 0x7c, 0x7c, 0x03, 0xc9, 0x7e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd9, 0x00, 0x16, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x37, 0x16, 0x33, 0x32, 0x37, 0x35, 0x33, 0x17, 0x15, 0x14, 0x0f, 0x01, 0x22, 0x27, 0x06, 0x23, 0x22, 0x27, 0x34, 0x17, 0x33, 0x16, 0x17, 0x32, 0x15, 0x03, 0x33, 0x24, 0x11, 0x34, 0x27, 0x35, 0x16, 0x11, 0x15, 0x10, 0x07, 0x06, 0x07, 0x15, 0x16, 0x3b, 0x01, 0x15, 0x06, 0x2b, 0x01, 0x22, 0x07, 0x27, 0x23, 0x22, 0x27, 0x35, 0x33, 0x32, 0x37, 0x35, 0x27, 0x26, 0x27, 0x26, 0x35, 0x10, 0x3f, 0x01, 0x15, 0x06, 0x15, 0x10, 0x05, 0x35, 0x03, 0x35, 0x37, 0x32, 0x27, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x15, 0x23, 0x26, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x34, 0x25, 0x16, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x07, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x10, 0x25, 0x02, 0x9f, 0x19, 0x39, 0x2a, 0x1d, 0x22, 0x27, 0x3c, 0x13, 0x04, 0x02, 0x3e, 0x1b, 0x28, 0x1f, 0x1e, 0x28, 0x49, 0x0f, 0xa0, 0x02, 0x2d, 0x1f, 0x07, 0x09, 0x02, 0x01, 0x07, 0x63, 0xc7, 0xc9, 0x45, 0x2a, 0x48, 0x95, 0x17, 0x69, 0x41, 0x74, 0x14, 0x3e, 0x3d, 0x82, 0x32, 0x7b, 0x36, 0x6d, 0x4e, 0x50, 0x70, 0x20, 0x5a, 0xb4, 0x1d, 0x69, 0x01, 0x08, 0x10, 0x03, 0x1f, 0xe6, 0x55, 0x3b, 0x78, 0x83, 0x02, 0x8e, 0x54, 0x22, 0xf1, 0x6d, 0x20, 0x02, 0x3b, 0x77, 0x75, 0x9e, 0x95, 0x50, 0x1c, 0x31, 0x52, 0xfe, 0xf4, 0x05, 0xd9, 0x4b, 0x30, 0x30, 0x44, 0x07, 0x28, 0x05, 0x3b, 0x1b, 0x04, 0x2c, 0x2c, 0x65, 0x22, 0x87, 0x40, 0x0b, 0x05, 0xfc, 0x20, 0xe4, 0x01, 0x70, 0xc2, 0xcf, 0x03, 0xd7, 0xfe, 0xeb, 0x24, 0xfe, 0xf1, 0xdd, 0x42, 0x16, 0x05, 0x28, 0x05, 0x21, 0x63, 0x63, 0x1c, 0x05, 0x2a, 0x03, 0x40, 0x72, 0x4a, 0xb1, 0xb1, 0x01, 0x01, 0xe6, 0x1f, 0x05, 0xc0, 0xe2, 0xfe, 0xa7, 0xf5, 0x02, 0x03, 0x26, 0x16, 0xa9, 0x2a, 0x06, 0x45, 0x63, 0xcc, 0xef, 0xe9, 0xd6, 0x02, 0x4a, 0xe9, 0x6b, 0x67, 0x01, 0x0c, 0xcd, 0x46, 0x04, 0x02, 0x1e, 0x70, 0xb7, 0xd8, 0x2f, 0xd4, 0xb6, 0x51, 0x06, 0x07, 0x52, 0xaf, 0xbf, 0x02, 0x01, 0x6d, 0xf4, 0x00, 0x03, 0x00, 0x99, 0x00, 0x00, 0x04, 0x85, 0x05, 0xd9, 0x00, 0x5b, 0x00, 0x66, 0x00, 0x6e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x0f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x17, 0x23, 0x15, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x33, 0x16, 0x11, 0x10, 0x03, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x15, 0x06, 0x23, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x15, 0x14, 0x15, 0x14, 0x17, 0x14, 0x23, 0x22, 0x35, 0x36, 0x3d, 0x01, 0x06, 0x15, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x34, 0x36, 0x35, 0x34, 0x23, 0x22, 0x07, 0x02, 0x11, 0x34, 0x37, 0x33, 0x17, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x35, 0x23, 0x35, 0x26, 0x35, 0x34, 0x37, 0x2f, 0x01, 0x36, 0x03, 0x14, 0x17, 0x33, 0x36, 0x35, 0x34, 0x27, 0x06, 0x07, 0x06, 0x25, 0x06, 0x15, 0x14, 0x17, 0x36, 0x35, 0x34, 0x02, 0x8f, 0x3c, 0x49, 0x11, 0x0d, 0x72, 0x2e, 0x32, 0xb8, 0x01, 0x6c, 0x6d, 0x80, 0x79, 0x71, 0x13, 0x05, 0xd2, 0x86, 0x6c, 0x47, 0x32, 0x6c, 0x1b, 0x0c, 0x26, 0x0a, 0x08, 0x28, 0x06, 0x35, 0x54, 0x48, 0x5e, 0x64, 0x48, 0x8a, 0x07, 0x33, 0x05, 0x25, 0x0d, 0x87, 0x29, 0x4a, 0x68, 0x8b, 0xcd, 0x05, 0x13, 0x71, 0xc1, 0x38, 0x6d, 0x6b, 0xb7, 0xd6, 0x16, 0x0e, 0x4e, 0xb9, 0x79, 0x04, 0x3f, 0x1a, 0x50, 0x2e, 0x24, 0x01, 0x4b, 0x1f, 0x3b, 0x81, 0x05, 0xd9, 0x4b, 0x0f, 0x7c, 0x2e, 0x50, 0x51, 0x55, 0xc7, 0x62, 0x4b, 0x78, 0x81, 0x9d, 0xc6, 0xb0, 0x72, 0x13, 0xa5, 0xfe, 0xfe, 0xfe, 0xe0, 0xfe, 0xc9, 0xae, 0x2d, 0x1c, 0x93, 0x26, 0x2a, 0x02, 0x03, 0x3b, 0x02, 0x22, 0xee, 0x31, 0x96, 0x03, 0x04, 0x46, 0x71, 0x3b, 0x3c, 0x74, 0x4d, 0x92, 0x5d, 0xbf, 0x23, 0x3b, 0x40, 0xa4, 0x22, 0x2b, 0xad, 0x01, 0x21, 0x01, 0x4d, 0xe9, 0xa6, 0x13, 0x79, 0xae, 0xfb, 0xa3, 0x2f, 0x12, 0x78, 0x4b, 0x5c, 0xcc, 0xbe, 0x67, 0x7c, 0x12, 0x48, 0xfd, 0xff, 0x92, 0x4a, 0x69, 0x8b, 0x53, 0x7e, 0x19, 0x4a, 0x3f, 0xa2, 0x73, 0x63, 0x89, 0x66, 0x3d, 0xa8, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xd7, 0x00, 0x32, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x17, 0x07, 0x23, 0x27, 0x06, 0x23, 0x22, 0x27, 0x15, 0x03, 0x23, 0x26, 0x27, 0x36, 0x01, 0x36, 0x33, 0x16, 0x33, 0x32, 0x37, 0x27, 0x07, 0x23, 0x26, 0x27, 0x13, 0x04, 0x15, 0x07, 0x16, 0x17, 0x35, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x36, 0x03, 0x84, 0xd5, 0xbc, 0x87, 0x70, 0xae, 0x7e, 0x02, 0xa7, 0x94, 0xc3, 0x9a, 0x80, 0xea, 0x03, 0xb7, 0x04, 0x17, 0x01, 0x37, 0x15, 0x07, 0x65, 0x8f, 0xac, 0x87, 0xc3, 0x61, 0x05, 0xa9, 0x08, 0xd2, 0x00, 0xff, 0x72, 0xcf, 0x1a, 0x3c, 0xe2, 0x7c, 0x6b, 0x21, 0x58, 0x6c, 0x99, 0x05, 0xd7, 0xbd, 0x9b, 0xd7, 0xc9, 0x8a, 0x94, 0x83, 0xaa, 0x6e, 0x58, 0x03, 0xfe, 0x31, 0x8d, 0x07, 0x19, 0x01, 0x98, 0x1d, 0x55, 0x68, 0xc6, 0x73, 0x74, 0x0c, 0x01, 0x02, 0x0e, 0x05, 0x9f, 0xaf, 0x0e, 0x02, 0x5a, 0x7c, 0x24, 0xfe, 0x65, 0x45, 0x37, 0x8f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x14, 0x17, 0x01, 0x03, 0x06, 0x00, 0x13, 0x16, 0x17, 0x1b, 0x01, 0x36, 0x37, 0x09, 0x01, 0x36, 0x35, 0x34, 0x00, 0x27, 0x11, 0x99, 0x01, 0x8a, 0x01, 0x17, 0x01, 0x18, 0x01, 0x89, 0xfe, 0x77, 0xfe, 0xe8, 0xfe, 0xe9, 0xfe, 0x76, 0x89, 0x6d, 0x01, 0x7f, 0x02, 0xb0, 0xfe, 0xc6, 0x9c, 0x9e, 0xad, 0x01, 0x56, 0xb8, 0x9a, 0xfe, 0xae, 0x01, 0x8f, 0x65, 0xfe, 0xc4, 0xbd, 0x02, 0xea, 0x01, 0x37, 0x01, 0xb7, 0xfe, 0x49, 0xfe, 0xc9, 0xfe, 0xca, 0xfe, 0x4c, 0x01, 0xb4, 0x01, 0x36, 0xe5, 0x78, 0x01, 0xf5, 0x01, 0xc2, 0x04, 0xfe, 0xa3, 0xfd, 0x62, 0xb1, 0x06, 0x02, 0x68, 0xfd, 0x96, 0x08, 0xa4, 0x01, 0xb6, 0xfe, 0x97, 0x70, 0xf5, 0xf9, 0x01, 0x5d, 0x04, 0xfe, 0x42, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x28, 0x00, 0x34, 0x00, 0x00, 0x01, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x25, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x3a, 0x09, 0xb1, 0x82, 0x84, 0xb4, 0xfe, 0x8c, 0xff, 0x00, 0xfe, 0xfb, 0xfe, 0xa2, 0x12, 0x16, 0x9f, 0x86, 0x81, 0xb2, 0x01, 0x9c, 0x37, 0x22, 0x26, 0x36, 0x36, 0x26, 0x24, 0x35, 0xfd, 0x8b, 0x35, 0x4a, 0x34, 0x34, 0x4a, 0x35, 0x03, 0x81, 0xfe, 0x77, 0xfe, 0xe8, 0xfe, 0xe9, 0xfe, 0x76, 0x01, 0x8a, 0x01, 0x17, 0x01, 0x18, 0x01, 0x89, 0x02, 0xf8, 0x1a, 0x8e, 0xc1, 0xcf, 0x9a, 0x01, 0x16, 0x01, 0x98, 0xfe, 0x7b, 0xfe, 0xc9, 0xac, 0xb2, 0xc0, 0x9e, 0x29, 0x3a, 0x3a, 0x29, 0x2a, 0x3c, 0x3c, 0x2a, 0x2a, 0x3c, 0x3c, 0x2a, 0x29, 0x3a, 0x3c, 0x27, 0xfe, 0xca, 0xfe, 0x4c, 0x01, 0xb4, 0x01, 0x36, 0x01, 0x37, 0x01, 0xb7, 0xfe, 0x49, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd4, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x01, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0c, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x0a, 0x00, 0x79, 0xff, 0xea, 0x05, 0xfb, 0x05, 0xe1, 0x00, 0x0c, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x64, 0x00, 0x6a, 0x00, 0x70, 0x00, 0x00, 0x00, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x05, 0x26, 0x34, 0x37, 0x33, 0x36, 0x37, 0x27, 0x36, 0x37, 0x17, 0x36, 0x37, 0x35, 0x36, 0x32, 0x17, 0x15, 0x16, 0x17, 0x37, 0x16, 0x17, 0x07, 0x16, 0x17, 0x33, 0x16, 0x14, 0x07, 0x23, 0x06, 0x07, 0x17, 0x06, 0x07, 0x27, 0x06, 0x07, 0x15, 0x06, 0x23, 0x27, 0x35, 0x26, 0x27, 0x07, 0x26, 0x27, 0x37, 0x26, 0x27, 0x01, 0x36, 0x37, 0x03, 0x06, 0x07, 0x05, 0x16, 0x17, 0x37, 0x26, 0x27, 0x01, 0x36, 0x37, 0x27, 0x06, 0x07, 0x25, 0x16, 0x17, 0x37, 0x26, 0x27, 0x01, 0x26, 0x27, 0x07, 0x16, 0x17, 0x25, 0x06, 0x07, 0x17, 0x36, 0x37, 0x05, 0x06, 0x07, 0x13, 0x36, 0x37, 0x25, 0x26, 0x27, 0x07, 0x16, 0x17, 0x02, 0xa8, 0x2c, 0x2a, 0x3c, 0x3c, 0x54, 0x2b, 0x2a, 0x3b, 0x3c, 0x2a, 0xfd, 0xbf, 0x19, 0x19, 0x65, 0x18, 0x60, 0x4c, 0x0e, 0x59, 0x4a, 0x6f, 0xaf, 0x23, 0x46, 0x24, 0xa4, 0x7c, 0x47, 0x5b, 0x10, 0x4d, 0x5f, 0x19, 0x65, 0x19, 0x19, 0x65, 0x12, 0x66, 0x4d, 0x10, 0x5b, 0x47, 0x7d, 0xa3, 0x24, 0x23, 0x46, 0xa3, 0x7c, 0x49, 0x57, 0x10, 0x49, 0x5d, 0x18, 0x01, 0xc8, 0x1e, 0x20, 0x0b, 0x80, 0x58, 0x01, 0x5a, 0x25, 0x1a, 0xa4, 0x5a, 0x7e, 0xfe, 0xd1, 0x07, 0x14, 0xb7, 0x44, 0x15, 0x02, 0xab, 0x16, 0x05, 0xf7, 0x11, 0x49, 0xfd, 0xad, 0x12, 0x09, 0xf5, 0x14, 0x44, 0x02, 0x6e, 0x07, 0x14, 0xb8, 0x4a, 0x0f, 0xfe, 0x9c, 0x1e, 0x21, 0x0b, 0x7e, 0x5a, 0xfe, 0xa5, 0x1a, 0x23, 0xa6, 0x5a, 0x7f, 0x03, 0x26, 0x84, 0x2f, 0x2f, 0x5e, 0x84, 0x30, 0x30, 0x30, 0xc3, 0x27, 0x4e, 0x27, 0xb7, 0x7c, 0x50, 0x5f, 0x10, 0x50, 0x66, 0x1e, 0x70, 0x1c, 0x1c, 0x70, 0x16, 0x6f, 0x51, 0x0f, 0x60, 0x51, 0x79, 0xb9, 0x27, 0x4e, 0x27, 0xb0, 0x83, 0x50, 0x5c, 0x0b, 0x51, 0x67, 0x1d, 0x70, 0x1c, 0x1c, 0x70, 0x17, 0x6d, 0x51, 0x0b, 0x5c, 0x50, 0x79, 0xba, 0x01, 0x2c, 0x13, 0x0a, 0x01, 0x0d, 0x16, 0x4d, 0xaa, 0x0a, 0x13, 0xc6, 0x4e, 0x15, 0xfe, 0x3e, 0x26, 0x1a, 0xab, 0x60, 0x82, 0x37, 0x1e, 0x22, 0x0a, 0x7f, 0x62, 0xfe, 0x4b, 0x1e, 0x2a, 0x11, 0x8c, 0x56, 0xf4, 0x26, 0x22, 0xac, 0x67, 0x7b, 0x89, 0x12, 0x0b, 0xfe, 0xf0, 0x1e, 0x4d, 0xa5, 0x09, 0x14, 0xc2, 0x4d, 0x1e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x07, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x20, 0x2e, 0xa4, 0x01, 0xd0, 0xa4, 0x2d, 0x21, 0x67, 0x1a, 0x23, 0x80, 0xfe, 0x94, 0x80, 0x23, 0x1a, 0x03, 0xfd, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0x25, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x8d, 0x28, 0x2b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x67, 0x1a, 0x23, 0x80, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x67, 0x21, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2e, 0x03, 0xfd, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0xaa, 0x47, 0x2b, 0x27, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x21, 0x00, 0x31, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x25, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x27, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x49, 0x35, 0x34, 0x4b, 0x4b, 0x68, 0x4a, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x4e, 0x20, 0x2e, 0xa4, 0x01, 0xd0, 0xa4, 0x2d, 0x21, 0x67, 0x1a, 0x23, 0x80, 0xfe, 0x94, 0x80, 0x23, 0x1a, 0x03, 0xfd, 0x3a, 0x53, 0x52, 0x76, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0xfe, 0xb2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x5b, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x8e, 0x27, 0x2b, 0x00, 0x0a, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x49, 0x00, 0x58, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x05, 0x17, 0x15, 0x07, 0x27, 0x25, 0x17, 0x07, 0x23, 0x26, 0x27, 0x35, 0x05, 0x32, 0x1f, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x25, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x03, 0x33, 0x16, 0x17, 0x15, 0x07, 0x27, 0x35, 0x25, 0x33, 0x17, 0x15, 0x07, 0x27, 0x35, 0x25, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x03, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x27, 0x26, 0x23, 0x22, 0x03, 0x1b, 0x46, 0x05, 0x05, 0x46, 0x06, 0x02, 0x00, 0x34, 0xdf, 0x37, 0xfd, 0x48, 0xe4, 0x38, 0x03, 0xb4, 0x28, 0x01, 0xf8, 0xc2, 0x53, 0x0b, 0xb0, 0x41, 0x2b, 0xa3, 0x5b, 0x21, 0xaa, 0x3f, 0xfd, 0x90, 0x01, 0x32, 0x05, 0x05, 0xfe, 0xce, 0x05, 0x04, 0x05, 0x01, 0x37, 0x06, 0x06, 0xfe, 0xc9, 0x06, 0x40, 0x03, 0x79, 0x66, 0x37, 0xdf, 0xfd, 0xef, 0x03, 0x35, 0xdf, 0x36, 0x01, 0xe5, 0x46, 0x05, 0x05, 0x46, 0x06, 0x20, 0x75, 0x16, 0x3e, 0x70, 0x1d, 0x2c, 0x79, 0x08, 0x39, 0x84, 0x23, 0x05, 0xd8, 0x06, 0xfe, 0xa1, 0x06, 0x06, 0x01, 0x5f, 0x9c, 0x3e, 0x03, 0xff, 0x3f, 0xee, 0xfe, 0x40, 0xc7, 0x37, 0x04, 0xb5, 0xe2, 0x60, 0xbd, 0x64, 0x18, 0xa8, 0x40, 0x5c, 0xb4, 0x68, 0x1b, 0xfe, 0xed, 0x06, 0x50, 0x06, 0x06, 0x50, 0x06, 0x06, 0x50, 0x06, 0x06, 0x50, 0xfe, 0xe7, 0x82, 0x79, 0x03, 0x3f, 0xfd, 0x04, 0x2b, 0x3c, 0x03, 0xfe, 0x3e, 0x04, 0x77, 0x06, 0xfe, 0xa1, 0x06, 0x06, 0x01, 0x5f, 0x02, 0x56, 0x47, 0x7b, 0x3f, 0x2c, 0x72, 0x11, 0x43, 0x82, 0x41, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x93, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd7, 0x00, 0x17, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x20, 0x13, 0x16, 0x15, 0x10, 0x01, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x35, 0x36, 0x37, 0x36, 0x11, 0x10, 0x25, 0x26, 0x27, 0x35, 0x34, 0x37, 0x17, 0x15, 0x04, 0x11, 0x10, 0x05, 0x07, 0x15, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x10, 0x01, 0x26, 0x23, 0x03, 0x25, 0x01, 0x63, 0xf5, 0x5f, 0xfe, 0x9c, 0xa1, 0x9f, 0x2c, 0x2a, 0x49, 0xf9, 0x71, 0x8b, 0xfe, 0xd4, 0x7b, 0x53, 0x86, 0x24, 0x01, 0x9b, 0xfe, 0xd1, 0x27, 0x05, 0x4e, 0x8e, 0xd2, 0x4a, 0x1a, 0xfe, 0xc7, 0x92, 0x8f, 0x05, 0xd7, 0xfe, 0x87, 0xad, 0xc6, 0xfe, 0x78, 0xfe, 0xff, 0x62, 0x0f, 0x06, 0x4f, 0xb1, 0xca, 0x01, 0x0c, 0x01, 0x90, 0xe0, 0x50, 0x10, 0x03, 0x0b, 0x0e, 0x3e, 0x03, 0xc5, 0xfe, 0x14, 0xfe, 0x6e, 0xe8, 0x18, 0x04, 0x53, 0x98, 0xf4, 0x5d, 0x5d, 0x09, 0x01, 0x3d, 0x01, 0x05, 0x66, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x03, 0xe2, 0x05, 0xd8, 0x00, 0x17, 0x00, 0x2b, 0x00, 0x00, 0x21, 0x20, 0x03, 0x26, 0x35, 0x10, 0x01, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x06, 0x07, 0x06, 0x11, 0x10, 0x05, 0x16, 0x17, 0x15, 0x14, 0x07, 0x27, 0x35, 0x24, 0x11, 0x10, 0x25, 0x37, 0x35, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x1d, 0x01, 0x10, 0x01, 0x16, 0x33, 0x03, 0x51, 0xfe, 0x9c, 0xf5, 0x5f, 0x01, 0x64, 0xa1, 0xa0, 0x2c, 0x29, 0x48, 0xf8, 0x71, 0x8b, 0x01, 0x2d, 0x7a, 0x54, 0x86, 0x24, 0xfe, 0x64, 0x01, 0x2f, 0x27, 0x05, 0x4e, 0x8f, 0xd0, 0x4b, 0x19, 0x01, 0x37, 0x94, 0x8e, 0x01, 0x79, 0xad, 0xc6, 0x01, 0x88, 0x01, 0x01, 0x63, 0x0f, 0x07, 0x4f, 0xb1, 0xcb, 0xfe, 0xf5, 0xfe, 0x70, 0xe1, 0x4f, 0x10, 0x04, 0x0a, 0x0e, 0x3e, 0x03, 0xc5, 0x01, 0xed, 0x01, 0x91, 0xe8, 0x18, 0x03, 0x53, 0x96, 0xf5, 0x5c, 0x5e, 0x09, 0xfe, 0xc2, 0xfe, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0x30, 0x03, 0xce, 0x05, 0xdb, 0x00, 0x31, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x15, 0x37, 0x15, 0x07, 0x15, 0x23, 0x27, 0x23, 0x35, 0x33, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x07, 0x06, 0x07, 0x23, 0x06, 0x07, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x10, 0x27, 0x26, 0x03, 0x12, 0x24, 0x20, 0x78, 0x77, 0x61, 0x81, 0xc3, 0xc6, 0x74, 0x01, 0xb5, 0xb5, 0x01, 0x85, 0x62, 0x77, 0x77, 0x21, 0x24, 0x24, 0x21, 0x77, 0x7f, 0x52, 0x4d, 0x69, 0x22, 0x69, 0x4c, 0x52, 0x80, 0x78, 0x20, 0xef, 0x22, 0x69, 0x4d, 0x52, 0xa5, 0x75, 0x72, 0xa5, 0x52, 0x4c, 0x04, 0x56, 0x1a, 0x24, 0x83, 0xbd, 0xbc, 0x7c, 0x64, 0x0e, 0xd1, 0x02, 0x64, 0x01, 0xca, 0xcb, 0x62, 0xd1, 0x0d, 0x65, 0x7c, 0xbc, 0xbd, 0x83, 0x24, 0x1a, 0x19, 0x25, 0x83, 0xbc, 0x08, 0x0a, 0x82, 0x5a, 0x53, 0x07, 0x07, 0x53, 0x5a, 0x82, 0x0a, 0x08, 0xbc, 0x83, 0x25, 0x5f, 0x06, 0x54, 0x59, 0xfe, 0xfc, 0xaa, 0xaa, 0x01, 0x04, 0x59, 0x54, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xff, 0x04, 0xa9, 0x05, 0xda, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, 0x26, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x10, 0x07, 0x06, 0x07, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x02, 0xa3, 0x94, 0xcf, 0xcf, 0x94, 0x91, 0xd2, 0xd2, 0xfe, 0x02, 0x98, 0x01, 0x2e, 0xd7, 0xd4, 0x01, 0x31, 0x98, 0x7a, 0xa2, 0xf5, 0xf5, 0xa2, 0xf5, 0xf5, 0xa3, 0x05, 0x27, 0xe4, 0xa4, 0xa3, 0xd8, 0xd8, 0xa3, 0xa4, 0xe4, 0xfc, 0xed, 0x9d, 0xee, 0xef, 0x01, 0x4c, 0xfe, 0xb4, 0xfe, 0x22, 0x9c, 0x7e, 0x12, 0xfe, 0xf8, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x09, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xe3, 0x04, 0xa9, 0x06, 0xbe, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x00, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x10, 0x37, 0x36, 0x37, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x16, 0x02, 0xa3, 0x94, 0xcf, 0xcf, 0x94, 0x91, 0xd2, 0xd2, 0x01, 0xfe, 0x98, 0xfe, 0xd2, 0xd7, 0xd4, 0xfe, 0xcf, 0x98, 0x7a, 0xa2, 0xf4, 0xf4, 0xa2, 0xf5, 0xf5, 0xa3, 0x96, 0xe4, 0xa4, 0xa3, 0xd8, 0xd8, 0xa3, 0xa4, 0xe4, 0x03, 0x13, 0x9d, 0xee, 0xef, 0xfe, 0xb4, 0x01, 0x4c, 0x01, 0xde, 0x9c, 0x7e, 0x12, 0x01, 0x08, 0x7c, 0x01, 0x01, 0xfe, 0xff, 0x7c, 0xfe, 0xf7, 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x91, 0xff, 0xe3, 0x05, 0xfb, 0x05, 0xc3, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x13, 0x06, 0x23, 0x22, 0x00, 0x10, 0x00, 0x17, 0x16, 0x17, 0x01, 0x21, 0x37, 0x21, 0x11, 0x07, 0x11, 0x01, 0x16, 0x15, 0x14, 0x02, 0x97, 0x93, 0xd0, 0xd0, 0x93, 0x91, 0xd3, 0xd3, 0xe2, 0x97, 0xdc, 0xd3, 0xfe, 0xce, 0x01, 0x36, 0xcf, 0xcd, 0x65, 0x01, 0x45, 0xfe, 0xb2, 0x7e, 0x01, 0xbd, 0x81, 0xfe, 0xbe, 0x65, 0x03, 0x96, 0xe4, 0xfe, 0xb8, 0xd8, 0xd8, 0x01, 0x48, 0xe4, 0xfc, 0xf1, 0xa4, 0x01, 0x3d, 0x01, 0xdc, 0x01, 0x55, 0x09, 0x08, 0x67, 0x01, 0x5c, 0x8e, 0xfe, 0x14, 0x8f, 0x01, 0x75, 0xfe, 0xa4, 0x92, 0xc1, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x31, 0x00, 0x00, 0x05, 0x42, 0x05, 0xd8, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x35, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x07, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x35, 0x02, 0xbf, 0x6e, 0x99, 0x98, 0x6f, 0x6d, 0x9a, 0x87, 0xe8, 0xa6, 0xa8, 0xe8, 0x62, 0xcd, 0x88, 0x88, 0xfc, 0x77, 0x02, 0x13, 0x01, 0xab, 0xf2, 0xab, 0xab, 0x79, 0x02, 0xb9, 0x01, 0x04, 0xfe, 0xfc, 0xb9, 0xa8, 0x7b, 0x03, 0xc5, 0xfa, 0x28, 0x01, 0x7c, 0x97, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x93, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd8, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, 0x06, 0x1d, 0x01, 0x23, 0x34, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x01, 0xf3, 0x60, 0x60, 0x88, 0xa1, 0xa1, 0x64, 0x89, 0xa0, 0xd7, 0x7e, 0x87, 0x7e, 0x8b, 0x64, 0x63, 0x8b, 0x88, 0x04, 0x8d, 0x97, 0xb4, 0xb4, 0x97, 0xfe, 0x7d, 0x6d, 0xfe, 0xfe, 0xbb, 0x5a, 0xe5, 0x79, 0x02, 0x84, 0xee, 0x48, 0x7b, 0xa9, 0xaa, 0x7a, 0xfe, 0x46, 0x00, 0x00, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x00, 0x05, 0x94, 0x05, 0xd8, 0x00, 0x0a, 0x00, 0x31, 0x00, 0x00, 0x00, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x16, 0x17, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x34, 0x37, 0x36, 0x37, 0x11, 0x21, 0x11, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x11, 0x21, 0x03, 0x6c, 0x65, 0x47, 0x47, 0x32, 0x32, 0x47, 0x34, 0x37, 0x2b, 0x44, 0x89, 0x62, 0x60, 0x8a, 0x45, 0x2a, 0x38, 0xfe, 0xfd, 0xfe, 0xec, 0x8c, 0x8c, 0x01, 0x14, 0x01, 0x03, 0x88, 0x01, 0x03, 0x01, 0x12, 0x89, 0x89, 0xfe, 0xee, 0xfe, 0xfd, 0x01, 0x8c, 0x4f, 0x37, 0x39, 0x4e, 0x4e, 0x39, 0x37, 0xc2, 0x12, 0x30, 0x4c, 0xd8, 0x99, 0x99, 0xd8, 0x4c, 0x31, 0x11, 0x01, 0x8c, 0xfe, 0x4b, 0x97, 0x02, 0xd3, 0x98, 0xfe, 0x4a, 0x01, 0xb6, 0xfe, 0x4a, 0x01, 0xb6, 0x98, 0xfd, 0x2d, 0x97, 0x01, 0xb5, 0x00, 0x01, 0x00, 0xea, 0x00, 0x00, 0x05, 0x8a, 0x05, 0xd8, 0x00, 0x3c, 0x00, 0x00, 0x25, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x26, 0x27, 0x26, 0x27, 0x35, 0x07, 0x27, 0x37, 0x33, 0x17, 0x15, 0x27, 0x15, 0x33, 0x15, 0x23, 0x16, 0x17, 0x16, 0x17, 0x11, 0x07, 0x27, 0x37, 0x33, 0x17, 0x15, 0x27, 0x11, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x35, 0x07, 0x27, 0x37, 0x33, 0x17, 0x15, 0x27, 0x15, 0x33, 0x15, 0x06, 0x07, 0x06, 0x07, 0x15, 0x33, 0x15, 0x03, 0x7f, 0x88, 0x9f, 0x9f, 0x95, 0x6e, 0x87, 0x01, 0x81, 0x01, 0x82, 0x89, 0x82, 0x82, 0x02, 0x02, 0x01, 0x5e, 0x46, 0x5d, 0x83, 0x01, 0x84, 0x88, 0x82, 0x82, 0x5b, 0x45, 0x5f, 0x01, 0x81, 0x01, 0x82, 0x89, 0x82, 0x82, 0x01, 0x01, 0x87, 0x6e, 0x94, 0x9d, 0xbb, 0xbb, 0xbb, 0x97, 0x8b, 0x16, 0x7a, 0x96, 0xd7, 0x54, 0x8e, 0x8c, 0x99, 0x99, 0x8c, 0x8e, 0x54, 0x02, 0x97, 0x68, 0x4f, 0x14, 0x02, 0xca, 0x8d, 0x8b, 0x9a, 0x9a, 0x8b, 0x8d, 0xfd, 0x37, 0x14, 0x4e, 0x6a, 0x96, 0x01, 0x59, 0x8e, 0x8c, 0x99, 0x99, 0x8c, 0x8e, 0x59, 0x04, 0xd3, 0x96, 0x79, 0x17, 0x8b, 0x97, 0x00, 0x00, 0x00, 0x02, 0x01, 0xba, 0x00, 0x00, 0x04, 0xb9, 0x05, 0xd8, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x21, 0x20, 0x17, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23, 0x21, 0x11, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x11, 0x17, 0x11, 0x21, 0x32, 0x37, 0x36, 0x37, 0x34, 0x27, 0x26, 0x23, 0x01, 0xc2, 0x01, 0x70, 0x01, 0x10, 0x5a, 0x1d, 0xe2, 0x35, 0x31, 0xfe, 0xcc, 0x02, 0x3b, 0x07, 0x07, 0xfd, 0x4a, 0x07, 0x82, 0x01, 0x26, 0x75, 0x40, 0x0f, 0x07, 0x92, 0x21, 0x49, 0x05, 0xd8, 0xd0, 0x4d, 0x5f, 0xfe, 0xf6, 0x5c, 0x11, 0xfd, 0xad, 0x08, 0x82, 0x08, 0x08, 0x05, 0xc7, 0x83, 0xfe, 0x24, 0x82, 0x1a, 0x50, 0xa4, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0x00, 0x00, 0x06, 0x20, 0x05, 0xda, 0x00, 0x24, 0x00, 0x00, 0x21, 0x10, 0x00, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x33, 0x20, 0x13, 0x16, 0x17, 0x36, 0x37, 0x12, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x23, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x00, 0x11, 0x03, 0x01, 0xfe, 0xfe, 0x98, 0x74, 0x1f, 0x4c, 0x79, 0x53, 0x92, 0x84, 0x01, 0x4f, 0x75, 0x08, 0x04, 0x04, 0x07, 0x77, 0x01, 0x4e, 0x84, 0x92, 0x54, 0x78, 0x4c, 0x1f, 0x75, 0x97, 0xfe, 0xff, 0x02, 0x58, 0x03, 0x05, 0xc5, 0x22, 0x80, 0x80, 0x84, 0xa1, 0x84, 0xbb, 0xfc, 0xfb, 0x31, 0x28, 0x28, 0x31, 0x03, 0x05, 0xbb, 0x84, 0xa1, 0x84, 0x80, 0x81, 0x22, 0xc4, 0xfc, 0xfb, 0xfd, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xa4, 0x00, 0x00, 0x05, 0xd0, 0x05, 0xd8, 0x00, 0x08, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x22, 0x06, 0x10, 0x16, 0x20, 0x36, 0x10, 0x26, 0x27, 0x36, 0x37, 0x3e, 0x02, 0x33, 0x15, 0x22, 0x02, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x02, 0x23, 0x35, 0x32, 0x1e, 0x01, 0x17, 0x16, 0x03, 0x39, 0x84, 0xb9, 0xb9, 0x01, 0x09, 0xba, 0xb9, 0x86, 0x76, 0x45, 0x4d, 0x57, 0x91, 0xa7, 0x6f, 0x96, 0x76, 0x13, 0x15, 0x2a, 0x26, 0x84, 0xfe, 0xf6, 0xbe, 0xbb, 0xfe, 0xf6, 0x85, 0x25, 0x2b, 0x16, 0x13, 0x74, 0x9a, 0x6d, 0xa6, 0xa8, 0x40, 0x4d, 0x45, 0x03, 0x5c, 0xcf, 0xfe, 0xda, 0xce, 0xce, 0x01, 0x26, 0xcf, 0x96, 0x05, 0x3d, 0x42, 0xb4, 0xae, 0x6c, 0xfe, 0xc8, 0x6c, 0x13, 0x0f, 0x1e, 0x29, 0x95, 0xd2, 0xd1, 0xfe, 0xd9, 0x01, 0x27, 0xd1, 0xd2, 0x95, 0x2a, 0x1e, 0x0e, 0x13, 0x6c, 0x01, 0x38, 0x6c, 0xae, 0xb4, 0x42, 0x3d, 0x00, 0x00, 0x02, 0x00, 0xac, 0x00, 0x00, 0x05, 0xc6, 0x05, 0xda, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x26, 0x27, 0x35, 0x04, 0x20, 0x25, 0x15, 0x06, 0x07, 0x11, 0x16, 0x17, 0x15, 0x24, 0x20, 0x05, 0x35, 0x36, 0x3f, 0x01, 0x36, 0x33, 0x17, 0x11, 0x06, 0x23, 0x27, 0x01, 0xdd, 0x97, 0x99, 0x01, 0x38, 0x02, 0xac, 0x01, 0x35, 0x9f, 0x95, 0x95, 0x9f, 0xfe, 0xcb, 0xfd, 0x54, 0xfe, 0xc8, 0x99, 0x97, 0x89, 0x68, 0x6a, 0xd1, 0x68, 0x69, 0xd2, 0x04, 0xfc, 0x16, 0x34, 0x94, 0x5a, 0x5a, 0x97, 0x2f, 0x18, 0xfb, 0xe2, 0x17, 0x2f, 0x98, 0x5b, 0x5b, 0x94, 0x35, 0x15, 0x0c, 0x0d, 0x0d, 0x04, 0x07, 0x0d, 0x0d, 0x00, 0x04, 0x00, 0xcf, 0x00, 0x40, 0x05, 0xa5, 0x05, 0x6f, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x36, 0x34, 0x01, 0x2c, 0x01, 0x27, 0x35, 0x16, 0x04, 0x33, 0x32, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x10, 0x07, 0x0e, 0x01, 0x01, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x01, 0x0c, 0x01, 0x17, 0x15, 0x26, 0x24, 0x23, 0x22, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x04, 0xbb, 0xab, 0x76, 0x76, 0x56, 0x54, 0x78, 0xfe, 0x88, 0xfe, 0xe7, 0xfe, 0xb9, 0x8a, 0xe4, 0x01, 0x47, 0x35, 0x75, 0x07, 0x76, 0xb9, 0x84, 0x86, 0xb9, 0x5d, 0x42, 0xdd, 0xfd, 0xe6, 0x55, 0x78, 0x78, 0xa9, 0x79, 0x78, 0x01, 0x01, 0x01, 0x19, 0x01, 0x48, 0x89, 0xe3, 0xfe, 0xba, 0x34, 0x78, 0x07, 0x76, 0xb8, 0x85, 0x86, 0xb9, 0x5e, 0x41, 0xdd, 0x02, 0xb8, 0x84, 0xbe, 0x85, 0x85, 0xbe, 0xfe, 0x0c, 0x02, 0x28, 0x2b, 0x7c, 0x54, 0x16, 0x1a, 0x6c, 0xa7, 0x93, 0xcf, 0xcf, 0xfe, 0xda, 0x67, 0x4d, 0x4c, 0x02, 0xb6, 0x84, 0xbe, 0x84, 0x84, 0xbe, 0x84, 0x02, 0x78, 0x02, 0x29, 0x2b, 0x7b, 0x54, 0x15, 0x1a, 0x6c, 0xa6, 0x94, 0xcf, 0xcf, 0x94, 0x92, 0x67, 0x4d, 0x4d, 0x00, 0x02, 0x01, 0x01, 0x00, 0x00, 0x05, 0x73, 0x05, 0xd8, 0x00, 0x13, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x00, 0x15, 0x16, 0x17, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x32, 0x35, 0x34, 0x26, 0x02, 0x52, 0x44, 0x2c, 0x0c, 0x1a, 0x66, 0x23, 0x20, 0x20, 0x43, 0x2c, 0x0c, 0x1b, 0x64, 0x23, 0x20, 0x2b, 0xc9, 0xa2, 0x9a, 0xc4, 0xfe, 0xfc, 0x03, 0x79, 0x40, 0x5a, 0x3a, 0x72, 0x64, 0x59, 0x82, 0x01, 0x03, 0x94, 0x77, 0x72, 0x87, 0x29, 0x17, 0x21, 0x08, 0x1d, 0x2e, 0x68, 0x32, 0x33, 0x36, 0x9b, 0x2b, 0x14, 0x19, 0x2e, 0x69, 0x31, 0x32, 0x44, 0x43, 0x07, 0x45, 0x01, 0x8c, 0x1d, 0x71, 0x27, 0x23, 0x23, 0x4b, 0x32, 0x0e, 0x1e, 0x6f, 0x27, 0x23, 0x24, 0x4c, 0x31, 0x02, 0xf0, 0xa1, 0xc9, 0xdd, 0xb0, 0xbb, 0xfe, 0x0a, 0xb4, 0x7c, 0x03, 0x58, 0x48, 0x77, 0x79, 0x6f, 0xc7, 0x01, 0xe1, 0xc2, 0x86, 0xa5, 0x9b, 0x81, 0x3c, 0x91, 0x3e, 0x62, 0x80, 0x11, 0x57, 0x44, 0x73, 0x2d, 0x16, 0x4b, 0x78, 0x36, 0x38, 0x3c, 0x3c, 0x72, 0x2e, 0x15, 0x29, 0x0d, 0x1a, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0xfe, 0x8f, 0x06, 0x12, 0x05, 0xd8, 0x00, 0x3a, 0x00, 0x44, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x11, 0x10, 0x01, 0x16, 0x17, 0x23, 0x26, 0x27, 0x06, 0x07, 0x35, 0x36, 0x37, 0x27, 0x11, 0x34, 0x35, 0x10, 0x27, 0x0e, 0x01, 0x07, 0x11, 0x23, 0x11, 0x10, 0x26, 0x2b, 0x02, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x16, 0x17, 0x3e, 0x01, 0x01, 0x11, 0x36, 0x13, 0x34, 0x26, 0x2b, 0x01, 0x22, 0x06, 0x02, 0x64, 0x39, 0x6b, 0x24, 0xb2, 0x44, 0x37, 0x4a, 0x2b, 0x76, 0x3d, 0x36, 0x5a, 0xfe, 0xa9, 0x01, 0x84, 0x97, 0x2a, 0x42, 0x97, 0x9d, 0xac, 0x6f, 0x08, 0x29, 0x34, 0x78, 0x39, 0x88, 0x1c, 0x1f, 0x01, 0x01, 0x25, 0xa1, 0x11, 0x86, 0x89, 0x80, 0x6a, 0x20, 0x15, 0xa5, 0x02, 0x7d, 0xe8, 0x16, 0x29, 0x19, 0x03, 0x1b, 0x81, 0x05, 0xd8, 0xc6, 0x80, 0x77, 0xcf, 0xa7, 0xdb, 0xca, 0x7d, 0x77, 0xe8, 0xfe, 0xef, 0xfe, 0x68, 0xfe, 0xbf, 0x5e, 0xc1, 0x29, 0xa1, 0x65, 0x07, 0x74, 0x1c, 0x57, 0xd9, 0x03, 0x57, 0x12, 0x11, 0x01, 0x19, 0x01, 0x01, 0xd9, 0xc8, 0xfc, 0x61, 0x03, 0x9a, 0x01, 0x41, 0x6a, 0xe2, 0xd7, 0xfc, 0x74, 0x04, 0x41, 0xbe, 0xbf, 0x4f, 0xb0, 0x5d, 0xbc, 0xfc, 0x92, 0xfd, 0xd0, 0xfa, 0x01, 0x52, 0xc1, 0x8b, 0xce, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x6b, 0x05, 0xdb, 0x05, 0x39, 0x00, 0x03, 0x00, 0x23, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x21, 0x35, 0x21, 0x26, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x07, 0x21, 0x15, 0x21, 0x35, 0x23, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x9a, 0x05, 0x40, 0xfa, 0xc0, 0x01, 0xf5, 0xfe, 0x0b, 0x01, 0x3e, 0x3c, 0xe8, 0xa6, 0xa7, 0xe9, 0x3d, 0x01, 0x5d, 0xfd, 0xeb, 0x01, 0x10, 0x0f, 0x4e, 0x99, 0xdc, 0x99, 0x4d, 0x0e, 0x11, 0x01, 0x03, 0x98, 0x01, 0x8f, 0x98, 0x68, 0x83, 0xb9, 0x01, 0x03, 0xfe, 0xfd, 0xb9, 0x83, 0x68, 0x98, 0x98, 0x0d, 0x11, 0x55, 0x79, 0x7a, 0xaa, 0xaa, 0x7a, 0x79, 0x55, 0x11, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3e, 0xff, 0x3c, 0x06, 0x38, 0x05, 0xd8, 0x00, 0x38, 0x00, 0x00, 0x01, 0x14, 0x16, 0x17, 0x33, 0x35, 0x33, 0x17, 0x07, 0x27, 0x35, 0x23, 0x22, 0x27, 0x26, 0x27, 0x03, 0x34, 0x35, 0x10, 0x27, 0x0e, 0x01, 0x07, 0x11, 0x23, 0x11, 0x10, 0x26, 0x2b, 0x02, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x13, 0x04, 0x80, 0x5d, 0x50, 0x50, 0x03, 0xb7, 0xb7, 0x03, 0x50, 0xb7, 0x3d, 0x28, 0x07, 0x13, 0x29, 0x34, 0x78, 0x39, 0x88, 0x1c, 0x1f, 0x01, 0x01, 0x25, 0xa1, 0x11, 0x86, 0x89, 0x80, 0x6a, 0x20, 0x15, 0xa5, 0x3e, 0x39, 0x6b, 0x24, 0xb2, 0x44, 0x37, 0x4a, 0x01, 0x01, 0x0f, 0x6f, 0x7d, 0x01, 0x76, 0xad, 0xaf, 0x04, 0x76, 0x78, 0x4a, 0x76, 0x03, 0x16, 0x12, 0x11, 0x01, 0x19, 0x01, 0x01, 0xd9, 0xc8, 0xfc, 0x61, 0x03, 0x9a, 0x01, 0x41, 0x6a, 0xe2, 0xd7, 0xfc, 0x74, 0x04, 0x41, 0xbe, 0xbf, 0x4f, 0xb0, 0x5d, 0xbc, 0xc6, 0x80, 0x77, 0xcf, 0xa7, 0xdb, 0xca, 0xfd, 0x84, 0x00, 0x01, 0x00, 0x98, 0xff, 0xff, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x14, 0x00, 0x00, 0x01, 0x11, 0x09, 0x01, 0x07, 0x09, 0x01, 0x2f, 0x02, 0x09, 0x01, 0x3f, 0x02, 0x09, 0x01, 0x21, 0x35, 0x21, 0x11, 0x05, 0x53, 0xfd, 0x85, 0x01, 0x1d, 0x61, 0xfe, 0xe3, 0xfe, 0x82, 0x01, 0x5f, 0x01, 0x01, 0x7e, 0xfe, 0xe2, 0x01, 0x60, 0x01, 0x01, 0x1d, 0x02, 0x7a, 0xfe, 0x37, 0x02, 0xb3, 0x02, 0xd8, 0x01, 0xfc, 0xfd, 0x3f, 0xfe, 0xc3, 0x6c, 0x01, 0x3d, 0xfe, 0x58, 0x01, 0x6a, 0x01, 0x01, 0xa8, 0x01, 0x3d, 0x01, 0x6a, 0x01, 0xfe, 0xc3, 0x02, 0xc1, 0x98, 0xfd, 0x00, 0x00, 0x02, 0x00, 0xac, 0x00, 0x00, 0x05, 0xc6, 0x05, 0xd8, 0x00, 0x29, 0x00, 0x31, 0x00, 0x00, 0x01, 0x32, 0x12, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x0e, 0x01, 0x07, 0x23, 0x35, 0x37, 0x36, 0x13, 0x26, 0x02, 0x23, 0x22, 0x02, 0x15, 0x14, 0x15, 0x07, 0x34, 0x02, 0x27, 0x35, 0x32, 0x16, 0x13, 0x36, 0x37, 0x3e, 0x01, 0x01, 0x16, 0x33, 0x32, 0x37, 0x26, 0x27, 0x22, 0x02, 0xfe, 0x60, 0x49, 0x17, 0x62, 0xaf, 0x6d, 0x8a, 0x81, 0x80, 0x8b, 0x6e, 0x28, 0x71, 0x7c, 0x97, 0x8a, 0x6e, 0x5e, 0x2c, 0x3a, 0x34, 0x21, 0x8a, 0x8f, 0x7e, 0x77, 0x84, 0x91, 0x24, 0x29, 0x29, 0x25, 0x6e, 0x01, 0x34, 0x54, 0x75, 0x91, 0x08, 0x06, 0x8f, 0x89, 0x05, 0xd8, 0xfc, 0x9e, 0x04, 0xdd, 0xbe, 0x67, 0x91, 0xab, 0x85, 0xa0, 0xd7, 0x04, 0x76, 0x01, 0x04, 0x01, 0x78, 0x10, 0x03, 0x15, 0xfe, 0x2d, 0xc3, 0x0f, 0x0e, 0x02, 0xfd, 0x01, 0xf0, 0x06, 0x61, 0xde, 0xfe, 0xed, 0xc9, 0x58, 0x5b, 0x96, 0xfc, 0x26, 0x91, 0xc5, 0x9d, 0x13, 0x00, 0x02, 0x00, 0x9e, 0x01, 0x39, 0x05, 0xd6, 0x04, 0xa2, 0x00, 0x27, 0x00, 0x51, 0x00, 0x00, 0x13, 0x00, 0x33, 0x32, 0x17, 0x16, 0x32, 0x36, 0x33, 0x32, 0x17, 0x16, 0x32, 0x37, 0x36, 0x33, 0x32, 0x13, 0x07, 0x26, 0x23, 0x22, 0x07, 0x06, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x06, 0x23, 0x27, 0x11, 0x00, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x13, 0x07, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x22, 0x06, 0x23, 0x27, 0x9e, 0x01, 0x25, 0x67, 0x29, 0x0c, 0x15, 0x65, 0x9b, 0x32, 0x31, 0x15, 0x18, 0x66, 0x4e, 0x26, 0x25, 0x70, 0x62, 0x55, 0x38, 0x56, 0x2e, 0x36, 0x4d, 0x65, 0x16, 0x1a, 0x35, 0x31, 0x4b, 0x4e, 0x32, 0x32, 0x17, 0x15, 0x31, 0x31, 0xe8, 0x05, 0x30, 0x01, 0x24, 0x68, 0x28, 0x0d, 0x15, 0x33, 0x31, 0x4e, 0x4e, 0x63, 0x15, 0x18, 0x32, 0x34, 0x4d, 0x27, 0x24, 0x71, 0x62, 0x55, 0x38, 0x56, 0x2e, 0x36, 0x4e, 0x31, 0x33, 0x17, 0x19, 0x35, 0x31, 0x4c, 0x4d, 0x33, 0x31, 0x17, 0x15, 0x63, 0xe7, 0x05, 0x30, 0x01, 0x9d, 0x01, 0x0f, 0x28, 0x47, 0x8e, 0x47, 0x47, 0x47, 0x24, 0xfe, 0xc4, 0x33, 0xb9, 0x35, 0x4c, 0x4b, 0x4e, 0x43, 0x47, 0x48, 0x46, 0xd5, 0x62, 0x01, 0xd9, 0x01, 0x0d, 0x27, 0x46, 0x46, 0x48, 0x48, 0x46, 0x46, 0x23, 0xfe, 0xc5, 0x32, 0xb9, 0x36, 0x4d, 0x4c, 0x4e, 0x44, 0x47, 0x48, 0x48, 0xd5, 0x61, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x05, 0x53, 0x05, 0xd8, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x07, 0x02, 0x03, 0x07, 0x00, 0x13, 0x21, 0x35, 0x21, 0x02, 0x01, 0x17, 0x12, 0x13, 0x33, 0x12, 0x13, 0x37, 0x00, 0x03, 0x21, 0x07, 0x21, 0x12, 0x01, 0x27, 0x02, 0x03, 0x03, 0xa6, 0xd9, 0x1d, 0xfa, 0x94, 0x01, 0x14, 0x18, 0xfe, 0xf6, 0x01, 0x0a, 0x19, 0xfe, 0xec, 0x95, 0xfa, 0x1d, 0xda, 0x1c, 0xfb, 0x95, 0xfe, 0xeb, 0x18, 0x01, 0x0a, 0x01, 0xfe, 0xf5, 0x1a, 0x01, 0x15, 0x96, 0xfb, 0x1c, 0x02, 0x99, 0x03, 0xfe, 0xae, 0xfe, 0xbf, 0x03, 0x01, 0x5f, 0x01, 0x37, 0xac, 0x01, 0x36, 0x01, 0x60, 0x03, 0xfe, 0xc0, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x40, 0x03, 0xfe, 0xa0, 0xfe, 0xca, 0xac, 0xfe, 0xc9, 0xfe, 0xa1, 0x03, 0x01, 0x41, 0x01, 0x52, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xc0, 0x05, 0xd8, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x24, 0x00, 0x54, 0x00, 0x64, 0x00, 0x00, 0x01, 0x36, 0x37, 0x26, 0x27, 0x26, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x21, 0x33, 0x21, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x07, 0x16, 0x17, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x1d, 0x01, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x02, 0xfb, 0x01, 0x02, 0x20, 0x2e, 0x42, 0x8c, 0x85, 0x4b, 0x49, 0x43, 0x14, 0x14, 0x01, 0x35, 0x7f, 0x01, 0x34, 0x16, 0x13, 0x43, 0x49, 0x4b, 0x84, 0x47, 0x46, 0x42, 0x2f, 0x1f, 0x02, 0x01, 0xfe, 0x6c, 0x02, 0xa9, 0xfd, 0x0d, 0x26, 0x22, 0x3e, 0x61, 0x63, 0xb2, 0x5e, 0x48, 0x44, 0x20, 0x1d, 0x0c, 0x0e, 0x61, 0x61, 0x5f, 0x61, 0x61, 0x0e, 0x0c, 0x1c, 0x21, 0x45, 0x47, 0x5d, 0xb2, 0x64, 0x62, 0x3d, 0x23, 0x25, 0xfe, 0x0d, 0x17, 0x29, 0x14, 0x16, 0x28, 0x16, 0x16, 0x28, 0x16, 0x14, 0x29, 0x17, 0x03, 0xc7, 0x03, 0x03, 0x2b, 0x1c, 0x29, 0x51, 0x95, 0x50, 0x51, 0x92, 0x28, 0x0e, 0x08, 0x08, 0x0e, 0x28, 0x92, 0x51, 0x50, 0x95, 0x51, 0x29, 0x1c, 0x2b, 0x03, 0x03, 0xfd, 0xb8, 0xfe, 0xd1, 0x01, 0x2f, 0xfe, 0x81, 0x01, 0x7f, 0x0d, 0x16, 0x36, 0xc4, 0x6b, 0x6c, 0xc5, 0x6a, 0x1f, 0x02, 0x24, 0x3f, 0x12, 0x07, 0x04, 0x36, 0x46, 0x57, 0x57, 0x46, 0x36, 0x04, 0x07, 0x12, 0x3f, 0x24, 0x02, 0x1f, 0x6a, 0xc5, 0x6c, 0x6b, 0xc4, 0x36, 0x16, 0x0d, 0xfe, 0x81, 0x04, 0x7d, 0x19, 0x2b, 0x19, 0x19, 0x2b, 0x19, 0x18, 0x2d, 0x17, 0x17, 0x2d, 0x00, 0x00, 0x08, 0x00, 0xcb, 0x00, 0x00, 0x05, 0xa9, 0x05, 0xd8, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x52, 0x00, 0x68, 0x00, 0x7c, 0x00, 0x90, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x26, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x13, 0x03, 0x22, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x1b, 0x01, 0x26, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x1b, 0x01, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x03, 0x13, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x23, 0x03, 0x11, 0x21, 0x11, 0x01, 0x35, 0x07, 0x21, 0x27, 0x1d, 0x02, 0x21, 0x35, 0x01, 0x17, 0x03, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x01, 0x17, 0x03, 0x36, 0x37, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x01, 0x37, 0x13, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x14, 0x16, 0x17, 0x16, 0x17, 0x01, 0x33, 0x03, 0x32, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x01, 0x37, 0x13, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x01, 0x2c, 0x56, 0x0b, 0x1b, 0x30, 0x1a, 0x19, 0x31, 0x19, 0x03, 0x34, 0xd7, 0x2e, 0x4b, 0x10, 0x1a, 0x30, 0x1b, 0x1a, 0x2f, 0x1a, 0x01, 0x2a, 0xaa, 0x27, 0x3c, 0x02, 0x1b, 0x30, 0x18, 0x1a, 0x30, 0x1b, 0x03, 0x3c, 0x22, 0xa6, 0x29, 0x1a, 0x31, 0x18, 0x1b, 0x31, 0x1a, 0x0a, 0x4e, 0x52, 0xe7, 0x27, 0x1a, 0x30, 0x19, 0x1b, 0x30, 0x1a, 0x0c, 0x59, 0x90, 0xfc, 0xf9, 0x02, 0xd4, 0xa3, 0xfe, 0xb9, 0xa4, 0x02, 0x8e, 0xfd, 0x4c, 0x45, 0xd0, 0x06, 0x07, 0x10, 0x12, 0x12, 0x1f, 0x12, 0x11, 0x1f, 0x13, 0x12, 0x20, 0x11, 0x06, 0x08, 0x01, 0x17, 0x7a, 0xa8, 0x05, 0x05, 0x0f, 0x11, 0x11, 0x20, 0x10, 0x12, 0x1f, 0x12, 0x11, 0x20, 0x12, 0x06, 0x07, 0x01, 0x82, 0x68, 0x56, 0x05, 0x04, 0x11, 0x21, 0x12, 0x13, 0x20, 0x11, 0x10, 0x20, 0x12, 0x12, 0x10, 0x07, 0x06, 0xfe, 0xbe, 0x5a, 0x2b, 0x11, 0x0e, 0x10, 0x13, 0x14, 0x1f, 0x11, 0x10, 0x22, 0x11, 0x11, 0x12, 0x0c, 0x0e, 0x01, 0x0b, 0x5e, 0x95, 0x0a, 0x0a, 0x11, 0x1f, 0x12, 0x12, 0x1f, 0x11, 0x12, 0x20, 0x11, 0x11, 0x10, 0x04, 0x03, 0x03, 0xfb, 0x02, 0x5f, 0x1c, 0x33, 0x1c, 0x1c, 0x33, 0x1c, 0x40, 0x16, 0xfe, 0x06, 0x02, 0xbe, 0x5d, 0x1c, 0x32, 0x1c, 0x1c, 0x32, 0x1c, 0x2d, 0x22, 0xfd, 0x14, 0x03, 0x34, 0x1e, 0x30, 0x1c, 0x34, 0x1a, 0x1a, 0x34, 0x1c, 0x36, 0x18, 0xfc, 0xca, 0x02, 0xe4, 0x2f, 0x2a, 0x1b, 0x33, 0x1c, 0x1c, 0x33, 0x1b, 0x55, 0x10, 0xfd, 0x4a, 0x02, 0x03, 0x22, 0x2b, 0x1c, 0x33, 0x1b, 0x1b, 0x33, 0x1c, 0x5e, 0xfe, 0x31, 0xfd, 0xd1, 0x02, 0x2f, 0xfe, 0xdf, 0xe1, 0x4b, 0x3d, 0xd3, 0x30, 0xa4, 0xa4, 0x01, 0x54, 0x2a, 0x02, 0x0e, 0x03, 0x04, 0x0a, 0x23, 0x13, 0x14, 0x23, 0x14, 0x14, 0x23, 0x14, 0x13, 0x23, 0x14, 0x01, 0xfd, 0xf8, 0x20, 0x02, 0xf9, 0x02, 0x03, 0x0a, 0x23, 0x26, 0x24, 0x13, 0x13, 0x24, 0x26, 0x23, 0x14, 0x01, 0xfd, 0x13, 0x1b, 0x02, 0xd1, 0x01, 0x14, 0x23, 0x26, 0x24, 0x13, 0x13, 0x24, 0x26, 0x23, 0x0a, 0x05, 0x02, 0xfd, 0x0a, 0x03, 0x42, 0x0a, 0x0a, 0x23, 0x14, 0x13, 0x23, 0x14, 0x14, 0x23, 0x13, 0x14, 0x23, 0x0a, 0x08, 0x02, 0xfc, 0xda, 0x2a, 0x01, 0xea, 0x03, 0x15, 0x22, 0x14, 0x13, 0x24, 0x13, 0x13, 0x24, 0x13, 0x14, 0x22, 0x0b, 0x02, 0x02, 0x00, 0x00, 0x00, 0x05, 0x01, 0x32, 0xff, 0xfe, 0x05, 0x41, 0x05, 0xd6, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x27, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x00, 0x01, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x23, 0x15, 0x07, 0x11, 0x17, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x37, 0x33, 0x11, 0x23, 0x27, 0x35, 0x23, 0x35, 0x33, 0x15, 0x33, 0x01, 0x35, 0x21, 0x15, 0x01, 0x37, 0x35, 0x21, 0x15, 0x17, 0x11, 0x07, 0x15, 0x21, 0x35, 0x27, 0x35, 0x11, 0x37, 0x21, 0x11, 0x02, 0xba, 0xfa, 0x9a, 0xf3, 0x68, 0x53, 0x53, 0x68, 0xfb, 0xf2, 0x67, 0x54, 0x01, 0x01, 0x54, 0x67, 0xee, 0x99, 0x02, 0x55, 0xfc, 0x56, 0x02, 0xf6, 0x4a, 0xfd, 0x2b, 0x49, 0x41, 0x02, 0xc5, 0x43, 0x01, 0xfd, 0xbe, 0x05, 0xd6, 0x9b, 0x9b, 0xa2, 0x90, 0x96, 0xfd, 0xb7, 0x95, 0x8f, 0xa3, 0xa3, 0x8f, 0x98, 0x02, 0x45, 0x97, 0x90, 0xa2, 0x9b, 0xfa, 0xfb, 0x37, 0x37, 0x03, 0xea, 0x83, 0x5f, 0x5f, 0x83, 0xfd, 0x76, 0x74, 0x80, 0x80, 0x74, 0x34, 0x02, 0x21, 0x02, 0xfd, 0xdd, 0x00, 0x04, 0x01, 0x8a, 0x00, 0x00, 0x04, 0xeb, 0x05, 0xd8, 0x00, 0x37, 0x00, 0x43, 0x00, 0x51, 0x00, 0x5e, 0x00, 0x00, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x35, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x13, 0x21, 0x1b, 0x01, 0x35, 0x33, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x15, 0x33, 0x15, 0x13, 0x36, 0x35, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x03, 0x21, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x02, 0x84, 0x1c, 0x1c, 0x08, 0x0a, 0x36, 0x21, 0x25, 0x01, 0x01, 0x25, 0x27, 0x46, 0x19, 0x1b, 0x17, 0x0f, 0x14, 0x28, 0x46, 0x26, 0x25, 0x46, 0x29, 0x13, 0x0f, 0x17, 0x19, 0x1a, 0x46, 0x27, 0x26, 0x01, 0x01, 0x26, 0x21, 0x34, 0x0a, 0x07, 0x1c, 0x1d, 0x02, 0x02, 0xfe, 0xfc, 0xa0, 0xf4, 0xf1, 0x9b, 0x9b, 0x6a, 0x9b, 0x9b, 0x92, 0x36, 0x29, 0x45, 0x4b, 0x46, 0x28, 0x38, 0xc7, 0x02, 0x49, 0xfe, 0x76, 0x1a, 0x30, 0x34, 0x31, 0x1a, 0x1b, 0x31, 0x19, 0x1a, 0x2f, 0x01, 0x94, 0x35, 0x39, 0x3c, 0x35, 0x11, 0x0e, 0x26, 0x3f, 0x48, 0x50, 0x04, 0x50, 0x49, 0x4b, 0x2a, 0x0e, 0x0a, 0x12, 0x1d, 0x27, 0x29, 0x2b, 0x4b, 0x2a, 0x2a, 0x4b, 0x2b, 0x29, 0x27, 0x1d, 0x13, 0x09, 0x0e, 0x2a, 0x4b, 0x49, 0x50, 0x04, 0x50, 0x48, 0x3e, 0x26, 0x0f, 0x11, 0x35, 0x3c, 0x3a, 0x36, 0x03, 0x04, 0xfe, 0x75, 0x01, 0x94, 0x01, 0x4e, 0x7c, 0x6c, 0x7c, 0x7c, 0x6c, 0x7c, 0xfe, 0xb2, 0x2d, 0x49, 0x2b, 0x4e, 0x29, 0x29, 0x4e, 0x2b, 0x40, 0x36, 0xfe, 0xac, 0x05, 0x19, 0x3a, 0x35, 0x1c, 0x1c, 0x35, 0x3a, 0x35, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x2f, 0x00, 0x00, 0x05, 0x46, 0x05, 0xd8, 0x00, 0x29, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x6f, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x37, 0x16, 0x15, 0x14, 0x07, 0x00, 0x13, 0x21, 0x26, 0x35, 0x34, 0x00, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x07, 0x27, 0x07, 0x26, 0x27, 0x36, 0x35, 0x34, 0x27, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x16, 0x17, 0x03, 0x36, 0x3b, 0x01, 0x06, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x27, 0x35, 0x03, 0x17, 0x14, 0x07, 0x23, 0x22, 0x3d, 0x01, 0x36, 0x13, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x37, 0x07, 0x36, 0x37, 0x36, 0x37, 0x16, 0x15, 0x14, 0x00, 0x15, 0x14, 0x17, 0x25, 0x02, 0x01, 0x32, 0x35, 0x23, 0x36, 0x35, 0x34, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x15, 0x14, 0x07, 0x02, 0xce, 0x04, 0x14, 0x3f, 0x6e, 0x07, 0x01, 0xb9, 0x28, 0xfc, 0x97, 0x0c, 0x01, 0x63, 0x51, 0x32, 0x2a, 0x8e, 0x08, 0x28, 0x7d, 0x1c, 0x47, 0x02, 0x2b, 0x41, 0x13, 0x07, 0x1e, 0x5e, 0x30, 0x91, 0x21, 0x56, 0x06, 0x27, 0x3e, 0x13, 0x07, 0x04, 0x05, 0x06, 0x41, 0x09, 0x19, 0x25, 0xc2, 0x1f, 0x45, 0x17, 0x1a, 0x0a, 0x35, 0x27, 0x03, 0x42, 0x16, 0x5d, 0x57, 0x1f, 0x79, 0x1a, 0x5f, 0x49, 0x0a, 0xfe, 0xa9, 0x0a, 0x03, 0x14, 0x23, 0xfe, 0x43, 0x01, 0x04, 0x1c, 0x0b, 0x46, 0x1b, 0x10, 0x08, 0x04, 0xe8, 0x08, 0x0b, 0x15, 0x2b, 0x0e, 0x31, 0x5e, 0x68, 0x67, 0x1a, 0x1b, 0xfe, 0xbd, 0xfc, 0x6f, 0x38, 0x3a, 0xa0, 0x01, 0x28, 0x40, 0x06, 0x73, 0x03, 0x8e, 0x12, 0x16, 0x1e, 0x2e, 0x50, 0xf9, 0xc0, 0x1e, 0x1c, 0x6d, 0x7a, 0x20, 0x13, 0x05, 0x1b, 0x6e, 0x1b, 0x78, 0xfe, 0xeb, 0x3f, 0x2e, 0x23, 0x31, 0x1e, 0x0f, 0xfe, 0x70, 0x23, 0x34, 0x0f, 0x1e, 0x17, 0x31, 0x02, 0xa7, 0x60, 0x26, 0x3e, 0x25, 0x1b, 0x21, 0x12, 0x10, 0x0f, 0x61, 0x63, 0x2c, 0x2c, 0xc5, 0xc0, 0x4c, 0x18, 0x48, 0x4a, 0x0a, 0x90, 0x04, 0xad, 0x1e, 0x1e, 0x78, 0xfe, 0xec, 0x7d, 0x36, 0x34, 0x01, 0x03, 0x37, 0x01, 0x7c, 0x01, 0x0a, 0x2b, 0x0c, 0x4f, 0x4a, 0x4a, 0x29, 0x13, 0x21, 0x13, 0x11, 0x0f, 0x00, 0x00, 0x00, 0x04, 0x01, 0x11, 0xff, 0xff, 0x05, 0x62, 0x05, 0xd7, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x50, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x13, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x01, 0x15, 0x21, 0x35, 0x07, 0x26, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x07, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x02, 0x79, 0x34, 0x5b, 0x31, 0x34, 0x5b, 0x32, 0x33, 0x5c, 0x32, 0x30, 0x5b, 0x56, 0x0f, 0x19, 0x0d, 0x0f, 0x19, 0x0e, 0x0e, 0x1a, 0x0e, 0x0c, 0x1a, 0x0f, 0x02, 0x1f, 0xfc, 0x43, 0x4a, 0x0a, 0x94, 0x84, 0x22, 0x24, 0x1b, 0x13, 0x26, 0x4c, 0x46, 0x18, 0x1a, 0x17, 0x0e, 0x14, 0x27, 0x46, 0x25, 0x24, 0x47, 0x28, 0x13, 0x0f, 0x17, 0x19, 0x1b, 0x43, 0x4e, 0x25, 0x14, 0x1b, 0x22, 0x22, 0x84, 0x96, 0x0b, 0x53, 0x03, 0x3a, 0x3e, 0xdd, 0x73, 0x74, 0xdc, 0x3d, 0x3a, 0x04, 0x03, 0xc1, 0x70, 0x64, 0x38, 0x38, 0x64, 0x70, 0x67, 0x36, 0x36, 0x01, 0x0e, 0x10, 0x1b, 0x0f, 0x0f, 0x1b, 0x10, 0x0f, 0x1c, 0x10, 0x10, 0x1c, 0xfa, 0xbb, 0x01, 0x01, 0x01, 0x39, 0x3a, 0xa0, 0x01, 0x25, 0x4e, 0x15, 0x0f, 0x1d, 0x26, 0x4b, 0x52, 0x53, 0x97, 0x2a, 0x0e, 0x0a, 0x13, 0x1d, 0x27, 0x54, 0x4d, 0x2a, 0x2a, 0x4d, 0x54, 0x27, 0x1d, 0x14, 0x09, 0x0e, 0x2a, 0x97, 0x53, 0x52, 0x4b, 0x26, 0x1d, 0x10, 0x14, 0x4e, 0xfe, 0xdb, 0xa0, 0x3a, 0x39, 0x84, 0x7d, 0x71, 0x79, 0x83, 0x83, 0x79, 0x71, 0x7d, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xc0, 0x05, 0xd8, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x24, 0x00, 0x54, 0x00, 0x64, 0x00, 0x68, 0x00, 0x79, 0x00, 0x8a, 0x00, 0x00, 0x01, 0x36, 0x37, 0x26, 0x27, 0x26, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x21, 0x33, 0x21, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x07, 0x16, 0x17, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x1d, 0x01, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x01, 0x15, 0x21, 0x35, 0x37, 0x23, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x06, 0x15, 0x33, 0x34, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x23, 0x02, 0xfb, 0x01, 0x02, 0x20, 0x2e, 0x42, 0x8c, 0x85, 0x4b, 0x49, 0x43, 0x14, 0x14, 0x01, 0x35, 0x7f, 0x01, 0x34, 0x16, 0x13, 0x43, 0x49, 0x4b, 0x84, 0x47, 0x46, 0x42, 0x2f, 0x1f, 0x02, 0x01, 0xfe, 0x6c, 0x02, 0xa9, 0xfd, 0x0d, 0x26, 0x22, 0x3e, 0x61, 0x63, 0xb2, 0x5e, 0x48, 0x44, 0x20, 0x1d, 0x0c, 0x0e, 0x61, 0x61, 0x5f, 0x61, 0x61, 0x0e, 0x0c, 0x1c, 0x21, 0x45, 0x47, 0x5d, 0xb2, 0x64, 0x62, 0x3d, 0x23, 0x25, 0xfe, 0x0d, 0x17, 0x29, 0x14, 0x16, 0x28, 0x16, 0x16, 0x28, 0x16, 0x14, 0x29, 0x17, 0x01, 0x7a, 0xfd, 0xb5, 0xb9, 0xfc, 0x10, 0x0f, 0x37, 0x3c, 0x3e, 0x6b, 0x39, 0x38, 0x37, 0x25, 0x1a, 0x02, 0xd9, 0x02, 0x1a, 0x25, 0x37, 0x37, 0x3b, 0x6b, 0x3d, 0x3b, 0x37, 0x11, 0x10, 0xfb, 0x03, 0xc7, 0x03, 0x03, 0x2b, 0x1c, 0x29, 0x51, 0x95, 0x50, 0x51, 0x92, 0x28, 0x0e, 0x08, 0x08, 0x0e, 0x28, 0x92, 0x51, 0x50, 0x95, 0x51, 0x29, 0x1c, 0x2b, 0x03, 0x03, 0xfd, 0xb8, 0xfe, 0xd1, 0x01, 0x2f, 0xfe, 0x81, 0x01, 0x7f, 0x0d, 0x16, 0x36, 0xc4, 0x6b, 0x6c, 0xc5, 0x6a, 0x1f, 0x02, 0x24, 0x3f, 0x12, 0x07, 0x04, 0x36, 0x46, 0x57, 0x57, 0x46, 0x36, 0x04, 0x07, 0x12, 0x3f, 0x24, 0x02, 0x1f, 0x6a, 0xc5, 0x6c, 0x6b, 0xc4, 0x36, 0x16, 0x0d, 0xfe, 0x81, 0x04, 0x7d, 0x19, 0x2b, 0x19, 0x19, 0x2b, 0x19, 0x18, 0x2d, 0x17, 0x17, 0x2d, 0xfc, 0xb6, 0xc8, 0xc8, 0xce, 0x07, 0x0c, 0x21, 0x79, 0x43, 0x42, 0x7b, 0x43, 0x21, 0x17, 0x24, 0x03, 0x02, 0x02, 0x03, 0x24, 0x17, 0x21, 0x43, 0x7b, 0x42, 0x43, 0x79, 0x21, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0xcb, 0x00, 0x00, 0x05, 0xa9, 0x05, 0xd8, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x00, 0x01, 0x26, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x13, 0x03, 0x22, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x1b, 0x01, 0x26, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x1b, 0x01, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x03, 0x13, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x23, 0x03, 0x11, 0x21, 0x11, 0x05, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x2c, 0x56, 0x0b, 0x1b, 0x30, 0x1a, 0x19, 0x31, 0x19, 0x03, 0x34, 0xd7, 0x2e, 0x4b, 0x10, 0x1a, 0x30, 0x1b, 0x1a, 0x2f, 0x1a, 0x01, 0x2a, 0xaa, 0x27, 0x3c, 0x02, 0x1b, 0x30, 0x18, 0x1a, 0x30, 0x1b, 0x03, 0x3c, 0x22, 0xa6, 0x29, 0x1a, 0x31, 0x18, 0x1b, 0x31, 0x1a, 0x0a, 0x4e, 0x52, 0xe7, 0x27, 0x1a, 0x30, 0x19, 0x1b, 0x30, 0x1a, 0x0c, 0x59, 0x90, 0xfc, 0xf9, 0x02, 0xd4, 0xfd, 0x72, 0x02, 0x8e, 0xfd, 0x72, 0x03, 0xfb, 0x02, 0x5f, 0x1c, 0x33, 0x1c, 0x1c, 0x33, 0x1c, 0x40, 0x16, 0xfe, 0x06, 0x02, 0xbe, 0x5d, 0x1c, 0x32, 0x1c, 0x1c, 0x32, 0x1c, 0x2d, 0x22, 0xfd, 0x14, 0x03, 0x34, 0x1e, 0x30, 0x1c, 0x34, 0x1a, 0x1a, 0x34, 0x1c, 0x36, 0x18, 0xfc, 0xca, 0x02, 0xe4, 0x2f, 0x2a, 0x1b, 0x33, 0x1c, 0x1c, 0x33, 0x1b, 0x55, 0x10, 0xfd, 0x4a, 0x02, 0x03, 0x22, 0x2b, 0x1c, 0x33, 0x1b, 0x1b, 0x33, 0x1c, 0x5e, 0xfe, 0x31, 0xfd, 0xd1, 0x02, 0x2f, 0xcb, 0x4e, 0x4e, 0xfe, 0xd6, 0x4f, 0x4f, 0x00, 0x00, 0x04, 0x01, 0x32, 0xff, 0xfe, 0x05, 0x41, 0x05, 0xd6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x25, 0x00, 0x29, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x13, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x23, 0x15, 0x07, 0x11, 0x17, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x37, 0x33, 0x11, 0x23, 0x27, 0x35, 0x23, 0x35, 0x33, 0x15, 0x33, 0x01, 0x35, 0x21, 0x15, 0x04, 0x5a, 0xfd, 0xc0, 0x02, 0x83, 0xfd, 0x3b, 0xe2, 0xfa, 0x9a, 0xf3, 0x68, 0x53, 0x53, 0x68, 0xfb, 0xf2, 0x67, 0x54, 0x01, 0x01, 0x54, 0x67, 0xee, 0x99, 0x02, 0x55, 0xfc, 0x56, 0x04, 0x84, 0x5e, 0x5e, 0xfc, 0x2f, 0x6f, 0x6f, 0x05, 0x23, 0x9b, 0x9b, 0xa2, 0x90, 0x96, 0xfd, 0xb7, 0x95, 0x8f, 0xa3, 0xa3, 0x8f, 0x98, 0x02, 0x45, 0x97, 0x90, 0xa2, 0x9b, 0xfa, 0xfb, 0x37, 0x37, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x8a, 0x00, 0x00, 0x04, 0xeb, 0x05, 0xd8, 0x00, 0x34, 0x00, 0x40, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x35, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x13, 0x21, 0x13, 0x26, 0x01, 0x35, 0x33, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x15, 0x33, 0x15, 0x02, 0x68, 0x1c, 0x08, 0x0a, 0x36, 0x21, 0x25, 0x01, 0x01, 0x25, 0x27, 0x46, 0x19, 0x1b, 0x17, 0x0f, 0x14, 0x28, 0x46, 0x26, 0x25, 0x46, 0x29, 0x13, 0x0f, 0x17, 0x19, 0x1a, 0x46, 0x27, 0x26, 0x01, 0x01, 0x26, 0x21, 0x34, 0x0a, 0x07, 0x1c, 0x1d, 0xfa, 0xfc, 0xa0, 0xf4, 0x16, 0x01, 0x07, 0x9b, 0x9b, 0x6a, 0x9b, 0x9b, 0x02, 0x02, 0x3c, 0x35, 0x11, 0x0e, 0x26, 0x3f, 0x48, 0x50, 0x04, 0x50, 0x49, 0x4b, 0x2a, 0x0e, 0x0a, 0x12, 0x1d, 0x27, 0x29, 0x2b, 0x4b, 0x2a, 0x2a, 0x4b, 0x2b, 0x29, 0x27, 0x1d, 0x13, 0x09, 0x0e, 0x2a, 0x4b, 0x49, 0x50, 0x04, 0x50, 0x48, 0x3e, 0x26, 0x0f, 0x11, 0x35, 0x3c, 0x3a, 0x36, 0xfe, 0x6e, 0x01, 0x94, 0x35, 0x01, 0x19, 0x7c, 0x6c, 0x7c, 0x7c, 0x6c, 0x7c, 0x00, 0x00, 0x04, 0x01, 0x2a, 0x00, 0x00, 0x05, 0x4a, 0x05, 0xd8, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x37, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x33, 0x14, 0x23, 0x00, 0x13, 0x21, 0x26, 0x35, 0x34, 0x00, 0x35, 0x34, 0x27, 0x06, 0x2b, 0x01, 0x06, 0x23, 0x22, 0x23, 0x37, 0x07, 0x26, 0x27, 0x36, 0x35, 0x34, 0x27, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x37, 0x16, 0x17, 0x07, 0x15, 0x16, 0x3b, 0x01, 0x32, 0x35, 0x34, 0x37, 0x23, 0x22, 0x07, 0x03, 0x15, 0x14, 0x3b, 0x01, 0x36, 0x35, 0x27, 0x22, 0x01, 0x17, 0x00, 0x13, 0x33, 0x02, 0x02, 0xc7, 0x21, 0x1b, 0x35, 0x4c, 0x0e, 0x1f, 0x03, 0x01, 0x01, 0xe2, 0x29, 0xfc, 0x97, 0x0c, 0x01, 0x6c, 0x01, 0x3b, 0x69, 0x09, 0x51, 0x5d, 0x03, 0x03, 0x2b, 0x60, 0x67, 0x18, 0x4f, 0x02, 0x2b, 0x59, 0x03, 0x28, 0x12, 0x5d, 0x33, 0x99, 0x03, 0x07, 0x13, 0x3f, 0x26, 0x05, 0x57, 0x21, 0x67, 0x19, 0x09, 0x41, 0x07, 0x38, 0x01, 0x9c, 0x2f, 0x01, 0x51, 0x06, 0x45, 0x29, 0x04, 0xe6, 0x17, 0x27, 0x19, 0x39, 0x16, 0x2e, 0x1e, 0x51, 0x59, 0x0d, 0x2f, 0x0c, 0x01, 0xfe, 0xac, 0xfc, 0x6f, 0x38, 0x3a, 0xa0, 0x01, 0x1b, 0x71, 0x08, 0x07, 0xa7, 0x92, 0x68, 0x50, 0x1c, 0x53, 0xe5, 0xbe, 0x1b, 0x1a, 0x6d, 0x68, 0x0a, 0x09, 0x1c, 0x1a, 0x23, 0x25, 0x42, 0x1b, 0x7a, 0xff, 0x10, 0x1e, 0x31, 0x22, 0x30, 0x40, 0xfe, 0x29, 0x18, 0x1d, 0x0f, 0x35, 0x22, 0x02, 0x40, 0x59, 0xfe, 0xf3, 0xfd, 0x04, 0x03, 0x52, 0x00, 0x01, 0x01, 0x11, 0xff, 0xff, 0x05, 0x62, 0x05, 0xd7, 0x00, 0x2e, 0x00, 0x00, 0x05, 0x26, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x07, 0x01, 0x1c, 0x0a, 0x94, 0x84, 0x22, 0x24, 0x1b, 0x13, 0x26, 0x4c, 0x46, 0x18, 0x1a, 0x17, 0x0e, 0x14, 0x27, 0x46, 0x25, 0x24, 0x47, 0x28, 0x13, 0x0f, 0x17, 0x19, 0x1b, 0x43, 0x4e, 0x25, 0x14, 0x1b, 0x22, 0x22, 0x84, 0x96, 0x0b, 0x01, 0x39, 0x3a, 0xa0, 0x01, 0x25, 0x4e, 0x15, 0x0f, 0x1d, 0x26, 0x4b, 0x52, 0x53, 0x97, 0x2a, 0x0e, 0x0a, 0x13, 0x1d, 0x27, 0x54, 0x4d, 0x2a, 0x2a, 0x4d, 0x54, 0x27, 0x1d, 0x14, 0x09, 0x0e, 0x2a, 0x97, 0x53, 0x52, 0x4b, 0x26, 0x1d, 0x10, 0x14, 0x4e, 0xfe, 0xdb, 0xa0, 0x3a, 0x39, 0x00, 0x00, 0x00, 0x01, 0x01, 0x22, 0x00, 0x00, 0x05, 0x51, 0x05, 0xd4, 0x00, 0x23, 0x00, 0x00, 0x01, 0x16, 0x13, 0x12, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x23, 0x15, 0x10, 0x17, 0x23, 0x35, 0x36, 0x11, 0x27, 0x23, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x00, 0x3f, 0x01, 0x03, 0x3c, 0x55, 0xc2, 0xd5, 0x06, 0x23, 0x92, 0x30, 0x39, 0x8b, 0x55, 0x26, 0x4a, 0xc1, 0x4d, 0x03, 0x22, 0x2b, 0x4c, 0x72, 0xa9, 0x44, 0x08, 0xa8, 0x01, 0x1b, 0x51, 0x02, 0x05, 0xd4, 0xa7, 0xfe, 0xec, 0xfe, 0xea, 0x39, 0x55, 0x50, 0x28, 0xa7, 0x60, 0x16, 0xdd, 0x0c, 0xfe, 0xe5, 0x96, 0x06, 0x97, 0x01, 0x1d, 0x03, 0x58, 0x85, 0xd1, 0x49, 0x2e, 0xb7, 0xcb, 0x01, 0x82, 0xa5, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa6, 0x00, 0x01, 0x05, 0xce, 0x05, 0xd1, 0x00, 0x18, 0x00, 0x32, 0x00, 0x00, 0x01, 0x32, 0x13, 0x16, 0x15, 0x32, 0x37, 0x12, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x10, 0x07, 0x00, 0x07, 0x23, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x03, 0x15, 0x14, 0x17, 0x01, 0x33, 0x01, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x06, 0x15, 0x23, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x01, 0xf3, 0xc4, 0x68, 0x19, 0x06, 0x0c, 0x64, 0xd4, 0xbc, 0x6e, 0x22, 0xc7, 0xfe, 0x6a, 0x36, 0x05, 0xfd, 0xdc, 0x6c, 0xb4, 0x48, 0xce, 0xbc, 0x01, 0xab, 0x03, 0x02, 0x04, 0x5e, 0xaa, 0x40, 0x34, 0xee, 0x4d, 0x09, 0x06, 0x40, 0x5b, 0xaa, 0x9d, 0x60, 0x22, 0x05, 0xd1, 0xfe, 0xed, 0x50, 0x18, 0x46, 0x01, 0x35, 0xd3, 0x4e, 0x50, 0x0d, 0xfe, 0xfe, 0xe7, 0xfd, 0xd9, 0x42, 0x02, 0xed, 0xb2, 0xb6, 0xd2, 0x7c, 0x2d, 0xfe, 0x8f, 0x10, 0xdb, 0xe4, 0xfd, 0xbc, 0x02, 0xbb, 0xa1, 0x97, 0x26, 0xac, 0x70, 0x1c, 0xfe, 0x41, 0x26, 0x1a, 0x4e, 0xd1, 0xe0, 0xb1, 0x46, 0x00, 0x02, 0x01, 0x35, 0x00, 0x00, 0x05, 0x3d, 0x05, 0xd4, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x15, 0x00, 0x07, 0x26, 0x01, 0x26, 0x35, 0x09, 0x04, 0x03, 0x3a, 0x02, 0x03, 0xfe, 0x19, 0x1c, 0x0d, 0xfe, 0x48, 0x3f, 0x02, 0x01, 0xfe, 0x35, 0x01, 0xce, 0x01, 0xce, 0xfe, 0x88, 0x05, 0xd4, 0xfd, 0x1a, 0x07, 0xfd, 0x3b, 0x22, 0x0b, 0x02, 0x80, 0x56, 0x0d, 0x02, 0x96, 0xfd, 0x67, 0xfd, 0x64, 0x02, 0x9c, 0x02, 0x1e, 0x00, 0x00, 0x01, 0x00, 0xcd, 0x00, 0x00, 0x05, 0xa7, 0x05, 0xd4, 0x00, 0x37, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x14, 0x0f, 0x01, 0x33, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x22, 0x03, 0x23, 0x15, 0x10, 0x17, 0x15, 0x23, 0x27, 0x36, 0x11, 0x35, 0x23, 0x02, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x33, 0x35, 0x26, 0x27, 0x26, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x03, 0x3b, 0xc1, 0x5b, 0x0b, 0x03, 0x6c, 0x36, 0x03, 0x42, 0x4c, 0x11, 0xd6, 0x57, 0x14, 0xbc, 0x24, 0x40, 0xda, 0x5a, 0x03, 0x4a, 0xbb, 0x06, 0x4d, 0x03, 0x5a, 0xdd, 0xab, 0x5c, 0x17, 0xde, 0x3b, 0x2e, 0x08, 0x4d, 0x47, 0x02, 0x4b, 0x1a, 0x36, 0xc1, 0x40, 0x05, 0xd4, 0xe3, 0x34, 0x38, 0x75, 0xa0, 0x3c, 0x1c, 0xca, 0x42, 0x3c, 0xcd, 0x68, 0x0c, 0x06, 0x01, 0x12, 0x09, 0xfe, 0xa9, 0x6d, 0x06, 0x06, 0x80, 0x01, 0x4d, 0x03, 0xfe, 0xeb, 0xc9, 0x44, 0x3a, 0xe9, 0x53, 0x0c, 0x1c, 0x03, 0x47, 0x45, 0x6e, 0x51, 0x0e, 0xc9, 0x68, 0x13, 0x00, 0x00, 0x03, 0x01, 0x21, 0x00, 0x01, 0x05, 0x53, 0x05, 0xd5, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x00, 0x01, 0x16, 0x01, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x23, 0x15, 0x10, 0x17, 0x23, 0x35, 0x36, 0x11, 0x23, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x35, 0x37, 0x35, 0x34, 0x37, 0x00, 0x37, 0x06, 0x01, 0x06, 0x15, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x33, 0x32, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x02, 0x03, 0x33, 0x26, 0x27, 0x22, 0x07, 0x03, 0x3b, 0x71, 0x01, 0x59, 0x4e, 0xa3, 0x1f, 0x2b, 0x14, 0x82, 0x59, 0x25, 0x4a, 0xc1, 0x4d, 0x26, 0x32, 0x4c, 0x5f, 0x14, 0x90, 0x49, 0x16, 0x02, 0xba, 0x01, 0x05, 0x55, 0x6f, 0xfe, 0xd0, 0x49, 0x09, 0x85, 0x14, 0x25, 0x0e, 0x6b, 0x56, 0xa5, 0x07, 0x1b, 0x4b, 0x5d, 0x11, 0x7b, 0x3b, 0x09, 0xb7, 0xcf, 0x80, 0x39, 0x0c, 0x0d, 0x06, 0x0e, 0x05, 0xd5, 0xe1, 0xfe, 0x36, 0x8b, 0x86, 0x03, 0xd1, 0x4e, 0x10, 0xda, 0x0d, 0xfe, 0xe8, 0x9b, 0x06, 0x97, 0x01, 0x23, 0x65, 0x75, 0xae, 0x42, 0x3f, 0x0d, 0x03, 0xc8, 0xd4, 0x01, 0x67, 0x49, 0xc7, 0xfe, 0x6f, 0x82, 0x85, 0xbb, 0x35, 0x09, 0xda, 0x46, 0x94, 0xa7, 0x28, 0x1e, 0x1f, 0xb0, 0xcf, 0x01, 0x1f, 0xfb, 0x70, 0x17, 0x5a, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa3, 0x00, 0x00, 0x05, 0xd2, 0x05, 0xd4, 0x00, 0x17, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x01, 0x23, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0xf1, 0xb7, 0x68, 0x26, 0x02, 0x02, 0x20, 0x52, 0x62, 0x79, 0xbc, 0x72, 0x1d, 0xbc, 0xfe, 0x24, 0x05, 0xfe, 0x06, 0x97, 0xb3, 0x4b, 0x05, 0xd4, 0xeb, 0x5d, 0x31, 0xa2, 0x6b, 0x6c, 0xe0, 0x53, 0x49, 0xfa, 0xe3, 0xfd, 0x85, 0x02, 0xb1, 0xcd, 0xda, 0xd3, 0x7c, 0x2d, 0x00, 0x00, 0x01, 0x01, 0x35, 0x00, 0x00, 0x05, 0x3d, 0x05, 0xd4, 0x00, 0x08, 0x00, 0x00, 0x09, 0x01, 0x16, 0x15, 0x01, 0x26, 0x01, 0x34, 0x37, 0x03, 0x3a, 0x01, 0xc5, 0x3e, 0xfd, 0xfd, 0x0b, 0xfe, 0x07, 0x64, 0x05, 0xd4, 0xfd, 0x73, 0x55, 0x0d, 0xfd, 0x1b, 0x08, 0x02, 0xdd, 0x0e, 0x8a, 0x00, 0x00, 0x03, 0x00, 0xcd, 0x00, 0x00, 0x05, 0xa8, 0x05, 0xdc, 0x00, 0x32, 0x00, 0x60, 0x00, 0x67, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x22, 0x03, 0x23, 0x15, 0x10, 0x17, 0x15, 0x23, 0x27, 0x36, 0x11, 0x35, 0x23, 0x02, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x26, 0x27, 0x35, 0x34, 0x37, 0x36, 0x03, 0x14, 0x1f, 0x01, 0x15, 0x26, 0x2b, 0x01, 0x22, 0x0f, 0x01, 0x14, 0x17, 0x16, 0x33, 0x32, 0x13, 0x36, 0x37, 0x33, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x34, 0x2f, 0x01, 0x23, 0x22, 0x07, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x13, 0x14, 0x07, 0x33, 0x35, 0x26, 0x35, 0x03, 0x3f, 0xb6, 0x5e, 0x17, 0x67, 0x14, 0x1c, 0x37, 0x25, 0xdf, 0x53, 0x0e, 0xbd, 0x1e, 0x42, 0xd9, 0x5c, 0x03, 0x4a, 0xbc, 0x05, 0x4c, 0x02, 0x5a, 0xde, 0xad, 0x5c, 0x17, 0xdf, 0x3c, 0x2e, 0x22, 0x37, 0x1c, 0x59, 0x1a, 0xc3, 0x40, 0xd8, 0x98, 0x0b, 0x61, 0x6a, 0x08, 0xdb, 0x37, 0x06, 0x7b, 0x36, 0x47, 0xbd, 0x66, 0x0f, 0x13, 0x07, 0x21, 0x4b, 0x51, 0x8e, 0x97, 0x4d, 0x0a, 0xe3, 0x31, 0x05, 0x6b, 0x60, 0x74, 0x1d, 0x17, 0xa8, 0x30, 0x25, 0xa6, 0x4b, 0xed, 0x19, 0x36, 0x19, 0x05, 0xdc, 0xce, 0x46, 0x39, 0x84, 0xa6, 0x17, 0x06, 0xd7, 0x38, 0x3a, 0xd3, 0x64, 0x0c, 0x07, 0x01, 0x14, 0x09, 0xfe, 0xa7, 0x6d, 0x06, 0x06, 0x80, 0x01, 0x4f, 0x04, 0xfe, 0xe8, 0xcb, 0x45, 0x3a, 0xeb, 0x52, 0x0c, 0x06, 0x70, 0xb1, 0x26, 0xcb, 0x69, 0x13, 0xfe, 0xb3, 0x9b, 0xcc, 0x0c, 0x03, 0x09, 0xd4, 0x43, 0x94, 0x5d, 0x26, 0x01, 0x27, 0x1b, 0x41, 0x78, 0x86, 0x85, 0xbe, 0x2e, 0x2b, 0x06, 0xde, 0x30, 0x03, 0x09, 0x03, 0x89, 0x6e, 0x4d, 0x2c, 0xb6, 0x57, 0x10, 0xc8, 0xfb, 0xce, 0x1c, 0x60, 0x03, 0x63, 0x16, 0x00, 0x04, 0x00, 0xc2, 0xff, 0xfe, 0x05, 0xb2, 0x05, 0xd4, 0x00, 0x10, 0x00, 0x21, 0x00, 0x31, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x33, 0x14, 0x06, 0x07, 0x14, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x27, 0x30, 0x35, 0x34, 0x36, 0x25, 0x33, 0x14, 0x06, 0x07, 0x14, 0x16, 0x13, 0x23, 0x26, 0x27, 0x26, 0x27, 0x34, 0x35, 0x34, 0x36, 0x05, 0x33, 0x14, 0x06, 0x07, 0x14, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x27, 0x35, 0x34, 0x36, 0x13, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x04, 0x20, 0x24, 0x26, 0x35, 0x34, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x14, 0x16, 0x04, 0x20, 0x24, 0x36, 0x34, 0x27, 0x26, 0x27, 0x02, 0x37, 0x0c, 0x83, 0x02, 0xb8, 0x06, 0x0b, 0x1b, 0x92, 0x2b, 0x0e, 0x95, 0x01, 0x20, 0x0c, 0x83, 0x02, 0xb9, 0x05, 0x0c, 0x1a, 0x92, 0x2c, 0x0d, 0x95, 0x01, 0x37, 0x0b, 0x83, 0x02, 0xb9, 0x05, 0x0c, 0x19, 0x93, 0x2c, 0x0d, 0x95, 0x28, 0x97, 0xab, 0xa6, 0xfe, 0xd2, 0xfe, 0xb8, 0xfe, 0xd3, 0xa7, 0xaa, 0x98, 0x02, 0x76, 0x43, 0x4d, 0x96, 0x01, 0x10, 0x01, 0x29, 0x01, 0x10, 0x96, 0x4e, 0x44, 0x76, 0x05, 0x39, 0x3f, 0x9b, 0x63, 0x82, 0x79, 0xc9, 0xa6, 0x74, 0x33, 0x5a, 0x0e, 0x72, 0x88, 0xed, 0x60, 0xed, 0x97, 0xc5, 0xbb, 0xfe, 0xce, 0xfb, 0xb2, 0x4e, 0x8b, 0x08, 0x09, 0xb1, 0xd1, 0x5b, 0x4f, 0xc4, 0x7d, 0xa1, 0x9a, 0xfd, 0xd0, 0x91, 0x42, 0x72, 0x0e, 0x91, 0xad, 0xfe, 0x1e, 0x31, 0xb1, 0x61, 0x60, 0xb0, 0x62, 0x62, 0xb0, 0x60, 0x61, 0xb1, 0x31, 0x29, 0x45, 0x4d, 0xa8, 0x98, 0x55, 0x55, 0x98, 0xa8, 0x4d, 0x45, 0x29, 0x00, 0x01, 0x00, 0x9a, 0xff, 0xf6, 0x02, 0x72, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x14, 0x0f, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x34, 0x3f, 0x01, 0x32, 0x17, 0x33, 0x11, 0x02, 0x2a, 0x41, 0x07, 0xb1, 0x2b, 0x20, 0xbe, 0x1a, 0x03, 0xbe, 0x1d, 0x5a, 0x50, 0x04, 0x05, 0xd5, 0x08, 0xfa, 0xfd, 0xa3, 0x2d, 0x04, 0x85, 0x1f, 0x82, 0x18, 0x05, 0x40, 0x04, 0xd4, 0x00, 0x00, 0x01, 0x00, 0x9a, 0xff, 0xf6, 0x03, 0xfe, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x33, 0x17, 0x15, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x23, 0x27, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x11, 0x14, 0x07, 0x23, 0x22, 0x35, 0x34, 0x37, 0x33, 0x32, 0x17, 0x11, 0x02, 0x1c, 0x4e, 0x08, 0x18, 0x9c, 0xd8, 0x6e, 0x04, 0x1b, 0x37, 0xcd, 0x53, 0x16, 0xca, 0x33, 0xda, 0xbf, 0x14, 0x57, 0x50, 0x05, 0xd5, 0x07, 0x27, 0x36, 0x3f, 0x46, 0x8a, 0x92, 0x60, 0x20, 0x31, 0x54, 0x46, 0x47, 0x2a, 0x1a, 0xfb, 0xd6, 0x99, 0x2d, 0xa8, 0x83, 0x17, 0x40, 0x04, 0xd6, 0x00, 0x01, 0x01, 0x52, 0xff, 0x2f, 0x05, 0x22, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x05, 0x17, 0x11, 0x14, 0x07, 0x23, 0x22, 0x3d, 0x01, 0x34, 0x3f, 0x01, 0x32, 0x17, 0x11, 0x25, 0x11, 0x14, 0x0f, 0x01, 0x23, 0x22, 0x3d, 0x01, 0x34, 0x3f, 0x01, 0x32, 0x17, 0x11, 0x02, 0xb0, 0x02, 0x6e, 0x03, 0xad, 0x30, 0xc0, 0x9f, 0x23, 0x4e, 0x49, 0xfe, 0x13, 0x88, 0x3c, 0x17, 0xc3, 0x99, 0x27, 0x50, 0x48, 0x05, 0xd5, 0xca, 0x04, 0xfa, 0xed, 0x9b, 0x2a, 0xa4, 0x04, 0x7e, 0x16, 0x03, 0x3a, 0x04, 0x0b, 0xa9, 0xfb, 0xdb, 0x89, 0x38, 0x08, 0x9b, 0x07, 0x7a, 0x22, 0x04, 0x43, 0x04, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa9, 0xff, 0xf6, 0x05, 0xcb, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x17, 0x11, 0x14, 0x07, 0x22, 0x27, 0x34, 0x37, 0x32, 0x17, 0x33, 0x11, 0x21, 0x11, 0x06, 0x07, 0x23, 0x22, 0x35, 0x34, 0x37, 0x32, 0x17, 0x11, 0x17, 0x15, 0x21, 0x35, 0x05, 0xc7, 0x03, 0xeb, 0xd1, 0x10, 0xd1, 0x62, 0x47, 0x03, 0xfc, 0xfb, 0x07, 0xda, 0x04, 0xe8, 0xd5, 0x5a, 0x4f, 0x4f, 0x03, 0x05, 0x05, 0xd5, 0x04, 0xfb, 0x12, 0xd5, 0x15, 0xa4, 0x8a, 0x0e, 0x3b, 0x02, 0x95, 0xfd, 0x5a, 0xcf, 0x24, 0xb1, 0x7d, 0x10, 0x40, 0x04, 0xe1, 0xcf, 0x9c, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa2, 0xff, 0xfa, 0x02, 0xd2, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x13, 0x33, 0x17, 0x11, 0x33, 0x36, 0x33, 0x16, 0x13, 0x02, 0x05, 0x27, 0x11, 0x13, 0x11, 0x24, 0x11, 0x34, 0x35, 0x34, 0x27, 0x22, 0xa8, 0x29, 0x04, 0x03, 0x99, 0x83, 0xcc, 0x12, 0x1a, 0xfd, 0xee, 0x03, 0x32, 0x01, 0x79, 0x86, 0x6b, 0x05, 0xd9, 0x06, 0xfc, 0x3f, 0xed, 0x03, 0xfe, 0xff, 0xfe, 0x57, 0x58, 0x03, 0x05, 0xd6, 0xfb, 0xd4, 0xfe, 0x9d, 0x63, 0x01, 0x31, 0x0d, 0x0c, 0x94, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9a, 0x00, 0x00, 0x01, 0xf8, 0x05, 0xd9, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x17, 0x11, 0x25, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x05, 0x23, 0x11, 0x13, 0x11, 0x33, 0x25, 0x11, 0x23, 0x9f, 0x25, 0x06, 0x01, 0x2c, 0x02, 0x04, 0x24, 0x04, 0xfe, 0xd1, 0x02, 0x2f, 0x01, 0x01, 0x01, 0x02, 0x05, 0xd9, 0x05, 0xfe, 0x2f, 0xa1, 0x02, 0xfb, 0x63, 0x05, 0x05, 0x01, 0xe5, 0xa0, 0x04, 0x8a, 0xfd, 0x99, 0xfe, 0x7d, 0x90, 0x01, 0x7f, 0x00, 0x02, 0x00, 0x9b, 0x00, 0x00, 0x02, 0xe2, 0x05, 0xd9, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x37, 0x17, 0x15, 0x06, 0x07, 0x11, 0x37, 0x15, 0x06, 0x07, 0x11, 0x07, 0x23, 0x27, 0x11, 0x05, 0x11, 0x07, 0x23, 0x27, 0x11, 0x07, 0x35, 0x34, 0x37, 0x11, 0x23, 0x07, 0x35, 0x37, 0x11, 0x37, 0x33, 0x17, 0x11, 0x25, 0x11, 0x01, 0x11, 0x25, 0x11, 0x02, 0x46, 0x2a, 0x04, 0x6b, 0x03, 0x03, 0x6b, 0x6e, 0x01, 0x6d, 0x04, 0x2a, 0x04, 0xfe, 0xfd, 0x05, 0x26, 0x04, 0x74, 0x74, 0x02, 0x72, 0x74, 0x04, 0x26, 0x05, 0x01, 0x03, 0xfe, 0xfd, 0x01, 0x03, 0x05, 0xd9, 0x05, 0xfe, 0xd0, 0x3c, 0x02, 0x8d, 0x07, 0x3c, 0xfe, 0x8b, 0x37, 0x87, 0x04, 0x43, 0xfe, 0xd7, 0x04, 0x04, 0x01, 0x11, 0x8c, 0xfe, 0xa6, 0x04, 0x04, 0x01, 0x41, 0x3c, 0x8e, 0x06, 0x3c, 0x01, 0x7b, 0x38, 0x8b, 0x41, 0x01, 0x1f, 0x04, 0x04, 0xfe, 0xfa, 0x86, 0x01, 0x4d, 0xfd, 0x96, 0xfe, 0x87, 0x8b, 0x01, 0x74, 0x00, 0x01, 0x00, 0x9a, 0x00, 0x00, 0x04, 0xc8, 0x05, 0xd9, 0x00, 0x48, 0x00, 0x00, 0x01, 0x23, 0x30, 0x23, 0x22, 0x07, 0x23, 0x22, 0x27, 0x35, 0x36, 0x35, 0x34, 0x27, 0x35, 0x36, 0x37, 0x33, 0x16, 0x3b, 0x01, 0x35, 0x34, 0x27, 0x35, 0x36, 0x37, 0x33, 0x16, 0x32, 0x37, 0x33, 0x16, 0x17, 0x15, 0x06, 0x1d, 0x01, 0x33, 0x32, 0x37, 0x33, 0x16, 0x17, 0x15, 0x06, 0x15, 0x14, 0x17, 0x15, 0x06, 0x2b, 0x01, 0x26, 0x2b, 0x02, 0x11, 0x14, 0x17, 0x15, 0x06, 0x07, 0x23, 0x26, 0x22, 0x07, 0x23, 0x26, 0x27, 0x35, 0x36, 0x35, 0x02, 0x71, 0x98, 0x03, 0xa1, 0x48, 0x33, 0x15, 0x0a, 0x59, 0x59, 0x02, 0x1c, 0x34, 0x4a, 0xa3, 0x97, 0x76, 0x02, 0x1b, 0x34, 0x28, 0x7e, 0x29, 0x34, 0x1a, 0x03, 0x76, 0x92, 0xa3, 0x4b, 0x32, 0x1e, 0x02, 0x59, 0x59, 0x0a, 0x16, 0x32, 0x48, 0xa1, 0x04, 0x93, 0x76, 0x03, 0x1a, 0x34, 0x29, 0x7e, 0x28, 0x34, 0x1b, 0x02, 0x76, 0x03, 0x11, 0x5a, 0x23, 0x3b, 0x31, 0x37, 0x46, 0x2d, 0x3a, 0x1d, 0x03, 0x83, 0xaf, 0xb5, 0x53, 0x38, 0x21, 0x02, 0x63, 0x63, 0x02, 0x21, 0x38, 0x53, 0xb5, 0xaf, 0x83, 0x03, 0x1d, 0x3a, 0x2d, 0x46, 0x37, 0x31, 0x3b, 0x23, 0x5a, 0xfe, 0x52, 0xb5, 0x53, 0x39, 0x20, 0x02, 0x63, 0x63, 0x02, 0x20, 0x39, 0x53, 0xb5, 0x00, 0x06, 0x00, 0x76, 0x00, 0x00, 0x05, 0x0d, 0x05, 0xd9, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x00, 0x01, 0x06, 0x07, 0x16, 0x17, 0x37, 0x35, 0x05, 0x15, 0x17, 0x36, 0x37, 0x26, 0x27, 0x01, 0x26, 0x27, 0x06, 0x07, 0x17, 0x33, 0x03, 0x23, 0x07, 0x16, 0x17, 0x36, 0x37, 0x03, 0x33, 0x37, 0x16, 0x17, 0x06, 0x07, 0x27, 0x23, 0x11, 0x17, 0x06, 0x07, 0x26, 0x27, 0x37, 0x11, 0x23, 0x07, 0x26, 0x27, 0x36, 0x37, 0x17, 0x33, 0x35, 0x27, 0x36, 0x37, 0x16, 0x17, 0x0f, 0x01, 0x15, 0x23, 0x15, 0x33, 0x11, 0x33, 0x11, 0x33, 0x35, 0x23, 0x35, 0x01, 0x1c, 0x14, 0x2c, 0x2b, 0x15, 0x55, 0x02, 0xa2, 0x55, 0x14, 0x2b, 0x2b, 0x14, 0xfe, 0xac, 0x28, 0x2a, 0x28, 0x28, 0x3d, 0x28, 0x01, 0x28, 0x3c, 0x28, 0x28, 0x29, 0x29, 0x07, 0xcd, 0xbc, 0x09, 0x6d, 0x6d, 0x09, 0xbc, 0xcd, 0x72, 0x60, 0x5e, 0x5e, 0x5d, 0x71, 0xcd, 0xbc, 0x09, 0x6e, 0x6e, 0x09, 0xbc, 0xcd, 0x71, 0x5d, 0x5f, 0x5d, 0x60, 0x72, 0x63, 0x68, 0x68, 0x31, 0x68, 0x68, 0x03, 0xb4, 0x2d, 0x2e, 0x2c, 0x2d, 0x43, 0x2e, 0x01, 0x2e, 0x43, 0x2e, 0x2c, 0x2e, 0x2d, 0x01, 0x6e, 0x17, 0x2f, 0x2f, 0x17, 0x5f, 0xfc, 0x52, 0x5f, 0x17, 0x2f, 0x2f, 0x17, 0x02, 0xf7, 0x7e, 0x69, 0x6a, 0x68, 0x68, 0x7e, 0xfe, 0x4e, 0xd0, 0x0b, 0x79, 0x79, 0x0b, 0xd0, 0x01, 0xb2, 0x7e, 0x68, 0x69, 0x69, 0x69, 0x7e, 0xd6, 0xd1, 0x0b, 0x7a, 0x7a, 0x0b, 0xd1, 0x73, 0x9f, 0x2e, 0xfe, 0x80, 0x01, 0x80, 0x2e, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x9a, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xac, 0x00, 0x14, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x68, 0x00, 0x77, 0x00, 0x8c, 0x00, 0x97, 0x00, 0xa6, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x21, 0x32, 0x1f, 0x01, 0x37, 0x33, 0x32, 0x15, 0x03, 0x21, 0x27, 0x35, 0x36, 0x37, 0x35, 0x02, 0x27, 0x26, 0x3d, 0x01, 0x07, 0x33, 0x32, 0x17, 0x16, 0x15, 0x02, 0x07, 0x23, 0x24, 0x27, 0x35, 0x12, 0x37, 0x36, 0x17, 0x15, 0x13, 0x07, 0x15, 0x33, 0x37, 0x07, 0x26, 0x2f, 0x01, 0x01, 0x17, 0x13, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x01, 0x16, 0x13, 0x17, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x26, 0x03, 0x35, 0x17, 0x13, 0x33, 0x32, 0x3f, 0x01, 0x34, 0x2f, 0x01, 0x06, 0x25, 0x33, 0x32, 0x17, 0x16, 0x15, 0x07, 0x23, 0x27, 0x02, 0x0f, 0x01, 0x17, 0x07, 0x23, 0x26, 0x03, 0x26, 0x3d, 0x01, 0x34, 0x3f, 0x01, 0x23, 0x27, 0x35, 0x37, 0x17, 0x15, 0x17, 0x33, 0x15, 0x14, 0x07, 0x15, 0x16, 0x17, 0x13, 0x33, 0x17, 0x35, 0x27, 0x01, 0x33, 0x17, 0x15, 0x21, 0x32, 0x37, 0x33, 0x17, 0x15, 0x06, 0x03, 0x06, 0x2b, 0x01, 0x15, 0x07, 0x23, 0x02, 0x3d, 0x01, 0x27, 0x17, 0x11, 0x07, 0x21, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x05, 0x07, 0x17, 0x33, 0x35, 0x34, 0x3b, 0x01, 0x32, 0x3f, 0x01, 0x21, 0x26, 0x3d, 0x01, 0x05, 0x06, 0x07, 0x15, 0x14, 0x1f, 0x01, 0x33, 0x11, 0x02, 0xd7, 0x01, 0x64, 0x34, 0x1a, 0x45, 0x58, 0x08, 0x04, 0x9c, 0xfe, 0xc7, 0x04, 0x10, 0x4a, 0xa9, 0x0e, 0x29, 0x66, 0x15, 0x64, 0x32, 0x1b, 0x9e, 0x0f, 0x02, 0xfe, 0xf1, 0x04, 0x8e, 0x0f, 0x28, 0xf7, 0xb5, 0x13, 0xb5, 0x56, 0x19, 0x66, 0x0e, 0x12, 0xfd, 0x67, 0xd8, 0x90, 0x37, 0x46, 0x19, 0x4b, 0x28, 0x03, 0x3f, 0x10, 0x86, 0x04, 0x48, 0x14, 0x21, 0x83, 0x0b, 0xa2, 0x31, 0x8c, 0x78, 0x30, 0x21, 0x02, 0x2b, 0x56, 0xcd, 0xfd, 0x5e, 0x12, 0x08, 0x69, 0x2e, 0x04, 0x05, 0x5a, 0xa2, 0x0d, 0x03, 0x04, 0x06, 0x03, 0x14, 0x9b, 0x12, 0x4c, 0x12, 0x01, 0x5a, 0x04, 0x73, 0x10, 0x03, 0x68, 0x01, 0x8c, 0xb4, 0x02, 0x19, 0x56, 0x02, 0x3e, 0x04, 0x05, 0x01, 0x4e, 0x25, 0x21, 0x02, 0x04, 0x05, 0xb1, 0x16, 0x1f, 0xaf, 0x05, 0x07, 0x9b, 0x4a, 0x08, 0x05, 0xfe, 0xf4, 0x68, 0x2c, 0x05, 0x4f, 0x02, 0x1c, 0x55, 0x55, 0x05, 0x07, 0xd0, 0x14, 0x2a, 0x5e, 0xfe, 0x94, 0x07, 0xfd, 0xf2, 0x37, 0x05, 0x51, 0x1b, 0xf3, 0x05, 0xac, 0x47, 0x86, 0x38, 0x07, 0xfe, 0xd4, 0x05, 0x05, 0x11, 0x2a, 0x05, 0x01, 0x46, 0x14, 0x16, 0x04, 0x05, 0x0d, 0x80, 0x31, 0x0a, 0xfe, 0xc6, 0x11, 0xac, 0x08, 0x02, 0x01, 0x1a, 0x08, 0x2e, 0x17, 0x02, 0xfe, 0x9d, 0x0f, 0x03, 0xad, 0x0d, 0xc5, 0x0d, 0x05, 0xfe, 0xd1, 0x8a, 0x01, 0x17, 0x90, 0x66, 0xfe, 0xf5, 0x11, 0xfe, 0xef, 0x29, 0x14, 0x4d, 0x43, 0x12, 0x0b, 0x01, 0x3d, 0x05, 0x0f, 0xfe, 0xea, 0x67, 0x1a, 0x39, 0x45, 0xa2, 0x81, 0x6b, 0xd7, 0x4f, 0x0d, 0x05, 0x39, 0xfe, 0xcb, 0x21, 0x15, 0x28, 0x05, 0x1b, 0x01, 0x2d, 0x1a, 0x1f, 0x07, 0x1c, 0x83, 0x29, 0x3b, 0x05, 0x05, 0x26, 0x05, 0x0d, 0x02, 0x08, 0xc6, 0x0a, 0x1a, 0xfe, 0x01, 0x5d, 0x08, 0x03, 0xac, 0xfe, 0xd4, 0x05, 0x74, 0x21, 0x05, 0x02, 0x15, 0xfe, 0xb1, 0x1d, 0x79, 0x05, 0x01, 0x22, 0x0d, 0x03, 0xb3, 0x07, 0xfe, 0xa5, 0x05, 0x86, 0x26, 0x0d, 0x32, 0x7c, 0x0c, 0xac, 0xaa, 0x08, 0x1c, 0x62, 0xb3, 0x01, 0x14, 0x08, 0x1d, 0x61, 0x24, 0x0a, 0x55, 0x2b, 0x06, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x0a, 0x00, 0x23, 0x00, 0x38, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x05, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x02, 0x8c, 0x9a, 0xa7, 0xb6, 0x72, 0x9a, 0xfe, 0x4b, 0xfe, 0x28, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x01, 0xea, 0x01, 0x9a, 0x1a, 0x61, 0x1e, 0xfe, 0x01, 0x5c, 0xb8, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x1c, 0x00, 0x35, 0x00, 0x4a, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x35, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x03, 0x07, 0x01, 0x32, 0xfe, 0x26, 0x39, 0xb9, 0x16, 0x2c, 0x21, 0x43, 0x36, 0x2a, 0x5d, 0x50, 0x44, 0x65, 0x2b, 0x73, 0x8a, 0x22, 0x2b, 0x0d, 0x7d, 0xfd, 0x56, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x01, 0xd2, 0x5d, 0x55, 0x31, 0x9e, 0x15, 0x29, 0x38, 0x1a, 0x28, 0x33, 0x18, 0x26, 0x6e, 0x19, 0x14, 0x63, 0x51, 0x26, 0x44, 0x2d, 0x0d, 0x6d, 0xfe, 0xba, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x28, 0x00, 0x41, 0x00, 0x56, 0x00, 0x6b, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x03, 0xeb, 0x09, 0x56, 0x9c, 0x8d, 0x2e, 0x61, 0x3f, 0x41, 0x5b, 0x2f, 0x55, 0x53, 0x4e, 0x47, 0x64, 0x68, 0x41, 0x40, 0x43, 0x42, 0x25, 0x56, 0x4e, 0x44, 0x62, 0x2c, 0x74, 0x8b, 0x4b, 0xfc, 0xc6, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x02, 0xbe, 0x02, 0x53, 0x3c, 0x5c, 0x65, 0x0e, 0x12, 0x6c, 0x1e, 0x12, 0x32, 0x33, 0x2d, 0x32, 0x5b, 0x27, 0x26, 0x27, 0x29, 0x0e, 0x14, 0x62, 0x0f, 0x0d, 0x59, 0x4b, 0x34, 0x4a, 0xfe, 0x18, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x26, 0x00, 0x3b, 0x00, 0x50, 0x00, 0x00, 0x01, 0x03, 0x33, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x03, 0x57, 0xcf, 0xcf, 0x12, 0x9f, 0x6d, 0x6d, 0x8d, 0xfe, 0xa8, 0xfe, 0xb5, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x03, 0x52, 0xfe, 0xff, 0x01, 0x8a, 0xfe, 0x76, 0x5f, 0x8e, 0x8e, 0x60, 0xfe, 0x84, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x1d, 0x00, 0x36, 0x00, 0x4b, 0x00, 0x60, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x15, 0x06, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x02, 0x75, 0x01, 0x96, 0xfe, 0xe5, 0x02, 0x2c, 0x15, 0x7d, 0x92, 0x96, 0x87, 0x2d, 0x5e, 0x3f, 0x45, 0x54, 0x2f, 0x4a, 0x54, 0x54, 0x4a, 0x23, 0x48, 0x3f, 0xfe, 0x3f, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x03, 0xd0, 0x5f, 0x70, 0x01, 0x07, 0x74, 0x63, 0x64, 0x72, 0x0e, 0x0f, 0x72, 0x1f, 0x12, 0x40, 0x38, 0x39, 0x40, 0x0d, 0x19, 0xfe, 0x53, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x09, 0x00, 0x22, 0x00, 0x3b, 0x00, 0x50, 0x00, 0x65, 0x00, 0x00, 0x01, 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x03, 0x2c, 0x32, 0x3d, 0x3d, 0x32, 0x34, 0x3b, 0x3b, 0x8a, 0x37, 0x3f, 0x1f, 0x4e, 0x53, 0x03, 0x06, 0x54, 0x32, 0x69, 0x7a, 0x7f, 0x69, 0x78, 0x7e, 0x98, 0x84, 0x22, 0x45, 0xfc, 0xfb, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x02, 0xbc, 0x41, 0x76, 0x40, 0x40, 0x76, 0x41, 0x01, 0x0e, 0x66, 0x16, 0x0e, 0x60, 0x35, 0x07, 0x28, 0x73, 0x61, 0x5f, 0x74, 0xa5, 0x96, 0x8f, 0xae, 0x0c, 0xfc, 0xfd, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x34, 0x00, 0x49, 0x00, 0x00, 0x01, 0x21, 0x15, 0x03, 0x23, 0x13, 0x21, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x02, 0x5f, 0x01, 0xce, 0xf5, 0x84, 0xe5, 0xfe, 0xc6, 0xfe, 0x55, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x03, 0xba, 0x32, 0xfd, 0xb9, 0x02, 0x1a, 0xfd, 0x7b, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x42, 0x00, 0x00, 0x37, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0xb4, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0xd6, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x9a, 0x00, 0x00, 0x05, 0xd9, 0x05, 0xa1, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x39, 0x00, 0x48, 0x00, 0x52, 0x00, 0x00, 0x01, 0x21, 0x32, 0x1f, 0x01, 0x37, 0x33, 0x15, 0x02, 0x07, 0x21, 0x35, 0x36, 0x37, 0x03, 0x26, 0x23, 0x07, 0x32, 0x1f, 0x01, 0x03, 0x26, 0x27, 0x12, 0x37, 0x36, 0x01, 0x12, 0x15, 0x17, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x26, 0x03, 0x36, 0x37, 0x05, 0x12, 0x17, 0x27, 0x02, 0x0f, 0x01, 0x17, 0x23, 0x03, 0x27, 0x36, 0x37, 0x36, 0x35, 0x27, 0x35, 0x33, 0x01, 0x33, 0x15, 0x21, 0x32, 0x37, 0x33, 0x14, 0x03, 0x06, 0x2b, 0x01, 0x15, 0x23, 0x03, 0x27, 0x17, 0x11, 0x07, 0x21, 0x22, 0x2f, 0x01, 0x34, 0x37, 0x02, 0xd9, 0x01, 0x5f, 0x34, 0x1e, 0x42, 0x5a, 0x05, 0x8d, 0x0f, 0xfe, 0xcc, 0x57, 0x04, 0xb2, 0x1f, 0x0c, 0x5c, 0x5f, 0x26, 0x2c, 0xae, 0xf0, 0x19, 0x86, 0x14, 0x2c, 0x03, 0x05, 0x95, 0x02, 0x58, 0x0d, 0x24, 0x71, 0x0c, 0x9e, 0x16, 0xb5, 0xfc, 0xd3, 0x9a, 0x02, 0x65, 0xad, 0x03, 0x03, 0x04, 0x04, 0xb5, 0x07, 0x03, 0x48, 0x18, 0x5a, 0xcd, 0x02, 0x8f, 0x02, 0x01, 0x63, 0x1d, 0x1b, 0x03, 0xb5, 0x15, 0x1c, 0xb8, 0x04, 0x98, 0x54, 0x04, 0x04, 0xfe, 0xfb, 0x69, 0x2a, 0x04, 0x4b, 0x05, 0xa1, 0x54, 0x7d, 0x37, 0x02, 0xfe, 0xed, 0x15, 0x05, 0x35, 0x09, 0x01, 0x62, 0x1a, 0x05, 0x5c, 0x56, 0xfe, 0xb6, 0x9a, 0x13, 0x01, 0x04, 0x1c, 0x2f, 0xfe, 0x56, 0xfe, 0xea, 0x17, 0x27, 0x66, 0x3a, 0x08, 0x0f, 0x01, 0x3a, 0x17, 0x70, 0x1b, 0xfe, 0xe0, 0x0d, 0x3f, 0xfe, 0xb6, 0x10, 0x29, 0x1d, 0x01, 0x5c, 0x20, 0x1f, 0x80, 0x29, 0x0b, 0x39, 0x03, 0xfe, 0xa5, 0x73, 0x1a, 0x09, 0xfe, 0xa4, 0x17, 0x73, 0x01, 0x25, 0xb0, 0x06, 0xfe, 0xa9, 0x05, 0x80, 0x30, 0x30, 0x82, 0x00, 0x00, 0x00, 0x07, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd9, 0x00, 0x13, 0x00, 0x25, 0x00, 0x32, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x5c, 0x00, 0x65, 0x00, 0x00, 0x01, 0x33, 0x20, 0x13, 0x16, 0x1d, 0x01, 0x10, 0x05, 0x06, 0x2b, 0x01, 0x20, 0x03, 0x26, 0x3d, 0x01, 0x10, 0x25, 0x36, 0x17, 0x15, 0x32, 0x1f, 0x01, 0x15, 0x06, 0x07, 0x15, 0x33, 0x36, 0x37, 0x23, 0x07, 0x26, 0x27, 0x26, 0x23, 0x01, 0x16, 0x33, 0x36, 0x13, 0x26, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x05, 0x15, 0x13, 0x33, 0x32, 0x37, 0x34, 0x2f, 0x01, 0x22, 0x05, 0x17, 0x06, 0x07, 0x14, 0x1f, 0x01, 0x33, 0x34, 0x3f, 0x01, 0x33, 0x17, 0x27, 0x01, 0x07, 0x16, 0x17, 0x33, 0x35, 0x37, 0x33, 0x32, 0x3f, 0x01, 0x35, 0x23, 0x06, 0x23, 0x21, 0x27, 0x35, 0x05, 0x06, 0x1d, 0x01, 0x14, 0x1f, 0x01, 0x33, 0x11, 0x03, 0x2e, 0x19, 0x01, 0x63, 0xdb, 0x57, 0xfe, 0x97, 0x92, 0xa5, 0x03, 0xfe, 0x7b, 0xd0, 0x4b, 0x01, 0x1c, 0xab, 0x7c, 0x22, 0x2e, 0x6d, 0x19, 0x34, 0xfc, 0x09, 0x77, 0x03, 0x4a, 0x47, 0x11, 0x13, 0x17, 0xfd, 0xc7, 0xda, 0x08, 0x04, 0x86, 0x3c, 0x14, 0x1a, 0x2d, 0x56, 0x30, 0x46, 0x0b, 0x02, 0x40, 0x8a, 0x6a, 0x58, 0x18, 0x5b, 0x25, 0x0c, 0xfc, 0x38, 0x48, 0x44, 0x09, 0x7d, 0x1a, 0x02, 0x19, 0x80, 0x08, 0x44, 0x7d, 0x01, 0xc6, 0x79, 0x05, 0x74, 0x03, 0x06, 0x9a, 0x21, 0x37, 0x5f, 0x03, 0x13, 0x1f, 0xfe, 0xe4, 0x06, 0xfe, 0x20, 0x3b, 0x60, 0x17, 0xe3, 0x05, 0xd9, 0xfe, 0x92, 0xae, 0xcf, 0x06, 0xfe, 0x4f, 0xeb, 0x4c, 0x01, 0x86, 0xa8, 0xa3, 0x35, 0x01, 0x5f, 0xf1, 0x83, 0x93, 0x03, 0x6b, 0xce, 0x03, 0x16, 0x1f, 0x03, 0x08, 0xf0, 0x2c, 0x89, 0x16, 0x0c, 0xfe, 0xdf, 0x8b, 0x0f, 0x01, 0x01, 0x7e, 0x12, 0x79, 0x7d, 0x1f, 0xde, 0x03, 0xfe, 0xf4, 0x8a, 0x2f, 0x9d, 0x4d, 0x3c, 0x34, 0x7b, 0x31, 0x16, 0xe8, 0x3b, 0x43, 0x19, 0xf8, 0x2c, 0xf1, 0xfe, 0xe5, 0xfb, 0x03, 0xec, 0x5b, 0x06, 0x80, 0xb1, 0x03, 0x10, 0x06, 0x5f, 0x65, 0x69, 0x27, 0x0c, 0x5b, 0x29, 0x04, 0x01, 0x24, 0x00, 0x08, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd9, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x2f, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x52, 0x00, 0x60, 0x00, 0x6a, 0x00, 0x00, 0x01, 0x20, 0x13, 0x16, 0x15, 0x10, 0x05, 0x06, 0x23, 0x20, 0x03, 0x26, 0x35, 0x10, 0x25, 0x36, 0x01, 0x10, 0x05, 0x16, 0x3b, 0x01, 0x20, 0x13, 0x36, 0x35, 0x10, 0x25, 0x26, 0x23, 0x20, 0x03, 0x06, 0x01, 0x21, 0x32, 0x1f, 0x01, 0x37, 0x15, 0x06, 0x07, 0x23, 0x35, 0x37, 0x26, 0x2f, 0x01, 0x23, 0x32, 0x1f, 0x01, 0x03, 0x23, 0x26, 0x27, 0x36, 0x37, 0x36, 0x01, 0x16, 0x1d, 0x01, 0x06, 0x2b, 0x01, 0x03, 0x25, 0x33, 0x17, 0x07, 0x23, 0x27, 0x23, 0x02, 0x07, 0x15, 0x26, 0x03, 0x27, 0x34, 0x37, 0x27, 0x01, 0x33, 0x15, 0x21, 0x32, 0x37, 0x15, 0x03, 0x07, 0x23, 0x07, 0x15, 0x23, 0x27, 0x25, 0x21, 0x17, 0x11, 0x07, 0x23, 0x22, 0x2f, 0x01, 0x36, 0x03, 0x3c, 0x01, 0x6e, 0xd6, 0x5c, 0xfe, 0xaa, 0x93, 0xbc, 0xfe, 0x87, 0xd0, 0x55, 0x01, 0x61, 0x99, 0xfe, 0x2d, 0x01, 0x3e, 0x8e, 0x99, 0x2b, 0x01, 0x44, 0xce, 0x53, 0xfe, 0xba, 0x90, 0xa6, 0xfe, 0xa2, 0xc9, 0x52, 0x02, 0x1e, 0x01, 0x1b, 0x30, 0x15, 0x34, 0x49, 0x62, 0x18, 0xf5, 0x46, 0x84, 0x17, 0x19, 0x45, 0x52, 0x1b, 0x28, 0x8a, 0x03, 0xcc, 0x10, 0x6b, 0x19, 0x28, 0x02, 0x5f, 0x7b, 0x13, 0x61, 0x5a, 0x8c, 0xfd, 0x29, 0xf8, 0x83, 0x03, 0x03, 0x46, 0x03, 0x95, 0x05, 0x0b, 0x8d, 0x02, 0x4e, 0x46, 0x02, 0xb0, 0x06, 0x01, 0x26, 0x12, 0x16, 0x9c, 0x15, 0x98, 0x05, 0x06, 0x79, 0xfe, 0xaf, 0x01, 0x0d, 0x06, 0x06, 0xdc, 0x49, 0x23, 0x06, 0x01, 0x05, 0xd9, 0xfe, 0x97, 0xb2, 0xd4, 0xfe, 0x58, 0xe9, 0x59, 0x01, 0x74, 0xa2, 0xdb, 0x01, 0xa9, 0xeb, 0x54, 0xfd, 0x12, 0xfe, 0x70, 0xd8, 0x58, 0x01, 0x59, 0xa5, 0xc5, 0x01, 0x8c, 0xe0, 0x53, 0xfe, 0xa6, 0x9f, 0x01, 0x6d, 0x45, 0x62, 0x2c, 0x03, 0xcc, 0x23, 0x03, 0x34, 0xfe, 0x27, 0x0c, 0x46, 0x56, 0xfe, 0xfe, 0x7f, 0x10, 0xd5, 0x1a, 0x20, 0xfe, 0xa7, 0xe2, 0x21, 0x17, 0x82, 0x01, 0x09, 0x59, 0xf4, 0x03, 0x31, 0xfe, 0xea, 0x15, 0x1a, 0x0b, 0x01, 0x12, 0x11, 0x1c, 0x8d, 0x31, 0xfe, 0xec, 0x5f, 0x14, 0x06, 0xfe, 0xdc, 0x09, 0x06, 0x55, 0xee, 0x8c, 0x05, 0xfe, 0xeb, 0x05, 0x67, 0x2c, 0x31, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd9, 0x00, 0x07, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x41, 0x00, 0x52, 0x00, 0x00, 0x01, 0x16, 0x17, 0x32, 0x37, 0x26, 0x27, 0x06, 0x01, 0x20, 0x13, 0x16, 0x15, 0x10, 0x05, 0x06, 0x23, 0x20, 0x03, 0x26, 0x35, 0x10, 0x25, 0x36, 0x01, 0x06, 0x07, 0x16, 0x33, 0x36, 0x37, 0x26, 0x01, 0x15, 0x23, 0x06, 0x2b, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x36, 0x37, 0x32, 0x17, 0x36, 0x33, 0x1e, 0x01, 0x15, 0x14, 0x15, 0x14, 0x15, 0x14, 0x06, 0x07, 0x23, 0x22, 0x27, 0x23, 0x25, 0x10, 0x05, 0x16, 0x3b, 0x01, 0x20, 0x13, 0x36, 0x35, 0x10, 0x25, 0x26, 0x23, 0x20, 0x03, 0x06, 0x01, 0x95, 0x02, 0xa5, 0x81, 0x57, 0x4e, 0x92, 0x9d, 0x01, 0xa5, 0x01, 0x6e, 0xd6, 0x5c, 0xfe, 0xaa, 0x93, 0xbc, 0xfe, 0x87, 0xd0, 0x55, 0x01, 0x61, 0x99, 0x01, 0xb1, 0x92, 0x4e, 0x57, 0x81, 0xa5, 0x02, 0x02, 0xfe, 0x5a, 0x03, 0x6a, 0xa0, 0x0d, 0x7e, 0x6d, 0x8c, 0x7a, 0x8d, 0x72, 0x73, 0x8e, 0x7a, 0x8c, 0x6d, 0x7e, 0x0d, 0xa0, 0x6b, 0x02, 0xfd, 0x83, 0x01, 0x3e, 0x8e, 0x99, 0x2b, 0x01, 0x44, 0xce, 0x53, 0xfe, 0xba, 0x90, 0xa6, 0xfe, 0xa2, 0xc9, 0x52, 0x02, 0xf4, 0xcd, 0x02, 0xcb, 0xc2, 0x04, 0x03, 0x02, 0x26, 0xfe, 0x97, 0xb2, 0xd4, 0xfe, 0x58, 0xe9, 0x59, 0x01, 0x74, 0xa2, 0xdb, 0x01, 0xa9, 0xeb, 0x54, 0xfd, 0xdd, 0x04, 0xc2, 0xcb, 0x02, 0xcd, 0xbf, 0xfe, 0xf3, 0x1c, 0xbd, 0x0f, 0xb9, 0x50, 0x07, 0x08, 0x04, 0x05, 0x74, 0x99, 0x01, 0xaa, 0xaa, 0x01, 0x99, 0x74, 0x05, 0x04, 0x08, 0x07, 0x50, 0xb9, 0x0f, 0xbd, 0x61, 0xfe, 0x70, 0xd8, 0x58, 0x01, 0x59, 0xa5, 0xc5, 0x01, 0x8c, 0xe0, 0x53, 0xfe, 0xa6, 0x9f, 0x00, 0x00, 0x00, 0x02, 0x01, 0x12, 0x00, 0x02, 0x05, 0x61, 0x05, 0xd9, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x32, 0x15, 0x06, 0x07, 0x17, 0x33, 0x32, 0x17, 0x07, 0x23, 0x17, 0x21, 0x16, 0x13, 0x37, 0x17, 0x06, 0x07, 0x26, 0x03, 0x21, 0x22, 0x03, 0x34, 0x01, 0x06, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x14, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x17, 0x06, 0x02, 0x57, 0x8a, 0x01, 0x73, 0x16, 0xf7, 0x0b, 0x0e, 0x03, 0xf8, 0x0b, 0x01, 0x91, 0x0a, 0x7f, 0x79, 0x2b, 0x05, 0xf6, 0x0e, 0x87, 0xfe, 0x53, 0x0b, 0x4c, 0x01, 0xc5, 0x65, 0x6f, 0x70, 0xcb, 0x71, 0x3a, 0x1e, 0x2a, 0x24, 0x16, 0x02, 0x4a, 0x89, 0x96, 0x88, 0x25, 0x3e, 0x29, 0x05, 0xd9, 0x8e, 0xa3, 0x02, 0xe6, 0x92, 0x04, 0x65, 0x06, 0xfe, 0x72, 0x28, 0x8d, 0x08, 0x59, 0x18, 0x01, 0xad, 0x03, 0x24, 0x85, 0xfa, 0x68, 0x3f, 0x7d, 0xe1, 0x7d, 0x7c, 0x72, 0x3c, 0x2e, 0xd9, 0x3c, 0x43, 0x53, 0x98, 0x53, 0x53, 0x4c, 0xa9, 0x32, 0x00, 0x00, 0x03, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x02, 0xa4, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xe3, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x02, 0xe9, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0x42, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x04, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfc, 0xcc, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x01, 0xae, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x02, 0x9c, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfc, 0x0c, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x01, 0x17, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x01, 0x17, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfc, 0xcc, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x01, 0xae, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x01, 0x66, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x01, 0x61, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfc, 0x0c, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x06, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xd2, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfc, 0xcc, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x04, 0x1f, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0xba, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x02, 0x9c, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfc, 0x0c, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x07, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x5b, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xd2, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfe, 0xe9, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xe3, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x04, 0x1f, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0xba, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x02, 0x9c, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfe, 0xf5, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0x42, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x46, 0x00, 0x5d, 0x00, 0x74, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x03, 0xba, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xd3, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xd2, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfc, 0xcc, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x02, 0xe9, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x01, 0x93, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0x56, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x03, 0x00, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfb, 0xda, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x99, 0x00, 0x01, 0x05, 0xdc, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x00, 0x01, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x02, 0x10, 0x12, 0x24, 0x01, 0x14, 0x12, 0x04, 0x20, 0x24, 0x12, 0x35, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x04, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x03, 0x3a, 0xa9, 0x01, 0x42, 0xb6, 0xb1, 0xfe, 0xbf, 0xfe, 0xa3, 0xfe, 0xbe, 0xb1, 0xb5, 0x01, 0x41, 0xfe, 0x57, 0x9d, 0x01, 0x1c, 0x01, 0x36, 0x01, 0x1c, 0x9d, 0xa1, 0xfe, 0xe3, 0x96, 0x97, 0xfe, 0xe3, 0xa0, 0x03, 0x38, 0x1e, 0x36, 0x1e, 0x1d, 0x36, 0x1f, 0x20, 0x36, 0x1c, 0x1e, 0x35, 0x05, 0xd9, 0xc1, 0xfe, 0x98, 0xfe, 0x7a, 0xfe, 0x9d, 0xc6, 0xc6, 0x01, 0x63, 0x01, 0x86, 0x01, 0x68, 0xc1, 0xfd, 0x14, 0xad, 0xfe, 0xc5, 0xae, 0xae, 0x01, 0x3b, 0xad, 0xac, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xcd, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0x00, 0x01, 0x05, 0xdc, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x36, 0x00, 0x00, 0x01, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x02, 0x10, 0x12, 0x24, 0x01, 0x14, 0x12, 0x04, 0x20, 0x24, 0x12, 0x35, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x04, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x24, 0x32, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x34, 0x36, 0x03, 0x3a, 0xa9, 0x01, 0x42, 0xb6, 0xb1, 0xfe, 0xbf, 0xfe, 0xa3, 0xfe, 0xbe, 0xb1, 0xb5, 0x01, 0x41, 0xfe, 0x57, 0x9d, 0x01, 0x1c, 0x01, 0x36, 0x01, 0x1c, 0x9d, 0xa1, 0xfe, 0xe3, 0x96, 0x97, 0xfe, 0xe3, 0xa0, 0x03, 0x38, 0x1e, 0x36, 0x1e, 0x1d, 0x36, 0x1f, 0x20, 0x36, 0x1c, 0x1e, 0x35, 0xfd, 0x85, 0x3a, 0x36, 0x1f, 0x1f, 0x36, 0x1d, 0x1d, 0x36, 0x1f, 0x20, 0x05, 0xd9, 0xc1, 0xfe, 0x98, 0xfe, 0x7a, 0xfe, 0x9d, 0xc6, 0xc6, 0x01, 0x63, 0x01, 0x86, 0x01, 0x68, 0xc1, 0xfd, 0x14, 0xad, 0xfe, 0xc5, 0xae, 0xae, 0x01, 0x3b, 0xad, 0xac, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xcd, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x20, 0xdc, 0x20, 0x3d, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x01, 0x05, 0xdc, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x02, 0x10, 0x12, 0x24, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x14, 0x1e, 0x01, 0x03, 0x3a, 0xa9, 0x01, 0x42, 0xb6, 0xb1, 0xfe, 0xbf, 0xfe, 0xa3, 0xfe, 0xbe, 0xb1, 0xb5, 0x01, 0x41, 0x02, 0x01, 0x1c, 0x36, 0x20, 0x1f, 0x36, 0x1d, 0x1e, 0x36, 0x1e, 0x1f, 0x35, 0x05, 0xd9, 0xc1, 0xfe, 0x98, 0xfe, 0x7a, 0xfe, 0x9d, 0xc6, 0xc6, 0x01, 0x63, 0x01, 0x86, 0x01, 0x68, 0xc1, 0xfc, 0x96, 0x20, 0x3d, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x00, 0x00, 0x03, 0x00, 0x99, 0x00, 0x01, 0x05, 0xdc, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x00, 0x01, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x02, 0x10, 0x12, 0x24, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x14, 0x1e, 0x01, 0x24, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x03, 0x3a, 0xa9, 0x01, 0x42, 0xb6, 0xb1, 0xfe, 0xbf, 0xfe, 0xa3, 0xfe, 0xbe, 0xb1, 0xb5, 0x01, 0x41, 0x02, 0x01, 0x1c, 0x36, 0x20, 0x1f, 0x36, 0x1d, 0x1e, 0x36, 0x1e, 0x1f, 0x35, 0xfc, 0xfb, 0x1f, 0x36, 0x1d, 0x1d, 0x36, 0x1f, 0x1f, 0x36, 0x3a, 0x35, 0x05, 0xd9, 0xc1, 0xfe, 0x98, 0xfe, 0x7a, 0xfe, 0x9d, 0xc6, 0xc6, 0x01, 0x63, 0x01, 0x86, 0x01, 0x68, 0xc1, 0xfc, 0x96, 0x20, 0x3d, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x9f, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x20, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x00, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x99, 0x05, 0x42, 0xfa, 0xbe, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x00, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x25, 0x21, 0x15, 0x21, 0x99, 0x02, 0x23, 0xfd, 0xdd, 0x03, 0x1f, 0x02, 0x23, 0xfd, 0xdd, 0xc8, 0xc8, 0xc8, 0xc8, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x03, 0x4d, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x85, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x03, 0x4d, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x03, 0x4e, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x03, 0x4e, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x00, 0x02, 0x01, 0x35, 0x00, 0x06, 0x05, 0x3d, 0x05, 0xd9, 0x00, 0x11, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x36, 0x33, 0x32, 0x04, 0x33, 0x32, 0x37, 0x11, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x2f, 0x01, 0x23, 0x35, 0x33, 0x15, 0x23, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x06, 0x23, 0x22, 0x24, 0x23, 0x22, 0x07, 0x11, 0x23, 0x01, 0xd3, 0x2f, 0x36, 0x73, 0x01, 0x2d, 0xa8, 0x3f, 0x41, 0x2f, 0x30, 0x96, 0x9f, 0x7d, 0xac, 0x2d, 0x31, 0x12, 0x59, 0x44, 0xf3, 0x45, 0x30, 0x2e, 0xae, 0x9a, 0x98, 0x91, 0x47, 0x43, 0x5f, 0x5c, 0x9a, 0xfe, 0xe3, 0x74, 0x48, 0x3f, 0x56, 0x02, 0x9f, 0x11, 0xa3, 0x0c, 0x02, 0x62, 0x0a, 0x5f, 0x7e, 0x09, 0x02, 0x5d, 0x35, 0x35, 0x1a, 0x08, 0x78, 0x5c, 0x15, 0xfd, 0x0d, 0x1c, 0x9a, 0x1e, 0xfd, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x35, 0x00, 0x06, 0x05, 0x3d, 0x05, 0xd9, 0x00, 0x18, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x15, 0x23, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x06, 0x23, 0x22, 0x24, 0x23, 0x22, 0x07, 0x11, 0x23, 0x01, 0x7a, 0x44, 0xf3, 0x45, 0x30, 0x2e, 0xae, 0x9a, 0x98, 0x91, 0x47, 0x43, 0x5f, 0x5c, 0x9a, 0xfe, 0xe3, 0x74, 0x48, 0x3f, 0x56, 0x05, 0xa4, 0x35, 0x35, 0x1a, 0x08, 0x78, 0x5c, 0x15, 0xfd, 0x0d, 0x1c, 0x9a, 0x1e, 0xfd, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x01, 0x06, 0x15, 0x05, 0xda, 0x00, 0x1f, 0x00, 0x00, 0x09, 0x01, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x09, 0x01, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x16, 0x13, 0x09, 0x01, 0x17, 0x01, 0x07, 0x03, 0x27, 0x07, 0x03, 0x27, 0x01, 0x02, 0xe4, 0xfe, 0xd4, 0xa6, 0xb3, 0xa8, 0x2a, 0x7d, 0x26, 0xa7, 0xb1, 0xa6, 0x01, 0x2c, 0x01, 0x2c, 0xa6, 0xb2, 0xa6, 0x28, 0x7a, 0x28, 0x3f, 0x1f, 0xfe, 0xf1, 0xfe, 0xd5, 0xa0, 0x01, 0x1f, 0xa7, 0xf3, 0xa1, 0xa0, 0xf3, 0xa6, 0x01, 0x1e, 0x02, 0x7e, 0x01, 0x51, 0xbb, 0xc7, 0xbb, 0x2c, 0x8a, 0x2c, 0xba, 0xc8, 0xba, 0xfe, 0xb0, 0x01, 0x4f, 0xbb, 0xc8, 0xbb, 0x2d, 0x8a, 0x2c, 0x71, 0xfe, 0x74, 0x01, 0x35, 0xfe, 0xaf, 0xb3, 0xfe, 0xf0, 0xb9, 0x01, 0x40, 0xb4, 0xb4, 0xfe, 0xc0, 0xb9, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb2, 0xff, 0xec, 0x05, 0xc2, 0x05, 0xdb, 0x00, 0x0f, 0x00, 0x52, 0x00, 0x00, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x13, 0x15, 0x23, 0x06, 0x23, 0x22, 0x27, 0x35, 0x23, 0x15, 0x23, 0x22, 0x24, 0x27, 0x26, 0x27, 0x07, 0x03, 0x05, 0x07, 0x30, 0x17, 0x16, 0x17, 0x16, 0x17, 0x11, 0x21, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x21, 0x11, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x27, 0x25, 0x03, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x02, 0xc2, 0x23, 0x41, 0x22, 0x24, 0x40, 0x24, 0x25, 0x40, 0x23, 0x22, 0x40, 0x24, 0xcc, 0x07, 0x22, 0x23, 0x02, 0x03, 0x06, 0x07, 0x98, 0xfe, 0xea, 0x4d, 0x0f, 0x0b, 0x4f, 0x1a, 0x01, 0x14, 0x4e, 0x06, 0x41, 0x77, 0x62, 0x6a, 0xfe, 0xae, 0x01, 0x52, 0x18, 0x16, 0x38, 0x3d, 0x3e, 0x70, 0x3b, 0x3b, 0x70, 0x40, 0x3f, 0x36, 0x19, 0x17, 0x01, 0x48, 0xfe, 0xb8, 0x5a, 0x54, 0x77, 0x43, 0x02, 0x02, 0x4e, 0x01, 0x15, 0x1b, 0x4e, 0x0b, 0x0f, 0x4e, 0x8b, 0x67, 0x04, 0xd6, 0x27, 0x48, 0x27, 0x27, 0x48, 0x27, 0x28, 0x48, 0x27, 0x27, 0x48, 0xfa, 0xf2, 0x01, 0x03, 0x01, 0x02, 0x02, 0x60, 0x58, 0x11, 0x10, 0x41, 0x01, 0x4b, 0x7c, 0x40, 0x06, 0x58, 0x31, 0x28, 0x07, 0x02, 0xd4, 0x81, 0x33, 0x08, 0x0e, 0x22, 0x7c, 0x88, 0x7d, 0x44, 0x44, 0x7d, 0x88, 0x7c, 0x22, 0x0e, 0x09, 0x32, 0x81, 0xfd, 0x2f, 0x0a, 0x22, 0x31, 0x58, 0x03, 0x03, 0x40, 0x7c, 0xfe, 0xb5, 0x41, 0x10, 0x11, 0x58, 0x31, 0x23, 0x00, 0x00, 0x01, 0x00, 0xf2, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd6, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x13, 0x36, 0x37, 0x33, 0x06, 0x07, 0x17, 0x16, 0x17, 0x0e, 0x01, 0x07, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x27, 0x36, 0x37, 0x0b, 0x01, 0x16, 0x17, 0x07, 0x26, 0x27, 0x07, 0x06, 0x07, 0x22, 0x26, 0x27, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x13, 0x01, 0x27, 0x09, 0x01, 0x07, 0x03, 0x7f, 0xfa, 0x43, 0x19, 0x51, 0x16, 0x54, 0x8d, 0x37, 0x02, 0x05, 0x36, 0x27, 0x40, 0x03, 0x8e, 0x5c, 0x52, 0x23, 0x5c, 0x3b, 0xdc, 0xd9, 0x3b, 0x5b, 0x22, 0x53, 0x5e, 0x8c, 0x01, 0x39, 0x24, 0x43, 0x04, 0x01, 0x39, 0x8c, 0x54, 0x17, 0x53, 0x18, 0x44, 0xfa, 0xfe, 0x19, 0x1d, 0x02, 0x47, 0x02, 0x49, 0x1d, 0x02, 0xbd, 0xfe, 0xd0, 0x3b, 0x3c, 0x75, 0x49, 0xb6, 0x03, 0x40, 0x2a, 0x22, 0x01, 0x04, 0x4f, 0xa8, 0x38, 0x08, 0x42, 0x11, 0x31, 0x01, 0x22, 0xfe, 0xde, 0x31, 0x11, 0x42, 0x08, 0x38, 0xa8, 0x48, 0x0b, 0x1d, 0x24, 0x4c, 0x03, 0xb6, 0x49, 0x75, 0x3c, 0x3b, 0x01, 0x30, 0x02, 0x84, 0x95, 0xfd, 0x3a, 0x02, 0xc6, 0x95, 0x00, 0x00, 0x05, 0x00, 0x70, 0xff, 0xec, 0x03, 0x73, 0x05, 0xdb, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x4f, 0x00, 0x60, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x06, 0x23, 0x22, 0x27, 0x35, 0x26, 0x35, 0x34, 0x37, 0x17, 0x06, 0x15, 0x14, 0x04, 0x07, 0x23, 0x26, 0x03, 0x24, 0x35, 0x34, 0x37, 0x15, 0x06, 0x15, 0x14, 0x04, 0x17, 0x06, 0x07, 0x35, 0x36, 0x35, 0x34, 0x27, 0x11, 0x27, 0x13, 0x11, 0x27, 0x11, 0x24, 0x27, 0x36, 0x37, 0x32, 0x33, 0x32, 0x17, 0x07, 0x17, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x04, 0x17, 0x06, 0x05, 0x35, 0x36, 0x27, 0x34, 0x35, 0x34, 0x25, 0x27, 0x03, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x01, 0x32, 0x19, 0x0c, 0x0a, 0x05, 0x20, 0xe0, 0x0b, 0x18, 0x20, 0x02, 0xa3, 0x93, 0x01, 0x3a, 0x01, 0x22, 0x01, 0x0e, 0x19, 0xb1, 0xfe, 0xfe, 0xf3, 0x9a, 0x01, 0xf5, 0x03, 0x04, 0xf8, 0xa3, 0xb1, 0x45, 0x45, 0x45, 0xfe, 0x9d, 0x04, 0x0c, 0xc0, 0x04, 0x02, 0x3b, 0x2f, 0x64, 0x55, 0x15, 0x18, 0x33, 0x3d, 0x08, 0x06, 0x28, 0x02, 0xa4, 0x05, 0x06, 0xfe, 0xba, 0xf6, 0x01, 0xff, 0x00, 0x45, 0x05, 0x13, 0x15, 0x15, 0x26, 0x14, 0x15, 0x25, 0x16, 0x15, 0x13, 0x04, 0xa4, 0x0c, 0x09, 0x06, 0x0a, 0x0b, 0xfb, 0x94, 0x42, 0x1d, 0x40, 0x30, 0x22, 0x40, 0x52, 0x1a, 0x2f, 0x18, 0x18, 0x2f, 0x3e, 0x77, 0x41, 0x01, 0xb7, 0x26, 0x6f, 0x63, 0x2f, 0x44, 0x26, 0x33, 0x2e, 0x59, 0x61, 0x51, 0x2f, 0x35, 0x22, 0x31, 0x27, 0x22, 0xfe, 0xb4, 0x13, 0x03, 0x01, 0xfe, 0x81, 0x10, 0x01, 0x75, 0x13, 0x8a, 0x90, 0x05, 0x45, 0x1e, 0x19, 0x06, 0x1b, 0x02, 0x36, 0x32, 0x2f, 0x75, 0x8a, 0x10, 0x3d, 0x20, 0x3d, 0x01, 0x02, 0x21, 0x6d, 0x07, 0x01, 0x2d, 0x0b, 0x2e, 0x18, 0x19, 0x2e, 0x18, 0x18, 0x2e, 0x19, 0x18, 0x2e, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6c, 0xff, 0xec, 0x06, 0x07, 0x05, 0xdb, 0x00, 0x04, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0x25, 0x0b, 0x01, 0x16, 0x32, 0x25, 0x0b, 0x01, 0x16, 0x32, 0x01, 0x33, 0x32, 0x1d, 0x01, 0x14, 0x2b, 0x01, 0x13, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x3d, 0x01, 0x13, 0x21, 0x13, 0x15, 0x14, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x13, 0x23, 0x26, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x37, 0x17, 0x33, 0x1b, 0x01, 0x33, 0x37, 0x05, 0xbc, 0xf8, 0xf9, 0x7d, 0xf9, 0xfd, 0x6e, 0xf8, 0xf8, 0x7c, 0xf8, 0x02, 0xbc, 0xc0, 0x33, 0x25, 0xaf, 0xf9, 0x02, 0x2b, 0x2b, 0x9b, 0x56, 0x54, 0x9a, 0x55, 0xf5, 0xfd, 0x92, 0xf6, 0x54, 0x9b, 0xa9, 0x9c, 0x2c, 0x2a, 0x01, 0xf7, 0xb7, 0x1d, 0x33, 0xc2, 0x2f, 0x2e, 0xe3, 0x74, 0x74, 0xe3, 0x2f, 0xed, 0x03, 0x3c, 0xfc, 0xc4, 0x26, 0x26, 0x03, 0x3c, 0xfc, 0xc4, 0x26, 0x03, 0xd1, 0x2a, 0x19, 0x28, 0xfc, 0xc7, 0x44, 0x3e, 0x3f, 0x47, 0x47, 0x7a, 0x42, 0x08, 0x03, 0x36, 0xfc, 0xca, 0x06, 0x43, 0x7b, 0x47, 0x47, 0x3f, 0x3e, 0x44, 0x03, 0x39, 0x11, 0x1c, 0x0f, 0x2f, 0x9b, 0x9b, 0x01, 0x43, 0xfe, 0xbd, 0x9b, 0x00, 0x02, 0x00, 0x70, 0x00, 0x00, 0x06, 0x03, 0x05, 0xdb, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x00, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x03, 0x27, 0x12, 0x01, 0x13, 0x23, 0x03, 0x21, 0x11, 0x23, 0x03, 0x21, 0x03, 0x23, 0x13, 0x02, 0x8a, 0xa5, 0x8f, 0x30, 0x2d, 0xb5, 0x44, 0x1f, 0x0f, 0x27, 0x71, 0x44, 0x3f, 0x2b, 0x8d, 0x4a, 0x1e, 0x33, 0x23, 0x2b, 0x46, 0x92, 0xb4, 0x6c, 0xcf, 0x04, 0x6f, 0x55, 0x72, 0x4c, 0xfe, 0xff, 0x7c, 0x01, 0xfe, 0xff, 0x4d, 0x73, 0x56, 0x05, 0x87, 0x54, 0x09, 0x27, 0xa6, 0x4e, 0x51, 0x39, 0x3b, 0x8d, 0x3a, 0x23, 0x38, 0xb3, 0x48, 0x4c, 0x22, 0x43, 0xfe, 0xdf, 0x44, 0x01, 0x99, 0xfd, 0x7c, 0xfd, 0xa6, 0x01, 0xd7, 0xfe, 0x29, 0x01, 0xd7, 0xfe, 0x29, 0x02, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0b, 0x00, 0x00, 0x05, 0x68, 0x05, 0xdb, 0x00, 0x0d, 0x00, 0x35, 0x00, 0x00, 0x00, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x13, 0x15, 0x3b, 0x01, 0x32, 0x36, 0x37, 0x14, 0x04, 0x07, 0x06, 0x07, 0x23, 0x26, 0x3d, 0x01, 0x26, 0x24, 0x03, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x33, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x02, 0x9c, 0x2d, 0x52, 0x2b, 0x2d, 0x52, 0x2d, 0x2f, 0x51, 0x2c, 0x2a, 0x52, 0xa8, 0x05, 0x03, 0x87, 0xcb, 0x9b, 0xfe, 0x58, 0x23, 0x2f, 0x02, 0x26, 0x27, 0x04, 0xfe, 0x40, 0x4f, 0xb3, 0xd4, 0x74, 0x0c, 0x0c, 0x06, 0x3b, 0x36, 0x46, 0x4e, 0x4f, 0x8d, 0x96, 0x8e, 0x51, 0x4f, 0x47, 0x33, 0x04, 0xc4, 0x64, 0x59, 0x32, 0x32, 0x59, 0x64, 0x5b, 0x30, 0x30, 0xfe, 0x2d, 0x9c, 0xbf, 0x26, 0xe7, 0x9a, 0x97, 0x88, 0xf5, 0xa8, 0x9a, 0x14, 0x84, 0x8f, 0x01, 0x31, 0x02, 0xe9, 0x01, 0x9b, 0x07, 0x23, 0x2b, 0x9c, 0xac, 0x9e, 0x55, 0x55, 0x9e, 0xac, 0x9c, 0x2b, 0x20, 0x00, 0x00, 0x03, 0x00, 0xae, 0xff, 0xdd, 0x05, 0xc6, 0x05, 0xd0, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x32, 0x1f, 0x01, 0x16, 0x17, 0x37, 0x16, 0x17, 0x07, 0x16, 0x17, 0x37, 0x16, 0x17, 0x07, 0x16, 0x14, 0x07, 0x17, 0x06, 0x07, 0x27, 0x06, 0x07, 0x17, 0x06, 0x07, 0x27, 0x06, 0x0f, 0x01, 0x06, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x07, 0x26, 0x27, 0x37, 0x26, 0x27, 0x07, 0x26, 0x27, 0x37, 0x26, 0x34, 0x37, 0x27, 0x36, 0x37, 0x17, 0x36, 0x37, 0x27, 0x36, 0x37, 0x17, 0x36, 0x3f, 0x01, 0x12, 0x20, 0x02, 0x10, 0x12, 0x20, 0x12, 0x10, 0x04, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x03, 0x13, 0x4f, 0x26, 0x18, 0x3c, 0x3a, 0x71, 0x45, 0x39, 0x4b, 0x2a, 0x1e, 0x94, 0x21, 0x0f, 0x85, 0x03, 0x03, 0x85, 0x0f, 0x21, 0x94, 0x1e, 0x2a, 0x4b, 0x39, 0x45, 0x71, 0x3a, 0x3c, 0x18, 0x26, 0x4f, 0x27, 0x18, 0x3c, 0x39, 0x72, 0x44, 0x3a, 0x4c, 0x2b, 0x1d, 0x95, 0x21, 0x0e, 0x85, 0x04, 0x04, 0x85, 0x0e, 0x21, 0x95, 0x1d, 0x2b, 0x4c, 0x3a, 0x44, 0x72, 0x39, 0x3c, 0x18, 0xf2, 0xfe, 0xb8, 0xe8, 0xe8, 0x01, 0x48, 0xe8, 0xff, 0x00, 0x52, 0x73, 0x52, 0x52, 0x73, 0x05, 0xd0, 0x05, 0xbb, 0x0d, 0x1e, 0x84, 0x2d, 0x40, 0x9c, 0x32, 0x3c, 0x1f, 0x54, 0x5c, 0x45, 0x23, 0x44, 0x23, 0x46, 0x5b, 0x54, 0x1f, 0x3c, 0x33, 0x9b, 0x40, 0x2e, 0x84, 0x1d, 0x0e, 0xba, 0x06, 0x06, 0xba, 0x0e, 0x1d, 0x84, 0x2e, 0x40, 0x9b, 0x32, 0x3d, 0x1f, 0x54, 0x5b, 0x46, 0x23, 0x44, 0x23, 0x45, 0x5c, 0x54, 0x1f, 0x3c, 0x33, 0x9b, 0x40, 0x2d, 0x83, 0x1d, 0x0d, 0xbb, 0xfe, 0xc4, 0xfe, 0xfd, 0xfe, 0x95, 0xfe, 0xfe, 0x01, 0x02, 0x01, 0x6b, 0x75, 0x80, 0x5b, 0x5b, 0x80, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xeb, 0xff, 0xed, 0x05, 0x88, 0x05, 0xdd, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x36, 0x00, 0x3b, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x5b, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x14, 0x1e, 0x01, 0x33, 0x26, 0x34, 0x37, 0x22, 0x06, 0x05, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x07, 0x37, 0x26, 0x27, 0x14, 0x15, 0x14, 0x07, 0x17, 0x35, 0x34, 0x27, 0x06, 0x07, 0x17, 0x36, 0x35, 0x34, 0x05, 0x17, 0x36, 0x37, 0x06, 0x07, 0x17, 0x36, 0x37, 0x06, 0x07, 0x17, 0x36, 0x37, 0x06, 0x1f, 0x01, 0x26, 0x37, 0x06, 0x17, 0x37, 0x26, 0x35, 0x34, 0x37, 0x06, 0x15, 0x3f, 0x01, 0x26, 0x27, 0x06, 0x15, 0x14, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x33, 0x14, 0x23, 0x15, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x04, 0x17, 0x06, 0x23, 0x26, 0x22, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x15, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x03, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x23, 0x22, 0x07, 0x22, 0x27, 0x36, 0x25, 0x16, 0x17, 0x36, 0x37, 0x36, 0x03, 0x01, 0x0f, 0x1c, 0x10, 0x0d, 0x0d, 0x0f, 0x1d, 0x01, 0xc1, 0x63, 0x26, 0x17, 0x52, 0x82, 0x63, 0x21, 0x23, 0x51, 0x6c, 0x45, 0x0e, 0x2b, 0x36, 0x6f, 0x2e, 0x01, 0x35, 0x22, 0x59, 0x13, 0x36, 0x36, 0x2b, 0x2d, 0x34, 0x24, 0xfc, 0xce, 0x18, 0x26, 0x62, 0x4e, 0x25, 0x23, 0x21, 0x64, 0x57, 0x12, 0x2c, 0x0e, 0x44, 0x48, 0x0e, 0x35, 0x01, 0x2d, 0x3f, 0x36, 0x35, 0x14, 0x01, 0x22, 0x59, 0x34, 0x2d, 0x2a, 0x01, 0x01, 0x00, 0x32, 0x44, 0x44, 0x32, 0x2f, 0x46, 0x45, 0x51, 0x02, 0x02, 0x11, 0x13, 0x13, 0x23, 0x13, 0x12, 0x22, 0x14, 0x13, 0x11, 0x02, 0x03, 0x01, 0x01, 0x2f, 0x25, 0x03, 0x02, 0x48, 0x14, 0x01, 0x2d, 0x48, 0x4d, 0xe4, 0x24, 0x3e, 0x19, 0x04, 0x2f, 0x24, 0x2f, 0x01, 0x0a, 0x14, 0x17, 0x07, 0x01, 0x02, 0x2e, 0x24, 0x2e, 0x02, 0x1c, 0x24, 0x1f, 0x24, 0xe5, 0x4c, 0x48, 0x01, 0x2c, 0x13, 0x4a, 0x06, 0x09, 0x24, 0x05, 0xa0, 0x22, 0x1f, 0x12, 0x20, 0x42, 0x22, 0x11, 0x76, 0x3e, 0x30, 0x26, 0x38, 0x14, 0x61, 0x3e, 0x21, 0x55, 0x2a, 0x7e, 0x45, 0x13, 0x6d, 0x4c, 0x91, 0x4b, 0x08, 0x7d, 0x60, 0x11, 0x10, 0x81, 0x3f, 0x0a, 0x0c, 0x7b, 0x61, 0x88, 0x37, 0x1a, 0x63, 0x5b, 0x0d, 0x4f, 0x26, 0x30, 0x3e, 0x10, 0x6a, 0x21, 0x3e, 0x61, 0x29, 0x86, 0x13, 0x45, 0x7e, 0x43, 0x88, 0x08, 0x4b, 0x91, 0x57, 0x8b, 0x0a, 0x3d, 0x7b, 0x14, 0x15, 0x64, 0x7b, 0x03, 0x1a, 0x37, 0x88, 0x0e, 0x0d, 0x5b, 0x2b, 0x4d, 0x35, 0x37, 0x4c, 0x4c, 0x37, 0x35, 0x4d, 0x2d, 0x5a, 0x01, 0x02, 0x0a, 0x27, 0x2a, 0x27, 0x15, 0x15, 0x27, 0x2a, 0x27, 0x0a, 0x02, 0x01, 0x01, 0x59, 0x09, 0x28, 0x03, 0x04, 0x80, 0x35, 0x06, 0x5b, 0xa3, 0x0c, 0x0c, 0x14, 0x15, 0x4a, 0x35, 0x28, 0x09, 0xfc, 0xd6, 0x5c, 0x16, 0x1c, 0x64, 0x03, 0x1c, 0x09, 0x28, 0x35, 0x4a, 0x12, 0x11, 0x11, 0x0c, 0xa3, 0x5b, 0x06, 0x34, 0x8c, 0x0a, 0x09, 0x27, 0x00, 0x00, 0x0f, 0x00, 0xea, 0x00, 0x00, 0x05, 0x8a, 0x05, 0xd3, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x37, 0x00, 0x4f, 0x00, 0x5f, 0x00, 0x9f, 0x00, 0xab, 0x00, 0xb3, 0x00, 0xbb, 0x00, 0xcb, 0x00, 0xd3, 0x00, 0xdb, 0x00, 0xe3, 0x00, 0xef, 0x00, 0x00, 0x01, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x07, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x33, 0x36, 0x37, 0x26, 0x25, 0x06, 0x07, 0x16, 0x17, 0x32, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x06, 0x27, 0x16, 0x15, 0x14, 0x07, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x05, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x15, 0x36, 0x33, 0x32, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x23, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x33, 0x32, 0x05, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x16, 0x17, 0x36, 0x17, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x26, 0x25, 0x06, 0x07, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x07, 0x06, 0x07, 0x16, 0x17, 0x26, 0x35, 0x34, 0x17, 0x16, 0x17, 0x36, 0x37, 0x26, 0x27, 0x26, 0x17, 0x16, 0x17, 0x36, 0x37, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x26, 0x03, 0x3a, 0x11, 0x21, 0x12, 0x12, 0x21, 0x11, 0x12, 0x20, 0x12, 0x12, 0x20, 0xca, 0x47, 0x40, 0x73, 0x2e, 0x21, 0x07, 0x15, 0x4d, 0x08, 0x08, 0x59, 0x89, 0x0d, 0x01, 0xb2, 0x05, 0x0d, 0x8a, 0x59, 0x08, 0x07, 0x4d, 0x15, 0x07, 0x21, 0x2f, 0x72, 0x40, 0x44, 0x01, 0x01, 0x33, 0x2f, 0x2f, 0x62, 0x2b, 0x2c, 0x2d, 0x2d, 0x2c, 0x2b, 0x2d, 0x2a, 0x02, 0x02, 0x29, 0x2e, 0x2b, 0x2e, 0x2c, 0x2c, 0x2d, 0x2a, 0x03, 0x16, 0x0e, 0x05, 0x47, 0x3f, 0x71, 0x30, 0x22, 0x07, 0x15, 0x4d, 0x08, 0x0a, 0x5b, 0xfd, 0xef, 0x01, 0x1e, 0x6c, 0x38, 0x38, 0x6a, 0x1f, 0x93, 0x65, 0x03, 0x04, 0x68, 0x1d, 0x0b, 0x20, 0x32, 0x7b, 0x01, 0x7c, 0x32, 0x1e, 0x0b, 0x1c, 0x6a, 0x06, 0x63, 0x93, 0x01, 0x1f, 0x34, 0x35, 0x3a, 0x3a, 0x36, 0x34, 0x1f, 0x92, 0x63, 0x05, 0x6c, 0x1c, 0x0a, 0x1e, 0x30, 0x7c, 0x7a, 0x31, 0x1f, 0x0a, 0x1d, 0x67, 0x04, 0x02, 0x65, 0x01, 0xee, 0x18, 0x29, 0x2b, 0x2c, 0x2e, 0x2a, 0x29, 0x19, 0x4d, 0x4d, 0x4c, 0x53, 0x36, 0x38, 0x1e, 0x21, 0x1e, 0x1d, 0x04, 0xfe, 0xb9, 0x08, 0x05, 0x1e, 0x1f, 0x1f, 0x1f, 0x38, 0x60, 0x86, 0x5a, 0x09, 0x09, 0x4d, 0x14, 0x08, 0x22, 0x31, 0x70, 0x3f, 0x47, 0x05, 0x08, 0x33, 0x2e, 0x2e, 0x33, 0x01, 0x33, 0x05, 0x08, 0x36, 0x38, 0x20, 0x1e, 0x20, 0xc1, 0x38, 0x36, 0x08, 0x04, 0x1d, 0x1e, 0x21, 0x51, 0x4b, 0x4d, 0x18, 0x29, 0x2a, 0x2f, 0x2e, 0x2a, 0x29, 0x17, 0x4d, 0x03, 0x35, 0x13, 0x24, 0x15, 0x14, 0x23, 0x14, 0x14, 0x23, 0x14, 0x15, 0x24, 0x13, 0xd9, 0x35, 0x39, 0x67, 0x54, 0x3b, 0x26, 0x12, 0x0e, 0x27, 0x04, 0x39, 0x5a, 0x5e, 0x5e, 0x5a, 0x39, 0x04, 0x27, 0x0e, 0x12, 0x27, 0x3a, 0x54, 0x67, 0x39, 0xa7, 0x27, 0x28, 0x27, 0x27, 0x26, 0x28, 0x29, 0x49, 0x1e, 0x1c, 0x1c, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x38, 0x3a, 0x39, 0x38, 0x1e, 0x1c, 0x1d, 0x1a, 0x1a, 0x1d, 0x1c, 0x1e, 0x38, 0x39, 0x3a, 0x01, 0x0c, 0x5a, 0x5f, 0x35, 0x39, 0x65, 0x55, 0x3b, 0x27, 0x13, 0x0e, 0x28, 0x01, 0x05, 0x09, 0x02, 0xb3, 0xc0, 0xc0, 0xb3, 0x02, 0x3a, 0x02, 0x38, 0x14, 0x1b, 0x2e, 0x3e, 0x65, 0x75, 0x01, 0x76, 0x63, 0x3e, 0x2d, 0x1b, 0x14, 0x37, 0x03, 0x3a, 0xb0, 0x62, 0x63, 0x63, 0x62, 0xb0, 0x3b, 0x04, 0x37, 0x14, 0x1a, 0x2d, 0x3f, 0x63, 0x77, 0x75, 0x64, 0x3f, 0x2f, 0x1a, 0x14, 0x38, 0x02, 0x4b, 0xa2, 0x57, 0x5a, 0x5a, 0x57, 0xa2, 0x20, 0x2a, 0x2a, 0x10, 0x19, 0x1d, 0x12, 0x14, 0x15, 0x14, 0x44, 0x40, 0x40, 0x44, 0x14, 0x15, 0x14, 0x12, 0x1d, 0x2b, 0x38, 0x05, 0x01, 0x28, 0x0f, 0x13, 0x27, 0x3a, 0x54, 0x65, 0x39, 0x35, 0x5e, 0x9d, 0x26, 0x29, 0x28, 0x26, 0x27, 0x27, 0x28, 0xd6, 0x44, 0x41, 0x19, 0x1d, 0x12, 0x14, 0x14, 0x3a, 0x1d, 0x19, 0x41, 0x44, 0x15, 0x14, 0x14, 0x2e, 0x2a, 0x21, 0x9e, 0x59, 0x5b, 0x5b, 0x59, 0x9e, 0x21, 0x00, 0x07, 0x00, 0xea, 0x00, 0x00, 0x05, 0x89, 0x05, 0xd6, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x78, 0x00, 0x86, 0x00, 0x94, 0x00, 0x00, 0x01, 0x14, 0x17, 0x36, 0x37, 0x26, 0x27, 0x36, 0x37, 0x26, 0x27, 0x06, 0x05, 0x34, 0x26, 0x15, 0x06, 0x15, 0x16, 0x17, 0x36, 0x25, 0x06, 0x15, 0x14, 0x17, 0x36, 0x37, 0x2e, 0x01, 0x27, 0x06, 0x15, 0x14, 0x25, 0x34, 0x27, 0x06, 0x07, 0x16, 0x17, 0x06, 0x07, 0x16, 0x17, 0x36, 0x03, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x36, 0x37, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x15, 0x16, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x17, 0x36, 0x37, 0x16, 0x17, 0x06, 0x07, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x06, 0x23, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x23, 0x26, 0x27, 0x35, 0x26, 0x27, 0x06, 0x07, 0x22, 0x27, 0x36, 0x37, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x06, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x25, 0x32, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x03, 0x6d, 0x23, 0x31, 0x28, 0x2e, 0x08, 0x03, 0x2d, 0x21, 0x2a, 0x2b, 0xfe, 0xf9, 0x25, 0x28, 0x07, 0x32, 0x13, 0x01, 0xaf, 0x01, 0x0f, 0x37, 0x03, 0x03, 0x25, 0x01, 0x20, 0xfe, 0xf5, 0x2b, 0x26, 0x27, 0x2e, 0x03, 0x0d, 0x29, 0x2d, 0x2d, 0x23, 0xef, 0x32, 0x1d, 0x0c, 0x09, 0x1c, 0x51, 0x5b, 0x02, 0x02, 0xa4, 0x99, 0x4b, 0x28, 0x2c, 0x23, 0x94, 0x01, 0x94, 0x23, 0x24, 0x2a, 0x04, 0x4d, 0x97, 0xa6, 0x01, 0x02, 0x5c, 0x50, 0x1d, 0x05, 0x0d, 0x1a, 0x38, 0x18, 0x12, 0x33, 0x33, 0x15, 0x1d, 0x1f, 0x2d, 0x01, 0x0c, 0x3b, 0x2d, 0x35, 0x3f, 0x56, 0x16, 0x1d, 0x1d, 0x4f, 0x3c, 0x38, 0x2d, 0x3d, 0x0b, 0x01, 0x2e, 0x1e, 0x1c, 0x15, 0x33, 0x34, 0x12, 0x2f, 0x5e, 0xaa, 0x5d, 0x5d, 0xa9, 0x5f, 0x61, 0xab, 0x59, 0x5b, 0xaa, 0x01, 0x05, 0x4b, 0x8f, 0x52, 0x4f, 0x8f, 0x4e, 0x4e, 0x8f, 0x4f, 0x51, 0x8f, 0x02, 0x84, 0xa3, 0xa7, 0x0f, 0x23, 0x65, 0x8d, 0xaa, 0x6a, 0x1c, 0x0f, 0x70, 0xcd, 0x4d, 0x63, 0x01, 0x4e, 0x54, 0x76, 0x4a, 0x4b, 0x72, 0x1b, 0x19, 0x5a, 0x31, 0x56, 0x6c, 0x4c, 0x57, 0x02, 0x4d, 0x49, 0x09, 0x11, 0xa9, 0x70, 0x0d, 0x1e, 0x6a, 0xaa, 0x85, 0x6b, 0x25, 0x0f, 0xa7, 0x01, 0x6e, 0x41, 0x0d, 0x56, 0x02, 0x02, 0x7b, 0x77, 0x02, 0x06, 0x77, 0x19, 0x11, 0x5b, 0x31, 0x87, 0xf4, 0x01, 0x01, 0xf4, 0x87, 0x31, 0x5b, 0x0d, 0x1a, 0x03, 0x77, 0x06, 0x02, 0x77, 0x7b, 0x02, 0x02, 0x56, 0x0d, 0x40, 0x1e, 0x23, 0x66, 0xdc, 0x64, 0x2d, 0x23, 0x4a, 0x4d, 0x0c, 0x37, 0x42, 0x2f, 0x15, 0x22, 0x89, 0x89, 0x22, 0x01, 0x14, 0x30, 0x43, 0x37, 0x0c, 0x4e, 0x4b, 0x22, 0x2c, 0x64, 0xdc, 0x66, 0x23, 0x88, 0xce, 0xbd, 0x68, 0x68, 0xbd, 0xce, 0xbf, 0x67, 0x67, 0x51, 0x55, 0xa0, 0xae, 0x9d, 0x58, 0x58, 0x9d, 0xae, 0xa0, 0x55, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x5a, 0x00, 0x00, 0x06, 0x1b, 0x05, 0xd4, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x25, 0x00, 0x00, 0x01, 0x33, 0x01, 0x15, 0x21, 0x27, 0x23, 0x00, 0x17, 0x01, 0x15, 0x21, 0x35, 0x00, 0x07, 0x32, 0x15, 0x02, 0x23, 0x22, 0x03, 0x36, 0x13, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x03, 0x42, 0x07, 0x02, 0xd1, 0xfa, 0x4f, 0x07, 0x08, 0x02, 0xcc, 0x14, 0xfd, 0xab, 0x04, 0xb3, 0xfd, 0xbc, 0x12, 0x46, 0x2f, 0x17, 0x14, 0x31, 0x17, 0x2d, 0x11, 0x22, 0x13, 0x12, 0x23, 0x11, 0x12, 0x20, 0x13, 0x13, 0x20, 0x05, 0xd4, 0xfa, 0x35, 0x09, 0x09, 0x05, 0xaa, 0x9b, 0xfb, 0x4f, 0x11, 0x09, 0x04, 0x9d, 0xc2, 0x44, 0xfd, 0x9b, 0x02, 0x6e, 0x3b, 0xfd, 0x0d, 0x14, 0x24, 0x15, 0x14, 0x24, 0x14, 0x14, 0x24, 0x14, 0x15, 0x24, 0x14, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x04, 0x04, 0x76, 0x05, 0xd8, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x17, 0x15, 0x01, 0x14, 0x33, 0x04, 0x15, 0x17, 0x01, 0x27, 0x35, 0x00, 0x35, 0x34, 0x23, 0x24, 0x2f, 0x01, 0x04, 0x56, 0x0c, 0x13, 0xfd, 0xcd, 0x52, 0x01, 0x5c, 0x06, 0xfc, 0xb0, 0x0d, 0x02, 0x46, 0x6b, 0xfe, 0xb8, 0x0f, 0x06, 0x05, 0xd8, 0x15, 0x07, 0xfd, 0xe2, 0x47, 0x53, 0x0e, 0x47, 0xfd, 0x55, 0x15, 0x07, 0x02, 0x57, 0x0d, 0x47, 0x4a, 0x11, 0x47, 0x00, 0x00, 0x05, 0x00, 0x9d, 0xfe, 0xff, 0x06, 0x9e, 0x05, 0xda, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x43, 0x00, 0x00, 0x01, 0x26, 0x10, 0x00, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x00, 0x10, 0x07, 0x06, 0x07, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x13, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x37, 0x26, 0x10, 0x37, 0x26, 0x13, 0x06, 0x07, 0x11, 0x21, 0x11, 0x26, 0x37, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x22, 0x07, 0x16, 0x10, 0x05, 0x36, 0x10, 0x27, 0x06, 0x10, 0x01, 0x36, 0x98, 0x01, 0x2e, 0xd7, 0x8a, 0x70, 0x71, 0x8b, 0xd5, 0x01, 0x30, 0x97, 0x7b, 0xa2, 0xf5, 0xf5, 0xa2, 0xfe, 0xac, 0xa2, 0xf5, 0xf5, 0xa3, 0xf4, 0x94, 0xcf, 0xcf, 0x94, 0x39, 0x33, 0x7c, 0x7d, 0x33, 0xc1, 0x4f, 0x5b, 0x01, 0x54, 0x5c, 0x41, 0x33, 0x39, 0x90, 0xd3, 0xd3, 0x90, 0x3a, 0x35, 0x7e, 0xfe, 0xf5, 0x69, 0x69, 0x68, 0x02, 0x14, 0x9d, 0x01, 0xdd, 0x01, 0x4c, 0x46, 0x46, 0xfe, 0xb4, 0xfe, 0x22, 0x9c, 0x7e, 0x12, 0xfe, 0xf8, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x09, 0x11, 0x03, 0x91, 0xe4, 0xfe, 0xb9, 0xd8, 0x11, 0x95, 0x01, 0xae, 0x9d, 0x12, 0xfc, 0x94, 0x2d, 0x0a, 0xfe, 0xf8, 0x01, 0x09, 0x0a, 0xa5, 0x10, 0xd8, 0x01, 0x47, 0xe4, 0x12, 0x9d, 0xfe, 0x50, 0x38, 0x6c, 0x01, 0x47, 0x72, 0x72, 0xfe, 0xb9, 0x00, 0x05, 0x00, 0x91, 0xfe, 0x5b, 0x07, 0x5f, 0x05, 0xc3, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x26, 0x20, 0x06, 0x10, 0x17, 0x16, 0x17, 0x36, 0x00, 0x37, 0x26, 0x01, 0x14, 0x00, 0x20, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x10, 0x00, 0x04, 0x17, 0x01, 0x21, 0x37, 0x21, 0x11, 0x21, 0x11, 0x07, 0x11, 0x01, 0x16, 0x03, 0x01, 0x16, 0x17, 0x16, 0x17, 0x01, 0x23, 0x03, 0x06, 0x00, 0x07, 0x16, 0x17, 0x16, 0x20, 0x36, 0x10, 0x27, 0x26, 0x01, 0x32, 0x36, 0x35, 0x22, 0x06, 0x03, 0x92, 0x6a, 0xfe, 0xdc, 0xd0, 0x68, 0x2a, 0x31, 0x0f, 0x01, 0x17, 0xb8, 0x19, 0x02, 0x44, 0xfe, 0xd6, 0xfe, 0x51, 0x99, 0x69, 0x20, 0x79, 0x61, 0x99, 0x01, 0x36, 0x01, 0x9d, 0x64, 0x01, 0x45, 0xfe, 0xb2, 0x7e, 0x01, 0xbd, 0x01, 0x63, 0x80, 0xfe, 0xbe, 0x64, 0x86, 0xfe, 0xbe, 0x3a, 0x18, 0x66, 0x3d, 0x01, 0x45, 0xf8, 0xde, 0x0d, 0xfe, 0xef, 0xc8, 0x1a, 0x2f, 0x68, 0x01, 0x25, 0xd2, 0x69, 0x29, 0xfd, 0xcb, 0x91, 0xd3, 0x94, 0xcc, 0x03, 0x24, 0x72, 0xe4, 0xfe, 0xb8, 0x6c, 0x2c, 0x1a, 0xce, 0x01, 0x33, 0x07, 0x36, 0xfd, 0x90, 0xe8, 0xfe, 0xbd, 0x9f, 0x6c, 0x92, 0x25, 0x65, 0x9e, 0x01, 0xdc, 0x01, 0x55, 0x11, 0x67, 0x01, 0x5c, 0x8e, 0xfe, 0x78, 0xfe, 0x14, 0x8f, 0x01, 0x75, 0xfe, 0xa4, 0x92, 0x03, 0x76, 0xfe, 0xa4, 0x53, 0x63, 0x1b, 0x3f, 0x01, 0x5c, 0xfe, 0x37, 0xcc, 0xfe, 0xd7, 0x0b, 0x3d, 0x31, 0x6c, 0xd8, 0x01, 0x48, 0x72, 0x2d, 0xfe, 0xc9, 0xd8, 0xa4, 0xe0, 0x00, 0x00, 0x04, 0x00, 0x9d, 0xfe, 0x83, 0x07, 0xfc, 0x06, 0xd9, 0x00, 0x05, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x45, 0x00, 0x00, 0x00, 0x02, 0x17, 0x36, 0x10, 0x27, 0x01, 0x14, 0x00, 0x23, 0x22, 0x27, 0x06, 0x07, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x27, 0x26, 0x10, 0x00, 0x33, 0x32, 0x17, 0x36, 0x17, 0x16, 0x17, 0x01, 0x21, 0x37, 0x21, 0x11, 0x07, 0x11, 0x01, 0x16, 0x25, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x37, 0x26, 0x10, 0x37, 0x26, 0x01, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x22, 0x07, 0x16, 0x10, 0x03, 0x37, 0x01, 0x67, 0x69, 0x69, 0x03, 0x02, 0xfe, 0xd4, 0xdb, 0x8a, 0x72, 0x4e, 0x5a, 0xf5, 0xf5, 0xa2, 0xf5, 0xf5, 0xa3, 0x79, 0x98, 0x01, 0x2e, 0xd7, 0x88, 0x6f, 0x74, 0x8a, 0xce, 0x64, 0x01, 0x46, 0xfe, 0xb1, 0x7e, 0x01, 0xbd, 0x80, 0xfe, 0xbe, 0x65, 0xfc, 0x04, 0x94, 0xcf, 0xcf, 0x94, 0x39, 0x33, 0x7b, 0x7d, 0x34, 0x01, 0x50, 0x33, 0x38, 0x92, 0xd3, 0xd3, 0x92, 0x3a, 0x34, 0x7e, 0x03, 0xc8, 0xfe, 0xb8, 0x6c, 0x6c, 0x01, 0x47, 0x72, 0xfe, 0xeb, 0xe7, 0xfe, 0xbc, 0x45, 0x2c, 0x0a, 0xfe, 0xf8, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x09, 0x11, 0x7e, 0x9d, 0x01, 0xdd, 0x01, 0x4c, 0x44, 0x4a, 0x06, 0x08, 0x67, 0x01, 0x5c, 0x8e, 0xfe, 0x14, 0x8f, 0x01, 0x75, 0xfe, 0xa4, 0x92, 0xc6, 0xe4, 0xfe, 0xb9, 0xd8, 0x11, 0x95, 0x01, 0xac, 0x9f, 0x12, 0xfd, 0x0d, 0x10, 0xd8, 0x01, 0x48, 0xe4, 0x12, 0x9d, 0xfe, 0x4f, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xff, 0x06, 0x07, 0x07, 0x55, 0x00, 0x07, 0x00, 0x28, 0x00, 0x00, 0x00, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x36, 0x05, 0x26, 0x10, 0x00, 0x33, 0x32, 0x17, 0x01, 0x21, 0x37, 0x21, 0x11, 0x07, 0x11, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x04, 0x06, 0xd2, 0xfe, 0xdb, 0xcf, 0xcf, 0x01, 0x25, 0xd2, 0xfd, 0x30, 0x98, 0x01, 0x2e, 0xd7, 0xad, 0x86, 0x01, 0x44, 0xfe, 0xb2, 0x7e, 0x01, 0xbd, 0x81, 0xfe, 0xbe, 0x64, 0x98, 0x7a, 0xa2, 0xf5, 0xf5, 0xa2, 0xf5, 0xf5, 0xa3, 0x04, 0x43, 0xe4, 0xe4, 0xfe, 0xb9, 0xd8, 0xd8, 0xe8, 0x9d, 0x01, 0xdd, 0x01, 0x4c, 0x6e, 0x01, 0x5b, 0x8e, 0xfe, 0x14, 0x8f, 0x01, 0x75, 0xfe, 0xa4, 0x92, 0xc2, 0xef, 0x9c, 0x7e, 0x12, 0xfe, 0xf8, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf2, 0xff, 0xe3, 0x05, 0x3c, 0x06, 0xf4, 0x00, 0x2b, 0x00, 0x44, 0x00, 0x00, 0x01, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x27, 0x37, 0x17, 0x13, 0x07, 0x27, 0x25, 0x13, 0x07, 0x27, 0x03, 0x17, 0x07, 0x01, 0x16, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x16, 0x03, 0xbe, 0x3f, 0x2d, 0x1f, 0x3d, 0x1f, 0x22, 0x21, 0x20, 0x70, 0x58, 0x4e, 0x56, 0x51, 0x51, 0x55, 0x35, 0x3d, 0x1f, 0x22, 0x22, 0x21, 0x76, 0x51, 0x50, 0x53, 0x35, 0x2e, 0x3f, 0xe4, 0x33, 0xe5, 0x78, 0xca, 0x34, 0x01, 0x9f, 0xad, 0x7d, 0x54, 0x78, 0xe4, 0x34, 0xfd, 0x8c, 0x37, 0x71, 0x37, 0x36, 0x51, 0x18, 0x16, 0x16, 0x15, 0x2a, 0x26, 0x72, 0x6d, 0x39, 0x36, 0x50, 0x19, 0x16, 0x16, 0x15, 0x2a, 0x24, 0x04, 0x00, 0xaa, 0x21, 0x24, 0x48, 0x53, 0x5c, 0xb4, 0x5b, 0x56, 0x83, 0x2a, 0x25, 0x25, 0x27, 0x3e, 0x48, 0x53, 0x5d, 0xb3, 0x5e, 0x58, 0x82, 0x26, 0x25, 0x0c, 0xab, 0x69, 0x8a, 0x69, 0x01, 0x44, 0x5e, 0x8b, 0xbf, 0xfe, 0x32, 0x39, 0xe1, 0xfe, 0xbd, 0x69, 0x8b, 0xfc, 0xfc, 0x1a, 0x19, 0x19, 0x5c, 0x3d, 0x3c, 0x80, 0x3c, 0x39, 0x32, 0x2d, 0x31, 0x19, 0x19, 0x58, 0x3f, 0x3a, 0x84, 0x3c, 0x39, 0x31, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xba, 0xfe, 0xa3, 0x05, 0x57, 0x07, 0x12, 0x00, 0x3d, 0x00, 0x58, 0x00, 0x00, 0x01, 0x36, 0x32, 0x17, 0x13, 0x07, 0x27, 0x25, 0x13, 0x07, 0x27, 0x03, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x27, 0x07, 0x27, 0x37, 0x27, 0x07, 0x27, 0x13, 0x05, 0x07, 0x27, 0x17, 0x37, 0x17, 0x07, 0x17, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x02, 0xa3, 0x2f, 0x65, 0x30, 0xa1, 0xcb, 0x33, 0x01, 0x9f, 0xad, 0x7e, 0x54, 0xa1, 0x2a, 0x24, 0x3e, 0x40, 0x40, 0x3e, 0x3a, 0x51, 0x28, 0x36, 0xf7, 0xf7, 0x87, 0xf8, 0xf8, 0x33, 0x2c, 0x4d, 0x3d, 0x3e, 0x40, 0x3f, 0x3f, 0x23, 0x2c, 0x1c, 0xe5, 0x33, 0xe5, 0x4c, 0x54, 0x7e, 0xad, 0x01, 0xa0, 0x33, 0xcc, 0x4c, 0xe4, 0x35, 0xe5, 0x7c, 0x40, 0x2f, 0x38, 0x27, 0x29, 0x2c, 0x2c, 0x29, 0x2a, 0x35, 0x33, 0x7c, 0x30, 0x38, 0x26, 0x2a, 0x2c, 0x2c, 0x2a, 0x2a, 0x34, 0x34, 0x04, 0x87, 0x0c, 0x0c, 0x01, 0x9e, 0x5c, 0x8a, 0xbf, 0xfe, 0x32, 0x3a, 0xe2, 0xfe, 0x61, 0x1d, 0x28, 0x45, 0xab, 0x62, 0x5f, 0xab, 0x45, 0x40, 0x28, 0x14, 0x0a, 0xb8, 0x96, 0xf0, 0xf0, 0x96, 0xb8, 0x09, 0x15, 0x25, 0x43, 0x45, 0xab, 0x5f, 0x62, 0xa9, 0x47, 0x28, 0x1e, 0x48, 0x69, 0x8a, 0x6a, 0xcb, 0xe2, 0x3a, 0x01, 0xce, 0xbf, 0x8a, 0x5c, 0xcb, 0x69, 0x8a, 0x6a, 0xd3, 0x18, 0x1c, 0x2b, 0x2e, 0x77, 0x42, 0x41, 0x77, 0x2e, 0x2f, 0x18, 0x18, 0x18, 0x1c, 0x2b, 0x2e, 0x77, 0x41, 0x42, 0x77, 0x2e, 0x2f, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x59, 0xff, 0xe3, 0x04, 0xaf, 0x06, 0xf4, 0x00, 0x2b, 0x00, 0x46, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x23, 0x15, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x11, 0x07, 0x27, 0x09, 0x01, 0x07, 0x03, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x03, 0x48, 0xf7, 0xf7, 0x36, 0x28, 0x51, 0x3a, 0x3e, 0x40, 0x40, 0x3e, 0x3d, 0x4e, 0x4a, 0x58, 0x5c, 0x46, 0x51, 0x39, 0x3e, 0x40, 0x40, 0x3e, 0x3d, 0x4d, 0x2c, 0x33, 0xf8, 0xf8, 0x9b, 0x60, 0x01, 0x3e, 0x01, 0x3f, 0x60, 0xdf, 0x3c, 0x34, 0x34, 0x2a, 0x2a, 0x2c, 0x2c, 0x2a, 0x26, 0x38, 0x30, 0x7c, 0x33, 0x35, 0x2a, 0x29, 0x2c, 0x2c, 0x29, 0x27, 0x38, 0x2f, 0x05, 0xd5, 0xfe, 0xe7, 0x96, 0x91, 0x0a, 0x14, 0x28, 0x40, 0x45, 0xab, 0x5f, 0x62, 0xab, 0x45, 0x43, 0x25, 0x23, 0x23, 0x28, 0x40, 0x45, 0xab, 0x62, 0x5f, 0xab, 0x45, 0x43, 0x25, 0x15, 0x09, 0x91, 0x96, 0x01, 0x19, 0xad, 0x6b, 0x01, 0x61, 0xfe, 0x9f, 0x6a, 0xfb, 0x50, 0x18, 0x18, 0x2f, 0x2e, 0x77, 0x42, 0x41, 0x77, 0x2e, 0x2b, 0x1c, 0x18, 0x18, 0x18, 0x2f, 0x2e, 0x77, 0x41, 0x42, 0x77, 0x2e, 0x2b, 0x1c, 0x18, 0x00, 0x02, 0x00, 0x08, 0x01, 0x10, 0x05, 0xf8, 0x04, 0xc4, 0x00, 0x2b, 0x00, 0x46, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x11, 0x33, 0x11, 0x33, 0x27, 0x37, 0x09, 0x01, 0x27, 0x25, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x04, 0xf5, 0xc6, 0x87, 0x4c, 0x0a, 0x12, 0x24, 0x39, 0x3e, 0x9a, 0x56, 0x58, 0x9a, 0x3e, 0x3c, 0x21, 0x20, 0x20, 0x24, 0x39, 0x3e, 0x9a, 0x58, 0x56, 0x9a, 0x3e, 0x3c, 0x21, 0x13, 0x09, 0x4c, 0x87, 0xc6, 0x9c, 0x61, 0x01, 0x3d, 0xfe, 0xc3, 0x60, 0xfc, 0x35, 0x16, 0x15, 0x2b, 0x29, 0x6b, 0x3b, 0x3b, 0x6b, 0x2a, 0x26, 0x19, 0x16, 0x16, 0x15, 0x2a, 0x2a, 0x6b, 0x3b, 0x3b, 0x6b, 0x29, 0x27, 0x19, 0x16, 0x02, 0x9f, 0xfe, 0xed, 0x01, 0x13, 0x3c, 0x2d, 0x5a, 0x40, 0x45, 0x47, 0x47, 0x45, 0x44, 0x56, 0x52, 0x62, 0x66, 0x4e, 0x5a, 0x40, 0x45, 0x47, 0x47, 0x45, 0x44, 0x56, 0x31, 0x38, 0x01, 0x13, 0xfe, 0xed, 0xac, 0x6b, 0xfe, 0x9e, 0xfe, 0x9e, 0x6a, 0xf8, 0x43, 0x39, 0x3a, 0x2f, 0x2e, 0x31, 0x31, 0x2e, 0x2b, 0x3e, 0x35, 0x8a, 0x39, 0x3a, 0x2f, 0x2e, 0x31, 0x31, 0x2e, 0x2b, 0x3e, 0x35, 0x00, 0x00, 0x00, 0x02, 0x01, 0x58, 0x01, 0x10, 0x04, 0xb0, 0x04, 0xc5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x02, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x59, 0xfb, 0xb0, 0xb1, 0xfb, 0xfb, 0xb1, 0xb0, 0xfb, 0x89, 0xaa, 0x78, 0x78, 0xaa, 0xaa, 0x78, 0x78, 0xaa, 0x02, 0xeb, 0xc4, 0x01, 0x16, 0xfe, 0xea, 0xc4, 0xc5, 0xfe, 0xea, 0x01, 0x16, 0xc2, 0x85, 0xbd, 0xbd, 0x85, 0x86, 0xbd, 0xbd, 0x00, 0x01, 0x01, 0x58, 0x01, 0x10, 0x04, 0xb0, 0x04, 0xc5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x02, 0x01, 0x59, 0xfb, 0xb0, 0xb1, 0xfb, 0xfb, 0xb1, 0xb0, 0xfb, 0x02, 0xeb, 0xc4, 0x01, 0x16, 0xfe, 0xea, 0xc4, 0xc5, 0xfe, 0xea, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xc7, 0x01, 0x8d, 0x04, 0x41, 0x04, 0x4b, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xc7, 0xbb, 0x82, 0x83, 0xba, 0xba, 0x83, 0x82, 0xbb, 0x89, 0x6a, 0x4a, 0x4b, 0x69, 0x69, 0x4b, 0x4a, 0x6a, 0x02, 0xec, 0x92, 0xcd, 0xcd, 0x92, 0x91, 0xce, 0xce, 0x90, 0x53, 0x75, 0x75, 0x53, 0x53, 0x76, 0x76, 0x00, 0x04, 0x01, 0x40, 0x01, 0x8d, 0x04, 0xc8, 0x04, 0x4b, 0x00, 0x13, 0x00, 0x21, 0x00, 0x29, 0x00, 0x37, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x33, 0x26, 0x35, 0x34, 0x37, 0x26, 0x23, 0x22, 0x06, 0x25, 0x06, 0x15, 0x14, 0x17, 0x36, 0x35, 0x34, 0x37, 0x16, 0x15, 0x14, 0x07, 0x32, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x01, 0x40, 0xbb, 0x82, 0x4a, 0x3d, 0x3d, 0x4a, 0x83, 0xba, 0xba, 0x83, 0x4a, 0x3d, 0x3d, 0x4a, 0x82, 0xbb, 0x89, 0x69, 0x4b, 0x06, 0x04, 0x39, 0x38, 0x04, 0x05, 0x4b, 0x69, 0x01, 0x3b, 0x2d, 0x2d, 0x2d, 0x51, 0x38, 0x39, 0x05, 0x05, 0x4b, 0x69, 0x69, 0x4b, 0x04, 0x02, 0xec, 0x92, 0xcd, 0x20, 0x20, 0xcd, 0x92, 0x91, 0xce, 0x21, 0x21, 0xce, 0x90, 0x53, 0x75, 0x58, 0x71, 0x70, 0x57, 0x01, 0x76, 0x32, 0x38, 0x4d, 0x4c, 0x38, 0x38, 0x4c, 0x4d, 0x7b, 0x57, 0x70, 0x71, 0x58, 0x75, 0x53, 0x53, 0x76, 0x00, 0x00, 0x05, 0x00, 0x4b, 0x01, 0x5a, 0x05, 0xbd, 0x04, 0x7a, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x38, 0x00, 0x52, 0x00, 0x6d, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x04, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x02, 0xc1, 0x87, 0x87, 0x01, 0xe7, 0x4a, 0x20, 0x25, 0x15, 0x1a, 0x1b, 0x1c, 0x19, 0x1a, 0x20, 0x20, 0x4a, 0x1f, 0x21, 0x1a, 0x1a, 0x1b, 0x1d, 0x18, 0x1a, 0x21, 0x44, 0x43, 0x34, 0x3d, 0x29, 0x2d, 0x30, 0x30, 0x2d, 0x2c, 0x3a, 0x36, 0x85, 0x34, 0x3c, 0x2a, 0x2d, 0x2f, 0x2f, 0x2d, 0x2c, 0x3a, 0x37, 0xfd, 0x69, 0x4a, 0x20, 0x25, 0x15, 0x1a, 0x1b, 0x1c, 0x19, 0x1a, 0x20, 0x20, 0x4a, 0x1f, 0x20, 0x1b, 0x1a, 0x1b, 0x1d, 0x18, 0x1b, 0x20, 0x44, 0x43, 0x34, 0x3d, 0x29, 0x2d, 0x30, 0x30, 0x2d, 0x2c, 0x3a, 0x37, 0x84, 0x34, 0x3c, 0x2a, 0x2d, 0x2f, 0x2f, 0x2d, 0x2c, 0x3a, 0x37, 0x04, 0x7a, 0xfc, 0xe0, 0x02, 0x5a, 0x0f, 0x12, 0x1a, 0x1f, 0x46, 0x29, 0x28, 0x4a, 0x1b, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x4b, 0x1a, 0x1c, 0x10, 0xa5, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x49, 0x46, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x46, 0x49, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x96, 0x0f, 0x12, 0x1a, 0x1f, 0x46, 0x29, 0x28, 0x4a, 0x1b, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x4b, 0x1a, 0x1c, 0x10, 0xa5, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x49, 0x46, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x46, 0x49, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x00, 0x00, 0x03, 0x00, 0x09, 0x01, 0x8d, 0x06, 0x00, 0x04, 0x4a, 0x00, 0x37, 0x00, 0x51, 0x00, 0x6b, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x21, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x17, 0x24, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x03, 0x92, 0x06, 0x1f, 0x31, 0x2c, 0x3a, 0x36, 0x41, 0x44, 0x34, 0x3c, 0x2a, 0x2d, 0x2f, 0x2f, 0x2d, 0x2c, 0x3a, 0x37, 0x84, 0x34, 0x3d, 0x29, 0x30, 0x21, 0x05, 0xfe, 0xe4, 0x05, 0x23, 0x2e, 0x2c, 0x39, 0x37, 0x84, 0x35, 0x3c, 0x29, 0x2d, 0x30, 0x30, 0x2d, 0x2c, 0x39, 0x37, 0x41, 0x44, 0x34, 0x3c, 0x29, 0x31, 0x20, 0x06, 0x02, 0x73, 0x4a, 0x1f, 0x21, 0x1a, 0x1a, 0x1b, 0x1b, 0x1a, 0x1a, 0x21, 0x1f, 0x4a, 0x20, 0x20, 0x1a, 0x1a, 0x1b, 0x1b, 0x1a, 0x1a, 0x20, 0xfc, 0x5e, 0x4a, 0x1f, 0x25, 0x16, 0x1a, 0x1b, 0x1c, 0x19, 0x1a, 0x21, 0x1f, 0x4a, 0x20, 0x20, 0x1a, 0x1a, 0x1b, 0x1d, 0x18, 0x1a, 0x20, 0x03, 0x35, 0x1f, 0x5b, 0x35, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x49, 0x46, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x34, 0x60, 0x18, 0x1d, 0x5d, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x46, 0x49, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x35, 0x5b, 0x1f, 0x7f, 0x0f, 0x10, 0x1c, 0x1f, 0x46, 0x29, 0x28, 0x47, 0x1e, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x46, 0x1f, 0x1c, 0x10, 0x0f, 0x0f, 0x12, 0x1a, 0x1f, 0x46, 0x29, 0x28, 0x4a, 0x1b, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x4b, 0x1a, 0x1c, 0x10, 0x00, 0x02, 0x00, 0xbd, 0x01, 0xe6, 0x05, 0x73, 0x04, 0x52, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x35, 0x25, 0x07, 0x15, 0x17, 0x01, 0x25, 0x05, 0x11, 0x05, 0x25, 0x04, 0xec, 0xfd, 0x1e, 0xc6, 0xc6, 0xfe, 0xb3, 0x01, 0x4d, 0x03, 0x69, 0xfc, 0x97, 0xfe, 0xb3, 0x02, 0xd7, 0x8a, 0x65, 0x4d, 0xba, 0x4d, 0x01, 0x5e, 0x82, 0x78, 0xfe, 0x84, 0x78, 0x82, 0x00, 0x00, 0x02, 0x01, 0x85, 0x00, 0x56, 0x04, 0x83, 0x05, 0x96, 0x00, 0x15, 0x00, 0x29, 0x00, 0x00, 0x01, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x37, 0x35, 0x23, 0x15, 0x17, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x1f, 0x02, 0x23, 0x03, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x27, 0x35, 0x21, 0x15, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x03, 0x1b, 0x55, 0x6a, 0x49, 0x21, 0x46, 0x34, 0xb4, 0x34, 0x46, 0x20, 0x4a, 0x6a, 0x56, 0x92, 0xf8, 0x94, 0x6e, 0x57, 0x4c, 0x27, 0x4f, 0x02, 0x06, 0x4f, 0x28, 0x4b, 0x58, 0x6f, 0x01, 0x11, 0xb4, 0xdf, 0x34, 0x62, 0x5c, 0x29, 0x31, 0xa2, 0x25, 0x3d, 0x3d, 0x25, 0xa2, 0x31, 0x29, 0x5c, 0x62, 0x34, 0xdf, 0xb4, 0xbb, 0x01, 0x3a, 0xea, 0x60, 0xbe, 0x5c, 0x4b, 0x19, 0x44, 0xfa, 0xfa, 0x44, 0x19, 0x4b, 0x5c, 0xbe, 0x60, 0xea, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xff, 0x04, 0xa9, 0x05, 0xda, 0x00, 0x07, 0x00, 0x15, 0x00, 0x00, 0x00, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x36, 0x05, 0x26, 0x10, 0x00, 0x20, 0x00, 0x10, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x04, 0x06, 0xd2, 0xfe, 0xdb, 0xcf, 0xcf, 0x01, 0x25, 0xd2, 0xfd, 0x30, 0x98, 0x01, 0x2e, 0x01, 0xab, 0x01, 0x31, 0x98, 0x7a, 0xa2, 0xa2, 0xa3, 0x04, 0x43, 0xe4, 0xe4, 0xfe, 0xb9, 0xd8, 0xd8, 0xe8, 0x9d, 0x01, 0xdd, 0x01, 0x4c, 0xfe, 0xb4, 0xfe, 0x22, 0x9c, 0x7e, 0x12, 0xfd, 0x7b, 0x02, 0x86, 0x11, 0x00, 0x01, 0x01, 0x36, 0xfe, 0xff, 0x04, 0xa8, 0x05, 0xda, 0x00, 0x1a, 0x00, 0x00, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x20, 0x07, 0x27, 0x36, 0x20, 0x00, 0x10, 0x07, 0x06, 0x07, 0x11, 0x33, 0x15, 0x02, 0xf5, 0xa3, 0xf5, 0xf5, 0x24, 0x2f, 0x91, 0xd0, 0xd0, 0xfe, 0xdb, 0x71, 0x6a, 0x98, 0x01, 0xab, 0x01, 0x2f, 0x97, 0x7b, 0xa1, 0xf4, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0xb2, 0x07, 0xd8, 0x01, 0x47, 0xe4, 0x6a, 0x74, 0xa6, 0xfe, 0xb4, 0xfe, 0x20, 0x9a, 0x7e, 0x12, 0xfe, 0xf8, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9e, 0xfe, 0xff, 0x04, 0xa8, 0x05, 0xda, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x13, 0x09, 0x02, 0x11, 0x32, 0x33, 0x15, 0x22, 0x23, 0x11, 0x22, 0x23, 0x11, 0x22, 0x23, 0x35, 0x32, 0x33, 0x11, 0x37, 0x09, 0x02, 0x9e, 0x02, 0x05, 0x02, 0x05, 0xfe, 0x50, 0x7a, 0x7a, 0x7a, 0x7a, 0x51, 0x51, 0x7b, 0x7a, 0x7a, 0x7b, 0x4d, 0x01, 0x2b, 0xfe, 0xd5, 0xfe, 0xd5, 0x03, 0x9f, 0x02, 0x3b, 0xfd, 0xc5, 0xfd, 0xe9, 0xfe, 0xf4, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x0c, 0xa8, 0x01, 0x6f, 0x01, 0x4a, 0xfe, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xff, 0x04, 0xa8, 0x05, 0xda, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x21, 0x15, 0x21, 0x13, 0x07, 0x27, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x07, 0x27, 0x13, 0x21, 0x35, 0x21, 0x01, 0x00, 0x6f, 0xe4, 0xa1, 0xe3, 0x6f, 0xff, 0x00, 0x01, 0x62, 0xfe, 0xa4, 0xfa, 0x6e, 0xe4, 0xf5, 0xf5, 0xa2, 0xf5, 0xf5, 0xe4, 0x6e, 0xfa, 0xfe, 0xa4, 0x01, 0x62, 0x04, 0xf9, 0x7a, 0xfd, 0x01, 0x64, 0xfe, 0x9d, 0xfc, 0x7a, 0xfe, 0xe4, 0x7c, 0xfe, 0xeb, 0x7b, 0xfd, 0xfd, 0xae, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x02, 0x52, 0xfd, 0x7b, 0x01, 0x15, 0x7c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6c, 0xff, 0x0f, 0x05, 0xb2, 0x05, 0x25, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x00, 0x01, 0x15, 0x21, 0x09, 0x01, 0x21, 0x35, 0x21, 0x09, 0x01, 0x03, 0x11, 0x23, 0x11, 0x01, 0x33, 0x17, 0x37, 0x33, 0x15, 0x23, 0x09, 0x01, 0x23, 0x05, 0xb2, 0xfe, 0xf1, 0xfe, 0x6c, 0xfe, 0x6c, 0xfe, 0xf1, 0x01, 0x78, 0x01, 0x2b, 0x01, 0x2b, 0xd9, 0x9b, 0xfe, 0x9e, 0xea, 0xc1, 0xc1, 0xea, 0x80, 0xfe, 0xd5, 0xfe, 0xd5, 0x80, 0x01, 0x4a, 0x7c, 0xfe, 0x41, 0x01, 0xbf, 0x7c, 0xfe, 0xb6, 0x01, 0x4a, 0x03, 0xdb, 0xfd, 0xa6, 0x02, 0x5a, 0xfd, 0x74, 0xd5, 0xd5, 0x7c, 0xfe, 0xb6, 0x01, 0x4a, 0x00, 0x00, 0x02, 0x01, 0x66, 0xff, 0x2c, 0x04, 0x49, 0x05, 0xaf, 0x00, 0x07, 0x00, 0x1c, 0x00, 0x00, 0x24, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0x02, 0x26, 0x10, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x25, 0x17, 0x0d, 0x01, 0x07, 0x25, 0x11, 0x16, 0x17, 0x16, 0x10, 0x06, 0x01, 0xef, 0x69, 0x96, 0x69, 0x69, 0x96, 0x38, 0xba, 0x5e, 0x41, 0x53, 0x9b, 0x01, 0x08, 0x4d, 0xfe, 0xbd, 0x01, 0x43, 0x4d, 0xfe, 0xf8, 0x50, 0x3f, 0x5e, 0xba, 0xdd, 0xa6, 0x75, 0x75, 0xa6, 0x76, 0xfd, 0xd9, 0xce, 0x01, 0x23, 0x67, 0x47, 0x16, 0x03, 0xce, 0xfe, 0xce, 0xad, 0x94, 0xd1, 0xd2, 0x94, 0xae, 0xfe, 0xd2, 0x16, 0x45, 0x67, 0xfe, 0xdd, 0xce, 0x00, 0x01, 0x01, 0x23, 0xfe, 0xff, 0x03, 0xe9, 0x05, 0xda, 0x00, 0x1e, 0x00, 0x00, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x27, 0x26, 0x35, 0x10, 0x25, 0x36, 0x37, 0x36, 0x17, 0x06, 0x07, 0x06, 0x15, 0x10, 0x17, 0x16, 0x17, 0x06, 0x27, 0x15, 0x33, 0x15, 0x02, 0xf4, 0xa2, 0xf5, 0xf5, 0x8c, 0x5c, 0x46, 0x01, 0x0b, 0x54, 0x9c, 0x41, 0x35, 0xb7, 0x58, 0x68, 0xe1, 0x4e, 0x4d, 0x43, 0x63, 0xf5, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x33, 0x4c, 0x98, 0x75, 0xa1, 0x01, 0x2e, 0xb9, 0x3a, 0x10, 0x07, 0x17, 0x3b, 0x85, 0x9d, 0xc4, 0xfe, 0xcd, 0xa2, 0x38, 0x0f, 0x25, 0x13, 0xff, 0x7c, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x00, 0x08, 0x05, 0xbb, 0x04, 0x6d, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x33, 0x00, 0x00, 0x13, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x00, 0x20, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x1e, 0x01, 0x15, 0x11, 0x14, 0x06, 0x07, 0x06, 0x21, 0x20, 0x27, 0x2e, 0x01, 0x35, 0x11, 0x34, 0x36, 0x37, 0x36, 0x21, 0x20, 0xa7, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x03, 0x41, 0xfd, 0xed, 0xba, 0x9a, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x9a, 0x28, 0x67, 0x65, 0x65, 0x65, 0xcf, 0xfe, 0xe2, 0xfe, 0xe6, 0xd0, 0x68, 0x65, 0x65, 0x65, 0xcf, 0x01, 0x1e, 0x01, 0x1a, 0x02, 0x1d, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0x02, 0x0b, 0x68, 0x56, 0x63, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x63, 0x56, 0x59, 0x39, 0x88, 0x51, 0xfe, 0xa2, 0x4e, 0x88, 0x39, 0x73, 0x73, 0x39, 0x88, 0x4e, 0x01, 0x5e, 0x51, 0x88, 0x39, 0x73, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x4d, 0x00, 0x08, 0x05, 0xbb, 0x05, 0xcb, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x2d, 0x00, 0x45, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x01, 0x1e, 0x01, 0x15, 0x19, 0x01, 0x14, 0x06, 0x07, 0x06, 0x21, 0x20, 0x27, 0x2e, 0x01, 0x35, 0x19, 0x01, 0x34, 0x36, 0x37, 0x36, 0x21, 0x20, 0x04, 0x0e, 0xfd, 0xed, 0xba, 0x9a, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x9a, 0xfb, 0xe0, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x26, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x04, 0x22, 0x67, 0x65, 0x65, 0x65, 0xcf, 0xfe, 0xe2, 0xfe, 0xe6, 0xd0, 0x68, 0x65, 0x65, 0x65, 0xcf, 0x01, 0x1e, 0x01, 0x1a, 0x05, 0x67, 0x68, 0x56, 0x63, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x63, 0x56, 0xfe, 0x7c, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0xfe, 0xc1, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0x03, 0x5a, 0x39, 0x88, 0x51, 0xfe, 0xa2, 0xfe, 0xa2, 0x4e, 0x88, 0x39, 0x73, 0x73, 0x39, 0x88, 0x4e, 0x01, 0x5e, 0x01, 0x5e, 0x51, 0x88, 0x39, 0x73, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x4d, 0x00, 0x08, 0x05, 0xbb, 0x04, 0x6d, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x31, 0x00, 0x3f, 0x00, 0x55, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x21, 0x20, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x37, 0x03, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x00, 0x20, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x1e, 0x01, 0x15, 0x11, 0x14, 0x06, 0x07, 0x06, 0x21, 0x20, 0x27, 0x2e, 0x01, 0x35, 0x11, 0x34, 0x36, 0x37, 0x36, 0x21, 0x20, 0x04, 0xec, 0x1c, 0x32, 0xa6, 0xf4, 0xf6, 0xa3, 0x35, 0x1b, 0xd4, 0x01, 0x15, 0x01, 0x13, 0xfd, 0xf9, 0x01, 0xea, 0xa4, 0x34, 0x1c, 0x19, 0x02, 0x17, 0x1c, 0x34, 0xa6, 0xfe, 0x16, 0xa3, 0x35, 0x1b, 0x1b, 0x01, 0x01, 0x19, 0x1c, 0x34, 0xc4, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x03, 0x41, 0xfd, 0xed, 0xba, 0x9a, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x9a, 0x28, 0x67, 0x65, 0x65, 0x65, 0xcf, 0xfe, 0xe2, 0xfe, 0xe6, 0xd0, 0x68, 0x65, 0x65, 0x65, 0xcf, 0x01, 0x1e, 0x01, 0x1a, 0x01, 0x64, 0x1b, 0x1c, 0x5d, 0x5d, 0x1e, 0x1a, 0x63, 0x02, 0xa3, 0x5d, 0x1d, 0x1c, 0x19, 0x0e, 0x0e, 0x16, 0x1c, 0x1d, 0x5d, 0x5d, 0x1e, 0x1b, 0x18, 0x0c, 0x0f, 0x18, 0x1c, 0x1d, 0xfe, 0xd5, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0x02, 0x0b, 0x68, 0x56, 0x63, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x63, 0x56, 0x59, 0x39, 0x88, 0x51, 0xfe, 0xa2, 0x4e, 0x88, 0x39, 0x73, 0x73, 0x39, 0x88, 0x4e, 0x01, 0x5e, 0x51, 0x88, 0x39, 0x73, 0x00, 0x07, 0x00, 0x4d, 0x00, 0x08, 0x05, 0xbb, 0x05, 0xcb, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x4b, 0x00, 0x5b, 0x00, 0x73, 0x00, 0x00, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x37, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x21, 0x20, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x21, 0x20, 0x02, 0x20, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x01, 0x1e, 0x01, 0x15, 0x19, 0x01, 0x14, 0x06, 0x07, 0x06, 0x21, 0x20, 0x27, 0x2e, 0x01, 0x35, 0x19, 0x01, 0x34, 0x36, 0x37, 0x36, 0x21, 0x20, 0x02, 0x10, 0x01, 0xea, 0xa4, 0x34, 0x1c, 0x19, 0x02, 0x17, 0x1c, 0x34, 0xa6, 0xfe, 0x16, 0xa3, 0x35, 0x1b, 0x1b, 0x01, 0x01, 0x19, 0x1c, 0x34, 0x03, 0x81, 0x1c, 0x32, 0xa6, 0xf4, 0xf6, 0xa3, 0x35, 0x1b, 0xd4, 0x01, 0x15, 0x01, 0x13, 0xd5, 0x1c, 0x32, 0xa6, 0xf4, 0xf6, 0xa3, 0x35, 0x1b, 0xd4, 0x01, 0x15, 0x01, 0x13, 0x09, 0xfd, 0xed, 0xba, 0x9a, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x9a, 0xfb, 0xe0, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x26, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x04, 0x22, 0x67, 0x65, 0x65, 0x65, 0xcf, 0xfe, 0xe2, 0xfe, 0xe6, 0xd0, 0x68, 0x65, 0x65, 0x65, 0xcf, 0x01, 0x1e, 0x01, 0x1a, 0x05, 0x03, 0x5d, 0x1d, 0x1c, 0x19, 0x0e, 0x0e, 0x16, 0x1c, 0x1d, 0x5d, 0x5d, 0x1e, 0x1b, 0x18, 0x0c, 0x0f, 0x18, 0x1c, 0x1d, 0xfe, 0x1c, 0x1b, 0x1c, 0x5d, 0x5d, 0x1e, 0x1a, 0x63, 0xfc, 0x1b, 0x1c, 0x5d, 0x5d, 0x1e, 0x1a, 0x63, 0x04, 0x65, 0x68, 0x56, 0x63, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x63, 0x56, 0xfe, 0x7c, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0xfe, 0xc1, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0x03, 0x5a, 0x39, 0x88, 0x51, 0xfe, 0xa2, 0xfe, 0xa2, 0x4e, 0x88, 0x39, 0x73, 0x73, 0x39, 0x88, 0x4e, 0x01, 0x5e, 0x01, 0x5e, 0x51, 0x88, 0x39, 0x73, 0x00, 0x00, 0x03, 0x00, 0x9d, 0xff, 0xe3, 0x04, 0xa9, 0x06, 0xbe, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x13, 0x16, 0x17, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x10, 0x37, 0x36, 0x37, 0x0b, 0x01, 0x35, 0x09, 0x01, 0x15, 0x0b, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0xa3, 0x3a, 0x57, 0x55, 0x3c, 0x3f, 0x52, 0x55, 0x15, 0xa3, 0x79, 0x98, 0xfe, 0xd2, 0xd7, 0xd4, 0xfe, 0xcf, 0x98, 0x7a, 0xa2, 0x01, 0xed, 0x01, 0x3f, 0x01, 0x3f, 0xee, 0x51, 0x94, 0xcf, 0xcf, 0x94, 0x91, 0xd2, 0xd2, 0x01, 0x7d, 0x5b, 0x44, 0x3e, 0x58, 0x55, 0x41, 0x42, 0x5d, 0x02, 0xbb, 0x11, 0x7e, 0x9d, 0xee, 0xef, 0xfe, 0xb4, 0x01, 0x4c, 0x01, 0xde, 0x9c, 0x7e, 0x12, 0x01, 0x67, 0xfe, 0xfa, 0xc7, 0x01, 0x5d, 0xfe, 0xa3, 0xc7, 0x01, 0x05, 0xfa, 0xf7, 0xe4, 0xa4, 0xa3, 0xd8, 0xd8, 0xa3, 0xa4, 0xe4, 0x00, 0x03, 0x00, 0x13, 0x01, 0x85, 0x05, 0xc8, 0x05, 0x14, 0x00, 0x50, 0x00, 0x6a, 0x00, 0x85, 0x00, 0x00, 0x01, 0x27, 0x23, 0x22, 0x27, 0x26, 0x07, 0x06, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x1f, 0x01, 0x16, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x26, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x17, 0x16, 0x1f, 0x01, 0x21, 0x32, 0x17, 0x16, 0x17, 0x21, 0x17, 0x25, 0x16, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x14, 0x17, 0x1e, 0x01, 0x01, 0x26, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x26, 0x03, 0x6c, 0xc1, 0x67, 0x9d, 0x19, 0x26, 0x03, 0x01, 0x09, 0x0b, 0x2c, 0x20, 0x19, 0x27, 0x20, 0x21, 0x20, 0x17, 0x13, 0x15, 0x10, 0x0b, 0x0b, 0x2c, 0x20, 0x1a, 0x26, 0x1f, 0x09, 0x50, 0x58, 0x51, 0x21, 0x0d, 0x13, 0x22, 0x02, 0x03, 0x06, 0x0c, 0x0b, 0x14, 0x46, 0x4b, 0x2d, 0x2c, 0x17, 0x19, 0x0e, 0x11, 0x0b, 0x0c, 0x2f, 0x1c, 0x20, 0x41, 0x40, 0x18, 0x1c, 0x0c, 0x10, 0x0b, 0x08, 0x1b, 0x03, 0x04, 0x1e, 0x25, 0x62, 0x4a, 0x01, 0x64, 0xd0, 0x47, 0x5b, 0x10, 0xfd, 0xa5, 0xbf, 0xfc, 0x72, 0x13, 0x12, 0x16, 0x0e, 0x13, 0x1a, 0x05, 0x04, 0x0b, 0x08, 0x0e, 0x0f, 0x28, 0x0f, 0x12, 0x12, 0x13, 0x17, 0x07, 0x05, 0x0c, 0x08, 0x1c, 0x01, 0x11, 0x10, 0x15, 0x19, 0x0b, 0x13, 0x1b, 0x03, 0x05, 0x0b, 0x09, 0x0e, 0x0d, 0x27, 0x12, 0x14, 0x10, 0x13, 0x19, 0x04, 0x06, 0x0c, 0x09, 0x0d, 0x0a, 0x01, 0x85, 0xcd, 0x06, 0x08, 0x0d, 0x08, 0x29, 0x17, 0x20, 0x2e, 0x0d, 0x0b, 0x0f, 0x0e, 0x19, 0x15, 0x24, 0x1d, 0x4a, 0x1e, 0x20, 0x2e, 0x0d, 0x0b, 0x03, 0x25, 0x27, 0x03, 0x05, 0x1c, 0x07, 0x08, 0x2e, 0x13, 0x13, 0x13, 0x44, 0x22, 0x14, 0x14, 0x18, 0x1b, 0x1e, 0x26, 0x42, 0x1d, 0x20, 0x31, 0x0a, 0x0b, 0x1e, 0x18, 0x1e, 0x1c, 0x24, 0x43, 0x1e, 0x17, 0x1d, 0x07, 0x0d, 0x16, 0x1a, 0x6d, 0x52, 0x20, 0x29, 0x4b, 0xcf, 0x79, 0x09, 0x05, 0x07, 0x18, 0x10, 0x11, 0x1f, 0x17, 0x12, 0x0d, 0x10, 0x10, 0x06, 0x06, 0x17, 0x11, 0x11, 0x20, 0x16, 0x12, 0x1c, 0x02, 0xb5, 0x09, 0x05, 0x07, 0x19, 0x0f, 0x11, 0x21, 0x15, 0x12, 0x0e, 0x0d, 0x12, 0x05, 0x07, 0x19, 0x0e, 0x12, 0x20, 0x16, 0x12, 0x0e, 0x09, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x01, 0x21, 0x05, 0xa5, 0x04, 0xb5, 0x00, 0x15, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x00, 0x12, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x01, 0x05, 0x06, 0x23, 0x22, 0x27, 0x25, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x37, 0x3e, 0x02, 0x34, 0x2e, 0x01, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x25, 0x36, 0x33, 0x32, 0x17, 0x24, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0xe4, 0x29, 0x22, 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x22, 0x29, 0x22, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x02, 0xb4, 0x02, 0x2e, 0x27, 0x62, 0x49, 0xc5, 0xfe, 0xb5, 0x5f, 0x87, 0x48, 0x0f, 0x19, 0x19, 0x14, 0x24, 0x1d, 0x47, 0x1d, 0x1f, 0x19, 0x18, 0x1b, 0x1a, 0x19, 0x14, 0x24, 0x1d, 0x09, 0x57, 0x4d, 0x5c, 0x18, 0x22, 0x16, 0x16, 0x22, 0x18, 0x58, 0x51, 0x30, 0x30, 0x1d, 0x24, 0x14, 0x19, 0x1a, 0x1b, 0x18, 0x19, 0x1f, 0x1d, 0x47, 0x1d, 0x24, 0x14, 0x19, 0x19, 0x0f, 0x48, 0x87, 0x5f, 0x01, 0x4b, 0xc5, 0x49, 0x62, 0x27, 0xfb, 0x69, 0x29, 0x22, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x22, 0x29, 0x22, 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x01, 0x71, 0x0e, 0x0d, 0x0e, 0x1f, 0x13, 0x12, 0x1f, 0x0e, 0x0d, 0x0e, 0x0e, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x1f, 0x0e, 0x0d, 0x01, 0x6c, 0xfc, 0x3f, 0x57, 0x92, 0x2c, 0x3e, 0x0e, 0x0e, 0x08, 0x26, 0x19, 0x23, 0x3c, 0x1a, 0x15, 0x10, 0x0d, 0x0d, 0x0e, 0x17, 0x15, 0x41, 0x23, 0x22, 0x3c, 0x1a, 0x15, 0x10, 0x0d, 0x22, 0x09, 0x1a, 0x28, 0x10, 0x28, 0x1a, 0x09, 0x22, 0x0d, 0x10, 0x15, 0x1a, 0x3c, 0x22, 0x23, 0x41, 0x15, 0x17, 0x0e, 0x0d, 0x0d, 0x10, 0x15, 0x1a, 0x3c, 0x23, 0x19, 0x26, 0x08, 0x0e, 0x0e, 0x3e, 0x2c, 0x92, 0x57, 0x3f, 0x7e, 0x0e, 0x0d, 0x0e, 0x1f, 0x13, 0x12, 0x1f, 0x0e, 0x0d, 0x0e, 0x0e, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x1f, 0x0e, 0x0d, 0x00, 0x03, 0x00, 0x13, 0x00, 0xc0, 0x05, 0xc8, 0x04, 0x4f, 0x00, 0x4f, 0x00, 0x6a, 0x00, 0x85, 0x00, 0x00, 0x01, 0x33, 0x07, 0x21, 0x06, 0x07, 0x06, 0x23, 0x21, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x14, 0x17, 0x16, 0x37, 0x36, 0x3b, 0x01, 0x25, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x23, 0x22, 0x13, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x03, 0x6c, 0xc0, 0xbf, 0x02, 0x5b, 0x10, 0x5b, 0x47, 0xd0, 0xfe, 0x9c, 0x4a, 0x5a, 0x2d, 0x1a, 0x1e, 0x08, 0x0b, 0x10, 0x0c, 0x1c, 0x18, 0x40, 0x41, 0x20, 0x1c, 0x32, 0x09, 0x0b, 0x11, 0x0b, 0x1c, 0x17, 0x08, 0x51, 0x4b, 0x46, 0x14, 0x0b, 0x0c, 0x06, 0x03, 0x02, 0x1a, 0x1b, 0x08, 0x26, 0x51, 0x58, 0x2c, 0x2d, 0x1f, 0x27, 0x19, 0x20, 0x2c, 0x0b, 0x0b, 0x10, 0x10, 0x2f, 0x20, 0x21, 0x20, 0x27, 0x19, 0x20, 0x2c, 0x0b, 0x09, 0x01, 0x06, 0x23, 0x16, 0xa0, 0x67, 0xfd, 0xf3, 0x12, 0x0e, 0x08, 0x0e, 0x0c, 0x05, 0x07, 0x14, 0x16, 0x0f, 0x15, 0x13, 0x25, 0x0e, 0x0e, 0x08, 0x0c, 0x05, 0x07, 0x13, 0x18, 0x0f, 0x15, 0x12, 0xec, 0x13, 0x0e, 0x08, 0x0e, 0x0c, 0x06, 0x06, 0x19, 0x11, 0x10, 0x14, 0x13, 0x26, 0x0d, 0x0e, 0x09, 0x0b, 0x05, 0x06, 0x1b, 0x10, 0x12, 0x12, 0x0d, 0x04, 0x4f, 0xcf, 0x4b, 0x29, 0x20, 0x52, 0x64, 0x23, 0x14, 0x0f, 0x06, 0x1e, 0x17, 0x21, 0x3e, 0x26, 0x1c, 0x1e, 0x18, 0x1e, 0x0b, 0x0a, 0x33, 0x1e, 0x22, 0x39, 0x2a, 0x1b, 0x1e, 0x18, 0x04, 0x24, 0x22, 0x44, 0x13, 0x13, 0x13, 0x2e, 0x08, 0x07, 0x16, 0x0b, 0x03, 0x27, 0x14, 0x14, 0x0b, 0x0e, 0x2d, 0x20, 0x20, 0x44, 0x21, 0x20, 0x32, 0x0e, 0x0f, 0x0b, 0x0d, 0x2e, 0x20, 0x17, 0x2c, 0x05, 0x0e, 0x09, 0x06, 0x54, 0x08, 0x0e, 0x08, 0x18, 0x13, 0x25, 0x0f, 0x11, 0x15, 0x08, 0x06, 0x12, 0x0e, 0x0d, 0x12, 0x16, 0x23, 0x0e, 0x12, 0x15, 0x08, 0x05, 0xfd, 0x3a, 0x09, 0x0d, 0x08, 0x18, 0x13, 0x26, 0x0f, 0x10, 0x19, 0x05, 0x05, 0x12, 0x0d, 0x0e, 0x12, 0x13, 0x28, 0x0c, 0x11, 0x19, 0x05, 0x05, 0x00, 0x00, 0x09, 0x00, 0x41, 0x00, 0xf4, 0x05, 0xf0, 0x04, 0xe8, 0x00, 0x5a, 0x00, 0x78, 0x00, 0x96, 0x00, 0xb4, 0x00, 0xd2, 0x00, 0xfe, 0x01, 0x2d, 0x01, 0x34, 0x01, 0x48, 0x00, 0x00, 0x01, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x1f, 0x01, 0x25, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0d, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x25, 0x07, 0x06, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x37, 0x36, 0x02, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x12, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x12, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x05, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x37, 0x36, 0x03, 0x2d, 0x01, 0x26, 0x23, 0x22, 0x07, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x25, 0x05, 0x16, 0x33, 0x32, 0x37, 0x25, 0x26, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x02, 0x0e, 0x0a, 0x07, 0x07, 0x0a, 0x08, 0x16, 0x49, 0x53, 0x3c, 0x29, 0x28, 0x21, 0x24, 0x1f, 0x11, 0x10, 0x10, 0x0e, 0x24, 0x19, 0x2a, 0x26, 0x2b, 0x29, 0x28, 0x27, 0x1e, 0x24, 0x0c, 0x10, 0x05, 0x2a, 0x80, 0x4f, 0x01, 0x3a, 0xcc, 0x52, 0x7b, 0x33, 0x07, 0x1b, 0xfe, 0x35, 0x01, 0xcb, 0x1b, 0x07, 0x36, 0x78, 0x52, 0xcc, 0xfe, 0xc6, 0x4f, 0x80, 0x2a, 0x05, 0x10, 0x11, 0x1f, 0x20, 0x25, 0x2b, 0x26, 0x2e, 0x23, 0x25, 0x1f, 0x25, 0x0c, 0x10, 0x10, 0x0e, 0x22, 0x19, 0x2c, 0x26, 0x2b, 0x3c, 0x4a, 0x52, 0x15, 0xfa, 0x19, 0x0a, 0x0b, 0x08, 0x09, 0x03, 0x03, 0x03, 0x03, 0x09, 0x08, 0x0b, 0x0a, 0x19, 0x0a, 0x0a, 0x09, 0x08, 0x03, 0x03, 0x03, 0x03, 0x08, 0x09, 0x0a, 0x0a, 0x19, 0x0a, 0x0b, 0x08, 0x09, 0x03, 0x03, 0x03, 0x03, 0x09, 0x08, 0x0b, 0x0a, 0x19, 0x0a, 0x0a, 0x09, 0x08, 0x03, 0x03, 0x03, 0x03, 0x08, 0x09, 0x0a, 0x2d, 0x2d, 0x13, 0x12, 0x10, 0x11, 0x08, 0x08, 0x08, 0x08, 0x11, 0x10, 0x12, 0x13, 0x2d, 0x13, 0x13, 0x10, 0x11, 0x08, 0x08, 0x08, 0x08, 0x11, 0x10, 0x13, 0x13, 0x2d, 0x13, 0x12, 0x10, 0x11, 0x08, 0x08, 0x08, 0x08, 0x11, 0x10, 0x12, 0x13, 0x2d, 0x13, 0x13, 0x10, 0x11, 0x08, 0x08, 0x08, 0x08, 0x11, 0x10, 0x13, 0x01, 0x5f, 0x21, 0x86, 0x23, 0x14, 0x0a, 0x0e, 0x0a, 0x05, 0x0c, 0x0b, 0x19, 0x12, 0x22, 0x1c, 0x42, 0x1c, 0x1d, 0x18, 0x16, 0x0e, 0x0b, 0x0b, 0x0c, 0x18, 0x12, 0x23, 0x1c, 0x21, 0x3c, 0x53, 0x5a, 0x1b, 0x10, 0x15, 0x06, 0x20, 0x19, 0xaa, 0x01, 0xbc, 0x02, 0x22, 0x26, 0x54, 0x47, 0xc3, 0xfe, 0xb6, 0x86, 0x10, 0x0f, 0x15, 0x12, 0x19, 0x5e, 0x4f, 0x3c, 0x21, 0x1c, 0x23, 0x12, 0x18, 0x0c, 0x0b, 0x0b, 0x0e, 0x16, 0x18, 0x1d, 0x1c, 0x42, 0x1c, 0x22, 0x12, 0x19, 0x0b, 0x0c, 0x05, 0x0a, 0x0e, 0x0b, 0x01, 0x6b, 0x01, 0x02, 0xc3, 0x47, 0x54, 0x26, 0xfe, 0x14, 0xc4, 0x04, 0x06, 0x08, 0x08, 0x14, 0x08, 0x08, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x14, 0x08, 0x08, 0x06, 0x02, 0xd9, 0x08, 0x0d, 0x0e, 0x07, 0x06, 0x0a, 0x20, 0x10, 0x0d, 0x22, 0x1c, 0x29, 0x26, 0x60, 0x26, 0x22, 0x27, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1f, 0x24, 0x22, 0x2f, 0x27, 0x1d, 0x12, 0x09, 0x3c, 0x25, 0x8b, 0x5a, 0x53, 0x0d, 0x11, 0x1f, 0x0c, 0xcf, 0xcf, 0x0c, 0x25, 0x0d, 0x0b, 0x53, 0x5a, 0x8b, 0x25, 0x3c, 0x09, 0x18, 0x17, 0x2f, 0x27, 0x2a, 0x1d, 0x20, 0x0e, 0x10, 0x10, 0x11, 0x1c, 0x22, 0x25, 0x35, 0x22, 0x2d, 0x28, 0x24, 0x23, 0x1b, 0x13, 0x10, 0x20, 0x09, 0xfe, 0xd2, 0x04, 0x05, 0x08, 0x07, 0x07, 0x04, 0x08, 0x07, 0x05, 0x06, 0x08, 0x07, 0x05, 0x04, 0x04, 0x05, 0x08, 0x07, 0x07, 0x04, 0x07, 0x08, 0x05, 0x06, 0x08, 0x07, 0x05, 0x02, 0x3b, 0x04, 0x05, 0x08, 0x07, 0x07, 0x04, 0x07, 0x08, 0x05, 0x06, 0x08, 0x07, 0x05, 0x04, 0x04, 0x05, 0x08, 0x07, 0x07, 0x04, 0x08, 0x07, 0x05, 0x06, 0x08, 0x07, 0x05, 0xfd, 0x82, 0x07, 0x08, 0x0e, 0x10, 0x11, 0x12, 0x16, 0x15, 0x12, 0x11, 0x10, 0x0e, 0x08, 0x07, 0x07, 0x08, 0x0e, 0x10, 0x11, 0x12, 0x15, 0x16, 0x12, 0x11, 0x10, 0x0e, 0x08, 0x02, 0x38, 0x07, 0x08, 0x0e, 0x10, 0x11, 0x12, 0x15, 0x16, 0x12, 0x11, 0x10, 0x0e, 0x08, 0x07, 0x07, 0x08, 0x0e, 0x10, 0x11, 0x12, 0x16, 0x15, 0x12, 0x11, 0x10, 0x0e, 0x08, 0x5c, 0x0f, 0x3d, 0x07, 0x04, 0x06, 0x08, 0x0e, 0x0a, 0x18, 0x0e, 0x17, 0x21, 0x1c, 0x1b, 0x19, 0x13, 0x10, 0x0c, 0x0c, 0x0e, 0x16, 0x13, 0x20, 0x1c, 0x21, 0x20, 0x1c, 0x1b, 0x19, 0x13, 0x10, 0x0c, 0x22, 0x0a, 0x0e, 0x11, 0x08, 0x18, 0x11, 0xfe, 0xf2, 0xc2, 0xf7, 0x2f, 0x56, 0x92, 0x43, 0x1e, 0x1e, 0x0f, 0x0e, 0x0a, 0x22, 0x0c, 0x10, 0x13, 0x19, 0x1b, 0x1c, 0x20, 0x21, 0x1c, 0x20, 0x13, 0x16, 0x0e, 0x0c, 0x0c, 0x10, 0x13, 0x19, 0x1b, 0x1c, 0x21, 0x17, 0x0d, 0x19, 0x0a, 0x14, 0x02, 0x02, 0x5b, 0x75, 0x56, 0x2f, 0xe1, 0x2b, 0x16, 0x09, 0x09, 0x06, 0x05, 0x05, 0x06, 0x09, 0x09, 0x16, 0x09, 0x09, 0x06, 0x05, 0x05, 0x06, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4d, 0xff, 0xe3, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x61, 0x00, 0x75, 0x00, 0x87, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x15, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x37, 0x12, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x16, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x36, 0x37, 0x36, 0x35, 0x34, 0x01, 0xde, 0x03, 0x0b, 0x13, 0x11, 0x12, 0x16, 0x64, 0x00, 0xff, 0x6d, 0x6c, 0x58, 0x5a, 0x57, 0x55, 0x5c, 0x56, 0x6e, 0x6c, 0x7c, 0x78, 0x70, 0x6b, 0x58, 0x5a, 0x58, 0x46, 0x27, 0x60, 0x67, 0x63, 0x6a, 0x61, 0x7f, 0x7e, 0x8c, 0x8b, 0x80, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x63, 0x7d, 0x7f, 0xfe, 0xe6, 0x7c, 0x26, 0x3d, 0x21, 0x1d, 0x19, 0x03, 0x61, 0xa3, 0x98, 0x49, 0x05, 0x0f, 0x21, 0x1e, 0x08, 0x31, 0x26, 0x1c, 0x3d, 0x39, 0x0f, 0x10, 0x14, 0x1e, 0x30, 0x23, 0x10, 0x0f, 0x44, 0x15, 0x24, 0x2d, 0x17, 0x14, 0x03, 0x29, 0x05, 0x10, 0x01, 0x0a, 0x11, 0x18, 0x1f, 0x1d, 0x11, 0x03, 0x03, 0x18, 0x01, 0x75, 0x37, 0x14, 0x0f, 0x13, 0x0c, 0x1b, 0x09, 0x19, 0x09, 0x34, 0x0f, 0x1a, 0x1b, 0x01, 0x37, 0x06, 0x1e, 0x1b, 0x1c, 0x32, 0x12, 0x13, 0x0b, 0x33, 0x33, 0x31, 0x63, 0x64, 0xed, 0x88, 0x8d, 0xe8, 0x69, 0x60, 0x34, 0x33, 0x33, 0x31, 0x63, 0x64, 0xed, 0x8d, 0x87, 0xbc, 0x3e, 0x98, 0x6d, 0x01, 0x10, 0x9c, 0x9d, 0x01, 0x10, 0x77, 0x6e, 0x3c, 0x3b, 0x3b, 0x38, 0x72, 0x6f, 0xfe, 0xec, 0xa1, 0x98, 0xfe, 0xf0, 0x77, 0x70, 0x3a, 0x3b, 0x3b, 0x12, 0x42, 0x56, 0x30, 0x2f, 0x4d, 0x1f, 0x10, 0x0f, 0xcd, 0xef, 0x01, 0x90, 0x08, 0x14, 0x38, 0x3a, 0x44, 0x40, 0x2a, 0x1f, 0x7c, 0x73, 0x61, 0x20, 0x16, 0x1b, 0x1e, 0x09, 0x2d, 0x46, 0x28, 0x1c, 0x37, 0x0c, 0x22, 0x2a, 0x3d, 0x38, 0x19, 0x26, 0x08, 0x15, 0x0f, 0x30, 0x21, 0x32, 0x1d, 0x1c, 0x01, 0x06, 0x04, 0x20, 0x16, 0x11, 0x0c, 0x31, 0x2d, 0x35, 0x24, 0x26, 0x0c, 0x0a, 0x12, 0x36, 0x3a, 0x42, 0x34, 0x00, 0x00, 0x06, 0x00, 0x4d, 0xff, 0xe3, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x42, 0x00, 0x5c, 0x00, 0x77, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x27, 0x25, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x13, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x13, 0x36, 0x33, 0x32, 0x17, 0x13, 0x05, 0x0e, 0x01, 0x07, 0x25, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x13, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x36, 0x01, 0x7e, 0x38, 0x23, 0x05, 0x01, 0x0c, 0x07, 0x22, 0x21, 0x1d, 0x2c, 0x12, 0x07, 0xdb, 0x21, 0x28, 0x27, 0x5e, 0x26, 0x29, 0x20, 0x3f, 0x2e, 0x31, 0x33, 0x2d, 0x7a, 0x01, 0x0c, 0x02, 0x25, 0x39, 0xfe, 0xb6, 0x0d, 0x0d, 0x2c, 0x1d, 0x20, 0x22, 0xfd, 0x38, 0x18, 0x18, 0x14, 0x13, 0x14, 0x14, 0x13, 0x14, 0x18, 0x18, 0x38, 0x17, 0x18, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x18, 0x33, 0x78, 0x70, 0x6b, 0x58, 0x5a, 0x58, 0x59, 0x59, 0x56, 0xda, 0xf6, 0x6d, 0x6c, 0x58, 0x5a, 0x57, 0x55, 0x5c, 0x56, 0x6e, 0x6c, 0x7c, 0x8b, 0x80, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x63, 0x7d, 0x7f, 0xfe, 0xea, 0x80, 0x79, 0x67, 0x65, 0x68, 0x63, 0x6a, 0x61, 0x7f, 0x7e, 0x01, 0x77, 0x49, 0x5f, 0x0f, 0xfd, 0x1e, 0x22, 0x32, 0x5b, 0x24, 0x20, 0x16, 0x09, 0x01, 0x01, 0xa3, 0x22, 0x14, 0x13, 0x13, 0x14, 0x22, 0x01, 0x83, 0x09, 0x09, 0xfe, 0x0b, 0xfd, 0x07, 0x67, 0x49, 0x83, 0x04, 0x06, 0x16, 0x20, 0x24, 0x5b, 0x32, 0x21, 0x76, 0x0b, 0x0c, 0x15, 0x17, 0x35, 0x1f, 0x1e, 0x35, 0x17, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x17, 0x35, 0x1e, 0x1f, 0x35, 0x17, 0x15, 0x0c, 0x02, 0x15, 0x33, 0x31, 0x63, 0x64, 0xed, 0x8d, 0x85, 0xf1, 0x63, 0x61, 0x66, 0x33, 0x31, 0x63, 0x64, 0xed, 0x88, 0x8d, 0xe8, 0x69, 0x60, 0x34, 0x33, 0x64, 0x3b, 0x38, 0x72, 0x6f, 0xfe, 0xec, 0xa1, 0x98, 0xfe, 0xf0, 0x77, 0x70, 0x3a, 0x3b, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0x9c, 0x9d, 0x01, 0x10, 0x77, 0x6e, 0x3c, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x2c, 0x05, 0xa1, 0x05, 0xaa, 0x00, 0x2d, 0x00, 0x00, 0x13, 0x35, 0x37, 0x27, 0x33, 0x17, 0x36, 0x25, 0x02, 0x03, 0x33, 0x17, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x17, 0x33, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x07, 0x23, 0x12, 0x13, 0x24, 0x27, 0x07, 0x23, 0x37, 0x85, 0x21, 0x3a, 0x5a, 0x83, 0x84, 0x01, 0x01, 0x30, 0x99, 0x6e, 0x68, 0x85, 0x4d, 0x5a, 0x8a, 0x53, 0x88, 0xee, 0x3f, 0x2b, 0x1d, 0x1d, 0x2b, 0x3f, 0xee, 0x88, 0x53, 0x8a, 0x5a, 0x4d, 0x85, 0x68, 0x6e, 0x99, 0x30, 0xfe, 0xff, 0x84, 0x83, 0x5a, 0x3a, 0x02, 0xd7, 0x28, 0x05, 0xda, 0xc9, 0x0d, 0x0a, 0x01, 0x14, 0x01, 0x6a, 0x96, 0x50, 0x82, 0x50, 0xc6, 0x1a, 0x11, 0x2c, 0x11, 0x1a, 0xc6, 0x50, 0x82, 0x50, 0x96, 0x01, 0x60, 0x01, 0x1e, 0x0b, 0x0c, 0xc9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x76, 0x00, 0xdc, 0x05, 0x92, 0x04, 0xf9, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x22, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x00, 0x09, 0x01, 0x21, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x01, 0x11, 0x01, 0x16, 0x15, 0x14, 0x05, 0x01, 0x21, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x01, 0x11, 0x01, 0x26, 0x35, 0x34, 0x01, 0x11, 0x21, 0x11, 0x03, 0x91, 0x01, 0x8c, 0xfb, 0xcf, 0x01, 0x8c, 0x06, 0x07, 0x1a, 0x21, 0x1f, 0x4a, 0x20, 0x26, 0x14, 0x07, 0x2b, 0x01, 0x83, 0xfe, 0x7d, 0x02, 0xfe, 0xc3, 0xfe, 0x72, 0x04, 0x31, 0xfe, 0x72, 0x06, 0x06, 0x1a, 0x20, 0x20, 0x4a, 0x1f, 0x21, 0x1a, 0x06, 0x2c, 0xfe, 0x7e, 0x01, 0x82, 0x03, 0xfe, 0x27, 0x05, 0x1b, 0x03, 0x68, 0x01, 0x2c, 0xfe, 0xd4, 0x09, 0x08, 0x1c, 0x10, 0x0f, 0x0f, 0x13, 0x19, 0x09, 0xaa, 0xfe, 0xde, 0x02, 0x8d, 0xfe, 0xdd, 0x11, 0x12, 0x13, 0x6b, 0xfe, 0xd3, 0x01, 0x2d, 0x08, 0x07, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x07, 0xaa, 0x01, 0x22, 0xfd, 0x73, 0x01, 0x21, 0x13, 0x13, 0x12, 0xfd, 0xdf, 0x04, 0x1d, 0xfb, 0xe3, 0x00, 0x00, 0x04, 0x01, 0x87, 0x00, 0x00, 0x04, 0x0a, 0x05, 0xef, 0x00, 0x50, 0x00, 0xd0, 0x00, 0xe3, 0x00, 0xf3, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x33, 0x17, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x03, 0x14, 0x15, 0x14, 0x1f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x17, 0x16, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x27, 0x26, 0x01, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x14, 0x0f, 0x01, 0x06, 0x0f, 0x01, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x02, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x26, 0x27, 0x26, 0x27, 0x26, 0x3f, 0x01, 0x36, 0x27, 0x26, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x15, 0x07, 0x21, 0x27, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x27, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x35, 0x13, 0x34, 0x35, 0x34, 0x27, 0x01, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x01, 0x88, 0x21, 0x15, 0x0f, 0x2f, 0x0c, 0x29, 0x01, 0x02, 0x04, 0x18, 0x24, 0x1b, 0x12, 0x1f, 0x15, 0x18, 0x20, 0x0f, 0x10, 0x2b, 0x0f, 0x43, 0x44, 0x22, 0x0d, 0x0d, 0x10, 0x06, 0x05, 0x09, 0x04, 0x0b, 0x05, 0x01, 0x01, 0x1c, 0x18, 0x25, 0x32, 0x1a, 0x0b, 0x01, 0x09, 0x01, 0x08, 0x02, 0x02, 0x03, 0x01, 0x03, 0x01, 0x14, 0x02, 0xfe, 0x15, 0x04, 0x09, 0x21, 0x2b, 0x18, 0x10, 0x02, 0x46, 0x03, 0x23, 0x20, 0x03, 0x05, 0x0a, 0x1f, 0x05, 0x13, 0x31, 0x16, 0x08, 0x27, 0x0f, 0x29, 0x44, 0x18, 0x12, 0x0f, 0x0d, 0x0f, 0x07, 0x07, 0x1b, 0x0b, 0x11, 0x56, 0x7a, 0x56, 0x54, 0x04, 0x12, 0x05, 0x03, 0x14, 0x10, 0x05, 0x03, 0x2b, 0x67, 0x2f, 0x06, 0x26, 0x1b, 0x11, 0x0b, 0x06, 0x05, 0x02, 0x07, 0x2c, 0x24, 0x0c, 0x07, 0x29, 0x2d, 0x01, 0x13, 0x0d, 0x01, 0x30, 0x15, 0x16, 0x30, 0x09, 0x02, 0x19, 0x70, 0x2a, 0x05, 0x07, 0x0c, 0x02, 0x06, 0x02, 0x07, 0x06, 0x0d, 0x1a, 0x24, 0x0c, 0x0e, 0x15, 0x10, 0x2c, 0x08, 0x03, 0x01, 0x09, 0x07, 0x03, 0x09, 0x53, 0x01, 0x01, 0x01, 0x80, 0x01, 0x0b, 0x0c, 0x02, 0x03, 0x08, 0x05, 0x0b, 0x02, 0xfe, 0x32, 0x10, 0x20, 0x34, 0x32, 0x0f, 0x03, 0x01, 0x10, 0x09, 0x0a, 0x03, 0x02, 0x0b, 0x04, 0x06, 0x61, 0x73, 0x0e, 0x02, 0x4a, 0x23, 0x0d, 0x0a, 0x0e, 0x08, 0x03, 0x0b, 0x07, 0x0a, 0x6c, 0x02, 0xeb, 0x37, 0x31, 0x07, 0x1f, 0x5d, 0x18, 0x17, 0x01, 0x01, 0x2f, 0x7e, 0x5b, 0x23, 0x3c, 0x24, 0x1c, 0x1b, 0x20, 0x05, 0x0c, 0x1a, 0x6f, 0xbb, 0x5f, 0x25, 0x15, 0x10, 0x40, 0x2c, 0x1f, 0x10, 0x86, 0x3a, 0x06, 0x0b, 0x0a, 0x06, 0x06, 0x24, 0x22, 0x1e, 0x3b, 0x1a, 0x12, 0x76, 0x52, 0x15, 0x12, 0xfe, 0xd4, 0x07, 0x09, 0x18, 0x1d, 0x16, 0x24, 0x58, 0x24, 0x2b, 0x7c, 0x19, 0x89, 0x13, 0x8d, 0x89, 0xb6, 0x12, 0x21, 0x35, 0x44, 0x58, 0x26, 0x50, 0x59, 0x3b, 0x02, 0xb6, 0x39, 0x44, 0x6f, 0x1e, 0x36, 0xc2, 0x1d, 0x06, 0x0f, 0x0b, 0x0d, 0x62, 0x27, 0x6e, 0x95, 0x32, 0x0f, 0x0c, 0x0b, 0x06, 0x0b, 0x1f, 0x38, 0x1a, 0x33, 0xfe, 0x65, 0x46, 0x5d, 0x0c, 0x08, 0x13, 0x04, 0x01, 0x14, 0x06, 0x07, 0x34, 0x54, 0x26, 0x03, 0x1f, 0x16, 0x0a, 0x07, 0x0c, 0x16, 0x26, 0x20, 0x12, 0x0c, 0x2f, 0x35, 0x30, 0x24, 0x3f, 0x2d, 0x20, 0x02, 0x31, 0x40, 0x1b, 0x11, 0x26, 0x11, 0x06, 0x05, 0x10, 0x09, 0x33, 0x6c, 0x0f, 0x0a, 0x17, 0x17, 0x4b, 0x0f, 0x0b, 0x0a, 0x05, 0x19, 0x03, 0x05, 0x0d, 0x43, 0x04, 0x22, 0x50, 0x31, 0x16, 0xd6, 0x09, 0x0b, 0x9f, 0xb7, 0x3a, 0x30, 0x33, 0x3c, 0x08, 0x44, 0x3a, 0x35, 0x58, 0x49, 0x2e, 0x29, 0x06, 0x07, 0x01, 0x44, 0x04, 0x07, 0x13, 0x26, 0xfe, 0x5b, 0x14, 0x2b, 0x2d, 0x31, 0x3a, 0x0d, 0x0c, 0x11, 0x10, 0x09, 0x09, 0x15, 0x17, 0x09, 0x05, 0x71, 0x12, 0x14, 0x2f, 0x41, 0x38, 0x09, 0x12, 0x0a, 0x0a, 0x12, 0x11, 0x0b, 0x06, 0x67, 0x00, 0x08, 0x00, 0x26, 0x00, 0xa9, 0x05, 0xc6, 0x05, 0x6c, 0x00, 0x06, 0x00, 0x39, 0x00, 0x4c, 0x00, 0x70, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x89, 0x00, 0x8d, 0x00, 0x00, 0x13, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x0f, 0x01, 0x13, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x07, 0x17, 0x16, 0x33, 0x32, 0x37, 0x33, 0x16, 0x15, 0x14, 0x07, 0x23, 0x35, 0x06, 0x25, 0x36, 0x37, 0x36, 0x37, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x36, 0x01, 0x22, 0x2f, 0x01, 0x07, 0x14, 0x07, 0x36, 0x37, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x07, 0x16, 0x15, 0x14, 0x07, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x06, 0x37, 0x16, 0x15, 0x14, 0x07, 0x15, 0x33, 0x36, 0x35, 0x34, 0x27, 0x05, 0x36, 0x37, 0x0f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x36, 0x35, 0x34, 0x05, 0x07, 0x37, 0x26, 0xc2, 0x19, 0x12, 0x0d, 0x0e, 0x03, 0x18, 0x2a, 0x62, 0x2b, 0x1a, 0x22, 0x87, 0x43, 0x1d, 0x5a, 0x4a, 0x22, 0x50, 0xed, 0x74, 0x06, 0x0d, 0x3e, 0x19, 0x17, 0x54, 0x6e, 0x3a, 0x3c, 0x1f, 0x20, 0x2f, 0x38, 0x89, 0x29, 0x35, 0x21, 0x1b, 0x0c, 0xab, 0xb8, 0x27, 0x24, 0x31, 0x05, 0xcb, 0x50, 0x38, 0xdf, 0x62, 0xfd, 0x0f, 0x1e, 0x1b, 0x07, 0x05, 0x01, 0x2c, 0x20, 0x0f, 0x1c, 0x50, 0xd4, 0x30, 0x1f, 0x12, 0x2a, 0x27, 0x24, 0x03, 0x4d, 0x2f, 0x17, 0xd9, 0x68, 0x4b, 0x39, 0x4f, 0x0e, 0x21, 0x4c, 0x74, 0x38, 0x16, 0x1f, 0x12, 0x67, 0x43, 0x39, 0x43, 0x24, 0x57, 0x29, 0x2a, 0x2f, 0x7c, 0x26, 0x2d, 0x16, 0x43, 0x2d, 0x29, 0x8e, 0x2b, 0x38, 0xfd, 0x05, 0x4b, 0x0c, 0x92, 0x51, 0x65, 0x2b, 0x1c, 0x27, 0x15, 0xfe, 0xc3, 0x2c, 0x54, 0x06, 0x01, 0xf0, 0x03, 0x27, 0x1f, 0x1f, 0x20, 0x10, 0xfe, 0xc7, 0x0e, 0x05, 0x10, 0x08, 0x3b, 0x63, 0x73, 0x01, 0x0c, 0x12, 0x20, 0x1a, 0x2f, 0xe8, 0x5e, 0x22, 0x7c, 0x59, 0x2f, 0x1a, 0x0d, 0x34, 0xab, 0x32, 0x38, 0x19, 0x1d, 0xdb, 0x87, 0x1d, 0x1e, 0x83, 0xb4, 0xcf, 0x95, 0x6c, 0x25, 0xe9, 0x25, 0x6f, 0x1d, 0x0f, 0x01, 0x74, 0x1e, 0x0e, 0xe9, 0x35, 0x6f, 0x41, 0x3d, 0x27, 0x59, 0x24, 0x09, 0x01, 0x61, 0x10, 0x9d, 0x85, 0xa3, 0x54, 0x02, 0x2a, 0x0d, 0x16, 0x12, 0x10, 0x27, 0x01, 0x27, 0x47, 0x2b, 0x2d, 0x0d, 0x0b, 0x0c, 0x06, 0x25, 0x5f, 0x6b, 0x6a, 0x7e, 0x07, 0x1d, 0x72, 0x8d, 0x7d, 0x6a, 0x4c, 0x60, 0xd0, 0x86, 0x7c, 0xef, 0x5c, 0x67, 0xc3, 0x4b, 0x1a, 0x40, 0x2f, 0x1e, 0x14, 0x03, 0x2e, 0x38, 0x35, 0x96, 0x63, 0x28, 0x24, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa3, 0x00, 0x9a, 0x05, 0x37, 0x05, 0xaf, 0x00, 0x13, 0x00, 0x19, 0x00, 0x20, 0x00, 0x28, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x53, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x2f, 0x01, 0x06, 0x23, 0x14, 0x07, 0x06, 0x23, 0x14, 0x07, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x3f, 0x01, 0x0f, 0x02, 0x13, 0x37, 0x01, 0x13, 0x25, 0x01, 0x13, 0x05, 0x01, 0x33, 0x32, 0x35, 0x34, 0x27, 0x01, 0x00, 0x36, 0x35, 0x34, 0x27, 0x01, 0x07, 0x01, 0x16, 0x33, 0x01, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x17, 0x07, 0x01, 0x16, 0x33, 0x32, 0x27, 0x04, 0xa1, 0x07, 0x0b, 0x01, 0x36, 0x14, 0x1b, 0x31, 0x30, 0x42, 0x14, 0xd5, 0x07, 0x07, 0x09, 0x17, 0xfc, 0xda, 0x89, 0x0c, 0x83, 0x8a, 0x0c, 0x76, 0xef, 0x02, 0x3d, 0xa6, 0xfd, 0xa9, 0xfd, 0xc4, 0x0f, 0x01, 0x91, 0x01, 0xd8, 0x02, 0x39, 0x02, 0xfd, 0xfb, 0x01, 0x7a, 0x31, 0x06, 0xfe, 0x2f, 0x66, 0x01, 0xd2, 0x0f, 0x0d, 0xfd, 0xb0, 0x0c, 0x1c, 0x0e, 0x0c, 0x09, 0x0d, 0x0f, 0x05, 0x05, 0x11, 0x0d, 0x0c, 0x1a, 0x10, 0x0c, 0x08, 0x0d, 0x0e, 0x03, 0x05, 0x12, 0x28, 0x72, 0x02, 0x04, 0x0a, 0x09, 0x34, 0x01, 0x01, 0x40, 0x08, 0x1c, 0x0a, 0x05, 0x08, 0xee, 0x17, 0x48, 0x36, 0x37, 0x1c, 0x18, 0x3b, 0x02, 0x0b, 0x02, 0xf9, 0x98, 0x92, 0x0d, 0x98, 0x92, 0x01, 0x7a, 0x12, 0xfd, 0x83, 0xfd, 0x68, 0xb8, 0x02, 0x7c, 0x01, 0x09, 0x14, 0xfd, 0xf3, 0x38, 0x0a, 0x0c, 0x02, 0x3e, 0xfc, 0xb6, 0x36, 0x21, 0x0f, 0x11, 0x02, 0x06, 0x71, 0xfd, 0xfa, 0x06, 0x02, 0xea, 0x0d, 0x15, 0x05, 0x04, 0x11, 0x0d, 0x0a, 0x0e, 0x10, 0x1f, 0x0d, 0x0e, 0x14, 0x05, 0x04, 0x0e, 0x10, 0x0b, 0x0d, 0x10, 0x1e, 0xf4, 0x0e, 0xfd, 0xc2, 0x02, 0x42, 0x00, 0x00, 0x07, 0x00, 0x2f, 0x01, 0x96, 0x05, 0xe7, 0x04, 0x3e, 0x00, 0x11, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x3f, 0x00, 0x46, 0x00, 0x00, 0x00, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x14, 0x07, 0x16, 0x14, 0x07, 0x16, 0x15, 0x37, 0x36, 0x37, 0x36, 0x05, 0x35, 0x27, 0x07, 0x15, 0x17, 0x03, 0x37, 0x21, 0x09, 0x01, 0x21, 0x27, 0x01, 0x21, 0x36, 0x35, 0x34, 0x27, 0x21, 0x00, 0x34, 0x27, 0x21, 0x15, 0x21, 0x24, 0x34, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x17, 0x07, 0x21, 0x36, 0x35, 0x34, 0x27, 0x05, 0x13, 0x07, 0x06, 0x04, 0x09, 0xbd, 0x13, 0x2e, 0x2e, 0x13, 0xbd, 0x09, 0x04, 0x06, 0xfc, 0x16, 0x55, 0x54, 0x54, 0x9d, 0x9d, 0x02, 0xfd, 0x02, 0x1c, 0xfd, 0xe4, 0xfd, 0x03, 0x9d, 0x01, 0x28, 0x02, 0x6f, 0x16, 0x1f, 0xfd, 0x52, 0x02, 0xf6, 0x2d, 0xfd, 0x9a, 0x02, 0x66, 0xfc, 0xc7, 0x06, 0x08, 0x06, 0x10, 0x12, 0x10, 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x10, 0x12, 0x10, 0x06, 0x08, 0xb2, 0x48, 0x02, 0xae, 0x1f, 0x16, 0x02, 0xde, 0x18, 0x15, 0x09, 0x07, 0x06, 0x7e, 0x21, 0x14, 0x38, 0x90, 0x38, 0x14, 0x21, 0x7e, 0x06, 0x07, 0x09, 0x4b, 0xd8, 0x70, 0x70, 0xd8, 0x70, 0x01, 0x68, 0xc8, 0xfe, 0xac, 0xfe, 0xac, 0xc8, 0x01, 0x2c, 0x19, 0x17, 0x1b, 0x19, 0xfe, 0xc4, 0x70, 0x18, 0xa0, 0x3c, 0x28, 0x23, 0x0f, 0x0e, 0x10, 0x10, 0x0e, 0x0f, 0x23, 0x28, 0x23, 0x0f, 0x0e, 0x10, 0x10, 0x0e, 0x0f, 0x69, 0x64, 0x19, 0x1b, 0x17, 0x19, 0x00, 0x07, 0x00, 0xa3, 0x00, 0x9a, 0x05, 0x37, 0x05, 0xaf, 0x00, 0x13, 0x00, 0x19, 0x00, 0x20, 0x00, 0x28, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x53, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x15, 0x32, 0x17, 0x16, 0x15, 0x32, 0x17, 0x37, 0x36, 0x35, 0x34, 0x26, 0x01, 0x27, 0x1f, 0x02, 0x27, 0x07, 0x27, 0x03, 0x01, 0x25, 0x03, 0x01, 0x27, 0x17, 0x01, 0x36, 0x35, 0x34, 0x2b, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x01, 0x17, 0x01, 0x36, 0x35, 0x01, 0x2e, 0x01, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x13, 0x01, 0x36, 0x23, 0x22, 0x07, 0x01, 0x04, 0xa1, 0x08, 0x17, 0x09, 0x07, 0x07, 0xd5, 0x14, 0x42, 0x30, 0x31, 0x1b, 0x14, 0x36, 0x01, 0x0b, 0xfc, 0xcb, 0x84, 0x0c, 0x8a, 0x83, 0x0c, 0x97, 0xb2, 0x0f, 0x02, 0x3c, 0x02, 0x57, 0xa6, 0xfd, 0xc3, 0x10, 0x0c, 0x02, 0x05, 0x02, 0x39, 0x02, 0x21, 0x31, 0x1e, 0x0d, 0x0f, 0xfe, 0x2e, 0x66, 0x01, 0xd1, 0x06, 0xfd, 0x61, 0x0c, 0x12, 0x05, 0x03, 0x0e, 0x0d, 0x08, 0x0c, 0x10, 0x1a, 0x0c, 0x0d, 0x11, 0x05, 0x05, 0x0f, 0x0d, 0x09, 0x0c, 0x0e, 0x1c, 0x10, 0x01, 0xd8, 0x01, 0x34, 0x09, 0x0a, 0xfd, 0xfc, 0x05, 0x09, 0x09, 0x0b, 0x02, 0x3b, 0x18, 0x1c, 0x37, 0x36, 0x48, 0x17, 0xee, 0x08, 0x05, 0x0a, 0x1c, 0xfd, 0x18, 0x0d, 0x92, 0x98, 0x0d, 0x92, 0xd5, 0xc6, 0x01, 0x09, 0x02, 0x7c, 0xb8, 0xfd, 0x68, 0xfd, 0x83, 0xec, 0x7f, 0x02, 0x3e, 0x0c, 0x0a, 0x38, 0x88, 0x36, 0x06, 0xfd, 0xfa, 0x71, 0x02, 0x06, 0x11, 0x0f, 0xfd, 0x6d, 0x0e, 0x1e, 0x10, 0x0d, 0x0b, 0x10, 0x0e, 0x04, 0x05, 0x14, 0x0e, 0x0d, 0x1f, 0x10, 0x0e, 0x0a, 0x0d, 0x11, 0x04, 0x05, 0x15, 0x01, 0x0f, 0x02, 0x0c, 0x42, 0x02, 0xfd, 0xc2, 0x00, 0x02, 0x00, 0x4f, 0x01, 0x7b, 0x05, 0x73, 0x04, 0x5b, 0x00, 0x25, 0x00, 0x47, 0x00, 0x00, 0x12, 0x10, 0x27, 0x32, 0x33, 0x20, 0x25, 0x01, 0x15, 0x25, 0x2e, 0x01, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x25, 0x15, 0x01, 0x24, 0x21, 0x22, 0x23, 0x12, 0x14, 0x07, 0x32, 0x33, 0x32, 0x05, 0x25, 0x05, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x05, 0x25, 0x04, 0x23, 0x22, 0x23, 0x7c, 0x2d, 0x07, 0x07, 0x01, 0x07, 0x01, 0xe2, 0x02, 0x2d, 0xfd, 0xf9, 0x05, 0x0c, 0x11, 0x0b, 0x1b, 0x0c, 0x0d, 0x09, 0x0a, 0x0a, 0x0c, 0x08, 0x09, 0x0d, 0x0c, 0x1b, 0x0b, 0x11, 0x0c, 0x05, 0x02, 0x07, 0xfd, 0xd3, 0xfe, 0x1e, 0xfe, 0xf9, 0x07, 0x07, 0x8a, 0x15, 0x04, 0x04, 0xa0, 0x01, 0xda, 0x01, 0x8b, 0xfe, 0xc0, 0x14, 0x19, 0x17, 0x38, 0x17, 0x18, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x18, 0x17, 0x38, 0x17, 0x19, 0x14, 0x01, 0x40, 0xfe, 0x75, 0xfe, 0x26, 0xa0, 0x04, 0x04, 0x02, 0x49, 0x01, 0x44, 0x60, 0x6e, 0xfe, 0xed, 0x53, 0x1c, 0x08, 0x10, 0x08, 0x06, 0x06, 0x06, 0x0a, 0x09, 0x1d, 0x20, 0x1f, 0x07, 0x0a, 0x06, 0x06, 0x06, 0x08, 0x10, 0x08, 0x1c, 0x53, 0xfe, 0xed, 0x6e, 0x01, 0x47, 0x8a, 0x59, 0x6e, 0xb9, 0x18, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x17, 0x35, 0x3e, 0x35, 0x17, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x18, 0xb9, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7c, 0x01, 0xad, 0x05, 0x73, 0x04, 0x29, 0x00, 0x28, 0x00, 0x00, 0x01, 0x25, 0x15, 0x01, 0x24, 0x23, 0x22, 0x23, 0x36, 0x34, 0x27, 0x32, 0x33, 0x32, 0x25, 0x01, 0x15, 0x25, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x03, 0x84, 0x01, 0xef, 0xfd, 0xd3, 0xfe, 0x21, 0xdf, 0x06, 0x06, 0x2d, 0x2d, 0x06, 0x06, 0xdf, 0x01, 0xdf, 0x02, 0x2d, 0xfe, 0x11, 0x06, 0x0e, 0x0c, 0x11, 0x0f, 0x26, 0x0f, 0x10, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0d, 0x10, 0x0f, 0x26, 0x0f, 0x11, 0x0c, 0x0e, 0x02, 0xc5, 0x1c, 0x21, 0xfe, 0xed, 0x6e, 0x60, 0xe0, 0x60, 0x6e, 0xfe, 0xed, 0x21, 0x1d, 0x11, 0x0f, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x0f, 0x23, 0x15, 0x14, 0x23, 0x0f, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x00, 0xc6, 0x04, 0xcf, 0x05, 0x0a, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x12, 0x13, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x00, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0x98, 0x23, 0x12, 0x24, 0x0f, 0x0c, 0x0c, 0xfd, 0xd7, 0x38, 0x7a, 0x1c, 0x14, 0x1d, 0xfe, 0xa4, 0xfe, 0xd7, 0x14, 0x40, 0x41, 0x0c, 0x1f, 0x29, 0x2f, 0x3f, 0x27, 0x02, 0x8e, 0x40, 0x78, 0x14, 0x01, 0xc2, 0x01, 0x16, 0x48, 0x0c, 0x09, 0x0e, 0x29, 0xfe, 0x30, 0xfd, 0xfc, 0x24, 0x06, 0x0f, 0x8a, 0x99, 0x27, 0x2a, 0x27, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd5, 0x00, 0xb2, 0x05, 0x32, 0x05, 0x0c, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x00, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x01, 0x98, 0x23, 0x12, 0x24, 0x0f, 0x0c, 0x0c, 0xfd, 0xd7, 0x5b, 0x57, 0x72, 0x17, 0x0a, 0x14, 0xfd, 0xbd, 0x6f, 0x26, 0x88, 0x2d, 0x32, 0x15, 0x33, 0x41, 0x3f, 0x57, 0x2b, 0x03, 0x1a, 0x40, 0x78, 0x14, 0x01, 0x9d, 0xaf, 0x4a, 0x08, 0x03, 0x16, 0x12, 0x1b, 0xfd, 0x1e, 0xde, 0x4c, 0x1a, 0x0c, 0x8d, 0xb2, 0x86, 0x31, 0x20, 0x2c, 0x00, 0x01, 0x00, 0xe9, 0x00, 0x94, 0x05, 0x20, 0x05, 0x41, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x37, 0x09, 0x01, 0x17, 0x03, 0x83, 0x01, 0x9b, 0x7f, 0xfe, 0x65, 0xfe, 0x65, 0x80, 0x01, 0x9b, 0xfe, 0x65, 0x80, 0x01, 0x9b, 0x01, 0x9c, 0x7f, 0x02, 0xea, 0xfe, 0x37, 0x8d, 0x01, 0xc9, 0xfe, 0x37, 0x8d, 0x01, 0xc9, 0x01, 0xc9, 0x8d, 0xfe, 0x38, 0x01, 0xc9, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x3f, 0x05, 0x6b, 0x05, 0x96, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x0b, 0x04, 0x1c, 0x01, 0x4f, 0xfe, 0xe8, 0xfe, 0xb1, 0xfe, 0xb1, 0xfe, 0xe9, 0x01, 0x4e, 0xfe, 0xb2, 0x01, 0x17, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x18, 0x02, 0xea, 0xfe, 0x8c, 0xfe, 0xc9, 0x01, 0x74, 0xfe, 0x8c, 0x01, 0x37, 0x01, 0x74, 0x01, 0x74, 0x01, 0x37, 0xfe, 0x8c, 0x01, 0x75, 0xfe, 0xc9, 0x00, 0x01, 0x00, 0xd8, 0xff, 0xee, 0x05, 0x0d, 0x05, 0xdc, 0x00, 0x42, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x03, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x12, 0x13, 0x02, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x04, 0x79, 0x09, 0x0e, 0x10, 0x10, 0x1a, 0x0f, 0x0e, 0x17, 0x0e, 0x13, 0xbc, 0xb0, 0x49, 0x81, 0x0a, 0x1b, 0x1c, 0x03, 0x14, 0x17, 0x0b, 0x17, 0x12, 0x6c, 0x73, 0x9b, 0xc8, 0x1d, 0x44, 0x21, 0x03, 0x2e, 0x0a, 0x04, 0x19, 0xb7, 0xcd, 0x6d, 0x24, 0x09, 0x11, 0x11, 0x0e, 0x0e, 0x14, 0x08, 0x0c, 0x10, 0x1a, 0x1c, 0x09, 0x31, 0x4f, 0x80, 0xb8, 0x15, 0x05, 0xdc, 0x10, 0x10, 0x1a, 0x33, 0x1b, 0x11, 0x15, 0x1b, 0x17, 0xe2, 0xfe, 0xf1, 0xc6, 0xef, 0x14, 0x0c, 0x17, 0x19, 0x16, 0x0c, 0x14, 0x1e, 0x10, 0x12, 0x1a, 0x9a, 0xd0, 0xe0, 0xfe, 0x8a, 0x36, 0x2a, 0x1c, 0x3d, 0x50, 0x1f, 0x0e, 0x2a, 0x01, 0x3e, 0x01, 0x0a, 0x01, 0x22, 0x9d, 0x23, 0x0a, 0x0e, 0x1a, 0x1a, 0x1d, 0x11, 0x0c, 0x10, 0x1e, 0xa8, 0x98, 0xb8, 0xcc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe2, 0x00, 0x00, 0x05, 0x6e, 0x05, 0xea, 0x00, 0x52, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x36, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x02, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x03, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x12, 0x37, 0x36, 0x04, 0xcc, 0x1a, 0x18, 0x12, 0x07, 0x18, 0x09, 0x1c, 0x0d, 0x0d, 0x0f, 0xd9, 0xd3, 0x85, 0x85, 0x0f, 0x1a, 0x12, 0x22, 0x02, 0x0c, 0x16, 0x1d, 0x20, 0x1b, 0x07, 0x0d, 0x20, 0x18, 0x15, 0x18, 0x50, 0x6d, 0xcf, 0x4f, 0x0f, 0x13, 0x02, 0x10, 0x0f, 0x0e, 0x02, 0x12, 0x10, 0x16, 0x1a, 0x21, 0x1b, 0x08, 0x08, 0x10, 0x15, 0x75, 0xb1, 0x6e, 0x59, 0x14, 0x15, 0x0e, 0x14, 0x17, 0x2c, 0x01, 0x09, 0x15, 0x0f, 0x27, 0x0c, 0x5f, 0x87, 0xd0, 0xe0, 0x0b, 0x05, 0xea, 0x1e, 0x16, 0x3a, 0x01, 0x05, 0x0c, 0x0e, 0x0d, 0x15, 0x28, 0x10, 0xdb, 0xfe, 0xc7, 0xcc, 0xa2, 0x12, 0x18, 0x31, 0x1a, 0x11, 0x02, 0x11, 0x23, 0x3a, 0x18, 0x12, 0x0b, 0x1b, 0x1c, 0x5f, 0xbf, 0xfe, 0xfb, 0x87, 0x1a, 0x24, 0x1f, 0x0d, 0x0c, 0x1e, 0x23, 0x11, 0x1b, 0x2d, 0x03, 0x0d, 0x18, 0x18, 0x15, 0x1f, 0xb0, 0xd4, 0xbd, 0x01, 0x0b, 0x3d, 0x1c, 0x1a, 0x31, 0x20, 0x27, 0x0e, 0x19, 0x32, 0x1a, 0xc4, 0xba, 0x01, 0x08, 0xda, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x03, 0xca, 0xfe, 0x74, 0xfe, 0x81, 0x01, 0x7f, 0x01, 0x8c, 0x01, 0x80, 0xfe, 0xc8, 0x01, 0x92, 0xfe, 0x6e, 0xfd, 0xe4, 0xfe, 0x6f, 0x01, 0x91, 0x02, 0x1c, 0xb4, 0x01, 0x92, 0xfe, 0x6e, 0xb4, 0xfe, 0x6f, 0x01, 0x91, 0xb4, 0x03, 0xc6, 0x01, 0xab, 0xfe, 0x55, 0xfe, 0x48, 0xfe, 0x56, 0x01, 0xaa, 0x01, 0xb8, 0x50, 0xfd, 0xa8, 0xfe, 0x42, 0x01, 0xbe, 0x02, 0x58, 0x01, 0xbf, 0xfd, 0x79, 0xc8, 0xfe, 0x42, 0x01, 0xbe, 0xc8, 0x01, 0xbf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0xb8, 0x01, 0xec, 0xfe, 0x14, 0xfe, 0x98, 0xfe, 0x15, 0x01, 0xeb, 0x01, 0x68, 0x03, 0xb2, 0xfe, 0x70, 0xfd, 0xde, 0x02, 0x22, 0x01, 0x90, 0x02, 0x23, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x33, 0x35, 0x23, 0x37, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x02, 0x99, 0xd6, 0xd6, 0xd7, 0x02, 0x34, 0xfd, 0xcc, 0xd8, 0xfd, 0xcd, 0x02, 0x33, 0xd8, 0x02, 0x73, 0xee, 0x01, 0xf0, 0xfd, 0x8e, 0x02, 0x72, 0xf0, 0x02, 0x73, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x25, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x02, 0x51, 0x01, 0x66, 0xfe, 0x9a, 0x01, 0x67, 0x01, 0xec, 0xfe, 0x14, 0xfe, 0x98, 0xfe, 0x15, 0x01, 0xeb, 0x01, 0x68, 0x02, 0x23, 0x01, 0x8e, 0x01, 0xfe, 0x70, 0xfd, 0xde, 0x02, 0x22, 0x01, 0x90, 0x02, 0x23, 0x00, 0x00, 0x01, 0x01, 0x30, 0x00, 0x00, 0x04, 0xd9, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x03, 0x70, 0x01, 0x68, 0xfe, 0x98, 0xd8, 0xfe, 0x98, 0x01, 0x68, 0xd8, 0x04, 0x45, 0xf0, 0xfc, 0xab, 0x03, 0x55, 0xf0, 0x01, 0x90, 0x00, 0x02, 0x00, 0xf1, 0x00, 0x00, 0x04, 0xe2, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x21, 0x11, 0x21, 0x27, 0x11, 0x23, 0x27, 0x11, 0x21, 0x11, 0x21, 0x17, 0x07, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x21, 0x35, 0x03, 0xd3, 0x87, 0x87, 0xfe, 0xf2, 0xfe, 0xb3, 0x87, 0x87, 0x87, 0x01, 0x0e, 0x01, 0x4d, 0x87, 0xb4, 0xc6, 0xfe, 0xf2, 0x01, 0x0e, 0xc6, 0x01, 0x0e, 0x04, 0xa9, 0x96, 0xfe, 0x8e, 0xfd, 0x5f, 0x96, 0x02, 0x0b, 0x96, 0x01, 0x72, 0x01, 0x2c, 0x96, 0xfa, 0x01, 0x2c, 0xfe, 0xd4, 0xdc, 0xfd, 0x5f, 0x02, 0xa1, 0xdc, 0x00, 0x03, 0x01, 0x1e, 0x00, 0x00, 0x04, 0xeb, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x27, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x03, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x03, 0xa6, 0xfe, 0xbc, 0xfc, 0xfc, 0x01, 0x44, 0xfc, 0xb4, 0xfc, 0xfc, 0xfe, 0x2c, 0xfc, 0xfc, 0x01, 0xd4, 0x90, 0xfc, 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0x04, 0x6d, 0x01, 0x18, 0xfe, 0xe8, 0xfe, 0x84, 0xfd, 0x5f, 0x02, 0xa1, 0x01, 0x7c, 0x50, 0xfd, 0xe4, 0xfd, 0x5f, 0x02, 0xa1, 0x02, 0x1c, 0x01, 0x18, 0xfe, 0x48, 0xdc, 0xfd, 0x5f, 0x02, 0xa1, 0xdc, 0x01, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x07, 0x11, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x27, 0x21, 0x07, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x1d, 0x01, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x37, 0x11, 0x27, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x2b, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x17, 0x21, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x02, 0xc1, 0x6f, 0x5a, 0xa1, 0x42, 0x3b, 0x28, 0x20, 0x2d, 0x16, 0x17, 0x20, 0x26, 0x3d, 0x3e, 0xa1, 0x5e, 0x6f, 0x45, 0x40, 0x3c, 0x55, 0x4a, 0x19, 0x48, 0x04, 0x09, 0x31, 0x30, 0x4a, 0x56, 0x3c, 0x42, 0x42, 0x6e, 0x5e, 0xa1, 0x3e, 0x3d, 0x26, 0x21, 0x2d, 0x17, 0x16, 0x21, 0x27, 0x3c, 0x3f, 0xa4, 0x5a, 0x6e, 0x44, 0x40, 0x3c, 0x56, 0x4a, 0x18, 0x49, 0xfb, 0xf7, 0x30, 0x31, 0x4a, 0x55, 0x3c, 0x42, 0x43, 0x02, 0xa0, 0x4b, 0x49, 0x42, 0x60, 0x4f, 0x1b, 0x54, 0x04, 0x7c, 0x38, 0x37, 0x4f, 0x5c, 0x46, 0x47, 0x4b, 0x7a, 0x64, 0xb6, 0x47, 0x42, 0x2b, 0x25, 0x32, 0x19, 0x19, 0x25, 0x2b, 0x42, 0x49, 0xb4, 0x64, 0x7a, 0x4b, 0x47, 0x46, 0x5c, 0x4f, 0x1b, 0x54, 0xfb, 0x84, 0x38, 0x37, 0x4f, 0x60, 0x42, 0x48, 0x4c, 0x7b, 0x64, 0xb6, 0x47, 0x42, 0x2b, 0x25, 0x32, 0x19, 0x19, 0x25, 0x2b, 0x42, 0x49, 0xb4, 0x64, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xa8, 0xff, 0xe5, 0x05, 0x61, 0x05, 0xf3, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x14, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x20, 0x00, 0x23, 0x00, 0x00, 0x01, 0x13, 0x21, 0x03, 0x13, 0x21, 0x0b, 0x01, 0x21, 0x13, 0x03, 0x21, 0x17, 0x03, 0x13, 0x21, 0x13, 0x0b, 0x01, 0x07, 0x33, 0x1f, 0x01, 0x37, 0x03, 0x07, 0x33, 0x05, 0x23, 0x17, 0x03, 0x27, 0x07, 0x13, 0x37, 0x23, 0x03, 0x04, 0xca, 0x01, 0x92, 0xca, 0xca, 0xfe, 0x6e, 0xca, 0xc9, 0xfe, 0x6d, 0xca, 0xca, 0x01, 0x93, 0x34, 0x96, 0x96, 0x01, 0x2b, 0x95, 0x95, 0x96, 0x61, 0xc2, 0x9c, 0x62, 0x61, 0x61, 0x62, 0xc3, 0xfe, 0xa1, 0xc2, 0x61, 0xfd, 0x62, 0x61, 0x61, 0x62, 0xc3, 0x05, 0xf3, 0xfe, 0x7c, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0x7c, 0x01, 0x84, 0x01, 0x83, 0x01, 0x83, 0x64, 0xfe, 0xe1, 0xfe, 0xe0, 0x01, 0x20, 0x01, 0x1f, 0x01, 0x1f, 0xbb, 0x64, 0xbb, 0xbb, 0xfe, 0x7d, 0xbc, 0x63, 0xbc, 0x01, 0x1f, 0xbc, 0xbc, 0x01, 0x84, 0xbb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x43, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2b, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x02, 0xd7, 0x44, 0x28, 0x31, 0x32, 0x6c, 0x33, 0x30, 0x27, 0x45, 0x1d, 0xa7, 0x6e, 0x3f, 0x6a, 0x5a, 0x2c, 0x2b, 0x2b, 0x2c, 0x5a, 0x6a, 0x3f, 0x6e, 0xa7, 0x1d, 0x45, 0x27, 0x30, 0x33, 0x6c, 0x32, 0x31, 0x28, 0x44, 0x1d, 0xa7, 0x6e, 0x3f, 0x6a, 0x5a, 0x2b, 0x2b, 0x2b, 0x2b, 0x5a, 0x6a, 0x3f, 0x6e, 0xa7, 0x03, 0x1c, 0x20, 0xba, 0x7a, 0x46, 0x76, 0x64, 0x30, 0x30, 0x30, 0x30, 0x64, 0x76, 0x46, 0x7a, 0xba, 0x20, 0x4c, 0x2c, 0x36, 0x38, 0x78, 0x38, 0x36, 0x2c, 0x4c, 0x20, 0xbb, 0x79, 0x46, 0x76, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x76, 0x46, 0x79, 0xbb, 0x20, 0x4c, 0x2c, 0x36, 0x38, 0x78, 0x38, 0x36, 0x2c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, 0xff, 0xe7, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x83, 0x00, 0x00, 0x01, 0x26, 0x27, 0x23, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x37, 0x35, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x15, 0x16, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x06, 0x07, 0x06, 0x07, 0x15, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x26, 0x02, 0xb5, 0x0e, 0x09, 0xbf, 0x02, 0x09, 0x12, 0x1a, 0x1d, 0x4a, 0x29, 0x29, 0x49, 0x1d, 0x1c, 0x10, 0x10, 0x10, 0x10, 0x1c, 0x1d, 0x49, 0x29, 0x29, 0x4a, 0x1d, 0x1e, 0x0e, 0x08, 0x03, 0xbf, 0x09, 0x0e, 0x0f, 0x13, 0x0e, 0x12, 0x26, 0x1b, 0x1e, 0x1e, 0x1e, 0x1e, 0x1d, 0x24, 0x24, 0x53, 0x24, 0x24, 0x1c, 0x1e, 0x1f, 0x1f, 0x1e, 0x1f, 0x21, 0x15, 0x0c, 0x13, 0x0f, 0x0f, 0x09, 0xbf, 0x02, 0x08, 0x0e, 0x1e, 0x1d, 0x4a, 0x29, 0x29, 0x4a, 0x1d, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1d, 0x4a, 0x29, 0x29, 0x4a, 0x1d, 0x1a, 0x12, 0x09, 0x01, 0xbf, 0x09, 0x0f, 0x0f, 0x13, 0x0c, 0x15, 0x21, 0x1f, 0x1e, 0x1f, 0x1f, 0x1e, 0x1c, 0x24, 0x24, 0x53, 0x24, 0x24, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1b, 0x26, 0x12, 0x0e, 0x13, 0x02, 0x93, 0x11, 0x15, 0x10, 0x14, 0x2a, 0x1e, 0x21, 0x22, 0x22, 0x21, 0x20, 0x28, 0x28, 0x5c, 0x28, 0x28, 0x20, 0x21, 0x22, 0x22, 0x21, 0x23, 0x25, 0x17, 0x0d, 0x15, 0x11, 0x10, 0x0a, 0xd5, 0x02, 0x0a, 0x14, 0x1d, 0x20, 0x52, 0x2e, 0x2d, 0x52, 0x20, 0x1f, 0x12, 0x11, 0x11, 0x12, 0x1f, 0x20, 0x52, 0x2d, 0x2e, 0x52, 0x20, 0x22, 0x0f, 0x09, 0x03, 0xd5, 0x0a, 0x10, 0x11, 0x15, 0x0d, 0x17, 0x25, 0x23, 0x21, 0x22, 0x22, 0x21, 0x20, 0x28, 0x28, 0x5c, 0x28, 0x28, 0x20, 0x21, 0x22, 0x22, 0x21, 0x1e, 0x2a, 0x14, 0x10, 0x15, 0x11, 0x10, 0x0a, 0xd4, 0x03, 0x09, 0x0f, 0x22, 0x20, 0x52, 0x2e, 0x2d, 0x52, 0x20, 0x1f, 0x12, 0x11, 0x11, 0x12, 0x1f, 0x20, 0x52, 0x2d, 0x2e, 0x52, 0x20, 0x1d, 0x14, 0x0a, 0x02, 0xd4, 0x0a, 0x00, 0x01, 0x00, 0x4a, 0xff, 0xe3, 0x05, 0xbe, 0x05, 0xf0, 0x00, 0x83, 0x00, 0x00, 0x01, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x02, 0xd7, 0x27, 0x21, 0x0c, 0x0f, 0x15, 0x09, 0x24, 0x24, 0x25, 0x23, 0x1c, 0x35, 0x29, 0x67, 0x2b, 0x30, 0x21, 0x22, 0x26, 0x26, 0x22, 0x09, 0x18, 0x07, 0x12, 0x25, 0x23, 0x3d, 0x5b, 0x1e, 0x0c, 0x0b, 0x10, 0x09, 0x23, 0x5a, 0x32, 0x34, 0x59, 0x22, 0x20, 0x16, 0x13, 0x13, 0x16, 0x20, 0x22, 0x59, 0x34, 0x32, 0x5a, 0x23, 0x09, 0x10, 0x0b, 0x0c, 0x25, 0x57, 0x3a, 0x2b, 0x1d, 0x0c, 0x0e, 0x17, 0x09, 0x23, 0x25, 0x26, 0x22, 0x21, 0x30, 0x2a, 0x67, 0x2a, 0x31, 0x20, 0x23, 0x25, 0x24, 0x24, 0x09, 0x16, 0x0f, 0x0b, 0x23, 0x25, 0x39, 0x59, 0x23, 0x0c, 0x0b, 0x10, 0x09, 0x22, 0x5a, 0x33, 0x34, 0x58, 0x23, 0x1d, 0x19, 0x13, 0x13, 0x16, 0x20, 0x23, 0x58, 0x34, 0x37, 0x56, 0x22, 0x09, 0x10, 0x05, 0x12, 0x24, 0x58, 0x03, 0x1c, 0x43, 0x63, 0x22, 0x0e, 0x0c, 0x12, 0x0a, 0x26, 0x64, 0x38, 0x3a, 0x62, 0x26, 0x20, 0x1c, 0x16, 0x16, 0x18, 0x24, 0x26, 0x62, 0x3a, 0x3d, 0x5f, 0x26, 0x0a, 0x12, 0x06, 0x14, 0x28, 0x61, 0x3f, 0x2f, 0x21, 0x0d, 0x10, 0x19, 0x0a, 0x27, 0x29, 0x2a, 0x26, 0x24, 0x36, 0x2f, 0x72, 0x2f, 0x36, 0x24, 0x26, 0x2a, 0x29, 0x27, 0x0a, 0x19, 0x10, 0x0d, 0x27, 0x29, 0x44, 0x65, 0x21, 0x0d, 0x0c, 0x12, 0x0a, 0x27, 0x64, 0x38, 0x3a, 0x62, 0x26, 0x24, 0x18, 0x15, 0x15, 0x18, 0x24, 0x26, 0x62, 0x3a, 0x38, 0x64, 0x27, 0x0a, 0x12, 0x0c, 0x0d, 0x29, 0x61, 0x40, 0x29, 0x27, 0x0e, 0x10, 0x18, 0x0a, 0x28, 0x28, 0x2a, 0x26, 0x20, 0x3a, 0x2e, 0x72, 0x30, 0x36, 0x24, 0x26, 0x2a, 0x2a, 0x26, 0x0a, 0x1a, 0x08, 0x14, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe5, 0x05, 0xbd, 0x05, 0xf2, 0x01, 0x30, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x11, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x11, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x11, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x11, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x03, 0x04, 0x1b, 0x15, 0x18, 0x10, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x0a, 0x12, 0x17, 0x19, 0x1b, 0x16, 0x17, 0x11, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x24, 0x16, 0x17, 0x1a, 0x1b, 0x15, 0x16, 0x12, 0x0d, 0x09, 0x01, 0x09, 0x0f, 0x0d, 0x11, 0x0a, 0x0a, 0x14, 0x11, 0x12, 0x17, 0x17, 0x19, 0x1a, 0x17, 0x17, 0x12, 0x11, 0x0a, 0x0a, 0x0a, 0x07, 0x08, 0x12, 0x16, 0x17, 0x19, 0x1d, 0x14, 0x17, 0x12, 0x11, 0x0b, 0x09, 0x09, 0x0b, 0x11, 0x14, 0x15, 0x17, 0x1a, 0x19, 0x17, 0x16, 0x12, 0x08, 0x07, 0x0a, 0x14, 0x11, 0x0f, 0x1a, 0x17, 0x1a, 0x16, 0x1a, 0x17, 0x12, 0x11, 0x0a, 0x0a, 0x0a, 0x0a, 0x11, 0x0d, 0x0f, 0xfe, 0xf8, 0x08, 0x0d, 0x0f, 0x1a, 0x15, 0x1b, 0x1a, 0x16, 0x17, 0x11, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x10, 0x18, 0x15, 0x1b, 0x17, 0x19, 0x12, 0x0a, 0x11, 0x0a, 0x0a, 0x0a, 0x0a, 0x12, 0x10, 0x18, 0x15, 0x36, 0x15, 0x18, 0x10, 0x12, 0x0a, 0x0a, 0x0a, 0x0a, 0x11, 0x0a, 0x12, 0x15, 0x1a, 0x1c, 0x14, 0x18, 0x11, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x11, 0x18, 0x15, 0x1b, 0x18, 0x2f, 0x12, 0x0c, 0x08, 0xfe, 0xf9, 0x0f, 0x0c, 0x13, 0x08, 0x0a, 0x0a, 0x09, 0x12, 0x14, 0x15, 0x17, 0x19, 0x1b, 0x16, 0x17, 0x12, 0x11, 0x0b, 0x08, 0x08, 0x08, 0x09, 0x14, 0x15, 0x17, 0x19, 0x1a, 0x17, 0x17, 0x12, 0x11, 0x0a, 0x09, 0x09, 0x0a, 0x11, 0x0f, 0x1a, 0x17, 0x1a, 0x19, 0x17, 0x17, 0x12, 0x09, 0x08, 0x08, 0x08, 0x0b, 0x11, 0x12, 0x17, 0x16, 0x1b, 0x19, 0x17, 0x17, 0x12, 0x12, 0x09, 0x0a, 0x0a, 0x0a, 0x11, 0x0c, 0x0f, 0x01, 0x07, 0x09, 0x0c, 0x12, 0x17, 0x15, 0x1a, 0x1b, 0x15, 0x18, 0x24, 0x09, 0x09, 0x09, 0x09, 0x12, 0x12, 0x18, 0x14, 0x1c, 0x1a, 0x15, 0x12, 0x0a, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x11, 0x18, 0x14, 0x05, 0xf2, 0x0b, 0x0c, 0x12, 0x14, 0x1a, 0x19, 0x1d, 0x1c, 0x19, 0x1a, 0x14, 0x0a, 0x08, 0x0a, 0x0a, 0x0c, 0x12, 0x14, 0x1a, 0x19, 0x1d, 0x1f, 0x17, 0x19, 0x28, 0x0b, 0x0a, 0x0a, 0x0c, 0x13, 0x0d, 0x11, 0xfe, 0xdb, 0x0a, 0x0e, 0x14, 0x19, 0x17, 0x1e, 0x1d, 0x32, 0x14, 0x14, 0x0b, 0x0a, 0x0a, 0x0b, 0x14, 0x13, 0x1a, 0x18, 0x1e, 0x1c, 0x19, 0x14, 0x0b, 0x14, 0x0b, 0x0a, 0x0a, 0x0b, 0x14, 0x12, 0x1b, 0x18, 0x1d, 0x1e, 0x18, 0x1b, 0x12, 0x16, 0x09, 0x0a, 0x0a, 0x0b, 0x14, 0x0b, 0x14, 0x19, 0x1c, 0x1a, 0x36, 0x13, 0x11, 0x0d, 0x0b, 0x0b, 0x0a, 0x14, 0x14, 0x1a, 0x18, 0x1d, 0x1e, 0x17, 0x19, 0x14, 0x0e, 0x0a, 0xfe, 0xda, 0x12, 0x0d, 0x10, 0x0e, 0x0b, 0x0b, 0x0b, 0x13, 0x14, 0x1a, 0x19, 0x1c, 0x1d, 0x19, 0x1a, 0x14, 0x12, 0x0c, 0x0b, 0x0b, 0x08, 0x09, 0x13, 0x1a, 0x19, 0x1c, 0x1d, 0x1a, 0x19, 0x14, 0x13, 0x0c, 0x0a, 0x0a, 0x0c, 0x13, 0x14, 0x19, 0x1a, 0x1d, 0x1c, 0x19, 0x1a, 0x13, 0x09, 0x08, 0x0b, 0x0b, 0x0c, 0x12, 0x14, 0x1a, 0x19, 0x1d, 0x1c, 0x19, 0x1a, 0x14, 0x13, 0x0b, 0x0b, 0x16, 0x13, 0x0d, 0x12, 0x01, 0x25, 0x09, 0x0e, 0x17, 0x16, 0x18, 0x1e, 0x1c, 0x19, 0x1a, 0x13, 0x16, 0x09, 0x0a, 0x0a, 0x0b, 0x14, 0x12, 0x1b, 0x17, 0x1e, 0x1d, 0x19, 0x13, 0x0c, 0x16, 0x09, 0x0a, 0x0a, 0x0b, 0x14, 0x12, 0x1b, 0x17, 0x3c, 0x17, 0x1b, 0x13, 0x11, 0x0d, 0x0b, 0x0b, 0x0a, 0x14, 0x0b, 0x14, 0x18, 0x1d, 0x1e, 0x17, 0x1b, 0x12, 0x14, 0x0b, 0x0b, 0x0b, 0x0b, 0x14, 0x13, 0x1a, 0x18, 0x1d, 0x1e, 0x17, 0x1a, 0x13, 0x0e, 0x0a, 0x01, 0x25, 0x11, 0x0d, 0x13, 0x0c, 0x0a, 0x0a, 0x0b, 0x28, 0x19, 0x1a, 0x1c, 0x19, 0x1d, 0x1a, 0x14, 0x12, 0x0c, 0x0a, 0x0a, 0x08, 0x0a, 0x14, 0x1a, 0x19, 0x1c, 0x1d, 0x19, 0x1a, 0x14, 0x12, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, 0xff, 0xe3, 0x05, 0xbc, 0x05, 0xf5, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x32, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x33, 0x22, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x34, 0x02, 0x27, 0x26, 0x27, 0x26, 0x4e, 0x8c, 0x7f, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x62, 0x7f, 0x7e, 0x8c, 0x8c, 0x7e, 0x7f, 0x62, 0x69, 0x63, 0x67, 0x65, 0x68, 0x78, 0x7f, 0x02, 0xec, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0xa1, 0x9d, 0xfe, 0xf0, 0x77, 0x6e, 0x3c, 0x3b, 0x3b, 0x3c, 0x6e, 0x77, 0xfe, 0xf0, 0x9d, 0xa1, 0x01, 0x14, 0x6f, 0x72, 0x38, 0x3b, 0x00, 0x02, 0x00, 0x4e, 0xff, 0xe3, 0x05, 0xbc, 0x05, 0xf5, 0x00, 0x1b, 0x00, 0x37, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x21, 0x32, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x33, 0x22, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x34, 0x02, 0x27, 0x26, 0x27, 0x26, 0x01, 0x41, 0x5b, 0x53, 0x4e, 0x43, 0x42, 0x43, 0x40, 0x45, 0x3f, 0x52, 0x52, 0x5c, 0x5c, 0x52, 0x52, 0x3f, 0x45, 0x40, 0x43, 0x42, 0x43, 0x4e, 0x53, 0xfe, 0xb2, 0x8c, 0x7f, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x62, 0x7f, 0x7e, 0x8c, 0x8c, 0x7e, 0x7f, 0x62, 0x69, 0x63, 0x67, 0x65, 0x68, 0x78, 0x7f, 0x02, 0xec, 0x26, 0x25, 0x4a, 0x48, 0xb3, 0x69, 0x66, 0xb1, 0x4d, 0x48, 0x27, 0x26, 0x26, 0x27, 0x48, 0x4d, 0xb1, 0x66, 0x69, 0xb3, 0x48, 0x4a, 0x25, 0x26, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0xa1, 0x9d, 0xfe, 0xf0, 0x77, 0x6e, 0x3c, 0x3b, 0x3b, 0x3c, 0x6e, 0x77, 0xfe, 0xf0, 0x9d, 0xa1, 0x01, 0x14, 0x6f, 0x72, 0x38, 0x3b, 0x00, 0x02, 0x00, 0x2a, 0xff, 0xec, 0x05, 0xdf, 0x05, 0xf3, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x13, 0x25, 0x09, 0x01, 0x05, 0x01, 0x13, 0x25, 0x05, 0x13, 0x01, 0x03, 0x21, 0x01, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x2a, 0x01, 0xd9, 0x01, 0x01, 0x01, 0x02, 0x01, 0xd8, 0xfe, 0xc9, 0x21, 0xfe, 0x3c, 0xfe, 0x3c, 0x22, 0x01, 0xa2, 0xac, 0xfd, 0xd3, 0x01, 0xc2, 0xac, 0x01, 0xc3, 0x01, 0xc3, 0xac, 0x01, 0xc2, 0xfd, 0xd3, 0x03, 0xa5, 0x83, 0x01, 0xcb, 0xfe, 0x35, 0x83, 0xfe, 0x61, 0xfd, 0xe6, 0xca, 0xca, 0x02, 0x1a, 0x03, 0xec, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6c, 0xfe, 0x94, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4d, 0xff, 0xe3, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x09, 0x00, 0x24, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x36, 0x03, 0x04, 0x9b, 0xfe, 0x0b, 0x01, 0x95, 0x9b, 0x01, 0x96, 0x01, 0x96, 0x9b, 0x01, 0x95, 0xfe, 0x0b, 0x9b, 0x8b, 0x80, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x63, 0x7d, 0x7f, 0xfe, 0xea, 0x80, 0x79, 0x67, 0x65, 0x68, 0x63, 0x6a, 0x61, 0x7f, 0x7e, 0x05, 0xea, 0xfd, 0xee, 0xfe, 0xb8, 0xfd, 0xef, 0x01, 0x48, 0xfe, 0xb8, 0x02, 0x11, 0x01, 0x48, 0x02, 0x18, 0x3b, 0x38, 0x72, 0x6f, 0xfe, 0xec, 0xa1, 0x98, 0xfe, 0xf0, 0x77, 0x70, 0x3a, 0x3b, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0x9c, 0x9d, 0x01, 0x10, 0x77, 0x6e, 0x3c, 0x3b, 0x00, 0x02, 0x00, 0x2b, 0xff, 0xed, 0x05, 0xde, 0x05, 0xf2, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x13, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x03, 0x40, 0x78, 0x33, 0x34, 0x2b, 0x2b, 0x15, 0x15, 0x15, 0x15, 0x2b, 0x2b, 0x34, 0x33, 0x78, 0x34, 0x33, 0x2b, 0x2c, 0x14, 0x16, 0x16, 0x14, 0x2c, 0x2b, 0x33, 0x70, 0xac, 0x02, 0x2d, 0xfe, 0x3e, 0xac, 0xfe, 0x3d, 0xfe, 0x3d, 0xac, 0xfe, 0x3e, 0x02, 0x2d, 0x03, 0xe4, 0x18, 0x1a, 0x2d, 0x32, 0x38, 0x3b, 0x42, 0x41, 0x3b, 0x38, 0x32, 0x2d, 0x1a, 0x18, 0x18, 0x1a, 0x2d, 0x32, 0x38, 0x3b, 0x41, 0x42, 0x3b, 0x38, 0x32, 0x2d, 0x1a, 0x02, 0x26, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6b, 0xfe, 0x95, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x03, 0x00, 0x2a, 0xff, 0xec, 0x05, 0xdf, 0x05, 0xf3, 0x00, 0x09, 0x00, 0x27, 0x00, 0x31, 0x00, 0x00, 0x13, 0x25, 0x09, 0x01, 0x05, 0x01, 0x13, 0x25, 0x05, 0x13, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x13, 0x03, 0x21, 0x01, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x2a, 0x01, 0xd9, 0x01, 0x01, 0x01, 0x02, 0x01, 0xd8, 0xfe, 0xc9, 0x21, 0xfe, 0x3c, 0xfe, 0x3c, 0x22, 0x01, 0x66, 0x78, 0x34, 0x33, 0x2b, 0x2c, 0x14, 0x16, 0x16, 0x14, 0x2c, 0x2b, 0x33, 0x34, 0x78, 0x33, 0x34, 0x2b, 0x2b, 0x15, 0x15, 0x15, 0x15, 0x2b, 0x2b, 0x34, 0x6f, 0xac, 0xfd, 0xd3, 0x01, 0xc2, 0xac, 0x01, 0xc3, 0x01, 0xc3, 0xac, 0x01, 0xc2, 0xfd, 0xd3, 0x03, 0xa5, 0x83, 0x01, 0xcb, 0xfe, 0x35, 0x83, 0xfe, 0x61, 0xfd, 0xe6, 0xca, 0xca, 0x02, 0x1a, 0x01, 0xde, 0x18, 0x1a, 0x2d, 0x32, 0x38, 0x3b, 0x42, 0x41, 0x3b, 0x38, 0x32, 0x2d, 0x1a, 0x18, 0x18, 0x1a, 0x2d, 0x32, 0x38, 0x3b, 0x41, 0x42, 0x3b, 0x38, 0x32, 0x2d, 0x1a, 0x02, 0x26, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6b, 0xfe, 0x95, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2b, 0xff, 0xed, 0x05, 0xde, 0x05, 0xf2, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x13, 0x21, 0x07, 0x13, 0x27, 0x07, 0x13, 0x27, 0x21, 0x13, 0x03, 0x21, 0x01, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x03, 0x13, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x03, 0x04, 0x57, 0x01, 0x16, 0xe1, 0x55, 0xe1, 0xe1, 0x56, 0xe1, 0x01, 0x16, 0x56, 0x80, 0xfe, 0x5d, 0x01, 0x52, 0x81, 0x01, 0x52, 0x01, 0x53, 0x82, 0x01, 0x52, 0xfe, 0x5e, 0x81, 0xac, 0x02, 0x2d, 0xfe, 0x3e, 0xac, 0xfe, 0x3d, 0xfe, 0x3d, 0xac, 0xfe, 0x3e, 0x02, 0x2d, 0x04, 0x49, 0xfe, 0xd9, 0xb6, 0xfe, 0xda, 0xb6, 0xb6, 0x01, 0x26, 0xb6, 0x01, 0xfb, 0xfe, 0x47, 0xfe, 0xef, 0xfe, 0x47, 0x01, 0x11, 0xfe, 0xef, 0x01, 0xb9, 0x01, 0x11, 0x02, 0x8e, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6c, 0xfe, 0x94, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2b, 0xff, 0xed, 0x05, 0xde, 0x05, 0xf2, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x17, 0x33, 0x07, 0x17, 0x27, 0x07, 0x37, 0x27, 0x33, 0x1b, 0x01, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x37, 0x03, 0x21, 0x05, 0x03, 0x25, 0x05, 0x03, 0x25, 0x21, 0x03, 0x04, 0x22, 0x70, 0x5a, 0x22, 0x5a, 0x5a, 0x22, 0x5a, 0x70, 0x22, 0xac, 0x02, 0x2d, 0xfe, 0x3e, 0xac, 0xfe, 0x3d, 0xfe, 0x3d, 0xac, 0xfe, 0x3e, 0x02, 0x2d, 0xac, 0x67, 0xfe, 0xaf, 0x01, 0x11, 0x69, 0x01, 0x10, 0x01, 0x11, 0x69, 0x01, 0x10, 0xfe, 0xb0, 0x03, 0x49, 0x76, 0x49, 0x76, 0x49, 0x49, 0x76, 0x49, 0x03, 0x1f, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6c, 0xfe, 0x94, 0x02, 0x4c, 0x01, 0x6c, 0xfb, 0xfe, 0x9d, 0xdb, 0xfe, 0x9d, 0xdb, 0xdb, 0x01, 0x63, 0xdb, 0x00, 0x00, 0x06, 0x00, 0x2b, 0xff, 0xed, 0x05, 0xde, 0x05, 0xf2, 0x00, 0x02, 0x00, 0x05, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x00, 0x25, 0x01, 0x35, 0x25, 0x01, 0x37, 0x01, 0x03, 0x27, 0x25, 0x21, 0x07, 0x0b, 0x01, 0x17, 0x11, 0x13, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x01, 0xb1, 0x01, 0x52, 0xfd, 0xdd, 0x01, 0x52, 0xd1, 0x01, 0x55, 0x82, 0xd1, 0x02, 0x23, 0xfe, 0x5e, 0x81, 0x01, 0x80, 0x80, 0xac, 0x02, 0x2d, 0xfe, 0x3e, 0xac, 0xfe, 0x3d, 0xfe, 0x3d, 0xac, 0xfe, 0x3e, 0x02, 0x2d, 0x99, 0x01, 0x11, 0xf3, 0xc7, 0xfe, 0xef, 0x4b, 0xfd, 0xfb, 0x01, 0xb9, 0x4b, 0xc7, 0xc6, 0x02, 0x80, 0xfe, 0x47, 0xc6, 0x03, 0x53, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6c, 0xfe, 0x94, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x18, 0x05, 0xdf, 0x05, 0xb7, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x00, 0x09, 0x01, 0x13, 0x27, 0x25, 0x01, 0x27, 0x13, 0x01, 0x21, 0x13, 0x17, 0x13, 0x21, 0x01, 0x03, 0x21, 0x05, 0x03, 0x01, 0x05, 0x03, 0x01, 0x21, 0x05, 0xdf, 0xfe, 0x6b, 0x9b, 0x92, 0xfe, 0xd3, 0xfe, 0x93, 0x92, 0x9b, 0xfe, 0x6b, 0x01, 0xf5, 0x9b, 0x92, 0x8b, 0x01, 0x73, 0xfd, 0x70, 0x79, 0xfe, 0x7b, 0x01, 0x3b, 0x79, 0x01, 0x3c, 0x01, 0x3c, 0x79, 0x01, 0x3b, 0xfe, 0x7b, 0x03, 0x71, 0xfe, 0xb8, 0xfd, 0xef, 0x34, 0xf3, 0xfe, 0xd9, 0x34, 0x02, 0x11, 0x01, 0x48, 0x02, 0x12, 0x34, 0xfe, 0x22, 0x01, 0x68, 0xfe, 0x64, 0xff, 0xfe, 0x64, 0x00, 0xff, 0xff, 0x01, 0x9c, 0x00, 0xff, 0x00, 0x01, 0x00, 0x76, 0x00, 0x00, 0x05, 0x92, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x25, 0x13, 0x0d, 0x01, 0x03, 0x25, 0x11, 0x21, 0x11, 0x05, 0x03, 0x2d, 0x01, 0x13, 0x02, 0x74, 0x01, 0x20, 0x01, 0x6e, 0x90, 0xfe, 0x92, 0x01, 0x6e, 0x90, 0xfe, 0x92, 0xfe, 0xe0, 0xfe, 0x93, 0x90, 0x01, 0x6c, 0xfe, 0x94, 0x90, 0x04, 0x00, 0x01, 0xd5, 0xfe, 0x2a, 0xeb, 0xfe, 0xeb, 0xea, 0xeb, 0xfe, 0xeb, 0xeb, 0xfe, 0x2a, 0x01, 0xd6, 0xeb, 0x01, 0x15, 0xeb, 0xea, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x88, 0x00, 0x00, 0x05, 0x80, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x17, 0x00, 0x00, 0x01, 0x07, 0x17, 0x33, 0x37, 0x27, 0x05, 0x01, 0x37, 0x01, 0x11, 0x33, 0x11, 0x01, 0x17, 0x09, 0x01, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x27, 0x02, 0x99, 0x6c, 0x6c, 0xd6, 0x6c, 0x6c, 0xfe, 0xbd, 0xfe, 0x5d, 0x6c, 0x01, 0xa3, 0xd8, 0x01, 0xa4, 0x6c, 0xfe, 0x5c, 0x01, 0xa4, 0x6c, 0xfe, 0x5c, 0xd8, 0xfe, 0x5d, 0x6c, 0x03, 0xb9, 0xce, 0xd0, 0xd0, 0xce, 0xce, 0x01, 0x0d, 0xd0, 0xfe, 0xf2, 0x02, 0x1b, 0xfd, 0xe5, 0x01, 0x0e, 0xd0, 0xfe, 0xf3, 0xfe, 0xf2, 0xd0, 0x01, 0x0d, 0xfd, 0xe6, 0x02, 0x1a, 0xfe, 0xf3, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x09, 0x01, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x27, 0x01, 0x21, 0x35, 0x21, 0x01, 0x37, 0x01, 0x11, 0x33, 0x11, 0x01, 0x17, 0x01, 0x21, 0x15, 0x03, 0x72, 0x01, 0x8d, 0x40, 0xfe, 0x72, 0x5a, 0xfe, 0x72, 0x3f, 0x01, 0x8d, 0xfd, 0xce, 0x02, 0x33, 0xfe, 0x72, 0x3f, 0x01, 0x8e, 0x5a, 0x01, 0x8e, 0x40, 0xfe, 0x71, 0x02, 0x34, 0x02, 0xb8, 0xfe, 0x46, 0x47, 0x01, 0xbb, 0xfd, 0x8e, 0x02, 0x71, 0xfe, 0x46, 0x47, 0x01, 0xba, 0x64, 0x01, 0xbb, 0x47, 0xfe, 0x46, 0x02, 0x71, 0xfd, 0x8f, 0x01, 0xba, 0x47, 0xfe, 0x45, 0x64, 0x00, 0x01, 0x00, 0x39, 0xff, 0xe3, 0x05, 0xab, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x13, 0x09, 0x01, 0x0d, 0x01, 0x09, 0x01, 0x0b, 0x01, 0x09, 0x01, 0x2d, 0x01, 0x09, 0x01, 0x02, 0xf2, 0x47, 0x01, 0xa5, 0xfe, 0xc1, 0x02, 0x0c, 0xfd, 0xf4, 0x01, 0x3f, 0xfe, 0x5b, 0x47, 0x47, 0xfe, 0x5b, 0x01, 0x3f, 0xfd, 0xf5, 0x02, 0x0b, 0xfe, 0xc1, 0x01, 0xa5, 0x05, 0xf0, 0xfd, 0xb9, 0x01, 0x64, 0xfe, 0x2c, 0x50, 0x4f, 0xfe, 0x2c, 0x01, 0x64, 0xfd, 0xb9, 0x02, 0x47, 0xfe, 0x9c, 0x01, 0xd4, 0x4f, 0x50, 0x01, 0xd4, 0xfe, 0x9c, 0x00, 0x00, 0x09, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x02, 0x00, 0x05, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x14, 0x00, 0x17, 0x00, 0x27, 0x00, 0x00, 0x01, 0x05, 0x03, 0x05, 0x25, 0x05, 0x01, 0x03, 0x25, 0x03, 0x13, 0x03, 0x01, 0x25, 0x13, 0x25, 0x05, 0x25, 0x01, 0x13, 0x05, 0x13, 0x03, 0x13, 0x11, 0x13, 0x25, 0x03, 0x0d, 0x01, 0x13, 0x25, 0x0b, 0x01, 0x05, 0x13, 0x2d, 0x01, 0x03, 0x05, 0x04, 0x76, 0xfe, 0xfa, 0x6b, 0x02, 0x0a, 0xfe, 0xf8, 0xfe, 0xfe, 0x01, 0x71, 0x6f, 0xfe, 0xfe, 0x01, 0x6b, 0x6b, 0xfe, 0x8e, 0x01, 0x06, 0x6b, 0xfd, 0xf6, 0x01, 0x08, 0x01, 0x02, 0xfe, 0x8f, 0x6f, 0x01, 0x02, 0x01, 0x6b, 0x6b, 0x8f, 0x01, 0x5d, 0x93, 0x01, 0x60, 0xfe, 0xa0, 0x93, 0xfe, 0xa3, 0x8f, 0x8f, 0xfe, 0xa3, 0x94, 0xfe, 0xa0, 0x01, 0x60, 0x94, 0x01, 0x5d, 0x04, 0x85, 0x7b, 0xfe, 0xe0, 0x01, 0x78, 0x78, 0xfe, 0x65, 0x01, 0x23, 0x77, 0xfd, 0xbc, 0x01, 0x25, 0x01, 0x1f, 0xfe, 0x66, 0x7b, 0x01, 0x1f, 0x01, 0x77, 0x77, 0x01, 0x9c, 0xfe, 0xdd, 0x78, 0x02, 0x45, 0xfe, 0xdb, 0xfe, 0xe0, 0x03, 0x06, 0xfe, 0x79, 0xa4, 0xfe, 0x7c, 0xa0, 0x9f, 0xfe, 0x7c, 0xa4, 0xfe, 0x79, 0x01, 0x87, 0xa4, 0x01, 0x84, 0x9f, 0xa0, 0x01, 0x84, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x13, 0x25, 0x09, 0x01, 0x25, 0x0b, 0x01, 0x05, 0x09, 0x01, 0x05, 0x03, 0x04, 0x65, 0x01, 0xf7, 0xfe, 0x6e, 0x01, 0x92, 0xfe, 0x09, 0x65, 0x65, 0xfe, 0x09, 0x01, 0x93, 0xfe, 0x6d, 0x01, 0xf7, 0x05, 0xf0, 0xfd, 0xbc, 0xc1, 0xfe, 0x7d, 0xfe, 0x7d, 0xc1, 0xfd, 0xbb, 0x02, 0x45, 0xc1, 0x01, 0x83, 0x01, 0x83, 0xc1, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x13, 0x01, 0x03, 0x0d, 0x01, 0x13, 0x01, 0x0b, 0x01, 0x01, 0x13, 0x2d, 0x01, 0x03, 0x01, 0x03, 0x04, 0x66, 0x01, 0x86, 0xf5, 0x01, 0xc2, 0xfe, 0x3e, 0xf5, 0xfe, 0x7a, 0x66, 0x66, 0xfe, 0x7a, 0xf6, 0xfe, 0x3e, 0x01, 0xc2, 0xf6, 0x01, 0x86, 0x05, 0xf0, 0xfe, 0x0b, 0x01, 0x12, 0xfe, 0x4e, 0x72, 0x71, 0xfe, 0x4e, 0x01, 0x12, 0xfe, 0x0b, 0x01, 0xf5, 0xfe, 0xee, 0x01, 0xb2, 0x71, 0x72, 0x01, 0xb2, 0xfe, 0xee, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x13, 0x25, 0x03, 0x0d, 0x01, 0x13, 0x25, 0x0b, 0x01, 0x05, 0x13, 0x2d, 0x01, 0x03, 0x05, 0x03, 0x04, 0x99, 0x01, 0x53, 0x7b, 0x01, 0x48, 0xfe, 0xb8, 0x7b, 0xfe, 0xad, 0x99, 0x99, 0xfe, 0xad, 0x7b, 0xfe, 0xb9, 0x01, 0x47, 0x7b, 0x01, 0x53, 0x05, 0xf0, 0xfe, 0x94, 0x89, 0xfe, 0x87, 0xab, 0xaa, 0xfe, 0x87, 0x89, 0xfe, 0x94, 0x01, 0x6c, 0x89, 0x01, 0x79, 0xaa, 0xab, 0x01, 0x79, 0x89, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x17, 0x00, 0x00, 0x01, 0x13, 0x37, 0x03, 0x25, 0x03, 0x0d, 0x01, 0x13, 0x25, 0x13, 0x27, 0x0b, 0x01, 0x07, 0x13, 0x05, 0x13, 0x2d, 0x01, 0x03, 0x05, 0x03, 0x17, 0x03, 0x04, 0x69, 0xf3, 0x3f, 0x01, 0x3f, 0xd7, 0x01, 0x34, 0xfe, 0xcc, 0xd7, 0xfe, 0xc1, 0x3f, 0xf3, 0x69, 0x68, 0xf4, 0x40, 0xfe, 0xc0, 0xd7, 0xfe, 0xcd, 0x01, 0x33, 0xd7, 0x01, 0x40, 0x40, 0xf4, 0x05, 0xf0, 0xfe, 0xa9, 0xef, 0xfe, 0x9d, 0x47, 0xfe, 0xf1, 0x73, 0x74, 0xfe, 0xf1, 0x47, 0xfe, 0x9d, 0xef, 0xfe, 0xa9, 0x01, 0x57, 0xef, 0x01, 0x63, 0x47, 0x01, 0x0f, 0x74, 0x73, 0x01, 0x0f, 0x47, 0x01, 0x63, 0xef, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x13, 0x17, 0x03, 0x01, 0x17, 0x01, 0x25, 0x17, 0x05, 0x21, 0x15, 0x21, 0x05, 0x07, 0x25, 0x01, 0x07, 0x01, 0x13, 0x07, 0x03, 0x11, 0x23, 0x11, 0x03, 0x27, 0x13, 0x01, 0x27, 0x01, 0x05, 0x27, 0x25, 0x21, 0x35, 0x21, 0x25, 0x37, 0x05, 0x01, 0x37, 0x01, 0x03, 0x37, 0x02, 0xce, 0x6c, 0x99, 0x64, 0x99, 0x01, 0x1b, 0x4c, 0xfe, 0xe5, 0x01, 0x72, 0x2a, 0xfe, 0x8c, 0x01, 0x92, 0xfe, 0x72, 0x01, 0x70, 0x2a, 0xfe, 0x8e, 0x01, 0x1b, 0x4c, 0xfe, 0xe6, 0x98, 0x64, 0x99, 0x6c, 0x99, 0x64, 0x99, 0xfe, 0xe6, 0x4d, 0x01, 0x1b, 0xfe, 0x8e, 0x2a, 0x01, 0x72, 0xfe, 0x71, 0x01, 0x91, 0xfe, 0x8c, 0x2a, 0x01, 0x70, 0xfe, 0xe7, 0x4d, 0x01, 0x19, 0x98, 0x64, 0x04, 0x17, 0x01, 0xbe, 0xfe, 0x45, 0x01, 0x99, 0x2e, 0xfe, 0x66, 0x01, 0x3a, 0x55, 0xfe, 0xc5, 0xab, 0x6f, 0xab, 0x78, 0xaa, 0x6f, 0xac, 0xfe, 0xc4, 0x55, 0x01, 0x39, 0xfe, 0x67, 0x2e, 0x01, 0x98, 0xfe, 0x46, 0x01, 0xbc, 0xfe, 0x66, 0x2e, 0x01, 0x9b, 0xfe, 0xc5, 0x55, 0x01, 0x3a, 0xaa, 0x6f, 0xaa, 0x78, 0xab, 0x6f, 0xa9, 0x01, 0x39, 0x55, 0xfe, 0xc7, 0x01, 0x99, 0x2e, 0x00, 0x00, 0x01, 0x00, 0x96, 0xff, 0xe3, 0x05, 0x73, 0x05, 0xf0, 0x00, 0x9b, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x17, 0x16, 0x17, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x17, 0x16, 0x33, 0x32, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x0f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x26, 0x27, 0x26, 0x27, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x33, 0x32, 0x3f, 0x01, 0x26, 0x35, 0x34, 0x37, 0x27, 0x26, 0x23, 0x22, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x36, 0x37, 0x36, 0x02, 0xd6, 0x43, 0x28, 0x31, 0x32, 0x6c, 0x33, 0x30, 0x27, 0x45, 0x0f, 0x1c, 0x15, 0x09, 0x66, 0x3a, 0x23, 0x3d, 0x36, 0x2e, 0x14, 0x13, 0x40, 0x1b, 0x12, 0x04, 0x0d, 0x4e, 0x38, 0x45, 0x0a, 0x0a, 0x09, 0x76, 0x5a, 0x0b, 0x04, 0x05, 0x0b, 0x5c, 0x75, 0x0a, 0x09, 0x0a, 0x45, 0x38, 0x4e, 0x0d, 0x04, 0x12, 0x1b, 0x40, 0x13, 0x14, 0x2e, 0x36, 0x3d, 0x23, 0x3c, 0x63, 0x0d, 0x18, 0x16, 0x0f, 0x45, 0x27, 0x30, 0x33, 0x6c, 0x32, 0x31, 0x28, 0x45, 0x08, 0x07, 0x1a, 0x15, 0x0d, 0x63, 0x3c, 0x23, 0x3c, 0x36, 0x2f, 0x14, 0x13, 0x40, 0x1b, 0x12, 0x05, 0x0c, 0x4f, 0x38, 0x44, 0x0b, 0x0a, 0x09, 0x76, 0x5a, 0x0b, 0x04, 0x03, 0x0a, 0x5a, 0x76, 0x09, 0x0a, 0x0b, 0x44, 0x38, 0x4f, 0x0c, 0x05, 0x12, 0x1b, 0x40, 0x13, 0x14, 0x2f, 0x36, 0x3c, 0x23, 0x3e, 0x61, 0x0a, 0x18, 0x1a, 0x07, 0x03, 0x94, 0x0c, 0x80, 0x77, 0x46, 0x4e, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x4e, 0x46, 0x79, 0x7e, 0x0c, 0x06, 0x0e, 0x17, 0x06, 0x44, 0x7a, 0x49, 0x27, 0x23, 0x07, 0x18, 0x34, 0x23, 0x2c, 0x16, 0x18, 0x47, 0x32, 0x24, 0x3a, 0x07, 0x13, 0x14, 0x15, 0x14, 0x07, 0x3b, 0x24, 0x32, 0x47, 0x18, 0x16, 0x2c, 0x23, 0x34, 0x18, 0x07, 0x23, 0x27, 0x49, 0x7e, 0x3f, 0x08, 0x19, 0x09, 0x06, 0x0f, 0x7f, 0x79, 0x46, 0x4e, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x4e, 0x46, 0x79, 0x7f, 0x0f, 0x03, 0x03, 0x0d, 0x15, 0x08, 0x3f, 0x7e, 0x49, 0x27, 0x23, 0x07, 0x18, 0x34, 0x23, 0x2c, 0x16, 0x18, 0x47, 0x32, 0x24, 0x3a, 0x07, 0x14, 0x16, 0x14, 0x13, 0x07, 0x3a, 0x24, 0x32, 0x47, 0x18, 0x16, 0x2c, 0x23, 0x34, 0x18, 0x07, 0x23, 0x27, 0x49, 0x82, 0x3b, 0x06, 0x19, 0x0b, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x96, 0xff, 0xe3, 0x05, 0x73, 0x05, 0xf0, 0x00, 0x19, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x17, 0x16, 0x17, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x17, 0x16, 0x33, 0x32, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x0f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x26, 0x27, 0x26, 0x27, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x33, 0x32, 0x3f, 0x01, 0x26, 0x35, 0x34, 0x37, 0x27, 0x26, 0x23, 0x22, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x36, 0x37, 0x36, 0x03, 0x17, 0x26, 0x0f, 0x10, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0d, 0x10, 0x0f, 0x26, 0x0f, 0x11, 0x0c, 0x0e, 0x0d, 0x0d, 0x0e, 0x0c, 0x11, 0x50, 0x43, 0x28, 0x31, 0x32, 0x6c, 0x33, 0x30, 0x27, 0x45, 0x0f, 0x1c, 0x15, 0x09, 0x66, 0x3a, 0x23, 0x3d, 0x36, 0x2e, 0x14, 0x13, 0x40, 0x1b, 0x12, 0x04, 0x0d, 0x4e, 0x38, 0x45, 0x0a, 0x0a, 0x09, 0x76, 0x5a, 0x0b, 0x04, 0x05, 0x0b, 0x5c, 0x75, 0x0a, 0x09, 0x0a, 0x45, 0x38, 0x4e, 0x0d, 0x04, 0x12, 0x1b, 0x40, 0x13, 0x14, 0x2e, 0x36, 0x3d, 0x23, 0x3c, 0x63, 0x0d, 0x18, 0x16, 0x0f, 0x45, 0x27, 0x30, 0x33, 0x6c, 0x32, 0x31, 0x28, 0x45, 0x08, 0x07, 0x1a, 0x15, 0x0d, 0x63, 0x3c, 0x23, 0x3c, 0x36, 0x2f, 0x14, 0x13, 0x40, 0x1b, 0x12, 0x05, 0x0c, 0x4f, 0x38, 0x44, 0x0b, 0x0a, 0x09, 0x76, 0x5a, 0x0b, 0x04, 0x03, 0x0a, 0x5a, 0x76, 0x09, 0x0a, 0x0b, 0x44, 0x38, 0x4f, 0x0c, 0x05, 0x12, 0x1b, 0x40, 0x13, 0x14, 0x2f, 0x36, 0x3c, 0x23, 0x3e, 0x61, 0x0a, 0x18, 0x1a, 0x07, 0x03, 0x50, 0x08, 0x08, 0x0e, 0x0f, 0x23, 0x15, 0x14, 0x23, 0x0f, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x0f, 0x23, 0x14, 0x15, 0x23, 0x0f, 0x0e, 0x08, 0x4c, 0x0c, 0x80, 0x77, 0x46, 0x4e, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x4e, 0x46, 0x79, 0x7e, 0x0c, 0x06, 0x0e, 0x17, 0x06, 0x44, 0x7a, 0x49, 0x27, 0x23, 0x07, 0x18, 0x34, 0x23, 0x2c, 0x16, 0x18, 0x47, 0x32, 0x24, 0x3a, 0x07, 0x13, 0x14, 0x15, 0x14, 0x07, 0x3b, 0x24, 0x32, 0x47, 0x18, 0x16, 0x2c, 0x23, 0x34, 0x18, 0x07, 0x23, 0x27, 0x49, 0x7e, 0x3f, 0x08, 0x19, 0x09, 0x06, 0x0f, 0x7f, 0x79, 0x46, 0x4e, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x4e, 0x46, 0x79, 0x7f, 0x0f, 0x03, 0x03, 0x0d, 0x15, 0x08, 0x3f, 0x7e, 0x49, 0x27, 0x23, 0x07, 0x18, 0x34, 0x23, 0x2c, 0x16, 0x18, 0x47, 0x32, 0x24, 0x3a, 0x07, 0x14, 0x16, 0x14, 0x13, 0x07, 0x3a, 0x24, 0x32, 0x47, 0x18, 0x16, 0x2c, 0x23, 0x34, 0x18, 0x07, 0x23, 0x27, 0x49, 0x82, 0x3b, 0x06, 0x19, 0x0b, 0x03, 0x00, 0x01, 0x00, 0x90, 0xff, 0xe3, 0x05, 0x77, 0x05, 0xf0, 0x00, 0x68, 0x00, 0x00, 0x01, 0x17, 0x32, 0x3f, 0x01, 0x27, 0x26, 0x23, 0x07, 0x22, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x35, 0x34, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x23, 0x27, 0x22, 0x0f, 0x01, 0x17, 0x16, 0x33, 0x37, 0x32, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x01, 0x89, 0x8f, 0x49, 0x1e, 0x2a, 0x2a, 0x1c, 0x4d, 0x87, 0x51, 0x92, 0x10, 0x0a, 0x16, 0x26, 0x63, 0x12, 0x46, 0x8a, 0x27, 0x40, 0x32, 0x2b, 0x5f, 0x3a, 0x31, 0x4a, 0x97, 0x4a, 0x30, 0x39, 0x60, 0x2b, 0x2b, 0x48, 0x2c, 0x84, 0x46, 0x12, 0xa0, 0x0a, 0x11, 0x91, 0x4c, 0x8e, 0x48, 0x20, 0x2b, 0x2b, 0x1c, 0x4e, 0x87, 0x51, 0x91, 0x11, 0x0a, 0x17, 0x28, 0x61, 0x13, 0x47, 0x39, 0x4f, 0x26, 0x40, 0x33, 0x2b, 0x60, 0x39, 0x30, 0x4a, 0x9b, 0x46, 0x31, 0x3a, 0x5f, 0x2b, 0x2e, 0x44, 0x2b, 0x86, 0x46, 0x12, 0xa0, 0x0b, 0x11, 0x91, 0x02, 0xc4, 0x0a, 0x14, 0x1c, 0x1b, 0x12, 0x07, 0x5d, 0x48, 0x2c, 0x60, 0x2c, 0x48, 0x20, 0x06, 0x59, 0x63, 0xa2, 0x21, 0x1c, 0x37, 0x37, 0x99, 0x5c, 0xca, 0x34, 0x4f, 0x4f, 0x34, 0xd0, 0x56, 0x8f, 0x41, 0x37, 0x1c, 0x1c, 0xa7, 0x67, 0x55, 0x06, 0x33, 0x9a, 0x27, 0x2c, 0x48, 0x5e, 0x0a, 0x14, 0x1b, 0x1c, 0x12, 0x07, 0x5d, 0x48, 0x2c, 0x60, 0x2c, 0x4c, 0x1c, 0x06, 0x26, 0x33, 0x63, 0xa2, 0x21, 0x1c, 0x37, 0x37, 0x99, 0x5c, 0xca, 0x34, 0x4f, 0x4f, 0x37, 0xcd, 0x56, 0x8f, 0x41, 0x37, 0x1c, 0x1e, 0xa5, 0x66, 0x56, 0x06, 0x34, 0x9a, 0x26, 0x2c, 0x48, 0x5e, 0x00, 0x04, 0x00, 0x90, 0xff, 0xe3, 0x05, 0x77, 0x05, 0xf0, 0x00, 0x0e, 0x00, 0x99, 0x00, 0xb1, 0x00, 0xc9, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x13, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x25, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x03, 0x04, 0x19, 0x33, 0x21, 0x1b, 0x2c, 0x4c, 0x2c, 0x1b, 0x22, 0x32, 0x97, 0x10, 0x30, 0x5b, 0x1d, 0x21, 0x10, 0x0f, 0x51, 0x3f, 0x52, 0x11, 0x0a, 0x17, 0x27, 0x62, 0x12, 0x13, 0x33, 0x3b, 0x4b, 0x2a, 0x39, 0x43, 0x10, 0x4e, 0x39, 0x30, 0x4a, 0x4c, 0x4f, 0x46, 0x31, 0x3a, 0x4d, 0x10, 0x40, 0x3b, 0x2c, 0x49, 0x3c, 0x32, 0x14, 0x12, 0x63, 0x26, 0x16, 0x0a, 0x10, 0x53, 0x3f, 0x51, 0x0e, 0x10, 0x22, 0x1c, 0x5b, 0x30, 0x10, 0x10, 0x2e, 0x5b, 0x1d, 0x23, 0x10, 0x0e, 0x51, 0x3f, 0x51, 0x12, 0x0b, 0x17, 0x26, 0x63, 0x12, 0x14, 0x32, 0x3c, 0x4a, 0x2b, 0x38, 0x43, 0x10, 0x4d, 0x3a, 0x31, 0x4a, 0x97, 0x4a, 0x30, 0x39, 0x4e, 0x10, 0x40, 0x3c, 0x2c, 0x49, 0x3b, 0x33, 0x13, 0x12, 0x62, 0x27, 0x17, 0x0a, 0x11, 0x52, 0x3f, 0x51, 0x0f, 0x10, 0x22, 0x1e, 0x5b, 0x2e, 0xfe, 0xbc, 0x3d, 0x3a, 0x1b, 0x1a, 0x08, 0x0a, 0x2f, 0x36, 0x35, 0x07, 0x04, 0x0c, 0x13, 0x37, 0x09, 0x0b, 0x1c, 0x27, 0x3f, 0x16, 0x21, 0x01, 0xac, 0x41, 0x20, 0x17, 0x3f, 0x26, 0x1c, 0x0b, 0x09, 0x38, 0x13, 0x0c, 0x05, 0x06, 0x35, 0x36, 0x30, 0x09, 0x08, 0x1a, 0x1b, 0x3b, 0x03, 0xd3, 0x63, 0x4a, 0x32, 0x51, 0x44, 0x1a, 0x2b, 0x2b, 0x1a, 0x44, 0x51, 0x32, 0x4a, 0xfe, 0xb4, 0x0b, 0x20, 0x03, 0x01, 0x28, 0x35, 0x48, 0x2c, 0x27, 0x39, 0x2c, 0x4a, 0x1e, 0x06, 0x26, 0x30, 0x66, 0x89, 0x29, 0x0a, 0x14, 0x54, 0x7c, 0x5c, 0x60, 0x6a, 0x34, 0x4f, 0x4f, 0x37, 0x67, 0x60, 0x5c, 0x7c, 0x54, 0x14, 0x0a, 0x27, 0x8b, 0x67, 0x2f, 0x26, 0x06, 0x20, 0x48, 0x2c, 0x39, 0x27, 0x2c, 0x49, 0x34, 0x28, 0x01, 0x03, 0x20, 0x0b, 0x0b, 0x1f, 0x03, 0x01, 0x28, 0x33, 0x4a, 0x2c, 0x26, 0x39, 0x2d, 0x48, 0x20, 0x06, 0x26, 0x30, 0x66, 0x89, 0x29, 0x0a, 0x14, 0x54, 0x7c, 0x5c, 0x60, 0x6a, 0x34, 0x4f, 0x4f, 0x34, 0x6a, 0x60, 0x5c, 0x7c, 0x54, 0x14, 0x0a, 0x27, 0x8b, 0x67, 0x2f, 0x26, 0x06, 0x1e, 0x4a, 0x2c, 0x39, 0x27, 0x2c, 0x48, 0x35, 0x28, 0x01, 0x03, 0x1f, 0x80, 0x12, 0x04, 0x01, 0x22, 0x22, 0x27, 0x18, 0x15, 0x21, 0x17, 0x24, 0x15, 0x04, 0x19, 0x28, 0x3a, 0x55, 0x4a, 0x4a, 0x55, 0x3a, 0x28, 0x19, 0x04, 0x15, 0x24, 0x17, 0x21, 0x15, 0x18, 0x27, 0x22, 0x22, 0x01, 0x04, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x05, 0xa6, 0x05, 0xad, 0x00, 0x19, 0x00, 0x77, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x03, 0x45, 0x82, 0x37, 0x37, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x2e, 0x37, 0x37, 0x82, 0x37, 0x38, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x38, 0x6c, 0x38, 0x21, 0x32, 0x30, 0x31, 0x31, 0x2b, 0x29, 0x25, 0x27, 0x24, 0x28, 0x21, 0x33, 0x2a, 0x52, 0x18, 0x2b, 0x1e, 0x28, 0x24, 0x28, 0x24, 0x29, 0x2b, 0x2d, 0x6d, 0x2a, 0x33, 0x21, 0x2b, 0x1a, 0x05, 0x04, 0x22, 0x24, 0x29, 0x2b, 0x2d, 0x6d, 0x2a, 0x33, 0x21, 0x29, 0x24, 0x2a, 0x23, 0x22, 0x20, 0x14, 0x4e, 0x2b, 0x34, 0x1f, 0x29, 0x24, 0x28, 0x25, 0x28, 0x2b, 0x2d, 0x35, 0x38, 0x2a, 0x35, 0x25, 0x07, 0x18, 0x28, 0x24, 0x29, 0x2b, 0x2d, 0x35, 0x38, 0x2a, 0x33, 0x21, 0x28, 0x24, 0x18, 0x04, 0x0b, 0x1a, 0x1c, 0x30, 0x36, 0x7b, 0x49, 0x46, 0x7b, 0x36, 0x30, 0x1c, 0x1a, 0x1a, 0x1c, 0x30, 0x36, 0x7b, 0x46, 0x49, 0x7b, 0x36, 0x30, 0x1c, 0x13, 0x35, 0x10, 0x17, 0x17, 0x14, 0x2b, 0x27, 0x67, 0x3e, 0x3a, 0x63, 0x2e, 0x26, 0x19, 0x15, 0x05, 0x17, 0x22, 0x2e, 0x63, 0x3b, 0x3d, 0x67, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x26, 0x31, 0x4e, 0x25, 0x26, 0x57, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x26, 0x2e, 0x63, 0x3a, 0x3e, 0x6b, 0x23, 0x22, 0x15, 0x04, 0x15, 0x1b, 0x24, 0x2e, 0x63, 0x3a, 0x3e, 0x67, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x2c, 0x0e, 0x42, 0x3a, 0x3e, 0x67, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x26, 0x2e, 0x63, 0x3b, 0x3d, 0x3f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x63, 0x00, 0x00, 0x05, 0xa6, 0x05, 0xad, 0x00, 0x5c, 0x00, 0x76, 0x00, 0x8d, 0x00, 0xa6, 0x00, 0xbd, 0x00, 0xd6, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x02, 0x32, 0x17, 0x16, 0x17, 0x37, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x1f, 0x01, 0x36, 0x37, 0x13, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x03, 0x26, 0x35, 0x34, 0x36, 0x37, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x01, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x13, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x03, 0x04, 0x04, 0x1a, 0x2c, 0x21, 0x32, 0x2b, 0x6c, 0x2e, 0x2b, 0x28, 0x25, 0x28, 0x24, 0x29, 0x1d, 0x2c, 0x19, 0x51, 0x2b, 0x32, 0x21, 0x29, 0x24, 0x28, 0x25, 0x2b, 0x28, 0x36, 0x2c, 0x35, 0x2d, 0x22, 0x37, 0x06, 0x18, 0x24, 0x28, 0x22, 0x32, 0x2a, 0x70, 0x2a, 0x33, 0x21, 0x28, 0x24, 0x18, 0x06, 0x38, 0x21, 0x32, 0x30, 0x31, 0x31, 0x2b, 0x29, 0x25, 0x27, 0x24, 0x28, 0x21, 0x33, 0x2a, 0x52, 0x18, 0x2b, 0x1e, 0x28, 0x24, 0x28, 0x24, 0x29, 0x2b, 0x2d, 0x6d, 0x2a, 0x33, 0x21, 0x2b, 0x1a, 0x46, 0x82, 0x37, 0x07, 0x06, 0x0d, 0x0c, 0x17, 0x18, 0x17, 0x1c, 0x1b, 0x41, 0x1b, 0x1d, 0x16, 0x19, 0x16, 0x02, 0x16, 0x06, 0x07, 0x3d, 0x20, 0x1d, 0x3b, 0x2a, 0x1b, 0x18, 0x5d, 0x16, 0x19, 0x16, 0x19, 0x16, 0x1d, 0x1b, 0x41, 0x1b, 0x1d, 0x16, 0x16, 0x03, 0xc0, 0x03, 0x2a, 0x26, 0x6c, 0x07, 0x06, 0x20, 0x1c, 0x20, 0x1b, 0x1d, 0x16, 0x16, 0x19, 0x16, 0x19, 0x16, 0x1d, 0x13, 0x03, 0x02, 0x00, 0x1f, 0x20, 0x15, 0x17, 0x1d, 0x1a, 0x41, 0x1b, 0x1d, 0x17, 0x18, 0x16, 0x19, 0x15, 0x5d, 0x18, 0x1b, 0x2b, 0x3b, 0x1d, 0xdd, 0x48, 0x48, 0x12, 0x1d, 0x17, 0x18, 0x17, 0x1a, 0x15, 0x17, 0x1d, 0x1a, 0x21, 0x1c, 0x1f, 0x07, 0x07, 0x6c, 0x26, 0x2a, 0xf8, 0x25, 0x4e, 0x31, 0x26, 0x19, 0x15, 0x15, 0x14, 0x2b, 0x27, 0x67, 0x3d, 0x3b, 0x63, 0x2e, 0x22, 0x17, 0x05, 0x15, 0x19, 0x26, 0x2e, 0x63, 0x3a, 0x3e, 0x67, 0x27, 0x2e, 0x11, 0x17, 0x17, 0x10, 0x35, 0x0d, 0x3f, 0x3d, 0x3b, 0x63, 0x2e, 0x26, 0x19, 0x15, 0x15, 0x19, 0x26, 0x2e, 0x63, 0x3b, 0x3d, 0x3f, 0x0d, 0x35, 0x10, 0x17, 0x17, 0x14, 0x2b, 0x27, 0x67, 0x3e, 0x3a, 0x63, 0x2e, 0x26, 0x19, 0x15, 0x05, 0x17, 0x22, 0x2e, 0x63, 0x3b, 0x3d, 0x67, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x26, 0x31, 0x4e, 0x03, 0x38, 0x1a, 0x03, 0x04, 0x47, 0x47, 0x14, 0x24, 0x3e, 0x1b, 0x18, 0x0e, 0x0d, 0x0d, 0x0e, 0x18, 0x1b, 0x3e, 0x24, 0x14, 0x0c, 0x82, 0x04, 0x03, 0xfd, 0x63, 0x06, 0x0e, 0x1e, 0x2e, 0x1e, 0x2c, 0x62, 0x17, 0x42, 0x24, 0x23, 0x3e, 0x1b, 0x18, 0x0e, 0x0d, 0x0d, 0x0e, 0x18, 0x18, 0x09, 0x01, 0xba, 0x16, 0x17, 0x49, 0x72, 0x30, 0x43, 0x04, 0x03, 0x0d, 0x0d, 0x0e, 0x18, 0x18, 0x3e, 0x27, 0x23, 0x3e, 0x1b, 0x18, 0x0e, 0x09, 0xfe, 0xc2, 0x4c, 0x4d, 0x18, 0x18, 0x0e, 0x0d, 0x0d, 0x0e, 0x18, 0x1b, 0x3e, 0x23, 0x24, 0x42, 0x17, 0x62, 0x2c, 0x1e, 0x2e, 0x1e, 0x0e, 0x01, 0x24, 0x0a, 0x0a, 0x09, 0x0e, 0x18, 0x1b, 0x3e, 0x23, 0x27, 0x3e, 0x18, 0x18, 0x0e, 0x0d, 0x0d, 0x03, 0x04, 0x43, 0x30, 0x72, 0x49, 0x17, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x29, 0x00, 0x54, 0x00, 0xbd, 0x00, 0xe6, 0x01, 0x11, 0x01, 0x3a, 0x01, 0x65, 0x01, 0x7f, 0x01, 0xa9, 0x01, 0xd3, 0x00, 0x00, 0x01, 0x26, 0x27, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x36, 0x37, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x25, 0x06, 0x07, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x17, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x23, 0x01, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x34, 0x36, 0x37, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x01, 0x26, 0x27, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x16, 0x17, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x01, 0x16, 0x17, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x16, 0x17, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x37, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x03, 0x06, 0x07, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x17, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x2e, 0x01, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x34, 0x26, 0x27, 0x26, 0x27, 0x01, 0x36, 0x37, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x14, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x36, 0x37, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x1e, 0x01, 0x17, 0x16, 0x17, 0x04, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x13, 0x06, 0x07, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x26, 0x27, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x03, 0x16, 0x17, 0x37, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x1f, 0x01, 0x36, 0x37, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x02, 0x01, 0x05, 0x02, 0xcd, 0x10, 0x08, 0x09, 0x17, 0x09, 0x07, 0x06, 0x03, 0x03, 0x06, 0x07, 0x09, 0x15, 0x0b, 0x08, 0x10, 0xcd, 0x02, 0x05, 0xb9, 0x21, 0x12, 0x19, 0x2f, 0x14, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x14, 0x2f, 0x19, 0x12, 0x21, 0x02, 0xca, 0x02, 0x05, 0x6b, 0x6b, 0x10, 0x1b, 0x2f, 0x14, 0x12, 0x0b, 0x09, 0x09, 0x0b, 0x12, 0x14, 0x2f, 0x1b, 0x10, 0x08, 0xce, 0x05, 0x02, 0x6d, 0x6c, 0x06, 0x0f, 0x14, 0x09, 0x07, 0x05, 0x04, 0x04, 0x05, 0x07, 0x0b, 0x16, 0x0b, 0x06, 0x04, 0xfc, 0x35, 0x21, 0x1f, 0x10, 0x0e, 0x1d, 0x1e, 0x24, 0x25, 0x28, 0x27, 0x4c, 0x21, 0x1e, 0x1e, 0x1d, 0x24, 0x24, 0x53, 0x24, 0x24, 0x1c, 0x1e, 0x1f, 0x22, 0x4b, 0x26, 0x29, 0x25, 0x24, 0x1d, 0x1a, 0x12, 0x0f, 0x1d, 0x23, 0x32, 0x45, 0x1e, 0x20, 0x0d, 0x0f, 0x0f, 0x10, 0x1d, 0x19, 0x4d, 0x2d, 0x21, 0x1d, 0x0f, 0x0f, 0x3a, 0x24, 0x25, 0x29, 0x29, 0x4a, 0x20, 0x1f, 0x1e, 0x1c, 0x24, 0x24, 0x53, 0x24, 0x24, 0x1d, 0x1e, 0x1e, 0x24, 0x47, 0x29, 0x28, 0x25, 0x24, 0x3b, 0x0e, 0x10, 0x1f, 0x20, 0x2d, 0x48, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x10, 0x1d, 0x1f, 0x45, 0x01, 0x94, 0x12, 0x0e, 0x80, 0x0a, 0x05, 0x07, 0x16, 0x0d, 0x0c, 0x0a, 0x0a, 0x11, 0x05, 0x04, 0x09, 0x08, 0x05, 0x0d, 0xa2, 0x0d, 0x0a, 0xa5, 0x1e, 0x0d, 0x13, 0x13, 0x01, 0x09, 0x09, 0x26, 0x2f, 0x1a, 0x1d, 0x2d, 0x13, 0x0c, 0x11, 0x01, 0xba, 0x0e, 0x09, 0x60, 0x61, 0x0b, 0x14, 0x13, 0x01, 0x09, 0x09, 0x13, 0x13, 0x2f, 0x1a, 0x1c, 0x2e, 0x13, 0x0c, 0x05, 0x69, 0x12, 0x0f, 0x44, 0x44, 0x04, 0x09, 0x15, 0x0c, 0x0c, 0x0a, 0x0b, 0x09, 0x08, 0x04, 0x04, 0x01, 0x01, 0x0a, 0x07, 0x05, 0x03, 0x95, 0x0a, 0x0c, 0xa2, 0x0c, 0x06, 0x06, 0x0a, 0x01, 0x01, 0x04, 0x04, 0x11, 0x0b, 0x0a, 0x0c, 0x0c, 0x15, 0x08, 0x05, 0x0a, 0x80, 0x10, 0x11, 0x5f, 0x11, 0x0d, 0x12, 0x2e, 0x1c, 0x1a, 0x2f, 0x26, 0x09, 0x09, 0x01, 0x13, 0x13, 0x0c, 0x1e, 0xfd, 0xc8, 0x10, 0x11, 0x37, 0x37, 0x0b, 0x14, 0x2d, 0x1d, 0x1a, 0x2f, 0x13, 0x13, 0x09, 0x09, 0x01, 0x13, 0x14, 0x0c, 0x08, 0xb9, 0x09, 0x0d, 0x56, 0x56, 0x04, 0x09, 0x09, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0a, 0x0c, 0x0f, 0x14, 0x07, 0x05, 0x02, 0x01, 0x52, 0x4a, 0x1f, 0x21, 0x1a, 0x1a, 0x1b, 0x1b, 0x1a, 0x1a, 0x21, 0x1f, 0x4a, 0x20, 0x20, 0x1a, 0x1a, 0x1b, 0x1b, 0x1a, 0x1a, 0x20, 0x02, 0x13, 0x13, 0x18, 0x02, 0x09, 0x08, 0x09, 0x0a, 0x0b, 0x18, 0x0a, 0x0a, 0x09, 0x08, 0x09, 0x02, 0x18, 0x14, 0x13, 0x32, 0x09, 0x13, 0x13, 0x13, 0x18, 0x16, 0x36, 0x17, 0x17, 0x13, 0x14, 0x13, 0x09, 0x59, 0x14, 0x13, 0x1d, 0x1e, 0x13, 0x14, 0x13, 0x17, 0x17, 0x36, 0x16, 0x18, 0x13, 0x13, 0x13, 0x02, 0x38, 0x14, 0x14, 0x0d, 0x0d, 0x09, 0x08, 0x09, 0x0a, 0x0a, 0x18, 0x0b, 0x0a, 0x09, 0x0a, 0x07, 0x01, 0x02, 0x9a, 0x16, 0x16, 0x1c, 0x02, 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x1a, 0x0c, 0x0c, 0x0a, 0x08, 0x0a, 0x02, 0x1a, 0x16, 0x14, 0x38, 0x0a, 0x14, 0x16, 0x16, 0x1a, 0x18, 0x3c, 0x1a, 0x1a, 0x14, 0x16, 0x16, 0x0a, 0x64, 0x18, 0x14, 0x21, 0x21, 0x16, 0x16, 0x14, 0x1a, 0x1a, 0x3c, 0x18, 0x1a, 0x16, 0x16, 0x14, 0x02, 0x3e, 0x17, 0x15, 0x0e, 0x0e, 0x0a, 0x08, 0x0a, 0x0c, 0x0c, 0x0c, 0x0e, 0x0c, 0x0a, 0x0a, 0x0c, 0x08, 0x01, 0x22, 0x25, 0x55, 0x56, 0x2a, 0x29, 0x20, 0x21, 0x10, 0x10, 0x21, 0x24, 0x33, 0x52, 0x20, 0x1f, 0x12, 0x11, 0x11, 0x12, 0x1f, 0x20, 0x52, 0x33, 0x26, 0x1f, 0x10, 0x10, 0x21, 0x1c, 0x2d, 0x28, 0x2d, 0x25, 0x5a, 0x26, 0x20, 0x22, 0x23, 0x25, 0x28, 0x2e, 0x32, 0x24, 0x28, 0x20, 0x1e, 0x26, 0x26, 0x53, 0x2b, 0x2c, 0x29, 0x29, 0x41, 0x10, 0x10, 0x21, 0x24, 0x33, 0x52, 0x20, 0x1f, 0x12, 0x11, 0x11, 0x12, 0x1f, 0x20, 0x52, 0x33, 0x27, 0x1e, 0x10, 0x10, 0x41, 0x29, 0x29, 0x58, 0x54, 0x24, 0x22, 0x22, 0x23, 0x25, 0x28, 0x60, 0x24, 0x28, 0x20, 0x22, 0x20, 0xfe, 0x1c, 0x0b, 0x0d, 0xb4, 0x0d, 0x06, 0x08, 0x0a, 0x01, 0x01, 0x04, 0x05, 0x12, 0x0c, 0x0c, 0x0d, 0x0d, 0x18, 0x09, 0x06, 0x0a, 0x8e, 0x11, 0x13, 0x69, 0x13, 0x0e, 0x14, 0x33, 0x1f, 0x1d, 0x1b, 0x19, 0x2b, 0x14, 0x15, 0x14, 0x0e, 0x21, 0x02, 0x78, 0x12, 0x13, 0x3d, 0x3d, 0x0d, 0x15, 0x33, 0x1f, 0x1d, 0x1b, 0x19, 0x16, 0x15, 0x14, 0x15, 0x15, 0x0d, 0x09, 0xcd, 0x0c, 0x0e, 0x5f, 0x60, 0x05, 0x0b, 0x08, 0x01, 0x01, 0x04, 0x05, 0x09, 0x09, 0x0c, 0x0c, 0x0d, 0x10, 0x16, 0x09, 0x05, 0x02, 0xfe, 0x1d, 0x13, 0x11, 0x8e, 0x0a, 0x06, 0x08, 0x19, 0x0d, 0x0d, 0x0c, 0x0c, 0x12, 0x05, 0x04, 0x01, 0x01, 0x09, 0x09, 0x06, 0x0d, 0xb4, 0x0e, 0x0a, 0xb9, 0x21, 0x0e, 0x14, 0x15, 0x14, 0x2b, 0x19, 0x1b, 0x1d, 0x1f, 0x33, 0x14, 0x0e, 0x13, 0x01, 0xeb, 0x0f, 0x0b, 0x6b, 0x6b, 0x0d, 0x15, 0x15, 0x14, 0x15, 0x16, 0x19, 0x1b, 0x1d, 0x1f, 0x33, 0x15, 0x0d, 0x05, 0x75, 0x13, 0x12, 0x4b, 0x4a, 0x05, 0x0b, 0x17, 0x0d, 0x0d, 0x0c, 0x0c, 0x09, 0x09, 0x05, 0x04, 0x01, 0x01, 0x0a, 0x09, 0x05, 0x03, 0xdf, 0x0f, 0x10, 0x1c, 0x1f, 0x46, 0x29, 0x28, 0x47, 0x1e, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x46, 0x1f, 0x1c, 0x10, 0xfe, 0x24, 0x06, 0x02, 0xe4, 0x11, 0x08, 0x0b, 0x19, 0x0a, 0x09, 0x05, 0x05, 0x05, 0x05, 0x09, 0x0a, 0x17, 0x0d, 0x08, 0x11, 0xe4, 0x02, 0x06, 0xcd, 0x25, 0x13, 0x1d, 0x33, 0x16, 0x14, 0x0c, 0x0b, 0x0b, 0x0c, 0x14, 0x16, 0x33, 0x1d, 0x13, 0x25, 0x03, 0x1a, 0x02, 0x06, 0x77, 0x77, 0x12, 0x1e, 0x33, 0x16, 0x14, 0x0c, 0x0b, 0x0b, 0x0c, 0x14, 0x16, 0x33, 0x1e, 0x12, 0x09, 0xe5, 0x06, 0x02, 0x78, 0x79, 0x07, 0x0f, 0x16, 0x0a, 0x09, 0x05, 0x05, 0x05, 0x05, 0x09, 0x0c, 0x17, 0x0c, 0x07, 0x05, 0x00, 0x04, 0x00, 0x4d, 0xff, 0xe3, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x19, 0x00, 0x33, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x36, 0x17, 0x03, 0x25, 0x13, 0x0d, 0x01, 0x03, 0x25, 0x1b, 0x01, 0x05, 0x03, 0x2d, 0x01, 0x13, 0x05, 0x03, 0x3b, 0x6e, 0x2e, 0x2f, 0x27, 0x27, 0x26, 0x26, 0x27, 0x27, 0x2f, 0x2e, 0x6e, 0x2e, 0x30, 0x26, 0x27, 0x27, 0x27, 0x27, 0x26, 0x30, 0x65, 0x4e, 0x3e, 0x45, 0x31, 0x33, 0x39, 0x37, 0x35, 0x34, 0x42, 0x41, 0x99, 0x3d, 0x46, 0x30, 0x33, 0x39, 0x37, 0x35, 0x33, 0x43, 0x41, 0x4a, 0x8b, 0x80, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x63, 0x7d, 0x7f, 0xfe, 0xea, 0x80, 0x79, 0x67, 0x65, 0x68, 0x63, 0x6a, 0x61, 0x7f, 0x7e, 0x8c, 0x8d, 0xfe, 0xa5, 0x93, 0xfe, 0xa4, 0x01, 0x5c, 0x93, 0x01, 0x5b, 0x8d, 0x8e, 0x01, 0x5a, 0x93, 0x01, 0x5d, 0xfe, 0xa3, 0x93, 0xfe, 0xa6, 0x04, 0x13, 0x16, 0x18, 0x28, 0x2e, 0x68, 0x3c, 0x3b, 0x68, 0x2e, 0x28, 0x18, 0x16, 0x16, 0x18, 0x28, 0x2e, 0x68, 0x3b, 0x3c, 0x68, 0x2e, 0x28, 0x18, 0x86, 0x1f, 0x22, 0x36, 0x38, 0x96, 0x54, 0x4e, 0x96, 0x3b, 0x39, 0x1f, 0x1f, 0x1f, 0x22, 0x36, 0x38, 0x96, 0xa2, 0x96, 0x3b, 0x39, 0x1f, 0x1f, 0x01, 0x6d, 0x3b, 0x38, 0x72, 0x6f, 0xfe, 0xec, 0xa1, 0x98, 0xfe, 0xf0, 0x77, 0x70, 0x3a, 0x3b, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0x9c, 0x9d, 0x01, 0x10, 0x77, 0x6e, 0x3c, 0x3b, 0x08, 0xfe, 0x7d, 0xa3, 0xfe, 0x7f, 0x9e, 0x9d, 0xfe, 0x7f, 0xa3, 0xfe, 0x7d, 0x01, 0x83, 0xa3, 0x01, 0x81, 0x9d, 0x9e, 0x01, 0x81, 0xa3, 0x00, 0x00, 0x07, 0x00, 0x90, 0xff, 0xe3, 0x05, 0x77, 0x05, 0xf0, 0x00, 0x08, 0x00, 0x93, 0x00, 0x9c, 0x00, 0xa7, 0x00, 0xb2, 0x00, 0xc1, 0x00, 0xd0, 0x00, 0x00, 0x01, 0x11, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x13, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x11, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x25, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x01, 0x05, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x13, 0x25, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x0d, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x03, 0x04, 0x26, 0x2c, 0x1b, 0x22, 0x32, 0x97, 0x10, 0x30, 0x5b, 0x1d, 0x21, 0x10, 0x0f, 0x51, 0x3f, 0x52, 0x11, 0x0a, 0x17, 0x27, 0x62, 0x12, 0x13, 0x33, 0x3b, 0x4b, 0x2a, 0x39, 0x43, 0x10, 0x4e, 0x39, 0x30, 0x4a, 0x4c, 0x4f, 0x46, 0x31, 0x3a, 0x4d, 0x10, 0x40, 0x3b, 0x2c, 0x49, 0x3c, 0x32, 0x14, 0x12, 0x63, 0x26, 0x16, 0x0a, 0x10, 0x53, 0x3f, 0x51, 0x0e, 0x10, 0x22, 0x1c, 0x5b, 0x30, 0x10, 0x10, 0x2e, 0x5b, 0x1d, 0x23, 0x10, 0x0e, 0x51, 0x3f, 0x51, 0x12, 0x0b, 0x17, 0x26, 0x63, 0x12, 0x14, 0x32, 0x3c, 0x4a, 0x2b, 0x38, 0x43, 0x10, 0x4d, 0x3a, 0x31, 0x4a, 0x97, 0x4a, 0x30, 0x39, 0x4e, 0x10, 0x40, 0x3c, 0x2c, 0x49, 0x3b, 0x33, 0x13, 0x12, 0x62, 0x27, 0x17, 0x0a, 0x11, 0x52, 0x3f, 0x51, 0x0f, 0x10, 0x22, 0x1e, 0x5b, 0x2e, 0x8e, 0x26, 0x2c, 0x1b, 0x21, 0x33, 0x9d, 0x01, 0x58, 0x13, 0x38, 0x09, 0x0b, 0x1c, 0x26, 0x3f, 0x17, 0x20, 0xfe, 0x53, 0xfe, 0xa9, 0x13, 0x37, 0x09, 0x0b, 0x1c, 0x27, 0x3f, 0x16, 0x21, 0x40, 0xfe, 0xa9, 0x0c, 0x04, 0x07, 0x35, 0x36, 0x2f, 0x0a, 0x08, 0x1a, 0x1b, 0x3a, 0x01, 0xa9, 0x01, 0x58, 0x0c, 0x05, 0x06, 0x35, 0x36, 0x30, 0x09, 0x08, 0x1a, 0x1b, 0x3b, 0x03, 0xd3, 0x01, 0xb9, 0x2b, 0x1a, 0x44, 0x51, 0x32, 0x4a, 0xfe, 0xb4, 0x0b, 0x20, 0x03, 0x01, 0x28, 0x35, 0x48, 0x2c, 0x27, 0x39, 0x2c, 0x4a, 0x1e, 0x06, 0x26, 0x30, 0x66, 0x89, 0x29, 0x0a, 0x14, 0x54, 0x7c, 0x5c, 0x60, 0x6a, 0x34, 0x4f, 0x4f, 0x37, 0x67, 0x60, 0x5c, 0x7c, 0x54, 0x14, 0x0a, 0x27, 0x8b, 0x67, 0x2f, 0x26, 0x06, 0x20, 0x48, 0x2c, 0x39, 0x27, 0x2c, 0x49, 0x34, 0x28, 0x01, 0x03, 0x20, 0x0b, 0x0b, 0x1f, 0x03, 0x01, 0x28, 0x33, 0x4a, 0x2c, 0x26, 0x39, 0x2d, 0x48, 0x20, 0x06, 0x26, 0x30, 0x66, 0x89, 0x29, 0x0a, 0x14, 0x54, 0x7c, 0x5c, 0x60, 0x6a, 0x34, 0x4f, 0x4f, 0x34, 0x6a, 0x60, 0x5c, 0x7c, 0x54, 0x14, 0x0a, 0x27, 0x8b, 0x67, 0x2f, 0x26, 0x06, 0x1e, 0x4a, 0x2c, 0x39, 0x27, 0x2c, 0x48, 0x35, 0x28, 0x01, 0x03, 0x1f, 0xf5, 0xfe, 0x47, 0x2b, 0x1a, 0x44, 0x51, 0x32, 0x4a, 0x01, 0xc1, 0xdd, 0x24, 0x15, 0x04, 0x19, 0x28, 0x3a, 0x55, 0xfe, 0xcd, 0xdd, 0x24, 0x15, 0x04, 0x19, 0x28, 0x3a, 0x55, 0x01, 0x33, 0xdd, 0x17, 0x21, 0x15, 0x18, 0x27, 0x22, 0x22, 0x01, 0x04, 0xfb, 0xdd, 0x17, 0x21, 0x15, 0x18, 0x27, 0x22, 0x22, 0x01, 0x04, 0x00, 0x01, 0x00, 0xa3, 0x00, 0x00, 0x05, 0x65, 0x05, 0xd5, 0x00, 0x41, 0x00, 0x00, 0x01, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x35, 0x33, 0x15, 0x17, 0x11, 0x27, 0x37, 0x17, 0x35, 0x33, 0x15, 0x37, 0x17, 0x07, 0x11, 0x37, 0x35, 0x33, 0x15, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x07, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x15, 0x23, 0x35, 0x27, 0x11, 0x17, 0x07, 0x27, 0x15, 0x23, 0x35, 0x07, 0x27, 0x37, 0x11, 0x07, 0x15, 0x23, 0x35, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x02, 0x98, 0xd8, 0xae, 0x36, 0x78, 0xb0, 0x36, 0xb0, 0x6c, 0xd8, 0xae, 0x36, 0x78, 0x6c, 0x79, 0x36, 0xaf, 0xd8, 0x6c, 0xb1, 0x36, 0xb1, 0x79, 0x36, 0xaf, 0xd8, 0xd8, 0xaf, 0x36, 0x79, 0xb1, 0x36, 0xb1, 0x6c, 0xd8, 0xaf, 0x36, 0x79, 0x6c, 0x78, 0x36, 0xae, 0xd8, 0x6c, 0xb0, 0x36, 0xb0, 0x78, 0x36, 0xae, 0x02, 0xeb, 0x8a, 0x70, 0x68, 0x4d, 0x72, 0x68, 0x72, 0x9b, 0xe0, 0x8b, 0x01, 0x16, 0x6f, 0x68, 0x4d, 0xe3, 0xe3, 0x4d, 0x68, 0x6f, 0xfe, 0xeb, 0x8a, 0xe0, 0x9b, 0x72, 0x68, 0x72, 0x4d, 0x68, 0x70, 0x8a, 0x8b, 0x70, 0x68, 0x4d, 0x72, 0x68, 0x72, 0x9b, 0xe0, 0x8b, 0xfe, 0xea, 0x6f, 0x68, 0x4d, 0xe3, 0xe3, 0x4d, 0x68, 0x6f, 0x01, 0x16, 0x8b, 0xe0, 0x9b, 0x72, 0x68, 0x72, 0x4d, 0x68, 0x70, 0x00, 0x07, 0x00, 0x8c, 0x00, 0x00, 0x05, 0x7c, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x01, 0x33, 0x11, 0x25, 0x11, 0x37, 0x17, 0x07, 0x0d, 0x01, 0x17, 0x07, 0x27, 0x11, 0x25, 0x11, 0x23, 0x11, 0x05, 0x11, 0x07, 0x27, 0x37, 0x2d, 0x01, 0x27, 0x37, 0x17, 0x11, 0x05, 0x07, 0x15, 0x17, 0x35, 0x25, 0x07, 0x15, 0x37, 0x05, 0x07, 0x17, 0x37, 0x25, 0x07, 0x17, 0x37, 0x05, 0x07, 0x15, 0x3f, 0x01, 0x15, 0x17, 0x35, 0x02, 0xce, 0x6c, 0x01, 0x06, 0xef, 0x36, 0xf0, 0x01, 0x07, 0xfe, 0xfa, 0xef, 0x36, 0xef, 0xfe, 0xfa, 0x6c, 0xfe, 0xfa, 0xee, 0x36, 0xee, 0xfe, 0xfa, 0x01, 0x07, 0xef, 0x36, 0xee, 0x01, 0x06, 0x9a, 0x9a, 0x01, 0x06, 0x9a, 0x9a, 0xfe, 0x2b, 0x9b, 0x9a, 0x9a, 0x01, 0x71, 0x99, 0x9a, 0x9a, 0xfe, 0x2a, 0x9a, 0x9a, 0x6c, 0x9a, 0x05, 0xd5, 0xfe, 0xcc, 0xa9, 0xfe, 0xb0, 0x9a, 0x68, 0x9a, 0xa8, 0xa8, 0x99, 0x68, 0x9a, 0xfe, 0xaf, 0xa9, 0xfe, 0xcd, 0x01, 0x33, 0xa9, 0x01, 0x51, 0x9a, 0x68, 0x99, 0xa8, 0xa8, 0x9a, 0x68, 0x9a, 0x01, 0x50, 0xa9, 0x27, 0xc5, 0x63, 0xc5, 0x63, 0x63, 0xc5, 0x63, 0x68, 0x63, 0x62, 0x62, 0x63, 0x63, 0x62, 0x62, 0x67, 0x63, 0xc6, 0x63, 0xc6, 0xc6, 0x63, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x75, 0x00, 0x04, 0x05, 0x92, 0x05, 0xd5, 0x00, 0x41, 0x00, 0x00, 0x01, 0x33, 0x15, 0x37, 0x17, 0x07, 0x11, 0x37, 0x11, 0x33, 0x15, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x07, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x15, 0x23, 0x11, 0x27, 0x11, 0x17, 0x07, 0x27, 0x15, 0x23, 0x35, 0x07, 0x27, 0x37, 0x11, 0x07, 0x11, 0x23, 0x35, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x35, 0x33, 0x11, 0x17, 0x11, 0x27, 0x37, 0x17, 0x02, 0xce, 0x6c, 0x7e, 0x5a, 0xd8, 0xf1, 0xb4, 0x50, 0x36, 0x52, 0x7e, 0x5a, 0xd8, 0xf0, 0xf1, 0xd8, 0x5a, 0x7e, 0x50, 0x36, 0x53, 0xb4, 0xed, 0xd8, 0x5a, 0x7e, 0x6c, 0x7e, 0x5a, 0xd8, 0xee, 0xb4, 0x52, 0x36, 0x4f, 0x7e, 0x5a, 0xd8, 0xf0, 0xee, 0xd8, 0x5a, 0x7e, 0x53, 0x36, 0x50, 0xb4, 0xf2, 0xd8, 0x5a, 0x7e, 0x05, 0xd5, 0x68, 0x51, 0xad, 0x8b, 0xfe, 0xce, 0x9b, 0x01, 0x15, 0xa2, 0x34, 0x68, 0x35, 0x51, 0xad, 0x8a, 0x99, 0x9b, 0x8b, 0xad, 0x51, 0x34, 0x68, 0x35, 0xa1, 0x01, 0x15, 0x98, 0xfe, 0xd0, 0x8b, 0xad, 0x51, 0x68, 0x65, 0x51, 0xad, 0x8b, 0x01, 0x35, 0x99, 0xfe, 0xeb, 0xa1, 0x35, 0x68, 0x33, 0x51, 0xae, 0x8b, 0x9a, 0x99, 0x8b, 0xad, 0x51, 0x35, 0x68, 0x33, 0xa1, 0xfe, 0xeb, 0x9b, 0x01, 0x36, 0x8b, 0xad, 0x51, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0xff, 0xe5, 0x05, 0x78, 0x05, 0xf0, 0x00, 0x87, 0x00, 0x00, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x27, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x22, 0x2e, 0x01, 0x34, 0x36, 0x37, 0x36, 0x37, 0x11, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x37, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x17, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x36, 0x37, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x05, 0x5f, 0x19, 0x19, 0x18, 0x29, 0x2b, 0x2f, 0x31, 0x29, 0x12, 0x0f, 0xd9, 0xd9, 0x0f, 0x12, 0x29, 0x31, 0x2f, 0x2b, 0x29, 0x18, 0x19, 0x19, 0x19, 0x28, 0x2b, 0x2f, 0x2e, 0x2c, 0x2b, 0x18, 0x17, 0x03, 0xd9, 0x13, 0x11, 0x2a, 0x30, 0x30, 0x53, 0x61, 0x53, 0x31, 0x31, 0x29, 0x11, 0x13, 0xd9, 0x04, 0x17, 0x19, 0x2a, 0x2a, 0x30, 0x31, 0x29, 0x29, 0x19, 0x18, 0x18, 0x19, 0x29, 0x2a, 0x60, 0x2a, 0x11, 0x0f, 0xd9, 0xd9, 0x0e, 0x12, 0x2c, 0x2e, 0x31, 0x52, 0x31, 0x18, 0x19, 0x29, 0x2a, 0x30, 0x2e, 0x2c, 0x2a, 0x19, 0x17, 0x04, 0xd9, 0x13, 0x11, 0x29, 0x31, 0x31, 0x29, 0x2a, 0x30, 0x31, 0x53, 0x30, 0x30, 0x2a, 0x11, 0x13, 0xd9, 0x03, 0x17, 0x17, 0x2c, 0x29, 0x31, 0x2f, 0x2b, 0x2d, 0x04, 0x6d, 0x36, 0x2e, 0x35, 0x2f, 0x2e, 0x1b, 0x1b, 0x1b, 0x0b, 0x0f, 0x8b, 0x8c, 0x0f, 0x0b, 0x1b, 0x1b, 0x1b, 0x2e, 0x2f, 0x35, 0x34, 0x2f, 0x2f, 0x1b, 0x1b, 0x1b, 0x1a, 0x2f, 0x2e, 0x36, 0x16, 0x15, 0x8c, 0xfe, 0xe9, 0x07, 0x0b, 0x1b, 0x5c, 0x6c, 0x5c, 0x36, 0x36, 0x5c, 0x6c, 0x5c, 0x1b, 0x0b, 0x07, 0x01, 0x17, 0x8c, 0x15, 0x16, 0x36, 0x2e, 0x2f, 0x1a, 0x1b, 0x1b, 0x1a, 0x2f, 0x2e, 0x36, 0x35, 0x2f, 0x2e, 0x1b, 0x1b, 0x1b, 0x0b, 0x0f, 0x8c, 0x8b, 0x0f, 0x0b, 0x1b, 0x36, 0x5c, 0x6c, 0x2e, 0x2f, 0x1a, 0x1b, 0x1b, 0x1a, 0x2f, 0x2e, 0x36, 0x16, 0x15, 0x8c, 0x01, 0x17, 0x07, 0x0b, 0x1b, 0x5c, 0x6c, 0x5c, 0x1b, 0x1b, 0x36, 0x5c, 0x6c, 0x5c, 0x1b, 0x0b, 0x07, 0xfe, 0xe9, 0x8c, 0x15, 0x16, 0x36, 0x2e, 0x2d, 0x1c, 0x1b, 0x1b, 0x1e, 0x00, 0x00, 0x09, 0x00, 0x57, 0xff, 0xe5, 0x05, 0xb2, 0x05, 0xd7, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x45, 0x00, 0x5c, 0x00, 0x73, 0x00, 0x00, 0x00, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x09, 0x01, 0x37, 0x09, 0x02, 0x37, 0x09, 0x02, 0x27, 0x09, 0x02, 0x27, 0x01, 0x13, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x05, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x8b, 0x4f, 0x70, 0x4f, 0x4f, 0x70, 0x01, 0x7d, 0xfe, 0xa3, 0x4d, 0x01, 0x5c, 0xfd, 0x59, 0xfe, 0xa5, 0x4d, 0x01, 0x5a, 0x02, 0x5b, 0xfe, 0xa4, 0x4d, 0x01, 0x5d, 0xfd, 0xf1, 0xfe, 0xa6, 0x4d, 0x01, 0x5b, 0xa6, 0x33, 0x0e, 0x14, 0x04, 0x01, 0x02, 0x03, 0x0d, 0x15, 0x67, 0x14, 0x0e, 0x02, 0x02, 0x01, 0x03, 0x15, 0x0d, 0x34, 0x34, 0x0d, 0x15, 0x03, 0x01, 0x02, 0x02, 0x0e, 0x14, 0x67, 0x15, 0x0d, 0x03, 0x02, 0x01, 0x04, 0x14, 0x0e, 0x8f, 0x36, 0x16, 0x21, 0x3d, 0x1a, 0x4a, 0x3e, 0x1b, 0x3b, 0x1d, 0x2c, 0x2c, 0x1d, 0x3b, 0x1b, 0x3e, 0x4a, 0x1a, 0x3d, 0x21, 0x16, 0x01, 0xbb, 0x36, 0x15, 0x22, 0x3d, 0x1a, 0x4a, 0x3e, 0x1b, 0x3a, 0x1d, 0x2c, 0x2c, 0x1d, 0x3a, 0x1b, 0x3e, 0x4a, 0x1a, 0x3d, 0x22, 0x15, 0x03, 0x2c, 0x7c, 0x58, 0x58, 0x7c, 0x58, 0xfd, 0x2e, 0x01, 0x84, 0x55, 0xfe, 0x7c, 0x02, 0x4a, 0x01, 0x81, 0x55, 0xfe, 0x7e, 0x01, 0x2d, 0xfe, 0x7c, 0x55, 0x01, 0x84, 0xfd, 0x0d, 0xfe, 0x7e, 0x55, 0x01, 0x81, 0x01, 0x2e, 0x3c, 0x18, 0x25, 0x44, 0x1d, 0x52, 0x45, 0x1e, 0x41, 0x20, 0x31, 0x31, 0x20, 0x41, 0x1e, 0x45, 0x52, 0x1d, 0x44, 0x25, 0x18, 0xfe, 0x14, 0x3c, 0x18, 0x25, 0x44, 0x1d, 0x52, 0x45, 0x1e, 0x41, 0x20, 0x31, 0x31, 0x20, 0x41, 0x1e, 0x45, 0x52, 0x1d, 0x44, 0x25, 0x18, 0x01, 0x14, 0x39, 0x0f, 0x17, 0x04, 0x01, 0x02, 0x03, 0x0f, 0x17, 0x72, 0x17, 0x0f, 0x03, 0x02, 0x01, 0x04, 0x17, 0x0f, 0x39, 0x39, 0x0f, 0x17, 0x04, 0x01, 0x02, 0x03, 0x0f, 0x17, 0x72, 0x17, 0x0f, 0x03, 0x02, 0x01, 0x04, 0x17, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x57, 0xff, 0xe5, 0x05, 0xb2, 0x05, 0xd7, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x2b, 0x00, 0x3f, 0x00, 0x53, 0x00, 0x67, 0x00, 0x00, 0x00, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x09, 0x01, 0x17, 0x09, 0x02, 0x17, 0x09, 0x02, 0x07, 0x09, 0x02, 0x07, 0x01, 0x02, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x12, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x24, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x03, 0xcf, 0x77, 0xa8, 0x76, 0x76, 0xa8, 0xfd, 0xab, 0x01, 0x0b, 0x4d, 0xfe, 0xf5, 0x02, 0x5d, 0x01, 0x0c, 0x4c, 0xfe, 0xf5, 0xfd, 0x56, 0x01, 0x0b, 0x4d, 0xfe, 0xf5, 0x02, 0xf7, 0x01, 0x0b, 0x4c, 0xfe, 0xf4, 0x07, 0x11, 0x13, 0x23, 0x29, 0x63, 0x2a, 0x23, 0x13, 0x11, 0x11, 0x13, 0x23, 0x2a, 0x63, 0x29, 0x23, 0x13, 0x11, 0x11, 0x13, 0x23, 0x29, 0x63, 0x2a, 0x23, 0x13, 0x11, 0x11, 0x13, 0x23, 0x2a, 0x63, 0x29, 0x23, 0x13, 0xfd, 0x63, 0x65, 0x2c, 0x32, 0x1f, 0x24, 0x24, 0x1f, 0x32, 0x2c, 0x65, 0x2c, 0x31, 0x20, 0x24, 0x24, 0x20, 0x31, 0x03, 0xdf, 0x65, 0x2c, 0x32, 0x1f, 0x24, 0x24, 0x1f, 0x32, 0x2c, 0x65, 0x2c, 0x31, 0x20, 0x24, 0x24, 0x20, 0x31, 0x03, 0x4b, 0xba, 0x84, 0x84, 0xba, 0x84, 0xfd, 0x38, 0x01, 0x29, 0x55, 0xfe, 0xd7, 0x03, 0x4c, 0x01, 0x29, 0x55, 0xfe, 0xd7, 0x01, 0x7e, 0xfe, 0xd7, 0x55, 0x01, 0x29, 0xfd, 0x5e, 0xfe, 0xd7, 0x55, 0x01, 0x29, 0x03, 0x49, 0x70, 0x31, 0x37, 0x23, 0x28, 0x28, 0x23, 0x37, 0x31, 0x70, 0x31, 0x37, 0x23, 0x28, 0x28, 0x23, 0x37, 0xfb, 0xb3, 0x70, 0x31, 0x37, 0x23, 0x28, 0x28, 0x23, 0x37, 0x31, 0x70, 0x31, 0x37, 0x23, 0x28, 0x28, 0x23, 0x37, 0x02, 0x59, 0x13, 0x15, 0x27, 0x2e, 0x6e, 0x2e, 0x27, 0x15, 0x13, 0x13, 0x15, 0x27, 0x2e, 0x6e, 0x2e, 0x27, 0x15, 0x13, 0x13, 0x15, 0x27, 0x2e, 0x6e, 0x2e, 0x27, 0x15, 0x13, 0x13, 0x15, 0x27, 0x2e, 0x6e, 0x2e, 0x27, 0x15, 0x00, 0x00, 0x00, 0x09, 0x00, 0x4b, 0xff, 0xe5, 0x05, 0xbd, 0x05, 0xf2, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x25, 0x00, 0x32, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x57, 0x00, 0x5f, 0x00, 0x6b, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x25, 0x35, 0x25, 0x33, 0x32, 0x17, 0x16, 0x05, 0x34, 0x36, 0x3b, 0x01, 0x05, 0x15, 0x05, 0x23, 0x22, 0x27, 0x26, 0x01, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x01, 0x27, 0x13, 0x37, 0x36, 0x33, 0x32, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x01, 0x17, 0x03, 0x07, 0x06, 0x23, 0x22, 0x03, 0x36, 0x33, 0x32, 0x1f, 0x01, 0x13, 0x07, 0x01, 0x27, 0x26, 0x35, 0x34, 0x01, 0x06, 0x22, 0x2f, 0x01, 0x03, 0x37, 0x01, 0x17, 0x16, 0x15, 0x14, 0x00, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x03, 0x23, 0x03, 0x35, 0x34, 0x37, 0x12, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x02, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x13, 0x33, 0x13, 0x15, 0x14, 0x07, 0x05, 0xbd, 0x19, 0x1a, 0x24, 0x09, 0xfe, 0x8a, 0x01, 0x76, 0x09, 0x23, 0x1b, 0x19, 0xfa, 0x8f, 0x32, 0x24, 0x09, 0x01, 0x76, 0xfe, 0x8a, 0x09, 0x22, 0x1b, 0x19, 0x04, 0xa5, 0x1b, 0x19, 0x06, 0xfe, 0xd8, 0x40, 0xe8, 0x06, 0x1a, 0x25, 0x25, 0xfc, 0x40, 0x1a, 0x18, 0x07, 0x01, 0x28, 0x40, 0xe9, 0x06, 0x19, 0x25, 0x24, 0x1c, 0x1a, 0x26, 0x24, 0x1a, 0x06, 0xe9, 0x40, 0xfe, 0xd8, 0x07, 0x18, 0x03, 0xf4, 0x1b, 0x49, 0x1a, 0x06, 0xe8, 0x40, 0x01, 0x28, 0x06, 0x19, 0xfd, 0xd3, 0x4a, 0x1b, 0x1a, 0x2d, 0x5a, 0x2d, 0x1a, 0xc7, 0x4f, 0x70, 0x4f, 0x4f, 0x70, 0x13, 0x4a, 0x1b, 0x1a, 0x2d, 0x5a, 0x2d, 0x1a, 0x02, 0xec, 0x2a, 0x1e, 0x1c, 0x32, 0x64, 0x32, 0x1e, 0x1e, 0x28, 0x28, 0x3c, 0x32, 0x64, 0x32, 0x1c, 0x1e, 0x02, 0x4d, 0x1d, 0x2a, 0x27, 0x1d, 0x07, 0xfe, 0xfe, 0x46, 0x01, 0x49, 0x07, 0x1c, 0xfb, 0x9b, 0x1d, 0x2a, 0x27, 0x1d, 0x07, 0x01, 0x02, 0x46, 0xfe, 0xb7, 0x07, 0x1c, 0x04, 0x65, 0x1e, 0x1c, 0x07, 0xfe, 0xb7, 0x46, 0x01, 0x02, 0x07, 0x1b, 0x29, 0x2a, 0xfb, 0xd6, 0x1e, 0x1c, 0x07, 0x01, 0x49, 0x46, 0xfe, 0xfe, 0x07, 0x1b, 0x29, 0x2a, 0x05, 0x0d, 0x1d, 0x1c, 0x28, 0x0a, 0xfe, 0x61, 0x01, 0x9f, 0x0a, 0x27, 0x1d, 0xfd, 0x55, 0x7c, 0x58, 0x58, 0x7c, 0x58, 0xfc, 0x63, 0x1d, 0x1c, 0x28, 0x0a, 0x01, 0x9f, 0xfe, 0x61, 0x0a, 0x27, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe5, 0x05, 0xbd, 0x05, 0xf2, 0x00, 0x6c, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x03, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x25, 0x36, 0x33, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x25, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x03, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x05, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x16, 0x17, 0x16, 0x17, 0x01, 0x03, 0x26, 0x35, 0x34, 0x37, 0x36, 0x03, 0x04, 0x27, 0x2a, 0x20, 0x05, 0x46, 0x01, 0x00, 0x12, 0x02, 0x2f, 0x2d, 0x3c, 0x1b, 0x1b, 0x2e, 0x09, 0x17, 0xfe, 0xa2, 0x01, 0xaf, 0x17, 0x0a, 0x45, 0x1e, 0x2a, 0x2a, 0x20, 0x43, 0x06, 0x21, 0xfe, 0x57, 0x01, 0x63, 0x19, 0x02, 0x2e, 0x1b, 0x1b, 0x3c, 0x27, 0x35, 0x09, 0x10, 0xfb, 0x46, 0x05, 0x20, 0x2a, 0x4d, 0x2b, 0x1f, 0x04, 0x46, 0xfb, 0x10, 0x09, 0x2f, 0x2d, 0x3b, 0x1c, 0x1b, 0x2f, 0x02, 0x19, 0x01, 0x62, 0xfe, 0x58, 0x22, 0x06, 0x43, 0x20, 0x29, 0x29, 0x1f, 0x44, 0x0b, 0x16, 0x01, 0xaf, 0xfe, 0xa2, 0x16, 0x09, 0x2f, 0x1b, 0x1c, 0x3b, 0x21, 0x3b, 0x02, 0x13, 0x00, 0xff, 0x46, 0x04, 0x1f, 0x2a, 0x05, 0xf2, 0x2f, 0x23, 0x4a, 0x07, 0x1f, 0xfe, 0x22, 0x01, 0x89, 0x1d, 0x01, 0x35, 0x1f, 0x1e, 0x43, 0x37, 0x2f, 0x09, 0x12, 0xfe, 0xe9, 0x4e, 0x04, 0x22, 0x2e, 0x58, 0x2e, 0x24, 0x06, 0x4d, 0xfe, 0xe5, 0x16, 0x01, 0x35, 0x31, 0x43, 0x1e, 0x1f, 0x35, 0x09, 0x19, 0x01, 0x85, 0xfe, 0x22, 0x1f, 0x07, 0x4a, 0x23, 0x2f, 0x2f, 0x23, 0x4a, 0x0e, 0x1e, 0x01, 0xd8, 0xfe, 0x7b, 0x19, 0x09, 0x35, 0x1f, 0x1e, 0x43, 0x4c, 0x1a, 0x01, 0x16, 0x01, 0x1b, 0x4d, 0x06, 0x24, 0x2e, 0x58, 0x2e, 0x22, 0x04, 0x4e, 0x01, 0x17, 0x12, 0x09, 0x35, 0x31, 0x43, 0x1e, 0x1f, 0x14, 0x21, 0x01, 0x1d, 0xfe, 0x77, 0x01, 0xd8, 0x1e, 0x0e, 0x4a, 0x23, 0x2f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, 0xff, 0xec, 0x06, 0x19, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x23, 0x00, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x06, 0x23, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x04, 0x12, 0x15, 0x10, 0x00, 0x21, 0x22, 0xa6, 0x01, 0x68, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9b, 0xfe, 0xd8, 0xa4, 0x02, 0x93, 0x16, 0x17, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0x17, 0x16, 0x17, 0x16, 0xae, 0x01, 0x4c, 0xb9, 0xfe, 0x6b, 0xfe, 0xe2, 0x16, 0x02, 0xea, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfc, 0x51, 0x02, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0x02, 0x02, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xc1, 0xfe, 0x41, 0x00, 0x02, 0x00, 0x6d, 0xff, 0x9c, 0x06, 0x07, 0x05, 0xd4, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x17, 0x23, 0x11, 0x21, 0x15, 0x33, 0x11, 0x21, 0x05, 0x62, 0xfb, 0x56, 0x10, 0x5a, 0x05, 0x3f, 0x5a, 0xfa, 0xc1, 0x53, 0x05, 0x2e, 0xfa, 0xd2, 0x53, 0x05, 0xd4, 0x64, 0xfa, 0x2c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x06, 0x07, 0x06, 0x38, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x25, 0x15, 0x21, 0x11, 0x33, 0x35, 0x21, 0x11, 0x05, 0x62, 0xfb, 0x56, 0x04, 0xf5, 0xfa, 0xc1, 0x5a, 0x05, 0x3f, 0x53, 0x05, 0x2e, 0xfa, 0xd2, 0x11, 0x64, 0x05, 0xd4, 0x64, 0xfa, 0x2c, 0x00, 0x00, 0x02, 0x00, 0x6d, 0xff, 0x9c, 0x06, 0x07, 0x05, 0xd4, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x07, 0x11, 0x21, 0x17, 0x11, 0x21, 0x05, 0x62, 0xfb, 0x56, 0x4a, 0x05, 0x3f, 0x5a, 0xfa, 0xdc, 0x53, 0x05, 0x2e, 0xfa, 0xd2, 0x53, 0x05, 0xd4, 0x82, 0xfa, 0x4a, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x06, 0x07, 0x06, 0x38, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x05, 0x21, 0x11, 0x37, 0x21, 0x11, 0x05, 0x62, 0xfb, 0x56, 0x04, 0xf5, 0xfa, 0xc1, 0x75, 0x05, 0x24, 0x53, 0x05, 0x2e, 0xfa, 0xd2, 0x53, 0x05, 0xd4, 0x64, 0xfa, 0x4a, 0x00, 0x04, 0x00, 0x99, 0xff, 0xfb, 0x05, 0xdc, 0x05, 0xd3, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x09, 0x0e, 0x99, 0x01, 0x31, 0x01, 0x31, 0xfe, 0xcf, 0x01, 0xaf, 0x01, 0x32, 0x01, 0x30, 0xfe, 0xd0, 0xfd, 0x60, 0x01, 0x31, 0x01, 0x31, 0xfe, 0xcf, 0xfe, 0xcf, 0x01, 0x31, 0x01, 0x31, 0xfe, 0xcf, 0x02, 0xe9, 0x01, 0x53, 0xfe, 0xad, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xab, 0x02, 0xea, 0x01, 0x55, 0xfe, 0xab, 0xfe, 0xae, 0xfe, 0x22, 0x01, 0x53, 0xfe, 0xad, 0xfe, 0xad, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb7, 0xfe, 0x14, 0x03, 0x51, 0x06, 0x14, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x03, 0x51, 0x99, 0x06, 0x14, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x6b, 0xfe, 0x14, 0x03, 0x9e, 0x06, 0x14, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x03, 0x9d, 0xfe, 0xce, 0x06, 0x14, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x01, 0x01, 0xd2, 0xfe, 0x14, 0x04, 0x37, 0x06, 0x14, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x04, 0x36, 0xfd, 0x9c, 0x06, 0x14, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x9c, 0x03, 0x28, 0x01, 0xe6, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x11, 0x13, 0x33, 0x03, 0x33, 0x01, 0xe6, 0xfe, 0xb7, 0x93, 0x74, 0x4a, 0x8c, 0x03, 0x28, 0x01, 0x6e, 0x01, 0x3f, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x03, 0x28, 0x01, 0xb6, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x11, 0x03, 0x23, 0x13, 0x23, 0x6c, 0x01, 0x49, 0x93, 0x74, 0x4a, 0x8c, 0x05, 0xd5, 0xfe, 0x92, 0xfe, 0xc1, 0x01, 0x3f, 0xff, 0xff, 0x00, 0x9c, 0x03, 0x28, 0x03, 0x74, 0x05, 0xd5, 0x10, 0x26, 0x0c, 0x34, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x34, 0x01, 0x8e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0x03, 0x28, 0x03, 0x44, 0x05, 0xd5, 0x10, 0x26, 0x0c, 0x35, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x35, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x02, 0x01, 0x1e, 0xff, 0x42, 0x05, 0x8f, 0x06, 0xcf, 0x00, 0x44, 0x00, 0x48, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x11, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x35, 0x37, 0x15, 0x21, 0x07, 0x23, 0x11, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x01, 0x11, 0x23, 0x11, 0x02, 0x94, 0x1c, 0x17, 0x18, 0x14, 0x13, 0x15, 0x15, 0x13, 0x14, 0x18, 0x17, 0x18, 0x19, 0x11, 0x11, 0x0f, 0x0f, 0x0e, 0x11, 0x0e, 0x12, 0x0f, 0x15, 0x56, 0x38, 0x41, 0x29, 0x31, 0x2f, 0xfe, 0xec, 0xc8, 0xe4, 0xea, 0xc2, 0x01, 0x14, 0x7f, 0x01, 0x32, 0x7e, 0xb4, 0x48, 0x38, 0x3c, 0x48, 0x46, 0xa0, 0x3d, 0x40, 0x28, 0x2d, 0x2a, 0x2c, 0x2b, 0x22, 0x3d, 0x33, 0x01, 0x7e, 0xab, 0x01, 0xd0, 0x0b, 0x0c, 0x15, 0x14, 0x38, 0x1f, 0x1e, 0x38, 0x14, 0x15, 0x0c, 0x0b, 0x09, 0x08, 0x10, 0x10, 0x27, 0x2e, 0x2a, 0x0e, 0x12, 0x06, 0x09, 0x1b, 0x21, 0x2d, 0x38, 0x81, 0x44, 0x01, 0x5f, 0xee, 0xb8, 0xbe, 0xe8, 0xc8, 0x32, 0xfa, 0x7b, 0xfb, 0xdb, 0x6a, 0xb7, 0x40, 0x46, 0x27, 0x25, 0x19, 0x1a, 0x2e, 0x33, 0x72, 0x40, 0x4d, 0x64, 0x37, 0x2b, 0x1d, 0x18, 0x01, 0x34, 0x02, 0x56, 0xfd, 0xaa, 0x00, 0x00, 0x02, 0x01, 0x74, 0xff, 0xdd, 0x04, 0x94, 0x05, 0xf0, 0x00, 0x15, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x12, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x03, 0x04, 0x90, 0x6d, 0x26, 0x27, 0x23, 0x23, 0x7b, 0xa0, 0x75, 0x78, 0x9d, 0x7a, 0x23, 0x22, 0x21, 0x2c, 0x54, 0x71, 0x70, 0x2f, 0x2f, 0x28, 0x29, 0x26, 0x26, 0x29, 0x28, 0x2f, 0x2f, 0x70, 0x2e, 0x30, 0x28, 0x28, 0x27, 0x27, 0x28, 0x28, 0x30, 0x05, 0xf0, 0x28, 0x0e, 0x2b, 0x26, 0x61, 0x34, 0x7c, 0x64, 0x83, 0xce, 0xce, 0x83, 0x66, 0x7a, 0x34, 0x61, 0x26, 0x24, 0x15, 0x28, 0xfc, 0x46, 0x16, 0x18, 0x2a, 0x2e, 0x6a, 0x3d, 0x3c, 0x6a, 0x2e, 0x2a, 0x18, 0x16, 0x16, 0x18, 0x2a, 0x2e, 0x6a, 0x3c, 0x3d, 0x6a, 0x2e, 0x2a, 0x18, 0x00, 0x02, 0x01, 0x2c, 0xff, 0xdd, 0x04, 0xdc, 0x05, 0xf0, 0x00, 0x21, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x02, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x03, 0x04, 0x6e, 0xef, 0x7a, 0x23, 0x22, 0x21, 0x2c, 0x29, 0x61, 0x29, 0x2b, 0x22, 0x21, 0x24, 0x24, 0x22, 0x22, 0x2a, 0x29, 0x62, 0x28, 0x2c, 0x21, 0x23, 0x23, 0x7b, 0xef, 0xa6, 0x70, 0x2f, 0x2f, 0x28, 0x29, 0x26, 0x26, 0x29, 0x28, 0x2f, 0x2f, 0x70, 0x2e, 0x30, 0x28, 0x28, 0x27, 0x27, 0x28, 0x28, 0x30, 0x02, 0xad, 0xc4, 0xa1, 0x53, 0x83, 0x34, 0x61, 0x26, 0x24, 0x15, 0x14, 0x14, 0x14, 0x25, 0x25, 0x60, 0x36, 0x36, 0x60, 0x25, 0x25, 0x14, 0x14, 0x14, 0x15, 0x24, 0x26, 0x61, 0x34, 0x84, 0x52, 0xa1, 0xfe, 0xc5, 0x16, 0x18, 0x2a, 0x2e, 0x6a, 0x3d, 0x3c, 0x6a, 0x2e, 0x2a, 0x18, 0x16, 0x16, 0x18, 0x2a, 0x2e, 0x6a, 0x3c, 0x3d, 0x6a, 0x2e, 0x2a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0xab, 0x05, 0xa6, 0x05, 0x28, 0x00, 0x21, 0x00, 0x00, 0x25, 0x26, 0x25, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x04, 0x03, 0x04, 0x7b, 0xfe, 0x89, 0xaf, 0x31, 0x32, 0x30, 0x3e, 0x3a, 0x8b, 0x3a, 0x3e, 0x30, 0x30, 0x33, 0x34, 0x2f, 0x31, 0x3d, 0x3b, 0x8a, 0x3b, 0x3e, 0x2f, 0x32, 0x31, 0xae, 0xfe, 0x89, 0xab, 0xef, 0xf2, 0x71, 0xb2, 0x4b, 0x8a, 0x36, 0x34, 0x1e, 0x1c, 0x1c, 0x1d, 0x35, 0x34, 0x89, 0x4e, 0x4e, 0x89, 0x34, 0x35, 0x1d, 0x1c, 0x1c, 0x1e, 0x34, 0x36, 0x8a, 0x4b, 0xb4, 0x6f, 0xf2, 0x00, 0x00, 0x01, 0x01, 0x35, 0xff, 0xfe, 0x05, 0x3f, 0x05, 0xd6, 0x00, 0x23, 0x00, 0x00, 0x01, 0x06, 0x03, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x12, 0x05, 0x3f, 0xd6, 0xda, 0x67, 0xa0, 0x43, 0x7c, 0x30, 0x2f, 0x1b, 0x19, 0x19, 0x19, 0x31, 0x2e, 0x7b, 0x46, 0x46, 0x7b, 0x2e, 0x31, 0x19, 0x19, 0x19, 0x1b, 0x2f, 0x30, 0x7c, 0x43, 0xa2, 0x65, 0xda, 0x02, 0xea, 0x8a, 0xfe, 0x60, 0xc2, 0x36, 0x38, 0x34, 0x46, 0x40, 0x4e, 0x4c, 0x42, 0x44, 0x36, 0x34, 0x3a, 0x38, 0x36, 0x36, 0x44, 0x40, 0x4e, 0x4c, 0x42, 0x44, 0x36, 0x36, 0x38, 0xc2, 0xfe, 0x5e, 0x00, 0x02, 0x00, 0x71, 0x00, 0x2a, 0x05, 0x37, 0x05, 0x9e, 0x00, 0x0d, 0x00, 0x69, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x06, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x05, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x21, 0x22, 0x27, 0x26, 0x35, 0x10, 0x33, 0x32, 0x17, 0x36, 0x37, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x1f, 0x01, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x03, 0x3b, 0x09, 0x1a, 0x16, 0x30, 0x1b, 0x14, 0x11, 0x27, 0x42, 0x64, 0x13, 0x29, 0x54, 0x4e, 0x6f, 0x36, 0x28, 0xfe, 0xea, 0x8a, 0x5f, 0x68, 0x0f, 0x2d, 0x31, 0x39, 0xfe, 0xe4, 0xb7, 0xa8, 0xb2, 0xeb, 0x5c, 0x49, 0x45, 0x0e, 0x5b, 0xcf, 0x3e, 0x42, 0x4b, 0x39, 0x24, 0x26, 0x17, 0x21, 0x12, 0x1d, 0x16, 0x0d, 0x68, 0x54, 0x6a, 0x5d, 0x2d, 0x44, 0x25, 0x26, 0x46, 0x44, 0x2c, 0x2e, 0x0e, 0x36, 0x4d, 0x45, 0x25, 0x29, 0x13, 0x26, 0x13, 0x1c, 0x32, 0x3b, 0x26, 0x12, 0x81, 0x56, 0x6c, 0x3a, 0x04, 0x67, 0x30, 0x2c, 0x3f, 0x29, 0x21, 0x12, 0x0f, 0x1b, 0x3a, 0x22, 0x39, 0x8c, 0x4a, 0x4f, 0x43, 0x51, 0x3e, 0x5e, 0xda, 0x76, 0x3a, 0x4d, 0x63, 0x2a, 0x84, 0x5a, 0x9c, 0x99, 0xa3, 0xfe, 0x01, 0x65, 0x8d, 0x97, 0x43, 0x30, 0xaa, 0x33, 0x4e, 0x33, 0x35, 0x25, 0x26, 0x1d, 0x17, 0x14, 0x1c, 0x2d, 0x19, 0x4b, 0x74, 0x5c, 0x4b, 0x25, 0x39, 0x53, 0x1f, 0x20, 0x3e, 0x42, 0x57, 0x4e, 0x3d, 0x11, 0x21, 0x24, 0x1f, 0x3f, 0x12, 0x24, 0x15, 0x38, 0x1c, 0x28, 0x46, 0x21, 0x35, 0x7b, 0x5e, 0x3f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x90, 0x01, 0x5a, 0x05, 0x78, 0x04, 0x84, 0x00, 0x09, 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x35, 0x34, 0x01, 0x20, 0x35, 0x34, 0x37, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x16, 0x07, 0x06, 0x07, 0x16, 0x33, 0x32, 0x37, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x32, 0x17, 0x16, 0x17, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x13, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x01, 0xaf, 0x39, 0x28, 0x3c, 0x18, 0x47, 0x38, 0x37, 0x01, 0xcb, 0xfe, 0xb0, 0x6b, 0x2c, 0x30, 0x22, 0x22, 0x03, 0x01, 0x43, 0x57, 0x5a, 0x17, 0x3c, 0x27, 0x24, 0x07, 0x82, 0x61, 0x12, 0x20, 0x23, 0x1b, 0x5b, 0x45, 0x39, 0x0d, 0x21, 0x1f, 0x37, 0x41, 0x58, 0x0b, 0x81, 0x3b, 0x04, 0x37, 0x25, 0x27, 0x32, 0x1c, 0x37, 0x29, 0x62, 0xc3, 0x33, 0x16, 0x5b, 0x58, 0x0b, 0x0a, 0x48, 0x3c, 0xdf, 0x9e, 0x03, 0x3e, 0x0e, 0x24, 0x33, 0x67, 0x1d, 0x3a, 0x38, 0x34, 0x04, 0xfe, 0x21, 0xfe, 0x45, 0x42, 0x37, 0x1c, 0x14, 0x57, 0x50, 0x66, 0x0f, 0x47, 0x2b, 0x1e, 0x31, 0x4b, 0xab, 0x48, 0x8e, 0x50, 0x3c, 0x02, 0x12, 0x12, 0x12, 0x0e, 0x11, 0x46, 0x66, 0x1d, 0x23, 0x26, 0x54, 0x27, 0x19, 0x13, 0x14, 0x30, 0x50, 0x2b, 0x41, 0x27, 0x1d, 0xfe, 0x93, 0x9a, 0x3c, 0x1e, 0x12, 0x11, 0x1b, 0x3c, 0x51, 0xad, 0x62, 0x46, 0x00, 0x01, 0x01, 0x68, 0xfe, 0xe4, 0x04, 0xab, 0x06, 0x27, 0x00, 0x20, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x15, 0x22, 0x07, 0x06, 0x02, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x04, 0xaa, 0xa7, 0x98, 0x91, 0x7c, 0x79, 0x3f, 0x3d, 0x3d, 0x3a, 0x7e, 0x76, 0x97, 0x98, 0xa7, 0x62, 0x5d, 0x57, 0x95, 0x24, 0x24, 0x24, 0x24, 0x4b, 0x46, 0x5b, 0x59, 0x66, 0xfe, 0xe4, 0x47, 0x43, 0x89, 0x85, 0xa7, 0xa4, 0xbb, 0xbd, 0xa9, 0x9d, 0x8f, 0x86, 0x46, 0x47, 0x2f, 0x43, 0x3e, 0xfe, 0xfa, 0x9b, 0x9c, 0xb8, 0xb1, 0x9c, 0x9b, 0x83, 0x7d, 0x44, 0x43, 0x00, 0x00, 0x01, 0x01, 0x68, 0xfe, 0xe4, 0x04, 0xab, 0x06, 0x27, 0x00, 0x22, 0x00, 0x00, 0x01, 0x30, 0x35, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x02, 0x27, 0x26, 0x23, 0x30, 0x35, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x69, 0x67, 0x59, 0x5b, 0x46, 0x4a, 0x24, 0x24, 0x24, 0x24, 0x95, 0x56, 0x5e, 0x62, 0xa7, 0x98, 0x97, 0x77, 0x7e, 0x39, 0x3d, 0x3d, 0x3f, 0x78, 0x7d, 0x91, 0x98, 0xfe, 0xe4, 0x2f, 0x43, 0x44, 0x7d, 0x83, 0x9b, 0x9c, 0xb1, 0xb8, 0x9c, 0x9b, 0x01, 0x06, 0x3e, 0x43, 0x2f, 0x47, 0x46, 0x86, 0x8f, 0x9d, 0xa9, 0xbd, 0xbb, 0xa4, 0xa7, 0x85, 0x89, 0x43, 0x47, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe6, 0xfe, 0xf1, 0x04, 0x23, 0x06, 0x11, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x02, 0x10, 0x12, 0x17, 0x21, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x04, 0x22, 0x78, 0x75, 0x76, 0x77, 0xfe, 0xd2, 0x87, 0x86, 0x85, 0x88, 0x06, 0x11, 0xe6, 0xfe, 0x3e, 0xfe, 0x32, 0xfe, 0x3b, 0xe5, 0xeb, 0x01, 0xc6, 0xe0, 0xdf, 0x01, 0xc4, 0xec, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe6, 0xfe, 0xf1, 0x04, 0x23, 0x06, 0x11, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x30, 0x21, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x21, 0x36, 0x12, 0x10, 0x02, 0x01, 0xe7, 0x01, 0x2e, 0x88, 0x85, 0x86, 0x87, 0xfe, 0xd2, 0x78, 0x75, 0x74, 0x06, 0x11, 0xec, 0xfe, 0x3c, 0xdf, 0xe0, 0xfe, 0x3a, 0xeb, 0xe5, 0x01, 0xc5, 0x01, 0xce, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x01, 0x8c, 0xfe, 0x14, 0x04, 0x5f, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x04, 0x5f, 0xfe, 0xf9, 0xfe, 0x35, 0x01, 0xcb, 0x01, 0x07, 0xfe, 0x33, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0x00, 0x01, 0x01, 0xab, 0xfe, 0x14, 0x04, 0x7d, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x09, 0x02, 0x21, 0x09, 0x01, 0x01, 0xac, 0x01, 0xcb, 0xfe, 0x35, 0x01, 0x05, 0x01, 0xcb, 0xfe, 0x35, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0xfe, 0x14, 0x04, 0xef, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x04, 0xef, 0xfe, 0x69, 0xfd, 0xae, 0x02, 0x52, 0x01, 0x97, 0xfd, 0xa3, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0x00, 0x01, 0x01, 0x19, 0xfe, 0x14, 0x05, 0x03, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x09, 0x02, 0x21, 0x09, 0x01, 0x01, 0x1a, 0x02, 0x5c, 0xfd, 0xa4, 0x01, 0x96, 0x02, 0x52, 0xfd, 0xae, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x32, 0xfe, 0x14, 0x04, 0xb9, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x04, 0xb9, 0xfe, 0x45, 0xfe, 0x35, 0x01, 0xcb, 0x01, 0xbb, 0xfe, 0x33, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0x00, 0x01, 0x01, 0x51, 0xfe, 0x14, 0x04, 0xd7, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x09, 0x02, 0x21, 0x09, 0x01, 0x01, 0x52, 0x01, 0xcb, 0xfe, 0x35, 0x01, 0xb9, 0x01, 0xcb, 0xfe, 0x35, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7d, 0xfe, 0x13, 0x03, 0xdb, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x05, 0x17, 0x07, 0x03, 0x11, 0x13, 0x17, 0x07, 0x03, 0x04, 0xd6, 0x5f, 0xfe, 0xfe, 0x5f, 0xd6, 0x95, 0xee, 0x6a, 0x01, 0x1a, 0x05, 0xcd, 0x01, 0x1a, 0x6a, 0xee, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0xfe, 0x13, 0x03, 0x8c, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x01, 0x27, 0x37, 0x13, 0x11, 0x03, 0x27, 0x37, 0x03, 0x04, 0xd6, 0x5f, 0xfe, 0xfe, 0x5f, 0xd6, 0x04, 0xbc, 0xee, 0x6a, 0xfe, 0xe6, 0xfa, 0x33, 0xfe, 0xe6, 0x6a, 0xee, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0xfe, 0xb2, 0x04, 0x92, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x05, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1d, 0x01, 0x14, 0x16, 0x33, 0x04, 0x91, 0xbf, 0xe0, 0x98, 0x61, 0x80, 0x37, 0x37, 0x81, 0x60, 0x98, 0xe0, 0xbf, 0x3d, 0x7f, 0x4d, 0x52, 0x63, 0x64, 0x51, 0x4d, 0x7f, 0xbe, 0x90, 0x94, 0xdd, 0xef, 0x97, 0x74, 0x8f, 0x73, 0x95, 0xf0, 0xdd, 0x93, 0x8f, 0x58, 0x8d, 0xf8, 0x9d, 0x8e, 0x19, 0x1b, 0x8e, 0x9c, 0xf8, 0x8d, 0x58, 0x00, 0x01, 0x01, 0x77, 0xfe, 0xb2, 0x04, 0xc7, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x05, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0x01, 0x77, 0x3d, 0x7f, 0x4e, 0x51, 0x64, 0x63, 0x52, 0x4e, 0x7f, 0x3d, 0xbf, 0xe0, 0x98, 0x61, 0x80, 0x37, 0x37, 0x7f, 0x62, 0x98, 0xe0, 0xbf, 0xbe, 0x58, 0x8d, 0xf8, 0x9c, 0x8e, 0x1b, 0x19, 0x8e, 0x9d, 0xf8, 0x8d, 0x58, 0x8f, 0x93, 0xdd, 0xf0, 0x95, 0x73, 0x8f, 0x74, 0x97, 0xef, 0xdd, 0x94, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x21, 0x35, 0x23, 0x11, 0x23, 0x07, 0x15, 0x37, 0x11, 0x23, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfc, 0x3e, 0x02, 0x2b, 0xc4, 0x91, 0xe8, 0xd5, 0xc3, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfd, 0x5c, 0x8e, 0x03, 0x1a, 0x2f, 0x98, 0x2b, 0xfd, 0x82, 0x00, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x15, 0x21, 0x35, 0x21, 0x3e, 0x01, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfe, 0x1b, 0x38, 0x2b, 0xb1, 0x93, 0x36, 0x83, 0x57, 0x67, 0x77, 0x35, 0x46, 0x56, 0x2b, 0x37, 0x1e, 0xec, 0x4a, 0x02, 0x61, 0xfe, 0x77, 0x71, 0xa0, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xe9, 0x46, 0x69, 0x3a, 0x7d, 0x97, 0x1f, 0x24, 0xab, 0x3a, 0x26, 0x4e, 0x3f, 0x28, 0x55, 0x3f, 0x22, 0xf1, 0x4d, 0x81, 0x8e, 0x74, 0xa7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x36, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x36, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfe, 0xa2, 0xad, 0x91, 0x37, 0x7b, 0x55, 0x60, 0x6d, 0x2f, 0x52, 0x53, 0x50, 0x50, 0x83, 0x7e, 0x59, 0x60, 0x67, 0x69, 0x3e, 0x70, 0x52, 0x4f, 0x7b, 0x39, 0xb0, 0xc2, 0x6a, 0x0c, 0x04, 0x5d, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0x18, 0x73, 0x89, 0x14, 0x18, 0x97, 0x20, 0x15, 0x3f, 0x3c, 0x3a, 0x3c, 0x8c, 0x4e, 0x47, 0x4c, 0x4f, 0x1c, 0x30, 0xa8, 0x1b, 0x17, 0x9c, 0x8d, 0x5d, 0x81, 0x03, 0x72, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x23, 0x13, 0x01, 0x15, 0x21, 0x15, 0x33, 0x35, 0x33, 0x35, 0x23, 0x11, 0x23, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfd, 0x60, 0xf2, 0xf2, 0xfe, 0x70, 0x01, 0x90, 0xa4, 0x7f, 0x7f, 0xb9, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfe, 0xbc, 0x01, 0x7e, 0xfe, 0x83, 0x8e, 0xd3, 0xd3, 0x8d, 0x02, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x37, 0x35, 0x21, 0x35, 0x21, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfc, 0x57, 0x50, 0x5b, 0x2d, 0x5d, 0x6a, 0x6a, 0x5d, 0x3d, 0x6c, 0x55, 0x4f, 0x78, 0x39, 0xab, 0xc0, 0xba, 0x9f, 0x1b, 0x39, 0x03, 0x01, 0x68, 0xfd, 0xfd, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xf3, 0x25, 0x14, 0x61, 0x56, 0x55, 0x61, 0x1b, 0x2f, 0xac, 0x18, 0x14, 0xac, 0x98, 0x95, 0xb0, 0x0a, 0x01, 0xab, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x32, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x22, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x35, 0x2e, 0x01, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfd, 0xde, 0x53, 0x46, 0x46, 0x53, 0x53, 0x46, 0x46, 0x53, 0x66, 0xb4, 0xd2, 0xad, 0xa6, 0x90, 0xaf, 0xa8, 0x90, 0x46, 0x73, 0x08, 0x05, 0x72, 0x6b, 0x2a, 0x58, 0x4b, 0x42, 0x60, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfe, 0x8f, 0x5a, 0x62, 0x62, 0x5a, 0x5b, 0x62, 0x62, 0x02, 0x2a, 0xfe, 0xf5, 0xda, 0xe7, 0xfd, 0xb3, 0x91, 0x94, 0xb1, 0x3d, 0x0b, 0x50, 0x94, 0x16, 0x23, 0x9c, 0x18, 0x13, 0x00, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x25, 0x21, 0x01, 0x33, 0x01, 0x35, 0x21, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfc, 0x2e, 0x01, 0xa1, 0xfe, 0xd1, 0xad, 0x01, 0x48, 0xfd, 0x99, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0x76, 0xfc, 0xe6, 0x03, 0x5d, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x0e, 0x01, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfd, 0xf3, 0x56, 0x4b, 0x4c, 0x55, 0x55, 0x4c, 0x4b, 0x56, 0xfe, 0x18, 0xab, 0x9c, 0x9c, 0xaa, 0x6a, 0x0d, 0x03, 0x5f, 0xa4, 0x8d, 0x8e, 0xa4, 0x5f, 0x04, 0x0e, 0x6a, 0x01, 0x47, 0x43, 0x4a, 0x4a, 0x43, 0x46, 0x48, 0x48, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfe, 0x6c, 0x48, 0x51, 0x50, 0x49, 0x49, 0x50, 0x50, 0x49, 0x8a, 0x97, 0x97, 0x8a, 0x5c, 0x83, 0x03, 0x01, 0x76, 0x53, 0x74, 0x88, 0x88, 0x74, 0x53, 0x76, 0x01, 0x03, 0x83, 0x01, 0xc4, 0x42, 0x3e, 0x3d, 0x42, 0x42, 0x3d, 0x3e, 0x42, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x32, 0x12, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfd, 0x22, 0xb4, 0xd2, 0xac, 0xa7, 0x90, 0xae, 0xa7, 0x8f, 0x47, 0x74, 0x09, 0x05, 0x72, 0x6b, 0x2a, 0x57, 0x4c, 0x42, 0x60, 0x36, 0x53, 0x46, 0x47, 0x52, 0x52, 0x47, 0x46, 0x53, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfd, 0x4b, 0x01, 0x0a, 0xda, 0xe8, 0xfd, 0xb4, 0x91, 0x94, 0xaf, 0x3c, 0x0d, 0x4f, 0x93, 0x15, 0x24, 0x9c, 0x18, 0x13, 0x02, 0x84, 0x5b, 0x62, 0x62, 0x5b, 0x5b, 0x62, 0x62, 0x00, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x21, 0x35, 0x23, 0x11, 0x23, 0x07, 0x15, 0x37, 0x11, 0x23, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfb, 0xa0, 0x01, 0x95, 0x8f, 0x69, 0xaa, 0x9b, 0x8e, 0x03, 0x2e, 0x3e, 0x39, 0x3a, 0x3e, 0x3e, 0x3a, 0x39, 0x3e, 0xfe, 0x98, 0x7b, 0x76, 0x75, 0x7a, 0x7a, 0x75, 0x76, 0x7b, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfd, 0xa9, 0x80, 0x02, 0xca, 0x2a, 0x89, 0x27, 0xfd, 0xc2, 0x01, 0x24, 0xa2, 0x97, 0x97, 0xa2, 0xa3, 0x97, 0x97, 0xa3, 0xd0, 0xe4, 0xe4, 0xd0, 0xd1, 0xe4, 0xe4, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x24, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x33, 0x11, 0x05, 0x35, 0x25, 0x33, 0x11, 0x33, 0x15, 0x21, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfd, 0xe2, 0xed, 0xfe, 0xfe, 0x01, 0x01, 0x91, 0xee, 0xfd, 0x95, 0x7f, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfb, 0x7d, 0x03, 0x8f, 0x39, 0x93, 0x3a, 0xfb, 0xdd, 0x88, 0x05, 0xa8, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x36, 0x00, 0x50, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x00, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x02, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfe, 0x59, 0x01, 0xfb, 0xfd, 0x56, 0x53, 0x01, 0x1d, 0x25, 0x46, 0x37, 0x78, 0x60, 0x48, 0x95, 0x56, 0x57, 0x99, 0x3f, 0xa8, 0xc7, 0x32, 0x42, 0x12, 0xc1, 0xa7, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfb, 0x80, 0x88, 0x88, 0x5f, 0x01, 0x41, 0x2e, 0x58, 0x78, 0x3b, 0x5f, 0x78, 0x35, 0x35, 0xa3, 0x27, 0x28, 0xba, 0x9b, 0x49, 0x84, 0x5a, 0x17, 0xde, 0x04, 0x56, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x42, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x03, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x68, 0x68, 0x76, 0xda, 0xca, 0x44, 0x8f, 0x4d, 0x3d, 0x90, 0x4e, 0x89, 0x8f, 0x85, 0x77, 0x7d, 0x83, 0x6c, 0x71, 0x75, 0x6e, 0x3b, 0x89, 0x53, 0x4a, 0x9a, 0x40, 0xa7, 0xc0, 0x66, 0xfe, 0x6a, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfd, 0x79, 0x19, 0x9c, 0x74, 0xb0, 0xc2, 0x1e, 0x1d, 0x9c, 0x27, 0x28, 0x78, 0x72, 0x6a, 0x77, 0x85, 0x5f, 0x5a, 0x5c, 0x62, 0x1d, 0x1e, 0x90, 0x17, 0x1c, 0xa7, 0x8e, 0x64, 0x88, 0x03, 0x09, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x1c, 0x00, 0x27, 0x00, 0x41, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x07, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xc7, 0xfe, 0x90, 0x01, 0x70, 0x26, 0xb6, 0x9a, 0x9a, 0x90, 0xfe, 0x1a, 0x01, 0x0e, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xed, 0xfd, 0x82, 0x03, 0x0b, 0xfc, 0xf5, 0x86, 0xfe, 0xe6, 0x01, 0x1a, 0x9c, 0x03, 0xf2, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x37, 0x00, 0x51, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x05, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfd, 0xe0, 0x02, 0x3b, 0xfe, 0x4a, 0x20, 0x40, 0x1f, 0xb4, 0xd2, 0xd8, 0xc5, 0x43, 0x8c, 0x4b, 0x44, 0x86, 0x4e, 0x7c, 0x92, 0x92, 0x7c, 0x3b, 0x74, 0x3c, 0x81, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0x63, 0x88, 0xfe, 0xdb, 0x0c, 0x0c, 0xdb, 0xbb, 0xc1, 0xd6, 0x1a, 0x19, 0xa3, 0x29, 0x25, 0x92, 0x7d, 0x7c, 0x92, 0x1d, 0x1e, 0x03, 0x58, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x25, 0x00, 0x3e, 0x00, 0x58, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfe, 0xf4, 0x61, 0x73, 0x73, 0x61, 0x62, 0x73, 0x73, 0xbf, 0x37, 0x6f, 0x36, 0x90, 0x98, 0x0b, 0x2a, 0x80, 0x4d, 0xa2, 0xbc, 0xc4, 0xa3, 0xba, 0xc5, 0xf2, 0xcb, 0x37, 0x70, 0xfe, 0x88, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfd, 0x8b, 0x95, 0x82, 0x80, 0x96, 0x96, 0x80, 0x82, 0x95, 0x01, 0xfa, 0x93, 0x1d, 0x1e, 0xd8, 0xda, 0x45, 0x4b, 0xdb, 0xbc, 0xb8, 0xde, 0x01, 0x3e, 0x01, 0x2d, 0x01, 0x1d, 0x01, 0x4f, 0x18, 0x01, 0x00, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x20, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x05, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfd, 0xa0, 0x02, 0xb3, 0xfe, 0x7a, 0x98, 0x01, 0x70, 0xfd, 0xfb, 0xc1, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0x60, 0x45, 0xfb, 0x9a, 0x04, 0x23, 0x01, 0x85, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x23, 0x00, 0x39, 0x00, 0x45, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x20, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, 0x34, 0x36, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfe, 0xfc, 0x67, 0x77, 0x77, 0xcf, 0x77, 0x76, 0xfa, 0x5e, 0x68, 0xb7, 0x01, 0x41, 0xb7, 0x68, 0x5e, 0x69, 0x76, 0xbe, 0xfe, 0x9b, 0xbf, 0x77, 0x33, 0x69, 0x5e, 0x5e, 0x6a, 0x6a, 0x5e, 0x5e, 0x69, 0x2c, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfd, 0x2c, 0x7b, 0xd8, 0x7b, 0x7c, 0x6b, 0x6c, 0x7b, 0x45, 0x1a, 0x8e, 0x67, 0x8f, 0xa6, 0xa6, 0x8f, 0x67, 0x8e, 0x1a, 0x1b, 0x9e, 0x73, 0xad, 0xba, 0xba, 0xad, 0x73, 0x9e, 0x01, 0x1a, 0x5c, 0x68, 0x68, 0x5c, 0x5d, 0x68, 0x68, 0x01, 0xd0, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x32, 0x00, 0x3e, 0x00, 0x58, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfd, 0xe3, 0x37, 0x70, 0x36, 0x90, 0x98, 0x0b, 0x2a, 0x80, 0x4e, 0xa2, 0xbb, 0xc4, 0xa2, 0xbc, 0xc4, 0xf1, 0xcc, 0x37, 0x70, 0xe4, 0x63, 0x72, 0x72, 0x63, 0x61, 0x73, 0x73, 0x42, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfb, 0x0e, 0x93, 0x1d, 0x1e, 0xd7, 0xdb, 0x44, 0x4a, 0xd9, 0xbc, 0xb8, 0xde, 0xfe, 0xc3, 0xfe, 0xd1, 0xfe, 0xe6, 0xfe, 0xaf, 0x18, 0x02, 0x12, 0x95, 0x82, 0x81, 0x95, 0x95, 0x81, 0x82, 0x95, 0x03, 0x95, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x38, 0x00, 0x43, 0x00, 0x61, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x07, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x2e, 0x01, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x20, 0x02, 0x11, 0x10, 0x37, 0x01, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x30, 0x32, 0x32, 0x30, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x30, 0x32, 0x32, 0x30, 0x64, 0x62, 0x77, 0x1a, 0x4b, 0x28, 0x27, 0x4e, 0x4c, 0x4e, 0x4d, 0x27, 0x26, 0xd7, 0x01, 0x13, 0x49, 0x48, 0x48, 0x49, 0xfe, 0xed, 0x90, 0x48, 0xfe, 0x61, 0x7f, 0x87, 0x86, 0x74, 0x76, 0xfe, 0x98, 0xeb, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x36, 0x38, 0x38, 0x36, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x36, 0x39, 0x39, 0x36, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0x83, 0x86, 0x9c, 0x97, 0x86, 0x83, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x83, 0x86, 0x97, 0x9c, 0x86, 0x83, 0x6f, 0x6f, 0x36, 0xcb, 0x7b, 0x7a, 0xf7, 0xf5, 0xf6, 0xf6, 0xf5, 0xf3, 0x7e, 0x7b, 0x80, 0x9f, 0x9e, 0xfe, 0xd1, 0xfe, 0xd3, 0x9f, 0x9f, 0x01, 0x3e, 0x01, 0x2d, 0x01, 0x2c, 0xa1, 0xfc, 0x67, 0x03, 0x8f, 0x25, 0x93, 0x26, 0xfb, 0xdd, 0x88, 0x05, 0xa8, 0x40, 0x3e, 0x7d, 0x7e, 0x95, 0x97, 0xb1, 0xac, 0x97, 0x95, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x95, 0x97, 0xac, 0xb1, 0x97, 0x95, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x23, 0x11, 0x23, 0x05, 0x15, 0x25, 0x11, 0x02, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x01, 0xe9, 0x02, 0x6b, 0xee, 0x91, 0xfe, 0xff, 0x01, 0x02, 0x6e, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x01, 0x1d, 0x88, 0x88, 0x04, 0x23, 0x3a, 0x93, 0x39, 0xfc, 0x71, 0x05, 0x20, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x1c, 0x00, 0x36, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x00, 0x07, 0x15, 0x21, 0x35, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x02, 0x60, 0xaf, 0xc1, 0x12, 0x42, 0x32, 0xc7, 0xa8, 0x3f, 0x99, 0x57, 0x56, 0x99, 0x44, 0x60, 0x78, 0x37, 0x46, 0x25, 0xfe, 0xe3, 0x53, 0x02, 0xaa, 0xfe, 0x0d, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x01, 0x20, 0xc7, 0xde, 0x17, 0x5a, 0x84, 0x49, 0x9b, 0xba, 0x28, 0x27, 0xa3, 0x35, 0x35, 0x78, 0x5f, 0x3b, 0x78, 0x58, 0x2e, 0xfe, 0xbf, 0x5f, 0x88, 0x88, 0x05, 0x1d, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x28, 0x00, 0x42, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x9f, 0x5f, 0x66, 0xc1, 0xa6, 0x40, 0x91, 0x53, 0x53, 0x89, 0x3b, 0x6e, 0x75, 0x71, 0x6c, 0x83, 0x7d, 0x77, 0x85, 0x8f, 0x89, 0x4e, 0x90, 0x3d, 0x4d, 0x8f, 0x44, 0xca, 0xda, 0x76, 0xfe, 0x61, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x03, 0x19, 0x1b, 0x88, 0x64, 0x8e, 0xa7, 0x19, 0x1a, 0x90, 0x1e, 0x1d, 0x62, 0x5c, 0x5a, 0x5f, 0x85, 0x77, 0x6a, 0x72, 0x78, 0x28, 0x27, 0x9c, 0x1d, 0x1e, 0xc2, 0xb0, 0x74, 0x9c, 0x03, 0x3d, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x00, 0x01, 0x11, 0x21, 0x09, 0x01, 0x15, 0x21, 0x11, 0x33, 0x11, 0x33, 0x35, 0x23, 0x11, 0x24, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x40, 0xfe, 0x90, 0x01, 0x4a, 0xfe, 0x40, 0x01, 0xe6, 0x90, 0x9a, 0x9a, 0xfe, 0x98, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x04, 0xb3, 0xfd, 0x82, 0x03, 0x0b, 0xfd, 0x0b, 0x9c, 0xfe, 0xe6, 0x01, 0x1a, 0x86, 0x03, 0x0b, 0xfd, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x35, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x01, 0xe7, 0x3c, 0x74, 0x3b, 0x7c, 0x92, 0x92, 0x7c, 0x4e, 0x89, 0x41, 0x4b, 0x8c, 0x43, 0xc5, 0xd8, 0xd2, 0xb4, 0x1f, 0x40, 0x20, 0x01, 0xb6, 0xfe, 0x46, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0x3d, 0xfd, 0xa8, 0x1e, 0x1d, 0x92, 0x7c, 0x7d, 0x92, 0x27, 0x27, 0xa3, 0x19, 0x1a, 0xd6, 0xc1, 0xbb, 0xdb, 0x0c, 0x0c, 0x01, 0x25, 0x88, 0x01, 0x00, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x02, 0xfb, 0x62, 0x73, 0x73, 0x62, 0x61, 0x73, 0x73, 0x01, 0x82, 0x3c, 0x70, 0x37, 0xcb, 0xf2, 0xc5, 0xba, 0xa3, 0xc4, 0xbc, 0xa2, 0x4d, 0x80, 0x2a, 0x0b, 0x98, 0x90, 0x36, 0x6f, 0x37, 0xfe, 0x4c, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x03, 0x2b, 0x95, 0x82, 0x80, 0x96, 0x96, 0x80, 0x82, 0x95, 0x01, 0xfa, 0x18, 0x18, 0xfe, 0xaf, 0xfe, 0xe5, 0xfe, 0xd3, 0xfe, 0xc2, 0xde, 0xb8, 0xbc, 0xdb, 0x4b, 0x45, 0xda, 0xd8, 0x1e, 0x1d, 0x01, 0xab, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x06, 0x00, 0x20, 0x00, 0x00, 0x01, 0x15, 0x21, 0x01, 0x33, 0x01, 0x35, 0x24, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x01, 0xa7, 0x02, 0x05, 0xfe, 0x90, 0x98, 0x01, 0x86, 0xfe, 0x0e, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0x40, 0x88, 0xfb, 0xdd, 0x04, 0x66, 0x45, 0xfd, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x09, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x45, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x27, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x20, 0x36, 0x35, 0x34, 0x26, 0x27, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x20, 0x06, 0x15, 0x14, 0x16, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x03, 0x69, 0x76, 0x77, 0xcf, 0x77, 0x77, 0x2a, 0x69, 0x77, 0xbf, 0x01, 0x65, 0xbe, 0x76, 0x69, 0x5e, 0x68, 0xb7, 0xfe, 0xbf, 0xb7, 0x68, 0x28, 0x69, 0x5e, 0x5e, 0x6a, 0x6a, 0x5e, 0x5e, 0x69, 0x2c, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x02, 0xcc, 0x7b, 0x6c, 0x6b, 0x7c, 0x7b, 0xd8, 0x7b, 0x45, 0x1b, 0x9e, 0x73, 0xad, 0xba, 0xba, 0xad, 0x73, 0x9e, 0x1b, 0x1a, 0x8e, 0x67, 0x8f, 0xa6, 0xa6, 0x8f, 0x67, 0x8e, 0xe5, 0x5d, 0x68, 0x68, 0x5d, 0x5c, 0x68, 0x68, 0x02, 0x89, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x3e, 0x00, 0x00, 0x25, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x01, 0xea, 0x3d, 0x70, 0x37, 0xcc, 0xf1, 0xc4, 0xbc, 0xa2, 0xc4, 0xbc, 0xa1, 0x4e, 0x80, 0x2a, 0x0b, 0x98, 0x90, 0x36, 0x70, 0x37, 0x01, 0x21, 0x61, 0x73, 0x73, 0x61, 0x63, 0x72, 0x72, 0xfe, 0xfa, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0xae, 0x18, 0x18, 0x01, 0x51, 0x01, 0x1a, 0x01, 0x2f, 0x01, 0x3d, 0xde, 0xb8, 0xbc, 0xd9, 0x4a, 0x44, 0xdb, 0xd7, 0x1e, 0x1d, 0x01, 0x67, 0x95, 0x82, 0x81, 0x95, 0x95, 0x81, 0x82, 0x95, 0x03, 0x95, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x20, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x01, 0x15, 0x21, 0x35, 0x23, 0x11, 0x23, 0x07, 0x15, 0x37, 0x11, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x04, 0x23, 0x5b, 0x5a, 0x5a, 0x5b, 0x5a, 0x5a, 0x5a, 0xeb, 0xfe, 0xde, 0x98, 0x98, 0x01, 0x22, 0x99, 0xfc, 0x03, 0x01, 0x95, 0x91, 0x74, 0xa1, 0xa2, 0x87, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x04, 0xd5, 0xf5, 0xf7, 0xf5, 0xf6, 0xf6, 0xf5, 0xf7, 0xf5, 0x80, 0xfe, 0xc3, 0xfe, 0xd1, 0xfe, 0xd3, 0xfe, 0xc2, 0x01, 0x3e, 0x01, 0x2d, 0x01, 0x2f, 0xfd, 0x05, 0x88, 0x88, 0x04, 0x23, 0x26, 0x93, 0x25, 0xfc, 0x71, 0x05, 0x20, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0x9a, 0x05, 0xaf, 0x04, 0x6a, 0x00, 0x08, 0x00, 0x00, 0x09, 0x01, 0x21, 0x01, 0x21, 0x35, 0x21, 0x01, 0x21, 0x05, 0xae, 0xfe, 0x49, 0xfe, 0xe0, 0x01, 0x4b, 0xfc, 0x47, 0x03, 0xb9, 0xfe, 0xb5, 0x01, 0x20, 0x02, 0x82, 0xfe, 0x18, 0x01, 0x70, 0xf0, 0x01, 0x70, 0x00, 0x01, 0x00, 0xe2, 0x00, 0x70, 0x04, 0xe9, 0x04, 0xe9, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x37, 0x01, 0x1b, 0x01, 0x25, 0x03, 0x92, 0xfd, 0x51, 0x98, 0x02, 0x70, 0xbe, 0x3f, 0xfd, 0x93, 0x01, 0x8b, 0x02, 0xb4, 0xaa, 0xfd, 0x05, 0x01, 0x34, 0xfd, 0x4e, 0x47, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x35, 0x05, 0x03, 0x09, 0x01, 0x04, 0x07, 0xfc, 0x62, 0x03, 0x9e, 0x3d, 0x01, 0xe4, 0xfe, 0x1c, 0x02, 0x3c, 0x32, 0xf0, 0x32, 0x01, 0x70, 0xfe, 0x4a, 0xfe, 0x4a, 0x00, 0x00, 0x01, 0x00, 0xe2, 0x00, 0x1b, 0x04, 0xe9, 0x04, 0x94, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x27, 0x01, 0x2d, 0x01, 0x03, 0x03, 0xeb, 0xfd, 0x90, 0x98, 0x02, 0xaf, 0xfe, 0xe9, 0x02, 0x6d, 0x3f, 0x03, 0x16, 0xfd, 0x05, 0xaa, 0x02, 0xb4, 0xd4, 0x47, 0xfd, 0x4e, 0x00, 0x01, 0x00, 0x69, 0x01, 0x08, 0x05, 0xaf, 0x03, 0xfc, 0x00, 0x08, 0x00, 0x00, 0x13, 0x21, 0x03, 0x04, 0x05, 0x04, 0x05, 0x13, 0x21, 0x69, 0x02, 0x75, 0x97, 0x01, 0x39, 0x02, 0x2e, 0xfd, 0xd2, 0xfe, 0xc7, 0x97, 0xfd, 0x8b, 0x02, 0xbe, 0x01, 0x3e, 0xfc, 0x7e, 0x7e, 0xfc, 0x01, 0x3e, 0x00, 0x01, 0x00, 0x69, 0x00, 0x75, 0x05, 0x81, 0x04, 0x8f, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x14, 0x06, 0x07, 0x01, 0x06, 0x07, 0x06, 0x22, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x21, 0x22, 0x2e, 0x02, 0x34, 0x3e, 0x02, 0x33, 0x21, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x17, 0x01, 0x16, 0x05, 0x80, 0x12, 0x0f, 0xfe, 0x98, 0x0e, 0x16, 0x14, 0x2e, 0x28, 0x10, 0x10, 0x11, 0x12, 0x0f, 0xa7, 0xfc, 0xda, 0x18, 0x27, 0x21, 0x11, 0x11, 0x21, 0x27, 0x18, 0x03, 0x26, 0xa7, 0x0f, 0x12, 0x11, 0x10, 0x10, 0x28, 0x2e, 0x14, 0x16, 0x0e, 0x01, 0x68, 0x11, 0x02, 0x9b, 0x32, 0x2e, 0x11, 0xfe, 0x70, 0x10, 0x0b, 0x0a, 0x14, 0x11, 0x13, 0x2c, 0x19, 0x1a, 0x2e, 0x11, 0xba, 0x14, 0x22, 0x2e, 0x32, 0x2e, 0x22, 0x14, 0xba, 0x11, 0x2e, 0x1a, 0x19, 0x2c, 0x13, 0x11, 0x14, 0x0a, 0x0b, 0x10, 0xfe, 0x70, 0x13, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x11, 0x09, 0x01, 0x04, 0x24, 0xfc, 0x45, 0x03, 0xbb, 0x01, 0x8a, 0xfe, 0x76, 0x02, 0x5a, 0x50, 0x01, 0x8e, 0xfe, 0x4a, 0xfe, 0x4a, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x11, 0x09, 0x01, 0x04, 0x24, 0xfc, 0x45, 0x03, 0xbb, 0x01, 0x8a, 0xfe, 0x76, 0x02, 0x14, 0xdc, 0x01, 0x48, 0xfe, 0x4a, 0xfe, 0x4a, 0x00, 0x04, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x01, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x03, 0x23, 0x11, 0x33, 0x01, 0x21, 0x11, 0x21, 0x35, 0x09, 0x01, 0x02, 0x73, 0xd8, 0xd8, 0xfe, 0xe0, 0x6c, 0x6c, 0xb4, 0x36, 0x36, 0x03, 0x85, 0xfe, 0x97, 0x01, 0x69, 0x01, 0x8a, 0xfe, 0x76, 0x01, 0xba, 0x01, 0x90, 0xfe, 0x70, 0x01, 0x90, 0xfe, 0x70, 0x01, 0x90, 0xfe, 0x70, 0x01, 0x90, 0xee, 0xfe, 0x4a, 0xfe, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x01, 0x35, 0x12, 0x17, 0x06, 0x03, 0x35, 0x21, 0x11, 0x03, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x03, 0x23, 0x11, 0x33, 0x04, 0x24, 0xa6, 0xe4, 0xe4, 0xa6, 0xfe, 0x97, 0x48, 0xd8, 0xd8, 0xfe, 0xe0, 0x6c, 0x6c, 0xb4, 0x36, 0x36, 0x03, 0xae, 0x8a, 0xfe, 0xce, 0x84, 0x84, 0xfe, 0xce, 0x8a, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0x58, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0x86, 0x05, 0xd7, 0x04, 0x7e, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x11, 0x21, 0x11, 0x21, 0x04, 0x0e, 0x01, 0xc9, 0xfe, 0x37, 0xfc, 0x5b, 0x03, 0xa5, 0x04, 0x7e, 0xfe, 0x04, 0xfe, 0x04, 0x01, 0x11, 0x01, 0xd6, 0x00, 0x02, 0x00, 0xcd, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x01, 0x13, 0x09, 0x02, 0x02, 0xce, 0x01, 0xfe, 0xfd, 0x0f, 0x87, 0xfe, 0x6b, 0x04, 0xe1, 0xfb, 0x1f, 0x02, 0x82, 0x01, 0x0f, 0xfe, 0xf1, 0x01, 0xc2, 0xfe, 0x3e, 0xfe, 0x3e, 0x00, 0x00, 0x02, 0x00, 0xcd, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x01, 0x03, 0x01, 0x21, 0x09, 0x02, 0x02, 0xce, 0xf3, 0x02, 0xf1, 0xfd, 0x96, 0xfe, 0x6b, 0x04, 0xe1, 0xfb, 0x1f, 0x02, 0x82, 0xfe, 0xf1, 0x01, 0x0f, 0x01, 0xc2, 0xfe, 0x3e, 0xfe, 0x3e, 0x00, 0x00, 0x01, 0x00, 0xcd, 0xff, 0xf8, 0x05, 0xaf, 0x05, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x09, 0x03, 0x02, 0x08, 0xfe, 0xc5, 0x04, 0xe1, 0xfb, 0x1f, 0x02, 0x82, 0x02, 0x8a, 0xfd, 0x76, 0xfd, 0x76, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x62, 0x00, 0x14, 0x00, 0x00, 0x13, 0x11, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x21, 0x35, 0x09, 0x01, 0x35, 0x21, 0x20, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x69, 0x21, 0x1f, 0x20, 0x26, 0x26, 0x0b, 0x03, 0x04, 0x01, 0x8a, 0xfe, 0x76, 0xfe, 0x79, 0xfe, 0x78, 0x26, 0x26, 0x20, 0x1f, 0x21, 0x02, 0x82, 0x01, 0xe0, 0x30, 0x55, 0x25, 0x21, 0x13, 0x12, 0xc6, 0xfe, 0x4a, 0xfe, 0x4a, 0xc6, 0x12, 0x13, 0x21, 0x25, 0x55, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xa2, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x14, 0x00, 0x00, 0x13, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x35, 0x09, 0x01, 0x35, 0x21, 0x20, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x69, 0x21, 0x1f, 0x20, 0x26, 0x26, 0x0b, 0x03, 0x04, 0x01, 0x8a, 0xfe, 0x76, 0xfe, 0x79, 0xfe, 0x78, 0x26, 0x26, 0x20, 0x1f, 0x21, 0x02, 0x82, 0x30, 0x55, 0x25, 0x21, 0x13, 0x12, 0xc6, 0xfe, 0x4a, 0xfe, 0x4a, 0xc6, 0x12, 0x13, 0x21, 0x25, 0x55, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xba, 0xff, 0xf1, 0x04, 0x5d, 0x05, 0x13, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x09, 0x01, 0x03, 0x08, 0xfe, 0xb3, 0x01, 0x4d, 0x01, 0x55, 0xfe, 0xab, 0x01, 0x56, 0x02, 0x58, 0x01, 0x65, 0xfd, 0x6f, 0xfd, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x12, 0x05, 0x04, 0x03, 0x35, 0x21, 0x11, 0x03, 0x9d, 0x82, 0x01, 0x8f, 0xfe, 0x71, 0x82, 0xfc, 0xcc, 0x03, 0x9a, 0x9e, 0xfe, 0xce, 0x84, 0x84, 0xfe, 0xce, 0x9e, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0x9a, 0x05, 0x82, 0x04, 0x6a, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x35, 0x21, 0x11, 0x21, 0x35, 0x33, 0x09, 0x01, 0x03, 0x15, 0x09, 0x01, 0x15, 0x21, 0x11, 0x02, 0xe9, 0xfd, 0x80, 0x02, 0x80, 0xe1, 0x01, 0xb7, 0xfe, 0x49, 0x99, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0x80, 0x9a, 0xee, 0x01, 0xf4, 0xee, 0xfe, 0x18, 0xfe, 0x18, 0x01, 0x3e, 0xee, 0x01, 0x98, 0x01, 0x98, 0xee, 0xfe, 0xac, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0x9a, 0x05, 0x82, 0x04, 0x6a, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x35, 0x21, 0x11, 0x21, 0x35, 0x33, 0x09, 0x01, 0x03, 0x15, 0x09, 0x01, 0x15, 0x21, 0x11, 0x02, 0xe9, 0xfd, 0x80, 0x02, 0x80, 0xe1, 0x01, 0xb7, 0xfe, 0x49, 0x12, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0x80, 0x9a, 0xee, 0x01, 0xf4, 0xee, 0xfe, 0x18, 0xfe, 0x18, 0x01, 0x3e, 0xee, 0x01, 0x98, 0x01, 0x98, 0xee, 0xfe, 0xac, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x26, 0x00, 0x18, 0x05, 0xb8, 0x04, 0xb0, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x13, 0x01, 0x21, 0x37, 0x33, 0x13, 0x15, 0x01, 0x23, 0x35, 0x37, 0x21, 0x01, 0x07, 0x01, 0x03, 0x07, 0x21, 0x03, 0x27, 0x01, 0x03, 0x02, 0xf5, 0x7c, 0x5a, 0xc2, 0xfd, 0x6f, 0x87, 0x14, 0xfd, 0x74, 0x03, 0x6f, 0x7c, 0x02, 0x43, 0x9a, 0x7d, 0xfd, 0x0c, 0xb1, 0x01, 0xce, 0x01, 0xf4, 0xee, 0xfd, 0xfe, 0xc8, 0xfe, 0x32, 0xc8, 0x26, 0x01, 0x18, 0xee, 0x01, 0x98, 0x01, 0x98, 0xee, 0xfe, 0xac, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x26, 0x00, 0x18, 0x05, 0xb8, 0x04, 0xb0, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x13, 0x35, 0x21, 0x27, 0x35, 0x33, 0x01, 0x15, 0x03, 0x23, 0x27, 0x21, 0x01, 0x21, 0x13, 0x21, 0x17, 0x13, 0x01, 0x27, 0x02, 0x8c, 0x14, 0x87, 0x02, 0x91, 0xc2, 0x5a, 0x7c, 0xfd, 0x0b, 0x02, 0x6c, 0xfd, 0x0b, 0xb1, 0x02, 0xf4, 0x7d, 0x9a, 0xfd, 0xbd, 0x02, 0xfa, 0xc8, 0x26, 0xc8, 0xfe, 0x32, 0xc8, 0xfd, 0xfe, 0xee, 0x01, 0xa4, 0xfe, 0xac, 0xee, 0x01, 0x98, 0x01, 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf9, 0x00, 0x00, 0x05, 0x94, 0x04, 0x98, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x00, 0x21, 0x27, 0x21, 0x27, 0x11, 0x21, 0x35, 0x33, 0x01, 0x17, 0x01, 0x03, 0x15, 0x09, 0x01, 0x15, 0x21, 0x11, 0x03, 0x79, 0x47, 0xfe, 0x21, 0x5a, 0x02, 0x26, 0x63, 0x01, 0xb7, 0x5a, 0xfe, 0x49, 0x75, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0xda, 0x9e, 0xc8, 0x02, 0x94, 0x9e, 0xfe, 0x18, 0xc8, 0xfe, 0x18, 0x01, 0xb6, 0x9e, 0x01, 0x98, 0x01, 0x98, 0x9e, 0xfe, 0x0c, 0x00, 0x00, 0x02, 0x00, 0xf9, 0x00, 0x00, 0x05, 0x94, 0x04, 0x98, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x01, 0x23, 0x35, 0x21, 0x11, 0x37, 0x21, 0x13, 0x21, 0x11, 0x21, 0x15, 0x09, 0x01, 0x03, 0x79, 0x63, 0x01, 0xb7, 0x5a, 0xfe, 0x49, 0x63, 0xfd, 0xda, 0x5a, 0x01, 0xdf, 0x35, 0xfd, 0xda, 0x02, 0x26, 0x01, 0x6f, 0xfe, 0x91, 0x04, 0x98, 0xfe, 0x18, 0xc8, 0xfe, 0x18, 0x9e, 0x02, 0x94, 0xc8, 0xfe, 0xe8, 0xfe, 0x0c, 0x9e, 0x01, 0x98, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x72, 0x00, 0x64, 0x05, 0xc1, 0x04, 0x98, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x13, 0x03, 0x21, 0x35, 0x33, 0x01, 0x17, 0x01, 0x23, 0x27, 0x35, 0x21, 0x27, 0x13, 0x07, 0x21, 0x15, 0x09, 0x01, 0x15, 0x21, 0xf9, 0x87, 0x03, 0x07, 0x63, 0x01, 0xb7, 0x2d, 0xfe, 0x49, 0x63, 0x2d, 0xfd, 0x26, 0x2d, 0xda, 0x66, 0x02, 0xdb, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0x25, 0x02, 0xb0, 0x01, 0x4a, 0x9e, 0xfe, 0x18, 0x64, 0xfe, 0x18, 0x63, 0x3b, 0x64, 0x01, 0x4a, 0xfa, 0x9e, 0x01, 0x98, 0x01, 0x98, 0x9e, 0x00, 0x02, 0x00, 0x72, 0x00, 0x64, 0x05, 0xc1, 0x04, 0x98, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x13, 0x03, 0x37, 0x21, 0x35, 0x37, 0x33, 0x01, 0x07, 0x01, 0x23, 0x35, 0x21, 0x13, 0x07, 0x21, 0x15, 0x09, 0x01, 0x15, 0x21, 0xf9, 0x87, 0x2d, 0x02, 0xda, 0x2d, 0x63, 0x01, 0xb7, 0x2d, 0xfe, 0x49, 0x63, 0xfc, 0xf9, 0xda, 0x66, 0x02, 0xdb, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0x25, 0x02, 0x4c, 0x01, 0x4a, 0x64, 0x3b, 0x63, 0xfe, 0x18, 0x64, 0xfe, 0x18, 0x9e, 0x01, 0x4a, 0xfa, 0x9e, 0x01, 0x98, 0x01, 0x98, 0x9e, 0x00, 0x01, 0x01, 0x1c, 0xff, 0xd8, 0x05, 0x31, 0x04, 0xaf, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x21, 0x15, 0x09, 0x01, 0x15, 0x01, 0x1c, 0x24, 0x3c, 0x51, 0x62, 0x64, 0x71, 0x6d, 0x69, 0x5e, 0x55, 0x51, 0x52, 0x4f, 0x54, 0x4e, 0x65, 0x64, 0xdf, 0x68, 0x5f, 0x54, 0x39, 0x25, 0x02, 0x1c, 0x01, 0x9c, 0xfe, 0x64, 0x03, 0x6e, 0x47, 0x43, 0x5a, 0x2e, 0x2f, 0x2f, 0x2b, 0x5d, 0x59, 0xdd, 0x80, 0x7a, 0xda, 0x5f, 0x58, 0x30, 0x2f, 0x2f, 0x2b, 0x5d, 0x3e, 0x49, 0x9e, 0x01, 0xca, 0x01, 0xca, 0x9e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x75, 0x01, 0x42, 0x05, 0xaf, 0x03, 0xc2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, 0x33, 0x37, 0x23, 0x07, 0x33, 0x37, 0x23, 0x07, 0x33, 0x37, 0x23, 0x07, 0x33, 0x37, 0x23, 0x35, 0x03, 0x21, 0x13, 0x21, 0x11, 0x16, 0x17, 0x06, 0x07, 0x11, 0x21, 0x03, 0x21, 0x01, 0x33, 0x27, 0x23, 0x17, 0x33, 0x27, 0x23, 0x17, 0x33, 0x27, 0x23, 0x17, 0x33, 0x27, 0x23, 0x02, 0x97, 0x90, 0x36, 0x90, 0xa2, 0x90, 0x36, 0x90, 0xa2, 0x90, 0x36, 0x90, 0xa2, 0x90, 0x36, 0x90, 0x6c, 0xa8, 0x01, 0xe6, 0xa8, 0x01, 0x60, 0x9c, 0xaf, 0xaf, 0x9c, 0xfe, 0xa0, 0xa8, 0xfe, 0x1a, 0x02, 0x22, 0x36, 0x90, 0x36, 0x24, 0x36, 0x90, 0x36, 0x24, 0x36, 0x90, 0x36, 0x24, 0x36, 0x90, 0x36, 0x02, 0x5a, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x50, 0x01, 0x18, 0xfe, 0xe8, 0x01, 0x16, 0xbc, 0x82, 0x82, 0xbc, 0x01, 0x16, 0xfe, 0xe8, 0x01, 0x68, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x94, 0x00, 0x70, 0x04, 0xe9, 0x05, 0x3e, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x01, 0x37, 0x06, 0x15, 0x14, 0x17, 0x26, 0x23, 0x22, 0x07, 0x37, 0x27, 0x37, 0x09, 0x01, 0x23, 0x01, 0x25, 0x11, 0x01, 0x11, 0x04, 0x2b, 0x9e, 0x06, 0x25, 0x7f, 0x94, 0x3b, 0x3f, 0x9d, 0xe4, 0x32, 0xfe, 0x4d, 0x01, 0x7f, 0xff, 0xfe, 0x81, 0x01, 0x33, 0x01, 0x7e, 0x01, 0x7b, 0xb0, 0x46, 0x43, 0xa3, 0x8f, 0x2a, 0x07, 0xb0, 0xfe, 0x39, 0x01, 0x6f, 0xfe, 0x58, 0x01, 0xa8, 0x3a, 0x01, 0x1b, 0xfe, 0x57, 0xfe, 0xe6, 0x00, 0x00, 0x03, 0x00, 0x69, 0x01, 0x62, 0x05, 0xaf, 0x03, 0xa2, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x00, 0x01, 0x35, 0x16, 0x17, 0x06, 0x07, 0x35, 0x21, 0x35, 0x05, 0x21, 0x07, 0x21, 0x13, 0x27, 0x21, 0x17, 0x04, 0x7e, 0x8b, 0xa5, 0xa5, 0x8b, 0xfe, 0xbc, 0xfd, 0xe3, 0x02, 0x1c, 0xb4, 0xfd, 0xe4, 0xb4, 0xb4, 0x02, 0x1c, 0xb4, 0x02, 0xaa, 0xf8, 0xbc, 0x64, 0x64, 0xbc, 0xf8, 0x50, 0x52, 0xc8, 0x01, 0x1a, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x03, 0x00, 0x96, 0xff, 0xc5, 0x04, 0xe9, 0x04, 0x94, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x01, 0x27, 0x16, 0x33, 0x32, 0x37, 0x06, 0x15, 0x14, 0x17, 0x27, 0x07, 0x27, 0x09, 0x01, 0x11, 0x01, 0x03, 0x23, 0x01, 0x21, 0x03, 0xf8, 0x9d, 0x3f, 0x3b, 0x94, 0x7f, 0x25, 0x06, 0x9e, 0xe5, 0x32, 0xfe, 0xb5, 0x01, 0x7e, 0xfe, 0x82, 0x34, 0xff, 0x01, 0x7e, 0x00, 0xff, 0x03, 0xc1, 0xb0, 0x07, 0x2a, 0x90, 0xa2, 0x43, 0x46, 0xb0, 0xff, 0x39, 0xfe, 0x1d, 0x01, 0xa8, 0xfe, 0xe5, 0xfe, 0x58, 0x01, 0x55, 0x01, 0xa8, 0x00, 0x00, 0x01, 0x00, 0x96, 0x00, 0x70, 0x04, 0xe9, 0x05, 0x3e, 0x00, 0x2a, 0x00, 0x00, 0x25, 0x26, 0x23, 0x22, 0x07, 0x3e, 0x01, 0x37, 0x27, 0x26, 0x27, 0x26, 0x22, 0x06, 0x07, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x37, 0x26, 0x35, 0x34, 0x36, 0x37, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x17, 0x01, 0x3e, 0x01, 0x37, 0x06, 0x15, 0x14, 0x04, 0xe8, 0x80, 0x95, 0x3b, 0x3e, 0x40, 0x74, 0x15, 0x95, 0x96, 0x1f, 0x22, 0x46, 0x44, 0x19, 0xfe, 0x82, 0x21, 0x4e, 0x2a, 0x28, 0x2b, 0x13, 0x05, 0x12, 0x21, 0x1e, 0x01, 0x7e, 0x1d, 0x16, 0x0c, 0x0e, 0x06, 0x01, 0x24, 0x03, 0x30, 0x41, 0x06, 0x70, 0x2a, 0x07, 0x47, 0x36, 0x03, 0xa6, 0xa6, 0x0e, 0x0f, 0x1e, 0x1c, 0x01, 0xa8, 0x24, 0x22, 0x12, 0x08, 0x21, 0x30, 0x2c, 0x30, 0x59, 0x22, 0xfe, 0x57, 0x21, 0x46, 0x26, 0x27, 0x26, 0x23, 0x07, 0xfe, 0xbb, 0x17, 0x81, 0x47, 0x47, 0x43, 0xa3, 0x00, 0x00, 0x01, 0x00, 0x69, 0x01, 0x61, 0x05, 0xaf, 0x03, 0xa3, 0x00, 0x27, 0x00, 0x00, 0x01, 0x06, 0x07, 0x34, 0x36, 0x37, 0x23, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x21, 0x34, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x21, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x21, 0x2e, 0x01, 0x35, 0x16, 0x05, 0xae, 0xa4, 0x8c, 0x30, 0x0c, 0xd3, 0xd3, 0x1f, 0x21, 0x1a, 0x19, 0x1c, 0xfd, 0xe4, 0x22, 0x1e, 0x1c, 0x2a, 0x13, 0x13, 0x2a, 0x1c, 0x1e, 0x22, 0x02, 0x1c, 0x1c, 0x19, 0x1a, 0x21, 0x1f, 0x09, 0x01, 0x9d, 0x0c, 0x30, 0x8c, 0x02, 0x82, 0x65, 0xbc, 0x65, 0x81, 0x13, 0x0f, 0x10, 0x1c, 0x1b, 0x4a, 0x28, 0x30, 0x59, 0x21, 0x1f, 0x15, 0x09, 0x1b, 0x15, 0x1f, 0x22, 0x58, 0x30, 0x28, 0x4a, 0x1b, 0x1c, 0x10, 0x0f, 0x13, 0x81, 0x65, 0xbc, 0x00, 0x00, 0x01, 0x00, 0x96, 0xff, 0xc6, 0x04, 0xe9, 0x04, 0x94, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x17, 0x2e, 0x01, 0x27, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x06, 0x23, 0x22, 0x26, 0x27, 0x01, 0x1e, 0x01, 0x32, 0x37, 0x36, 0x37, 0x01, 0x2e, 0x01, 0x27, 0x16, 0x33, 0x32, 0x04, 0xe8, 0x24, 0x06, 0x41, 0x30, 0x03, 0x97, 0x96, 0x0b, 0x0c, 0x1a, 0x19, 0xfe, 0x82, 0x1e, 0x21, 0x12, 0x07, 0x1f, 0x2b, 0x28, 0x2b, 0x4f, 0x1f, 0x01, 0x7e, 0x19, 0x44, 0x46, 0x22, 0x1f, 0x07, 0x01, 0x24, 0x15, 0x74, 0x40, 0x3e, 0x3b, 0x95, 0x04, 0x94, 0x8e, 0xa3, 0x43, 0x47, 0x47, 0x81, 0x17, 0xa8, 0xa8, 0x1f, 0x26, 0x27, 0x26, 0x4b, 0x1c, 0xfe, 0x57, 0x22, 0x59, 0x30, 0x2c, 0x30, 0x15, 0x04, 0x12, 0x24, 0x22, 0x01, 0xa8, 0x1c, 0x1e, 0x0f, 0x0e, 0x07, 0x01, 0x45, 0x03, 0x36, 0x47, 0x07, 0x00, 0x03, 0x00, 0x67, 0x00, 0xac, 0x05, 0xaf, 0x04, 0x58, 0x00, 0x14, 0x00, 0x27, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x36, 0x25, 0x06, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x24, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x04, 0x05, 0x04, 0x05, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x12, 0x17, 0x24, 0x03, 0xc4, 0xdd, 0x01, 0x0d, 0xcc, 0x6e, 0x0a, 0x13, 0x14, 0x19, 0x17, 0x38, 0x17, 0x18, 0x14, 0x13, 0x15, 0x15, 0x13, 0x14, 0xfc, 0xbc, 0x1c, 0x19, 0x1a, 0x20, 0x20, 0x49, 0x20, 0x01, 0x3e, 0x03, 0x0f, 0xfc, 0xdb, 0xfe, 0xd8, 0x20, 0x49, 0x20, 0x25, 0x15, 0x1b, 0x03, 0x42, 0x18, 0x14, 0x13, 0x15, 0x15, 0x13, 0x14, 0x18, 0x17, 0x38, 0x17, 0x19, 0x14, 0x10, 0x0d, 0x6c, 0xce, 0xfe, 0xb9, 0x01, 0xce, 0x62, 0x51, 0x75, 0xfe, 0xfd, 0x1d, 0x14, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x14, 0x38, 0x1f, 0x1e, 0x38, 0x14, 0x15, 0x97, 0x52, 0x4b, 0x1a, 0x1c, 0x10, 0x0f, 0x0e, 0x85, 0x36, 0x38, 0x83, 0x0e, 0x0f, 0x12, 0x1a, 0x1f, 0x01, 0x23, 0x0c, 0x15, 0x14, 0x38, 0x1e, 0x1f, 0x38, 0x14, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x11, 0x20, 0xfe, 0xfe, 0x76, 0x63, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x87, 0x01, 0x1f, 0x05, 0x9d, 0x03, 0xe5, 0x00, 0x1a, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x05, 0x04, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x25, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x16, 0x17, 0x06, 0x07, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x87, 0x3b, 0x1a, 0x1d, 0x12, 0x23, 0x24, 0x26, 0x2a, 0x30, 0x2f, 0x36, 0x2e, 0x92, 0x01, 0x69, 0xfe, 0x97, 0x92, 0x33, 0x62, 0x2e, 0x2d, 0x23, 0x34, 0x13, 0x1a, 0x15, 0x1a, 0x03, 0x9f, 0x21, 0x21, 0x21, 0x21, 0x59, 0xe2, 0xe2, 0x59, 0x21, 0x21, 0x21, 0x02, 0x82, 0x26, 0x3a, 0x3f, 0x13, 0x24, 0x12, 0x13, 0x13, 0x16, 0x20, 0x66, 0x4c, 0x4c, 0x66, 0x23, 0x26, 0x13, 0x1d, 0x19, 0x23, 0x2f, 0x3a, 0x26, 0x27, 0x58, 0x32, 0x33, 0x58, 0x27, 0xf1, 0x72, 0x72, 0xf1, 0x27, 0x58, 0x33, 0x32, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x91, 0x01, 0x56, 0x05, 0x94, 0x03, 0xae, 0x00, 0x63, 0x00, 0x00, 0x00, 0x14, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x21, 0x22, 0x2e, 0x02, 0x34, 0x3f, 0x01, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x05, 0x93, 0x05, 0x05, 0xd8, 0x04, 0x08, 0x06, 0x0f, 0x06, 0x06, 0x06, 0x05, 0x06, 0x03, 0x18, 0x03, 0x05, 0x06, 0x04, 0x07, 0x08, 0x06, 0xfe, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, 0x51, 0x05, 0x02, 0x06, 0x07, 0x05, 0x07, 0xfd, 0xd9, 0x07, 0x0d, 0x0b, 0x05, 0x02, 0x35, 0x35, 0x01, 0x69, 0x02, 0x05, 0x06, 0x05, 0x06, 0x07, 0x07, 0x02, 0x27, 0x07, 0x05, 0x08, 0x05, 0x02, 0x05, 0x51, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0xfe, 0x06, 0x08, 0x07, 0x04, 0x06, 0x05, 0x03, 0x18, 0x03, 0x06, 0x05, 0x06, 0x06, 0x06, 0x0f, 0x06, 0x08, 0x04, 0xd8, 0x05, 0x02, 0x8b, 0x12, 0x0e, 0x06, 0xf0, 0x04, 0x05, 0x03, 0x03, 0x04, 0x05, 0x06, 0x0e, 0x09, 0x04, 0x0b, 0x63, 0x0b, 0x05, 0x07, 0x0f, 0x06, 0x05, 0x03, 0x04, 0x03, 0x04, 0x05, 0x05, 0x08, 0xb4, 0x0a, 0x03, 0x05, 0x04, 0x03, 0x06, 0x0c, 0x0e, 0x12, 0x06, 0x75, 0x75, 0x14, 0x02, 0xe8, 0x06, 0x12, 0x0e, 0x06, 0x05, 0x04, 0x03, 0x03, 0x03, 0x06, 0x03, 0x0a, 0xb4, 0x08, 0x05, 0x05, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x0f, 0x07, 0x05, 0x0b, 0x63, 0x0b, 0x04, 0x09, 0x0e, 0x06, 0x05, 0x04, 0x03, 0x03, 0x05, 0x04, 0xf0, 0x06, 0x00, 0x00, 0x01, 0x00, 0x91, 0x00, 0xf1, 0x05, 0x94, 0x04, 0x13, 0x00, 0x63, 0x00, 0x00, 0x00, 0x14, 0x06, 0x07, 0x01, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x21, 0x22, 0x2e, 0x02, 0x34, 0x3f, 0x01, 0x36, 0x34, 0x27, 0x03, 0x26, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x13, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x01, 0x16, 0x05, 0x93, 0x05, 0x05, 0xfe, 0x98, 0x05, 0x07, 0x06, 0x0f, 0x06, 0x06, 0x06, 0x05, 0x06, 0x03, 0x4e, 0x03, 0x05, 0x06, 0x04, 0x07, 0x08, 0x06, 0x53, 0x07, 0x06, 0x07, 0x05, 0x04, 0x04, 0x6c, 0x05, 0x02, 0x06, 0x07, 0x05, 0x07, 0xfd, 0xac, 0x07, 0x0d, 0x0b, 0x05, 0x03, 0x42, 0x42, 0x01, 0x8d, 0x02, 0x05, 0x06, 0x05, 0x06, 0x07, 0x07, 0x02, 0x54, 0x07, 0x05, 0x08, 0x05, 0x03, 0x04, 0x75, 0x04, 0x04, 0x05, 0x07, 0x06, 0x07, 0x53, 0x06, 0x08, 0x07, 0x04, 0x06, 0x05, 0x03, 0x4e, 0x03, 0x06, 0x05, 0x06, 0x06, 0x06, 0x0f, 0x06, 0x07, 0x05, 0x01, 0x68, 0x05, 0x02, 0x8b, 0x12, 0x0f, 0x05, 0xfe, 0x98, 0x05, 0x04, 0x03, 0x03, 0x04, 0x05, 0x06, 0x0e, 0x09, 0x07, 0x08, 0xdb, 0x08, 0x08, 0x07, 0x0f, 0x06, 0x05, 0x03, 0x04, 0x03, 0x04, 0x05, 0x05, 0x08, 0xf0, 0x0a, 0x03, 0x05, 0x04, 0x03, 0x06, 0x0c, 0x0e, 0x12, 0x06, 0x93, 0x93, 0x14, 0x02, 0x01, 0x38, 0x06, 0x12, 0x0e, 0x06, 0x05, 0x04, 0x03, 0x03, 0x03, 0x06, 0x03, 0x0a, 0xfe, 0xfc, 0x08, 0x05, 0x05, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x0f, 0x07, 0x08, 0x08, 0xdb, 0x08, 0x07, 0x09, 0x0e, 0x06, 0x05, 0x04, 0x03, 0x03, 0x04, 0x05, 0xfe, 0x98, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x69, 0x00, 0xa6, 0x05, 0xaf, 0x04, 0x5e, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x07, 0x23, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x33, 0x16, 0x17, 0x16, 0x01, 0x23, 0x3e, 0x01, 0x37, 0x21, 0x35, 0x21, 0x0e, 0x01, 0x03, 0x1e, 0x01, 0x17, 0x21, 0x35, 0x21, 0x2e, 0x01, 0x27, 0x05, 0xae, 0x7a, 0x4b, 0x7e, 0x42, 0x61, 0x29, 0x29, 0x90, 0x22, 0x40, 0x40, 0x22, 0x90, 0x12, 0x40, 0x61, 0x41, 0x7f, 0x4b, 0xfe, 0x04, 0x5e, 0x11, 0x31, 0x26, 0xfd, 0x27, 0x03, 0x82, 0x63, 0x44, 0x0c, 0x0c, 0x44, 0x63, 0xfc, 0x7e, 0x02, 0xd9, 0x26, 0x31, 0x11, 0x02, 0x82, 0x4f, 0x55, 0x8f, 0xa9, 0x6e, 0x6d, 0xa4, 0x27, 0x36, 0x36, 0x27, 0xa4, 0x31, 0xaa, 0xa4, 0x94, 0x55, 0xfd, 0xd5, 0x3d, 0x85, 0x48, 0x64, 0x8e, 0xb7, 0x03, 0x8f, 0x29, 0xb7, 0x8e, 0x64, 0x48, 0x85, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xfe, 0xb2, 0x02, 0x88, 0x06, 0x26, 0x00, 0x19, 0x00, 0x00, 0x01, 0x2a, 0x01, 0x27, 0x24, 0x03, 0x26, 0x00, 0x27, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x37, 0x36, 0x15, 0x14, 0x00, 0x07, 0x06, 0x05, 0x16, 0x36, 0x37, 0x02, 0x88, 0x08, 0x5e, 0x31, 0xfe, 0x74, 0x02, 0x01, 0x01, 0x49, 0x04, 0x03, 0x54, 0x34, 0x29, 0x7a, 0x2d, 0xc0, 0xc8, 0xfe, 0xd2, 0x07, 0x0b, 0x01, 0x00, 0x4a, 0x3e, 0x12, 0xfe, 0xb2, 0x0b, 0x53, 0x01, 0x52, 0xae, 0x03, 0xf5, 0x51, 0x4f, 0x89, 0x31, 0xd8, 0x01, 0x01, 0xcc, 0xa1, 0xfc, 0x4c, 0x8f, 0xdc, 0x48, 0x15, 0x01, 0x02, 0x00, 0x00, 0x01, 0x00, 0x47, 0xfe, 0xb2, 0x02, 0x6d, 0x06, 0x26, 0x00, 0x19, 0x00, 0x00, 0x13, 0x35, 0x1e, 0x01, 0x37, 0x24, 0x27, 0x26, 0x00, 0x35, 0x34, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x06, 0x00, 0x07, 0x02, 0x05, 0x06, 0x22, 0x47, 0x12, 0x3e, 0x4a, 0x01, 0x00, 0x0b, 0x06, 0xfe, 0xd1, 0xc8, 0xc0, 0x2d, 0x7a, 0x28, 0x35, 0x54, 0x03, 0x04, 0x01, 0x49, 0x01, 0x02, 0xfe, 0x74, 0x31, 0x5e, 0xfe, 0xb2, 0x8f, 0x02, 0x01, 0x15, 0x48, 0xdc, 0x8f, 0x03, 0xb4, 0xa1, 0xcc, 0x01, 0x01, 0xd8, 0x31, 0x89, 0x4f, 0x51, 0xfc, 0x0b, 0xae, 0xfe, 0xae, 0x53, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0xfe, 0x23, 0x03, 0x8a, 0x06, 0x75, 0x00, 0x03, 0x00, 0x06, 0x00, 0x09, 0x00, 0x00, 0x09, 0x05, 0x21, 0x09, 0x01, 0x21, 0x01, 0xc6, 0x01, 0xc3, 0xfe, 0x3d, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0xbc, 0x02, 0x8a, 0xfe, 0xba, 0x01, 0x46, 0xfd, 0x76, 0x06, 0x75, 0xfb, 0xdb, 0xfb, 0xd3, 0x04, 0x2d, 0x03, 0x31, 0xfd, 0x08, 0xfc, 0x8e, 0x03, 0x00, 0x00, 0x02, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0xdf, 0x06, 0x14, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x25, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0xf8, 0xb4, 0xfe, 0xf2, 0x02, 0x40, 0xd8, 0xd8, 0xfd, 0xc0, 0x05, 0xb0, 0xf9, 0xa6, 0x06, 0x5a, 0x64, 0x64, 0xf9, 0xa6, 0x64, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xf2, 0x02, 0xde, 0x06, 0x14, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x11, 0x33, 0x13, 0x11, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x02, 0x84, 0xb4, 0xb4, 0x5a, 0xfd, 0xc0, 0xd8, 0xd8, 0x05, 0xb0, 0xf9, 0xa6, 0x06, 0xbe, 0xf8, 0xde, 0x64, 0x06, 0x5a, 0x64, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa4, 0xfe, 0xf2, 0x02, 0x3c, 0x06, 0x12, 0x00, 0x05, 0x00, 0x00, 0x1b, 0x01, 0x33, 0x03, 0x13, 0x23, 0xa5, 0xfd, 0x9a, 0xfe, 0xfe, 0x9a, 0x02, 0x82, 0x03, 0x90, 0xfc, 0x70, 0xfc, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x93, 0xfe, 0xf2, 0x02, 0x2b, 0x06, 0x12, 0x00, 0x05, 0x00, 0x00, 0x01, 0x03, 0x23, 0x13, 0x03, 0x33, 0x02, 0x2a, 0xfd, 0x99, 0xfd, 0xfd, 0x99, 0x02, 0x82, 0xfc, 0x70, 0x03, 0x90, 0x03, 0x90, 0x00, 0xff, 0xff, 0x00, 0xa4, 0xfe, 0xf2, 0x03, 0x6e, 0x06, 0x12, 0x10, 0x26, 0x0c, 0x97, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x97, 0x01, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, 0xfe, 0xf2, 0x03, 0x5d, 0x06, 0x12, 0x10, 0x26, 0x0c, 0x98, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x98, 0x01, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x05, 0xb9, 0x05, 0xdc, 0x00, 0x16, 0x00, 0x00, 0x09, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x27, 0x11, 0x23, 0x11, 0x27, 0x07, 0x11, 0x23, 0x11, 0x07, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x03, 0x2e, 0x02, 0x8a, 0x6c, 0x52, 0x6c, 0xbe, 0x6c, 0x5f, 0x5f, 0x6c, 0xbd, 0x6c, 0x53, 0x6c, 0x02, 0x8a, 0x05, 0xdc, 0xfd, 0x2c, 0x78, 0x5c, 0xfd, 0x14, 0x03, 0x65, 0xd3, 0xfb, 0xc8, 0x04, 0xb0, 0x68, 0x68, 0xfb, 0x50, 0x04, 0x38, 0xd3, 0xfc, 0x9b, 0x02, 0xec, 0x5c, 0x78, 0x02, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0xff, 0xf9, 0x05, 0xb7, 0x05, 0xd5, 0x00, 0x16, 0x00, 0x00, 0x05, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x17, 0x11, 0x33, 0x11, 0x17, 0x37, 0x11, 0x33, 0x11, 0x37, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x02, 0xda, 0xfd, 0x76, 0x6c, 0x53, 0x6c, 0xbd, 0x6c, 0x5f, 0x60, 0x6c, 0xbd, 0x6c, 0x52, 0x6c, 0xfd, 0x77, 0x07, 0x02, 0xd4, 0x78, 0x5c, 0x02, 0xec, 0xfc, 0x9b, 0xd3, 0x04, 0x38, 0xfb, 0x50, 0x68, 0x68, 0x04, 0xb0, 0xfb, 0xc8, 0xd3, 0x03, 0x65, 0xfd, 0x14, 0x5c, 0x78, 0xfd, 0x2c, 0x00, 0x01, 0x00, 0x47, 0x00, 0x6c, 0x05, 0xde, 0x05, 0x44, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x30, 0x37, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x02, 0x28, 0x6b, 0x39, 0x4a, 0x46, 0xab, 0x43, 0x4d, 0x36, 0x3c, 0x3b, 0x1e, 0x1f, 0x3a, 0x39, 0x4a, 0x46, 0xab, 0x43, 0x4d, 0x36, 0x3c, 0x1d, 0x15, 0x06, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9d, 0x6c, 0xd2, 0x07, 0x20, 0x2c, 0x50, 0x4b, 0x69, 0x5c, 0x78, 0x73, 0x61, 0x66, 0x4e, 0x52, 0x2a, 0x29, 0x29, 0x2a, 0x52, 0x4a, 0x6a, 0x5c, 0x78, 0x73, 0x61, 0x60, 0x01, 0x21, 0x78, 0x3f, 0x23, 0x21, 0x21, 0x27, 0x3b, 0x42, 0xa2, 0x5d, 0x59, 0x51, 0x53, 0x40, 0x3f, 0x23, 0x21, 0x21, 0x27, 0x3b, 0x42, 0x51, 0x39, 0x3f, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xe9, 0x60, 0x58, 0x71, 0x59, 0x53, 0x34, 0x2e, 0x2e, 0x30, 0x57, 0x59, 0x71, 0x70, 0x7b, 0x7f, 0x70, 0x71, 0x59, 0x53, 0x34, 0x2e, 0x2e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x00, 0x7c, 0x05, 0xde, 0x05, 0x54, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x03, 0xfd, 0x55, 0x5f, 0x62, 0x73, 0x78, 0x5c, 0x69, 0x4b, 0x50, 0x2c, 0x29, 0x29, 0x2c, 0x50, 0x4f, 0x65, 0x61, 0x73, 0x78, 0x5d, 0x68, 0x4c, 0x50, 0x2b, 0x20, 0x08, 0xd1, 0x6c, 0xfe, 0x9e, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0x07, 0x14, 0x1e, 0x3b, 0x36, 0x4e, 0x42, 0xac, 0x46, 0x4a, 0x39, 0x3a, 0x1f, 0x1e, 0x3c, 0x3b, 0x36, 0x4d, 0x43, 0xab, 0x46, 0x4a, 0x3a, 0x01, 0x31, 0x5a, 0x2d, 0x2e, 0x2e, 0x34, 0x53, 0x59, 0x71, 0x70, 0x7f, 0x7b, 0x70, 0x71, 0x59, 0x57, 0x30, 0x2e, 0x2e, 0x34, 0x53, 0x59, 0x71, 0x58, 0x60, 0xe9, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xea, 0x3f, 0x39, 0x51, 0x42, 0x3b, 0x27, 0x21, 0x21, 0x23, 0x3f, 0x40, 0x53, 0x51, 0x59, 0x5d, 0xa2, 0x42, 0x3b, 0x27, 0x21, 0x21, 0x23, 0x3f, 0x00, 0x03, 0x00, 0x69, 0xff, 0xe3, 0x07, 0xfb, 0x05, 0x24, 0x00, 0x25, 0x00, 0x39, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x27, 0x37, 0x24, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x11, 0x33, 0x11, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x07, 0xfb, 0xfe, 0x9e, 0x6c, 0xd2, 0xfe, 0xc3, 0x0a, 0x1d, 0x2d, 0x59, 0x58, 0xd6, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x1e, 0x0a, 0xaa, 0xaa, 0x09, 0x1f, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x59, 0x2d, 0x1e, 0x09, 0x01, 0x3d, 0xd2, 0x6c, 0xfd, 0x32, 0xc1, 0x53, 0x53, 0x44, 0x46, 0x22, 0x15, 0x08, 0x01, 0x83, 0x99, 0x01, 0x83, 0x08, 0x14, 0x23, 0x45, 0x44, 0x53, 0x01, 0x1b, 0xfe, 0x7d, 0x99, 0xfe, 0x7d, 0x09, 0x14, 0x22, 0x46, 0x44, 0x53, 0x53, 0xc1, 0x54, 0x53, 0x44, 0x45, 0x23, 0x13, 0x02, 0xaf, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x5a, 0x51, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x51, 0x5a, 0xaa, 0x5b, 0x52, 0x77, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x77, 0x52, 0x5b, 0xe9, 0x78, 0x56, 0x27, 0x27, 0x4c, 0x4d, 0x5c, 0x37, 0x3d, 0x01, 0x65, 0xfe, 0x9b, 0x3d, 0x37, 0x5c, 0x4d, 0x4c, 0x27, 0xfd, 0xc6, 0xfe, 0x9b, 0x01, 0x65, 0x3b, 0x36, 0x5c, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0x5c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xea, 0x04, 0x38, 0x00, 0x09, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x08, 0x93, 0xf7, 0x6d, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x09, 0x00, 0x00, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x09, 0xf8, 0xfe, 0x9f, 0x6c, 0xd1, 0xf7, 0x6d, 0x08, 0x93, 0xd1, 0x6c, 0x02, 0xaf, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x07, 0xa6, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xf8, 0x5a, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xe9, 0x78, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xea, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x01, 0x68, 0x08, 0x81, 0xf7, 0xeb, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x08, 0x15, 0xf7, 0x7f, 0x5e, 0x02, 0x19, 0x78, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0x78, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x37, 0x27, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x08, 0xea, 0x5f, 0x5f, 0xf7, 0x7f, 0x08, 0x15, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xf7, 0xeb, 0x02, 0x19, 0x69, 0x69, 0x78, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0x78, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x01, 0x21, 0x37, 0x27, 0x21, 0x07, 0x05, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x01, 0x68, 0x07, 0x82, 0x5f, 0x5f, 0xf8, 0x7e, 0x5e, 0x07, 0x74, 0xf9, 0x56, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x06, 0xaa, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x02, 0x19, 0x69, 0x69, 0x69, 0xe1, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xea, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x11, 0x23, 0x09, 0x50, 0xf8, 0x06, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x07, 0xfa, 0x99, 0x99, 0x02, 0x2d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x59, 0xfc, 0xa4, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x01, 0x02, 0x99, 0x99, 0x07, 0xfa, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0x02, 0x2d, 0xfe, 0xa7, 0x03, 0x5c, 0xfe, 0xa7, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xea, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x35, 0x33, 0x11, 0x23, 0x11, 0x35, 0x21, 0x07, 0x17, 0x09, 0x50, 0xf8, 0x84, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x07, 0x7c, 0x99, 0x99, 0xf8, 0x18, 0x5e, 0x5e, 0x01, 0xa1, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0xcd, 0xfc, 0xa4, 0x01, 0x45, 0xd2, 0x69, 0x69, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x15, 0x23, 0x11, 0x33, 0x11, 0x15, 0x21, 0x37, 0x27, 0x01, 0x02, 0x07, 0x7c, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xf8, 0x84, 0x99, 0x99, 0x07, 0xe8, 0x5f, 0x5f, 0x03, 0x63, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0xcd, 0x03, 0x5c, 0xfe, 0xbb, 0xd2, 0x69, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x25, 0x00, 0x00, 0x13, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x33, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x23, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x69, 0x3f, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x3f, 0x7d, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0x59, 0x63, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x3f, 0x02, 0xd7, 0x46, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x46, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x6e, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x46, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x05, 0x14, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x02, 0x1c, 0x04, 0x09, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x02, 0x1c, 0x01, 0xd3, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x02, 0x1c, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x05, 0x14, 0x04, 0x38, 0x06, 0x40, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x05, 0x14, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x02, 0xdd, 0x04, 0x38, 0x04, 0x09, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x00, 0xa7, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0xff, 0x9c, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0xff, 0x9c, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0xff, 0x9c, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x35, 0x33, 0x11, 0x23, 0x11, 0x35, 0x21, 0x07, 0x17, 0x05, 0x06, 0xfc, 0xce, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x03, 0x32, 0x99, 0x99, 0xfc, 0x62, 0x5e, 0x5e, 0x01, 0xa1, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0xcd, 0xfc, 0xa4, 0x01, 0x45, 0xd2, 0x69, 0x69, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x15, 0x23, 0x11, 0x33, 0x11, 0x15, 0x21, 0x37, 0x27, 0x01, 0x02, 0x03, 0x32, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xfc, 0xce, 0x99, 0x99, 0x03, 0x9e, 0x5f, 0x5f, 0x03, 0x63, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0xcd, 0x03, 0x5c, 0xfe, 0xbb, 0xd2, 0x69, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe6, 0x00, 0x00, 0x05, 0x22, 0x05, 0xdc, 0x00, 0x11, 0x00, 0x00, 0x13, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x27, 0x11, 0x23, 0x11, 0x07, 0x11, 0x23, 0x11, 0x07, 0xe6, 0x01, 0xf6, 0x51, 0x01, 0xf5, 0x6c, 0x53, 0x6c, 0xbd, 0x6c, 0xbd, 0x6c, 0x53, 0x03, 0xae, 0x02, 0x2e, 0xfd, 0xd2, 0x78, 0x5c, 0xfc, 0x6e, 0x04, 0x0a, 0xd3, 0xfb, 0x23, 0x04, 0xdd, 0xd3, 0xfb, 0xf6, 0x03, 0x92, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe6, 0xff, 0xf9, 0x05, 0x22, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x37, 0x17, 0x11, 0x33, 0x11, 0x17, 0x11, 0x33, 0x11, 0x37, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x23, 0xe6, 0x6c, 0x53, 0x6c, 0xbd, 0x6c, 0xbd, 0x6c, 0x53, 0x6c, 0xfe, 0x0b, 0x51, 0x02, 0x27, 0x78, 0x5c, 0x03, 0x92, 0xfb, 0xf6, 0xd3, 0x04, 0xdd, 0xfb, 0x23, 0xd3, 0x04, 0x0a, 0xfc, 0x6e, 0x5c, 0x78, 0xfd, 0xd2, 0x00, 0x00, 0x02, 0x00, 0x47, 0x00, 0x80, 0x04, 0xa4, 0x06, 0xb5, 0x00, 0x1e, 0x00, 0x3d, 0x00, 0x00, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x37, 0x36, 0x37, 0x01, 0x17, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x03, 0x30, 0x17, 0x07, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x02, 0x77, 0x72, 0x65, 0x60, 0x56, 0x4d, 0x2d, 0x29, 0x29, 0x2d, 0x4d, 0x58, 0x67, 0x01, 0x61, 0x6c, 0xd1, 0x56, 0x4f, 0x61, 0x55, 0x4e, 0x2c, 0x29, 0x29, 0x2c, 0x4e, 0x55, 0x61, 0x64, 0x42, 0xd2, 0x6c, 0xfe, 0xda, 0x50, 0x3e, 0x39, 0x1f, 0x1e, 0x1e, 0x23, 0x35, 0x3b, 0x92, 0x54, 0x50, 0x49, 0x4b, 0x39, 0x39, 0x1f, 0x1e, 0x1e, 0x23, 0x35, 0x3b, 0x49, 0x34, 0x80, 0x2e, 0x2d, 0x5c, 0x5a, 0x6e, 0x6c, 0x01, 0x00, 0x6c, 0x6e, 0x5a, 0x5f, 0x2e, 0x01, 0x89, 0x78, 0xe9, 0x08, 0x24, 0x2d, 0x5c, 0x5a, 0x6e, 0x6c, 0xff, 0x00, 0x6c, 0x6e, 0x5a, 0x5c, 0x2d, 0x2e, 0x04, 0x29, 0xe8, 0x78, 0x01, 0x46, 0x21, 0x46, 0x40, 0x52, 0x4e, 0xbe, 0x4a, 0x56, 0x3c, 0x42, 0x42, 0x21, 0x23, 0x40, 0x40, 0x52, 0x4e, 0xbe, 0x4a, 0x56, 0x3c, 0x42, 0x21, 0x17, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x00, 0x80, 0x04, 0xa4, 0x06, 0xb5, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x27, 0x37, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x01, 0x27, 0x02, 0x73, 0x6e, 0x65, 0x60, 0x56, 0x4d, 0x2d, 0x29, 0x29, 0x2d, 0x4d, 0x56, 0x60, 0x4f, 0x57, 0xd2, 0x6c, 0x01, 0x61, 0x67, 0x58, 0x4e, 0x2c, 0x29, 0x29, 0x2c, 0x4e, 0x55, 0x61, 0x64, 0xa0, 0x38, 0x34, 0x49, 0x3b, 0x35, 0x23, 0x1e, 0x1e, 0x1f, 0x39, 0x3a, 0x4a, 0x49, 0x50, 0x54, 0x92, 0x3b, 0x35, 0x23, 0x1e, 0x1e, 0x1f, 0x39, 0x3e, 0x4f, 0xfe, 0xd9, 0x6c, 0x80, 0x2e, 0x2d, 0x5c, 0x5a, 0x6e, 0x6c, 0x01, 0x00, 0x6c, 0x6e, 0x5a, 0x5c, 0x2d, 0x24, 0x08, 0xe9, 0x78, 0xfe, 0x77, 0x2e, 0x5f, 0x5a, 0x6e, 0x6c, 0xff, 0x00, 0x6c, 0x6e, 0x5a, 0x5c, 0x2d, 0x2e, 0x04, 0x29, 0x07, 0x17, 0x21, 0x42, 0x3c, 0x56, 0x4a, 0xbe, 0x4e, 0x52, 0x40, 0x40, 0x23, 0x21, 0x42, 0x42, 0x3c, 0x56, 0x4a, 0xbe, 0x4e, 0x52, 0x40, 0x46, 0x21, 0xfe, 0xba, 0x78, 0x00, 0x02, 0x00, 0xe6, 0xfe, 0xb2, 0x04, 0x63, 0x06, 0x14, 0x00, 0x10, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x15, 0x14, 0x16, 0x17, 0x26, 0x35, 0x11, 0x34, 0x37, 0x0e, 0x01, 0x1d, 0x01, 0x10, 0x07, 0x16, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x02, 0x59, 0x44, 0x9e, 0x2d, 0x2b, 0x9e, 0x42, 0x9b, 0x9b, 0x02, 0x09, 0x2f, 0x7e, 0x4d, 0x4d, 0x7e, 0x2f, 0xec, 0xe0, 0x97, 0x61, 0x80, 0x38, 0x38, 0x80, 0x61, 0x97, 0xe0, 0x01, 0x12, 0xef, 0x98, 0x6d, 0x07, 0x47, 0x9d, 0x04, 0xd0, 0xa1, 0x42, 0x07, 0x6b, 0x98, 0xf0, 0xfe, 0xee, 0x3e, 0x44, 0x03, 0xf4, 0x64, 0x57, 0x8e, 0xfb, 0x30, 0x8d, 0x58, 0x64, 0x94, 0xdd, 0xef, 0x97, 0x74, 0x8f, 0x73, 0x95, 0xf0, 0xdd, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xe6, 0xfe, 0xb2, 0x04, 0x63, 0x06, 0x14, 0x00, 0x10, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x10, 0x37, 0x26, 0x11, 0x35, 0x34, 0x26, 0x27, 0x16, 0x15, 0x11, 0x14, 0x07, 0x3e, 0x01, 0x35, 0x01, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x02, 0xf0, 0x9b, 0x9b, 0x42, 0x9f, 0x2c, 0x2d, 0x9e, 0x44, 0xfd, 0xf6, 0xed, 0xe0, 0x97, 0x61, 0x7f, 0x38, 0x38, 0x7f, 0x61, 0x97, 0xe0, 0xed, 0x30, 0x7e, 0x4d, 0x4d, 0x7e, 0x30, 0x01, 0x12, 0x01, 0x0e, 0x44, 0x3e, 0x01, 0x12, 0xf0, 0x98, 0x6b, 0x07, 0x42, 0xa1, 0xfb, 0x30, 0x9d, 0x47, 0x07, 0x6d, 0x98, 0x05, 0xf1, 0x93, 0xdd, 0xf0, 0x95, 0x73, 0x8f, 0x74, 0x97, 0xef, 0xdd, 0x94, 0x64, 0x58, 0x8d, 0x04, 0xd0, 0x8e, 0x57, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x32, 0x05, 0x46, 0x05, 0xf9, 0x00, 0x02, 0x00, 0x06, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x11, 0x09, 0x02, 0x35, 0x01, 0x05, 0x09, 0x01, 0x03, 0x11, 0x01, 0x15, 0x04, 0xac, 0xfd, 0x00, 0x03, 0x99, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0x17, 0x03, 0x01, 0xfc, 0xff, 0x99, 0x04, 0x82, 0xcc, 0x02, 0x64, 0xfe, 0xce, 0xfd, 0xcc, 0x01, 0xe1, 0xa6, 0x01, 0xe1, 0x07, 0x01, 0x32, 0x01, 0x32, 0xfc, 0x9a, 0x04, 0x68, 0xfe, 0x1f, 0xa6, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x1e, 0x06, 0x70, 0x04, 0xe6, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x23, 0x11, 0x33, 0x01, 0x11, 0x09, 0x02, 0x35, 0x01, 0x06, 0x70, 0x99, 0x99, 0xfe, 0x3c, 0xfc, 0xf8, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x1e, 0x04, 0xc8, 0xfc, 0x3a, 0x02, 0xc4, 0xfe, 0x9e, 0xfd, 0x9c, 0x02, 0x11, 0xa6, 0x02, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x1e, 0x06, 0x70, 0x04, 0xe6, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x37, 0x11, 0x33, 0x11, 0x09, 0x02, 0x03, 0x11, 0x01, 0x15, 0xc3, 0x99, 0x01, 0x2b, 0x03, 0x08, 0xfc, 0xf8, 0x99, 0x04, 0x82, 0x1e, 0x04, 0xc8, 0xfb, 0x38, 0x01, 0x02, 0x01, 0x62, 0x01, 0x62, 0xfc, 0x3a, 0x04, 0xc8, 0xfd, 0xef, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x17, 0x11, 0x09, 0x01, 0x11, 0x01, 0x37, 0x01, 0x11, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0x8b, 0x01, 0xb2, 0x3e, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xfa, 0x80, 0x02, 0x4e, 0x71, 0xfe, 0xa2, 0x02, 0xc6, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x17, 0x11, 0x09, 0x01, 0x11, 0x01, 0x27, 0x01, 0x11, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0x8c, 0xfe, 0x4e, 0x3e, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xfa, 0x80, 0x02, 0x4e, 0x71, 0x01, 0x5e, 0xfd, 0x44, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x05, 0x00, 0x00, 0x17, 0x11, 0x09, 0x01, 0x11, 0x01, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0x3e, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xfa, 0x80, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x08, 0x00, 0x00, 0x25, 0x15, 0x09, 0x01, 0x11, 0x09, 0x01, 0x15, 0x01, 0x06, 0x70, 0xfd, 0x2a, 0xfd, 0x29, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0xb5, 0xa2, 0xe0, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xdd, 0xfe, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x08, 0x00, 0x00, 0x13, 0x35, 0x09, 0x01, 0x11, 0x09, 0x01, 0x35, 0x01, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0xfd, 0x29, 0x02, 0x4b, 0x04, 0x62, 0xe0, 0xfd, 0xb2, 0x02, 0x4e, 0xfa, 0x80, 0x02, 0x50, 0xfd, 0xb0, 0xdd, 0x01, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xfe, 0x23, 0x03, 0x8a, 0x06, 0x75, 0x00, 0x03, 0x00, 0x00, 0x09, 0x03, 0x01, 0xc7, 0x01, 0xc2, 0xfe, 0x3e, 0xfe, 0x3e, 0x06, 0x75, 0xfb, 0xdb, 0xfb, 0xd3, 0x04, 0x2d, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0xd8, 0x97, 0x01, 0x2b, 0x97, 0x01, 0x14, 0xfe, 0xec, 0x97, 0xfe, 0xd5, 0x97, 0xfe, 0xeb, 0x02, 0xd7, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0xaa, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x01, 0x7e, 0x97, 0xa4, 0x97, 0xa4, 0x97, 0xba, 0xba, 0x97, 0xa4, 0x97, 0xa4, 0x97, 0xbb, 0x02, 0xd7, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0xaa, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x34, 0xfe, 0x6b, 0x06, 0xff, 0x05, 0xfb, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x24, 0x20, 0x04, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x04, 0x20, 0x24, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x11, 0x01, 0x11, 0xfe, 0xef, 0x01, 0x19, 0xfe, 0xe0, 0x7e, 0x7c, 0x66, 0x69, 0x66, 0x66, 0x69, 0x66, 0x7c, 0x7e, 0x01, 0x20, 0x7e, 0x7b, 0x67, 0x68, 0x66, 0x66, 0x68, 0x67, 0x7b, 0xfe, 0x3e, 0x01, 0x67, 0x01, 0x33, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x80, 0xfe, 0xcd, 0xfe, 0x99, 0xfe, 0xcd, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x80, 0x02, 0xe8, 0xfe, 0x92, 0x03, 0xc8, 0x3b, 0x3a, 0x72, 0x73, 0xfe, 0xec, 0xa3, 0x9f, 0xfe, 0xec, 0x73, 0x72, 0x3a, 0x3b, 0x3b, 0x3a, 0x72, 0x73, 0x01, 0x14, 0x9f, 0xa3, 0x01, 0x14, 0x73, 0x72, 0x3a, 0xf4, 0x90, 0x8d, 0x8e, 0xac, 0xaa, 0xc9, 0xc5, 0xac, 0xaa, 0x8e, 0x8d, 0x90, 0x90, 0x8d, 0x8e, 0xaa, 0xac, 0xc5, 0xc9, 0xaa, 0xac, 0x8e, 0x8d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x34, 0xfe, 0x6b, 0x06, 0xff, 0x05, 0xfb, 0x00, 0x19, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x24, 0x20, 0x04, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x04, 0x20, 0x24, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x05, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x04, 0x2a, 0xfe, 0xe0, 0x7e, 0x7c, 0x66, 0x69, 0x66, 0x66, 0x69, 0x66, 0x7c, 0x7e, 0x01, 0x20, 0x7e, 0x7b, 0x67, 0x68, 0x66, 0x66, 0x68, 0x67, 0x7b, 0xfe, 0x3e, 0x01, 0x67, 0x01, 0x33, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x80, 0xfe, 0xcd, 0xfe, 0x99, 0xfe, 0xcd, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x73, 0x02, 0x3f, 0x02, 0x4c, 0xfd, 0xb4, 0x97, 0xfd, 0xb4, 0x02, 0x4c, 0x05, 0x42, 0x3b, 0x3a, 0x72, 0x73, 0xfe, 0xec, 0xa3, 0x9f, 0xfe, 0xec, 0x73, 0x72, 0x3a, 0x3b, 0x3b, 0x3a, 0x72, 0x73, 0x01, 0x14, 0x9f, 0xa3, 0x01, 0x14, 0x73, 0x72, 0x3a, 0xf4, 0x90, 0x8d, 0x8e, 0xac, 0xaa, 0xc9, 0xc5, 0xac, 0xaa, 0x8e, 0x8d, 0x90, 0x90, 0x8d, 0x8e, 0xaa, 0xac, 0xc5, 0xc9, 0xaa, 0xac, 0x8e, 0x80, 0x4b, 0xfd, 0x73, 0xaa, 0xfd, 0x73, 0x02, 0x8d, 0xaa, 0x02, 0x8d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x34, 0xfe, 0x6b, 0x06, 0xff, 0x05, 0xfb, 0x00, 0x19, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x24, 0x20, 0x04, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x04, 0x20, 0x24, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x17, 0x09, 0x01, 0x17, 0x09, 0x01, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x04, 0x2a, 0xfe, 0xe0, 0x7e, 0x7c, 0x66, 0x69, 0x66, 0x66, 0x69, 0x66, 0x7c, 0x7e, 0x01, 0x20, 0x7e, 0x7b, 0x67, 0x68, 0x66, 0x66, 0x68, 0x67, 0x7b, 0xfe, 0x3e, 0x01, 0x67, 0x01, 0x33, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x80, 0xfe, 0xcd, 0xfe, 0x99, 0xfe, 0xcd, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x73, 0x53, 0x01, 0xa0, 0x01, 0xa0, 0x6c, 0xfe, 0x60, 0x01, 0xa0, 0x6b, 0xfe, 0x60, 0xfe, 0x61, 0x6d, 0x01, 0xa0, 0xfe, 0x60, 0x05, 0x42, 0x3b, 0x3a, 0x72, 0x73, 0xfe, 0xec, 0xa3, 0x9f, 0xfe, 0xec, 0x73, 0x72, 0x3a, 0x3b, 0x3b, 0x3a, 0x72, 0x73, 0x01, 0x14, 0x9f, 0xa3, 0x01, 0x14, 0x73, 0x72, 0x3a, 0xf4, 0x90, 0x8d, 0x8e, 0xac, 0xaa, 0xc9, 0xc5, 0xac, 0xaa, 0x8e, 0x8d, 0x90, 0x90, 0x8d, 0x8e, 0xaa, 0xac, 0xc5, 0xc9, 0xaa, 0xac, 0x8e, 0x80, 0xe8, 0xfe, 0x33, 0x01, 0xcd, 0x78, 0xfe, 0x32, 0xfe, 0x33, 0x77, 0x01, 0xcd, 0xfe, 0x33, 0x78, 0x01, 0xce, 0x01, 0xcd, 0xff, 0xff, 0x00, 0x69, 0xfe, 0x4d, 0x09, 0x22, 0x06, 0x0e, 0x10, 0x27, 0x09, 0x07, 0x05, 0xca, 0x00, 0x00, 0x10, 0x26, 0x09, 0x07, 0x00, 0x00, 0x10, 0x27, 0x09, 0x07, 0x01, 0xee, 0x00, 0x00, 0x10, 0x07, 0x09, 0x07, 0x03, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x1d, 0x00, 0x00, 0x17, 0x16, 0x33, 0x32, 0x37, 0x13, 0x23, 0x35, 0x33, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x33, 0x15, 0x23, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0xee, 0x10, 0x35, 0x3e, 0x07, 0x1d, 0xf7, 0xfe, 0x17, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x0f, 0x36, 0x3e, 0x07, 0x16, 0xf7, 0xfe, 0x1d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x9b, 0x82, 0xaf, 0x02, 0x9a, 0xaa, 0x02, 0x0c, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0x0d, 0xaa, 0xfd, 0x4d, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x25, 0x00, 0x00, 0x17, 0x16, 0x33, 0x32, 0x37, 0x13, 0x23, 0x35, 0x33, 0x37, 0x21, 0x35, 0x21, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x33, 0x15, 0x23, 0x07, 0x21, 0x15, 0x21, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0xee, 0x10, 0x35, 0x3e, 0x07, 0x14, 0xee, 0xf5, 0x0b, 0xff, 0x00, 0x01, 0x07, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0xed, 0xf5, 0x0a, 0x00, 0xff, 0xfe, 0xf9, 0x14, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x9b, 0x82, 0xaf, 0x01, 0xce, 0xaa, 0xf0, 0xa8, 0x01, 0x40, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0xd9, 0xa8, 0xf0, 0xaa, 0xfe, 0x19, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x25, 0x15, 0x05, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x05, 0x35, 0x25, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x17, 0x01, 0x22, 0xfe, 0xd7, 0x1c, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x18, 0xfe, 0xde, 0x01, 0x29, 0x1c, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x04, 0xf6, 0x82, 0xaf, 0xfd, 0xe7, 0xb6, 0xa0, 0xba, 0xfd, 0x6d, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x02, 0x19, 0xb6, 0xa0, 0xba, 0x02, 0x93, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x2a, 0x00, 0x33, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x07, 0x26, 0x27, 0x03, 0x36, 0x37, 0x17, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x01, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x89, 0x42, 0x66, 0x24, 0x48, 0x14, 0x1d, 0x13, 0x38, 0x31, 0x3d, 0x0d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0xfe, 0x34, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x04, 0xf6, 0x82, 0xaf, 0xfe, 0xd6, 0x29, 0x88, 0x41, 0x48, 0x21, 0xfe, 0x2b, 0x06, 0x11, 0x70, 0x24, 0x09, 0xfe, 0xbe, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0x01, 0x3c, 0xa4, 0x88, 0x7a, 0x8f, 0xfc, 0x45, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x67, 0x68, 0x48, 0x24, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0xc3, 0x06, 0x0e, 0x00, 0x32, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x07, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x33, 0x14, 0x17, 0x16, 0x17, 0x13, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x27, 0x3a, 0x2a, 0x4e, 0x54, 0x41, 0xaa, 0x31, 0xa9, 0x41, 0x53, 0x62, 0x4d, 0x62, 0x0f, 0x08, 0x90, 0x88, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3d, 0x08, 0x0f, 0x52, 0x38, 0x6b, 0x5c, 0x48, 0x2e, 0x27, 0x28, 0x07, 0x90, 0x88, 0x42, 0x30, 0x13, 0x04, 0xf6, 0x82, 0xaf, 0xfc, 0x78, 0x10, 0x2f, 0x55, 0x72, 0x1e, 0x5d, 0x48, 0xbd, 0xbd, 0x48, 0x5d, 0x1e, 0x9c, 0x6c, 0x56, 0x11, 0xfe, 0xa1, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x4d, 0x19, 0x3e, 0x77, 0x9a, 0x72, 0x4e, 0x33, 0x0b, 0x03, 0x99, 0xa5, 0x87, 0x46, 0x34, 0x8f, 0x00, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x03, 0x00, 0x21, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x13, 0x21, 0x11, 0x21, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x21, 0x11, 0x21, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x01, 0x87, 0xbd, 0xbd, 0x0f, 0x10, 0x01, 0x51, 0xfe, 0xc8, 0x12, 0x07, 0x92, 0x88, 0x71, 0x12, 0x85, 0x10, 0x33, 0x3f, 0x08, 0x0c, 0x01, 0x19, 0xfe, 0xc4, 0x0b, 0x08, 0x98, 0x82, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x02, 0xa6, 0xfe, 0xfd, 0xea, 0x01, 0x72, 0x02, 0x30, 0x01, 0xae, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xf5, 0xfc, 0xbc, 0xfe, 0xff, 0xad, 0x7f, 0x7d, 0x8c, 0x0f, 0x82, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x03, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x13, 0x06, 0x07, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x01, 0x87, 0xbd, 0xbd, 0x59, 0x25, 0x1c, 0x14, 0x07, 0x92, 0x88, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x08, 0x91, 0x88, 0x72, 0x12, 0x85, 0x10, 0x33, 0x3f, 0x08, 0x14, 0x24, 0x31, 0x63, 0x7a, 0x85, 0x02, 0xa6, 0xfe, 0x01, 0x7e, 0x02, 0x05, 0x01, 0xc3, 0xa7, 0x85, 0x7c, 0x8d, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0xfe, 0xd2, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0xb6, 0x10, 0x93, 0xd8, 0x7f, 0x00, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0xff, 0x06, 0x0e, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x01, 0x16, 0x33, 0x32, 0x37, 0x13, 0x16, 0x17, 0x16, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x07, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x36, 0x33, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x27, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x02, 0x4e, 0xbd, 0xbd, 0xfe, 0xa0, 0x10, 0x35, 0x3e, 0x07, 0x18, 0x29, 0x32, 0x65, 0xb2, 0x87, 0x7c, 0x65, 0xc0, 0x4b, 0x16, 0x05, 0x92, 0x88, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0d, 0x35, 0x3d, 0x98, 0xb9, 0xc6, 0x8b, 0x4e, 0x42, 0x0f, 0x08, 0x90, 0x88, 0x73, 0x12, 0x02, 0xae, 0xfe, 0xfd, 0xb5, 0x82, 0xaf, 0x02, 0x33, 0x3e, 0x1c, 0x36, 0x91, 0xd1, 0x8f, 0xa1, 0x02, 0x5d, 0xa4, 0x88, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0xcb, 0x13, 0xe9, 0xfe, 0xd2, 0xdb, 0x21, 0xfe, 0xa3, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x31, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x16, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x03, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x01, 0x82, 0xbe, 0xbe, 0xb7, 0x85, 0x7c, 0xc1, 0x81, 0x80, 0x92, 0x10, 0x35, 0x3e, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x02, 0xb0, 0xfe, 0x7a, 0x90, 0xd1, 0x8f, 0x91, 0xcf, 0x90, 0xfe, 0x2d, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x01, 0x37, 0x73, 0x56, 0x13, 0x01, 0x3c, 0xa4, 0x88, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0xfe, 0xd2, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x00, 0x37, 0x11, 0x21, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x33, 0x11, 0x21, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x1b, 0x01, 0x03, 0x33, 0x11, 0x21, 0x23, 0x11, 0x33, 0x89, 0x01, 0x1b, 0x0f, 0x07, 0x92, 0x88, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0d, 0xfc, 0xfe, 0xe3, 0x0c, 0x08, 0x98, 0x80, 0x73, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0xb1, 0x15, 0x9a, 0xfe, 0xe5, 0x9a, 0x84, 0x9b, 0x02, 0xfe, 0x01, 0x49, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xd0, 0xfd, 0x02, 0xfe, 0xde, 0xad, 0x7f, 0x7b, 0x8e, 0x0f, 0x82, 0xaf, 0x01, 0x09, 0x02, 0x74, 0xfe, 0x16, 0x01, 0xea, 0xfe, 0x16, 0x00, 0x01, 0xff, 0xc4, 0xfe, 0x4d, 0x03, 0xfc, 0x06, 0x0e, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x35, 0x36, 0x37, 0x26, 0x27, 0x23, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x13, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x16, 0xf3, 0x5a, 0x7d, 0x82, 0x55, 0x56, 0x07, 0x07, 0x56, 0xfa, 0x1d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3d, 0x08, 0x1d, 0xfe, 0xf9, 0xa8, 0x56, 0xfe, 0xe5, 0x01, 0x1b, 0x56, 0xa8, 0x01, 0x0c, 0x19, 0x07, 0x8f, 0x89, 0x42, 0x30, 0x13, 0x04, 0xf6, 0x82, 0xaf, 0xfd, 0xef, 0x8f, 0xc6, 0x8c, 0x88, 0x04, 0x65, 0x62, 0x06, 0xfd, 0x49, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x02, 0x9e, 0xba, 0x60, 0x01, 0x3a, 0x48, 0x01, 0x3a, 0x60, 0xba, 0x02, 0x2a, 0xa5, 0x87, 0x46, 0x34, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x23, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x12, 0x8d, 0x6c, 0xe2, 0xe2, 0x6c, 0x9f, 0x16, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x15, 0x8f, 0x6e, 0xe5, 0xe3, 0x6c, 0xa0, 0x15, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x04, 0xf6, 0x82, 0xaf, 0xfe, 0x58, 0x9d, 0x79, 0xfc, 0xfc, 0x78, 0xb0, 0xfd, 0xf4, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0xe2, 0xa0, 0x79, 0xfc, 0xfc, 0x78, 0xb3, 0x01, 0xd8, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x2a, 0x00, 0x00, 0x17, 0x16, 0x33, 0x32, 0x37, 0x13, 0x06, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0xee, 0x10, 0x35, 0x3e, 0x07, 0x29, 0x3b, 0x1d, 0x2e, 0x6d, 0x8b, 0x6d, 0x0d, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x51, 0x38, 0x4e, 0x6d, 0x70, 0x28, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x9b, 0x82, 0xaf, 0x03, 0xa6, 0x10, 0x32, 0x50, 0x9c, 0xfe, 0xc8, 0x01, 0x49, 0xcf, 0xbc, 0x11, 0x01, 0x2b, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0xe6, 0x18, 0x45, 0x61, 0xd6, 0xfe, 0xb7, 0x01, 0x38, 0xf3, 0x32, 0xfc, 0x4a, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x27, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x36, 0x19, 0x01, 0x33, 0x11, 0x10, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x26, 0x84, 0x6d, 0xf6, 0x0f, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0f, 0x53, 0x39, 0x4d, 0x6d, 0x71, 0x27, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x04, 0xf6, 0x82, 0xaf, 0xfc, 0x8d, 0x26, 0x01, 0x07, 0x01, 0x38, 0xfe, 0xb7, 0xfe, 0x8c, 0x27, 0xfe, 0xa2, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x4c, 0x17, 0x46, 0x61, 0xd6, 0x01, 0x49, 0xfe, 0xc8, 0xf5, 0x31, 0x03, 0x85, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x60, 0x06, 0xf9, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x01, 0x15, 0x21, 0x35, 0x01, 0xb3, 0x07, 0x92, 0x43, 0x45, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x3a, 0x08, 0x91, 0x45, 0x43, 0x72, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x01, 0xe8, 0xfd, 0x3e, 0x04, 0xe2, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfa, 0xb0, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0x07, 0x67, 0xa0, 0xa0, 0x00, 0x00, 0x02, 0x00, 0x60, 0xfd, 0x62, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x01, 0x35, 0x21, 0x15, 0x01, 0xb3, 0x07, 0x92, 0x43, 0x45, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x3a, 0x08, 0x91, 0x45, 0x43, 0x72, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0xfe, 0xe8, 0x02, 0xc3, 0x04, 0xe2, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfa, 0xb0, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfd, 0xd0, 0xa0, 0xa0, 0x00, 0xff, 0xff, 0x00, 0xfc, 0x00, 0x3f, 0x05, 0x0d, 0x04, 0xc5, 0x10, 0x06, 0x00, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0x01, 0xd3, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x26, 0x09, 0x18, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x01, 0xdf, 0x01, 0x24, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x9f, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x26, 0x09, 0x18, 0x00, 0x00, 0x10, 0x27, 0x09, 0xa1, 0x00, 0xd0, 0xfe, 0x57, 0x10, 0x07, 0x09, 0xa1, 0x02, 0xed, 0x01, 0x24, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x05, 0x15, 0x01, 0x35, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0x5f, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x46, 0xb6, 0x01, 0xd1, 0xb6, 0x02, 0x65, 0xfe, 0x91, 0xfe, 0x93, 0xb6, 0x01, 0xd1, 0xa6, 0x01, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x17, 0x01, 0x15, 0x01, 0x11, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xa1, 0x46, 0x01, 0xd1, 0xb6, 0xfe, 0x2f, 0x04, 0xec, 0xb6, 0xfe, 0x2f, 0xa6, 0xfe, 0x2f, 0xb6, 0x01, 0x6d, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x47, 0x04, 0xa6, 0x10, 0x27, 0x09, 0xa1, 0x03, 0xc4, 0xff, 0xbb, 0x10, 0x06, 0x0d, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x04, 0xa6, 0x10, 0x26, 0x09, 0xa1, 0xfe, 0xbb, 0x10, 0x06, 0x0d, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x05, 0x27, 0x10, 0x27, 0x09, 0xa1, 0x00, 0xf4, 0x01, 0xe1, 0x10, 0x06, 0x0d, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x05, 0x27, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xcd, 0x01, 0xe1, 0x10, 0x06, 0x0d, 0xd6, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x47, 0x06, 0x12, 0x10, 0x27, 0x09, 0xa1, 0x03, 0xc4, 0x02, 0xcc, 0x10, 0x06, 0x0d, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x06, 0x0d, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0x02, 0xc7, 0x10, 0x06, 0x0d, 0xd6, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xf1, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x0b, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x04, 0x07, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0x5d, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x50, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x04, 0x06, 0x3d, 0x4b, 0x01, 0x9b, 0xb2, 0x50, 0x44, 0x3a, 0x04, 0x04, 0x02, 0x06, 0x3c, 0x4c, 0x52, 0xb2, 0x4e, 0x44, 0x3a, 0x04, 0x02, 0x04, 0x06, 0x3c, 0x4a, 0x03, 0x5e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xf1, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x0b, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x04, 0x07, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x50, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x04, 0x06, 0x3d, 0x4b, 0x01, 0x9b, 0xb2, 0x50, 0x44, 0x3a, 0x04, 0x04, 0x02, 0x06, 0x3c, 0x4c, 0x52, 0xb2, 0x4e, 0x44, 0x3a, 0x04, 0x02, 0x04, 0x06, 0x3c, 0x4a, 0x03, 0x5e, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x08, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x03, 0x4e, 0x87, 0x51, 0x01, 0xc1, 0xfd, 0xed, 0x78, 0x87, 0x51, 0xfe, 0x3f, 0x02, 0x13, 0x02, 0x6f, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0xa2, 0x50, 0xa8, 0xaa, 0xf8, 0x50, 0xa8, 0xaa, 0x03, 0x4e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x08, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x03, 0x4e, 0x87, 0x51, 0x01, 0xc1, 0xfd, 0xed, 0x78, 0x87, 0x51, 0xfe, 0x3f, 0x02, 0x13, 0xfd, 0xed, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0xa2, 0x50, 0xa8, 0xaa, 0xf8, 0x50, 0xa8, 0xaa, 0x03, 0x4e, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x5f, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x36, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x17, 0x16, 0x1f, 0x01, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x13, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x3d, 0x4b, 0x2e, 0x7e, 0x4e, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x62, 0x84, 0x07, 0x53, 0x94, 0x50, 0x39, 0x2b, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x3e, 0x4b, 0x2e, 0x7d, 0x4e, 0x4f, 0x9b, 0x58, 0x5e, 0x51, 0x62, 0x45, 0x84, 0x64, 0x07, 0x52, 0x93, 0x50, 0x3a, 0x2c, 0x4d, 0x97, 0x5d, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x96, 0xb2, 0x50, 0x44, 0x17, 0x83, 0x34, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x03, 0xe9, 0x40, 0xe2, 0x10, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x17, 0x82, 0x34, 0x4c, 0x52, 0xb2, 0x4e, 0x22, 0x2a, 0x08, 0x0e, 0x2c, 0x03, 0xe9, 0x40, 0xe3, 0x0f, 0x4a, 0x03, 0x5e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x5f, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x35, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x3d, 0x4b, 0x2e, 0x7e, 0x4e, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x62, 0x84, 0x07, 0x53, 0x94, 0x50, 0x39, 0x2b, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x3e, 0x4b, 0x2e, 0x7d, 0x4e, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x07, 0x52, 0x93, 0x50, 0x3a, 0x2c, 0x4d, 0x97, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0x96, 0xb2, 0x50, 0x44, 0x17, 0x83, 0x34, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x03, 0xe9, 0x40, 0xe2, 0x10, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x17, 0x82, 0x34, 0x4c, 0x52, 0xb2, 0x4e, 0x44, 0x3a, 0x03, 0xe9, 0x40, 0xe3, 0x0f, 0x4a, 0x03, 0x5e, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfd, 0x84, 0x05, 0x46, 0x06, 0x54, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x21, 0x35, 0x21, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x03, 0x1c, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0xfb, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfd, 0x5c, 0xaa, 0xfb, 0x5e, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0x03, 0x7e, 0xaa, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfd, 0x84, 0x05, 0x46, 0x06, 0x54, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x13, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x11, 0x35, 0x21, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x35, 0x21, 0x15, 0xc3, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0xfe, 0x9a, 0x04, 0x82, 0x03, 0xfb, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfe, 0xe1, 0xaa, 0xaa, 0xfc, 0x08, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0x01, 0xf9, 0xaa, 0xaa, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x02, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x0f, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x0d, 0x14, 0x8c, 0x55, 0x4d, 0x97, 0xfb, 0xdc, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x81, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x96, 0xb2, 0x50, 0x44, 0x3a, 0x08, 0x02, 0x06, 0x3c, 0x4b, 0x53, 0xb2, 0x4e, 0x44, 0x3a, 0x06, 0x0a, 0x3c, 0x4a, 0xfe, 0x6c, 0xaa, 0x05, 0x9c, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x02, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x0f, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x0d, 0x14, 0x8c, 0x55, 0x4d, 0x97, 0xfb, 0xdc, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0x96, 0xb2, 0x50, 0x44, 0x3a, 0x08, 0x02, 0x06, 0x3c, 0x4b, 0x53, 0xb2, 0x4e, 0x44, 0x3a, 0x06, 0x0a, 0x3c, 0x4a, 0xfe, 0x6c, 0xaa, 0x05, 0x9c, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x12, 0x05, 0x46, 0x06, 0x0c, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x28, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0xfe, 0x9a, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0xbe, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x09, 0x3d, 0x4b, 0x01, 0x4a, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfa, 0x3a, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x12, 0x05, 0x46, 0x06, 0x0c, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x28, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x02, 0xbe, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x09, 0x3d, 0x4b, 0x01, 0x4a, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfb, 0xbf, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x2c, 0x05, 0x46, 0x05, 0xd7, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x13, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x11, 0x35, 0x21, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x35, 0x21, 0x15, 0xc3, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0xfe, 0x9a, 0x04, 0x82, 0x01, 0x25, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfe, 0xe1, 0xaa, 0xaa, 0x04, 0x28, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xf9, 0xd9, 0xaa, 0xaa, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x2c, 0x05, 0x46, 0x05, 0xd7, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x21, 0x35, 0x21, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x03, 0x1c, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x25, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfd, 0x5c, 0xaa, 0x03, 0x7e, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfb, 0x5e, 0xaa, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x36, 0x05, 0x46, 0x05, 0xee, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x09, 0x01, 0x35, 0x09, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x11, 0x35, 0x01, 0x15, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x03, 0x1c, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0x95, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfd, 0x56, 0x01, 0x2f, 0xb0, 0xfe, 0xd1, 0xfd, 0xa6, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfe, 0xd0, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x36, 0x05, 0x46, 0x05, 0xee, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x13, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x11, 0x35, 0x01, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x09, 0x01, 0x35, 0x01, 0xc3, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x03, 0x1c, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0x95, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfe, 0xdb, 0xb0, 0x01, 0x2f, 0xb0, 0xfd, 0x27, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfd, 0x4b, 0x01, 0x2f, 0xb0, 0xfe, 0xd1, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x84, 0x05, 0x46, 0x05, 0x26, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0x5f, 0x04, 0x70, 0xfe, 0x2f, 0xb6, 0x01, 0xd1, 0xfb, 0x14, 0xb6, 0x01, 0xd1, 0xa6, 0x01, 0xd1, 0xb6, 0xfe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x84, 0x05, 0x46, 0x05, 0x26, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x09, 0x02, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xa1, 0xfc, 0x5f, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x70, 0xb6, 0xfe, 0x2f, 0xb6, 0xfd, 0x9b, 0x01, 0x6f, 0x01, 0x6d, 0xb6, 0xfe, 0x2f, 0xa6, 0xfe, 0x2f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x84, 0x05, 0x47, 0x05, 0x26, 0x10, 0x27, 0x09, 0xa1, 0x03, 0xc4, 0xfe, 0xee, 0x10, 0x06, 0x0d, 0xed, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x84, 0x05, 0x46, 0x05, 0x26, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0xfe, 0xe4, 0x10, 0x06, 0x0d, 0xee, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0xff, 0xb6, 0x05, 0x46, 0x05, 0x7b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x35, 0x21, 0x15, 0xc4, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0xfe, 0xde, 0x04, 0x82, 0x04, 0xd1, 0xaa, 0xaa, 0xfb, 0x95, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x02, 0x39, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0xff, 0xb6, 0x05, 0x46, 0x05, 0x7b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x09, 0x02, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0x05, 0x46, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xfc, 0xa0, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x04, 0xd1, 0xaa, 0xfa, 0xeb, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x03, 0xfe, 0xaa, 0x00, 0x03, 0x00, 0xc3, 0xff, 0xc0, 0x05, 0x46, 0x05, 0xcd, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0xab, 0xb2, 0x01, 0x70, 0xb2, 0xfd, 0x4e, 0xb2, 0x01, 0x70, 0xb2, 0xfc, 0x97, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0xc0, 0x05, 0x46, 0x05, 0xcd, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x11, 0x01, 0x35, 0x09, 0x03, 0x35, 0x01, 0x15, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xfc, 0xa0, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xab, 0x01, 0x70, 0xb2, 0xfe, 0x90, 0xfe, 0x0c, 0x01, 0x70, 0xb2, 0xfe, 0x90, 0xfd, 0x55, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x11, 0x05, 0x46, 0x05, 0x28, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x03, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x05, 0x46, 0x5e, 0x97, 0x4d, 0x55, 0x8c, 0x0d, 0x0b, 0x09, 0x85, 0x63, 0x56, 0xa2, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x0b, 0x09, 0x83, 0x63, 0x58, 0xa1, 0x5f, 0x01, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0xca, 0x54, 0x4c, 0x3e, 0x06, 0x04, 0x04, 0x3c, 0x46, 0x4e, 0xb2, 0x54, 0x4c, 0x3e, 0x06, 0x04, 0x04, 0x3c, 0x46, 0x4e, 0xfc, 0x45, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x30, 0x05, 0x46, 0x05, 0x28, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x09, 0x02, 0x35, 0x01, 0x15, 0x01, 0x05, 0x46, 0x5e, 0x97, 0x4d, 0x55, 0x8c, 0x0d, 0x0b, 0x09, 0x85, 0x63, 0x56, 0xa2, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x0b, 0x09, 0x83, 0x63, 0x58, 0xa1, 0x5f, 0xfb, 0x7d, 0x03, 0x61, 0xfc, 0x9f, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xca, 0x54, 0x4c, 0x3e, 0x06, 0x04, 0x04, 0x3c, 0x46, 0x4e, 0xb2, 0x54, 0x4c, 0x3e, 0x06, 0x04, 0x04, 0x3c, 0x46, 0x4e, 0xfc, 0x64, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x98, 0x05, 0x46, 0x05, 0xd4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x13, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x03, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x5e, 0x97, 0x4d, 0x55, 0x8c, 0x0d, 0x0b, 0x09, 0x85, 0x63, 0x56, 0xa2, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x06, 0x09, 0x83, 0x63, 0x58, 0xa1, 0x5f, 0x01, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x3e, 0xaa, 0xaa, 0xfe, 0xd6, 0xaa, 0xaa, 0x05, 0xdc, 0x56, 0x4a, 0x3c, 0x06, 0x04, 0x06, 0x3a, 0x44, 0x4e, 0xb4, 0x54, 0x4c, 0x3c, 0x06, 0x02, 0x04, 0x04, 0x3a, 0x44, 0x4e, 0xfc, 0x44, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x98, 0x05, 0x46, 0x05, 0xd4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x13, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x09, 0x02, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x5e, 0x97, 0x4d, 0x55, 0x8c, 0x0d, 0x0b, 0x09, 0x85, 0x63, 0x56, 0xa2, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x06, 0x09, 0x83, 0x63, 0x58, 0xa1, 0x5f, 0xfb, 0x7d, 0x03, 0x60, 0xfc, 0xa0, 0x04, 0x82, 0xfb, 0x7e, 0x3e, 0xaa, 0xaa, 0xfe, 0xd6, 0xaa, 0xaa, 0x05, 0xdc, 0x56, 0x4a, 0x3c, 0x06, 0x04, 0x06, 0x3a, 0x44, 0x4e, 0xb4, 0x54, 0x4c, 0x3c, 0x06, 0x02, 0x04, 0x04, 0x3a, 0x44, 0x4e, 0xfc, 0x44, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x66, 0x05, 0x46, 0x04, 0xce, 0x00, 0x03, 0x00, 0x20, 0x00, 0x24, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x15, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x42, 0x3c, 0x2a, 0x32, 0x1b, 0x18, 0x04, 0xfe, 0x8d, 0xf0, 0x0b, 0x1a, 0x31, 0x4e, 0x51, 0xb9, 0x50, 0x4d, 0x32, 0x19, 0x0d, 0xef, 0xfe, 0x8e, 0x03, 0x19, 0x1b, 0x32, 0x29, 0xfd, 0x82, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x5a, 0xaa, 0x02, 0x7b, 0x04, 0x1e, 0x2b, 0x44, 0x44, 0x5c, 0xa8, 0x39, 0x33, 0x5b, 0x32, 0x33, 0x33, 0x32, 0x5b, 0x30, 0x3c, 0xa8, 0x5b, 0x45, 0x43, 0x2c, 0x1e, 0xfc, 0xe9, 0xaa, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xcf, 0x05, 0x46, 0x05, 0x57, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0x79, 0xaa, 0x04, 0xb1, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xcf, 0x05, 0x46, 0x05, 0x57, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x15, 0x21, 0x35, 0x11, 0x35, 0x00, 0x05, 0x30, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0x05, 0x45, 0xfb, 0x7e, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0x79, 0xaa, 0xaa, 0x04, 0x07, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xd7, 0x05, 0x46, 0x05, 0x57, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x03, 0x4e, 0x87, 0x51, 0x01, 0xc1, 0xfd, 0xed, 0x78, 0x87, 0x51, 0xfe, 0x3f, 0x02, 0x13, 0x02, 0x6f, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0x01, 0x71, 0x50, 0xa8, 0xaa, 0xf8, 0x50, 0xa8, 0xaa, 0x04, 0x07, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xd7, 0x05, 0x46, 0x05, 0x57, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0x03, 0x4e, 0x87, 0x51, 0x01, 0xc1, 0xfd, 0xed, 0x78, 0x87, 0x51, 0xfe, 0x3f, 0x02, 0x13, 0xfd, 0xed, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0x01, 0x71, 0x50, 0xa8, 0xaa, 0xf8, 0x50, 0xa8, 0xaa, 0x04, 0x07, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x09, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x00, 0x37, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x11, 0x00, 0x05, 0x04, 0x05, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfe, 0xec, 0xfe, 0x0f, 0x01, 0xea, 0x01, 0x1b, 0xfe, 0xc6, 0xfc, 0xb8, 0x03, 0x48, 0x01, 0x3a, 0x33, 0xaa, 0xaa, 0xfe, 0xd6, 0xaa, 0xaa, 0x05, 0x6b, 0xfe, 0xe5, 0x2d, 0x51, 0xf7, 0xd7, 0x01, 0x74, 0x58, 0xa6, 0x56, 0x01, 0x76, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x09, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x00, 0x37, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x24, 0x25, 0x24, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0x3a, 0x03, 0x48, 0xfc, 0xb8, 0xfe, 0xc6, 0x01, 0x1b, 0x01, 0xea, 0xfe, 0x10, 0x33, 0xaa, 0xaa, 0xfe, 0xd6, 0xaa, 0xaa, 0x05, 0x6b, 0xd7, 0xfe, 0x8a, 0x56, 0xa6, 0x58, 0xfe, 0x8c, 0xd7, 0xf7, 0x51, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x71, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x00, 0x05, 0x04, 0x05, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x01, 0xef, 0xfe, 0xd4, 0x01, 0xab, 0x56, 0xfd, 0xff, 0x02, 0x81, 0x7b, 0x7d, 0x25, 0x01, 0x2e, 0xfe, 0x52, 0x56, 0x02, 0x04, 0xfd, 0x7d, 0x7c, 0x7c, 0x03, 0x7b, 0xfe, 0xec, 0xfe, 0x0f, 0x01, 0xea, 0x01, 0x1b, 0xfe, 0xc6, 0xfc, 0xb8, 0x03, 0x48, 0x01, 0x3a, 0xea, 0xaa, 0x73, 0xaa, 0xa4, 0x73, 0x31, 0xaa, 0x73, 0xaa, 0xa5, 0x74, 0x05, 0x8f, 0xfe, 0xe5, 0x2d, 0x51, 0xf7, 0xd7, 0x01, 0x74, 0x58, 0xa6, 0x56, 0x01, 0x76, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x71, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x24, 0x25, 0x24, 0x01, 0xef, 0xfe, 0xd4, 0x01, 0xab, 0x56, 0xfd, 0xff, 0x02, 0x81, 0x7b, 0x7d, 0x25, 0x01, 0x2e, 0xfe, 0x52, 0x56, 0x02, 0x04, 0xfd, 0x7d, 0x7c, 0x7c, 0xfe, 0xf9, 0x01, 0x3a, 0x03, 0x48, 0xfc, 0xb8, 0xfe, 0xc6, 0x01, 0x1b, 0x01, 0xea, 0xfe, 0x10, 0xea, 0xaa, 0x73, 0xaa, 0xa4, 0x73, 0x31, 0xaa, 0x73, 0xaa, 0xa5, 0x74, 0x05, 0x8f, 0xd7, 0xfe, 0x8a, 0x56, 0xa6, 0x58, 0xfe, 0x8c, 0xd7, 0xf7, 0x51, 0x2d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x79, 0x05, 0x46, 0x05, 0x8b, 0x00, 0x1d, 0x00, 0x3a, 0x00, 0x45, 0x00, 0x00, 0x05, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3e, 0x01, 0x13, 0x00, 0x05, 0x04, 0x05, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa0, 0x58, 0x57, 0x91, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x08, 0x05, 0x06, 0x0e, 0x99, 0x8e, 0x9e, 0x5d, 0xfe, 0xec, 0xfe, 0x0f, 0x01, 0xea, 0x01, 0x1b, 0xfe, 0xc6, 0xfc, 0xb8, 0x03, 0x48, 0x01, 0x3a, 0x28, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x39, 0x0c, 0x06, 0x41, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x01, 0x9a, 0xb2, 0x4f, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x04, 0x02, 0x03, 0x06, 0x43, 0x0c, 0x45, 0x03, 0xec, 0xfe, 0xe5, 0x2d, 0x51, 0xf7, 0xd7, 0x01, 0x74, 0x58, 0xa6, 0x56, 0x01, 0x76, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x79, 0x05, 0x46, 0x05, 0x8b, 0x00, 0x1d, 0x00, 0x3a, 0x00, 0x45, 0x00, 0x00, 0x05, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3e, 0x01, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x24, 0x25, 0x24, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa0, 0x58, 0x57, 0x91, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x08, 0x05, 0x06, 0x0e, 0x99, 0x8e, 0x9e, 0xfb, 0xdb, 0x01, 0x3a, 0x03, 0x48, 0xfc, 0xb8, 0xfe, 0xc6, 0x01, 0x1b, 0x01, 0xea, 0xfe, 0x10, 0x28, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x39, 0x0c, 0x06, 0x41, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x01, 0x9a, 0xb2, 0x4f, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x04, 0x02, 0x03, 0x06, 0x43, 0x0c, 0x45, 0x03, 0xec, 0xd7, 0xfe, 0x8a, 0x56, 0xa6, 0x58, 0xfe, 0x8c, 0xd7, 0xf7, 0x51, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfd, 0xed, 0x05, 0x46, 0x05, 0x8b, 0x00, 0x36, 0x00, 0x41, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x17, 0x16, 0x1f, 0x01, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x13, 0x00, 0x05, 0x04, 0x05, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x3d, 0x4b, 0x2e, 0x7e, 0x4e, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x62, 0x84, 0x07, 0x53, 0x94, 0x50, 0x39, 0x2b, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x3e, 0x4b, 0x2e, 0x7d, 0x4e, 0x4f, 0x9b, 0x58, 0x5e, 0x51, 0x62, 0x45, 0x84, 0x64, 0x07, 0x52, 0x93, 0x50, 0x3a, 0x2c, 0x4d, 0x97, 0x5d, 0xfe, 0xec, 0xfe, 0x0f, 0x01, 0xea, 0x01, 0x1b, 0xfe, 0xc6, 0xfc, 0xb8, 0x03, 0x48, 0x01, 0x3a, 0x01, 0x24, 0xb2, 0x50, 0x44, 0x17, 0x83, 0x34, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x03, 0xe9, 0x40, 0xe2, 0x10, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x17, 0x82, 0x34, 0x4c, 0x52, 0xb2, 0x4e, 0x22, 0x2a, 0x08, 0x0e, 0x2c, 0x03, 0xe9, 0x40, 0xe3, 0x0f, 0x4a, 0x03, 0xe6, 0xfe, 0xe5, 0x2d, 0x51, 0xf7, 0xd7, 0x01, 0x74, 0x58, 0xa6, 0x56, 0x01, 0x76, 0x00, 0x02, 0x00, 0xc3, 0xfd, 0xed, 0x05, 0x46, 0x05, 0x8b, 0x00, 0x36, 0x00, 0x41, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x17, 0x16, 0x1f, 0x01, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x24, 0x25, 0x24, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x3d, 0x4b, 0x2e, 0x7e, 0x4e, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x62, 0x84, 0x07, 0x53, 0x94, 0x50, 0x39, 0x2b, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x3e, 0x4b, 0x2e, 0x7d, 0x4e, 0x4f, 0x9b, 0x58, 0x5e, 0x51, 0x62, 0x45, 0x84, 0x64, 0x07, 0x52, 0x93, 0x50, 0x3a, 0x2c, 0x4d, 0x97, 0xfb, 0xdb, 0x01, 0x3a, 0x03, 0x48, 0xfc, 0xb8, 0xfe, 0xc6, 0x01, 0x1b, 0x01, 0xea, 0xfe, 0x10, 0x01, 0x24, 0xb2, 0x50, 0x44, 0x17, 0x83, 0x34, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x03, 0xe9, 0x40, 0xe2, 0x10, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x17, 0x82, 0x34, 0x4c, 0x52, 0xb2, 0x4e, 0x22, 0x2a, 0x08, 0x0e, 0x2c, 0x03, 0xe9, 0x40, 0xe3, 0x0f, 0x4a, 0x03, 0xe6, 0xd7, 0xfe, 0x8a, 0x56, 0xa6, 0x58, 0xfe, 0x8c, 0xd7, 0xf7, 0x51, 0x2d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xa1, 0x05, 0x46, 0x04, 0xae, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x37, 0x01, 0x15, 0x01, 0x11, 0x01, 0x15, 0x09, 0x03, 0x15, 0x01, 0x35, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xc3, 0xfe, 0x90, 0xb2, 0x01, 0x70, 0x01, 0xf4, 0xfe, 0x90, 0xb2, 0x01, 0x70, 0x02, 0xab, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xa1, 0x05, 0x46, 0x04, 0xae, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x11, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xc3, 0xb2, 0xfe, 0x90, 0xb2, 0x02, 0xb2, 0xb2, 0xfe, 0x90, 0xb2, 0x03, 0x69, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa2, 0xff, 0xc9, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x17, 0x01, 0x17, 0x01, 0x17, 0x11, 0x13, 0x27, 0x09, 0x02, 0x27, 0x21, 0x03, 0x62, 0x54, 0xfd, 0x6c, 0xac, 0x02, 0x93, 0x53, 0x5b, 0xae, 0xfd, 0x6d, 0xfe, 0xd5, 0x02, 0x94, 0xaf, 0x02, 0x87, 0x04, 0x4e, 0x5c, 0xfd, 0x23, 0xbf, 0x02, 0xdd, 0x5d, 0x01, 0x78, 0xfd, 0x96, 0xc2, 0xfd, 0x23, 0x01, 0x4c, 0x02, 0xdd, 0xc1, 0x00, 0x00, 0x00, 0x02, 0x01, 0x03, 0xff, 0xc9, 0x05, 0x70, 0x04, 0xb3, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x37, 0x01, 0x37, 0x09, 0x01, 0x11, 0x21, 0x07, 0x09, 0x02, 0x02, 0xb0, 0xfe, 0xae, 0x53, 0x02, 0x94, 0xab, 0xfd, 0x6d, 0xfe, 0xa6, 0x02, 0x87, 0xae, 0x02, 0x93, 0xfe, 0xd6, 0xfd, 0x6c, 0x04, 0x4e, 0xfe, 0x88, 0x5d, 0xfd, 0x23, 0xbf, 0x02, 0xdd, 0xfd, 0xf2, 0x02, 0xcf, 0xc1, 0xfd, 0x23, 0xfe, 0xb4, 0x02, 0xdd, 0x00, 0x00, 0x02, 0x00, 0xa2, 0x00, 0x34, 0x05, 0x10, 0x05, 0x1e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x21, 0x05, 0x37, 0x09, 0x02, 0x37, 0x11, 0x04, 0xb4, 0x53, 0xfd, 0x6d, 0xac, 0x02, 0x94, 0x54, 0x01, 0x52, 0xfd, 0xd4, 0xaf, 0xfd, 0x6c, 0x01, 0x2b, 0x02, 0x93, 0xae, 0x02, 0x11, 0x5d, 0x02, 0xdd, 0xbf, 0xfd, 0x23, 0x5c, 0x65, 0xc1, 0x02, 0xdd, 0x01, 0x4c, 0xfd, 0x23, 0xc2, 0xfd, 0x31, 0x00, 0x00, 0x00, 0x02, 0x01, 0x03, 0x00, 0x34, 0x05, 0x70, 0x05, 0x1e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x27, 0x01, 0x27, 0x01, 0x27, 0x11, 0x03, 0x17, 0x09, 0x02, 0x17, 0x21, 0x02, 0xb0, 0x53, 0x02, 0x93, 0xab, 0xfd, 0x6c, 0x53, 0x5b, 0xae, 0x02, 0x94, 0x01, 0x2a, 0xfd, 0x6d, 0xae, 0xfd, 0x79, 0x99, 0x5c, 0x02, 0xdd, 0xbf, 0xfd, 0x23, 0x5d, 0xfe, 0x88, 0x02, 0x6a, 0xc2, 0x02, 0xdd, 0xfe, 0xb4, 0xfd, 0x23, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x86, 0x05, 0xaf, 0x04, 0x7e, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x25, 0x09, 0x01, 0x11, 0x21, 0x11, 0x09, 0x01, 0x11, 0x21, 0x01, 0x15, 0x21, 0x35, 0x03, 0x13, 0x35, 0x21, 0x15, 0x13, 0x01, 0xfb, 0xfe, 0x37, 0x01, 0xc9, 0x01, 0xea, 0x01, 0xc9, 0xfe, 0x37, 0xfe, 0x16, 0x02, 0x44, 0xfd, 0x62, 0xf0, 0xf0, 0x02, 0x9e, 0xf0, 0x86, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0x01, 0x11, 0xfe, 0x04, 0xfe, 0x04, 0x01, 0x11, 0x01, 0xf5, 0x83, 0x83, 0xfe, 0xf6, 0xfe, 0xf6, 0x83, 0x83, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x86, 0x05, 0xa0, 0x04, 0x7e, 0x00, 0x06, 0x00, 0x00, 0x25, 0x09, 0x01, 0x11, 0x21, 0x11, 0x21, 0x01, 0xfb, 0xfe, 0x37, 0x01, 0xc9, 0x03, 0xa4, 0xfc, 0x5c, 0x86, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0xfe, 0x2a, 0x00, 0x01, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x23, 0x11, 0x21, 0x11, 0x01, 0x3b, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0xfe, 0x59, 0x04, 0x0c, 0x01, 0xfc, 0xfe, 0x04, 0xfb, 0xf4, 0x04, 0x0c, 0x00, 0x00, 0x01, 0x01, 0x3b, 0xff, 0xcd, 0x04, 0xce, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x11, 0x21, 0x11, 0x33, 0x01, 0x01, 0x3b, 0xf6, 0x01, 0xa7, 0xf5, 0xfe, 0x37, 0x01, 0xc9, 0x04, 0x0c, 0xfb, 0xf4, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa2, 0xff, 0xc9, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x06, 0x00, 0x00, 0x01, 0x27, 0x09, 0x02, 0x27, 0x21, 0x05, 0x0f, 0xae, 0xfd, 0x6d, 0xfe, 0xd5, 0x02, 0x94, 0xaf, 0x02, 0x87, 0x01, 0xe4, 0xc2, 0xfd, 0x23, 0x01, 0x4c, 0x02, 0xdd, 0xc1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0xff, 0xc9, 0x05, 0x70, 0x04, 0xb3, 0x00, 0x06, 0x00, 0x00, 0x01, 0x11, 0x21, 0x07, 0x09, 0x02, 0x01, 0x03, 0x02, 0x87, 0xae, 0x02, 0x93, 0xfe, 0xd6, 0xfd, 0x6c, 0x01, 0xe4, 0x02, 0xcf, 0xc1, 0xfd, 0x23, 0xfe, 0xb4, 0x02, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa2, 0x00, 0x34, 0x05, 0x10, 0x05, 0x1e, 0x00, 0x06, 0x00, 0x00, 0x25, 0x37, 0x09, 0x02, 0x37, 0x11, 0x02, 0x88, 0xaf, 0xfd, 0x6c, 0x01, 0x2b, 0x02, 0x93, 0xae, 0x34, 0xc1, 0x02, 0xdd, 0x01, 0x4c, 0xfd, 0x23, 0xc2, 0xfd, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x70, 0x05, 0x1e, 0x00, 0x06, 0x00, 0x00, 0x01, 0x17, 0x09, 0x02, 0x17, 0x21, 0x01, 0x03, 0xae, 0x02, 0x94, 0x01, 0x2a, 0xfd, 0x6d, 0xae, 0xfd, 0x79, 0x03, 0x03, 0xc2, 0x02, 0xdd, 0xfe, 0xb4, 0xfd, 0x23, 0xc1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x86, 0x05, 0xaf, 0x04, 0x7e, 0x00, 0x09, 0x00, 0x00, 0x25, 0x09, 0x01, 0x11, 0x21, 0x11, 0x09, 0x01, 0x11, 0x21, 0x01, 0xfb, 0xfe, 0x37, 0x01, 0xc9, 0x01, 0xea, 0x01, 0xc9, 0xfe, 0x37, 0xfe, 0x16, 0x86, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0x01, 0x11, 0xfe, 0x04, 0xfe, 0x04, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x3b, 0xff, 0xcd, 0x04, 0xce, 0x06, 0x08, 0x00, 0x09, 0x00, 0x00, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x09, 0x01, 0x23, 0x03, 0xd8, 0xf5, 0xfe, 0x37, 0xfe, 0x37, 0xf6, 0xf6, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0x01, 0xc9, 0xfe, 0x04, 0x01, 0xfc, 0x02, 0x43, 0x01, 0xfc, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xff, 0xf9, 0x05, 0xb1, 0x02, 0xd7, 0x00, 0x0b, 0x00, 0x00, 0x05, 0x23, 0x01, 0x37, 0x17, 0x11, 0x21, 0x35, 0x21, 0x11, 0x37, 0x17, 0x04, 0x4e, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0xfc, 0x90, 0x04, 0x09, 0xd2, 0x6c, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x01, 0x1c, 0xaa, 0xfe, 0x3a, 0xea, 0x78, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x2d, 0x05, 0xb1, 0x05, 0x0b, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x07, 0x27, 0x11, 0x21, 0x35, 0x21, 0x11, 0x07, 0x27, 0x01, 0x04, 0x4e, 0x01, 0x62, 0x6c, 0xd2, 0xfb, 0xf7, 0x03, 0x70, 0xd1, 0x6c, 0x01, 0x61, 0x05, 0x0b, 0xfe, 0x76, 0x78, 0xea, 0xfe, 0x3a, 0xaa, 0x01, 0x1c, 0xea, 0x78, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x00, 0x40, 0xff, 0xf9, 0x05, 0x88, 0x02, 0xd7, 0x00, 0x0b, 0x00, 0x00, 0x05, 0x01, 0x37, 0x17, 0x11, 0x21, 0x15, 0x21, 0x11, 0x37, 0x17, 0x01, 0x01, 0xa3, 0xfe, 0x9e, 0x6c, 0xd2, 0x04, 0x09, 0xfc, 0x90, 0xd1, 0x6c, 0xfe, 0x9f, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x01, 0xc6, 0xaa, 0xfe, 0xe4, 0xea, 0x78, 0xfe, 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x02, 0x2d, 0x05, 0x88, 0x05, 0x0b, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x21, 0x15, 0x21, 0x11, 0x07, 0x27, 0x01, 0xa3, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x03, 0x70, 0xfb, 0xf7, 0xd2, 0x6c, 0x05, 0x0b, 0xfe, 0x76, 0x78, 0xea, 0xfe, 0xe4, 0xaa, 0x01, 0xc6, 0xea, 0x78, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfb, 0x4e, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x02, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfb, 0x4e, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x03, 0x10, 0x02, 0x9e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x05, 0x21, 0x01, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x04, 0xb2, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0x8a, 0x05, 0x3c, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x05, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x05, 0xc0, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0x8a, 0x05, 0x3c, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x05, 0x09, 0x05, 0x02, 0xc4, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x64, 0x02, 0x78, 0x02, 0x78, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x13, 0x01, 0x11, 0x09, 0x03, 0x8e, 0x02, 0x36, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0xfd, 0x88, 0x04, 0xf0, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x13, 0x09, 0x01, 0x21, 0x09, 0x02, 0x8e, 0x02, 0x36, 0x02, 0x37, 0xfb, 0x0a, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0xfd, 0x88, 0x02, 0x78, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x09, 0x04, 0x8e, 0x04, 0x6d, 0xfd, 0xc9, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0x02, 0x78, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x37, 0x00, 0x00, 0x05, 0x15, 0x23, 0x35, 0x33, 0x35, 0x13, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x35, 0x01, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x01, 0x15, 0x23, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x01, 0x15, 0x33, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x15, 0x23, 0x35, 0x06, 0x26, 0xcc, 0x66, 0x66, 0x66, 0x66, 0x66, 0xfe, 0xc7, 0xb7, 0xd3, 0xb6, 0x03, 0xdf, 0x66, 0x66, 0xd3, 0xb7, 0xd3, 0xb6, 0xfe, 0xc7, 0x67, 0xce, 0x67, 0x67, 0x67, 0x67, 0xce, 0x67, 0x67, 0x16, 0xe6, 0x74, 0x72, 0x01, 0xb6, 0xcc, 0xcc, 0x01, 0xb4, 0xca, 0xca, 0xfc, 0x24, 0x74, 0x74, 0x74, 0x74, 0x05, 0xac, 0xe6, 0x72, 0x74, 0x74, 0x74, 0x74, 0x74, 0xfa, 0xc6, 0x72, 0x74, 0xe6, 0x01, 0xb6, 0xcc, 0xcc, 0x01, 0xb4, 0xca, 0xca, 0x01, 0xd0, 0x74, 0x72, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0xff, 0xca, 0x06, 0x22, 0x06, 0x23, 0x00, 0x04, 0x00, 0x00, 0x13, 0x09, 0x02, 0x21, 0x20, 0x03, 0x01, 0x03, 0x01, 0xfe, 0xda, 0xfc, 0x4a, 0x03, 0xb6, 0x02, 0x6d, 0xfd, 0x93, 0xfc, 0x14, 0x00, 0x00, 0x02, 0x00, 0x20, 0xff, 0xca, 0x06, 0x22, 0x06, 0x23, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x1b, 0x01, 0x21, 0x13, 0x09, 0x04, 0x21, 0x99, 0xf7, 0x03, 0x22, 0xf7, 0xfd, 0x78, 0xfc, 0xff, 0x03, 0x01, 0x03, 0x01, 0xfe, 0xda, 0xfc, 0x4a, 0x03, 0x8b, 0xfc, 0xb1, 0x03, 0x4f, 0x02, 0x0c, 0xfe, 0x1f, 0x02, 0x6d, 0xfd, 0x93, 0xfc, 0x14, 0x00, 0x02, 0x00, 0x87, 0xff, 0x46, 0x05, 0xc3, 0x05, 0xfc, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x09, 0x01, 0x11, 0x09, 0x01, 0x03, 0x11, 0x09, 0x01, 0x11, 0x01, 0xee, 0x02, 0x37, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0xc9, 0x67, 0x02, 0x9e, 0x02, 0x9d, 0xfd, 0x63, 0x01, 0x35, 0xfe, 0x95, 0x01, 0x6b, 0x02, 0xd8, 0x01, 0x6b, 0xfe, 0x95, 0xfc, 0xe6, 0x03, 0x5c, 0x01, 0xad, 0xfe, 0x53, 0xfc, 0xa4, 0xfe, 0x53, 0x00, 0x01, 0x00, 0x87, 0xff, 0x46, 0x05, 0xc3, 0x05, 0xfc, 0x00, 0x05, 0x00, 0x00, 0x37, 0x11, 0x09, 0x01, 0x11, 0x01, 0x87, 0x02, 0x9e, 0x02, 0x9d, 0xfd, 0x63, 0xf3, 0x03, 0x5c, 0x01, 0xad, 0xfe, 0x53, 0xfc, 0xa4, 0xfe, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, 0xff, 0xb9, 0x06, 0x2a, 0x05, 0x89, 0x00, 0x05, 0x00, 0x00, 0x05, 0x09, 0x01, 0x21, 0x09, 0x01, 0x01, 0xa2, 0xfe, 0x7d, 0x01, 0x83, 0x03, 0x05, 0x01, 0x83, 0xfe, 0x7d, 0x47, 0x02, 0xe8, 0x02, 0xe8, 0xfd, 0x18, 0xfd, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0xfe, 0x00, 0x07, 0xaa, 0x06, 0x28, 0x00, 0x0b, 0x00, 0x00, 0x16, 0x10, 0x01, 0x36, 0x20, 0x17, 0x00, 0x10, 0x01, 0x06, 0x20, 0x27, 0x65, 0x01, 0xd1, 0xe9, 0x01, 0xd1, 0xe9, 0x01, 0xd1, 0xfe, 0x2f, 0xe9, 0xfe, 0x2f, 0xe9, 0x40, 0x04, 0xa8, 0x01, 0x2a, 0x96, 0x96, 0xfe, 0xd6, 0xfb, 0x58, 0xfe, 0xd6, 0x96, 0x96, 0x00, 0x01, 0x00, 0x45, 0xff, 0xa0, 0x05, 0xfd, 0x06, 0x4d, 0x00, 0x04, 0x00, 0x00, 0x09, 0x03, 0x11, 0x03, 0xcd, 0x02, 0x2f, 0xfd, 0xd1, 0xfc, 0x79, 0x06, 0x4c, 0xfc, 0xaa, 0xfc, 0xaa, 0x01, 0x46, 0x04, 0x20, 0x00, 0x00, 0x02, 0x00, 0x45, 0xff, 0xa0, 0x05, 0xfd, 0x06, 0x4d, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x09, 0x01, 0x11, 0x09, 0x05, 0x11, 0x03, 0xa7, 0xfd, 0x05, 0x02, 0xfb, 0x01, 0xd7, 0xfe, 0x4f, 0x02, 0x2f, 0xfd, 0xd1, 0xfc, 0x79, 0x05, 0xc6, 0xfe, 0xee, 0xfc, 0x86, 0xfe, 0xec, 0x02, 0xd0, 0x03, 0x56, 0xfc, 0xaa, 0xfc, 0xaa, 0x01, 0x46, 0x04, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0x01, 0x38, 0xfe, 0xc8, 0x01, 0x38, 0xfe, 0xc8, 0x02, 0x8e, 0xfc, 0xbc, 0xac, 0xac, 0xac, 0xac, 0x05, 0xd5, 0xfe, 0x07, 0x90, 0x90, 0x90, 0xfe, 0x7e, 0xaa, 0x02, 0x2c, 0x90, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0xf3, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x01, 0x53, 0xa0, 0xa0, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa0, 0xa0, 0x02, 0xbc, 0x90, 0xfd, 0xd4, 0x02, 0x2c, 0x90, 0x90, 0x90, 0x02, 0x38, 0xfd, 0xc8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdb, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x23, 0x00, 0x00, 0x13, 0x33, 0x11, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x11, 0x21, 0x15, 0x21, 0x11, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x17, 0xb5, 0xb6, 0x01, 0x01, 0x10, 0x0b, 0x23, 0x10, 0x10, 0x02, 0x70, 0x01, 0x5c, 0x52, 0x12, 0x11, 0x02, 0x8e, 0xfc, 0xbc, 0x05, 0x05, 0x0f, 0x0c, 0x22, 0x10, 0x11, 0x01, 0x71, 0x02, 0x5c, 0x52, 0x16, 0x14, 0x05, 0xd5, 0xfd, 0x2c, 0x01, 0x01, 0x09, 0x25, 0x24, 0x52, 0x86, 0x94, 0x04, 0xfe, 0x2f, 0xaa, 0x03, 0x02, 0x04, 0x03, 0x09, 0x25, 0x24, 0x52, 0x86, 0x94, 0x06, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x17, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x15, 0x21, 0x15, 0xb5, 0x01, 0x9a, 0xe2, 0x73, 0x74, 0x74, 0x73, 0xe2, 0xe4, 0xb6, 0xac, 0xac, 0xb6, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xe4, 0x01, 0x38, 0x05, 0xd5, 0x71, 0x72, 0xdb, 0xdd, 0x71, 0x71, 0xfd, 0xa8, 0x03, 0xcf, 0x90, 0x90, 0xd1, 0x92, 0x87, 0x86, 0x92, 0xd0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x19, 0x01, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0x63, 0x78, 0x39, 0x45, 0xcd, 0xb8, 0x01, 0x9a, 0xe7, 0xe2, 0x75, 0xfd, 0xc8, 0xe4, 0x84, 0x86, 0x86, 0x84, 0x02, 0xbc, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0xf1, 0xc2, 0x96, 0xaa, 0xf4, 0x01, 0x0e, 0x05, 0x6d, 0xd6, 0xd8, 0x8d, 0xba, 0x02, 0x4f, 0xfd, 0xee, 0x87, 0x83, 0x83, 0x85, 0x00, 0x04, 0x00, 0x40, 0xff, 0xa2, 0x04, 0x26, 0x04, 0xbc, 0x00, 0x23, 0x00, 0x28, 0x00, 0x30, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x37, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x0f, 0x01, 0x33, 0x35, 0x34, 0x07, 0x01, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x01, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x03, 0xc2, 0xa6, 0x38, 0xa9, 0x7b, 0x7a, 0x52, 0x5d, 0x56, 0x63, 0x35, 0xe3, 0xe2, 0x26, 0x8d, 0x0a, 0x0c, 0x4b, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xd1, 0x6b, 0x85, 0x56, 0x97, 0x33, 0xa8, 0x30, 0x32, 0x9d, 0xfe, 0xdd, 0x37, 0x59, 0x8a, 0xa6, 0xfd, 0xff, 0xcd, 0x59, 0x2d, 0x4e, 0x02, 0x7f, 0xfd, 0x81, 0xaa, 0x66, 0x61, 0x3c, 0x7d, 0x4e, 0x85, 0x56, 0x7b, 0xbd, 0xc0, 0xbf, 0x0c, 0x0c, 0x45, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0x72, 0xb3, 0x4f, 0xcb, 0x73, 0x2b, 0x41, 0x12, 0x18, 0xba, 0xfe, 0x78, 0x2e, 0xd9, 0xb4, 0x29, 0xfe, 0xe2, 0x01, 0x15, 0x0c, 0x1e, 0x33, 0x7b, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xea, 0xff, 0x42, 0x02, 0xc4, 0x06, 0x93, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x33, 0x13, 0x33, 0x03, 0x33, 0x15, 0x23, 0x03, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x03, 0x23, 0x13, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x2b, 0xad, 0x99, 0xad, 0x91, 0xbd, 0x98, 0x43, 0x67, 0xab, 0xab, 0xbf, 0x49, 0x0b, 0x0a, 0x5c, 0x99, 0xc1, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x02, 0x33, 0xfd, 0xcd, 0x8f, 0xfe, 0x0f, 0x6f, 0x89, 0x4e, 0x9a, 0x50, 0x0c, 0x10, 0xfe, 0xd6, 0x02, 0x72, 0x02, 0x1d, 0x8f, 0x01, 0x3e, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x6a, 0x05, 0xd5, 0x10, 0x06, 0x04, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x9a, 0x06, 0x14, 0x00, 0x19, 0x00, 0x00, 0x21, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x23, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0x50, 0x51, 0x6a, 0xad, 0x59, 0x5a, 0xa5, 0xa5, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x06, 0x14, 0xfd, 0x9e, 0x65, 0x32, 0x32, 0x77, 0x78, 0xe8, 0xfd, 0xf5, 0xfe, 0x4c, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x01, 0x04, 0x47, 0x98, 0xb1, 0x3e, 0xfd, 0x7b, 0xb6, 0xb6, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0xaa, 0xfe, 0x15, 0x01, 0x41, 0x02, 0xcf, 0xfd, 0x31, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x48, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x26, 0x06, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x11, 0x23, 0xa7, 0xa7, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x01, 0x9e, 0x8f, 0xa6, 0x32, 0xfe, 0x00, 0xa7, 0x06, 0x14, 0xfc, 0x69, 0x01, 0xe3, 0xfd, 0xf4, 0xfe, 0x45, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x23, 0xfd, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0xfe, 0xbf, 0x05, 0x51, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0x21, 0x68, 0x04, 0x1f, 0xfc, 0xaf, 0x04, 0x1b, 0xb5, 0xfb, 0xb7, 0x03, 0x51, 0xfc, 0xc4, 0x05, 0xd5, 0x9a, 0xfb, 0x6f, 0xfe, 0x15, 0x01, 0x41, 0x9a, 0x04, 0x91, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0xe5, 0x04, 0x1e, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0x21, 0x66, 0x03, 0x12, 0xfd, 0x92, 0x03, 0x14, 0xa6, 0xfc, 0xd7, 0x02, 0x6f, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfc, 0xdb, 0xfe, 0x52, 0x01, 0x1b, 0xa8, 0x03, 0x25, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xec, 0x05, 0xf1, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x35, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x01, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x04, 0x3b, 0xb0, 0xb0, 0x46, 0xd4, 0x95, 0xf3, 0xfe, 0xcf, 0x01, 0x31, 0xf3, 0x95, 0xd4, 0xfd, 0x2f, 0xd3, 0xb8, 0xb8, 0xd4, 0xd4, 0xb8, 0xb8, 0xd3, 0x04, 0xed, 0xe8, 0xfa, 0x2b, 0xe7, 0x84, 0x80, 0x01, 0xab, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0xab, 0x80, 0xfd, 0x78, 0xfe, 0xe3, 0xfe, 0xbb, 0x01, 0x45, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x45, 0xfe, 0xbb, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x05, 0x83, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x13, 0x21, 0x09, 0x01, 0x21, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0xb5, 0x01, 0x0f, 0x01, 0x57, 0x01, 0x58, 0x01, 0x0f, 0xb8, 0xcc, 0x46, 0x3d, 0x79, 0x63, 0xfe, 0xa5, 0xb6, 0xfe, 0xa5, 0xb0, 0x05, 0xd5, 0xfc, 0x08, 0x03, 0xf8, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x04, 0xb7, 0xfc, 0x00, 0x04, 0x00, 0xfa, 0xe1, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x13, 0x21, 0x01, 0x23, 0x01, 0x33, 0x13, 0x21, 0x13, 0x33, 0x02, 0x76, 0xf7, 0xfe, 0x11, 0x01, 0x5f, 0xcf, 0xfe, 0x00, 0xbd, 0x7b, 0x02, 0x5e, 0x7a, 0xc0, 0xc7, 0x02, 0xe7, 0xfc, 0x52, 0x05, 0xd5, 0xfe, 0x81, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xec, 0x05, 0xf1, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x00, 0x25, 0x15, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x10, 0x00, 0x23, 0x22, 0x26, 0x00, 0x10, 0x02, 0x23, 0x22, 0x02, 0x10, 0x12, 0x20, 0x01, 0x18, 0xb0, 0xb0, 0x45, 0xd5, 0x94, 0xf3, 0x01, 0x32, 0xfe, 0xce, 0xf3, 0x94, 0xd5, 0x02, 0xd1, 0xd2, 0xb8, 0xb9, 0xd3, 0xd3, 0x01, 0x71, 0xe7, 0xe8, 0x05, 0xd5, 0xe7, 0x84, 0x80, 0xfe, 0x55, 0xfd, 0x48, 0xfe, 0x55, 0x80, 0x01, 0x6b, 0x02, 0x3a, 0x01, 0x45, 0xfe, 0xbb, 0xfd, 0xc6, 0xfe, 0xbb, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x05, 0x4a, 0x04, 0x7b, 0x00, 0x14, 0x00, 0x00, 0x01, 0x30, 0x01, 0x23, 0x01, 0x33, 0x01, 0x13, 0x36, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x22, 0x07, 0x06, 0x03, 0xba, 0xfe, 0xd8, 0xe1, 0xfe, 0x86, 0xaf, 0x01, 0x3b, 0xf9, 0x4b, 0xc8, 0x76, 0xa7, 0xa1, 0x49, 0x66, 0x25, 0x13, 0x03, 0x6d, 0xfc, 0x93, 0x04, 0x60, 0xfc, 0x54, 0x02, 0xe6, 0xe1, 0xbf, 0x86, 0x72, 0x72, 0x3a, 0x54, 0x2a, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x08, 0x1f, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x06, 0xa9, 0xfe, 0xe8, 0xe5, 0xfe, 0xe5, 0xfe, 0xe1, 0xe4, 0xfe, 0xaf, 0xb8, 0x01, 0x1a, 0x01, 0x1a, 0xcc, 0x01, 0x1b, 0xed, 0x10, 0x36, 0x4d, 0x7c, 0x7a, 0x4c, 0x4d, 0x99, 0x49, 0x29, 0x26, 0x24, 0x1a, 0x04, 0xe1, 0xfb, 0x1f, 0x05, 0x10, 0xfa, 0xf0, 0x05, 0xd5, 0xfb, 0x12, 0x04, 0xee, 0xfb, 0x12, 0x04, 0x26, 0x47, 0x40, 0x5c, 0x5c, 0x5b, 0x6e, 0x83, 0x79, 0x36, 0x50, 0x28, 0x1c, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x06, 0xed, 0x04, 0x7b, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x22, 0x07, 0x06, 0x07, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x13, 0x04, 0xbf, 0x15, 0x33, 0x52, 0x77, 0x76, 0xa6, 0xa0, 0x49, 0x67, 0x24, 0x16, 0x06, 0xce, 0xc3, 0xd9, 0xda, 0xc3, 0xfe, 0xf8, 0xa6, 0xcf, 0xce, 0xc3, 0xcf, 0x03, 0x88, 0x56, 0x3d, 0x60, 0xbf, 0x86, 0x72, 0x72, 0x3a, 0x54, 0x2a, 0x19, 0x14, 0xfc, 0x93, 0x03, 0x96, 0xfc, 0x6a, 0x04, 0x60, 0xfc, 0x96, 0x03, 0x6a, 0xfc, 0x96, 0x00, 0x02, 0x00, 0x5d, 0x00, 0x00, 0x04, 0x0c, 0x04, 0xb3, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x10, 0x25, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x13, 0x01, 0x33, 0x01, 0x23, 0x03, 0x07, 0x35, 0x36, 0x3f, 0x01, 0x36, 0x35, 0x26, 0x23, 0x22, 0x15, 0x14, 0xb4, 0x01, 0x32, 0x12, 0x10, 0x97, 0xa5, 0x72, 0x99, 0x01, 0x3b, 0xb0, 0xfe, 0x86, 0xe1, 0xbc, 0x97, 0x2c, 0x36, 0x94, 0xc3, 0x01, 0x29, 0x9d, 0x03, 0x4d, 0x01, 0x32, 0x31, 0x03, 0xf8, 0x99, 0x5d, 0x40, 0xfe, 0x2f, 0x03, 0xac, 0xfb, 0xa0, 0x02, 0x32, 0x55, 0xc4, 0x14, 0x1c, 0x50, 0x6e, 0x34, 0x34, 0xa0, 0x25, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x00, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x03, 0xff, 0xfd, 0x6c, 0xb6, 0xb6, 0x02, 0x94, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0x6f, 0x04, 0x60, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x03, 0x6e, 0xfd, 0xe5, 0xa5, 0xa5, 0x02, 0x1b, 0x02, 0x04, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0xe7, 0x04, 0x56, 0x04, 0x68, 0x00, 0x0a, 0x00, 0x27, 0x00, 0x00, 0x01, 0x22, 0x15, 0x11, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x07, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x11, 0x10, 0x02, 0xea, 0x3a, 0x55, 0x56, 0x4c, 0x4d, 0x3f, 0x31, 0x7d, 0x73, 0x7c, 0x7c, 0x74, 0xb6, 0xa5, 0xb4, 0x78, 0x7a, 0x7a, 0x5b, 0x96, 0x3b, 0x34, 0x4e, 0x4e, 0x45, 0x65, 0x03, 0xcb, 0x91, 0xfd, 0x52, 0x68, 0x5d, 0xdf, 0xd0, 0x70, 0x5b, 0x9d, 0x84, 0x8d, 0xfe, 0xd9, 0xfe, 0xf1, 0xa1, 0x98, 0x01, 0x99, 0x9c, 0x01, 0x13, 0x01, 0x1e, 0x92, 0x6d, 0x1c, 0xa3, 0x17, 0x4e, 0x73, 0xbe, 0xca, 0x73, 0x67, 0x02, 0xaf, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe5, 0x02, 0x4f, 0x06, 0x14, 0x00, 0x17, 0x00, 0x00, 0x21, 0x35, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x01, 0xa8, 0x67, 0xec, 0x22, 0x32, 0x01, 0x36, 0x4f, 0x8d, 0x96, 0x45, 0x5f, 0xd0, 0xe5, 0xa4, 0x48, 0x49, 0xae, 0xc9, 0x0a, 0xbd, 0x23, 0xcb, 0xbe, 0x02, 0x6c, 0x99, 0x61, 0x9c, 0x60, 0x62, 0xd4, 0xfb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x26, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x00, 0x12, 0x20, 0x12, 0x10, 0x02, 0x20, 0x02, 0x00, 0x26, 0x20, 0x06, 0x15, 0x14, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x35, 0x02, 0xc7, 0x55, 0x79, 0x54, 0x54, 0x7a, 0x54, 0xfd, 0x9f, 0xf5, 0x01, 0xb1, 0xf7, 0xf7, 0xfe, 0x4f, 0xf5, 0x02, 0xed, 0x9a, 0xfe, 0xf6, 0x9b, 0x12, 0x14, 0x32, 0x52, 0x78, 0x7a, 0x51, 0x2d, 0x15, 0x10, 0x01, 0x61, 0x5f, 0x5e, 0x87, 0x5c, 0x5c, 0x02, 0x68, 0x01, 0x38, 0xfe, 0xc8, 0xfd, 0xd9, 0xfe, 0xc7, 0x01, 0x39, 0x01, 0xda, 0xe9, 0xe7, 0xc9, 0x60, 0x4d, 0x47, 0x38, 0x5d, 0x5f, 0x32, 0x42, 0x49, 0x5b, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x02, 0xe2, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x02, 0xe1, 0xfd, 0x77, 0x01, 0xe2, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0x2a, 0x04, 0x60, 0xfb, 0xa0, 0x93, 0x01, 0x78, 0x94, 0x01, 0x2d, 0x94, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xeb, 0xff, 0x11, 0x00, 0xd7, 0x03, 0x67, 0x12, 0x07, 0x02, 0x74, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x02, 0x9c, 0x03, 0x11, 0x05, 0xe0, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x01, 0x4c, 0xfe, 0xbd, 0x78, 0x01, 0x0c, 0x01, 0x0d, 0x77, 0xfe, 0xbd, 0x02, 0x9c, 0x03, 0x44, 0xfd, 0x40, 0x02, 0xc0, 0xfc, 0xbc, 0x00, 0x00, 0x01, 0x00, 0x79, 0xfe, 0x10, 0x04, 0x4e, 0x05, 0xf0, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x1e, 0x01, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2e, 0x02, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0xda, 0x67, 0xb8, 0x55, 0x95, 0xa1, 0x36, 0x31, 0x9a, 0x6d, 0xd0, 0x5d, 0x60, 0x83, 0x67, 0xb5, 0x79, 0x70, 0x84, 0x3f, 0x16, 0x39, 0x1e, 0x47, 0x5d, 0x6e, 0x36, 0xc9, 0x2c, 0x0d, 0x2d, 0x22, 0x6c, 0x73, 0x6f, 0xd4, 0x67, 0x9b, 0xaa, 0x7a, 0x8b, 0x6e, 0xcc, 0xb5, 0xfb, 0xdc, 0x5f, 0xc4, 0x05, 0xa4, 0xc5, 0x37, 0x36, 0x80, 0x76, 0x63, 0x33, 0x2e, 0x23, 0x19, 0x2f, 0x69, 0x6c, 0xb6, 0xd9, 0x70, 0x59, 0x12, 0x77, 0x6e, 0x49, 0xaa, 0x10, 0x27, 0x4f, 0x38, 0xce, 0x2d, 0x0a, 0x21, 0x07, 0x18, 0x2f, 0xd0, 0x45, 0x46, 0x88, 0x7e, 0x6e, 0x7c, 0x1f, 0x18, 0x2d, 0xc0, 0xab, 0xc6, 0xe4, 0x26, 0x00, 0x00, 0x01, 0x00, 0x52, 0xfe, 0x10, 0x04, 0x9c, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x25, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x04, 0x3b, 0x61, 0x84, 0x23, 0x51, 0x6a, 0x7e, 0x3e, 0xfe, 0xf2, 0x47, 0x66, 0x70, 0x03, 0x51, 0xfc, 0xc4, 0x04, 0x1f, 0xfc, 0xb3, 0x67, 0x69, 0xe3, 0x7a, 0x90, 0xfe, 0xba, 0xaa, 0x10, 0x27, 0x4f, 0x38, 0xf3, 0x3f, 0x9a, 0x04, 0x91, 0xaa, 0x9a, 0xfb, 0x6f, 0x0d, 0x5f, 0xcd, 0x6e, 0x49, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x01, 0x11, 0x33, 0x11, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x05, 0x58, 0x88, 0xfb, 0x30, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x01, 0x11, 0x33, 0x11, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x04, 0x24, 0x88, 0xfc, 0x64, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x01, 0x11, 0x33, 0x11, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x02, 0xf0, 0x88, 0xfd, 0x98, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x01, 0x11, 0x33, 0x11, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x01, 0xbc, 0x88, 0xfe, 0xcc, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0x01, 0x33, 0x11, 0x23, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x7a, 0x88, 0x88, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x23, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x05, 0x58, 0x88, 0xfb, 0x30, 0x05, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x23, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x04, 0x24, 0x88, 0xfc, 0x64, 0x05, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x23, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x02, 0xf0, 0x88, 0xfd, 0x98, 0x05, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x23, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x01, 0xbc, 0x88, 0xfe, 0xcc, 0x05, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x25, 0x33, 0x15, 0x2b, 0x02, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x88, 0x88, 0x05, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x15, 0x21, 0x01, 0x3b, 0x7a, 0x02, 0x0c, 0xfe, 0x6e, 0x05, 0x58, 0x88, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x3b, 0x7a, 0x7a, 0x01, 0x92, 0xfe, 0x6e, 0x05, 0x58, 0xfe, 0xcc, 0x88, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x3b, 0x7a, 0x7a, 0x01, 0x92, 0xfe, 0x6e, 0x05, 0x58, 0xfd, 0x98, 0x88, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x3b, 0x7a, 0x7a, 0x01, 0x92, 0xfe, 0x6e, 0x05, 0x58, 0xfc, 0x64, 0x88, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x11, 0x33, 0x01, 0x3b, 0x01, 0x92, 0xfd, 0xf4, 0x7a, 0x88, 0x88, 0x05, 0x58, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x02, 0x9c, 0x02, 0x4d, 0x05, 0xe4, 0x00, 0x09, 0x00, 0x00, 0x01, 0x33, 0x17, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x3b, 0x33, 0xdf, 0x45, 0x83, 0x61, 0x84, 0x44, 0x05, 0xe4, 0xdd, 0x43, 0x83, 0xfd, 0x55, 0x02, 0xab, 0x83, 0x43, 0x00, 0x01, 0x00, 0x5b, 0x02, 0x98, 0x02, 0x4d, 0x05, 0xe0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x23, 0x27, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x6e, 0x33, 0xdf, 0x44, 0x84, 0x61, 0x83, 0x45, 0x02, 0x98, 0xdd, 0x43, 0x83, 0x02, 0xab, 0xfd, 0x55, 0x83, 0x43, 0x00, 0x02, 0x00, 0xaf, 0x02, 0x9c, 0x01, 0x23, 0x05, 0xe0, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x11, 0x07, 0x23, 0x27, 0xb0, 0x73, 0x73, 0x73, 0x0c, 0x5c, 0x0b, 0x03, 0x2a, 0x8e, 0x03, 0x44, 0xfe, 0x91, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x02, 0x00, 0xaf, 0x02, 0x9c, 0x01, 0x23, 0x05, 0xe0, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x11, 0x23, 0x11, 0x37, 0x33, 0x17, 0x01, 0x23, 0x73, 0x73, 0x73, 0x0a, 0x5c, 0x0d, 0x05, 0x52, 0x8e, 0xfc, 0xbc, 0x01, 0x6f, 0xc8, 0xc8, 0x00, 0xff, 0xff, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x23, 0x03, 0x44, 0x10, 0x07, 0x0e, 0x5c, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x00, 0x00, 0x02, 0x86, 0x05, 0xd4, 0x00, 0x10, 0x00, 0x00, 0x33, 0x35, 0x20, 0x02, 0x21, 0x35, 0x20, 0x02, 0x21, 0x35, 0x20, 0x13, 0x16, 0x07, 0x16, 0x13, 0x12, 0xba, 0x01, 0x29, 0x12, 0xfe, 0xd7, 0x01, 0x29, 0x1b, 0xfe, 0xc5, 0x01, 0xe7, 0x0d, 0x08, 0x9d, 0xa6, 0x05, 0x09, 0xa3, 0x02, 0x27, 0xa3, 0x01, 0xc5, 0xa2, 0xfe, 0x8c, 0xe5, 0x63, 0x6d, 0xfe, 0xfb, 0xfe, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x00, 0x00, 0x02, 0x50, 0x04, 0x60, 0x00, 0x10, 0x00, 0x00, 0x33, 0x35, 0x20, 0x02, 0x21, 0x35, 0x20, 0x02, 0x21, 0x35, 0x20, 0x13, 0x16, 0x07, 0x16, 0x17, 0x12, 0xa8, 0x01, 0x0e, 0x12, 0xfe, 0xf2, 0x01, 0x0e, 0x1b, 0xfe, 0xf2, 0x01, 0xb1, 0x0d, 0x07, 0x77, 0x81, 0x05, 0x09, 0x99, 0x01, 0x7c, 0x99, 0x01, 0x1a, 0x98, 0xfe, 0xe8, 0x9e, 0x4d, 0x59, 0xbc, 0xfe, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0x01, 0xcb, 0x02, 0xf6, 0x05, 0xf0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x10, 0x17, 0x07, 0x02, 0x35, 0x10, 0x21, 0x15, 0x20, 0x01, 0x0f, 0x69, 0x93, 0x7d, 0x02, 0x8e, 0xfe, 0x19, 0x03, 0xcd, 0xfe, 0xfe, 0xd2, 0x2e, 0x01, 0x31, 0xd4, 0x02, 0x20, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0x00, 0x56, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x09, 0x00, 0x00, 0x01, 0x10, 0x17, 0x07, 0x02, 0x35, 0x10, 0x21, 0x15, 0x20, 0x01, 0x0f, 0x69, 0x93, 0x7d, 0x02, 0x8e, 0xfe, 0x19, 0x02, 0x58, 0xfe, 0xfe, 0xd2, 0x2e, 0x01, 0x31, 0xd4, 0x02, 0x20, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0xb8, 0xcd, 0x45, 0x39, 0x78, 0x63, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x02, 0x5f, 0xfd, 0x39, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x14, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x03, 0x4e, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x93, 0xa3, 0x3f, 0x2c, 0x63, 0x1e, 0x22, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x06, 0x14, 0xfd, 0x9e, 0x65, 0x64, 0xef, 0xe8, 0xfd, 0x48, 0xd6, 0xc0, 0x9c, 0x30, 0x38, 0x92, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x4c, 0x05, 0xe6, 0x05, 0xd5, 0x00, 0x2a, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x05, 0x04, 0x70, 0xfe, 0x23, 0x03, 0x08, 0xfe, 0x8e, 0x5f, 0x74, 0x59, 0x4c, 0x49, 0x89, 0x88, 0xfc, 0x68, 0x74, 0x75, 0x75, 0x60, 0x72, 0x71, 0x7b, 0xad, 0x59, 0x5a, 0x52, 0x54, 0x95, 0x9c, 0x01, 0x5a, 0xfd, 0xdb, 0xb6, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0xcb, 0x9a, 0xfe, 0x16, 0x38, 0x2b, 0x6c, 0x68, 0x8a, 0xdc, 0x7a, 0x79, 0x13, 0x13, 0x24, 0xc3, 0x31, 0x19, 0x19, 0x4b, 0x4b, 0x8f, 0x86, 0x49, 0x4a, 0x98, 0x01, 0xea, 0xfc, 0x4a, 0x05, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x4c, 0x04, 0xaf, 0x05, 0x9e, 0x00, 0x30, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0xee, 0x5e, 0x74, 0x59, 0x4d, 0x49, 0xfe, 0xee, 0xfc, 0x54, 0x59, 0x5a, 0x60, 0x4c, 0xb4, 0x62, 0xab, 0x59, 0x5a, 0x53, 0x52, 0x96, 0x9d, 0x01, 0x83, 0xfd, 0xad, 0x43, 0x67, 0xab, 0xab, 0xbf, 0x92, 0x79, 0x79, 0xa7, 0x03, 0x0e, 0x01, 0xdc, 0x38, 0x2b, 0x6c, 0x68, 0x8a, 0xdd, 0xf2, 0x12, 0x13, 0x25, 0xc3, 0x31, 0x32, 0x4b, 0x4b, 0x8f, 0x84, 0x4b, 0x4a, 0xa6, 0x01, 0xf3, 0xfd, 0xa4, 0x89, 0x4e, 0x9a, 0x9f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0xfe, 0xc2, 0xa8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xe3, 0x04, 0x09, 0x05, 0xf0, 0x10, 0x06, 0x01, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xfe, 0x67, 0x03, 0x68, 0x04, 0x7c, 0x00, 0x31, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x64, 0x65, 0x36, 0x36, 0x66, 0x66, 0xb0, 0x45, 0x99, 0x58, 0x57, 0x48, 0x49, 0x40, 0x74, 0x35, 0x3f, 0x3d, 0x3c, 0x69, 0x8b, 0x85, 0x7b, 0x41, 0x46, 0x4b, 0x4d, 0x88, 0x57, 0x49, 0x4c, 0x40, 0x51, 0x4b, 0x4d, 0x48, 0xd6, 0xe8, 0x7c, 0x01, 0xac, 0x20, 0x56, 0x55, 0x7b, 0xba, 0x68, 0x68, 0x1a, 0x26, 0xb6, 0x2d, 0x14, 0x15, 0x3e, 0x48, 0x6d, 0x6d, 0x46, 0x45, 0x98, 0x4d, 0x55, 0x85, 0x88, 0x55, 0x55, 0x1c, 0x1c, 0x38, 0xbe, 0x25, 0x13, 0x12, 0xf0, 0xe5, 0x8f, 0xc1, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x25, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0xa7, 0x02, 0x7e, 0xfe, 0x2a, 0x01, 0xa6, 0xfe, 0x5a, 0xa8, 0x04, 0x60, 0x94, 0xfe, 0xd3, 0x94, 0xfd, 0xf5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x56, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x08, 0xf0, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x15, 0x00, 0x00, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0x03, 0x21, 0x03, 0x2b, 0x01, 0x03, 0x21, 0x03, 0x23, 0x01, 0x03, 0x21, 0x01, 0x03, 0x21, 0x02, 0x0f, 0xcf, 0x01, 0xa1, 0x01, 0xa3, 0xce, 0x02, 0x00, 0xbd, 0x7b, 0xfd, 0xa3, 0x7b, 0x02, 0xbd, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x02, 0x68, 0xf7, 0x01, 0xef, 0x03, 0x1a, 0xf6, 0x01, 0xee, 0x05, 0xd5, 0xfb, 0x3e, 0x04, 0xc2, 0xfa, 0x2b, 0x01, 0x7f, 0xfe, 0x81, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0x0e, 0xfd, 0x19, 0x02, 0xe7, 0xfd, 0x19, 0x00, 0x04, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0x70, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x35, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x25, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x15, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x30, 0x17, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x01, 0x16, 0x17, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x02, 0x78, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x03, 0x54, 0xa6, 0x38, 0xaa, 0x7a, 0x63, 0x49, 0xa6, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0x6c, 0x10, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0xfe, 0xb6, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0xfd, 0xc8, 0x2f, 0x01, 0x6d, 0xb3, 0xe8, 0x96, 0x88, 0x56, 0x52, 0x3b, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x4c, 0xfd, 0x81, 0xaa, 0x66, 0x61, 0x27, 0x0a, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0x7e, 0x14, 0x44, 0x27, 0x27, 0xfc, 0xfe, 0xb4, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x01, 0x68, 0x6e, 0xa6, 0x3c, 0x12, 0x7f, 0x8b, 0x17, 0x10, 0x00, 0x03, 0x00, 0x0e, 0xff, 0xe3, 0x08, 0x43, 0x05, 0xf0, 0x00, 0x13, 0x00, 0x16, 0x00, 0x20, 0x00, 0x00, 0x01, 0x33, 0x13, 0x36, 0x37, 0x36, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x27, 0x26, 0x27, 0x21, 0x03, 0x23, 0x01, 0x03, 0x21, 0x00, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x02, 0x0f, 0xcf, 0xa5, 0x29, 0x64, 0xaa, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xaa, 0x47, 0x2a, 0xfd, 0xa9, 0x7a, 0xc0, 0x02, 0x68, 0xf7, 0x01, 0xef, 0x03, 0x2d, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe7, 0x05, 0xd5, 0xfe, 0x1e, 0xae, 0x7d, 0xd2, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0xd2, 0x58, 0x72, 0xfe, 0x81, 0x05, 0x0e, 0xfd, 0x19, 0x03, 0x25, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xbc, 0x04, 0x7b, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x38, 0x00, 0x00, 0x01, 0x32, 0x12, 0x11, 0x10, 0x02, 0x20, 0x27, 0x26, 0x27, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x20, 0x17, 0x36, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x01, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x04, 0xed, 0xd8, 0xf7, 0xf7, 0xfe, 0x4f, 0x7b, 0x31, 0x1e, 0x10, 0x56, 0x7e, 0xa0, 0xa0, 0xb7, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0x01, 0x0c, 0x66, 0x7c, 0xfe, 0x7b, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x01, 0xd1, 0x85, 0x9b, 0x9a, 0x86, 0x84, 0x9b, 0x9b, 0x04, 0x7b, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x9d, 0x3e, 0x52, 0x45, 0x87, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xbd, 0xbd, 0xfd, 0xb8, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x01, 0xac, 0xe7, 0xfe, 0x6e, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0x00, 0x00, 0x02, 0x00, 0x0e, 0xff, 0xe3, 0x07, 0x99, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x33, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x00, 0x23, 0x20, 0x03, 0x27, 0x21, 0x03, 0x23, 0x02, 0x76, 0xf7, 0x01, 0xef, 0xfe, 0xa1, 0xcf, 0x01, 0x8f, 0x42, 0xe8, 0xaf, 0x9c, 0xb7, 0xfe, 0xfc, 0xfe, 0xfe, 0x9a, 0x69, 0x22, 0xfd, 0xa2, 0x7a, 0xc0, 0x05, 0x0e, 0xfd, 0x19, 0x03, 0xae, 0xfb, 0x72, 0xc0, 0xd3, 0xf0, 0x03, 0x8b, 0xfc, 0x5c, 0xfe, 0xdc, 0xfe, 0xd6, 0x01, 0x34, 0x68, 0xfe, 0x81, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0x69, 0x04, 0x7b, 0x00, 0x28, 0x00, 0x33, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x11, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x03, 0x37, 0x41, 0x91, 0xa0, 0x9f, 0xb7, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0x70, 0x6f, 0x86, 0x9c, 0xa6, 0xa6, 0x3c, 0x9f, 0x6a, 0xfe, 0xfe, 0xf8, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0xdf, 0x8d, 0x6f, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0xff, 0x00, 0xbe, 0x9f, 0x9f, 0xbe, 0xa4, 0x02, 0x7b, 0xfb, 0xa0, 0xac, 0x66, 0x63, 0x02, 0x50, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x06, 0xef, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x03, 0x21, 0x13, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x02, 0x76, 0xf7, 0x01, 0xef, 0xb3, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x02, 0x01, 0xcf, 0x01, 0xac, 0x01, 0xa8, 0xbd, 0xfe, 0x00, 0x05, 0x0e, 0xfd, 0x19, 0xfd, 0xd9, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0xff, 0xe3, 0x05, 0xad, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x11, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x19, 0x01, 0x01, 0x33, 0x01, 0x02, 0x78, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0x01, 0x3b, 0xb0, 0xfe, 0x86, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0xfd, 0xcd, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0xff, 0x00, 0xfe, 0x35, 0x03, 0xac, 0xfb, 0xa0, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x06, 0xef, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x12, 0x00, 0x15, 0x00, 0x00, 0x01, 0x03, 0x29, 0x02, 0x15, 0x21, 0x03, 0x23, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x01, 0x33, 0x01, 0x33, 0x01, 0x23, 0x17, 0x02, 0x76, 0xf7, 0x01, 0xef, 0x02, 0x3e, 0x01, 0x43, 0xfe, 0x83, 0x83, 0xce, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x02, 0x01, 0xcf, 0x01, 0x43, 0xd1, 0x01, 0x40, 0xbd, 0xfd, 0xca, 0x5f, 0x30, 0x05, 0x0e, 0xfd, 0x19, 0xa8, 0xfe, 0x81, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0xd5, 0xfc, 0x52, 0x03, 0xae, 0xfb, 0xaa, 0x8b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xff, 0xe3, 0x05, 0xad, 0x04, 0x7b, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x30, 0x00, 0x00, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x33, 0x13, 0x33, 0x03, 0x33, 0x15, 0x23, 0x03, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x21, 0x23, 0x11, 0x03, 0x1c, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0x6c, 0x5d, 0x0d, 0xb2, 0x8b, 0xb0, 0x8c, 0x8c, 0xbd, 0xbd, 0xfe, 0x45, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x01, 0x27, 0x81, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0x7e, 0x6d, 0xcd, 0x01, 0x9d, 0xfe, 0x63, 0x90, 0xfd, 0xcd, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0xfe, 0x81, 0x00, 0x00, 0x02, 0x00, 0x0e, 0xfe, 0x56, 0x06, 0xd9, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x76, 0xf7, 0x01, 0xef, 0x01, 0x47, 0x43, 0x46, 0x42, 0x70, 0xc2, 0x9a, 0x44, 0x26, 0x26, 0x2e, 0x11, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x02, 0x01, 0xcf, 0x01, 0xa0, 0x01, 0x9d, 0xbd, 0x05, 0x0e, 0xfd, 0x19, 0xfd, 0x71, 0xc6, 0x3f, 0x3d, 0xaa, 0x24, 0x25, 0x85, 0x32, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0xd5, 0xfb, 0x40, 0x04, 0xc0, 0x00, 0x02, 0x00, 0x6e, 0xfe, 0x56, 0x05, 0xad, 0x04, 0x7b, 0x00, 0x27, 0x00, 0x32, 0x00, 0x00, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x19, 0x01, 0x01, 0x33, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x03, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x03, 0x1c, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0x01, 0x3b, 0xb0, 0xfe, 0x45, 0x46, 0x86, 0x6f, 0x85, 0x62, 0x44, 0x4c, 0x2e, 0x17, 0xf1, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0xff, 0x00, 0xfe, 0x77, 0x03, 0x6a, 0xfb, 0x38, 0xc8, 0x7a, 0x9a, 0x48, 0x86, 0x42, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x06, 0x03, 0x93, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x06, 0x03, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0xac, 0xac, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0x02, 0xca, 0xef, 0xfd, 0x7b, 0xb6, 0xac, 0xac, 0x05, 0xd5, 0xb9, 0xaa, 0xfe, 0xec, 0x02, 0x77, 0xfd, 0x48, 0xfc, 0xe3, 0x02, 0xcf, 0xfd, 0x31, 0x04, 0x72, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x12, 0x00, 0x00, 0x13, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xaf, 0xa6, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x02, 0x2d, 0xd8, 0xfe, 0x00, 0xa6, 0xa2, 0xa2, 0x06, 0x14, 0xac, 0xa4, 0xfd, 0xb9, 0x01, 0xe3, 0xfd, 0xf4, 0xfd, 0xac, 0x02, 0x23, 0xfd, 0xdd, 0x04, 0xc4, 0xa4, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xdc, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x37, 0x11, 0x21, 0x15, 0x21, 0x11, 0xb5, 0xb6, 0xe3, 0x02, 0x8e, 0xfc, 0xbc, 0x02, 0xad, 0x03, 0x28, 0xfd, 0x5e, 0x4d, 0xfd, 0x2a, 0xaa, 0x02, 0xfa, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x02, 0x26, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x37, 0x11, 0x23, 0x11, 0xae, 0xa5, 0xd3, 0xa6, 0x02, 0x9c, 0x03, 0x78, 0xfd, 0x05, 0x49, 0xfc, 0x9e, 0x02, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x00, 0x04, 0x26, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x35, 0x33, 0xe2, 0xb6, 0x97, 0x97, 0x02, 0x8e, 0xfc, 0xbc, 0x97, 0x97, 0x05, 0xd5, 0xe0, 0xa4, 0xfc, 0x59, 0xaa, 0x04, 0x51, 0xa4, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x02, 0xa7, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x01, 0x36, 0xa6, 0xcb, 0xcb, 0xa6, 0xca, 0xca, 0x06, 0x14, 0xfe, 0xe2, 0xa4, 0xfb, 0xae, 0x04, 0x52, 0xa4, 0x00, 0x03, 0x00, 0x09, 0xff, 0xe3, 0x05, 0xc6, 0x05, 0xf0, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x13, 0x33, 0x15, 0x23, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x23, 0x35, 0x33, 0x12, 0x37, 0x36, 0x04, 0x20, 0x07, 0x06, 0x07, 0x21, 0x26, 0x27, 0x13, 0x21, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x02, 0xe8, 0x01, 0x1b, 0xa9, 0x91, 0x15, 0x74, 0x72, 0x0a, 0x9e, 0xa9, 0xfe, 0xe5, 0xfe, 0xe5, 0xa9, 0xa0, 0x0a, 0x71, 0x74, 0x15, 0x92, 0xa9, 0x01, 0xe1, 0xfe, 0x74, 0x74, 0x5f, 0x12, 0x03, 0x55, 0x11, 0x5f, 0x73, 0xfc, 0xa5, 0x09, 0x6b, 0x74, 0x01, 0x8c, 0x74, 0x6b, 0x05, 0xf0, 0xd2, 0xb5, 0xfe, 0xe3, 0x90, 0xfe, 0xbe, 0xc4, 0xd3, 0xd2, 0xc4, 0x01, 0x43, 0x90, 0x01, 0x1d, 0xb5, 0xd2, 0xa4, 0xa4, 0x86, 0xd6, 0xd6, 0x86, 0xfe, 0x14, 0xfa, 0x97, 0xa4, 0xa4, 0x97, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0xff, 0xe3, 0x05, 0x00, 0x04, 0x7b, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x17, 0x22, 0x07, 0x06, 0x07, 0x21, 0x26, 0x27, 0x26, 0x13, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x02, 0x85, 0xd8, 0x7c, 0x63, 0x13, 0xb1, 0xad, 0x09, 0x71, 0x7c, 0xd8, 0xd9, 0x7a, 0x71, 0x09, 0xaf, 0xb2, 0x13, 0x64, 0x7a, 0xd9, 0x85, 0x4d, 0x39, 0x0f, 0x02, 0x34, 0x0f, 0x39, 0x4d, 0x9a, 0xfd, 0xc2, 0x07, 0x45, 0x4d, 0x86, 0x85, 0x4d, 0x45, 0x04, 0x7b, 0x9c, 0x7e, 0xcd, 0x90, 0xf4, 0x90, 0x9d, 0x9d, 0x90, 0xf4, 0x90, 0xcd, 0x7e, 0x9c, 0x9c, 0x73, 0x55, 0x83, 0x81, 0x55, 0x75, 0xfe, 0x25, 0xab, 0x67, 0x73, 0x74, 0x67, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xff, 0xe3, 0x09, 0x60, 0x05, 0xf0, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x21, 0x20, 0x00, 0x10, 0x00, 0x04, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x00, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x02, 0xd6, 0x01, 0x1b, 0xa9, 0x2a, 0x20, 0x1f, 0x2a, 0xaa, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xaa, 0x2a, 0x20, 0x1f, 0x2a, 0xa9, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x01, 0xe1, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe8, 0x03, 0x34, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe8, 0x05, 0xf0, 0xd2, 0x35, 0x3d, 0x3d, 0x35, 0xd2, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0xd2, 0x34, 0x3d, 0x3c, 0x34, 0xd3, 0x01, 0xa4, 0x02, 0xc4, 0x01, 0xa5, 0xa4, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x48, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xf1, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x31, 0x00, 0x00, 0x01, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x21, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x05, 0x22, 0x85, 0x9b, 0x9a, 0x86, 0x84, 0x9b, 0x9b, 0xfc, 0x8e, 0x85, 0x9b, 0x9a, 0x86, 0x85, 0x9a, 0x9a, 0x85, 0xd8, 0x7c, 0x12, 0x11, 0x10, 0x13, 0x7b, 0xd9, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0x7b, 0x13, 0x10, 0x11, 0x12, 0x7c, 0xd8, 0xd9, 0xf5, 0xf5, 0x03, 0xdf, 0xe7, 0xfe, 0x6e, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0xe7, 0xfe, 0x6e, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0x9c, 0x9c, 0x18, 0x1b, 0x1b, 0x18, 0x9c, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x9d, 0x18, 0x1b, 0x1b, 0x18, 0x9d, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xfe, 0x66, 0x01, 0x9a, 0xe2, 0x73, 0x74, 0x74, 0x73, 0xe2, 0xe4, 0xd5, 0xd5, 0xb6, 0xac, 0xac, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xa6, 0x71, 0x72, 0xdb, 0xdd, 0x71, 0x71, 0xc4, 0x90, 0xfe, 0xfc, 0x01, 0x04, 0x90, 0x00, 0x00, 0x02, 0xff, 0xfb, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x01, 0x35, 0x33, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x03, 0x81, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0xfd, 0x11, 0xab, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xe4, 0xe4, 0xa7, 0x01, 0x64, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0xfe, 0x67, 0x90, 0x04, 0xec, 0xaa, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xfe, 0xcc, 0x90, 0x8e, 0x8e, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x0a, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x00, 0x01, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x22, 0x07, 0x06, 0x15, 0x16, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x03, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x01, 0xa6, 0x01, 0x9a, 0xe2, 0xe8, 0xe8, 0xe2, 0xe4, 0xb6, 0x28, 0x53, 0x2b, 0x35, 0x01, 0x18, 0x15, 0x35, 0x3d, 0x47, 0x3e, 0x3f, 0x72, 0x58, 0x91, 0x1e, 0xb6, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xe4, 0x05, 0xd5, 0xe3, 0xdb, 0xdd, 0xe2, 0xfd, 0xa8, 0x02, 0x58, 0x18, 0x1f, 0x3d, 0x35, 0x27, 0x20, 0x18, 0x94, 0x17, 0x49, 0x4b, 0x7d, 0x93, 0x4c, 0x3b, 0x92, 0x87, 0x86, 0x92, 0x00, 0x02, 0x00, 0x2d, 0xfe, 0x56, 0x05, 0x2f, 0x04, 0x7b, 0x00, 0x0c, 0x00, 0x31, 0x00, 0x00, 0x01, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x20, 0x06, 0x15, 0x03, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x27, 0x11, 0x23, 0x02, 0x4f, 0x09, 0x8e, 0x83, 0x80, 0x4f, 0x4b, 0x97, 0xfe, 0xfa, 0x97, 0xa6, 0x2e, 0x25, 0x28, 0x2e, 0x35, 0x19, 0x15, 0x35, 0x3d, 0x47, 0x3e, 0x3f, 0x72, 0x4b, 0x5e, 0x30, 0x31, 0xa6, 0x35, 0x9f, 0x6f, 0xb7, 0xe6, 0xe6, 0xb6, 0xac, 0x98, 0xa6, 0x01, 0x32, 0x0b, 0xaa, 0x73, 0x70, 0xcf, 0xcb, 0xe7, 0xe7, 0xcb, 0xfe, 0xe3, 0x19, 0x18, 0x1b, 0x41, 0x34, 0x28, 0x20, 0x18, 0x94, 0x17, 0x49, 0x4b, 0x7d, 0x86, 0x59, 0x3b, 0x17, 0x02, 0xa6, 0xaa, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0xa2, 0xfd, 0xd1, 0x00, 0x00, 0x02, 0x00, 0x67, 0xfe, 0x94, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x09, 0x00, 0x23, 0x00, 0x00, 0x00, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x01, 0x27, 0x37, 0x27, 0x07, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x02, 0x07, 0x17, 0x37, 0x17, 0x07, 0x17, 0x23, 0x27, 0x03, 0x9c, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe8, 0xfe, 0xa6, 0x41, 0x99, 0x60, 0x2e, 0x10, 0x0e, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xbc, 0xb2, 0x3e, 0xc2, 0x40, 0xa9, 0x58, 0xdb, 0x0d, 0x05, 0x4c, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0xfa, 0x90, 0x7d, 0x62, 0x74, 0x03, 0x01, 0x01, 0xa5, 0x01, 0x61, 0x01, 0x62, 0x01, 0xa5, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0xfc, 0xfe, 0x8e, 0x58, 0x4b, 0x7c, 0x7d, 0x6c, 0x6b, 0x0f, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x97, 0x04, 0x7b, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x00, 0x10, 0x16, 0x20, 0x36, 0x10, 0x26, 0x20, 0x03, 0x45, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0xab, 0xab, 0xa6, 0xe5, 0xe5, 0xfd, 0xcc, 0x96, 0x01, 0x07, 0x97, 0x97, 0xfe, 0xf9, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x02, 0x10, 0x01, 0x44, 0x61, 0x64, 0xaa, 0xfb, 0x14, 0x90, 0x8e, 0x8e, 0x90, 0x03, 0x86, 0xfe, 0x6a, 0xe7, 0xe7, 0x01, 0x96, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x01, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x32, 0x16, 0x10, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8a, 0x80, 0xfe, 0x66, 0xb6, 0xd5, 0xd5, 0xe4, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xb6, 0xac, 0xac, 0x04, 0x27, 0xfd, 0xd1, 0x92, 0x01, 0x0c, 0x91, 0x01, 0xae, 0x2d, 0x90, 0x4b, 0xe1, 0xfe, 0x48, 0xe2, 0xfe, 0xae, 0x05, 0x18, 0x90, 0x00, 0x00, 0x02, 0xff, 0xfb, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x25, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x03, 0x81, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0xfe, 0x63, 0xa7, 0xab, 0xab, 0xa7, 0xe4, 0xe4, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x01, 0x64, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0x2b, 0xfd, 0xae, 0x06, 0x9b, 0x90, 0x93, 0x93, 0x90, 0xfe, 0xc5, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x01, 0x33, 0x11, 0x33, 0x32, 0x16, 0x10, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8a, 0x80, 0xfe, 0x66, 0xb6, 0xe4, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xd5, 0xd5, 0xb6, 0xac, 0xac, 0x04, 0x27, 0xfd, 0xd1, 0x92, 0x01, 0x0c, 0x91, 0x01, 0xae, 0xfe, 0xf8, 0xe1, 0xfe, 0x48, 0xe2, 0x5e, 0x90, 0x64, 0x64, 0x90, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfb, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x03, 0x81, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0xfd, 0x11, 0xab, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xe4, 0xe4, 0xa7, 0x01, 0x64, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0xfe, 0x67, 0x90, 0x06, 0xa0, 0xfd, 0xa2, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xfe, 0xcc, 0x90, 0x8e, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0x4e, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0x4e, 0xb6, 0xfd, 0x72, 0x03, 0x44, 0x05, 0x2b, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0xfe, 0x56, 0x01, 0x54, 0x04, 0x7b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x07, 0x33, 0x11, 0x23, 0x01, 0x00, 0x52, 0xa5, 0xa5, 0x04, 0x7b, 0x1b, 0xf9, 0xf6, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0x97, 0x05, 0xf0, 0x00, 0x14, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x12, 0x19, 0x01, 0x23, 0x03, 0xe2, 0x8b, 0x8a, 0xa1, 0xc1, 0xb6, 0xb6, 0x48, 0x5c, 0x5b, 0x8e, 0xcd, 0xd1, 0xb4, 0x03, 0x7f, 0xd7, 0xd5, 0xff, 0xde, 0xfb, 0x08, 0x07, 0x7f, 0xf1, 0x87, 0x43, 0x42, 0xfe, 0xc1, 0xfe, 0xcc, 0xfc, 0x83, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfb, 0xdd, 0x06, 0x0a, 0xae, 0x65, 0x64, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd8, 0x00, 0x00, 0x01, 0x96, 0x04, 0x23, 0x12, 0x06, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x90, 0x01, 0x49, 0x02, 0x25, 0x03, 0x0b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x02, 0x25, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0x95, 0x01, 0x49, 0x96, 0x96, 0x96, 0x00, 0x00, 0x01, 0x01, 0x16, 0x01, 0xe1, 0x01, 0xcd, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x01, 0x33, 0x11, 0x03, 0x23, 0x03, 0x01, 0x16, 0xb7, 0x12, 0x92, 0x13, 0x05, 0xd5, 0xfd, 0x71, 0xfe, 0x9b, 0x01, 0x65, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb1, 0x03, 0xaa, 0x01, 0x4b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x4a, 0x99, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0xff, 0xff, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x05, 0xd5, 0x12, 0x06, 0x03, 0xbb, 0x00, 0x00, 0x00, 0x02, 0x00, 0x45, 0xfe, 0x56, 0x02, 0xff, 0x06, 0x14, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x14, 0x33, 0x37, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x30, 0x03, 0x23, 0x22, 0x37, 0x36, 0x33, 0x32, 0x01, 0x6a, 0x15, 0x31, 0x46, 0x01, 0x53, 0x48, 0xa6, 0xe1, 0xe1, 0x37, 0x6c, 0x2c, 0x3f, 0xac, 0x8a, 0x02, 0x36, 0xfc, 0x01, 0x01, 0xdd, 0x30, 0x03, 0x12, 0x84, 0x4b, 0x39, 0xfa, 0x02, 0x08, 0xfc, 0xfe, 0xa0, 0xfd, 0x70, 0x7c, 0x74, 0x9c, 0xcc, 0xca, 0x02, 0x86, 0xbd, 0xf6, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x47, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x11, 0x23, 0xb5, 0xf5, 0x02, 0x54, 0xb0, 0x99, 0x99, 0xf5, 0xfd, 0xac, 0xb0, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0x04, 0xe1, 0xfb, 0x1f, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x78, 0x04, 0x7b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0x84, 0x84, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0xef, 0xfe, 0x52, 0x01, 0x1b, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x64, 0xef, 0x00, 0x01, 0x00, 0x03, 0xff, 0xe3, 0x05, 0x9a, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x25, 0x11, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x24, 0x27, 0x26, 0x27, 0x07, 0x27, 0x37, 0x34, 0x35, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x03, 0x01, 0x17, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x04, 0x49, 0xfe, 0xd7, 0x01, 0xdd, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xb2, 0x7f, 0x24, 0x4c, 0x26, 0x64, 0x01, 0x63, 0x01, 0x3b, 0x83, 0xed, 0x64, 0x65, 0xe3, 0x7d, 0xf5, 0x7d, 0x79, 0x03, 0x04, 0x4c, 0x27, 0xfb, 0x94, 0x16, 0x5f, 0x7d, 0xf5, 0x61, 0x97, 0xd5, 0x01, 0x91, 0xa6, 0xfd, 0x7f, 0x53, 0x55, 0x01, 0xcc, 0x92, 0xe2, 0x1c, 0x7f, 0x25, 0x1e, 0x1f, 0x01, 0x6e, 0x01, 0x99, 0x48, 0x46, 0xd7, 0x5f, 0x60, 0x99, 0x97, 0xfe, 0xd9, 0x01, 0x95, 0x7f, 0xfe, 0x5f, 0xcf, 0x77, 0x99, 0x25, 0x00, 0x03, 0x00, 0x03, 0xfe, 0x56, 0x04, 0x8f, 0x04, 0x7b, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x00, 0x25, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x37, 0x17, 0x0f, 0x01, 0x05, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x03, 0xeb, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0x71, 0x3c, 0x1c, 0x5e, 0x1d, 0x68, 0x06, 0xe2, 0xba, 0x70, 0xa0, 0x33, 0xa6, 0x86, 0x1d, 0xa3, 0xa7, 0xfd, 0xdc, 0x12, 0x29, 0x4a, 0x85, 0x86, 0x95, 0x0c, 0x11, 0x2d, 0x4a, 0x87, 0x85, 0x94, 0x01, 0x8b, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0x9d, 0x53, 0x70, 0x23, 0x63, 0x27, 0x38, 0x3e, 0x01, 0x04, 0x01, 0x3a, 0x62, 0x63, 0xaa, 0xfe, 0xb1, 0x32, 0x63, 0x3d, 0x3d, 0xcb, 0x57, 0x3c, 0x6e, 0xdc, 0xc7, 0x15, 0x7e, 0x62, 0x41, 0x6e, 0xdc, 0xc8, 0x1d, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x16, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x01, 0x17, 0x25, 0x17, 0x05, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x25, 0x27, 0x15, 0xb5, 0xb6, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0x6d, 0x02, 0x16, 0x27, 0xfe, 0x22, 0x01, 0xfe, 0xef, 0xfe, 0x3d, 0xc2, 0xb6, 0x8b, 0x26, 0xb1, 0x01, 0x19, 0x63, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x48, 0x7a, 0xc5, 0x7f, 0xb0, 0xfd, 0xc7, 0x01, 0xf7, 0x48, 0xfe, 0x51, 0x01, 0x6c, 0x33, 0x7f, 0x41, 0x68, 0x6e, 0x93, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x04, 0x28, 0x06, 0x14, 0x00, 0x13, 0x00, 0x16, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x01, 0x17, 0x25, 0x17, 0x05, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x35, 0x07, 0x27, 0x37, 0x25, 0x27, 0x15, 0xa7, 0xa7, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x55, 0x01, 0xbc, 0x1e, 0xfe, 0x72, 0x01, 0x8c, 0xd8, 0xfe, 0xab, 0xab, 0xa7, 0x86, 0x1d, 0xa3, 0x01, 0x05, 0x5e, 0x06, 0x14, 0xfc, 0x69, 0x01, 0xe3, 0xfd, 0xf4, 0x5b, 0xa4, 0x62, 0x93, 0xfe, 0x58, 0x01, 0x6c, 0x3f, 0xfe, 0xd3, 0xf0, 0x32, 0x63, 0x3c, 0x61, 0x65, 0x88, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x05, 0x60, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x16, 0x00, 0x19, 0x00, 0x00, 0x13, 0x33, 0x01, 0x25, 0x11, 0x33, 0x11, 0x37, 0x17, 0x07, 0x11, 0x23, 0x01, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x25, 0x03, 0x11, 0x25, 0x13, 0x11, 0xb5, 0xf5, 0x01, 0x3b, 0x01, 0x19, 0xb0, 0x8a, 0x27, 0xb1, 0xf5, 0xfe, 0xc9, 0xfe, 0xe3, 0xb0, 0x8b, 0x26, 0xb1, 0x01, 0x93, 0xe3, 0x01, 0xb9, 0xe0, 0x05, 0xd5, 0xfd, 0x6b, 0x67, 0x02, 0x2e, 0xfe, 0x13, 0x33, 0x7f, 0x41, 0xfc, 0xa5, 0x02, 0x8e, 0x69, 0xfd, 0xdb, 0x01, 0xe4, 0x33, 0x7f, 0x41, 0x95, 0x01, 0xdb, 0xfd, 0xd1, 0x16, 0xfe, 0x2c, 0x02, 0x26, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x04, 0x8f, 0x04, 0x7b, 0x00, 0x17, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x36, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x03, 0xf4, 0xa6, 0xfe, 0x00, 0xa7, 0x86, 0x1d, 0xa3, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0x59, 0x43, 0x11, 0x83, 0x1d, 0x9a, 0xa8, 0x08, 0x2e, 0x38, 0x6f, 0x86, 0x9b, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x6a, 0xbe, 0xfe, 0x54, 0x01, 0x6f, 0x32, 0x63, 0x3d, 0x02, 0x83, 0xae, 0x65, 0x64, 0x01, 0x78, 0x59, 0x99, 0x31, 0x63, 0x39, 0x30, 0x75, 0x40, 0x4f, 0xbe, 0xa4, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x04, 0xfe, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x11, 0x21, 0x32, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07, 0x14, 0x15, 0x14, 0x06, 0x2d, 0x01, 0x26, 0x27, 0x26, 0x27, 0x23, 0x11, 0x15, 0x33, 0x16, 0x37, 0x36, 0x37, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0x8b, 0x26, 0xb1, 0x01, 0x9a, 0xe7, 0x71, 0x42, 0x1c, 0xd1, 0x27, 0xe5, 0x75, 0xfd, 0xc8, 0x01, 0xe3, 0x10, 0x28, 0x42, 0x85, 0xe4, 0xe4, 0x85, 0x42, 0x37, 0x0a, 0x02, 0xbc, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x03, 0x01, 0x33, 0x7f, 0x42, 0x02, 0x46, 0x6b, 0x3e, 0x64, 0x4e, 0x7f, 0x55, 0x0d, 0x0e, 0x8d, 0xba, 0xf2, 0xb3, 0x3f, 0x28, 0x42, 0x01, 0xfe, 0x16, 0x28, 0x01, 0x44, 0x38, 0x63, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x25, 0x17, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xf6, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0x01, 0x86, 0x1e, 0xfe, 0x5c, 0xa7, 0x86, 0x1d, 0xa3, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x03, 0xb4, 0x12, 0x11, 0xcb, 0xbe, 0x34, 0x90, 0x62, 0x9c, 0xfe, 0x54, 0x01, 0x6f, 0x32, 0x63, 0x3c, 0x02, 0x84, 0xae, 0x66, 0x63, 0x05, 0x05, 0x00, 0x00, 0x01, 0x00, 0x03, 0xff, 0xe3, 0x04, 0x8f, 0x05, 0xf0, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x05, 0x27, 0x25, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0xda, 0x67, 0xb8, 0x55, 0x95, 0xa1, 0x6b, 0x96, 0x4b, 0x01, 0xec, 0x26, 0xfe, 0xbd, 0x4f, 0x30, 0x61, 0xfe, 0xfb, 0xfd, 0x60, 0xd7, 0x73, 0x6f, 0xd4, 0x67, 0x9b, 0xaa, 0x7a, 0x8b, 0x57, 0xfe, 0x18, 0x26, 0x01, 0x41, 0x45, 0x2c, 0x5a, 0xfb, 0xdc, 0x5f, 0xc4, 0x05, 0xa4, 0xc5, 0x37, 0x36, 0x80, 0x76, 0x63, 0x65, 0x1f, 0x11, 0xb5, 0x7f, 0x77, 0x27, 0x38, 0x6c, 0xb6, 0xd9, 0xe0, 0x30, 0x2f, 0xd0, 0x45, 0x46, 0x88, 0x7e, 0x6e, 0x7c, 0x1f, 0x13, 0xb4, 0x7f, 0x77, 0x22, 0x2e, 0x60, 0xab, 0xc6, 0xe4, 0x26, 0x00, 0x00, 0x01, 0x00, 0x03, 0xff, 0xe3, 0x03, 0xbd, 0x04, 0x7b, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x05, 0x27, 0x25, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x30, 0x46, 0x97, 0x51, 0x7b, 0x7c, 0x59, 0x85, 0x28, 0x01, 0x8e, 0x1e, 0xfe, 0xf3, 0x44, 0x28, 0x49, 0x01, 0xde, 0xc2, 0x51, 0xb0, 0x61, 0x5c, 0xb2, 0x57, 0x75, 0x7e, 0x5b, 0x9a, 0x20, 0xfe, 0x7a, 0x1d, 0x01, 0x06, 0x38, 0x22, 0x45, 0xca, 0xb9, 0x5c, 0xa2, 0x04, 0x3f, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0a, 0x93, 0x63, 0x63, 0x20, 0x28, 0x4c, 0x89, 0x9c, 0xb6, 0x23, 0x23, 0xbe, 0x35, 0x35, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x08, 0x90, 0x63, 0x61, 0x1b, 0x26, 0x4a, 0x83, 0x9e, 0xac, 0x1e, 0x00, 0x00, 0x01, 0xff, 0xa1, 0x00, 0x00, 0x05, 0x10, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x01, 0x0f, 0x77, 0x6a, 0x8c, 0xac, 0xc1, 0xb6, 0x02, 0x94, 0xb6, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0x30, 0x01, 0x5e, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0x2b, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x05, 0xf0, 0x04, 0x60, 0x12, 0x06, 0x03, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6b, 0x00, 0x00, 0x03, 0x70, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x03, 0x6f, 0xb5, 0xfd, 0xeb, 0x02, 0x15, 0xfd, 0xb1, 0x05, 0xd5, 0xfa, 0x2b, 0x02, 0xc9, 0xaa, 0x01, 0xb8, 0xaa, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xa3, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x13, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x02, 0xed, 0xe5, 0x7f, 0x8a, 0x8a, 0x7f, 0xe5, 0xb6, 0xb6, 0xe5, 0xe2, 0xe7, 0xe7, 0xe2, 0x05, 0x2f, 0x92, 0x86, 0x87, 0x92, 0x02, 0xd7, 0xfa, 0x2b, 0x02, 0x58, 0xe2, 0xdd, 0xdb, 0xe3, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x01, 0x33, 0x01, 0x11, 0x33, 0x11, 0x21, 0x09, 0x01, 0xb5, 0xb0, 0x01, 0x5b, 0xb6, 0x01, 0x5b, 0xb1, 0xfe, 0xf1, 0xfe, 0xa8, 0xfe, 0xa9, 0x05, 0xd5, 0xfa, 0xe1, 0x04, 0x00, 0xfc, 0x00, 0x05, 0x1f, 0xfa, 0x2b, 0x03, 0xf8, 0xfc, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xb5, 0xb6, 0xb6, 0x07, 0x6d, 0xf8, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x08, 0x67, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x33, 0x03, 0x8f, 0x01, 0x1e, 0xcc, 0x01, 0x1b, 0x01, 0x1a, 0xb8, 0xfe, 0xaf, 0xe5, 0xfe, 0xe4, 0xfe, 0xe2, 0xcc, 0xfe, 0xe5, 0xfe, 0xe7, 0xb9, 0x01, 0x52, 0xe4, 0xc5, 0x05, 0x10, 0xfb, 0x12, 0x04, 0xee, 0xfa, 0x2b, 0x05, 0x10, 0xfa, 0xf0, 0x04, 0xee, 0xfb, 0x12, 0x05, 0xd5, 0x00, 0x00, 0x01, 0x00, 0xae, 0x04, 0xd0, 0x02, 0x53, 0x05, 0x58, 0x00, 0x03, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x02, 0x53, 0xfe, 0x5c, 0x01, 0xa4, 0x04, 0xd0, 0x88, 0x00, 0x00, 0x01, 0x00, 0x7e, 0x03, 0x9c, 0x02, 0x77, 0x05, 0x58, 0x00, 0x04, 0x00, 0x00, 0x13, 0x27, 0x01, 0x33, 0x15, 0xc1, 0x42, 0x01, 0xd4, 0x24, 0x03, 0x9c, 0x73, 0x01, 0x49, 0x88, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0x68, 0x02, 0x9a, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x01, 0x27, 0x01, 0x33, 0x02, 0x9a, 0x0e, 0xfe, 0x35, 0x5e, 0x01, 0xf0, 0x47, 0x04, 0xd0, 0xfd, 0x98, 0x57, 0x02, 0x99, 0x00, 0x01, 0x00, 0x56, 0x01, 0x34, 0x02, 0xa7, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x01, 0x27, 0x01, 0x33, 0x02, 0xa7, 0x0d, 0xfe, 0x27, 0x6b, 0x01, 0xfd, 0x54, 0x04, 0xd0, 0xfc, 0x64, 0x44, 0x03, 0xe0, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x02, 0xad, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x01, 0x27, 0x01, 0x33, 0x02, 0xad, 0x0a, 0xfe, 0x1e, 0x70, 0x02, 0x02, 0x5a, 0x04, 0xd0, 0xfb, 0x30, 0x37, 0x05, 0x21, 0x00, 0x01, 0x00, 0x7e, 0x03, 0x9c, 0x02, 0x77, 0x05, 0x58, 0x00, 0x04, 0x00, 0x00, 0x13, 0x01, 0x15, 0x23, 0x01, 0xc1, 0x01, 0xb6, 0x24, 0xfe, 0x2c, 0x05, 0x58, 0xfe, 0xcc, 0x88, 0x01, 0x49, 0xff, 0xff, 0x00, 0xae, 0x03, 0x9c, 0x02, 0x53, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xa9, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x02, 0x68, 0x02, 0x77, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xaa, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x01, 0x34, 0x02, 0x9a, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xab, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0x00, 0x00, 0x02, 0xa7, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xac, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0x68, 0x02, 0x9a, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x23, 0x01, 0x37, 0x01, 0x02, 0x9a, 0x47, 0xfe, 0x10, 0x5e, 0x01, 0xcb, 0x02, 0xf0, 0x88, 0x02, 0x99, 0x57, 0xfd, 0x98, 0xff, 0xff, 0x00, 0x7e, 0x02, 0x68, 0x02, 0x77, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xae, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae, 0x02, 0x68, 0x02, 0x53, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xa9, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x01, 0x34, 0x02, 0x77, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xaa, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x02, 0x9a, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xab, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0x01, 0x34, 0x02, 0xa7, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x23, 0x01, 0x37, 0x01, 0x02, 0xa7, 0x54, 0xfe, 0x03, 0x6b, 0x01, 0xd9, 0x01, 0xbc, 0x88, 0x03, 0xe0, 0x44, 0xfc, 0x64, 0xff, 0xff, 0x00, 0x63, 0x01, 0x34, 0x02, 0x9a, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xb3, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x01, 0x34, 0x02, 0x77, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xae, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae, 0x01, 0x34, 0x02, 0x53, 0x01, 0xbc, 0x10, 0x07, 0x0e, 0xa9, 0x00, 0x00, 0xfc, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x02, 0x77, 0x01, 0xbc, 0x10, 0x07, 0x0e, 0xaa, 0x00, 0x00, 0xfc, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x02, 0xad, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x25, 0x15, 0x23, 0x01, 0x37, 0x01, 0x02, 0xad, 0x5a, 0xfd, 0xfe, 0x70, 0x01, 0xe2, 0x88, 0x88, 0x05, 0x21, 0x37, 0xfb, 0x30, 0x00, 0xff, 0xff, 0x00, 0x56, 0x00, 0x00, 0x02, 0xa7, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xb8, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x02, 0x9a, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xb3, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x02, 0x77, 0x01, 0xbc, 0x10, 0x07, 0x0e, 0xae, 0x00, 0x00, 0xfc, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae, 0x00, 0x00, 0x02, 0x53, 0x00, 0x88, 0x11, 0x07, 0x0e, 0xa9, 0x00, 0x00, 0xfb, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x01, 0x3b, 0x05, 0x58, 0x00, 0x03, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0xc1, 0x7a, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x0e, 0x00, 0x87, 0x00, 0x00, 0x06, 0x81, 0x05, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x06, 0x27, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0xfe, 0x98, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0xfd, 0x44, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x0f, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0x69, 0x64, 0x64, 0xfd, 0xad, 0x02, 0x4e, 0xfd, 0xb2, 0x02, 0xbc, 0x02, 0x4e, 0xfd, 0xb2, 0xfd, 0x44, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x0f, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0x69, 0x64, 0x64, 0xfd, 0xad, 0x02, 0x4e, 0xfd, 0xb2, 0x00, 0x0e, 0x00, 0x87, 0x00, 0x00, 0x06, 0x81, 0x05, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x06, 0x27, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0xfe, 0x98, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0xfd, 0x44, 0x02, 0x58, 0xfd, 0xa8, 0x05, 0x19, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0x5f, 0x64, 0x64, 0xfd, 0xa3, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0xbc, 0x02, 0x58, 0xfd, 0xa8, 0xfd, 0x44, 0x02, 0x58, 0xfd, 0xa8, 0x05, 0x19, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0x5f, 0x64, 0x64, 0xfd, 0xa3, 0x02, 0x58, 0xfd, 0xa8, 0x00, 0x0e, 0x00, 0x87, 0x00, 0x00, 0x06, 0x81, 0x05, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x06, 0x27, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0xfe, 0x98, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0xfd, 0x44, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x0f, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0x69, 0x64, 0x64, 0xfd, 0xad, 0x02, 0x4e, 0xfd, 0xb2, 0x02, 0xbc, 0x02, 0x4e, 0xfd, 0xb2, 0xfd, 0x44, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x0f, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0x69, 0x64, 0x64, 0xfd, 0xad, 0x02, 0x4e, 0xfd, 0xb2, 0x00, 0x0e, 0x00, 0x87, 0x00, 0x00, 0x06, 0x81, 0x05, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x06, 0x27, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0xfe, 0x98, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0xfd, 0x44, 0x02, 0x58, 0xfd, 0xa8, 0x05, 0x19, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0x5f, 0x64, 0x64, 0xfd, 0xa3, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0xbc, 0x02, 0x58, 0xfd, 0xa8, 0xfd, 0x44, 0x02, 0x58, 0xfd, 0xa8, 0x05, 0x19, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0x5f, 0x64, 0x64, 0xfd, 0xa3, 0x02, 0x58, 0xfd, 0xa8, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0x9f, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x13, 0x33, 0x03, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x00, 0x11, 0x33, 0x16, 0x00, 0x03, 0xca, 0xfe, 0x56, 0xfe, 0x43, 0x35, 0xb4, 0x3e, 0x01, 0x12, 0x01, 0x08, 0xfe, 0x41, 0xa3, 0x01, 0x01, 0xbd, 0x02, 0xa1, 0x9f, 0xfd, 0xe0, 0x02, 0x25, 0x8b, 0x01, 0x09, 0xfe, 0xda, 0x73, 0xfe, 0x80, 0x01, 0x8a, 0xb8, 0xf9, 0x01, 0xcb, 0x01, 0x17, 0xc5, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0x9f, 0x00, 0x09, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x12, 0x25, 0x04, 0x03, 0x15, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x20, 0x11, 0x35, 0x10, 0x25, 0x33, 0x36, 0x27, 0x26, 0x27, 0x33, 0x14, 0x16, 0x07, 0x33, 0x04, 0x03, 0x28, 0x01, 0xfe, 0xe8, 0xfe, 0xfe, 0x01, 0x01, 0x09, 0x01, 0x11, 0xa2, 0xfc, 0x99, 0x01, 0x6b, 0x12, 0x2e, 0x78, 0x78, 0x02, 0xbb, 0xc4, 0x21, 0x12, 0x01, 0x3c, 0x02, 0x9d, 0x01, 0x67, 0x0b, 0x08, 0xfe, 0x82, 0x55, 0xfe, 0x4e, 0x01, 0xad, 0x4b, 0x37, 0xfd, 0x9f, 0x02, 0x61, 0x3c, 0x01, 0xeb, 0x3d, 0xa3, 0x51, 0x52, 0xb2, 0x6c, 0x9e, 0xf3, 0x45, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x04, 0x1b, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x21, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x15, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x10, 0x25, 0x33, 0x36, 0x27, 0x36, 0x23, 0x22, 0x15, 0x23, 0x10, 0x21, 0x20, 0x03, 0x06, 0x07, 0x04, 0x03, 0x70, 0xfe, 0xd8, 0xfe, 0xc6, 0x01, 0x36, 0x01, 0x2c, 0xaa, 0xfe, 0x26, 0xfe, 0x23, 0x01, 0xd3, 0x55, 0x45, 0x02, 0x01, 0xab, 0xa4, 0x93, 0x01, 0x34, 0x01, 0x3a, 0x01, 0x0b, 0x3d, 0x01, 0x08, 0x02, 0x7e, 0x01, 0xa4, 0xfe, 0x62, 0x5f, 0xfe, 0x5d, 0x01, 0xa3, 0x61, 0x57, 0xfd, 0xb3, 0x02, 0x3e, 0x78, 0x01, 0xd6, 0x4e, 0x5c, 0x61, 0x9a, 0xc4, 0x01, 0x64, 0xfe, 0xc1, 0x8b, 0x55, 0x72, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x06, 0x04, 0x06, 0xb3, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x00, 0x37, 0x36, 0x37, 0x00, 0x11, 0x35, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x15, 0x10, 0x05, 0x24, 0x11, 0x35, 0x34, 0x37, 0x26, 0x23, 0x22, 0x11, 0x15, 0x10, 0x01, 0x17, 0x04, 0x17, 0x23, 0x26, 0x27, 0x26, 0x07, 0x01, 0x10, 0x23, 0x22, 0x11, 0x15, 0x02, 0x17, 0x36, 0x13, 0xf2, 0x59, 0x73, 0xfe, 0xa5, 0x01, 0x8d, 0x98, 0x8f, 0x5b, 0xe8, 0x01, 0xaa, 0xfe, 0x56, 0xfe, 0x62, 0x23, 0x4b, 0x9c, 0xeb, 0x01, 0x7e, 0xbf, 0x01, 0x5f, 0x33, 0xee, 0x0c, 0xd6, 0xe8, 0xdc, 0x04, 0x11, 0xff, 0xf6, 0x01, 0xf7, 0xfe, 0x01, 0xc3, 0x4e, 0x21, 0x01, 0x56, 0x01, 0xc6, 0x6d, 0x01, 0xf8, 0xb3, 0xa9, 0xfd, 0xff, 0x95, 0xfd, 0xd2, 0x1e, 0x1c, 0x02, 0x30, 0x77, 0x5f, 0x8c, 0x9a, 0xfe, 0xb7, 0x63, 0xfe, 0x2d, 0xfe, 0xb1, 0x18, 0x53, 0xd6, 0x52, 0x40, 0x40, 0xb4, 0x04, 0x5d, 0x01, 0x8f, 0xfe, 0x9e, 0x9a, 0xfe, 0x77, 0x1d, 0x1c, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0xb3, 0x00, 0x17, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x1b, 0x01, 0x33, 0x03, 0x10, 0x21, 0x04, 0x19, 0x01, 0x34, 0x23, 0x22, 0x11, 0x17, 0x23, 0x03, 0x10, 0x21, 0x20, 0x11, 0x03, 0xca, 0xfe, 0x47, 0xfe, 0x52, 0x01, 0x51, 0xbb, 0x63, 0x01, 0x0a, 0x01, 0x1a, 0xff, 0xdb, 0x4b, 0xab, 0x3f, 0x01, 0x87, 0x01, 0x8b, 0x01, 0xc8, 0xfe, 0x1a, 0x01, 0xe9, 0x01, 0x2f, 0xfe, 0xd1, 0xfe, 0xb7, 0x01, 0x01, 0x4f, 0x03, 0x73, 0xd1, 0xfe, 0xff, 0xf6, 0x01, 0x0d, 0x01, 0x89, 0xfe, 0x8b, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0xb3, 0x00, 0x21, 0x00, 0x00, 0x01, 0x06, 0x07, 0x16, 0x1d, 0x01, 0x10, 0x20, 0x11, 0x13, 0x33, 0x03, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x03, 0x34, 0x23, 0x06, 0x07, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x03, 0xa6, 0x04, 0xb9, 0xe1, 0xfc, 0x99, 0x30, 0xb0, 0x36, 0x01, 0x0a, 0x01, 0x11, 0xab, 0x99, 0x52, 0xc6, 0x02, 0xe2, 0xe9, 0x02, 0x21, 0xa8, 0x16, 0x01, 0x88, 0x01, 0x8e, 0x05, 0x1b, 0xe6, 0x7c, 0x73, 0xfe, 0x7d, 0xfe, 0x17, 0x02, 0x01, 0x01, 0x17, 0xfe, 0xe0, 0xfe, 0xa8, 0x01, 0x4e, 0x73, 0xcd, 0x28, 0xa9, 0x50, 0x01, 0x0a, 0xda, 0x01, 0xf5, 0x9a, 0x9e, 0x01, 0x90, 0x00, 0x00, 0x00, 0x03, 0x00, 0x63, 0xff, 0xe2, 0x04, 0x51, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x13, 0x00, 0x26, 0x00, 0x00, 0x01, 0x12, 0x07, 0x22, 0x15, 0x14, 0x17, 0x36, 0x37, 0x33, 0x01, 0x10, 0x21, 0x20, 0x11, 0x15, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x37, 0x26, 0x35, 0x10, 0x21, 0x20, 0x11, 0x14, 0x07, 0x33, 0x04, 0x02, 0x89, 0x02, 0xc1, 0xbc, 0x5e, 0x5b, 0xad, 0x10, 0x01, 0x1e, 0xfe, 0xe7, 0xfe, 0xd5, 0x01, 0x26, 0x01, 0x1e, 0xae, 0xfe, 0x33, 0xfe, 0x30, 0x5b, 0xab, 0x01, 0x5e, 0x01, 0x69, 0x0b, 0x0a, 0x01, 0x27, 0x04, 0xde, 0x01, 0x36, 0x01, 0xdf, 0xb4, 0x5f, 0x63, 0x09, 0xfd, 0xe5, 0x01, 0x88, 0xfe, 0x76, 0x4b, 0xfe, 0x5d, 0x01, 0x9b, 0x58, 0x4b, 0xfd, 0xb8, 0x02, 0x52, 0x46, 0x8d, 0xbc, 0x94, 0xce, 0x01, 0x8e, 0xfe, 0x2e, 0x25, 0x40, 0x7f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x05, 0xf7, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x22, 0x00, 0x00, 0x01, 0x10, 0x23, 0x22, 0x19, 0x01, 0x10, 0x33, 0x32, 0x11, 0x25, 0x02, 0x03, 0x23, 0x36, 0x13, 0x11, 0x10, 0x23, 0x22, 0x03, 0x11, 0x10, 0x21, 0x20, 0x19, 0x01, 0x10, 0x21, 0x36, 0x17, 0x36, 0x33, 0x20, 0x13, 0x02, 0xf5, 0xf2, 0xf8, 0xf8, 0xf2, 0x03, 0x01, 0x09, 0xb7, 0xef, 0xee, 0x15, 0xda, 0xc2, 0x11, 0xfe, 0x5d, 0xfe, 0x69, 0x01, 0xa0, 0xc9, 0x86, 0x68, 0xde, 0x01, 0x5d, 0x01, 0x04, 0x92, 0x01, 0x82, 0xfe, 0x7e, 0xfd, 0x93, 0xfe, 0x5c, 0x01, 0xa4, 0x9b, 0xfe, 0x46, 0xfe, 0xfa, 0xe5, 0x01, 0xdb, 0x01, 0xd2, 0x01, 0x79, 0xfe, 0xed, 0xfd, 0x2d, 0xfd, 0xbd, 0x02, 0x43, 0x02, 0x6d, 0x02, 0x21, 0x02, 0xe6, 0xda, 0xfd, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x03, 0x9d, 0x06, 0xb3, 0x00, 0x15, 0x00, 0x00, 0x01, 0x10, 0x03, 0x23, 0x12, 0x19, 0x01, 0x10, 0x23, 0x20, 0x19, 0x01, 0x10, 0x13, 0x23, 0x02, 0x19, 0x01, 0x10, 0x21, 0x20, 0x11, 0x03, 0x9c, 0x8b, 0xb2, 0x93, 0xdc, 0xfe, 0xf8, 0x9d, 0xb4, 0x94, 0x01, 0xb3, 0x01, 0x86, 0x02, 0xfb, 0xfe, 0x8a, 0xfe, 0x7b, 0x01, 0x43, 0x01, 0xb8, 0x01, 0x9a, 0x01, 0x7e, 0xfe, 0x82, 0xfe, 0x66, 0xfe, 0x53, 0xfe, 0xb2, 0x01, 0x79, 0x01, 0x82, 0x01, 0x9a, 0x02, 0x1e, 0xfd, 0xe2, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0xa0, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x02, 0x21, 0x20, 0x11, 0x13, 0x33, 0x03, 0x10, 0x05, 0x20, 0x11, 0x35, 0x10, 0x2b, 0x01, 0x35, 0x33, 0x36, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x10, 0x07, 0x16, 0x11, 0x03, 0xca, 0x01, 0xfe, 0x4e, 0xfe, 0x4c, 0x27, 0xb9, 0x36, 0x01, 0x0a, 0x01, 0x11, 0xbd, 0xc6, 0x9e, 0xe5, 0xb4, 0xfc, 0x5a, 0xe1, 0xe1, 0x01, 0xc6, 0xfe, 0x1c, 0x01, 0xf3, 0x01, 0x24, 0xfe, 0xdc, 0xfe, 0xae, 0x01, 0x01, 0x44, 0x78, 0x01, 0x3c, 0xa8, 0x81, 0xaf, 0x95, 0xb9, 0xbe, 0x6d, 0xfe, 0xf7, 0x64, 0x63, 0xfe, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x08, 0x07, 0x06, 0xb3, 0x00, 0x35, 0x00, 0x00, 0x25, 0x36, 0x37, 0x24, 0x03, 0x35, 0x10, 0x21, 0x32, 0x17, 0x36, 0x20, 0x17, 0x36, 0x33, 0x20, 0x11, 0x15, 0x14, 0x03, 0x23, 0x12, 0x3d, 0x01, 0x12, 0x23, 0x22, 0x15, 0x11, 0x23, 0x11, 0x10, 0x23, 0x06, 0x15, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x11, 0x15, 0x12, 0x05, 0x36, 0x17, 0x04, 0x13, 0x21, 0x26, 0x25, 0x24, 0x01, 0x01, 0x3a, 0x68, 0x82, 0xfe, 0x6a, 0x2b, 0x01, 0x8b, 0xd1, 0x65, 0x5a, 0x01, 0x74, 0x62, 0x55, 0xdb, 0x01, 0x83, 0xc9, 0xb8, 0xe2, 0x01, 0xe3, 0xe7, 0x9b, 0xcc, 0xc5, 0x9c, 0x02, 0xe8, 0xdf, 0x28, 0x01, 0x87, 0x6e, 0x81, 0x01, 0xda, 0xf6, 0xfe, 0xef, 0x24, 0xfe, 0xbd, 0xfe, 0xbe, 0xfe, 0xe9, 0xa6, 0x78, 0x43, 0xf3, 0x01, 0xf0, 0x7b, 0x01, 0xeb, 0xb2, 0xbb, 0xbb, 0xb2, 0xfe, 0x1f, 0x67, 0xba, 0xfe, 0x64, 0x01, 0xb1, 0xc8, 0x3f, 0x01, 0x47, 0xe7, 0xfe, 0x5a, 0x01, 0xa6, 0x01, 0x00, 0x02, 0xfe, 0xfe, 0x5a, 0x01, 0xa6, 0xe7, 0xfe, 0xb7, 0x79, 0xfe, 0x41, 0xe9, 0x17, 0x0b, 0x23, 0xfe, 0x76, 0xa5, 0x5c, 0x5b, 0xfe, 0xc3, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x11, 0x26, 0x27, 0x20, 0x11, 0x15, 0x10, 0x05, 0x20, 0x13, 0x10, 0x21, 0x20, 0x11, 0x35, 0x10, 0x25, 0x32, 0x17, 0x35, 0x34, 0x21, 0x22, 0x06, 0x15, 0x23, 0x10, 0x21, 0x20, 0x11, 0x03, 0x30, 0x5f, 0xa6, 0xfe, 0xe3, 0x01, 0x1b, 0x01, 0x07, 0x98, 0xfe, 0x61, 0xfe, 0x3a, 0x01, 0xb3, 0x8e, 0x8d, 0xfe, 0xfe, 0x8a, 0x6f, 0xa1, 0x01, 0x8e, 0x01, 0xa5, 0x01, 0xda, 0x01, 0xcb, 0x3f, 0x01, 0xfe, 0xc1, 0xb8, 0xfe, 0x95, 0x01, 0x01, 0x62, 0xfd, 0xfe, 0x02, 0x02, 0xae, 0x01, 0xee, 0x14, 0x4a, 0xd1, 0xf9, 0x71, 0x6c, 0x01, 0x7c, 0xfe, 0x63, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0xff, 0xe2, 0x03, 0xdd, 0x06, 0xa0, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x10, 0x21, 0x22, 0x07, 0x11, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x21, 0x20, 0x19, 0x01, 0x10, 0x29, 0x01, 0x15, 0x21, 0x22, 0x1d, 0x01, 0x36, 0x33, 0x20, 0x03, 0x3a, 0xfe, 0xe8, 0x97, 0x74, 0x01, 0x16, 0x01, 0x0d, 0xa2, 0xfe, 0x46, 0xfe, 0x53, 0x01, 0x2f, 0x01, 0xd0, 0xfe, 0x35, 0x9b, 0x98, 0x7e, 0x01, 0xb8, 0x02, 0xab, 0x01, 0x4f, 0x4b, 0xfe, 0x26, 0xfe, 0xad, 0x01, 0x44, 0xfe, 0xfa, 0xfe, 0x18, 0x01, 0xe8, 0x03, 0x54, 0x01, 0x82, 0xa0, 0xe6, 0xc7, 0x55, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x05, 0xdf, 0x06, 0xb3, 0x00, 0x20, 0x00, 0x00, 0x01, 0x10, 0x01, 0x23, 0x00, 0x19, 0x01, 0x10, 0x23, 0x22, 0x19, 0x01, 0x23, 0x11, 0x10, 0x23, 0x22, 0x19, 0x01, 0x10, 0x01, 0x23, 0x00, 0x19, 0x01, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x05, 0xdf, 0xfe, 0xe6, 0xc9, 0x01, 0x3b, 0xf3, 0xce, 0xa5, 0xef, 0xd3, 0x01, 0x1e, 0xc1, 0xfe, 0xf7, 0x01, 0x91, 0xc8, 0x6c, 0x75, 0xa7, 0x01, 0x9b, 0x02, 0xc2, 0xfe, 0x66, 0xfe, 0xd8, 0x01, 0x6e, 0x01, 0x55, 0x01, 0xcf, 0x01, 0x83, 0xfe, 0xcf, 0xfd, 0x82, 0x02, 0x87, 0x01, 0x28, 0xfe, 0x7d, 0xfe, 0x31, 0xfe, 0xa7, 0xfe, 0x96, 0x01, 0x28, 0x01, 0x9b, 0x01, 0xcf, 0x02, 0x21, 0xf0, 0xf0, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0x9f, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x15, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x24, 0x35, 0x33, 0x14, 0x04, 0x15, 0x14, 0x07, 0x16, 0x03, 0xca, 0xfe, 0x5f, 0xfe, 0x3a, 0x12, 0xb3, 0x1a, 0x01, 0x16, 0x01, 0x04, 0x9e, 0xc4, 0x67, 0xe9, 0xfe, 0x87, 0xc6, 0x01, 0x55, 0xd3, 0xe5, 0x01, 0xd7, 0x25, 0xfe, 0x30, 0x01, 0xdf, 0xb3, 0xb3, 0xfe, 0xc1, 0x01, 0x3f, 0x43, 0xc0, 0x2d, 0xb6, 0x3f, 0xb0, 0xa3, 0x72, 0xf4, 0x96, 0x8e, 0xdd, 0xb2, 0x79, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xca, 0x06, 0xc1, 0x00, 0x16, 0x00, 0x00, 0x01, 0x10, 0x25, 0x20, 0x11, 0x33, 0x10, 0x21, 0x20, 0x19, 0x01, 0x05, 0x04, 0x15, 0x10, 0x25, 0x35, 0x04, 0x27, 0x36, 0x25, 0x35, 0x25, 0x03, 0xc9, 0xfe, 0x49, 0xfe, 0x51, 0xab, 0x01, 0x04, 0x01, 0x14, 0xfe, 0x0f, 0x01, 0x3d, 0xfd, 0xf2, 0x01, 0x78, 0x01, 0x02, 0xfe, 0x87, 0x03, 0x65, 0x01, 0xd1, 0xfe, 0x0f, 0x02, 0x02, 0x4a, 0xfe, 0x56, 0x01, 0x4f, 0x04, 0x3b, 0x32, 0x78, 0xd6, 0xfe, 0x7d, 0x02, 0xb2, 0x02, 0xce, 0xb0, 0x5f, 0xa7, 0x82, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x06, 0x31, 0x06, 0xb3, 0x00, 0x26, 0x00, 0x00, 0x01, 0x15, 0x10, 0x01, 0x23, 0x00, 0x11, 0x35, 0x10, 0x27, 0x22, 0x03, 0x11, 0x23, 0x11, 0x10, 0x23, 0x22, 0x11, 0x15, 0x10, 0x01, 0x23, 0x00, 0x11, 0x35, 0x10, 0x37, 0x36, 0x21, 0x15, 0x24, 0x03, 0x37, 0x32, 0x17, 0x36, 0x33, 0x20, 0x06, 0x31, 0xfe, 0xc5, 0xd7, 0x01, 0x60, 0xeb, 0xf0, 0x01, 0xad, 0xfe, 0xea, 0x01, 0x6c, 0xd4, 0xfe, 0xbd, 0xf8, 0xfa, 0x02, 0x82, 0xfd, 0x41, 0x9f, 0x71, 0xef, 0x7c, 0x69, 0xc6, 0x01, 0xac, 0x03, 0x1e, 0x7c, 0xfe, 0x62, 0xfe, 0xfc, 0x01, 0x62, 0x01, 0x49, 0x8c, 0x01, 0x4b, 0x02, 0xfe, 0xd7, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x28, 0xfe, 0xb4, 0x95, 0xfe, 0xc1, 0xfe, 0x9d, 0x01, 0x04, 0x01, 0x9e, 0x77, 0x01, 0xa3, 0xfc, 0xfb, 0xa0, 0x01, 0xfe, 0xd8, 0x34, 0xf4, 0xf4, 0x00, 0x00, 0x01, 0x00, 0x75, 0xff, 0xe2, 0x03, 0xdd, 0x06, 0x9f, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x10, 0x21, 0x20, 0x19, 0x01, 0x33, 0x11, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x02, 0x27, 0x37, 0x33, 0x07, 0x14, 0x12, 0x03, 0xdc, 0xfe, 0x46, 0xfe, 0x53, 0xa2, 0x01, 0x0d, 0x01, 0x16, 0xe3, 0x02, 0x28, 0xb4, 0x42, 0xed, 0x02, 0x07, 0x2d, 0xfe, 0x08, 0x02, 0x52, 0x04, 0x6b, 0xfb, 0x6d, 0xfe, 0x76, 0x01, 0x49, 0x4b, 0xb3, 0x01, 0x26, 0x99, 0xd9, 0xe6, 0x7c, 0xfe, 0xfb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x04, 0xe0, 0x06, 0xb3, 0x00, 0x24, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x07, 0x11, 0x16, 0x12, 0x33, 0x32, 0x12, 0x35, 0x11, 0x34, 0x02, 0x27, 0x23, 0x13, 0x23, 0x13, 0x35, 0x33, 0x15, 0x33, 0x04, 0x12, 0x07, 0x11, 0x16, 0x00, 0x21, 0x20, 0x00, 0x35, 0x11, 0x34, 0x12, 0x37, 0x01, 0xd6, 0x77, 0x4f, 0x02, 0x01, 0xbc, 0xd9, 0xd7, 0xb9, 0xc1, 0x83, 0x11, 0x12, 0xa8, 0x12, 0x84, 0x11, 0x01, 0x0f, 0xe1, 0x01, 0x01, 0xfe, 0xf5, 0xfe, 0xcb, 0xfe, 0xdd, 0xfe, 0xe6, 0xad, 0xc6, 0x05, 0xa7, 0x2f, 0xf0, 0xb3, 0xfe, 0xbd, 0x98, 0xfe, 0x88, 0x01, 0x77, 0x99, 0x01, 0x40, 0xb6, 0x01, 0x44, 0x02, 0xfc, 0xed, 0x03, 0x11, 0xe7, 0x44, 0x5c, 0xfe, 0x75, 0xb1, 0xfe, 0xb6, 0xd1, 0xfe, 0x26, 0x01, 0xd6, 0xd5, 0x01, 0x49, 0xb0, 0x01, 0x8d, 0x52, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0xe1, 0x03, 0xbd, 0x06, 0xb3, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x12, 0x21, 0x20, 0x03, 0x13, 0x33, 0x03, 0x10, 0x21, 0x20, 0x19, 0x01, 0x26, 0x23, 0x22, 0x17, 0x11, 0x23, 0x11, 0x26, 0x27, 0x23, 0x35, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x03, 0xbd, 0x01, 0xfe, 0x62, 0xfe, 0x3a, 0x04, 0x33, 0xb7, 0x3e, 0x01, 0x22, 0x01, 0x01, 0x01, 0xaf, 0x96, 0x02, 0x8f, 0x12, 0x8f, 0x84, 0x7e, 0x8b, 0x44, 0x5e, 0x99, 0x01, 0x4c, 0x01, 0xee, 0xfd, 0xf3, 0x01, 0xea, 0x01, 0x2e, 0xfe, 0xd7, 0xfe, 0xb2, 0x01, 0x35, 0x03, 0xb4, 0xa9, 0x54, 0xfe, 0x68, 0x01, 0x4d, 0x8c, 0x13, 0x9f, 0x9f, 0x9f, 0xfe, 0x86, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x05, 0xe5, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0x01, 0x10, 0x23, 0x22, 0x11, 0x15, 0x10, 0x33, 0x32, 0x11, 0x01, 0x14, 0x00, 0x2b, 0x01, 0x22, 0x24, 0x35, 0x33, 0x14, 0x16, 0x3b, 0x01, 0x32, 0x36, 0x35, 0x10, 0x2b, 0x01, 0x35, 0x37, 0x36, 0x35, 0x10, 0x23, 0x22, 0x07, 0x16, 0x07, 0x15, 0x10, 0x25, 0x04, 0x11, 0x35, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x10, 0x07, 0x16, 0x02, 0xf2, 0xf6, 0xee, 0xfa, 0xea, 0x02, 0xe0, 0xfe, 0xdf, 0xfb, 0x5a, 0xbb, 0xfe, 0xd6, 0xb7, 0xc4, 0x75, 0x43, 0xb2, 0xd1, 0x73, 0x6f, 0x35, 0xbf, 0xef, 0x77, 0x64, 0x22, 0x03, 0xfe, 0x75, 0xfe, 0x5a, 0x01, 0x96, 0xe4, 0x62, 0x7e, 0xa8, 0x01, 0x7f, 0xd4, 0xc2, 0x04, 0x9e, 0x01, 0x76, 0xfe, 0x8f, 0x8b, 0xfe, 0x79, 0x01, 0x87, 0xfd, 0xc0, 0xd4, 0xfe, 0xde, 0xd9, 0x81, 0x3b, 0x80, 0xcd, 0x89, 0x01, 0x01, 0x97, 0x02, 0x89, 0xdf, 0x01, 0x35, 0x80, 0x70, 0x94, 0x72, 0xfd, 0xd7, 0x01, 0x01, 0x02, 0x29, 0x8b, 0x02, 0x10, 0xc7, 0xc1, 0xfe, 0x5a, 0xfe, 0xe5, 0x92, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xca, 0x06, 0x9f, 0x00, 0x19, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x21, 0x20, 0x19, 0x01, 0x02, 0x27, 0x06, 0x07, 0x13, 0x23, 0x27, 0x10, 0x05, 0x32, 0x13, 0x11, 0x33, 0x03, 0xc9, 0xfe, 0x47, 0xfe, 0x53, 0x31, 0xb8, 0x3e, 0x01, 0x04, 0x01, 0x1f, 0xbb, 0xa2, 0xb0, 0x01, 0x3b, 0xa1, 0x36, 0x01, 0x49, 0x9a, 0xc7, 0x98, 0x01, 0xca, 0xfe, 0x18, 0x01, 0xe8, 0xdd, 0xdc, 0xfe, 0xb7, 0x01, 0x4e, 0x02, 0x24, 0x01, 0xb2, 0x02, 0x01, 0xa8, 0xfe, 0xff, 0xf9, 0x01, 0x5e, 0x02, 0xfe, 0xaa, 0x01, 0xa2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x06, 0x0f, 0x06, 0xb3, 0x00, 0x2a, 0x00, 0x00, 0x37, 0x36, 0x37, 0x00, 0x11, 0x35, 0x10, 0x21, 0x32, 0x13, 0x12, 0x33, 0x20, 0x13, 0x15, 0x06, 0x03, 0x23, 0x12, 0x3d, 0x01, 0x10, 0x23, 0x22, 0x19, 0x01, 0x23, 0x11, 0x10, 0x20, 0x13, 0x15, 0x02, 0x01, 0x16, 0x17, 0x04, 0x17, 0x23, 0x26, 0x27, 0x26, 0x05, 0xe3, 0x6c, 0x8a, 0xfe, 0x8a, 0x01, 0x99, 0xc3, 0x7b, 0x6c, 0xcf, 0x01, 0x99, 0x01, 0x02, 0x9e, 0xce, 0xc1, 0xe9, 0xf4, 0x9a, 0xfe, 0x21, 0x02, 0x01, 0x01, 0x88, 0x6a, 0x4b, 0x01, 0x7a, 0x33, 0xee, 0x03, 0xe3, 0xf6, 0xfe, 0xfc, 0xb1, 0x62, 0x22, 0x01, 0x1c, 0x02, 0x20, 0x4b, 0x01, 0xf7, 0xfe, 0xf9, 0x01, 0x07, 0xfe, 0x20, 0x61, 0xeb, 0xfe, 0x94, 0x01, 0x60, 0xf2, 0x54, 0x01, 0x54, 0xfe, 0x72, 0xfe, 0xc0, 0x01, 0x40, 0x01, 0x8d, 0xfe, 0xa8, 0x6d, 0xfe, 0x4d, 0xfe, 0xad, 0x04, 0x12, 0x70, 0xe1, 0x52, 0x63, 0x45, 0xbe, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0xa1, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x13, 0x33, 0x03, 0x10, 0x21, 0x20, 0x19, 0x01, 0x06, 0x07, 0x04, 0x11, 0x35, 0x34, 0x37, 0x33, 0x06, 0x1d, 0x01, 0x10, 0x17, 0x36, 0x37, 0x11, 0x33, 0x03, 0xc8, 0xfe, 0x4a, 0xfe, 0x51, 0x1b, 0xaf, 0x1f, 0x01, 0x04, 0x01, 0x1f, 0x94, 0x82, 0xfe, 0x63, 0x82, 0xca, 0xa1, 0xe9, 0x94, 0x8b, 0x97, 0x01, 0xc5, 0xfe, 0x1d, 0x01, 0xbb, 0x01, 0x09, 0xfe, 0xf3, 0xfe, 0xe9, 0x01, 0x44, 0x01, 0xf8, 0x63, 0x0b, 0x02, 0x01, 0xb9, 0x28, 0xa9, 0xc9, 0xd4, 0x94, 0x28, 0xfe, 0xda, 0x01, 0x0a, 0x74, 0x02, 0x39, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0xb3, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x26, 0x23, 0x20, 0x11, 0x15, 0x02, 0x20, 0x13, 0x10, 0x21, 0x20, 0x11, 0x35, 0x12, 0x21, 0x16, 0x17, 0x11, 0x34, 0x23, 0x22, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x23, 0x35, 0x20, 0x17, 0x36, 0x33, 0x20, 0x11, 0x03, 0x31, 0x67, 0xb3, 0xfe, 0xf8, 0x01, 0x02, 0x23, 0x97, 0xfe, 0x60, 0xfe, 0x3b, 0x01, 0x01, 0xb3, 0x7a, 0xa0, 0x9c, 0xa1, 0x94, 0xfd, 0x01, 0x00, 0x30, 0x4d, 0xbe, 0x01, 0x2a, 0x01, 0xcb, 0x01, 0xc6, 0x49, 0xfe, 0x90, 0x72, 0xfe, 0x8a, 0x01, 0x5d, 0xfe, 0x03, 0x02, 0x0c, 0x90, 0x01, 0xf9, 0x02, 0x3d, 0x01, 0x60, 0x7c, 0xb4, 0x3a, 0x3a, 0xb4, 0x9f, 0xc0, 0xc0, 0xfe, 0xb3, 0x00, 0x00, 0x01, 0x00, 0x75, 0x00, 0x00, 0x03, 0xdd, 0x06, 0xb3, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x37, 0x34, 0x23, 0x22, 0x11, 0x15, 0x36, 0x17, 0x04, 0x03, 0x15, 0x10, 0x03, 0x23, 0x12, 0x3d, 0x01, 0x10, 0x05, 0x26, 0x07, 0x11, 0x23, 0x11, 0x02, 0x21, 0x20, 0x13, 0x07, 0x02, 0x4e, 0x0e, 0x95, 0xb0, 0x9d, 0x8b, 0x01, 0x9e, 0x01, 0xad, 0xc6, 0xd1, 0xfe, 0xf8, 0x74, 0xa7, 0xa1, 0x01, 0x01, 0x33, 0x01, 0x59, 0x01, 0x12, 0x05, 0x0e, 0x92, 0x75, 0xfe, 0xe6, 0xe1, 0x68, 0x04, 0x01, 0xfe, 0x3d, 0x5e, 0xfe, 0xfd, 0xfe, 0xa7, 0x01, 0x75, 0xb0, 0xae, 0x01, 0x13, 0x01, 0x01, 0x62, 0xfc, 0x7c, 0x04, 0xf0, 0x01, 0xc3, 0xfe, 0xed, 0x92, 0x00, 0x01, 0x00, 0x64, 0xff, 0xe2, 0x04, 0x4a, 0x06, 0xa0, 0x00, 0x23, 0x00, 0x00, 0x01, 0x16, 0x07, 0x04, 0x11, 0x10, 0x02, 0x20, 0x00, 0x19, 0x01, 0x02, 0x13, 0x33, 0x02, 0x15, 0x11, 0x1a, 0x01, 0x17, 0x32, 0x12, 0x35, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x36, 0x35, 0x34, 0x24, 0x37, 0x33, 0x14, 0x04, 0x04, 0x1c, 0x02, 0xdf, 0x01, 0x0a, 0xff, 0xfe, 0x35, 0xfe, 0xe6, 0x02, 0x67, 0xc1, 0x79, 0x01, 0xb8, 0x9a, 0x9d, 0x9b, 0x03, 0xac, 0xbd, 0x51, 0xee, 0xff, 0x00, 0x01, 0xa5, 0x01, 0x07, 0x05, 0x07, 0xae, 0x8c, 0x7b, 0xfe, 0xf6, 0xfe, 0xe2, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x70, 0x01, 0x9d, 0x01, 0x2c, 0x01, 0x3d, 0xfe, 0x8b, 0xf4, 0xfe, 0x63, 0xfe, 0xf6, 0xfe, 0xf2, 0x01, 0x01, 0x0f, 0xad, 0xfb, 0xa3, 0x65, 0xc2, 0x81, 0x91, 0x8c, 0x54, 0x88, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0x9f, 0x00, 0x09, 0x00, 0x15, 0x00, 0x00, 0x01, 0x11, 0x26, 0x23, 0x20, 0x11, 0x15, 0x10, 0x21, 0x20, 0x13, 0x10, 0x21, 0x20, 0x11, 0x35, 0x10, 0x21, 0x36, 0x17, 0x11, 0x33, 0x03, 0x31, 0x6e, 0xb5, 0xff, 0x00, 0x01, 0x00, 0x01, 0x23, 0x97, 0xfe, 0x4f, 0xfe, 0x4c, 0x01, 0xb4, 0x95, 0x85, 0x97, 0x02, 0x07, 0x01, 0xa3, 0x50, 0xfe, 0x70, 0x59, 0xfe, 0x71, 0x01, 0x6c, 0xfd, 0xf4, 0x02, 0x3e, 0x4a, 0x02, 0x3d, 0x01, 0x52, 0x02, 0x49, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0xff, 0xe2, 0x03, 0xdc, 0x06, 0xb3, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x00, 0x13, 0x10, 0x21, 0x32, 0x17, 0x36, 0x21, 0x15, 0x22, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x23, 0x22, 0x15, 0x11, 0x36, 0x37, 0x20, 0x13, 0x15, 0x10, 0x21, 0x20, 0x13, 0x33, 0x10, 0x33, 0x20, 0x11, 0x35, 0x10, 0x21, 0x22, 0x07, 0x76, 0x01, 0x38, 0xb4, 0x57, 0x21, 0x01, 0x01, 0xfd, 0x93, 0x97, 0x9d, 0x95, 0x7d, 0x01, 0xb1, 0x01, 0xfe, 0x3c, 0xfe, 0x5e, 0x02, 0xa1, 0xfb, 0x01, 0x28, 0xfe, 0xee, 0x7c, 0x95, 0x05, 0x79, 0x01, 0x3a, 0xbd, 0xbd, 0x9f, 0xa0, 0x44, 0x44, 0xa0, 0x9b, 0xfe, 0x9e, 0x55, 0x01, 0xfe, 0x11, 0x77, 0xfd, 0xdb, 0x02, 0x1b, 0xfe, 0x85, 0x01, 0x71, 0x8b, 0x01, 0x52, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xed, 0x06, 0xa0, 0x00, 0x1c, 0x00, 0x23, 0x00, 0x00, 0x01, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x21, 0x20, 0x11, 0x03, 0x23, 0x20, 0x11, 0x10, 0x21, 0x33, 0x27, 0x33, 0x17, 0x33, 0x01, 0x14, 0x3b, 0x01, 0x03, 0x23, 0x22, 0x03, 0xec, 0xc6, 0x38, 0x8e, 0x71, 0x4e, 0xfe, 0x47, 0xfe, 0x53, 0x35, 0xb8, 0x41, 0x01, 0x03, 0x01, 0x16, 0x54, 0xcb, 0xfe, 0x90, 0x01, 0x73, 0x54, 0x21, 0xb4, 0x1f, 0xda, 0xfd, 0x3c, 0xda, 0xc0, 0x3e, 0x7f, 0xdd, 0x05, 0x69, 0xfe, 0xb9, 0x8d, 0xfe, 0x35, 0xfe, 0x18, 0x01, 0xe8, 0xdd, 0xdc, 0xfe, 0xb7, 0x01, 0x4e, 0x01, 0xc5, 0x01, 0x2d, 0x01, 0x36, 0xa8, 0xa8, 0xfe, 0xcf, 0xa5, 0x01, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0xff, 0xe2, 0x03, 0xdd, 0x06, 0x9f, 0x00, 0x09, 0x00, 0x15, 0x00, 0x00, 0x01, 0x10, 0x21, 0x06, 0x07, 0x11, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x21, 0x20, 0x19, 0x01, 0x33, 0x11, 0x36, 0x33, 0x04, 0x03, 0x3a, 0xfe, 0xea, 0x92, 0x7a, 0x01, 0x1a, 0x01, 0x08, 0xa2, 0xfe, 0x56, 0xfe, 0x43, 0xa3, 0x91, 0x7b, 0x01, 0xb8, 0x02, 0x8d, 0x01, 0x7f, 0x03, 0x55, 0xfe, 0x58, 0xfe, 0x76, 0x01, 0x80, 0x6e, 0x5f, 0xfd, 0xd1, 0x02, 0x25, 0x04, 0x98, 0xfd, 0xbc, 0x4e, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0xe2, 0x03, 0x8b, 0x06, 0xb3, 0x00, 0x21, 0x00, 0x00, 0x01, 0x07, 0x25, 0x03, 0x04, 0x17, 0x06, 0x04, 0x21, 0x35, 0x32, 0x36, 0x35, 0x26, 0x2f, 0x01, 0x13, 0x25, 0x37, 0x05, 0x37, 0x36, 0x34, 0x26, 0x23, 0x07, 0x35, 0x33, 0x32, 0x17, 0x16, 0x14, 0x0f, 0x01, 0x03, 0x8a, 0x45, 0xfe, 0xc9, 0x82, 0x01, 0x2e, 0x01, 0x01, 0xfe, 0xe8, 0xfe, 0xbd, 0xfb, 0xb5, 0x01, 0xeb, 0x68, 0xd2, 0xfe, 0xa0, 0x48, 0x01, 0x5b, 0x5f, 0x11, 0x43, 0x39, 0x75, 0x8c, 0x77, 0x43, 0x43, 0x1b, 0x65, 0x03, 0xcc, 0x8a, 0xab, 0xfe, 0xeb, 0x6e, 0xdc, 0xc6, 0xe6, 0xa0, 0x7f, 0x7a, 0xc0, 0x28, 0x45, 0x01, 0x95, 0xbe, 0x8c, 0xc5, 0xc2, 0x1c, 0x53, 0x38, 0x13, 0x9b, 0x4b, 0x4a, 0xb2, 0x37, 0xc4, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xca, 0x06, 0xb3, 0x00, 0x26, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x33, 0x10, 0x21, 0x20, 0x11, 0x34, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x35, 0x34, 0x21, 0x23, 0x35, 0x33, 0x20, 0x11, 0x14, 0x07, 0x33, 0x16, 0x15, 0x16, 0x07, 0x16, 0x03, 0xc9, 0xfe, 0x49, 0xfe, 0x51, 0xab, 0x01, 0x04, 0x01, 0x0f, 0x8b, 0xd0, 0xbe, 0x8b, 0x8b, 0xd0, 0xd0, 0x76, 0xfe, 0x96, 0x6b, 0x6b, 0x02, 0x15, 0x88, 0x02, 0x98, 0x01, 0x76, 0x87, 0x01, 0x99, 0xfe, 0x49, 0x02, 0x04, 0xfe, 0x9c, 0x01, 0x17, 0xc5, 0xb3, 0x84, 0x79, 0x01, 0xb5, 0x99, 0xb8, 0x9e, 0xfe, 0xaa, 0x9b, 0x61, 0x4e, 0x87, 0x94, 0x47, 0x6e, 0x00, 0x01, 0x00, 0x6c, 0xff, 0xe2, 0x03, 0xd2, 0x06, 0xb2, 0x00, 0x26, 0x00, 0x00, 0x05, 0x20, 0x19, 0x01, 0x33, 0x11, 0x10, 0x21, 0x20, 0x11, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x37, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x36, 0x35, 0x34, 0x21, 0x35, 0x20, 0x11, 0x06, 0x07, 0x23, 0x16, 0x17, 0x06, 0x07, 0x16, 0x15, 0x10, 0x02, 0x20, 0xfe, 0x4c, 0xa3, 0x01, 0x11, 0x01, 0x0a, 0x76, 0x98, 0x98, 0x61, 0x05, 0x05, 0x76, 0x95, 0x95, 0x64, 0xfe, 0xf5, 0x01, 0xb6, 0x01, 0x8f, 0x02, 0xa4, 0x01, 0x01, 0x9b, 0xac, 0x1e, 0x01, 0xe6, 0x04, 0x4d, 0xfb, 0xb3, 0xfe, 0xba, 0x01, 0x12, 0xe0, 0x02, 0xb1, 0x83, 0x7d, 0xb7, 0x01, 0xb4, 0x81, 0x9e, 0xfe, 0xd2, 0xa5, 0x53, 0x67, 0x7e, 0x80, 0x5c, 0x56, 0xe1, 0xfe, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0x5f, 0x03, 0xcb, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x10, 0x05, 0x24, 0x19, 0x01, 0x10, 0x21, 0x20, 0x11, 0x03, 0x32, 0x37, 0x23, 0x02, 0x19, 0x01, 0x10, 0x21, 0x20, 0x19, 0x01, 0x10, 0x03, 0x16, 0x33, 0x15, 0x22, 0x27, 0x23, 0x06, 0x27, 0x01, 0x0e, 0x01, 0x07, 0x01, 0x0c, 0xfe, 0xf5, 0xfe, 0xf8, 0xab, 0xc3, 0x39, 0x02, 0xfa, 0x01, 0xb2, 0x01, 0xb3, 0xfe, 0x29, 0xd7, 0xaf, 0xfd, 0x13, 0xf7, 0xb1, 0x02, 0xd2, 0xfe, 0x68, 0x78, 0x78, 0x01, 0x98, 0x01, 0xa2, 0x01, 0xa0, 0xfe, 0x60, 0xfb, 0xa9, 0x53, 0x01, 0x04, 0x01, 0x5e, 0x01, 0xa6, 0x02, 0x3b, 0xfd, 0xc1, 0xfe, 0x5e, 0xfe, 0xa2, 0xfe, 0xf8, 0x4f, 0xbe, 0xe6, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0xb5, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x35, 0x33, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x10, 0x2b, 0x01, 0x35, 0x33, 0x24, 0x11, 0x05, 0x15, 0x23, 0x11, 0x25, 0x10, 0x05, 0x04, 0x11, 0x03, 0xc8, 0xfe, 0x48, 0xfe, 0x55, 0xaa, 0x01, 0x08, 0x01, 0x0a, 0xda, 0xcd, 0x6f, 0x01, 0x38, 0xfd, 0xf0, 0xae, 0x03, 0x65, 0xfe, 0xdb, 0x01, 0x25, 0x01, 0x96, 0xfe, 0x4c, 0x01, 0xd4, 0xd3, 0xdd, 0xfe, 0xd6, 0x01, 0x14, 0x9b, 0x01, 0x1a, 0xa4, 0xad, 0x01, 0x78, 0x17, 0xec, 0x01, 0x8f, 0x15, 0xfd, 0xbf, 0x9e, 0x71, 0xfe, 0xd2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xd5, 0x06, 0xb4, 0x00, 0x20, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x35, 0x33, 0x15, 0x10, 0x21, 0x20, 0x11, 0x10, 0x2b, 0x01, 0x35, 0x33, 0x24, 0x03, 0x06, 0x23, 0x04, 0x11, 0x33, 0x14, 0x21, 0x32, 0x37, 0x33, 0x15, 0x02, 0x05, 0x04, 0x03, 0xc9, 0xfe, 0x49, 0xfe, 0x51, 0xac, 0x01, 0x03, 0x01, 0x0f, 0xfa, 0xad, 0x63, 0x01, 0x43, 0x02, 0x96, 0x76, 0xfe, 0x51, 0xab, 0x01, 0x04, 0xc8, 0x70, 0x8b, 0x0a, 0xfe, 0xf3, 0x01, 0x0b, 0x01, 0xc8, 0xfe, 0x1a, 0x01, 0xe6, 0x8e, 0x8e, 0xfe, 0xba, 0x01, 0x46, 0x01, 0x60, 0xad, 0x1e, 0x01, 0xbb, 0x6f, 0x02, 0x01, 0x77, 0xc6, 0xc5, 0xe1, 0xfe, 0x80, 0xa6, 0x9c, 0x00, 0x03, 0x00, 0x63, 0xff, 0xe2, 0x04, 0x48, 0x06, 0xb3, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x00, 0x01, 0x21, 0x24, 0x11, 0x10, 0x21, 0x20, 0x35, 0x01, 0x10, 0x29, 0x01, 0x11, 0x34, 0x21, 0x20, 0x01, 0x15, 0x10, 0x21, 0x20, 0x11, 0x10, 0x37, 0x23, 0x26, 0x11, 0x10, 0x21, 0x20, 0x11, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x03, 0x2a, 0xfe, 0xe6, 0xfe, 0xfe, 0x01, 0x09, 0x01, 0x13, 0xfd, 0xe4, 0x01, 0x02, 0x01, 0x1a, 0xfe, 0xed, 0xfe, 0xf7, 0x02, 0xbb, 0xfe, 0x47, 0xfe, 0x53, 0xf1, 0x01, 0xf0, 0x01, 0xb4, 0x01, 0xb2, 0x7e, 0x7e, 0x7e, 0x02, 0xde, 0x02, 0xfe, 0xce, 0xfe, 0xd4, 0xf4, 0x03, 0x62, 0xfe, 0xba, 0x01, 0x9f, 0xe3, 0xfb, 0xda, 0x78, 0xfe, 0x6c, 0x01, 0xcc, 0x01, 0x21, 0x6a, 0x60, 0x01, 0x3f, 0x01, 0xdb, 0xfe, 0x7e, 0x97, 0xbe, 0xfe, 0xca, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x06, 0x7e, 0x06, 0xb4, 0x00, 0x0a, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x11, 0x34, 0x26, 0x23, 0x20, 0x13, 0x11, 0x10, 0x05, 0x20, 0x13, 0x10, 0x21, 0x22, 0x27, 0x15, 0x10, 0x21, 0x35, 0x32, 0x35, 0x11, 0x10, 0x21, 0x22, 0x06, 0x1d, 0x01, 0x10, 0x21, 0x15, 0x20, 0x03, 0x35, 0x10, 0x36, 0x37, 0x32, 0x17, 0x36, 0x33, 0x04, 0x12, 0x15, 0x05, 0xd6, 0x74, 0x96, 0xfe, 0xfc, 0x01, 0x01, 0x03, 0x01, 0x0a, 0xa7, 0xfe, 0x49, 0x73, 0x8b, 0xfe, 0x5e, 0xf8, 0xfe, 0xf8, 0x7d, 0x8a, 0x01, 0x08, 0xfe, 0x4d, 0x01, 0xfc, 0xb7, 0xea, 0x7b, 0x6a, 0xe7, 0x01, 0x0a, 0xa7, 0x03, 0xb5, 0x01, 0x03, 0xc3, 0x9a, 0xfe, 0xd9, 0xfe, 0x6b, 0xfe, 0xd4, 0x01, 0x01, 0x84, 0xfd, 0xdd, 0x87, 0x9e, 0xfe, 0x6c, 0xa0, 0xf4, 0x03, 0x78, 0x01, 0x27, 0x9b, 0xc2, 0xfd, 0xfe, 0xaf, 0xa5, 0x01, 0xf6, 0xfd, 0x01, 0x01, 0xfa, 0x01, 0xd8, 0xd8, 0x01, 0xfe, 0xc4, 0xbf, 0x00, 0x03, 0x00, 0x6d, 0xfe, 0x1e, 0x06, 0x47, 0x06, 0x87, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x23, 0x00, 0x00, 0x01, 0x04, 0x07, 0x03, 0x06, 0x33, 0x32, 0x25, 0x17, 0x24, 0x37, 0x13, 0x36, 0x23, 0x22, 0x05, 0x01, 0x06, 0x05, 0x13, 0x23, 0x03, 0x04, 0x23, 0x22, 0x1b, 0x01, 0x36, 0x25, 0x03, 0x33, 0x13, 0x24, 0x33, 0x32, 0x03, 0x03, 0x3e, 0xfe, 0x2f, 0x18, 0x3b, 0x15, 0x65, 0x66, 0x01, 0x10, 0x9a, 0x01, 0xd0, 0x0d, 0x41, 0x18, 0x80, 0x52, 0xff, 0x00, 0x02, 0x27, 0x1d, 0xfd, 0x8a, 0x54, 0xbb, 0x53, 0xfe, 0xe6, 0x98, 0xbe, 0x26, 0x41, 0x20, 0x02, 0x76, 0x47, 0xab, 0x41, 0x01, 0x16, 0xae, 0xbe, 0x26, 0x03, 0xfc, 0x4e, 0xa8, 0xfe, 0x2c, 0xae, 0xae, 0xae, 0x46, 0x68, 0x01, 0xfa, 0xae, 0x49, 0xfd, 0xa1, 0xe0, 0x28, 0xfd, 0xf4, 0x02, 0x91, 0xaf, 0x01, 0x32, 0x01, 0xf9, 0xfa, 0x3a, 0x02, 0x28, 0xfd, 0x6a, 0x6e, 0xfe, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0x28, 0x05, 0x78, 0x06, 0xd3, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x14, 0x00, 0x15, 0x14, 0x07, 0x04, 0x11, 0x02, 0x05, 0x24, 0x03, 0x34, 0x37, 0x27, 0x26, 0x27, 0x06, 0x11, 0x10, 0x05, 0x04, 0x17, 0x23, 0x26, 0x25, 0x06, 0x07, 0x27, 0x36, 0x37, 0x24, 0x11, 0x10, 0x25, 0x26, 0x35, 0x37, 0x17, 0x07, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x26, 0x00, 0x35, 0x01, 0x10, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x12, 0x17, 0x36, 0x03, 0x14, 0x01, 0x34, 0x1b, 0x01, 0x4b, 0x13, 0xfe, 0x99, 0xfe, 0x8c, 0x12, 0x36, 0x3f, 0x60, 0x4c, 0xc7, 0x01, 0x41, 0x01, 0xf4, 0x04, 0xc5, 0x0a, 0xfe, 0xa3, 0x87, 0x68, 0x6e, 0x60, 0x8d, 0xfe, 0xc1, 0x01, 0x1b, 0x21, 0x22, 0x90, 0x15, 0x88, 0x57, 0x64, 0x73, 0x01, 0xfe, 0xce, 0x02, 0x62, 0xd8, 0x1c, 0x18, 0x30, 0x50, 0x3c, 0x09, 0xe7, 0xce, 0x06, 0xd3, 0xa4, 0xfe, 0xe6, 0xab, 0x66, 0x45, 0x14, 0xfe, 0x2c, 0xfe, 0x20, 0x14, 0x14, 0x01, 0xeb, 0x66, 0x8e, 0x0a, 0x09, 0x5c, 0x37, 0xfe, 0xb9, 0xfe, 0xac, 0xad, 0xc0, 0xde, 0xa8, 0x59, 0x03, 0x98, 0x6c, 0x67, 0x2f, 0xe9, 0x01, 0x42, 0x01, 0xbf, 0x38, 0x4d, 0x75, 0xb1, 0x38, 0x79, 0x8e, 0x90, 0x89, 0x8b, 0x7a, 0x01, 0x1b, 0xd4, 0xfb, 0x0e, 0x01, 0x52, 0x05, 0x34, 0x1a, 0x5d, 0xa1, 0xfe, 0x95, 0x0a, 0x0a, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x06, 0x1e, 0x00, 0x03, 0x00, 0x16, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0xc3, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0x8b, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x06, 0x1e, 0x94, 0xfc, 0x20, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x06, 0x38, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x02, 0x11, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0x9d, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x06, 0x38, 0xca, 0xca, 0xca, 0xfc, 0x3c, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x07, 0x00, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x01, 0x21, 0x15, 0x21, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x03, 0x4e, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0xfd, 0x58, 0x02, 0x1b, 0xfd, 0xe5, 0x01, 0x62, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x01, 0xaa, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x02, 0xb6, 0x94, 0x02, 0x25, 0xca, 0xca, 0xca, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x06, 0x8c, 0x00, 0x03, 0x00, 0x16, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x01, 0xf0, 0xd3, 0xe8, 0x9b, 0x02, 0x0e, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x06, 0x8c, 0xfe, 0xf8, 0xfc, 0x26, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x07, 0x18, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x07, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x01, 0xf0, 0xa6, 0xcd, 0x89, 0x88, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0x96, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x07, 0x18, 0xfe, 0xf8, 0x79, 0x94, 0xfc, 0xa7, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x06, 0x79, 0x00, 0x08, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x13, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x02, 0xd7, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x16, 0x9a, 0x9a, 0x15, 0xe1, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x06, 0x79, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0xfb, 0x31, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0x1d, 0x03, 0x3c, 0x06, 0x1e, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x10, 0x23, 0x22, 0x15, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x11, 0xf0, 0x02, 0x1a, 0xfd, 0xe6, 0x02, 0x4c, 0xfe, 0x9c, 0xfe, 0x82, 0x1e, 0x9a, 0x16, 0xdc, 0xcb, 0xcb, 0xb4, 0x32, 0x9b, 0x2c, 0x01, 0x49, 0x01, 0x64, 0x06, 0x1e, 0x94, 0xfa, 0x37, 0xfe, 0x5c, 0x01, 0xa6, 0xe1, 0xe3, 0xfe, 0xe8, 0x01, 0x16, 0x03, 0x13, 0x01, 0x02, 0xf4, 0xe2, 0xdc, 0x01, 0x86, 0xfe, 0x6f, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0x1d, 0x03, 0x3c, 0x06, 0x64, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x10, 0x23, 0x22, 0x15, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x11, 0x02, 0x2f, 0xd3, 0xe8, 0x9c, 0x01, 0xbe, 0xfe, 0x9c, 0xfe, 0x82, 0x1e, 0x9a, 0x16, 0xdc, 0xcb, 0xcb, 0xb4, 0x32, 0x9b, 0x2c, 0x01, 0x49, 0x01, 0x64, 0x06, 0x64, 0xfe, 0xf8, 0xfa, 0x65, 0xfe, 0x5c, 0x01, 0xa6, 0xe1, 0xe3, 0xfe, 0xe8, 0x01, 0x16, 0x03, 0x13, 0x01, 0x02, 0xf4, 0xe2, 0xdc, 0x01, 0x86, 0xfe, 0x6f, 0x00, 0x03, 0x00, 0x5a, 0xfe, 0x1d, 0x03, 0x3c, 0x07, 0x36, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x07, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x10, 0x23, 0x22, 0x15, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x11, 0x02, 0x1d, 0xc1, 0xcd, 0xa5, 0x86, 0x02, 0x1a, 0xfd, 0xe6, 0x02, 0x56, 0xfe, 0x9c, 0xfe, 0x82, 0x1e, 0x9a, 0x16, 0xdc, 0xcb, 0xcb, 0xb4, 0x32, 0x9b, 0x2c, 0x01, 0x49, 0x01, 0x64, 0x07, 0x36, 0xfe, 0xf8, 0x79, 0x94, 0xfa, 0xa0, 0xfe, 0x5c, 0x01, 0xa6, 0xe1, 0xe3, 0xfe, 0xe8, 0x01, 0x16, 0x03, 0x13, 0x01, 0x02, 0xf4, 0xe2, 0xdc, 0x01, 0x86, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0x1d, 0x03, 0x3c, 0x06, 0x79, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x01, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x13, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x10, 0x23, 0x22, 0x15, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x11, 0x02, 0xfb, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x16, 0x9a, 0x9a, 0x15, 0xab, 0xfe, 0x9c, 0xfe, 0x82, 0x1e, 0x9a, 0x16, 0xdc, 0xcb, 0xcb, 0xb4, 0x32, 0x9b, 0x2c, 0x01, 0x49, 0x01, 0x64, 0x06, 0x79, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0xf9, 0x48, 0xfe, 0x5c, 0x01, 0xa6, 0xe1, 0xe3, 0xfe, 0xe8, 0x01, 0x16, 0x03, 0x13, 0x01, 0x02, 0xf4, 0xe2, 0xdc, 0x01, 0x86, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x03, 0x60, 0x06, 0x1e, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x10, 0x03, 0x23, 0x12, 0x11, 0x10, 0x23, 0x22, 0x11, 0x10, 0x13, 0x23, 0x02, 0x11, 0x10, 0x21, 0x20, 0x01, 0x21, 0x15, 0x21, 0x03, 0x60, 0x8a, 0x9b, 0x83, 0xdd, 0xe5, 0x82, 0x9c, 0x88, 0x01, 0x87, 0x01, 0x7f, 0xfd, 0x7e, 0x02, 0x1a, 0xfd, 0xe6, 0x02, 0x44, 0xfe, 0xf4, 0xfe, 0xc8, 0x01, 0x21, 0x01, 0x23, 0x01, 0x90, 0xfe, 0x6d, 0xfe, 0xe0, 0xfe, 0xdf, 0x01, 0x3a, 0x01, 0x0d, 0x02, 0x19, 0x01, 0xbe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x03, 0x60, 0x06, 0x64, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x10, 0x03, 0x23, 0x12, 0x11, 0x10, 0x23, 0x22, 0x11, 0x10, 0x13, 0x23, 0x02, 0x11, 0x10, 0x21, 0x20, 0x01, 0x33, 0x03, 0x23, 0x03, 0x60, 0x8a, 0x9b, 0x83, 0xdd, 0xe5, 0x82, 0x9c, 0x88, 0x01, 0x87, 0x01, 0x7f, 0xfe, 0xd8, 0xca, 0xe8, 0x92, 0x02, 0x44, 0xfe, 0xf4, 0xfe, 0xc9, 0x01, 0x20, 0x01, 0x23, 0x01, 0x90, 0xfe, 0x6d, 0xfe, 0xe0, 0xfe, 0xdf, 0x01, 0x3a, 0x01, 0x0d, 0x02, 0x19, 0x02, 0x04, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x03, 0x60, 0x06, 0x79, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x10, 0x03, 0x23, 0x12, 0x11, 0x10, 0x23, 0x22, 0x11, 0x10, 0x13, 0x23, 0x02, 0x11, 0x10, 0x21, 0x20, 0x03, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x03, 0x60, 0x8a, 0x9b, 0x83, 0xdd, 0xe5, 0x82, 0x9c, 0x88, 0x01, 0x87, 0x01, 0x7f, 0x65, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x16, 0x9a, 0x9a, 0x15, 0x02, 0x44, 0xfe, 0xf4, 0xfe, 0xc9, 0x01, 0x20, 0x01, 0x23, 0x01, 0x90, 0xfe, 0x6d, 0xfe, 0xe0, 0xfe, 0xdf, 0x01, 0x3a, 0x01, 0x0d, 0x02, 0x19, 0x02, 0x19, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x06, 0x1e, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x21, 0x15, 0x21, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfc, 0x78, 0x02, 0x1a, 0xfd, 0xe6, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x01, 0xbe, 0x94, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x06, 0x38, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfd, 0xd8, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x01, 0xd8, 0xca, 0xca, 0xca, 0x00, 0x00, 0x00, 0x04, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x07, 0x28, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x21, 0x15, 0x21, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfc, 0x76, 0x02, 0x1b, 0xfd, 0xe5, 0x01, 0x62, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x01, 0x37, 0x94, 0x02, 0x25, 0xca, 0xca, 0xca, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x06, 0x64, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x33, 0x03, 0x23, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfd, 0xb7, 0xca, 0xe8, 0x93, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x02, 0x04, 0xfe, 0xf8, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x06, 0x79, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfe, 0xb0, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x17, 0x98, 0x9b, 0x15, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x02, 0x19, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0x1e, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0xd5, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0xaf, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0x1e, 0x94, 0xfa, 0x36, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x00, 0x03, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0x38, 0x00, 0x03, 0x00, 0x07, 0x00, 0x28, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x02, 0x35, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0xaf, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0x38, 0xca, 0xca, 0xca, 0xfa, 0x52, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x07, 0x3c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0xd4, 0x02, 0x1a, 0xfd, 0xe6, 0x01, 0x61, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0xaf, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x05, 0xab, 0x94, 0x02, 0x25, 0xca, 0xca, 0xca, 0xf9, 0x4e, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0x64, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x02, 0x1d, 0xc1, 0xdf, 0x93, 0x02, 0x18, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0x64, 0xfe, 0xf8, 0xfa, 0x64, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0x79, 0x00, 0x08, 0x00, 0x29, 0x00, 0x00, 0x01, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x13, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x02, 0xf2, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x17, 0x98, 0x9b, 0x15, 0xfc, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0x79, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0xf9, 0x47, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0xd1, 0x00, 0x06, 0x00, 0x27, 0x00, 0x00, 0x01, 0x13, 0x23, 0x27, 0x07, 0x23, 0x13, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x02, 0x1c, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0xdd, 0x01, 0xed, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0xd1, 0xfe, 0x88, 0xf5, 0xf5, 0x01, 0x78, 0xf8, 0xef, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x14, 0x00, 0x09, 0x00, 0x20, 0x00, 0x00, 0x01, 0x22, 0x06, 0x10, 0x16, 0x20, 0x36, 0x35, 0x34, 0x26, 0x01, 0x10, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, 0x12, 0x10, 0x02, 0x20, 0x02, 0x02, 0x33, 0x84, 0x9b, 0x9a, 0x01, 0x0b, 0x9a, 0x9a, 0xfd, 0xad, 0xaf, 0x47, 0x3a, 0xae, 0x8e, 0x01, 0xca, 0xfe, 0x57, 0xa9, 0x69, 0x83, 0xd6, 0xf9, 0xf8, 0xfe, 0x50, 0xf5, 0x03, 0xdf, 0xe7, 0xfe, 0x6e, 0xe7, 0xe8, 0xc7, 0xc8, 0xe9, 0xfe, 0x50, 0x01, 0x4d, 0x9b, 0x2f, 0x8d, 0x31, 0x7c, 0x94, 0x93, 0x89, 0x49, 0x34, 0xfe, 0xc8, 0xfd, 0xda, 0xfe, 0xc6, 0x01, 0x39, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x05, 0x19, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x33, 0x05, 0x19, 0x9e, 0x59, 0x46, 0x01, 0x11, 0xfe, 0xef, 0xa6, 0xfe, 0x39, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x9d, 0x9e, 0x5a, 0x22, 0x23, 0x01, 0xc7, 0x9c, 0xaa, 0x06, 0x14, 0x99, 0x50, 0x68, 0x63, 0x8f, 0xfc, 0x2f, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x99, 0x28, 0x28, 0x68, 0x63, 0x4e, 0xbb, 0xab, 0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x03, 0xdd, 0x06, 0x14, 0x00, 0x15, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x01, 0x33, 0x15, 0x23, 0x03, 0xdc, 0xa6, 0xfe, 0x39, 0xa6, 0x9f, 0x9f, 0x9b, 0xa2, 0xa6, 0x9e, 0x5a, 0x45, 0x01, 0xc7, 0xa6, 0xa6, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xb7, 0xaf, 0x99, 0x50, 0x68, 0x63, 0x01, 0xb2, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x03, 0xdd, 0x06, 0x14, 0x00, 0x15, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x02, 0x0f, 0x01, 0xcd, 0xa6, 0xfe, 0xd8, 0x5a, 0x45, 0x01, 0x11, 0xfe, 0xef, 0xa6, 0x9f, 0x9f, 0x9c, 0x06, 0x14, 0xf9, 0xec, 0x05, 0x7b, 0x50, 0x68, 0x63, 0x8f, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x06, 0x4a, 0x06, 0x14, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x05, 0x33, 0x15, 0x23, 0x02, 0xac, 0x9e, 0x5a, 0x22, 0x23, 0x01, 0xc7, 0x4e, 0x19, 0x23, 0x47, 0x75, 0x9d, 0x9e, 0x59, 0x46, 0x02, 0x6d, 0xa6, 0xfe, 0x39, 0xa6, 0xfe, 0x39, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x03, 0x94, 0xa6, 0xa6, 0x06, 0x14, 0x99, 0x28, 0x28, 0x68, 0x63, 0x4e, 0xbb, 0x55, 0x1c, 0x13, 0x27, 0x99, 0x50, 0x68, 0x63, 0xfb, 0xa0, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x02, 0xe9, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x06, 0x4a, 0x06, 0x14, 0x00, 0x26, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x21, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x02, 0xac, 0x9e, 0x5a, 0x22, 0x23, 0x01, 0xc7, 0x9c, 0xaa, 0x01, 0xcd, 0xa6, 0xfe, 0xd8, 0x59, 0x46, 0x01, 0x11, 0xfe, 0xef, 0xa6, 0xfe, 0x39, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x06, 0x14, 0x99, 0x28, 0x28, 0x68, 0x63, 0x4e, 0xbb, 0xab, 0xf9, 0xec, 0x05, 0x7b, 0x50, 0x68, 0x63, 0x8f, 0xfc, 0x2f, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x04, 0xc5, 0x06, 0x14, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x02, 0xc9, 0x21, 0x21, 0x5b, 0x1e, 0x5a, 0x23, 0x22, 0xa6, 0x9f, 0x9f, 0x4e, 0x4e, 0xaa, 0x1b, 0xaa, 0x4f, 0x4c, 0x01, 0x55, 0xfe, 0xab, 0x22, 0x22, 0x67, 0xaa, 0xaa, 0xbf, 0x49, 0x49, 0x7a, 0x04, 0x60, 0x63, 0x68, 0x28, 0x28, 0x28, 0x28, 0x68, 0xfb, 0x3d, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0x55, 0x56, 0x56, 0x53, 0xbd, 0x4e, 0x8f, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x9a, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe3, 0x06, 0x07, 0x05, 0xf0, 0x00, 0x59, 0x00, 0x00, 0x01, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x27, 0x26, 0x07, 0x22, 0x07, 0x06, 0x15, 0x14, 0x02, 0xfc, 0x4d, 0x42, 0x4c, 0x3f, 0x69, 0x39, 0x35, 0x2c, 0x2d, 0x85, 0x38, 0xb0, 0x95, 0x6e, 0x70, 0xc2, 0x57, 0x53, 0x57, 0x61, 0x5c, 0x59, 0x59, 0x57, 0x75, 0x3f, 0x3f, 0x2d, 0x28, 0xa0, 0x39, 0x9a, 0x44, 0x45, 0x5c, 0x65, 0xa3, 0x40, 0x46, 0x05, 0x53, 0x52, 0x92, 0x7e, 0x58, 0x55, 0x01, 0x55, 0xfe, 0xab, 0x21, 0x22, 0x67, 0xab, 0xab, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x2b, 0x31, 0x3d, 0x3e, 0x31, 0x2f, 0x04, 0x3f, 0xae, 0x2b, 0x11, 0x14, 0x2a, 0x27, 0x57, 0x40, 0x25, 0x24, 0x21, 0x0e, 0x2b, 0x98, 0x89, 0x9c, 0x5b, 0x5b, 0x11, 0x12, 0x23, 0xbe, 0x35, 0x1a, 0x1b, 0x2d, 0x2c, 0x51, 0x4b, 0x28, 0x23, 0x2a, 0x0f, 0x24, 0x4a, 0x4b, 0x82, 0xa6, 0x4e, 0x56, 0x0b, 0x1d, 0x1f, 0x87, 0x5f, 0x5d, 0x01, 0x60, 0x5c, 0x88, 0x4c, 0x8f, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x9a, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x4e, 0x41, 0x2b, 0x32, 0x01, 0x31, 0x30, 0x40, 0x3d, 0x00, 0x00, 0x01, 0xfc, 0xcb, 0x06, 0x04, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x07, 0x00, 0x00, 0x11, 0x22, 0x04, 0x07, 0x35, 0x36, 0x24, 0x33, 0xd0, 0xfe, 0x6a, 0xcf, 0xd5, 0x01, 0x97, 0xc9, 0x06, 0xd4, 0x67, 0x69, 0x7e, 0x77, 0x75, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x35, 0x07, 0x6e, 0x00, 0x07, 0x00, 0x00, 0x11, 0x35, 0x32, 0x04, 0x17, 0x15, 0x26, 0x24, 0xc9, 0x01, 0x97, 0xd5, 0xcf, 0xfe, 0x6a, 0x06, 0xd4, 0x9a, 0x75, 0x77, 0x7e, 0x69, 0x67, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x72, 0x06, 0x0d, 0x00, 0x00, 0x07, 0x27, 0x00, 0x13, 0x00, 0x00, 0x11, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x04, 0x81, 0x19, 0x48, 0x27, 0x21, 0x5a, 0x30, 0x3f, 0x05, 0x91, 0x03, 0x66, 0x65, 0xb4, 0x52, 0x38, 0x32, 0x4f, 0x06, 0x48, 0x02, 0x37, 0x0b, 0x12, 0x0a, 0x24, 0x30, 0x47, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x0d, 0x02, 0x8e, 0x07, 0x27, 0x00, 0x13, 0x00, 0x00, 0x11, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x04, 0x81, 0x19, 0x48, 0x27, 0x21, 0x57, 0x33, 0x40, 0x04, 0x91, 0x03, 0x66, 0x65, 0xb4, 0x52, 0x38, 0x32, 0x4f, 0x06, 0xec, 0x02, 0x37, 0x0b, 0x12, 0x0a, 0x24, 0x2c, 0x4b, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1b, 0xff, 0x54, 0x07, 0x47, 0x07, 0x4c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x2a, 0x00, 0x00, 0x09, 0x04, 0x15, 0x33, 0x35, 0x27, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x1d, 0x01, 0x03, 0xb1, 0x03, 0x96, 0xfc, 0x6a, 0xfc, 0x6a, 0x03, 0x3a, 0xb7, 0x06, 0x06, 0x05, 0x07, 0x12, 0x14, 0x28, 0x4f, 0x53, 0x1e, 0x21, 0xc9, 0xa5, 0x5d, 0xae, 0x54, 0x57, 0xa1, 0x47, 0x61, 0x76, 0x2e, 0x33, 0x51, 0x51, 0x32, 0x07, 0x4c, 0xfc, 0x04, 0xfc, 0x04, 0x03, 0xfc, 0xfd, 0xae, 0xfe, 0xfe, 0x93, 0x7b, 0x34, 0x3c, 0x15, 0x19, 0x1a, 0x1f, 0x2b, 0x56, 0x5a, 0x40, 0x45, 0x4c, 0x9f, 0xc2, 0x38, 0x39, 0xbc, 0x43, 0x46, 0x6e, 0x59, 0x31, 0x5e, 0x35, 0x59, 0x56, 0x82, 0x65, 0x9a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe3, 0x05, 0x19, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x00, 0x37, 0x01, 0x33, 0x01, 0x07, 0x03, 0x21, 0x03, 0x13, 0x21, 0x03, 0x5a, 0x01, 0xf8, 0xcf, 0x01, 0xf8, 0x97, 0xae, 0xfd, 0xcb, 0xae, 0xec, 0x01, 0xb9, 0xdc, 0x23, 0x05, 0xb2, 0xfa, 0x4e, 0x40, 0x01, 0xf6, 0xfe, 0x0a, 0x02, 0xaa, 0x02, 0x7c, 0x00, 0x03, 0x00, 0xb4, 0xff, 0xed, 0x03, 0xac, 0x05, 0xe8, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x21, 0x22, 0x27, 0x13, 0x11, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x56, 0x2f, 0xe2, 0x6b, 0x37, 0xb3, 0x9d, 0xfe, 0xfb, 0x7a, 0x5a, 0xd8, 0x92, 0xba, 0xc2, 0xc1, 0x6a, 0x99, 0xfe, 0xdd, 0x5a, 0x77, 0xa2, 0x64, 0xd2, 0x55, 0x28, 0xd5, 0xac, 0x02, 0x7e, 0xfe, 0x23, 0x72, 0x3b, 0x42, 0x59, 0x95, 0x03, 0x57, 0x13, 0x61, 0x7b, 0xd0, 0xd5, 0x7a, 0x7a, 0xe4, 0x8e, 0x70, 0xa4, 0x13, 0x05, 0x34, 0xfe, 0x15, 0x80, 0x3d, 0x38, 0x68, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xe3, 0x03, 0x86, 0x05, 0xf3, 0x00, 0x05, 0x00, 0x00, 0x05, 0x09, 0x01, 0x17, 0x09, 0x01, 0x03, 0x14, 0xfd, 0x46, 0x02, 0xba, 0x72, 0xfd, 0xb9, 0x02, 0x47, 0x1d, 0x03, 0x08, 0x03, 0x08, 0x7f, 0xfd, 0x77, 0xfd, 0x77, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x9f, 0x05, 0xd2, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x33, 0x11, 0x33, 0x20, 0x17, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x04, 0x21, 0x37, 0x3e, 0x02, 0x10, 0x27, 0x2e, 0x01, 0x27, 0xb4, 0x51, 0x01, 0x5d, 0x8e, 0x90, 0x16, 0x09, 0x23, 0x32, 0xfe, 0xd9, 0xfe, 0xe2, 0x51, 0xb9, 0xb3, 0x3b, 0x09, 0x10, 0xa9, 0xe5, 0x05, 0xd2, 0x78, 0x7a, 0xf9, 0x65, 0xfe, 0x62, 0x7f, 0xb8, 0xad, 0xc0, 0x08, 0x63, 0xd4, 0x01, 0x7a, 0x5c, 0xac, 0x91, 0x0a, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x40, 0x05, 0xf2, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x05, 0x07, 0x25, 0x11, 0x05, 0x07, 0x25, 0x11, 0x05, 0x07, 0x01, 0x56, 0xa2, 0x02, 0x8c, 0x1a, 0xfe, 0x30, 0x01, 0xea, 0x1a, 0xfe, 0x30, 0x01, 0xea, 0x1a, 0x01, 0x36, 0xfe, 0xca, 0x05, 0xf2, 0x75, 0xb2, 0x53, 0xfe, 0xc3, 0x58, 0xb2, 0x53, 0xfe, 0xc3, 0x58, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x40, 0x05, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x05, 0x07, 0x25, 0x11, 0x05, 0x07, 0x01, 0x56, 0xa2, 0x02, 0x8c, 0x1a, 0xfe, 0x30, 0x01, 0xea, 0x1a, 0x03, 0x2a, 0xfc, 0xd6, 0x05, 0xf2, 0x75, 0xb2, 0x53, 0xfe, 0xc3, 0x58, 0xb2, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x02, 0xa3, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x87, 0x02, 0x1c, 0xbd, 0xbd, 0xfd, 0xe4, 0xbd, 0xbd, 0x05, 0xd5, 0xb4, 0xfb, 0x93, 0xb4, 0xb4, 0x04, 0x6d, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xcc, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x11, 0x05, 0x21, 0x11, 0x21, 0xb4, 0x03, 0x18, 0xfc, 0xe8, 0x02, 0x76, 0xfe, 0x2c, 0x01, 0xd4, 0xfe, 0x2c, 0x01, 0xd4, 0x05, 0xd5, 0xfa, 0x2b, 0x03, 0x45, 0x01, 0xdc, 0xfe, 0x24, 0xb4, 0xfe, 0x23, 0x00, 0x00, 0x00, 0x05, 0x00, 0x87, 0xff, 0xe3, 0x05, 0xfa, 0x05, 0xf3, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x06, 0x04, 0x20, 0x24, 0x26, 0x02, 0x10, 0x12, 0x36, 0x24, 0x20, 0x04, 0x16, 0x12, 0x01, 0x36, 0x12, 0x37, 0x21, 0x03, 0x11, 0x21, 0x16, 0x12, 0x01, 0x21, 0x11, 0x06, 0x02, 0x01, 0x11, 0x21, 0x26, 0x02, 0x05, 0xfa, 0x6e, 0xbb, 0xfe, 0xfd, 0xfe, 0xe5, 0xfe, 0xfd, 0xbb, 0x6e, 0x6e, 0xbb, 0x01, 0x03, 0x01, 0x1b, 0x01, 0x03, 0xbb, 0x6e, 0xfd, 0x98, 0xae, 0xf7, 0x1b, 0xfe, 0x40, 0xa2, 0xfe, 0x3f, 0x1b, 0xf7, 0xfe, 0xee, 0x01, 0xc1, 0xaf, 0xf7, 0x02, 0x48, 0x01, 0xc0, 0x1b, 0xf7, 0x02, 0x4e, 0xfe, 0xe0, 0xd0, 0x7b, 0x7b, 0xd0, 0x01, 0x20, 0x01, 0x3a, 0x01, 0x20, 0xd0, 0x7b, 0x7b, 0xd0, 0xfe, 0xe0, 0xfd, 0x16, 0x1e, 0x01, 0x12, 0xc3, 0xfe, 0x0d, 0x01, 0xf3, 0xc3, 0xfe, 0xee, 0x02, 0x89, 0x01, 0xf3, 0x1e, 0xfe, 0xee, 0x01, 0x30, 0xfe, 0x0d, 0xc3, 0x01, 0x12, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x56, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xb4, 0xa2, 0xa2, 0x05, 0xd5, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xff, 0xe3, 0x04, 0x10, 0x05, 0xf3, 0x00, 0x0a, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x01, 0x17, 0x09, 0x01, 0x07, 0x01, 0x01, 0x56, 0xa2, 0xa2, 0x02, 0x47, 0x6c, 0xfd, 0x76, 0x02, 0x91, 0x6c, 0xfd, 0xb2, 0x05, 0xd5, 0xfd, 0xe1, 0x02, 0x3d, 0x86, 0xfd, 0x81, 0xfd, 0x7b, 0x86, 0x02, 0x43, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x96, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x17, 0x01, 0x23, 0x11, 0x33, 0x01, 0x56, 0x01, 0xcc, 0x73, 0xfd, 0x92, 0x73, 0xa2, 0x01, 0x33, 0x02, 0x00, 0x80, 0xfd, 0x4d, 0x05, 0xd5, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x09, 0xbf, 0x05, 0xf3, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x09, 0x03, 0x17, 0x09, 0x03, 0x11, 0x23, 0xb4, 0x68, 0x02, 0x43, 0x01, 0xff, 0x01, 0xf7, 0x01, 0xf7, 0x73, 0xfd, 0x96, 0xfe, 0x0a, 0xfe, 0x09, 0xfd, 0xee, 0xa2, 0x05, 0xd5, 0xfd, 0xe5, 0x02, 0x39, 0xfd, 0xd1, 0x02, 0x2f, 0x80, 0xfd, 0x53, 0x02, 0x2e, 0xfd, 0xd2, 0x01, 0xee, 0xfb, 0x4c, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xd2, 0x05, 0xf3, 0x00, 0x08, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x17, 0x09, 0x01, 0x11, 0x23, 0xb4, 0x68, 0x02, 0x43, 0x01, 0xff, 0x74, 0xfd, 0x96, 0xfd, 0xee, 0xa2, 0x05, 0xd5, 0xfd, 0xe5, 0x02, 0x39, 0x80, 0xfd, 0x53, 0x01, 0xee, 0xfb, 0x4c, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xf3, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x13, 0x11, 0x21, 0x11, 0x01, 0x56, 0x01, 0xac, 0xfd, 0xb2, 0x05, 0x3f, 0xfa, 0xc1, 0x02, 0xf0, 0x01, 0xad, 0xfc, 0x05, 0x01, 0xac, 0xa2, 0x01, 0xad, 0x02, 0x90, 0xfe, 0x24, 0x01, 0xdc, 0x03, 0x45, 0xfa, 0x2b, 0x05, 0x21, 0xfe, 0x24, 0x01, 0xdc, 0xfe, 0x24, 0x01, 0xdc, 0xfd, 0x6f, 0xfe, 0x24, 0x01, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x87, 0xff, 0xe3, 0x05, 0xfa, 0x05, 0xf3, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x00, 0x00, 0x36, 0x34, 0x2e, 0x02, 0x22, 0x0e, 0x02, 0x14, 0x1e, 0x02, 0x32, 0x36, 0x00, 0x02, 0x06, 0x04, 0x20, 0x24, 0x26, 0x02, 0x10, 0x12, 0x36, 0x24, 0x20, 0x04, 0x16, 0x12, 0x04, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x05, 0x03, 0x55, 0x55, 0x8f, 0xc8, 0xd8, 0xc7, 0x8f, 0x55, 0x55, 0x8f, 0xc7, 0xd8, 0xc8, 0x01, 0x86, 0x6e, 0xbb, 0xfe, 0xfd, 0xfe, 0xe5, 0xfe, 0xfd, 0xbb, 0x6e, 0x6e, 0xbb, 0x01, 0x03, 0x01, 0x1b, 0x01, 0x03, 0xbb, 0x6e, 0xfd, 0xc4, 0x49, 0x69, 0x4a, 0x4a, 0x69, 0x49, 0x01, 0x94, 0xdf, 0xf0, 0xdf, 0x9e, 0x5f, 0x5f, 0x9e, 0xdf, 0xf0, 0xdf, 0x9e, 0x5f, 0x5f, 0x01, 0x58, 0xfe, 0xe0, 0xd0, 0x7b, 0x7b, 0xd0, 0x01, 0x20, 0x01, 0x3a, 0x01, 0x20, 0xd0, 0x7b, 0x7b, 0xd0, 0xfe, 0xe0, 0xd7, 0x52, 0x52, 0x74, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xe8, 0x00, 0x11, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x24, 0x21, 0x22, 0x07, 0x11, 0x23, 0x11, 0x36, 0x33, 0x20, 0x00, 0x11, 0x10, 0x05, 0x02, 0xd7, 0xf1, 0xfe, 0xf1, 0xfe, 0xfe, 0x2f, 0x32, 0xa2, 0x92, 0x71, 0x01, 0x3f, 0x01, 0x74, 0xfe, 0xa7, 0x02, 0x59, 0x66, 0xd4, 0xb6, 0xf9, 0x06, 0xfa, 0xc4, 0x05, 0xd4, 0x14, 0xfe, 0xbf, 0xfe, 0xec, 0xfe, 0xb0, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x8d, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x33, 0x11, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x09, 0x01, 0x11, 0xb4, 0xa2, 0x01, 0xca, 0x01, 0xca, 0xa2, 0xa2, 0xfe, 0x36, 0xfe, 0x36, 0x05, 0xd5, 0xfd, 0xa2, 0x02, 0x5e, 0xfa, 0x2b, 0x04, 0xbd, 0xfd, 0xa1, 0x02, 0x5f, 0xfb, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x87, 0x00, 0x00, 0x03, 0xb1, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x06, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x03, 0x0f, 0x41, 0x70, 0x84, 0x70, 0x41, 0x41, 0x70, 0x84, 0x70, 0xe3, 0x6e, 0x5c, 0x39, 0x41, 0xa2, 0x40, 0x3a, 0x5e, 0x6c, 0x6d, 0xba, 0xdc, 0xba, 0x6d, 0x03, 0xe7, 0x93, 0x7c, 0x48, 0x48, 0x7c, 0x93, 0x7d, 0x48, 0x48, 0x4c, 0xd1, 0x3b, 0x25, 0x0e, 0xfd, 0x89, 0x02, 0x77, 0x0e, 0x25, 0x3c, 0xd0, 0xf4, 0xcf, 0x79, 0x79, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xd7, 0x05, 0xe9, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x00, 0x08, 0x01, 0x15, 0x14, 0x02, 0x07, 0x06, 0x23, 0x11, 0x23, 0x11, 0x36, 0x33, 0x03, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x02, 0x8f, 0x01, 0x48, 0xb4, 0xe6, 0x6a, 0x7d, 0xa2, 0x92, 0x71, 0x61, 0xee, 0x78, 0x79, 0x7d, 0x67, 0xab, 0x26, 0x2a, 0x05, 0xe9, 0xfe, 0xe5, 0xfc, 0x8d, 0xfe, 0xd1, 0x4e, 0x24, 0xfe, 0x5c, 0x05, 0xd5, 0x14, 0xfc, 0x6f, 0x73, 0x72, 0x96, 0x9e, 0x6c, 0x58, 0x04, 0x00, 0x01, 0x00, 0x87, 0xff, 0xf2, 0x02, 0xa7, 0x05, 0xea, 0x00, 0x09, 0x00, 0x00, 0x09, 0x03, 0x07, 0x09, 0x03, 0x17, 0x01, 0x6c, 0x01, 0x3b, 0xfe, 0xc5, 0x01, 0x02, 0x73, 0xfe, 0x8c, 0x01, 0x3b, 0xfe, 0xc5, 0x01, 0x74, 0x73, 0x04, 0x4c, 0xfe, 0xa2, 0xfe, 0xa2, 0xfe, 0xe2, 0x80, 0x01, 0x9e, 0x01, 0x5e, 0x01, 0x5e, 0x01, 0x9e, 0x80, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x04, 0x7d, 0x05, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x01, 0x07, 0x25, 0x11, 0x23, 0x11, 0x25, 0x37, 0x04, 0x7c, 0x32, 0xfe, 0x60, 0xa2, 0xfe, 0x52, 0x32, 0x04, 0x8a, 0xac, 0x95, 0xfb, 0x8d, 0x04, 0xad, 0x99, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x3c, 0x05, 0xea, 0x00, 0x07, 0x00, 0x00, 0x01, 0x17, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x03, 0xc8, 0x74, 0xfd, 0x1a, 0xa2, 0xa2, 0x05, 0xea, 0x80, 0xfc, 0xc9, 0xfd, 0xcd, 0x05, 0xd5, 0xfd, 0x5c, 0x00, 0x01, 0x00, 0x87, 0xff, 0xe3, 0x04, 0x6a, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x37, 0x09, 0x01, 0x17, 0x09, 0x01, 0x07, 0x09, 0x01, 0x27, 0x02, 0x16, 0xfe, 0x71, 0x87, 0x01, 0x6a, 0x01, 0x6a, 0x88, 0xfe, 0x71, 0x01, 0x8f, 0x88, 0xfe, 0x96, 0xfe, 0x96, 0x87, 0x02, 0xed, 0x02, 0xa3, 0x62, 0xfd, 0xa1, 0x02, 0x5f, 0x62, 0xfd, 0x5d, 0xfd, 0x58, 0x62, 0x02, 0x64, 0xfd, 0x9c, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0x87, 0x00, 0x00, 0x04, 0x65, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x00, 0x21, 0x23, 0x35, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x19, 0x01, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x03, 0x11, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0xc7, 0xa2, 0x99, 0x74, 0x91, 0x91, 0x73, 0x9a, 0xa2, 0x99, 0x74, 0x91, 0x91, 0x73, 0x9a, 0x56, 0x44, 0x62, 0x62, 0x44, 0xf8, 0x56, 0x44, 0x62, 0x62, 0x44, 0xcc, 0x1a, 0x80, 0xa1, 0x01, 0xc7, 0xa2, 0x80, 0x1a, 0xcb, 0xcb, 0x1a, 0x80, 0xa1, 0xfe, 0x39, 0xa2, 0x80, 0x1a, 0x03, 0x87, 0xfd, 0x30, 0x17, 0x4c, 0x6c, 0x01, 0x32, 0x6c, 0x4b, 0xfd, 0x48, 0x02, 0xd0, 0x17, 0x4c, 0x6e, 0x98, 0x96, 0x6e, 0x4c, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x05, 0x7b, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x23, 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, 0x11, 0x01, 0x17, 0x01, 0x03, 0x3b, 0xa2, 0xfd, 0xc1, 0x73, 0x01, 0xcc, 0xa2, 0x01, 0xcc, 0x73, 0xfd, 0xc1, 0x02, 0xf4, 0x02, 0x7e, 0x80, 0xfe, 0x00, 0x01, 0xe3, 0xfe, 0x1d, 0x02, 0x00, 0x80, 0xfd, 0x82, 0x00, 0x03, 0x00, 0x87, 0xff, 0xf1, 0x03, 0x45, 0x05, 0xb9, 0x00, 0x07, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x00, 0x00, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x32, 0x24, 0x06, 0x20, 0x26, 0x10, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x10, 0x36, 0x20, 0x16, 0x10, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x02, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x32, 0x02, 0xa3, 0x6f, 0x9c, 0x6f, 0x6f, 0x9c, 0x01, 0x11, 0xce, 0xfe, 0xde, 0xce, 0x67, 0x2a, 0x31, 0x31, 0x2a, 0x67, 0xce, 0x01, 0x22, 0xce, 0x67, 0x2a, 0x31, 0x31, 0x2a, 0x67, 0xa2, 0x6f, 0x9c, 0x6f, 0x6f, 0x9c, 0x01, 0x20, 0xae, 0x7b, 0x7b, 0xae, 0x7b, 0x31, 0xe5, 0xe5, 0x01, 0x42, 0x73, 0x2f, 0x1b, 0x1c, 0x2e, 0x72, 0x01, 0x43, 0xe5, 0xe5, 0xfe, 0xbe, 0x73, 0x2f, 0x1b, 0x1c, 0x2e, 0x72, 0x01, 0xc3, 0xae, 0x7b, 0x7b, 0xae, 0x7b, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x7d, 0x05, 0xe8, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x00, 0x33, 0x11, 0x36, 0x33, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x19, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0xb4, 0x77, 0x74, 0xdb, 0x01, 0x03, 0xfe, 0xcb, 0xf2, 0xb6, 0xcf, 0xa2, 0x92, 0x26, 0x2b, 0x05, 0xd5, 0x13, 0xe6, 0xbd, 0xd0, 0xdc, 0xfd, 0x67, 0x03, 0x4e, 0x7f, 0x76, 0x63, 0x9c, 0x06, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xff, 0xed, 0x03, 0x7d, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x00, 0x13, 0x33, 0x11, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x13, 0x30, 0x11, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xb4, 0xa2, 0xf2, 0x01, 0x35, 0xfe, 0xfd, 0xdb, 0x74, 0x77, 0xa2, 0x2b, 0x26, 0x92, 0xa2, 0xcf, 0x05, 0xd5, 0xfd, 0x67, 0xdc, 0xd0, 0xbd, 0xe6, 0x13, 0x02, 0x87, 0xfe, 0x12, 0x06, 0x9c, 0x63, 0x76, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x02, 0x76, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x13, 0x35, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x5a, 0x01, 0x7a, 0xa2, 0xa2, 0x02, 0x91, 0xb4, 0x02, 0x90, 0xfa, 0x2b, 0x02, 0x91, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x05, 0x19, 0x05, 0xf2, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x23, 0x01, 0x37, 0x09, 0x01, 0x00, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x05, 0x19, 0xfe, 0x08, 0xcf, 0xfe, 0x08, 0x97, 0x01, 0xc9, 0x01, 0xc8, 0xfe, 0xb6, 0x4a, 0x69, 0x49, 0x49, 0x69, 0x4a, 0x05, 0xb2, 0xfa, 0x4e, 0x05, 0xb2, 0x40, 0xfa, 0xda, 0x05, 0x26, 0xfd, 0xd8, 0x52, 0x52, 0x74, 0x52, 0x52, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x56, 0x05, 0xd5, 0x12, 0x06, 0x0f, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xe3, 0x05, 0x19, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x37, 0x01, 0x33, 0x01, 0x07, 0x09, 0x01, 0x5a, 0x01, 0xf8, 0xcf, 0x01, 0xf8, 0x97, 0xfe, 0x38, 0xfe, 0x37, 0x23, 0x05, 0xb2, 0xfa, 0x4e, 0x40, 0x05, 0x26, 0xfa, 0xda, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0xff, 0xe3, 0x04, 0x6a, 0x05, 0xf2, 0x12, 0x06, 0x0f, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x05, 0x8a, 0x05, 0xf3, 0x00, 0x08, 0x00, 0x00, 0x13, 0x09, 0x01, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x5a, 0x02, 0x81, 0x02, 0xaf, 0x6e, 0xfe, 0x12, 0xa2, 0xfe, 0x41, 0x03, 0x2c, 0x02, 0xc7, 0xfd, 0x3b, 0x84, 0x01, 0xfe, 0xfb, 0x58, 0x04, 0x9d, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x99, 0x01, 0xe0, 0x05, 0xdc, 0x02, 0xa8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x05, 0x35, 0x21, 0x15, 0x29, 0x01, 0x35, 0x21, 0x01, 0xca, 0xfe, 0xcf, 0x01, 0x31, 0x02, 0xe0, 0x01, 0x31, 0xfd, 0xf7, 0xfe, 0xd0, 0x01, 0x30, 0x01, 0xe0, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x37, 0x05, 0xdc, 0x04, 0x0e, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xff, 0x58, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x3a, 0x05, 0xdc, 0x04, 0x0a, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x62, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x3d, 0x05, 0xdc, 0x04, 0x0b, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xff, 0x5d, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x3b, 0x05, 0xdc, 0x04, 0x0a, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x3c, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x3d, 0x05, 0xdc, 0x04, 0x0a, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xff, 0x5d, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x23, 0x01, 0x33, 0x09, 0x01, 0x21, 0x03, 0x21, 0x03, 0x23, 0x01, 0x17, 0x01, 0x21, 0x03, 0x07, 0xb9, 0x01, 0xbd, 0xb9, 0xfe, 0x81, 0x02, 0x01, 0xfe, 0x86, 0x89, 0xfd, 0xc0, 0x89, 0x6c, 0x02, 0x00, 0x16, 0xff, 0x00, 0x01, 0xff, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x71, 0xfa, 0x2b, 0x01, 0xa1, 0xfe, 0x5f, 0x05, 0xd5, 0xc7, 0xfc, 0xf7, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xc7, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x25, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x11, 0x14, 0x06, 0x23, 0x21, 0x01, 0x11, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x03, 0x11, 0x33, 0x36, 0x33, 0x11, 0x26, 0x23, 0x21, 0x11, 0x33, 0x11, 0x01, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x36, 0x35, 0x34, 0x27, 0xb5, 0x02, 0x29, 0xcf, 0xe1, 0xac, 0xe4, 0xf5, 0xe1, 0xfd, 0xc5, 0x01, 0x68, 0xd3, 0x35, 0x2d, 0x2d, 0x35, 0xd3, 0xc1, 0x20, 0x1d, 0x1d, 0x20, 0xfe, 0x31, 0xb6, 0x01, 0xec, 0xbb, 0xbb, 0x38, 0xbb, 0xbb, 0x05, 0xd5, 0xc0, 0xb1, 0xe5, 0x5d, 0x61, 0xfe, 0xe1, 0xc8, 0xda, 0x02, 0xe9, 0xfd, 0x7b, 0x07, 0x02, 0x77, 0x07, 0x02, 0x88, 0xfd, 0xdc, 0x03, 0x02, 0x1f, 0x02, 0xfa, 0xf3, 0x05, 0x0d, 0xfb, 0x11, 0x44, 0xdc, 0xe5, 0x44, 0x96, 0x36, 0xcd, 0xc4, 0x36, 0x00, 0x00, 0x04, 0x00, 0xd0, 0x00, 0x00, 0x05, 0x95, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x10, 0x00, 0x14, 0x00, 0x19, 0x00, 0x00, 0x13, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x01, 0x13, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x21, 0x11, 0x33, 0x03, 0x01, 0x36, 0x11, 0x10, 0x27, 0xd1, 0x01, 0xcf, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfe, 0x31, 0x01, 0x6a, 0x01, 0x59, 0xdc, 0x90, 0x90, 0xdd, 0xfe, 0x98, 0xb6, 0x01, 0x02, 0x7f, 0xc8, 0xc8, 0x05, 0xd5, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x05, 0x71, 0xfa, 0xf3, 0x41, 0x04, 0x8b, 0x41, 0xfa, 0xf3, 0x05, 0x0d, 0xfb, 0x6b, 0x95, 0x01, 0x7b, 0x01, 0x71, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcb, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x25, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x01, 0x0f, 0xb6, 0xfe, 0xf0, 0x04, 0x05, 0xfd, 0x65, 0x02, 0x80, 0xfd, 0x80, 0x02, 0xac, 0xfb, 0xea, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfd, 0xe4, 0x64, 0xfd, 0x73, 0x64, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x01, 0x23, 0x11, 0x33, 0xb5, 0x03, 0xb9, 0xfd, 0xb1, 0x02, 0x15, 0xfd, 0xeb, 0xfe, 0x96, 0x01, 0x10, 0xb6, 0xb6, 0x05, 0xd5, 0x64, 0xfd, 0xe4, 0x64, 0xfd, 0x0f, 0x05, 0x71, 0xfa, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x11, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x01, 0x11, 0x06, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x04, 0xda, 0x72, 0xea, 0x78, 0xa8, 0x7a, 0x7a, 0xa8, 0x82, 0x73, 0x5b, 0x4d, 0xfe, 0x7d, 0x01, 0xdd, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xfe, 0x9d, 0x01, 0x63, 0x01, 0x3b, 0x83, 0xed, 0x64, 0xfc, 0xb0, 0x19, 0x17, 0x98, 0x98, 0x17, 0x04, 0xe4, 0x61, 0x47, 0x40, 0xfb, 0x3b, 0x40, 0x26, 0x1f, 0x35, 0x01, 0xe7, 0x64, 0xfd, 0x7f, 0x53, 0x55, 0x01, 0x99, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x99, 0x48, 0x46, 0xfb, 0x63, 0x04, 0x49, 0x16, 0x1a, 0xaf, 0xfe, 0xba, 0xfe, 0xbb, 0xaf, 0x1a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x00, 0x02, 0x78, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x25, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x01, 0x10, 0xb6, 0xfe, 0x96, 0x02, 0x1c, 0x5a, 0x5a, 0xfd, 0xe4, 0x5a, 0x5a, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfa, 0xf3, 0x64, 0x64, 0x05, 0x0d, 0x00, 0x00, 0x02, 0xff, 0xa0, 0xfe, 0x66, 0x02, 0x1d, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x36, 0x37, 0x36, 0x35, 0x11, 0x25, 0x21, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x01, 0x0f, 0x4d, 0x81, 0x39, 0x47, 0xfe, 0xf2, 0x01, 0x68, 0xb9, 0xcc, 0xf7, 0x38, 0x79, 0x63, 0x05, 0x71, 0xfa, 0xb1, 0xf2, 0x64, 0x0a, 0x4a, 0x5e, 0xea, 0x05, 0x09, 0x64, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0x64, 0x96, 0xc2, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x92, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x21, 0x13, 0x11, 0x33, 0x11, 0xb5, 0x01, 0x68, 0x02, 0xb6, 0x8f, 0xfc, 0xf9, 0x03, 0x37, 0x8a, 0xfd, 0x15, 0xfe, 0x98, 0x5a, 0xb6, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x40, 0xfc, 0xeb, 0x02, 0xcf, 0xfd, 0x31, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xad, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x15, 0x21, 0x13, 0x11, 0x33, 0x11, 0xb5, 0x01, 0x6a, 0x02, 0x8e, 0xfc, 0x08, 0x5a, 0xb6, 0x05, 0xd5, 0xfa, 0x8f, 0x64, 0x05, 0x6f, 0xfa, 0xf3, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb0, 0x00, 0x00, 0x06, 0xb1, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x21, 0x11, 0x01, 0x23, 0x01, 0x03, 0x21, 0x11, 0x21, 0x09, 0x01, 0x21, 0x11, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x05, 0x47, 0xfe, 0x89, 0x40, 0xfe, 0x8b, 0x01, 0xfe, 0x96, 0x01, 0xa9, 0x01, 0x57, 0x01, 0x59, 0x01, 0xa8, 0xfe, 0xf0, 0xb6, 0xfa, 0xb3, 0xb6, 0x05, 0x71, 0xfb, 0xae, 0x04, 0x52, 0xfa, 0x8f, 0x05, 0xd5, 0xfc, 0x08, 0x03, 0xf8, 0xfa, 0x2b, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x66, 0xff, 0xe3, 0x05, 0x45, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x28, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x13, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x03, 0x11, 0x06, 0x07, 0x06, 0x10, 0x17, 0x16, 0x01, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x01, 0x02, 0xd5, 0x01, 0x1b, 0xa9, 0xab, 0xaa, 0xaa, 0xfe, 0xe5, 0xfe, 0xe5, 0xa9, 0xaa, 0xaa, 0xa9, 0x40, 0x61, 0xf5, 0x61, 0x61, 0xf5, 0x61, 0x5f, 0x20, 0x1d, 0x8b, 0x8b, 0x1d, 0x02, 0x95, 0x1f, 0x1c, 0x8b, 0x8b, 0x1c, 0xfc, 0x38, 0x05, 0xf0, 0xd2, 0xd5, 0xfe, 0xa0, 0xfe, 0xa1, 0xd4, 0xd3, 0xd3, 0xd2, 0x01, 0x61, 0x01, 0x62, 0xd3, 0xd2, 0xfa, 0x8e, 0x32, 0x32, 0x04, 0xd7, 0x32, 0x32, 0xfb, 0x6a, 0x04, 0x54, 0x1d, 0x25, 0xb6, 0xfd, 0x9c, 0xb5, 0x25, 0x04, 0x35, 0xfb, 0xaf, 0x1d, 0x24, 0xb6, 0x02, 0x63, 0xb6, 0x24, 0xfd, 0xf4, 0x00, 0x00, 0x02, 0x00, 0x7a, 0xff, 0xdc, 0x04, 0x29, 0x05, 0xf6, 0x00, 0x11, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x06, 0x10, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x10, 0x07, 0x36, 0x10, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x34, 0x25, 0x15, 0x26, 0x20, 0x06, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x10, 0x04, 0x20, 0x27, 0x35, 0x16, 0x20, 0x36, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x10, 0x36, 0x20, 0x01, 0x2e, 0x5a, 0x7b, 0x9b, 0x64, 0x98, 0x97, 0x22, 0x74, 0x8d, 0x99, 0x63, 0x9e, 0x8e, 0x02, 0xc0, 0xb9, 0xfe, 0xe5, 0x92, 0x62, 0x85, 0x63, 0xb6, 0xb5, 0xfe, 0xfd, 0xfe, 0x44, 0xeb, 0xc9, 0x01, 0x43, 0x98, 0x6e, 0x7c, 0x64, 0xb6, 0xa5, 0xfb, 0x01, 0x98, 0x05, 0x2d, 0x5b, 0xfe, 0xca, 0x9a, 0x29, 0x1a, 0x27, 0xb9, 0xfe, 0xff, 0x4e, 0x58, 0x01, 0x64, 0xbb, 0x27, 0x1b, 0x27, 0x9d, 0xe3, 0xb4, 0x70, 0x75, 0x89, 0xe9, 0x69, 0x24, 0x1b, 0x32, 0xeb, 0xfe, 0x58, 0xee, 0x66, 0x7c, 0x95, 0x92, 0xfd, 0x86, 0x20, 0x1a, 0x2f, 0xcf, 0x01, 0x8c, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfa, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x25, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x02, 0x33, 0xb4, 0xfd, 0x14, 0x05, 0x23, 0xfe, 0x23, 0xfe, 0x98, 0xfe, 0x22, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfa, 0x8f, 0x05, 0x71, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x9f, 0xff, 0xe3, 0x05, 0x5b, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x10, 0x07, 0x24, 0x19, 0x01, 0x21, 0x11, 0x10, 0x05, 0x26, 0x13, 0x11, 0x25, 0x21, 0x11, 0x14, 0x16, 0x20, 0x36, 0x35, 0x11, 0x21, 0x11, 0x10, 0x00, 0x20, 0x00, 0x11, 0x04, 0x4c, 0x4f, 0x01, 0x04, 0xfb, 0xf8, 0x01, 0x04, 0x50, 0x01, 0xfe, 0xf1, 0x01, 0x69, 0x73, 0x01, 0x04, 0x73, 0x01, 0x69, 0xfe, 0xce, 0xfd, 0xa8, 0xfe, 0xce, 0x05, 0x71, 0xfc, 0x99, 0xfe, 0xe6, 0x82, 0x62, 0x01, 0x61, 0x03, 0x40, 0xfc, 0xc0, 0xfe, 0x9e, 0x60, 0x7c, 0x01, 0x1f, 0x03, 0x67, 0x64, 0xfc, 0x35, 0xf0, 0xd3, 0xd3, 0xf0, 0x03, 0xcb, 0xfc, 0x5c, 0xfe, 0xdc, 0xfe, 0xd6, 0x01, 0x2a, 0x01, 0x24, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x25, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x01, 0x33, 0x01, 0x25, 0x21, 0x09, 0x01, 0x33, 0x01, 0x21, 0x8b, 0x01, 0xbc, 0xb4, 0xfe, 0x44, 0xfe, 0xcf, 0x01, 0x68, 0x01, 0xaa, 0x01, 0xab, 0x5a, 0xfe, 0x00, 0xfe, 0xea, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfb, 0x17, 0x04, 0xe9, 0xfa, 0x2b, 0x00, 0x00, 0x03, 0x00, 0x3d, 0x00, 0x00, 0x07, 0xd0, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x21, 0x01, 0x33, 0x01, 0x25, 0x21, 0x09, 0x01, 0x21, 0x09, 0x01, 0x33, 0x01, 0x21, 0x09, 0x01, 0x21, 0x04, 0x4a, 0x01, 0x24, 0xb4, 0xfe, 0xdc, 0xfb, 0xb0, 0x01, 0x23, 0xb4, 0xfe, 0xdd, 0xfe, 0xdb, 0x01, 0x68, 0x01, 0x1b, 0x01, 0x1a, 0x01, 0x68, 0x01, 0x1a, 0x01, 0x1a, 0x5a, 0xfe, 0xae, 0xfe, 0xa3, 0xfe, 0xe5, 0xfe, 0xe1, 0xfe, 0xa7, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfb, 0x12, 0x04, 0xee, 0xfb, 0x12, 0x04, 0xee, 0xfa, 0x2b, 0x05, 0x10, 0xfa, 0xf0, 0x00, 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x05, 0x6c, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x25, 0x21, 0x09, 0x01, 0x33, 0x09, 0x01, 0x21, 0x09, 0x01, 0x23, 0x01, 0x01, 0x0a, 0x03, 0x06, 0xb3, 0xfc, 0xfa, 0xfe, 0xa4, 0x01, 0x8c, 0x01, 0x51, 0x01, 0x5d, 0x58, 0xfe, 0x78, 0x02, 0x01, 0xfe, 0x74, 0xfe, 0xaf, 0xfe, 0xa3, 0x5a, 0x01, 0x8a, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfd, 0xce, 0x02, 0x32, 0xfd, 0x84, 0xfc, 0xa7, 0x02, 0x32, 0xfd, 0xce, 0x02, 0x7b, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x05, 0x1b, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x11, 0x21, 0x11, 0x01, 0x21, 0x09, 0x01, 0x23, 0x01, 0x11, 0x33, 0x03, 0x16, 0x01, 0xab, 0x5a, 0xfe, 0x25, 0xfe, 0x98, 0xfe, 0x24, 0x01, 0x6c, 0x01, 0x7f, 0xfe, 0x61, 0xb4, 0x01, 0x9e, 0xb5, 0x03, 0x13, 0x02, 0xc2, 0xfc, 0xf2, 0xfd, 0x39, 0x02, 0xc7, 0x03, 0x0e, 0xfc, 0xf2, 0x02, 0xaa, 0xfd, 0x56, 0xfd, 0x9d, 0x00, 0x04, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0x1e, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x00, 0x01, 0x34, 0x26, 0x27, 0x16, 0x15, 0x11, 0x33, 0x13, 0x11, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x20, 0x16, 0x01, 0x35, 0x23, 0x22, 0x07, 0x11, 0x3e, 0x01, 0x37, 0x36, 0x05, 0x11, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x03, 0xc4, 0x87, 0x37, 0x44, 0x7a, 0x5a, 0xfe, 0xd2, 0x39, 0xa9, 0x4e, 0x9b, 0xb6, 0xe3, 0xe2, 0xbc, 0x6a, 0x88, 0x56, 0xa4, 0x4c, 0x6c, 0xc8, 0x33, 0x01, 0x01, 0xfe, 0xfe, 0xd2, 0xbc, 0x30, 0x2b, 0x55, 0x58, 0x35, 0x35, 0xfe, 0x8f, 0x3c, 0x7a, 0x6d, 0x02, 0x7f, 0xd3, 0x86, 0x18, 0x5d, 0x88, 0xfd, 0x59, 0x02, 0x1b, 0xfd, 0x81, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x48, 0x7f, 0x8b, 0x2e, 0x2e, 0x74, 0x27, 0x27, 0xfc, 0xfe, 0x8b, 0x55, 0x04, 0xfd, 0xed, 0x04, 0x4e, 0x48, 0x47, 0xdc, 0x01, 0xfd, 0x12, 0x67, 0x8b, 0x77, 0x74, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x85, 0xff, 0xe3, 0x04, 0x92, 0x06, 0x14, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x00, 0x13, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x21, 0x01, 0x34, 0x27, 0x26, 0x27, 0x11, 0x36, 0x37, 0x36, 0x37, 0x36, 0x01, 0x11, 0x33, 0x11, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x85, 0x01, 0x2d, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xfe, 0xd3, 0x03, 0xaa, 0x55, 0x27, 0x36, 0x36, 0x27, 0x34, 0x14, 0x0d, 0xfc, 0xb0, 0x79, 0x01, 0xc6, 0x16, 0x18, 0x94, 0x44, 0x45, 0x14, 0x0c, 0x55, 0x54, 0x94, 0x18, 0x16, 0x06, 0x14, 0xfd, 0xa2, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x02, 0x74, 0x9f, 0x82, 0x3d, 0x20, 0xfc, 0x7a, 0x20, 0x3d, 0x4f, 0x73, 0x4b, 0x03, 0xda, 0xfa, 0xac, 0x05, 0x54, 0xfe, 0x64, 0x03, 0x69, 0x68, 0x74, 0x4a, 0x9e, 0x9f, 0x82, 0x82, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x25, 0x11, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x03, 0x83, 0x45, 0x95, 0x53, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x4d, 0x92, 0x44, 0x3e, 0x62, 0x40, 0x43, 0x4f, 0x41, 0x3d, 0x49, 0x49, 0x41, 0x4e, 0xfe, 0x48, 0x27, 0x21, 0x6e, 0x6e, 0x20, 0x8f, 0x64, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x23, 0x23, 0x64, 0x1f, 0x18, 0x0f, 0x14, 0xfc, 0x57, 0x13, 0x10, 0x13, 0x1b, 0x03, 0x53, 0x1a, 0x25, 0x80, 0xea, 0xe6, 0x83, 0x26, 0x00, 0x00, 0x00, 0x04, 0x00, 0x85, 0xff, 0xe3, 0x04, 0x92, 0x06, 0x14, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x06, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x03, 0x64, 0x01, 0x2d, 0xfe, 0xd3, 0x34, 0x9f, 0x70, 0xb6, 0xe6, 0xe6, 0xb6, 0x70, 0x9f, 0xfd, 0xb7, 0x0e, 0x14, 0x33, 0x28, 0x36, 0x36, 0x28, 0x55, 0x02, 0xd7, 0x79, 0xfd, 0xc1, 0x16, 0x18, 0x94, 0x54, 0x56, 0x0d, 0x14, 0x45, 0x44, 0x94, 0x18, 0x03, 0xb6, 0x02, 0x5e, 0xf9, 0xec, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x02, 0x10, 0x01, 0x44, 0x61, 0xfe, 0x5a, 0x9e, 0x4b, 0x73, 0x4f, 0x3d, 0x20, 0x03, 0x86, 0x20, 0x3d, 0x82, 0x02, 0x9d, 0xfa, 0xac, 0x05, 0x54, 0xfe, 0x64, 0xfc, 0x36, 0x03, 0x82, 0x82, 0x9f, 0x9e, 0x4a, 0x74, 0x68, 0x69, 0x00, 0x00, 0x03, 0x00, 0x63, 0xff, 0xe3, 0x04, 0x0b, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x13, 0x16, 0x33, 0x32, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x12, 0x15, 0x01, 0x06, 0x11, 0x12, 0x17, 0x13, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x04, 0x0a, 0xfd, 0xca, 0x01, 0x43, 0x56, 0xc3, 0xb0, 0x62, 0xb0, 0x60, 0xf1, 0xfe, 0xe6, 0x01, 0x0b, 0xe3, 0xce, 0xea, 0xfd, 0x6c, 0xb2, 0x01, 0xb1, 0x5f, 0x01, 0xce, 0x03, 0xb8, 0x98, 0x42, 0x3a, 0x02, 0x04, 0xfe, 0x62, 0x15, 0x5d, 0x75, 0x2d, 0x29, 0x01, 0x38, 0x01, 0x0a, 0x01, 0x13, 0x01, 0x43, 0xfe, 0xda, 0xf7, 0x01, 0x71, 0x7a, 0xfe, 0xdb, 0xfe, 0xf3, 0x8e, 0x01, 0xd3, 0xbe, 0xe7, 0x11, 0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x03, 0x80, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x11, 0x33, 0x11, 0x34, 0x37, 0x36, 0x25, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x01, 0xdc, 0x5d, 0x29, 0x33, 0x79, 0x14, 0x10, 0x01, 0xc0, 0x9d, 0x85, 0x34, 0x34, 0x01, 0x5d, 0xfe, 0xa3, 0xfe, 0xd3, 0x9f, 0x9f, 0x4e, 0x4f, 0xa9, 0x05, 0xae, 0x0a, 0x2d, 0x38, 0x91, 0xfb, 0xb6, 0x04, 0x4a, 0x5f, 0x44, 0x38, 0x8b, 0x64, 0x39, 0x37, 0x92, 0x64, 0x64, 0xfc, 0x1a, 0x03, 0xe6, 0x64, 0x64, 0xbc, 0x54, 0x56, 0x00, 0x00, 0x04, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x72, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x16, 0x36, 0x19, 0x01, 0x01, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x21, 0x11, 0x10, 0x00, 0x21, 0x22, 0x26, 0x03, 0x14, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x03, 0x9f, 0x5f, 0x04, 0xd4, 0xfc, 0xc7, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0x01, 0x2d, 0xfe, 0xf3, 0xfe, 0xec, 0x67, 0xb5, 0x6d, 0x54, 0x28, 0x36, 0x36, 0x28, 0x33, 0x14, 0x0d, 0x01, 0x10, 0x17, 0x17, 0x95, 0x43, 0x46, 0x14, 0x0c, 0x55, 0x54, 0x95, 0x17, 0x17, 0x03, 0xfa, 0xfc, 0x3d, 0xca, 0x8c, 0x05, 0x9d, 0x01, 0x12, 0x03, 0x6f, 0xfa, 0x97, 0x80, 0x2c, 0x2a, 0xbd, 0xbf, 0x71, 0x64, 0x61, 0x01, 0x44, 0x02, 0x10, 0x01, 0x44, 0x61, 0x64, 0xa8, 0xfc, 0x2d, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x03, 0x77, 0x9f, 0x82, 0x3d, 0x20, 0x03, 0x86, 0x20, 0x3d, 0x4f, 0x73, 0x4b, 0xfd, 0xc2, 0x03, 0x69, 0x68, 0x74, 0x4a, 0x9e, 0x9f, 0x82, 0x82, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc1, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x34, 0x27, 0x26, 0x01, 0x11, 0x33, 0x11, 0x27, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x03, 0x9a, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0xfd, 0x15, 0x7a, 0xd4, 0x01, 0x2e, 0x42, 0xb2, 0x74, 0xbf, 0xc5, 0xfe, 0xce, 0x61, 0x60, 0x73, 0x86, 0xfe, 0xd2, 0x04, 0x0d, 0x0b, 0x0c, 0x68, 0xbe, 0xfd, 0x94, 0x02, 0x40, 0xc1, 0x5b, 0x3a, 0x01, 0xb6, 0xfa, 0xb4, 0x05, 0x4c, 0x64, 0xfd, 0x9e, 0x65, 0x64, 0xef, 0xe8, 0xfd, 0x5c, 0x02, 0xd0, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x55, 0x00, 0x03, 0x00, 0xcf, 0x00, 0x00, 0x01, 0xfd, 0x06, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x33, 0x15, 0x23, 0x07, 0x21, 0x11, 0x21, 0x01, 0x29, 0x79, 0x90, 0xa7, 0xa7, 0x43, 0x01, 0x2d, 0xfe, 0xd3, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x02, 0x18, 0xe9, 0xcb, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xdb, 0xfe, 0x56, 0x01, 0xd8, 0x06, 0x14, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x00, 0x05, 0x11, 0x23, 0x11, 0x14, 0x07, 0x36, 0x37, 0x36, 0x07, 0x23, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, 0x07, 0x06, 0x03, 0x33, 0x15, 0x23, 0x01, 0x7e, 0x7a, 0x21, 0x40, 0x24, 0x37, 0xdc, 0xc7, 0x2c, 0x61, 0x21, 0x21, 0x01, 0x2e, 0x49, 0x4a, 0x57, 0xa5, 0xa5, 0x16, 0x04, 0x12, 0xfb, 0xd0, 0xb5, 0x54, 0x0f, 0x30, 0x48, 0xf4, 0x64, 0x30, 0x31, 0x99, 0x04, 0xac, 0xfb, 0x8c, 0xd6, 0x60, 0x60, 0x07, 0xbe, 0xe9, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xad, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x21, 0x13, 0x11, 0x33, 0x11, 0xa7, 0x01, 0x2e, 0x02, 0x43, 0x7e, 0xfd, 0x8e, 0x02, 0x89, 0x87, 0xfd, 0xaf, 0xfe, 0xd2, 0x5a, 0x7a, 0x06, 0x14, 0xfc, 0x69, 0x01, 0xe3, 0xfd, 0xf6, 0xfd, 0xaa, 0x02, 0x23, 0xfd, 0xdd, 0x05, 0xb0, 0xfa, 0xb4, 0x05, 0x4c, 0x00, 0x02, 0x00, 0xcf, 0x00, 0x00, 0x02, 0xa0, 0x06, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x17, 0x26, 0x35, 0x11, 0x23, 0x13, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x15, 0x01, 0x29, 0x37, 0x24, 0x40, 0x22, 0x79, 0xdd, 0xa4, 0x4a, 0x49, 0x01, 0x2d, 0x45, 0x5e, 0x01, 0x94, 0xa0, 0x48, 0x30, 0x0f, 0x54, 0xb5, 0x04, 0x30, 0xfa, 0x5a, 0x60, 0x60, 0xd6, 0x04, 0x7e, 0xfb, 0x4a, 0x9c, 0x5e, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa7, 0x00, 0x00, 0x07, 0xad, 0x04, 0x7b, 0x00, 0x22, 0x00, 0x26, 0x00, 0x31, 0x00, 0x3c, 0x00, 0x00, 0x13, 0x21, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x13, 0x11, 0x33, 0x11, 0x25, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x34, 0x27, 0x26, 0x25, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x34, 0x27, 0x26, 0xa7, 0x01, 0x2e, 0x42, 0xb2, 0x74, 0xbf, 0x8d, 0x18, 0x4c, 0xc8, 0x74, 0xbf, 0xc5, 0xfe, 0xce, 0x61, 0x60, 0x73, 0x86, 0xfe, 0xce, 0x61, 0x60, 0x73, 0x86, 0xfe, 0xd2, 0x5a, 0x7a, 0x02, 0x1f, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0x02, 0x9a, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0x04, 0x60, 0xae, 0x65, 0x64, 0xac, 0x4a, 0x80, 0x76, 0xef, 0xe8, 0xfd, 0x5c, 0x02, 0xd0, 0x9f, 0x9e, 0xbe, 0xab, 0xfd, 0x5c, 0x02, 0xd0, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x55, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x11, 0x0b, 0x0c, 0x68, 0xbe, 0xfd, 0x94, 0x02, 0x40, 0xc1, 0x5b, 0x3a, 0x13, 0x0b, 0x0c, 0x68, 0xbe, 0xfd, 0x94, 0x02, 0x40, 0xc1, 0x5b, 0x3a, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc1, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x34, 0x27, 0x26, 0x25, 0x11, 0x33, 0x11, 0x27, 0x21, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x03, 0x9a, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0xfd, 0x15, 0x7a, 0xd4, 0x01, 0x2e, 0x42, 0xb2, 0x74, 0xbf, 0xc5, 0xfe, 0xce, 0x61, 0x60, 0x73, 0x86, 0xfe, 0xd2, 0x04, 0x0d, 0x0b, 0x0c, 0x68, 0xbe, 0xfd, 0x94, 0x02, 0x40, 0xc1, 0x5b, 0x3a, 0x02, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xae, 0x65, 0x64, 0xef, 0xe8, 0xfd, 0x5c, 0x02, 0xd0, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x55, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x23, 0x00, 0x00, 0x01, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x13, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x03, 0x11, 0x06, 0x07, 0x06, 0x10, 0x17, 0x16, 0x01, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x02, 0x34, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xf5, 0xf5, 0x75, 0x2e, 0x6c, 0x2e, 0x2e, 0x6c, 0x2e, 0x5a, 0x2e, 0x24, 0x64, 0x64, 0x24, 0x01, 0xaa, 0x2e, 0x24, 0x65, 0x65, 0x24, 0x04, 0x7b, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0xfb, 0xd7, 0x0b, 0x0b, 0x03, 0xba, 0x0b, 0x0b, 0xfc, 0x6b, 0x03, 0x70, 0x1d, 0x2d, 0x80, 0xfe, 0x24, 0x80, 0x2d, 0x03, 0x52, 0xfc, 0x92, 0x1c, 0x2d, 0x81, 0x01, 0xdb, 0x80, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x72, 0x04, 0x7b, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x21, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x01, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x11, 0x36, 0x37, 0x36, 0x01, 0x11, 0x23, 0x11, 0x01, 0x11, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x01, 0x92, 0xfe, 0xd4, 0x01, 0x2c, 0x34, 0xa0, 0x6f, 0xb7, 0xe6, 0xe6, 0xb7, 0x6f, 0xa0, 0x02, 0x4a, 0x0e, 0x14, 0x33, 0x28, 0x36, 0x36, 0x28, 0x55, 0xfd, 0x28, 0x78, 0x02, 0x3f, 0x17, 0x17, 0x95, 0x53, 0x56, 0x0d, 0x14, 0x45, 0x43, 0x95, 0x17, 0xa8, 0xfd, 0xae, 0x06, 0x08, 0xa8, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x01, 0xa6, 0x9e, 0x4b, 0x73, 0x4f, 0x3d, 0x20, 0xfc, 0x7a, 0x20, 0x3d, 0x82, 0xfd, 0x6f, 0x05, 0x48, 0xfa, 0xb8, 0x01, 0x90, 0x03, 0xca, 0x03, 0x82, 0x82, 0x9f, 0x9e, 0x4a, 0x74, 0x68, 0x69, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x72, 0x04, 0x7b, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x21, 0x11, 0x21, 0x01, 0x14, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x33, 0x11, 0x23, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x03, 0x45, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0x01, 0x2d, 0xfe, 0xd3, 0xfd, 0x83, 0x54, 0x28, 0x36, 0x36, 0x28, 0x33, 0x14, 0x0d, 0x02, 0xd7, 0x79, 0x79, 0xfe, 0x39, 0x17, 0x17, 0x95, 0x43, 0x46, 0x14, 0x0c, 0x55, 0x54, 0x95, 0x17, 0x17, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x02, 0x10, 0x01, 0x44, 0x61, 0x64, 0xa8, 0xf9, 0xf8, 0x03, 0x94, 0x9f, 0x82, 0x3d, 0x20, 0x03, 0x86, 0x20, 0x3d, 0x4f, 0x73, 0x4b, 0xfc, 0x32, 0x05, 0x48, 0xfc, 0x48, 0x03, 0x69, 0x68, 0x74, 0x4a, 0x9e, 0x9f, 0x82, 0x82, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x7c, 0x04, 0x7b, 0x00, 0x03, 0x00, 0x15, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x27, 0x21, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x01, 0x01, 0x79, 0xd3, 0x01, 0x2d, 0x34, 0xa8, 0x77, 0x19, 0x0d, 0x2f, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0xfe, 0xd3, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xae, 0x66, 0x63, 0x03, 0x07, 0x85, 0x12, 0x11, 0xcb, 0xbe, 0xfd, 0x7a, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x00, 0x1d, 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x03, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x01, 0x45, 0x23, 0x19, 0x44, 0x22, 0x23, 0x66, 0x2f, 0x94, 0x37, 0x3c, 0x22, 0x22, 0x1a, 0x4c, 0x26, 0x2a, 0x77, 0x2d, 0x82, 0x33, 0x40, 0xbe, 0x4b, 0x90, 0x47, 0x5f, 0x66, 0x45, 0x82, 0x2f, 0x81, 0x6a, 0xca, 0xb9, 0x5c, 0xa2, 0x44, 0x42, 0x53, 0x56, 0x63, 0x65, 0x48, 0x6c, 0x2e, 0x91, 0x76, 0xde, 0xc2, 0x51, 0xb0, 0x61, 0x03, 0xf9, 0x0f, 0x17, 0x3d, 0x76, 0x66, 0x30, 0x33, 0x22, 0x10, 0x33, 0x3b, 0x40, 0x7b, 0x52, 0x3f, 0x10, 0x17, 0x42, 0x73, 0x6c, 0x33, 0x37, 0x27, 0x0f, 0x2a, 0x37, 0x43, 0x6f, 0x54, 0xfc, 0xfe, 0x37, 0x38, 0x5e, 0x55, 0x4e, 0x4f, 0x2c, 0x10, 0x2c, 0x97, 0x88, 0xa6, 0xb5, 0x20, 0x1f, 0x7a, 0x31, 0x24, 0x59, 0x58, 0x44, 0x4c, 0x23, 0x0f, 0x2f, 0x9e, 0x90, 0xa4, 0xc0, 0x25, 0x25, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x03, 0x2e, 0x05, 0x9e, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x26, 0x37, 0x11, 0x23, 0x11, 0x06, 0x16, 0x13, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x21, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0xa2, 0x26, 0x02, 0x79, 0x01, 0x53, 0x81, 0x01, 0x56, 0xfe, 0xaa, 0x44, 0x68, 0xaa, 0xfe, 0xce, 0xbf, 0x92, 0x79, 0x79, 0x6a, 0x55, 0x7c, 0x03, 0xff, 0xfc, 0x37, 0xad, 0x4e, 0x05, 0x28, 0xfe, 0xac, 0x64, 0xfd, 0x55, 0x89, 0x4e, 0x64, 0x9f, 0xd2, 0x02, 0x75, 0x64, 0x01, 0x54, 0x00, 0x00, 0x03, 0x00, 0x9f, 0xff, 0xe5, 0x04, 0xbe, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x00, 0x25, 0x26, 0x27, 0x26, 0x35, 0x11, 0x23, 0x11, 0x14, 0x17, 0x16, 0x05, 0x11, 0x23, 0x11, 0x17, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x01, 0xc6, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0x02, 0xef, 0x79, 0xd3, 0xfe, 0xce, 0x41, 0xb3, 0x74, 0xbf, 0xc5, 0x01, 0x32, 0x61, 0x60, 0x73, 0x86, 0x01, 0x32, 0x53, 0x0b, 0x0c, 0x68, 0xbe, 0x02, 0x6c, 0xfd, 0xc0, 0xc1, 0x5b, 0x3a, 0x02, 0x03, 0x98, 0xfc, 0x68, 0x64, 0xae, 0x65, 0x64, 0xef, 0xe8, 0x02, 0xa4, 0xfd, 0x30, 0x9f, 0x9e, 0xbe, 0xa4, 0x02, 0xab, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x39, 0x04, 0x60, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x01, 0x33, 0x01, 0x27, 0x21, 0x09, 0x01, 0x33, 0x01, 0x21, 0xb8, 0x01, 0x37, 0x76, 0xfe, 0xc6, 0xf4, 0x01, 0x32, 0x01, 0x3b, 0x01, 0x3b, 0x5a, 0xfe, 0x86, 0xfe, 0xf2, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x00, 0x00, 0x06, 0x41, 0x04, 0x60, 0x00, 0x03, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x01, 0x13, 0x33, 0x03, 0x21, 0x13, 0x33, 0x03, 0x27, 0x21, 0x1b, 0x01, 0x21, 0x1b, 0x01, 0x33, 0x01, 0x21, 0x0b, 0x01, 0x21, 0x03, 0x8c, 0xd8, 0x7a, 0xda, 0xfc, 0xbe, 0xd8, 0x7a, 0xda, 0xed, 0x01, 0x32, 0xcf, 0xce, 0x01, 0x2d, 0xcf, 0xce, 0x5a, 0xfe, 0xf8, 0xfe, 0xea, 0xd9, 0xda, 0xfe, 0xe6, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xfc, 0x96, 0x03, 0x6a, 0xfc, 0x96, 0x03, 0x6a, 0xfb, 0xa0, 0x03, 0x96, 0xfc, 0x6a, 0x00, 0x02, 0x00, 0x44, 0x00, 0x00, 0x04, 0x9a, 0x04, 0x60, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x01, 0x33, 0x01, 0x25, 0x21, 0x09, 0x01, 0x33, 0x09, 0x01, 0x21, 0x09, 0x01, 0x23, 0x01, 0xf8, 0x02, 0x66, 0x88, 0xfd, 0x99, 0xfe, 0xc5, 0x01, 0x68, 0x01, 0x01, 0x01, 0x00, 0x70, 0xfe, 0xc8, 0x01, 0xb4, 0xfe, 0x98, 0xff, 0x00, 0xfe, 0xff, 0x6f, 0x01, 0x38, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xfe, 0x81, 0x01, 0x7f, 0xfe, 0x2d, 0xfd, 0x73, 0x01, 0x7f, 0xfe, 0x81, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x4a, 0x04, 0x60, 0x00, 0x03, 0x00, 0x12, 0x00, 0x00, 0x13, 0x01, 0x37, 0x01, 0x27, 0x21, 0x09, 0x01, 0x33, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x37, 0xbd, 0x01, 0x87, 0x37, 0xfe, 0xba, 0xfe, 0x01, 0x3b, 0x01, 0x3a, 0x01, 0x3c, 0x61, 0xfe, 0x45, 0x48, 0x83, 0x70, 0x84, 0x84, 0x4f, 0x49, 0x27, 0x03, 0xfc, 0xfb, 0xdb, 0x99, 0x03, 0x8c, 0x64, 0xfc, 0x97, 0x03, 0x69, 0xfb, 0x38, 0xc7, 0x7b, 0x64, 0x43, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x00, 0x03, 0xf2, 0x04, 0x60, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x25, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x03, 0x06, 0xfd, 0xb7, 0x7e, 0x02, 0x49, 0xfc, 0xe2, 0x03, 0x8c, 0xfd, 0xb8, 0x02, 0x48, 0xfc, 0x5d, 0x02, 0x48, 0xfd, 0xcf, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x64, 0x64, 0xfc, 0x68, 0x64, 0x64, 0x03, 0x98, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x2a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0x00, 0x00, 0x02, 0xab, 0x05, 0xd5, 0x10, 0x06, 0x11, 0x48, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0xfe, 0x66, 0x01, 0x6b, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0xf8, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x10, 0x06, 0x00, 0x45, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x10, 0x06, 0x00, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0x01, 0x06, 0x14, 0x10, 0x06, 0x11, 0x3e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x54, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x02, 0xf6, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x05, 0x9e, 0x10, 0x06, 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7a, 0xff, 0xe3, 0x04, 0x1c, 0x05, 0xf0, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x19, 0x00, 0x00, 0x00, 0x20, 0x12, 0x10, 0x02, 0x20, 0x02, 0x10, 0x01, 0x36, 0x11, 0x10, 0x2f, 0x01, 0x26, 0x22, 0x07, 0x11, 0x16, 0x32, 0x37, 0x01, 0x06, 0x11, 0x10, 0x17, 0x01, 0x68, 0x01, 0xc4, 0xef, 0xef, 0xfe, 0x3c, 0xee, 0x02, 0x90, 0xb7, 0xb7, 0x5a, 0x2e, 0x6f, 0x2f, 0x2f, 0x6f, 0x2e, 0xfe, 0xda, 0xb6, 0xb6, 0x05, 0xf0, 0xfe, 0x73, 0xfd, 0x0d, 0xfe, 0x73, 0x01, 0x8d, 0x02, 0xf3, 0xfc, 0x23, 0x8f, 0x01, 0xd4, 0x01, 0xd5, 0x8f, 0x30, 0x0f, 0x0f, 0xfa, 0xd9, 0x0f, 0x0f, 0x04, 0xf7, 0x90, 0xfe, 0x2c, 0xfe, 0x2d, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x00, 0x00, 0x04, 0x35, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x37, 0x11, 0x21, 0x15, 0x21, 0x35, 0x21, 0x11, 0x05, 0x35, 0x25, 0x01, 0xfd, 0xb6, 0x58, 0x01, 0x29, 0xfc, 0x46, 0x01, 0x29, 0xfe, 0xbd, 0x01, 0x43, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfa, 0x8f, 0x64, 0x64, 0x05, 0x0d, 0x48, 0x64, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0x00, 0x00, 0x04, 0x25, 0x05, 0xf0, 0x00, 0x10, 0x00, 0x28, 0x00, 0x00, 0x37, 0x33, 0x01, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x27, 0x17, 0x16, 0x15, 0x14, 0x0e, 0x01, 0x0b, 0x01, 0x36, 0x33, 0x32, 0x04, 0x15, 0x14, 0x0e, 0x01, 0x07, 0x03, 0x21, 0x15, 0x21, 0x37, 0x36, 0x00, 0x37, 0x36, 0x10, 0x26, 0x23, 0x22, 0x07, 0xe2, 0xe6, 0x01, 0x0c, 0x56, 0x1f, 0x44, 0x61, 0x3d, 0x59, 0x03, 0x51, 0x3e, 0x75, 0xbc, 0xfd, 0xe9, 0xa3, 0xdb, 0x01, 0x02, 0x2b, 0x49, 0x54, 0xec, 0x01, 0xf1, 0xfc, 0x51, 0x01, 0x02, 0x01, 0x74, 0x37, 0x6d, 0x79, 0x63, 0x88, 0xae, 0x64, 0x01, 0xcd, 0x95, 0x40, 0x8f, 0x01, 0x39, 0x5c, 0x39, 0x18, 0x04, 0x70, 0xa8, 0x64, 0xba, 0xcf, 0xfe, 0xdd, 0x04, 0x39, 0x68, 0xf4, 0xcc, 0x62, 0xac, 0x96, 0x91, 0xfe, 0x69, 0x64, 0x64, 0x05, 0x02, 0x41, 0x62, 0xbf, 0x01, 0x19, 0xa8, 0x95, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8c, 0xff, 0xe3, 0x04, 0x02, 0x05, 0xf0, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x00, 0x05, 0x22, 0x27, 0x35, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x35, 0x36, 0x35, 0x34, 0x26, 0x27, 0x19, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x01, 0xf4, 0xa9, 0xbf, 0x1e, 0xb0, 0x9a, 0x5a, 0x48, 0x31, 0x39, 0xb7, 0xbe, 0x35, 0x2e, 0x35, 0x44, 0x8d, 0xc3, 0x18, 0xcf, 0x9d, 0xcf, 0xf2, 0x7f, 0x73, 0x7f, 0x92, 0xfe, 0xef, 0xb7, 0x69, 0x4e, 0x3e, 0x5a, 0x1d, 0x4a, 0x6a, 0x0c, 0x44, 0x10, 0x02, 0x95, 0x0a, 0x64, 0x08, 0x02, 0x20, 0x0a, 0x3c, 0x08, 0x68, 0x40, 0xd1, 0xb2, 0x7c, 0xaa, 0x21, 0x1f, 0xc5, 0x90, 0xdd, 0xf2, 0x92, 0x55, 0xe8, 0x6c, 0x8d, 0x24, 0x02, 0x96, 0xfe, 0x1a, 0x1d, 0x79, 0x58, 0xac, 0x00, 0x03, 0x00, 0x51, 0x00, 0x00, 0x04, 0x40, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x06, 0x00, 0x11, 0x00, 0x00, 0x01, 0x23, 0x13, 0x33, 0x09, 0x01, 0x21, 0x03, 0x21, 0x11, 0x33, 0x15, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x03, 0x4a, 0xb7, 0x03, 0xb4, 0xfe, 0xf2, 0xfe, 0x7c, 0x01, 0x84, 0x03, 0x01, 0x6b, 0x9b, 0x9b, 0xfe, 0x98, 0xfe, 0x15, 0x05, 0x71, 0xfa, 0xf3, 0x04, 0xc1, 0xfc, 0xe3, 0x03, 0xcd, 0xfc, 0x33, 0x64, 0xfe, 0x5c, 0x01, 0xa4, 0x7f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x85, 0xff, 0xe3, 0x04, 0x18, 0x05, 0xd5, 0x00, 0x04, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x36, 0x01, 0x36, 0x10, 0x27, 0x03, 0x11, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x15, 0x21, 0x11, 0x1e, 0x01, 0x10, 0x04, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x01, 0xcc, 0xb4, 0x5d, 0x01, 0x8a, 0xb7, 0xb7, 0x5a, 0x2c, 0x60, 0xa2, 0xb9, 0x02, 0xf7, 0xfe, 0x71, 0xf6, 0xfc, 0xfe, 0xf2, 0xfe, 0xdd, 0xa7, 0xbb, 0xaa, 0xc6, 0x74, 0x03, 0x91, 0x01, 0xe0, 0xfd, 0xfd, 0x1b, 0xfc, 0xe6, 0x5c, 0x01, 0xdc, 0x60, 0xfd, 0x49, 0x02, 0xd7, 0x0a, 0x4b, 0x02, 0xef, 0x64, 0xfe, 0x23, 0x09, 0xf5, 0xfe, 0x46, 0xf9, 0x3c, 0x88, 0x64, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x33, 0x05, 0xf0, 0x00, 0x04, 0x00, 0x09, 0x00, 0x11, 0x00, 0x25, 0x00, 0x00, 0x25, 0x36, 0x11, 0x10, 0x27, 0x01, 0x06, 0x11, 0x10, 0x1f, 0x01, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x13, 0x32, 0x17, 0x15, 0x27, 0x26, 0x20, 0x07, 0x11, 0x36, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x20, 0x02, 0x10, 0x00, 0x03, 0x23, 0xb6, 0xb6, 0xfe, 0x55, 0xb8, 0xb8, 0x5a, 0x34, 0x9a, 0x29, 0x24, 0x9a, 0x39, 0xdc, 0x96, 0x97, 0x1e, 0x8a, 0xfe, 0xf4, 0x55, 0x3c, 0x5d, 0xdd, 0xeb, 0xf5, 0xde, 0xfe, 0xfc, 0xf6, 0x01, 0x2e, 0x70, 0x63, 0x01, 0x0c, 0x01, 0x18, 0x5c, 0x01, 0xca, 0xb3, 0xfe, 0x91, 0xfe, 0x23, 0x95, 0x32, 0x10, 0x08, 0x03, 0x22, 0x06, 0x13, 0x02, 0x8c, 0x3c, 0x6a, 0x0c, 0x36, 0x2d, 0xfe, 0x66, 0x16, 0xfe, 0xef, 0xfe, 0x2f, 0xfe, 0xea, 0x01, 0x8d, 0x02, 0xdb, 0x01, 0xa5, 0x00, 0x02, 0x00, 0x3a, 0x00, 0x00, 0x04, 0x5b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x25, 0x21, 0x15, 0x01, 0x21, 0x01, 0x21, 0x03, 0x39, 0xfe, 0x3f, 0xc1, 0x01, 0xc1, 0xfc, 0x40, 0x04, 0x20, 0xfe, 0x1d, 0xfe, 0x7e, 0x01, 0xe4, 0xfd, 0x61, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfa, 0x8f, 0x05, 0x71, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7d, 0xff, 0xe3, 0x04, 0x17, 0x05, 0xf0, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x29, 0x00, 0x31, 0x00, 0x39, 0x00, 0x41, 0x00, 0x00, 0x25, 0x36, 0x27, 0x26, 0x27, 0x00, 0x10, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x13, 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x20, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, 0x34, 0x36, 0x13, 0x11, 0x06, 0x07, 0x06, 0x05, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x19, 0x01, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x17, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x03, 0x02, 0xbc, 0x06, 0x06, 0xb0, 0xfd, 0xf5, 0x55, 0x1e, 0x27, 0x27, 0x1d, 0x44, 0x73, 0x81, 0xe5, 0x01, 0x91, 0xe4, 0x81, 0x74, 0x83, 0x92, 0xef, 0xfe, 0x44, 0xef, 0x93, 0x81, 0xaf, 0x06, 0x07, 0x01, 0x16, 0x2d, 0x64, 0x2c, 0x2c, 0x64, 0x2d, 0x2c, 0x66, 0x2b, 0x2b, 0x66, 0xeb, 0x28, 0x1d, 0x56, 0x55, 0x1e, 0x64, 0x4a, 0xea, 0xe4, 0x4e, 0x02, 0x27, 0xfe, 0xf8, 0x4d, 0x1b, 0x12, 0x01, 0xfc, 0x12, 0x1b, 0xfd, 0xdc, 0x02, 0x20, 0xb1, 0x80, 0xb3, 0xd0, 0xd0, 0xb3, 0x80, 0xb1, 0x20, 0x01, 0x23, 0xc5, 0x8f, 0xd9, 0xe8, 0xe8, 0xd9, 0x8f, 0xc5, 0xfd, 0x6c, 0x02, 0x66, 0x4e, 0xe4, 0xea, 0x61, 0x06, 0x06, 0x02, 0x96, 0x07, 0x07, 0x02, 0xa2, 0xfd, 0xd0, 0x07, 0x07, 0x02, 0x30, 0x07, 0x21, 0xfe, 0x04, 0x12, 0x1b, 0x4d, 0x01, 0x08, 0x4d, 0x1b, 0x00, 0x04, 0x00, 0x5f, 0xff, 0xe3, 0x04, 0x2d, 0x05, 0xf0, 0x00, 0x04, 0x00, 0x09, 0x00, 0x11, 0x00, 0x25, 0x00, 0x00, 0x01, 0x06, 0x11, 0x10, 0x17, 0x01, 0x36, 0x11, 0x10, 0x2f, 0x01, 0x26, 0x22, 0x07, 0x11, 0x16, 0x32, 0x37, 0x03, 0x22, 0x27, 0x35, 0x17, 0x16, 0x20, 0x37, 0x11, 0x06, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x20, 0x12, 0x10, 0x00, 0x01, 0x6f, 0xb6, 0xb6, 0x01, 0xab, 0xb8, 0xb8, 0x5a, 0x34, 0x9a, 0x29, 0x24, 0x9a, 0x39, 0xdc, 0x96, 0x97, 0x1e, 0x8a, 0x01, 0x0c, 0x55, 0x3c, 0x5d, 0xdd, 0xeb, 0xf5, 0xde, 0x01, 0x04, 0xf6, 0xfe, 0xd2, 0x05, 0x63, 0x63, 0xfe, 0xf4, 0xfe, 0xe8, 0x5c, 0xfe, 0x36, 0xb3, 0x01, 0x6f, 0x01, 0xdd, 0x95, 0x32, 0x10, 0x08, 0xfc, 0xde, 0x06, 0x13, 0xfd, 0x74, 0x3c, 0x6a, 0x0c, 0x36, 0x2d, 0x01, 0x9a, 0x16, 0x01, 0x11, 0x01, 0xd1, 0x01, 0x16, 0xfe, 0x73, 0xfd, 0x25, 0xfe, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x1b, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0xca, 0x00, 0x00, 0x03, 0xeb, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x14, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0x00, 0x00, 0x03, 0xdd, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x15, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8c, 0xff, 0xe3, 0x04, 0x02, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0x00, 0x00, 0x04, 0x2e, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x17, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, 0xff, 0xe3, 0x03, 0xf4, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0xff, 0xe3, 0x04, 0x21, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x19, 0x00, 0x00, 0xff, 0xff, 0x00, 0x97, 0x00, 0x00, 0x03, 0xf8, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x1a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7d, 0xff, 0xe3, 0x04, 0x17, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x74, 0xff, 0xe3, 0x04, 0x14, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x01, 0x11, 0x21, 0x11, 0x04, 0xa9, 0x7f, 0x7f, 0xfc, 0x0b, 0x08, 0x6a, 0x01, 0x5f, 0x02, 0xc3, 0xfc, 0x24, 0x04, 0xf5, 0xfb, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x37, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0xb4, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x46, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0xfe, 0x31, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x84, 0x0f, 0x0e, 0x19, 0x14, 0x43, 0x15, 0x16, 0x11, 0x0f, 0x0f, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x18, 0x0f, 0x0f, 0x03, 0xf4, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x05, 0x4f, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfe, 0xa1, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x05, 0x4f, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfe, 0xa1, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x79, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0x07, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x84, 0x00, 0x88, 0x00, 0x8c, 0x00, 0x90, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0x07, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x56, 0x00, 0x6b, 0x00, 0x7f, 0x00, 0x95, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x04, 0x5d, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xb4, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0x95, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfc, 0xf4, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x74, 0x00, 0x89, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0x95, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfc, 0xf4, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x60, 0x00, 0x64, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x04, 0x59, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x8f, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x05, 0xb3, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xed, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x05, 0xb3, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xed, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0x6b, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x7a, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x99, 0x00, 0xb0, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0x6b, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x7a, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x56, 0x00, 0x6c, 0x00, 0x82, 0x00, 0x97, 0x00, 0xab, 0x00, 0xc1, 0x00, 0xc5, 0x00, 0xc9, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x21, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x04, 0xc1, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x94, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xfd, 0x43, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x36, 0x00, 0x4b, 0x00, 0x60, 0x00, 0x75, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0xbc, 0x00, 0xd2, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xe3, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x37, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x37, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0xb4, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x46, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xd1, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0xbc, 0x00, 0xd2, 0x00, 0xe8, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xe3, 0x00, 0xf9, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x50, 0x00, 0x66, 0x00, 0x7c, 0x00, 0x92, 0x00, 0x00, 0x37, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0xb4, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x46, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x39, 0x00, 0x51, 0x00, 0x67, 0x00, 0x7d, 0x00, 0x93, 0x00, 0xa9, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4f, 0x00, 0x67, 0x00, 0x7d, 0x00, 0x93, 0x00, 0xa9, 0x00, 0xbf, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x64, 0x00, 0x7c, 0x00, 0x92, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xd4, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x7a, 0x00, 0x92, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xd4, 0x00, 0xea, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x0e, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x91, 0x00, 0xa9, 0x00, 0xbf, 0x00, 0xd5, 0x00, 0xeb, 0x01, 0x01, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x0f, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcc, 0x00, 0xe1, 0x00, 0xf6, 0x01, 0x0b, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xea, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbd, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xeb, 0x42, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd2, 0x42, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x49, 0x17, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x01, 0x21, 0x11, 0x21, 0x01, 0xb1, 0x02, 0x7c, 0xfc, 0x87, 0x04, 0x76, 0xfb, 0x8a, 0x03, 0x07, 0x8d, 0x8d, 0x04, 0x66, 0xf6, 0xa7, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0xb4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x07, 0x6d, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x02, 0x02, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x69, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x48, 0x18, 0x1a, 0x11, 0x10, 0xfb, 0x9c, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfe, 0xc4, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfa, 0x19, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfe, 0xc4, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfa, 0x19, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x79, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x01, 0x10, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfc, 0xa3, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x84, 0x00, 0x88, 0x00, 0x8c, 0x00, 0x90, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x01, 0x10, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfc, 0xa3, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x56, 0x00, 0x6b, 0x00, 0x7f, 0x00, 0x95, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xa2, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfb, 0x26, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfd, 0x42, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x93, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfd, 0x42, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x93, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x60, 0x00, 0x64, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x81, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfb, 0x2b, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x22, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xf9, 0xaa, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x22, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xf9, 0xaa, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x6e, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x34, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x99, 0x00, 0xb0, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x6e, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x34, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x56, 0x00, 0x6c, 0x00, 0x82, 0x00, 0x97, 0x00, 0xab, 0x00, 0xc1, 0x00, 0xc5, 0x00, 0xc9, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfa, 0xb7, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x06, 0x74, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x03, 0x0b, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x36, 0x00, 0x4b, 0x00, 0x60, 0x00, 0x75, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x42, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x8a, 0x00, 0x9f, 0x00, 0xb4, 0x00, 0xc9, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x42, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xe3, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x37, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0xb4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x07, 0x6d, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x76, 0x00, 0x8b, 0x00, 0xa0, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x42, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xd1, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0xbc, 0x00, 0xd2, 0x00, 0xe8, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x0e, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xe3, 0x00, 0xf9, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x50, 0x00, 0x66, 0x00, 0x7c, 0x00, 0x92, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0xb4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x07, 0x6d, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x39, 0x00, 0x51, 0x00, 0x67, 0x00, 0x7d, 0x00, 0x93, 0x00, 0xa9, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4f, 0x00, 0x67, 0x00, 0x7d, 0x00, 0x93, 0x00, 0xa9, 0x00, 0xbf, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x64, 0x00, 0x7c, 0x00, 0x92, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xd4, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x7a, 0x00, 0x92, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xd4, 0x00, 0xea, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x0e, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb6, 0x00, 0xcb, 0x00, 0xe0, 0x00, 0xf5, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x42, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x34, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6c, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcc, 0x00, 0xe1, 0x00, 0xf6, 0x01, 0x0b, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x41, 0x15, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x34, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x83, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x34, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6c, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x11, 0x21, 0x11, 0x01, 0x8c, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x0e, 0x03, 0xda, 0x06, 0xf5, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf7, 0xd3, 0x07, 0x01, 0xf8, 0xff, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x33, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x03, 0x33, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x10, 0x78, 0xf1, 0xbd, 0x8a, 0x01, 0x04, 0x77, 0x3d, 0xfe, 0xd7, 0x3d, 0x77, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xac, 0xfe, 0x55, 0x02, 0x0f, 0xfc, 0xbc, 0xda, 0xda, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x49, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x75, 0x01, 0x7d, 0xfd, 0xe6, 0x1f, 0x38, 0x01, 0x36, 0x5e, 0x4c, 0x2f, 0x6e, 0x41, 0x46, 0x77, 0x34, 0x82, 0x9d, 0xfe, 0xd6, 0x33, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfc, 0x3f, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x59, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x57, 0x53, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x64, 0x61, 0x4d, 0x54, 0x55, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x31, 0x82, 0x98, 0x51, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x91, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x33, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x4d, 0xfe, 0xe9, 0x01, 0x17, 0x14, 0x95, 0x7a, 0x7a, 0x81, 0xfe, 0x8b, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0x97, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x51, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xfc, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x1a, 0x19, 0x91, 0x54, 0x55, 0x57, 0x57, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5d, 0x31, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x0d, 0x4f, 0x2e, 0x2e, 0x2e, 0x2e, 0x4f, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x73, 0x3e, 0x3d, 0x09, 0x22, 0x34, 0x34, 0x3d, 0x83, 0x4b, 0x4c, 0x4f, 0x4f, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x9e, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x37, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3d, 0x00, 0x5b, 0x00, 0x6a, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x55, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x32, 0x30, 0x4c, 0x4e, 0x8e, 0x8f, 0x4d, 0x4d, 0x30, 0x30, 0x29, 0x2a, 0x29, 0x4d, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x96, 0x2b, 0x2a, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x5b, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x50, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x10, 0x2c, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3d, 0x09, 0x20, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x50, 0x82, 0x96, 0x4f, 0x4f, 0x60, 0x62, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4c, 0x30, 0x2f, 0x2f, 0x2e, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xdf, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3e, 0x00, 0x4a, 0x00, 0x51, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x86, 0x80, 0x2d, 0x2e, 0x2e, 0x2d, 0x80, 0x2d, 0x2e, 0x2e, 0x6d, 0x76, 0x99, 0x99, 0x76, 0x92, 0x7e, 0x7e, 0xfe, 0x9c, 0x78, 0x7e, 0x7b, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xc8, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x05, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x87, 0x72, 0x3b, 0x39, 0x81, 0x2c, 0x24, 0x4c, 0x3f, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfd, 0xdc, 0x95, 0x46, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xe9, 0x2c, 0x5b, 0x33, 0xa3, 0xb4, 0xb5, 0xa2, 0x33, 0x5c, 0x2b, 0x2a, 0x5f, 0x31, 0x70, 0x6f, 0x6e, 0x71, 0x31, 0x60, 0x29, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xeb, 0x17, 0x16, 0xe3, 0xce, 0xcd, 0xe5, 0x17, 0x17, 0x74, 0x22, 0x24, 0xaa, 0xac, 0xab, 0xab, 0x24, 0x22, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x34, 0x00, 0x40, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x22, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x12, 0x10, 0x26, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x05, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x02, 0xaf, 0x04, 0x0f, 0x05, 0x8e, 0x8b, 0x8c, 0x8e, 0x8f, 0x8d, 0x4e, 0x4f, 0x71, 0x55, 0x09, 0x4c, 0x58, 0x56, 0x4d, 0x4d, 0x56, 0x58, 0x01, 0x6b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x2c, 0x01, 0xd7, 0xda, 0xdb, 0xd7, 0xd7, 0xdb, 0xa5, 0xc9, 0x28, 0x6a, 0x38, 0x01, 0x80, 0x01, 0x70, 0x9e, 0x9e, 0xfe, 0x90, 0x9e, 0x6e, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x72, 0x01, 0x46, 0x94, 0xfe, 0x91, 0x01, 0x8c, 0x96, 0xfe, 0x9f, 0x72, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x30, 0x00, 0x38, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x03, 0x33, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x10, 0x78, 0xf1, 0xbd, 0x8a, 0x01, 0x04, 0x77, 0x3d, 0xfe, 0xd7, 0x3d, 0x77, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xac, 0xfe, 0x55, 0x02, 0x0f, 0xfc, 0xbc, 0xda, 0xda, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x46, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x75, 0x01, 0x7d, 0xfd, 0xe6, 0x1f, 0x38, 0x01, 0x36, 0x5e, 0x4c, 0x2f, 0x6e, 0x41, 0x46, 0x77, 0x34, 0x82, 0x9d, 0xfe, 0xd6, 0x33, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfc, 0x3f, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x56, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x57, 0x53, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x64, 0x61, 0x4d, 0x54, 0x55, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x31, 0x82, 0x98, 0x51, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x91, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x30, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x4d, 0xfe, 0xe9, 0x01, 0x17, 0x14, 0x95, 0x7a, 0x7a, 0x81, 0xfe, 0x8b, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0x97, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xfc, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x1a, 0x19, 0x91, 0x54, 0x55, 0x57, 0x57, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5d, 0x31, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x0d, 0x4f, 0x2e, 0x2e, 0x2e, 0x2e, 0x4f, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x73, 0x3e, 0x3d, 0x09, 0x22, 0x34, 0x34, 0x3d, 0x83, 0x4b, 0x4c, 0x4f, 0x4f, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x9e, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x34, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3a, 0x00, 0x58, 0x00, 0x67, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x55, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x32, 0x30, 0x4c, 0x4e, 0x8e, 0x8f, 0x4d, 0x4d, 0x30, 0x30, 0x29, 0x2a, 0x29, 0x4d, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x96, 0x2b, 0x2a, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x5b, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x4d, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x10, 0x2c, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3d, 0x09, 0x20, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x50, 0x82, 0x96, 0x4f, 0x4f, 0x60, 0x62, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4c, 0x30, 0x2f, 0x2f, 0x2e, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xdf, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x86, 0x80, 0x2d, 0x2e, 0x2e, 0x2d, 0x80, 0x2d, 0x2e, 0x2e, 0x6d, 0x76, 0x99, 0x99, 0x76, 0x92, 0x7e, 0x7e, 0xfe, 0x9c, 0x78, 0x7e, 0x7b, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xc8, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x05, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x87, 0x72, 0x3b, 0x39, 0x81, 0x2c, 0x24, 0x4c, 0x3f, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfd, 0xdc, 0x95, 0x46, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x47, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xe9, 0x2c, 0x5b, 0x33, 0xa3, 0xb4, 0xb5, 0xa2, 0x33, 0x5c, 0x2b, 0x2a, 0x5f, 0x31, 0x70, 0x6f, 0x6e, 0x71, 0x31, 0x60, 0x29, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xeb, 0x17, 0x16, 0xe3, 0xce, 0xcd, 0xe5, 0x17, 0x17, 0x74, 0x22, 0x24, 0xaa, 0xac, 0xab, 0xab, 0x24, 0x22, 0x00, 0x00, 0x05, 0x00, 0xc3, 0xfe, 0x14, 0x06, 0xb9, 0x07, 0x6d, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x49, 0x00, 0x00, 0x01, 0x22, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x12, 0x10, 0x26, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x02, 0xaf, 0x04, 0x0f, 0x05, 0x8e, 0x8b, 0x8c, 0x8e, 0x8f, 0x8d, 0x4e, 0x4f, 0x71, 0x55, 0x09, 0x4c, 0x58, 0x56, 0x4d, 0x4d, 0x56, 0x58, 0x01, 0x61, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x5e, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x2c, 0x01, 0xd7, 0xda, 0xdb, 0xd7, 0xd7, 0xdb, 0xa5, 0xc9, 0x28, 0x6a, 0x38, 0x01, 0x80, 0x01, 0x70, 0x9e, 0x9e, 0xfe, 0x90, 0x9e, 0xfe, 0x30, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x38, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x72, 0x01, 0x46, 0x94, 0xfe, 0x91, 0x01, 0x8c, 0x96, 0xfe, 0x9f, 0x72, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x29, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x03, 0x33, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x10, 0x78, 0xf1, 0xbd, 0x8a, 0x01, 0x04, 0x77, 0x3d, 0xfe, 0xd7, 0x3d, 0x77, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xac, 0xfe, 0x55, 0x02, 0x0f, 0xfc, 0xbc, 0xda, 0xda, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x37, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x75, 0x01, 0x7d, 0xfd, 0xe6, 0x1f, 0x38, 0x01, 0x36, 0x5e, 0x4c, 0x2f, 0x6e, 0x41, 0x46, 0x77, 0x34, 0x82, 0x9d, 0xfe, 0xd6, 0x33, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfc, 0x3f, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x47, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x57, 0x53, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x64, 0x61, 0x4d, 0x54, 0x55, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x31, 0x82, 0x98, 0x51, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x91, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x4d, 0xfe, 0xe9, 0x01, 0x17, 0x14, 0x95, 0x7a, 0x7a, 0x81, 0xfe, 0x8b, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0x97, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xfc, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x1a, 0x19, 0x91, 0x54, 0x55, 0x57, 0x57, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5d, 0x31, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x0d, 0x4f, 0x2e, 0x2e, 0x2e, 0x2e, 0x4f, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x73, 0x3e, 0x3d, 0x09, 0x22, 0x34, 0x34, 0x3d, 0x83, 0x4b, 0x4c, 0x4f, 0x4f, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x9e, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x2b, 0x00, 0x49, 0x00, 0x58, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x55, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x32, 0x30, 0x4c, 0x4e, 0x8e, 0x8f, 0x4d, 0x4d, 0x30, 0x30, 0x29, 0x2a, 0x29, 0x4d, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x96, 0x2b, 0x2a, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x5b, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x10, 0x2c, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3d, 0x09, 0x20, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x50, 0x82, 0x96, 0x4f, 0x4f, 0x60, 0x62, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4c, 0x30, 0x2f, 0x2f, 0x2e, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xdf, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x86, 0x80, 0x2d, 0x2e, 0x2e, 0x2d, 0x80, 0x2d, 0x2e, 0x2e, 0x6d, 0x76, 0x99, 0x99, 0x76, 0x92, 0x7e, 0x7e, 0xfe, 0x9c, 0x78, 0x7e, 0x7b, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xc8, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x05, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x87, 0x72, 0x3b, 0x39, 0x81, 0x2c, 0x24, 0x4c, 0x3f, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfd, 0xdc, 0x95, 0x46, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x38, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xe9, 0x2c, 0x5b, 0x33, 0xa3, 0xb4, 0xb5, 0xa2, 0x33, 0x5c, 0x2b, 0x2a, 0x5f, 0x31, 0x70, 0x6f, 0x6e, 0x71, 0x31, 0x60, 0x29, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xeb, 0x17, 0x16, 0xe3, 0xce, 0xcd, 0xe5, 0x17, 0x17, 0x74, 0x22, 0x24, 0xaa, 0xac, 0xab, 0xab, 0x24, 0x22, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x18, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x03, 0x22, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x12, 0x10, 0x26, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0x2f, 0x04, 0x0f, 0x05, 0x8e, 0x8b, 0x8c, 0x8e, 0x8f, 0x8d, 0x4e, 0x4f, 0x71, 0x55, 0x09, 0x4c, 0x58, 0x56, 0x4d, 0x4d, 0x56, 0x58, 0xfe, 0x9c, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x02, 0x41, 0x01, 0xd7, 0xda, 0xdb, 0xd7, 0xd7, 0xdb, 0xa5, 0xc9, 0x28, 0x6a, 0x38, 0x01, 0x80, 0x01, 0x70, 0x9e, 0x9e, 0xfe, 0x90, 0x9e, 0x03, 0x6f, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x72, 0x01, 0x46, 0x94, 0xfe, 0x91, 0x01, 0x8c, 0x96, 0xfe, 0x9f, 0x72, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x03, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x09, 0x00, 0x15, 0x00, 0x21, 0x00, 0x00, 0x01, 0x13, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x03, 0xaf, 0x80, 0x01, 0xa3, 0xfe, 0xae, 0x81, 0xfe, 0xae, 0xfe, 0xad, 0x82, 0xfe, 0xae, 0x01, 0xa2, 0xfe, 0x5e, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x05, 0x31, 0xfe, 0x47, 0xfe, 0xef, 0xfe, 0x47, 0x01, 0x11, 0xfe, 0xef, 0x01, 0xb9, 0x01, 0x11, 0x03, 0x7d, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x03, 0x33, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x10, 0x78, 0xf1, 0xbd, 0x8a, 0x01, 0x04, 0x77, 0x3d, 0xfe, 0xd7, 0x3d, 0x77, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xac, 0xfe, 0x55, 0x02, 0x0f, 0xfc, 0xbc, 0xda, 0xda, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x54, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x75, 0x01, 0x7d, 0xfd, 0xe6, 0x1f, 0x38, 0x01, 0x36, 0x5e, 0x4c, 0x2f, 0x6e, 0x41, 0x46, 0x77, 0x34, 0x82, 0x9d, 0xfe, 0xd6, 0x33, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfc, 0x3f, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x64, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x57, 0x53, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x64, 0x61, 0x4d, 0x54, 0x55, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x31, 0x82, 0x98, 0x51, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x91, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x3e, 0x00, 0x49, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x4d, 0xfe, 0xe9, 0x01, 0x17, 0x14, 0x95, 0x7a, 0x7a, 0x81, 0xfe, 0x8b, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0x97, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x5c, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xfc, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x1a, 0x19, 0x91, 0x54, 0x55, 0x57, 0x57, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5d, 0x31, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x4b, 0x00, 0x6b, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x0d, 0x4f, 0x2e, 0x2e, 0x2e, 0x2e, 0x4f, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x73, 0x3e, 0x3d, 0x09, 0x22, 0x34, 0x34, 0x3d, 0x83, 0x4b, 0x4c, 0x4f, 0x4f, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x9e, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x42, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x48, 0x00, 0x66, 0x00, 0x75, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x55, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x32, 0x30, 0x4c, 0x4e, 0x8e, 0x8f, 0x4d, 0x4d, 0x30, 0x30, 0x29, 0x2a, 0x29, 0x4d, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x96, 0x2b, 0x2a, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x5b, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x5b, 0x00, 0x6a, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x10, 0x2c, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3d, 0x09, 0x20, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x50, 0x82, 0x96, 0x4f, 0x4f, 0x60, 0x62, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4c, 0x30, 0x2f, 0x2f, 0x2e, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xdf, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x49, 0x00, 0x55, 0x00, 0x5c, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x86, 0x80, 0x2d, 0x2e, 0x2e, 0x2d, 0x80, 0x2d, 0x2e, 0x2e, 0x6d, 0x76, 0x99, 0x99, 0x76, 0x92, 0x7e, 0x7e, 0xfe, 0x9c, 0x78, 0x7e, 0x7b, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xc8, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x48, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x05, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x87, 0x72, 0x3b, 0x39, 0x81, 0x2c, 0x24, 0x4c, 0x3f, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfd, 0xdc, 0x95, 0x46, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x55, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xe9, 0x2c, 0x5b, 0x33, 0xa3, 0xb4, 0xb5, 0xa2, 0x33, 0x5c, 0x2b, 0x2a, 0x5f, 0x31, 0x70, 0x6f, 0x6e, 0x71, 0x31, 0x60, 0x29, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xeb, 0x17, 0x16, 0xe3, 0xce, 0xcd, 0xe5, 0x17, 0x17, 0x74, 0x22, 0x24, 0xaa, 0xac, 0xab, 0xab, 0x24, 0x22, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x4d, 0x00, 0x57, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x12, 0x10, 0x26, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0xfb, 0x04, 0x0f, 0x05, 0x8e, 0x8b, 0x8c, 0x8e, 0x8f, 0x8d, 0x4e, 0x4f, 0x71, 0x55, 0x09, 0x4c, 0x58, 0x56, 0x4d, 0x4d, 0x56, 0x58, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xbf, 0x01, 0xd7, 0xda, 0xdb, 0xd7, 0xd7, 0xdb, 0xa5, 0xc9, 0x28, 0x6a, 0x38, 0x01, 0x80, 0x01, 0x70, 0x9e, 0x9e, 0xfe, 0x90, 0x9e, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x46, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x72, 0x01, 0x46, 0x94, 0xfe, 0x91, 0x01, 0x8c, 0x96, 0xfe, 0x9f, 0x72, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x03, 0x21, 0x17, 0x03, 0x37, 0x17, 0x03, 0x37, 0x21, 0x03, 0x13, 0x05, 0x01, 0x13, 0x25, 0x05, 0x13, 0x01, 0x25, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x03, 0xaf, 0x5a, 0xfe, 0xdd, 0xeb, 0x5b, 0xed, 0xeb, 0x59, 0xeb, 0xfe, 0xdb, 0x58, 0x9c, 0x01, 0x87, 0xfe, 0xd8, 0x57, 0xfe, 0xae, 0xfe, 0xad, 0x58, 0xfe, 0xd8, 0x01, 0x88, 0xfe, 0x78, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x04, 0x6e, 0xfe, 0xce, 0xbe, 0xfe, 0xcd, 0xbe, 0xbe, 0x01, 0x33, 0xbe, 0x01, 0xf5, 0xfe, 0x6f, 0x28, 0xfe, 0xe2, 0xfe, 0x54, 0xdf, 0xdf, 0x01, 0xa8, 0x01, 0x22, 0x28, 0x03, 0x55, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x89, 0xff, 0x6a, 0x06, 0xf9, 0x07, 0x56, 0x00, 0x07, 0x00, 0x11, 0x00, 0x19, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x7f, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x37, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x24, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x17, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x36, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x06, 0x32, 0x3e, 0x03, 0x37, 0x13, 0x17, 0x07, 0x3e, 0x04, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x37, 0x26, 0x22, 0x07, 0x16, 0x15, 0x14, 0x07, 0x27, 0x36, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x03, 0x17, 0x27, 0x37, 0x13, 0x1e, 0x03, 0x12, 0x32, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x05, 0x07, 0x25, 0x07, 0x06, 0x07, 0x05, 0x07, 0x25, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x05, 0x27, 0x25, 0x26, 0x2f, 0x01, 0x05, 0x27, 0x25, 0x2e, 0x03, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x02, 0x9c, 0x3b, 0x53, 0x3b, 0x3b, 0x53, 0x69, 0x10, 0x28, 0x0c, 0x0f, 0x29, 0x01, 0x84, 0x3b, 0x53, 0x3c, 0x3c, 0x53, 0x14, 0x0f, 0x28, 0x0c, 0x10, 0x28, 0xfe, 0x97, 0x14, 0x1d, 0x14, 0x14, 0x1d, 0xd4, 0x13, 0x1d, 0x14, 0x14, 0x1d, 0x91, 0x61, 0x46, 0x29, 0x19, 0x08, 0x02, 0x0e, 0x79, 0x0b, 0x35, 0x66, 0x67, 0x4e, 0x30, 0x3c, 0x32, 0x2b, 0x3a, 0x41, 0x58, 0x58, 0x47, 0x4b, 0x74, 0x3d, 0x10, 0x75, 0x14, 0x01, 0x26, 0x97, 0x26, 0x01, 0x15, 0x75, 0x10, 0x3c, 0x75, 0x4b, 0x47, 0x58, 0x58, 0x42, 0x3b, 0x2b, 0x31, 0x3d, 0x31, 0x4d, 0x68, 0x66, 0x35, 0x0b, 0x78, 0x0f, 0x02, 0x08, 0x18, 0x29, 0x33, 0x89, 0x44, 0x27, 0xb5, 0x81, 0x7d, 0x9c, 0x54, 0x8d, 0x44, 0x76, 0x89, 0x50, 0x01, 0x76, 0x04, 0xfe, 0x22, 0x01, 0x02, 0x04, 0x01, 0xc9, 0x14, 0xfe, 0x3f, 0x1d, 0x98, 0xe1, 0x98, 0x1d, 0xfe, 0x3f, 0x14, 0x01, 0xc8, 0x03, 0x02, 0x01, 0xfe, 0x21, 0x04, 0x01, 0x76, 0x50, 0x89, 0x76, 0x43, 0x8c, 0x54, 0x9c, 0x7d, 0x81, 0xb6, 0x26, 0x03, 0x38, 0x90, 0x67, 0x67, 0x90, 0x67, 0x82, 0x3d, 0x18, 0x12, 0x3e, 0x18, 0x11, 0x75, 0x90, 0x67, 0x67, 0x90, 0x67, 0xdc, 0x3d, 0x18, 0x12, 0x3e, 0x18, 0x11, 0xfd, 0x22, 0x36, 0x27, 0x27, 0x36, 0x27, 0x5d, 0x36, 0x27, 0x27, 0x36, 0x27, 0xe0, 0x24, 0x39, 0x5d, 0x57, 0x3e, 0x01, 0x3a, 0x06, 0xfb, 0x1f, 0x4c, 0x6b, 0x74, 0x93, 0x4c, 0x4a, 0x98, 0x37, 0x33, 0x28, 0x23, 0x83, 0x58, 0x51, 0x69, 0x6b, 0xa4, 0x5c, 0x42, 0x3f, 0x26, 0x53, 0x54, 0x1b, 0x0e, 0x03, 0x03, 0x0e, 0x1b, 0x54, 0x53, 0x26, 0x3f, 0x42, 0x5c, 0xa4, 0x6b, 0x69, 0x51, 0x58, 0x83, 0x23, 0x28, 0x33, 0x37, 0x98, 0x4a, 0x4c, 0x93, 0x74, 0x6b, 0x4c, 0x1f, 0xfb, 0x06, 0xfe, 0xc6, 0x3e, 0x57, 0x5d, 0x39, 0x06, 0x02, 0x06, 0x86, 0xbe, 0xb7, 0x8c, 0x8a, 0x72, 0xac, 0xc8, 0x6c, 0xc8, 0xa1, 0x7e, 0x33, 0x1a, 0x44, 0x23, 0x01, 0x1f, 0x1f, 0xae, 0x40, 0xac, 0x6d, 0x8a, 0x8a, 0x6d, 0xac, 0x40, 0xae, 0x1f, 0x1f, 0x01, 0x23, 0x44, 0x1a, 0x33, 0x7e, 0xa1, 0xc8, 0x6c, 0xc8, 0xac, 0x72, 0x8a, 0x8c, 0xb7, 0xbe, 0x86, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x43, 0xff, 0x6a, 0x08, 0x43, 0x06, 0x8a, 0x00, 0x09, 0x00, 0x14, 0x00, 0x18, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x8e, 0x00, 0x99, 0x00, 0x9f, 0x00, 0xfd, 0x01, 0x07, 0x00, 0x00, 0x01, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x27, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x33, 0x15, 0x23, 0x01, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x01, 0x37, 0x17, 0x07, 0x27, 0x37, 0x01, 0x15, 0x23, 0x35, 0x25, 0x17, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x37, 0x16, 0x17, 0x3e, 0x04, 0x37, 0x16, 0x33, 0x32, 0x3e, 0x04, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x2e, 0x04, 0x23, 0x22, 0x0e, 0x02, 0x0f, 0x01, 0x06, 0x07, 0x2e, 0x01, 0x20, 0x06, 0x07, 0x26, 0x2f, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x03, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x05, 0x33, 0x32, 0x37, 0x1e, 0x04, 0x17, 0x36, 0x25, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x01, 0x07, 0x17, 0x07, 0x27, 0x37, 0x01, 0x34, 0x37, 0x27, 0x26, 0x27, 0x23, 0x22, 0x2e, 0x06, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x16, 0x1f, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x37, 0x36, 0x37, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x07, 0x2b, 0x01, 0x06, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x01, 0x06, 0x20, 0x27, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x03, 0x20, 0x2d, 0x38, 0x37, 0x2e, 0x2d, 0x38, 0x37, 0x1b, 0x10, 0x29, 0x0d, 0x0f, 0x15, 0x14, 0x30, 0x63, 0x63, 0x02, 0x0f, 0x2e, 0x37, 0x37, 0x2e, 0x2d, 0x37, 0x38, 0xfb, 0xcb, 0x2e, 0xb1, 0x33, 0x39, 0x26, 0x03, 0x39, 0x63, 0xfe, 0x09, 0x3c, 0x39, 0x0f, 0x05, 0x34, 0x2e, 0xa0, 0x7d, 0x5e, 0x3e, 0x74, 0x3b, 0x33, 0x04, 0x0f, 0x39, 0x3b, 0x16, 0x10, 0x04, 0x1c, 0x0b, 0x12, 0x09, 0x01, 0x4a, 0x23, 0x1d, 0x32, 0x21, 0x2b, 0x14, 0x30, 0x0b, 0x2c, 0x2a, 0x2f, 0x02, 0x22, 0x1b, 0x27, 0x27, 0x10, 0x0f, 0x1d, 0x20, 0x0e, 0x11, 0x11, 0x39, 0x50, 0x37, 0xee, 0xfe, 0xde, 0xef, 0x37, 0x50, 0x38, 0x11, 0x11, 0x0f, 0x1f, 0x1d, 0x0f, 0x11, 0x26, 0x27, 0x1b, 0x22, 0x02, 0x2f, 0x2a, 0x2c, 0x0a, 0x31, 0x14, 0x2a, 0x21, 0x33, 0x1d, 0x23, 0x49, 0x01, 0x09, 0x12, 0x0c, 0x1b, 0x05, 0x10, 0x02, 0xb8, 0x11, 0x28, 0x0d, 0x0f, 0x15, 0x13, 0x01, 0xbb, 0x99, 0x26, 0x39, 0x33, 0xb1, 0xfb, 0x51, 0x0b, 0x12, 0x34, 0x0e, 0x09, 0x1e, 0x35, 0x27, 0x2f, 0x19, 0x31, 0x11, 0x39, 0x09, 0x3b, 0x34, 0x24, 0x28, 0x20, 0x2d, 0x7a, 0x3a, 0x1b, 0x2d, 0x2d, 0x17, 0x15, 0x21, 0x0f, 0x3b, 0x24, 0x31, 0x94, 0x01, 0x7a, 0x93, 0x32, 0x24, 0x3a, 0x10, 0x21, 0x15, 0x16, 0x2d, 0x2e, 0x1a, 0x3b, 0x79, 0x2e, 0x20, 0x27, 0x25, 0x34, 0x3c, 0x08, 0x39, 0x11, 0x32, 0x18, 0x30, 0x26, 0x36, 0x1d, 0x09, 0x0f, 0x33, 0x13, 0x0c, 0x0c, 0x1f, 0x56, 0x08, 0x14, 0x1d, 0x3b, 0x31, 0x7a, 0xb0, 0x7b, 0x30, 0x3c, 0x1d, 0x13, 0x08, 0x56, 0x20, 0x0b, 0x02, 0xe2, 0x57, 0xfe, 0xda, 0x57, 0x0f, 0x1c, 0x32, 0x8d, 0x60, 0x71, 0x02, 0xd1, 0x6e, 0x82, 0x6e, 0x6e, 0x82, 0x6e, 0x1b, 0x41, 0x15, 0x11, 0x1f, 0x1d, 0x19, 0x12, 0xd4, 0xd2, 0x01, 0x8b, 0x6e, 0x82, 0x6e, 0x6e, 0x82, 0x6e, 0x02, 0xb5, 0x2d, 0xda, 0xba, 0x18, 0x94, 0xfd, 0x4d, 0xd2, 0xd2, 0x93, 0x76, 0x24, 0x44, 0x11, 0x19, 0x4b, 0x3b, 0x37, 0x22, 0x08, 0x0d, 0x44, 0x3b, 0x4b, 0x19, 0x11, 0x44, 0x24, 0x76, 0x0d, 0x0f, 0x13, 0x68, 0x35, 0x57, 0x4d, 0x27, 0x14, 0x0b, 0x0c, 0x20, 0x11, 0x31, 0x0a, 0x2a, 0x4c, 0x37, 0x2e, 0x34, 0x02, 0x28, 0x1a, 0x23, 0x13, 0x0e, 0x22, 0x11, 0x19, 0x19, 0x4e, 0x83, 0x65, 0x6d, 0x6d, 0x65, 0x83, 0x4e, 0x19, 0x19, 0x11, 0x22, 0x0e, 0x13, 0x23, 0x1a, 0x28, 0x02, 0x34, 0x2e, 0x37, 0x4c, 0x2a, 0x0a, 0x31, 0x11, 0x20, 0x0c, 0x0b, 0x14, 0x27, 0x4d, 0x57, 0x35, 0x68, 0x13, 0x0f, 0x4e, 0x41, 0x15, 0x11, 0x1f, 0x1d, 0x19, 0x12, 0x02, 0x9a, 0xbb, 0x94, 0x18, 0xba, 0xda, 0xfb, 0xef, 0x2a, 0x2c, 0x50, 0xdd, 0x49, 0x09, 0x08, 0x1b, 0x0d, 0x2c, 0x0f, 0x39, 0x09, 0x3a, 0x6b, 0x52, 0x34, 0x5f, 0x35, 0x22, 0x32, 0x53, 0x12, 0x27, 0x18, 0x19, 0x27, 0x15, 0x52, 0x1d, 0x1b, 0x4e, 0x4e, 0x1b, 0x1d, 0x52, 0x15, 0x27, 0x19, 0x18, 0x27, 0x12, 0x53, 0x32, 0x22, 0x35, 0x5f, 0x34, 0x52, 0x6b, 0x3a, 0x09, 0x39, 0x0f, 0x2c, 0x0d, 0x1b, 0x08, 0x09, 0x49, 0xdd, 0x50, 0x2c, 0x2a, 0x30, 0x28, 0x73, 0x42, 0x44, 0x30, 0x48, 0x2e, 0x26, 0x1b, 0x1b, 0x26, 0x2e, 0x48, 0x30, 0x44, 0x42, 0x73, 0x28, 0xfe, 0xe0, 0x16, 0x16, 0x24, 0x15, 0x27, 0x26, 0x00, 0x08, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x11, 0x00, 0x19, 0x00, 0x28, 0x00, 0x32, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x7f, 0x00, 0xb8, 0x00, 0x00, 0x01, 0x37, 0x16, 0x33, 0x32, 0x37, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x01, 0x17, 0x06, 0x22, 0x27, 0x37, 0x16, 0x32, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x02, 0x62, 0x53, 0x3e, 0x52, 0x34, 0x4c, 0x4b, 0x35, 0x51, 0x3f, 0x52, 0x61, 0x81, 0x43, 0x3d, 0x3e, 0x42, 0x82, 0x01, 0x8c, 0x38, 0x6e, 0xae, 0x6e, 0x38, 0x51, 0x78, 0xea, 0x26, 0x49, 0x1d, 0x24, 0x3f, 0x31, 0x12, 0x2f, 0x2b, 0x3a, 0x3f, 0x5b, 0x46, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x14, 0x01, 0x8c, 0x04, 0x5a, 0x3f, 0x3c, 0x2a, 0x30, 0x13, 0x31, 0x3f, 0x24, 0x1d, 0x49, 0x6d, 0x0b, 0x18, 0x2b, 0x24, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x01, 0x6b, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x5d, 0x94, 0xa3, 0x01, 0xb9, 0xa3, 0x93, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfb, 0x46, 0x0f, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xaf, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xae, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x01, 0x8c, 0x62, 0x40, 0x2c, 0x2c, 0x40, 0x62, 0x64, 0x1c, 0x1c, 0x01, 0xa8, 0x78, 0x3d, 0x3d, 0x78, 0x2e, 0x01, 0x06, 0x4c, 0x1c, 0x0b, 0x23, 0x24, 0x2d, 0x47, 0x30, 0x2c, 0x61, 0x26, 0x30, 0x24, 0x0e, 0x0f, 0x07, 0x34, 0x25, 0x11, 0x1d, 0x43, 0x61, 0x2c, 0x30, 0x47, 0x2d, 0x24, 0x23, 0x0b, 0x1c, 0x04, 0x03, 0x16, 0x18, 0x1c, 0x0e, 0x0c, 0x03, 0x3b, 0xa7, 0x82, 0x74, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x74, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0xe7, 0x77, 0x84, 0x84, 0x77, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x3d, 0x7c, 0x8f, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x8f, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0x8e, 0x9e, 0x9e, 0x8c, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x99, 0xff, 0x6a, 0x07, 0xbb, 0x07, 0x0b, 0x00, 0x07, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x31, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x68, 0x00, 0x98, 0x00, 0xaa, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x37, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x03, 0x22, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x00, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x03, 0x34, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x26, 0x01, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x01, 0x37, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x12, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x3e, 0x02, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x1e, 0x01, 0x17, 0x06, 0x15, 0x14, 0x17, 0x12, 0x20, 0x04, 0x17, 0x16, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x2b, 0x01, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x20, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x27, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x36, 0x03, 0x26, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x36, 0x37, 0x26, 0x25, 0x06, 0x07, 0x16, 0x17, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x23, 0x22, 0x02, 0xca, 0x4a, 0x68, 0x4a, 0x4a, 0x68, 0x82, 0x14, 0x31, 0x0e, 0x14, 0x32, 0x0e, 0x16, 0x28, 0x21, 0x1b, 0x16, 0x28, 0x21, 0x01, 0xd8, 0x49, 0x69, 0x4a, 0x4a, 0x69, 0xe8, 0x16, 0x1c, 0x21, 0x28, 0x16, 0x1c, 0x21, 0x28, 0x01, 0x02, 0x14, 0x32, 0x0f, 0x14, 0x32, 0xfd, 0x33, 0x5f, 0x75, 0xb9, 0x57, 0xa2, 0x35, 0x5f, 0x97, 0xf6, 0x74, 0xd2, 0x7c, 0x01, 0x93, 0x95, 0x6f, 0x4b, 0x1b, 0x1a, 0x1c, 0x4e, 0x51, 0x75, 0x40, 0x65, 0x1c, 0x19, 0x65, 0x40, 0x75, 0x51, 0x4e, 0x1c, 0x1a, 0x1c, 0x4c, 0x70, 0xbb, 0x01, 0x45, 0x01, 0x18, 0x58, 0x5e, 0x0f, 0x16, 0x1a, 0x60, 0x81, 0x07, 0x0c, 0x19, 0x1e, 0x79, 0x50, 0x07, 0x0d, 0x34, 0x33, 0x9a, 0x62, 0x85, 0xfe, 0xfd, 0x85, 0x62, 0x9a, 0x33, 0x34, 0x0d, 0x07, 0x50, 0x78, 0x1f, 0x19, 0x0c, 0x07, 0x82, 0x5f, 0x1a, 0x17, 0x0e, 0x5f, 0x57, 0xc1, 0x15, 0x1d, 0x0c, 0x13, 0x24, 0x27, 0x07, 0x15, 0x3f, 0x1c, 0x23, 0x03, 0x07, 0x36, 0x2f, 0x04, 0xe8, 0x0e, 0x30, 0x36, 0x07, 0x04, 0x22, 0x1c, 0x40, 0x14, 0x07, 0x27, 0x24, 0x13, 0x0c, 0x1c, 0x04, 0x08, 0x74, 0x52, 0x52, 0x74, 0x52, 0x68, 0x31, 0x13, 0x0e, 0x31, 0x13, 0x0e, 0xfe, 0x52, 0x15, 0x20, 0x24, 0x1f, 0x15, 0x20, 0x24, 0x1f, 0x02, 0x0c, 0x74, 0x52, 0x52, 0x74, 0x52, 0xfe, 0x05, 0x15, 0x1f, 0x24, 0x20, 0x15, 0x1f, 0x24, 0x01, 0x6b, 0x31, 0x13, 0x0e, 0x31, 0x13, 0x0e, 0xfd, 0xa8, 0x54, 0xa4, 0x58, 0x4c, 0x54, 0xd6, 0x72, 0xfe, 0xde, 0xcb, 0x9a, 0xb8, 0x86, 0x95, 0x2c, 0x30, 0x5e, 0x31, 0x8a, 0x69, 0x6f, 0x45, 0x35, 0x35, 0x45, 0x6f, 0x69, 0x8a, 0x31, 0x5e, 0x30, 0x2c, 0x95, 0x86, 0xb8, 0x9a, 0x06, 0x00, 0xa4, 0x7c, 0x88, 0x9b, 0x06, 0xa4, 0x87, 0x2c, 0x36, 0x5b, 0x3f, 0x4b, 0x69, 0x7b, 0x70, 0x6e, 0xad, 0x37, 0x4c, 0x4c, 0x37, 0xad, 0x6e, 0x70, 0x7b, 0x69, 0x4b, 0x3f, 0x5b, 0x36, 0x2c, 0x87, 0xa4, 0x06, 0x9b, 0x88, 0x7c, 0xfd, 0xcc, 0x15, 0x07, 0x0f, 0x52, 0x3a, 0x1e, 0x33, 0x97, 0x2f, 0x15, 0x87, 0x7b, 0x57, 0x60, 0x60, 0x57, 0x7b, 0x87, 0x15, 0x2f, 0x97, 0x33, 0x1e, 0x3a, 0x52, 0x0f, 0x07, 0x00, 0x00, 0x09, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x39, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x46, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x05, 0x36, 0x37, 0x11, 0x23, 0x03, 0x11, 0x23, 0x11, 0x16, 0x25, 0x36, 0x37, 0x23, 0x05, 0x35, 0x23, 0x16, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0xc8, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0xf8, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x02, 0x6d, 0x50, 0x44, 0x94, 0x7a, 0x94, 0x45, 0x01, 0xd7, 0x41, 0x19, 0x5a, 0xfd, 0x6a, 0x5b, 0x19, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x6a, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0xdf, 0x0b, 0x2a, 0x01, 0x25, 0xfe, 0xa6, 0x01, 0x5a, 0xfe, 0xdb, 0x2a, 0x99, 0x52, 0x64, 0xb8, 0xb8, 0x66, 0x00, 0x00, 0x09, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x3a, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x47, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x07, 0x21, 0x10, 0x00, 0x20, 0x00, 0x05, 0x36, 0x37, 0x11, 0x23, 0x03, 0x11, 0x23, 0x11, 0x16, 0x25, 0x36, 0x37, 0x23, 0x05, 0x35, 0x23, 0x16, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x03, 0x5c, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfd, 0x72, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xc9, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x02, 0x6d, 0x50, 0x44, 0x94, 0x7a, 0x94, 0x45, 0x01, 0xd7, 0x41, 0x19, 0x5a, 0xfd, 0x6a, 0x5b, 0x19, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x02, 0x16, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xac, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0xdf, 0x0b, 0x2a, 0x01, 0x25, 0xfe, 0xa6, 0x01, 0x5a, 0xfe, 0xdb, 0x2a, 0x99, 0x52, 0x64, 0xb8, 0xb8, 0x66, 0x00, 0x09, 0x00, 0x55, 0xff, 0x6a, 0x08, 0x14, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x11, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x59, 0x00, 0x7e, 0x00, 0x00, 0x01, 0x35, 0x23, 0x16, 0x05, 0x36, 0x37, 0x23, 0x01, 0x11, 0x23, 0x11, 0x16, 0x17, 0x36, 0x37, 0x11, 0x23, 0x25, 0x21, 0x10, 0x00, 0x20, 0x00, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x14, 0x07, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x02, 0x07, 0x02, 0x21, 0x20, 0x03, 0x26, 0x03, 0x07, 0x06, 0x07, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x26, 0x37, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x17, 0x16, 0x17, 0x26, 0x27, 0x26, 0x21, 0x20, 0x07, 0x06, 0x07, 0x36, 0x3f, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x06, 0x02, 0xe9, 0x5b, 0x1a, 0x02, 0xd8, 0x40, 0x1a, 0x5a, 0xfe, 0x77, 0x93, 0x44, 0xca, 0x4f, 0x44, 0x93, 0xfd, 0x93, 0x04, 0x5e, 0xfe, 0xba, 0xfe, 0x2f, 0xfe, 0xb9, 0x4f, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9c, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfc, 0x2a, 0x01, 0xda, 0x01, 0x4e, 0x01, 0x50, 0x01, 0xd8, 0x02, 0x54, 0x35, 0x15, 0x1b, 0x30, 0x45, 0x1c, 0x16, 0x10, 0x0a, 0x26, 0xbc, 0xec, 0xfe, 0xb0, 0xfe, 0xb2, 0xed, 0xbc, 0x27, 0x09, 0x10, 0x17, 0x1c, 0x44, 0x30, 0x1a, 0x15, 0x36, 0x53, 0x02, 0x7a, 0x01, 0x92, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x90, 0x01, 0x18, 0x21, 0x22, 0x1c, 0x17, 0x10, 0x29, 0x7b, 0x25, 0x15, 0x2a, 0x8b, 0xc7, 0xfe, 0xe1, 0xfe, 0xe4, 0xca, 0x8a, 0x2a, 0x15, 0x25, 0x7a, 0x28, 0x10, 0x17, 0x1c, 0x44, 0x18, 0x01, 0x01, 0xa1, 0xb8, 0x66, 0x50, 0x52, 0x64, 0xfe, 0xa6, 0x01, 0x5a, 0xfe, 0xdb, 0x2a, 0x0b, 0x0b, 0x2a, 0x01, 0x25, 0x87, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x01, 0xae, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0x1d, 0x1b, 0x1f, 0x14, 0x18, 0x1f, 0x25, 0x26, 0x36, 0x1f, 0x19, 0x39, 0x20, 0xfe, 0xe9, 0xd1, 0xfe, 0xfa, 0x01, 0x06, 0xd0, 0x01, 0x16, 0x1e, 0x39, 0x19, 0x1f, 0x36, 0x26, 0x25, 0x1f, 0x19, 0x13, 0x1e, 0x1c, 0x1d, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x14, 0x13, 0x1a, 0x1f, 0x19, 0x39, 0x88, 0x2d, 0x0e, 0x0f, 0xc7, 0x9a, 0xe0, 0xe0, 0x9b, 0xc6, 0x10, 0x0d, 0x2d, 0x88, 0x39, 0x19, 0x1f, 0x1b, 0x14, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x25, 0x21, 0x16, 0x17, 0x16, 0x24, 0x37, 0x36, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x7f, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x03, 0xd5, 0xfc, 0xb5, 0x1e, 0x53, 0x7f, 0x01, 0x6c, 0x80, 0x53, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xb9, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x7b, 0x75, 0x5c, 0x8e, 0x01, 0x8e, 0x5c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x25, 0x21, 0x16, 0x17, 0x16, 0x37, 0x32, 0x37, 0x36, 0x01, 0xe1, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9b, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfc, 0x2a, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x7f, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x03, 0xd5, 0xfc, 0xb5, 0x1e, 0x53, 0x7f, 0xb6, 0xb6, 0x80, 0x53, 0x03, 0x8c, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xb9, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x7b, 0x75, 0x5c, 0x8e, 0x01, 0x8e, 0x5c, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x41, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x17, 0x16, 0x07, 0x14, 0x07, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x05, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x25, 0x21, 0x16, 0x17, 0x16, 0x37, 0x32, 0x37, 0x36, 0x05, 0xfe, 0x3a, 0x19, 0x01, 0x18, 0x18, 0x45, 0x30, 0x18, 0xfc, 0x1e, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9b, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfc, 0x2a, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x7f, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x03, 0xd5, 0xfc, 0xb5, 0x1e, 0x53, 0x7f, 0xb6, 0xb6, 0x80, 0x53, 0x04, 0x2c, 0x80, 0x38, 0x22, 0x2b, 0x1a, 0x1b, 0x36, 0x2c, 0x23, 0x35, 0x20, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xb9, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x7b, 0x75, 0x5c, 0x8e, 0x01, 0x8e, 0x5c, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x00, 0x01, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x27, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x25, 0x21, 0x16, 0x17, 0x16, 0x24, 0x37, 0x36, 0x04, 0x09, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x90, 0xfe, 0xf7, 0x46, 0xb3, 0xb3, 0x46, 0xfe, 0x29, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x7f, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x03, 0xd5, 0xfc, 0xb5, 0x1e, 0x53, 0x7f, 0x01, 0x6c, 0x80, 0x53, 0x04, 0x27, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0x55, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xfd, 0xf5, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xb9, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x7b, 0x75, 0x5c, 0x8e, 0x01, 0x8e, 0x5c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x80, 0xff, 0x6a, 0x07, 0x01, 0x07, 0x63, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x35, 0x00, 0x49, 0x00, 0x57, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x04, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x2f, 0x01, 0x06, 0x21, 0x20, 0x27, 0x07, 0x06, 0x05, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x34, 0x24, 0x21, 0x20, 0x04, 0x15, 0x14, 0x07, 0x16, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x37, 0x26, 0x25, 0x36, 0x35, 0x34, 0x24, 0x21, 0x20, 0x04, 0x15, 0x14, 0x17, 0x36, 0x21, 0x20, 0x17, 0x26, 0x23, 0x22, 0x07, 0x16, 0x33, 0x32, 0x01, 0xe7, 0x67, 0x1a, 0x24, 0x80, 0x01, 0x6b, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0xf6, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xc8, 0x0c, 0xcf, 0xfe, 0xf5, 0xfe, 0xf6, 0xcf, 0x0d, 0xc9, 0x03, 0x38, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfd, 0xf8, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0xfe, 0x3f, 0x01, 0xe7, 0x01, 0x59, 0x01, 0x5a, 0x01, 0xe6, 0xe4, 0xcb, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0xcc, 0xe4, 0x05, 0x45, 0xa9, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xab, 0xdb, 0x01, 0x29, 0x01, 0x2a, 0x3c, 0x9e, 0xc8, 0xc7, 0x9e, 0x9e, 0xc7, 0xc8, 0x01, 0xd1, 0x47, 0x2c, 0x26, 0x8d, 0x01, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x01, 0x51, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0xe0, 0x0e, 0x39, 0x39, 0x0e, 0xe0, 0x2a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x02, 0x5c, 0x86, 0xbe, 0xbe, 0x86, 0x82, 0x5c, 0xfc, 0xfe, 0xa5, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0x01, 0x5b, 0xfc, 0x5c, 0x02, 0x36, 0x4a, 0x51, 0x72, 0x72, 0x51, 0x4a, 0x36, 0xcf, 0xf5, 0x6e, 0x6e, 0x1c, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x07, 0x30, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x05, 0x07, 0x25, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x17, 0x05, 0x27, 0x01, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x36, 0x20, 0x17, 0x25, 0x11, 0x16, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x37, 0x11, 0x02, 0x8a, 0x01, 0x10, 0x45, 0xfe, 0xef, 0x02, 0x06, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfd, 0xf8, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0xb7, 0x45, 0xfe, 0xef, 0x45, 0xfd, 0xff, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0xf6, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0xb2, 0x77, 0x01, 0x0c, 0x77, 0x01, 0x8f, 0x9b, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x9d, 0x05, 0x67, 0xd4, 0x6f, 0xd5, 0xfe, 0xbc, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x01, 0xec, 0x6e, 0xd5, 0x6f, 0xfd, 0x3e, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x01, 0x51, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x02, 0x1d, 0x2a, 0x2a, 0xec, 0xfd, 0xd0, 0xe7, 0xfe, 0xd1, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0x01, 0x2f, 0xe7, 0x02, 0x30, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x32, 0x00, 0x39, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2d, 0x01, 0x17, 0x07, 0x17, 0x07, 0x25, 0x01, 0xe7, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0xf6, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0xa9, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x01, 0xc7, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x01, 0xd1, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x01, 0x51, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x02, 0x87, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x64, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0xe7, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0x27, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9b, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfc, 0x2a, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0xd1, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x01, 0xf3, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x37, 0x00, 0x43, 0x00, 0x51, 0x00, 0x00, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x32, 0x37, 0x26, 0x27, 0x06, 0x23, 0x22, 0x00, 0x11, 0x33, 0x14, 0x00, 0x20, 0x00, 0x35, 0x33, 0x14, 0x07, 0x16, 0x1d, 0x01, 0x36, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0x06, 0x07, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x34, 0x27, 0x26, 0x03, 0xf5, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfd, 0x72, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfe, 0xb8, 0x01, 0x93, 0x01, 0x1c, 0x7b, 0x6a, 0x5b, 0x3b, 0x26, 0x29, 0xe8, 0xfe, 0xb8, 0x7a, 0x01, 0x00, 0x01, 0x6c, 0x01, 0x00, 0x79, 0x6f, 0x32, 0xbc, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x04, 0x8e, 0x47, 0x52, 0x1b, 0x23, 0x20, 0x18, 0x0f, 0x0b, 0x1e, 0x01, 0x01, 0x02, 0x03, 0x8c, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0xfe, 0xc4, 0xfe, 0x43, 0x29, 0x30, 0x6c, 0x05, 0x01, 0x6a, 0x01, 0x02, 0xca, 0xfe, 0xe5, 0x01, 0x1c, 0xc9, 0xd5, 0xa0, 0x64, 0x63, 0x04, 0xda, 0x01, 0x33, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x36, 0x43, 0x24, 0x28, 0x18, 0x17, 0x08, 0x13, 0x39, 0x05, 0x06, 0x2e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x01, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0xe7, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0x03, 0x9a, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0xd1, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x02, 0xef, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x57, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x06, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x35, 0x26, 0x37, 0x36, 0x33, 0x16, 0x17, 0x16, 0x17, 0x33, 0x34, 0x37, 0x36, 0x21, 0x32, 0x17, 0x16, 0x15, 0x33, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x07, 0x14, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x05, 0x15, 0x18, 0x16, 0x36, 0x01, 0x2d, 0x97, 0x02, 0x8f, 0x37, 0x01, 0x09, 0x22, 0x38, 0x25, 0x1d, 0x19, 0x09, 0x01, 0x0c, 0x1f, 0xfd, 0x8f, 0x37, 0x1f, 0x0c, 0x01, 0x09, 0x19, 0x1d, 0x25, 0x39, 0x22, 0x09, 0x01, 0x38, 0x8f, 0x02, 0x97, 0x2d, 0x01, 0x36, 0x17, 0xfe, 0x43, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0x04, 0xc0, 0x0e, 0x25, 0x3f, 0x41, 0x3e, 0xcf, 0xbe, 0x44, 0x4c, 0x15, 0x19, 0x44, 0x01, 0x20, 0x20, 0x31, 0x0e, 0x1d, 0x47, 0x47, 0x1d, 0x0e, 0x31, 0x20, 0x20, 0x01, 0x44, 0x19, 0x15, 0x4c, 0x44, 0xbe, 0xcf, 0x3e, 0x41, 0x3f, 0x25, 0x0e, 0xfe, 0x2a, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0xaa, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x17, 0x00, 0x23, 0x00, 0x33, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x23, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x14, 0x06, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x06, 0x07, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x25, 0x37, 0x16, 0x17, 0x16, 0x04, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x21, 0x26, 0x27, 0x26, 0x21, 0x20, 0x07, 0x06, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0x4c, 0x63, 0x95, 0xd4, 0x96, 0x95, 0xd5, 0x95, 0x63, 0x4d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x4e, 0x67, 0x1a, 0x24, 0x80, 0x01, 0x6b, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0x56, 0x04, 0x1f, 0x14, 0x16, 0xc8, 0xfe, 0xe2, 0xfe, 0xe4, 0xca, 0x15, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0xc3, 0xa0, 0x4f, 0x64, 0x8e, 0x8e, 0x64, 0x64, 0x8e, 0x8e, 0x64, 0x4f, 0xa0, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x5b, 0x47, 0x2c, 0x26, 0x8d, 0x01, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x03, 0x3b, 0x1a, 0x19, 0xe0, 0xe0, 0x19, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x13, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x04, 0x22, 0x01, 0x80, 0xfc, 0x3f, 0x01, 0x7f, 0x61, 0xb6, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xe8, 0xfc, 0xd8, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0x8c, 0x87, 0x87, 0x87, 0x87, 0xfd, 0xac, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0x02, 0x39, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x11, 0x03, 0x60, 0xfc, 0xd1, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0x71, 0x87, 0x87, 0x02, 0x8c, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x04, 0x22, 0x01, 0x80, 0xfc, 0x3f, 0x01, 0x7f, 0xfe, 0xb1, 0x03, 0x60, 0xfb, 0x28, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0x8c, 0x87, 0x87, 0x87, 0x87, 0xfd, 0xe5, 0x87, 0x87, 0x01, 0x79, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x37, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x35, 0x21, 0x35, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x35, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x78, 0x03, 0x60, 0xfc, 0x68, 0x01, 0x53, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x01, 0x34, 0x01, 0x52, 0x34, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x05, 0x87, 0x87, 0x02, 0x2d, 0x87, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x03, 0x02, 0x87, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x03, 0x02, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x42, 0x00, 0x00, 0x01, 0x17, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x37, 0x01, 0x35, 0x21, 0x15, 0x13, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0xae, 0x3b, 0x18, 0x30, 0x45, 0x30, 0x18, 0xfc, 0x9d, 0x03, 0x60, 0x0a, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0xac, 0x80, 0x35, 0x4f, 0x36, 0x36, 0x4f, 0x35, 0xfe, 0x45, 0x87, 0x87, 0x02, 0xa5, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x13, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x11, 0x03, 0x60, 0x31, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0x71, 0x87, 0x87, 0x03, 0x17, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, 0x00, 0x00, 0x25, 0x27, 0x01, 0x17, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x53, 0x33, 0x03, 0x10, 0x33, 0xfc, 0xdf, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xac, 0x7b, 0x01, 0x96, 0x7b, 0x01, 0xbb, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x42, 0x00, 0x00, 0x01, 0x27, 0x13, 0x17, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x03, 0x37, 0x13, 0x03, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x02, 0x82, 0x56, 0xf3, 0x56, 0xfd, 0x9d, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x04, 0x68, 0xf3, 0x55, 0xf3, 0x8a, 0x2f, 0x25, 0x0a, 0x16, 0x3f, 0xb0, 0x3f, 0x19, 0x0b, 0x1f, 0x2f, 0x33, 0x1d, 0x6c, 0x0e, 0x16, 0x40, 0xb0, 0x3f, 0x19, 0x0b, 0x1f, 0x2f, 0x2f, 0x24, 0x0b, 0x15, 0x3f, 0xb1, 0x3f, 0x15, 0x0f, 0x6d, 0x1c, 0x03, 0x5c, 0x5f, 0x01, 0x0e, 0x5f, 0xfe, 0x80, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0xe6, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0xfe, 0x57, 0x69, 0x1d, 0x22, 0x62, 0x01, 0x63, 0x28, 0x21, 0x5f, 0x5f, 0x39, 0x28, 0x22, 0x62, 0x62, 0x28, 0x22, 0x5f, 0x69, 0x1e, 0x22, 0x62, 0x62, 0x22, 0x28, 0x39, 0x5f, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x03, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xb9, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0xfd, 0x08, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xfe, 0x24, 0x3e, 0x4e, 0x76, 0x8d, 0x58, 0x2e, 0x2e, 0x58, 0x8d, 0x76, 0x4e, 0x3e, 0x01, 0x23, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x17, 0x00, 0x22, 0x00, 0x29, 0x00, 0x36, 0x00, 0x42, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x06, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x35, 0x26, 0x37, 0x36, 0x33, 0x16, 0x17, 0x16, 0x17, 0x33, 0x34, 0x37, 0x36, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2d, 0x01, 0x17, 0x07, 0x17, 0x07, 0x25, 0x03, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0xc6, 0x17, 0x18, 0x36, 0x02, 0x2d, 0x97, 0x02, 0x8e, 0x38, 0x02, 0x09, 0x22, 0x3a, 0x24, 0x1d, 0x19, 0x09, 0x02, 0x0a, 0x1f, 0xfc, 0xb4, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x01, 0xc7, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x78, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0xfd, 0x08, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x02, 0xaf, 0x0e, 0x25, 0x3f, 0x41, 0x3e, 0xcf, 0xbe, 0x44, 0x4c, 0x15, 0x19, 0x44, 0x01, 0x20, 0x20, 0x31, 0x0e, 0x1d, 0x47, 0x01, 0x4e, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x64, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0xfe, 0x17, 0x3e, 0x4e, 0x76, 0x8d, 0x58, 0x2e, 0x2e, 0x58, 0x8d, 0x76, 0x4e, 0x3e, 0x01, 0x23, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x03, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0xe1, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9b, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xde, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0xfd, 0x08, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0x8c, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x5d, 0x3e, 0x4e, 0x76, 0x8d, 0x58, 0x2e, 0x2e, 0x58, 0x8d, 0x76, 0x4e, 0x3e, 0x01, 0x23, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x01, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x91, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0x02, 0x11, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0xe9, 0x3e, 0x4e, 0x76, 0x8d, 0x58, 0x2e, 0x2e, 0x58, 0x8d, 0x76, 0x4e, 0x3e, 0x02, 0xc1, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x25, 0x35, 0x21, 0x15, 0x23, 0x14, 0x06, 0x22, 0x26, 0x35, 0x21, 0x23, 0x14, 0x16, 0x32, 0x36, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0xc8, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x78, 0x03, 0x60, 0xda, 0x7e, 0xb0, 0x7e, 0x01, 0x33, 0xba, 0x37, 0x4c, 0x37, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x63, 0x87, 0x87, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x33, 0x00, 0x39, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2d, 0x01, 0x17, 0x07, 0x17, 0x07, 0x25, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x25, 0x35, 0x21, 0x15, 0x23, 0x14, 0x06, 0x22, 0x26, 0x35, 0x21, 0x23, 0x14, 0x16, 0x32, 0x36, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x01, 0xc7, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0xfd, 0x09, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x78, 0x03, 0x60, 0xda, 0x7e, 0xb0, 0x7e, 0x01, 0x33, 0xba, 0x37, 0x4c, 0x37, 0x03, 0xfd, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x64, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0xe8, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x63, 0x87, 0x87, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x05, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x01, 0x35, 0x21, 0x15, 0x23, 0x14, 0x06, 0x22, 0x26, 0x35, 0x21, 0x23, 0x14, 0x16, 0x32, 0x36, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x02, 0xe0, 0xfe, 0xf7, 0x46, 0xb3, 0xb3, 0x46, 0x01, 0x99, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0xfe, 0x08, 0x03, 0x60, 0xda, 0x7e, 0xb0, 0x7e, 0x01, 0x33, 0xba, 0x37, 0x4c, 0x37, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x02, 0xb1, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xce, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0xfe, 0x07, 0x87, 0x87, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x00, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, 0x00, 0x46, 0x00, 0x00, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x05, 0x7b, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x04, 0x16, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0x25, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x45, 0x00, 0x56, 0x00, 0x00, 0x25, 0x27, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x03, 0x73, 0x6d, 0x0e, 0x16, 0x3f, 0xb0, 0x3f, 0x16, 0x0e, 0x6c, 0x07, 0x07, 0x1b, 0x4c, 0x1b, 0x07, 0x02, 0x02, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x9f, 0x39, 0x28, 0x22, 0x62, 0x62, 0x22, 0x28, 0x39, 0x13, 0x10, 0x3c, 0x3c, 0x10, 0x03, 0x64, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0x25, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, 0x00, 0x46, 0x00, 0x00, 0x01, 0x17, 0x05, 0x27, 0x05, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x05, 0x07, 0x25, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x04, 0xf9, 0x45, 0xfe, 0xef, 0x45, 0xfe, 0x5a, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfe, 0x40, 0x01, 0x10, 0x45, 0xfe, 0xef, 0xfe, 0x55, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x05, 0x67, 0x6e, 0xd5, 0x6f, 0xde, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x01, 0xec, 0xd4, 0x6f, 0xd5, 0xfd, 0xf1, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0x25, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x00, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x37, 0x00, 0x42, 0x00, 0x46, 0x00, 0x56, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x05, 0x07, 0x25, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x17, 0x05, 0x27, 0x03, 0x27, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x01, 0xe7, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0xfe, 0xc4, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0xf1, 0x01, 0x10, 0x45, 0xfe, 0xef, 0x02, 0x06, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfd, 0xf8, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0xb7, 0x45, 0xfe, 0xef, 0x45, 0x75, 0x6d, 0x0e, 0x16, 0x3f, 0xb0, 0x3f, 0x16, 0x0e, 0x6c, 0x07, 0x07, 0x1b, 0x4c, 0x1b, 0x07, 0x01, 0x4c, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x01, 0xe5, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x03, 0xf1, 0xd4, 0x6f, 0xd5, 0xfe, 0xbc, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x01, 0xec, 0x6e, 0xd5, 0x6f, 0xfc, 0x0c, 0x39, 0x28, 0x22, 0x62, 0x62, 0x22, 0x28, 0x39, 0x13, 0x10, 0x3c, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x34, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x01, 0x14, 0x07, 0x06, 0x07, 0x17, 0x16, 0x07, 0x14, 0x07, 0x06, 0x22, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x02, 0xf4, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfe, 0xd3, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x03, 0x54, 0x3f, 0x34, 0x46, 0x1d, 0x19, 0x01, 0x18, 0x18, 0x45, 0x30, 0x18, 0x1d, 0x45, 0x35, 0x3f, 0x7a, 0x37, 0x4b, 0x37, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x03, 0x12, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfc, 0xc4, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x03, 0x83, 0x8c, 0x62, 0x51, 0x0e, 0x3f, 0x37, 0x23, 0x2b, 0x1a, 0x1b, 0x36, 0x2c, 0x23, 0x35, 0x3f, 0x0d, 0x52, 0x62, 0x8c, 0x53, 0x77, 0x77, 0x53, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x10, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x01, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x27, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0xe7, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x01, 0xbb, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x90, 0xfe, 0xf7, 0x46, 0xb3, 0xb3, 0x46, 0xfe, 0x29, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0x4c, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x03, 0x22, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0x55, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xfd, 0xf5, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x18, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x00, 0x01, 0x27, 0x13, 0x17, 0x01, 0x03, 0x37, 0x13, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x01, 0x17, 0x16, 0x0e, 0x01, 0x22, 0x26, 0x34, 0x37, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x82, 0x56, 0xf3, 0x56, 0x01, 0x8c, 0xf3, 0x55, 0xf3, 0xfc, 0x91, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x03, 0x78, 0x3b, 0x19, 0x01, 0x31, 0x44, 0x31, 0x19, 0xfb, 0x86, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x03, 0x5c, 0x5f, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0xfd, 0x91, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x03, 0x23, 0x80, 0x35, 0x4f, 0x36, 0x36, 0x4f, 0x35, 0xbe, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, 0x00, 0x3b, 0x00, 0x43, 0x00, 0x00, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x05, 0x7b, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x04, 0x16, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x0e, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x19, 0x00, 0x4e, 0x00, 0x5a, 0x00, 0x66, 0x00, 0x6c, 0x00, 0x78, 0x00, 0x84, 0x00, 0x8a, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9c, 0x00, 0xa2, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x05, 0x21, 0x34, 0x00, 0x20, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x15, 0x23, 0x11, 0x26, 0x27, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x22, 0x27, 0x23, 0x35, 0x26, 0x34, 0x37, 0x11, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x11, 0x16, 0x14, 0x07, 0x15, 0x23, 0x06, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x06, 0x07, 0x11, 0x23, 0x35, 0x06, 0x07, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x36, 0x37, 0x35, 0x06, 0x07, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x15, 0x16, 0x17, 0x35, 0x26, 0x27, 0x26, 0x27, 0x15, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x15, 0x16, 0x17, 0x25, 0x06, 0x07, 0x15, 0x36, 0x3f, 0x01, 0x06, 0x07, 0x15, 0x16, 0x17, 0x04, 0x21, 0x68, 0x43, 0x4c, 0x5f, 0x64, 0x47, 0x45, 0x66, 0xfe, 0x64, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x02, 0xec, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfb, 0x8b, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0x30, 0x3d, 0x1b, 0x21, 0x3d, 0x1b, 0x62, 0x80, 0x33, 0x3d, 0x27, 0x27, 0x1e, 0x1e, 0x3d, 0x1f, 0x1e, 0x27, 0x27, 0x3d, 0x32, 0x80, 0x63, 0x1a, 0x3d, 0x22, 0x1b, 0x3d, 0x31, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x03, 0xff, 0x1f, 0x15, 0x15, 0x1e, 0x1c, 0x17, 0x14, 0x20, 0xfd, 0xdb, 0x1d, 0x20, 0x20, 0x1d, 0xef, 0x67, 0x44, 0x47, 0x64, 0x5e, 0x4d, 0x42, 0x69, 0x78, 0x1f, 0x14, 0x18, 0x1b, 0x1d, 0x16, 0x15, 0x1e, 0x01, 0xe9, 0x20, 0x1c, 0x1d, 0x5c, 0x1e, 0x1f, 0x1c, 0x21, 0xf3, 0x1e, 0x1f, 0x27, 0x16, 0xfc, 0xad, 0x1f, 0x1d, 0x16, 0x26, 0xf3, 0x1f, 0x1d, 0x20, 0x1c, 0x04, 0x1a, 0x52, 0x6c, 0x75, 0x49, 0x4f, 0x6f, 0x6f, 0xfc, 0xe9, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0xe6, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x01, 0x37, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x9b, 0x85, 0xba, 0x01, 0x3b, 0x2e, 0x29, 0xfe, 0x6e, 0x59, 0x36, 0x47, 0x24, 0x40, 0x3c, 0x9c, 0x3c, 0x01, 0x3d, 0x04, 0x01, 0xfd, 0x6a, 0x02, 0x96, 0x01, 0x04, 0xfe, 0xc3, 0x3c, 0x9c, 0x3c, 0x40, 0x24, 0x46, 0x37, 0x59, 0x01, 0x93, 0x2a, 0x2e, 0xfe, 0xc5, 0xbc, 0x86, 0x9c, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x02, 0xa4, 0x18, 0x21, 0x21, 0x18, 0x16, 0x23, 0x20, 0xfc, 0x0a, 0x01, 0xa2, 0x0f, 0x12, 0xfe, 0x91, 0x4f, 0x6f, 0x6f, 0x4f, 0x49, 0x75, 0x6c, 0x52, 0x19, 0x20, 0x23, 0x16, 0x18, 0x21, 0x21, 0x01, 0x79, 0xa3, 0x01, 0x0a, 0x8c, 0x13, 0x28, 0x0a, 0x08, 0xf2, 0x14, 0x09, 0x26, 0x1e, 0x18, 0x84, 0x21, 0x2d, 0xd2, 0x19, 0x1d, 0x9c, 0x2d, 0x21, 0xfd, 0x07, 0x0b, 0xc3, 0x09, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x00, 0x01, 0x27, 0x13, 0x17, 0x01, 0x03, 0x37, 0x13, 0x01, 0x27, 0x13, 0x17, 0x01, 0x03, 0x37, 0x13, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x02, 0x82, 0x56, 0xf3, 0x56, 0x01, 0x8c, 0xf3, 0x55, 0xf3, 0xfd, 0x2c, 0x56, 0xf3, 0x56, 0x01, 0x8c, 0xf3, 0x55, 0xf3, 0xfb, 0x43, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x04, 0x13, 0x5f, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0xfe, 0x58, 0x5f, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x3f, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, 0x00, 0x41, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x03, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x05, 0x30, 0x4d, 0x21, 0x1c, 0x17, 0x13, 0x0c, 0x0c, 0x20, 0x10, 0x09, 0x04, 0x0b, 0x23, 0x1c, 0x35, 0x10, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x02, 0xc8, 0x74, 0x32, 0x0f, 0x0b, 0x04, 0x0c, 0x22, 0x14, 0x15, 0x0e, 0x0f, 0x24, 0x14, 0x10, 0x01, 0xc0, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x00, 0x01, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x27, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x04, 0x09, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x90, 0xfe, 0xf7, 0x46, 0xb3, 0xb3, 0x46, 0xfe, 0x29, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x04, 0x27, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0x55, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xfd, 0xf5, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x55, 0xff, 0x6a, 0x08, 0x14, 0x06, 0x6e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x3d, 0x00, 0x62, 0x00, 0x00, 0x25, 0x21, 0x34, 0x00, 0x20, 0x00, 0x01, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x05, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x14, 0x07, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x02, 0x07, 0x02, 0x21, 0x20, 0x03, 0x26, 0x03, 0x07, 0x06, 0x07, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x26, 0x37, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x17, 0x16, 0x17, 0x26, 0x27, 0x26, 0x21, 0x20, 0x07, 0x06, 0x07, 0x36, 0x3f, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x06, 0x05, 0xfa, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfd, 0xf2, 0xfe, 0xf7, 0x45, 0xb2, 0xb2, 0x45, 0x01, 0x99, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0xfc, 0x90, 0x01, 0xda, 0x01, 0x4e, 0x01, 0x50, 0x01, 0xd8, 0x02, 0x54, 0x35, 0x15, 0x1b, 0x30, 0x45, 0x1c, 0x16, 0x10, 0x0a, 0x26, 0xbc, 0xec, 0xfe, 0xb0, 0xfe, 0xb2, 0xed, 0xbc, 0x27, 0x09, 0x10, 0x17, 0x1c, 0x44, 0x30, 0x1a, 0x15, 0x36, 0x53, 0x02, 0x7a, 0x01, 0x92, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x90, 0x01, 0x18, 0x21, 0x22, 0x1c, 0x17, 0x10, 0x29, 0x7b, 0x25, 0x15, 0x2a, 0x8b, 0xc7, 0xfe, 0xe1, 0xfe, 0xe4, 0xca, 0x8a, 0x2a, 0x15, 0x25, 0x7a, 0x28, 0x10, 0x17, 0x1c, 0x44, 0x18, 0x01, 0xcb, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x02, 0x74, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xce, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0xe8, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0x1d, 0x1b, 0x1f, 0x14, 0x18, 0x1f, 0x25, 0x26, 0x36, 0x1f, 0x19, 0x39, 0x20, 0xfe, 0xe9, 0xd1, 0xfe, 0xfa, 0x01, 0x06, 0xd0, 0x01, 0x16, 0x1e, 0x39, 0x19, 0x1f, 0x36, 0x26, 0x25, 0x1f, 0x19, 0x13, 0x1e, 0x1c, 0x1d, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x14, 0x13, 0x1a, 0x1f, 0x19, 0x39, 0x88, 0x2d, 0x0e, 0x0f, 0xc7, 0x9a, 0xe0, 0xe0, 0x9b, 0xc6, 0x10, 0x0d, 0x2d, 0x88, 0x39, 0x19, 0x1f, 0x1b, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x07, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x00, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0xdb, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0xfe, 0xe0, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0x5a, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0x03, 0x3b, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x02, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0x7b, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x44, 0x5f, 0x43, 0x43, 0x5f, 0xfd, 0x07, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x16, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xfe, 0x14, 0x6a, 0x4b, 0x4b, 0x6a, 0x4b, 0x01, 0xa6, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x08, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x00, 0x01, 0x17, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x37, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0xae, 0x3b, 0x18, 0x30, 0x45, 0x30, 0x18, 0xfd, 0x67, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0x02, 0x19, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0xac, 0x80, 0x35, 0x4f, 0x36, 0x36, 0x4f, 0x35, 0xfe, 0x2e, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0x03, 0x52, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x07, 0x00, 0x1f, 0xff, 0x3c, 0x07, 0x63, 0x06, 0x6e, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x6b, 0x00, 0x94, 0x00, 0x00, 0x00, 0x26, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x20, 0x26, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x2f, 0x01, 0x25, 0x17, 0x05, 0x25, 0x37, 0x05, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x35, 0x2e, 0x01, 0x27, 0x02, 0x11, 0x34, 0x36, 0x37, 0x36, 0x37, 0x12, 0x20, 0x13, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x10, 0x03, 0x0e, 0x01, 0x07, 0x15, 0x23, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x13, 0x34, 0x26, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x1d, 0x01, 0x23, 0x35, 0x06, 0x22, 0x27, 0x15, 0x23, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x22, 0x06, 0x15, 0x12, 0x17, 0x16, 0x17, 0x16, 0x1d, 0x01, 0x25, 0x16, 0x32, 0x37, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x07, 0x16, 0x17, 0x1e, 0x02, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x04, 0x93, 0x49, 0x4a, 0x68, 0x4b, 0x4b, 0xfd, 0x8f, 0x49, 0x49, 0x69, 0x4a, 0x4a, 0xed, 0x45, 0x01, 0x36, 0x45, 0x02, 0x3e, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfd, 0x1b, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0xfd, 0xde, 0x41, 0x4e, 0x15, 0x7c, 0x5d, 0x37, 0x35, 0x9d, 0xec, 0x02, 0x9f, 0xec, 0x9c, 0x35, 0x37, 0x5e, 0x7c, 0x16, 0x4d, 0x41, 0x7a, 0x23, 0x74, 0x1a, 0x6e, 0x01, 0x23, 0x34, 0x21, 0x06, 0x0c, 0x5f, 0x25, 0x32, 0x55, 0x23, 0x18, 0x7a, 0x63, 0xeb, 0x6d, 0x7b, 0x18, 0x23, 0x55, 0x32, 0x25, 0x5e, 0x0d, 0x05, 0x22, 0x34, 0x23, 0x02, 0x6e, 0x1a, 0x74, 0x22, 0x01, 0x2b, 0x6b, 0xee, 0x62, 0x18, 0x2b, 0x83, 0x32, 0x0f, 0x36, 0x10, 0x01, 0x08, 0x0a, 0x0b, 0x2e, 0x0e, 0x0f, 0x2d, 0x81, 0xc8, 0xfd, 0xc6, 0xca, 0x81, 0x2d, 0x10, 0x0d, 0x2e, 0x16, 0x07, 0x02, 0x0f, 0x36, 0x0f, 0x33, 0x82, 0x2c, 0x18, 0x03, 0x28, 0x53, 0x75, 0x51, 0x51, 0x75, 0x53, 0x53, 0x75, 0x51, 0x51, 0x76, 0x52, 0xee, 0x6e, 0xf1, 0x6f, 0xf0, 0xf0, 0x6f, 0xf1, 0xfc, 0xd6, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0xfe, 0x78, 0xcb, 0x3e, 0x5b, 0x31, 0x01, 0x17, 0x01, 0x27, 0x53, 0x6b, 0x0a, 0xdf, 0xb0, 0x01, 0x08, 0xfe, 0xf8, 0xaf, 0xe0, 0x0a, 0x6b, 0x53, 0xfe, 0xd9, 0xfe, 0xe9, 0x31, 0x5b, 0x3e, 0xcb, 0xe7, 0x24, 0x1f, 0x6e, 0x39, 0xf0, 0x01, 0x12, 0x1c, 0x28, 0x23, 0x6d, 0xf3, 0x71, 0x2c, 0x25, 0x40, 0x1c, 0x3c, 0x3f, 0xfb, 0x4c, 0x1e, 0x20, 0x4e, 0xfb, 0x3f, 0x3c, 0x1c, 0x40, 0x25, 0x2c, 0x71, 0xf3, 0x6d, 0x23, 0x28, 0x1c, 0xfe, 0xee, 0xf0, 0x39, 0x6e, 0x1f, 0x24, 0xe7, 0xdb, 0x26, 0x25, 0x21, 0x59, 0x3b, 0x65, 0x56, 0x22, 0x13, 0x44, 0x78, 0x0f, 0x86, 0x38, 0x36, 0x30, 0x0e, 0x0a, 0xb5, 0x90, 0xe0, 0xe0, 0x8f, 0xb5, 0x0b, 0x0e, 0x30, 0x6e, 0x86, 0x0f, 0x78, 0x44, 0x13, 0x22, 0x56, 0x65, 0x3b, 0x59, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x5b, 0x00, 0x67, 0x00, 0x00, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x02, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x8d, 0x83, 0x53, 0x60, 0x76, 0x7d, 0x59, 0x55, 0x81, 0x68, 0x81, 0x56, 0x59, 0x7d, 0x77, 0x5f, 0x53, 0x84, 0x2c, 0x68, 0x43, 0x4c, 0x5f, 0x64, 0x47, 0x45, 0x66, 0x77, 0x1f, 0x15, 0x15, 0x1e, 0x1c, 0x17, 0x14, 0x20, 0xfe, 0xca, 0x67, 0x44, 0x47, 0x64, 0x5e, 0x4d, 0x42, 0x69, 0x78, 0x1f, 0x14, 0x18, 0x1b, 0x1d, 0x16, 0x15, 0x1e, 0x0f, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0xfd, 0x37, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x1a, 0x66, 0x88, 0x93, 0x5b, 0x63, 0x8b, 0x8b, 0x63, 0x63, 0x8b, 0x8b, 0x63, 0x5b, 0x93, 0x88, 0x66, 0x52, 0x6c, 0x75, 0x49, 0x4f, 0x6f, 0x6f, 0x4f, 0x18, 0x21, 0x21, 0x18, 0x16, 0x23, 0x20, 0x19, 0x4f, 0x6f, 0x6f, 0x4f, 0x49, 0x75, 0x6c, 0x52, 0x19, 0x20, 0x23, 0x16, 0x18, 0x21, 0x21, 0xfd, 0x28, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0x02, 0x26, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x0a, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x4a, 0x00, 0x56, 0x00, 0x5e, 0x00, 0x62, 0x00, 0x66, 0x00, 0x6b, 0x00, 0x70, 0x00, 0x74, 0x00, 0x79, 0x00, 0x7e, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x11, 0x23, 0x11, 0x26, 0x27, 0x15, 0x17, 0x07, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x27, 0x37, 0x17, 0x35, 0x26, 0x20, 0x07, 0x15, 0x37, 0x17, 0x07, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x27, 0x37, 0x35, 0x06, 0x07, 0x11, 0x23, 0x11, 0x06, 0x07, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x24, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x13, 0x11, 0x33, 0x11, 0x13, 0x33, 0x35, 0x27, 0x17, 0x33, 0x35, 0x07, 0x27, 0x11, 0x15, 0x17, 0x35, 0x26, 0x01, 0x35, 0x07, 0x15, 0x03, 0x06, 0x07, 0x15, 0x37, 0x11, 0x35, 0x07, 0x27, 0x15, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0x3a, 0x3d, 0x1b, 0x22, 0x05, 0x05, 0x3d, 0x2f, 0x3d, 0x3d, 0x3e, 0x3d, 0x3d, 0x3d, 0x3d, 0x51, 0x45, 0x87, 0x96, 0xfe, 0x8b, 0x96, 0x87, 0x45, 0x52, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x2e, 0x3e, 0x05, 0x05, 0x21, 0x1c, 0x3d, 0x3b, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x02, 0xb5, 0x44, 0x5f, 0x43, 0x43, 0x5f, 0x11, 0x3d, 0xf5, 0x3d, 0x3d, 0x7a, 0x2f, 0x03, 0x2c, 0x2f, 0x17, 0xfd, 0x47, 0x3d, 0x3e, 0x18, 0x16, 0x2e, 0x2c, 0x02, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0xaa, 0x8f, 0xfe, 0x85, 0x01, 0xf3, 0x2c, 0x28, 0x67, 0x04, 0x09, 0xfe, 0x2d, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x02, 0x38, 0xfe, 0xd7, 0x01, 0x10, 0x3f, 0x6f, 0x69, 0x7b, 0x60, 0x60, 0x7b, 0x69, 0x6f, 0x3f, 0xfe, 0xf0, 0x01, 0x29, 0xfd, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x01, 0xd3, 0x09, 0x04, 0x68, 0x28, 0x2c, 0xfe, 0x0c, 0x01, 0x7d, 0x90, 0xab, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x19, 0x6a, 0x4b, 0x4b, 0x6a, 0x4b, 0x01, 0x64, 0x02, 0x38, 0xfd, 0xc8, 0x01, 0x0f, 0xb1, 0x2f, 0xe0, 0x63, 0x04, 0x22, 0x01, 0x23, 0x7f, 0x24, 0x7a, 0x16, 0xfe, 0x6f, 0xe0, 0x2f, 0xb1, 0x01, 0xa4, 0x13, 0x17, 0x79, 0x24, 0xfe, 0xdb, 0x81, 0x22, 0x04, 0x63, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x0b, 0x33, 0x07, 0x6c, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x49, 0x00, 0x55, 0x00, 0x00, 0x01, 0x21, 0x15, 0x03, 0x33, 0x15, 0x21, 0x35, 0x13, 0x23, 0x25, 0x21, 0x15, 0x03, 0x33, 0x15, 0x21, 0x35, 0x13, 0x23, 0x25, 0x21, 0x15, 0x03, 0x33, 0x15, 0x21, 0x35, 0x13, 0x23, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x09, 0xdd, 0x01, 0x55, 0xdf, 0xdf, 0xfe, 0xa2, 0xe0, 0xd7, 0xfe, 0x48, 0x01, 0x55, 0xdf, 0xdf, 0xfe, 0xa2, 0xe0, 0xd7, 0xfe, 0x48, 0x01, 0x55, 0xdf, 0xdf, 0xfe, 0xa2, 0xdf, 0xd6, 0xfc, 0xe1, 0x44, 0x5f, 0x43, 0x43, 0x5f, 0x02, 0x10, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x07, 0x6c, 0x68, 0xfe, 0xf4, 0x5c, 0x68, 0x01, 0x0c, 0x5c, 0x68, 0xfe, 0xf4, 0x5c, 0x68, 0x01, 0x0c, 0x5c, 0x68, 0xfe, 0xf4, 0x5c, 0x68, 0x01, 0x0c, 0xfa, 0x7f, 0x6a, 0x4b, 0x4b, 0x6a, 0x4b, 0x03, 0x44, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x37, 0x00, 0x00, 0x01, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x04, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x02, 0x53, 0x56, 0x66, 0x66, 0x56, 0x66, 0x66, 0x56, 0x66, 0x66, 0x56, 0x66, 0xfe, 0x59, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x02, 0x42, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0x01, 0x01, 0x55, 0x65, 0x65, 0x55, 0x66, 0x67, 0x55, 0x66, 0x66, 0x55, 0x67, 0x03, 0x28, 0x5f, 0x71, 0x72, 0x5f, 0x71, 0x71, 0x5f, 0x72, 0x71, 0x5f, 0x71, 0xaf, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x1c, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0x02, 0x64, 0x5f, 0x71, 0x72, 0x5f, 0x71, 0x71, 0x5f, 0x72, 0x71, 0x5f, 0x71, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0xfd, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x0a, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x37, 0x00, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x35, 0x21, 0x15, 0x33, 0x35, 0x21, 0x15, 0x25, 0x27, 0x25, 0x17, 0x05, 0x25, 0x37, 0x05, 0x01, 0x21, 0x11, 0x21, 0x01, 0x21, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x07, 0x01, 0x11, 0x27, 0x12, 0x01, 0x02, 0x27, 0x26, 0x21, 0x20, 0x07, 0x06, 0x03, 0x17, 0x21, 0x99, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x48, 0x01, 0x7f, 0xc2, 0x01, 0x80, 0xfc, 0x65, 0x45, 0x01, 0x36, 0x45, 0x02, 0x3e, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x9a, 0x02, 0xce, 0xfd, 0x32, 0x02, 0xff, 0xfc, 0xd1, 0xb0, 0xe7, 0xe8, 0xf9, 0xb6, 0x14, 0xca, 0xfc, 0x3f, 0xcc, 0x14, 0x05, 0x41, 0x18, 0xab, 0xc8, 0xfe, 0xe2, 0xfe, 0xe4, 0xca, 0xab, 0x19, 0xca, 0x03, 0xc1, 0x02, 0xea, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0xba, 0x87, 0x87, 0x87, 0x87, 0xe6, 0x6e, 0xf1, 0x6f, 0xf0, 0xf0, 0x6f, 0xf1, 0xfc, 0x87, 0x01, 0x18, 0xfe, 0x61, 0x93, 0xd9, 0xc9, 0x01, 0x11, 0x9e, 0xfe, 0xc4, 0x01, 0x3c, 0x9e, 0xfe, 0xef, 0x01, 0xb3, 0x01, 0x02, 0xbf, 0xe0, 0xe0, 0xbf, 0xfe, 0xff, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x34, 0xff, 0x6a, 0x07, 0x56, 0x07, 0x14, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x52, 0x00, 0x8f, 0x00, 0x9d, 0x00, 0xab, 0x00, 0xb5, 0x00, 0xbb, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x17, 0x16, 0x33, 0x32, 0x37, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x20, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x16, 0x33, 0x32, 0x01, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x25, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x32, 0x16, 0x15, 0x21, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x32, 0x16, 0x15, 0x01, 0x26, 0x27, 0x06, 0x07, 0x15, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x15, 0x36, 0x37, 0x06, 0x23, 0x05, 0x35, 0x23, 0x22, 0x27, 0x16, 0x03, 0x88, 0x75, 0x52, 0x38, 0x6c, 0x59, 0x5b, 0x6a, 0x38, 0x90, 0x66, 0x69, 0x8e, 0x83, 0x05, 0x1a, 0x31, 0xf7, 0xfe, 0xbf, 0xf8, 0x35, 0x20, 0x03, 0x86, 0x90, 0x6d, 0xfd, 0xa0, 0x07, 0x01, 0x2b, 0x05, 0xfe, 0xd5, 0x07, 0x0d, 0x01, 0x15, 0x14, 0xfe, 0xe7, 0x10, 0x14, 0x5c, 0x93, 0xa3, 0x01, 0xb9, 0xa3, 0x90, 0x5d, 0x17, 0x0f, 0xfe, 0xec, 0x13, 0x01, 0x10, 0x0d, 0x07, 0xfe, 0xdb, 0x04, 0x01, 0x26, 0x06, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x73, 0x04, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x04, 0x5e, 0x03, 0x60, 0x08, 0x13, 0x5e, 0x14, 0x5a, 0x11, 0x18, 0x69, 0xac, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xad, 0x68, 0x1b, 0x0e, 0x55, 0x13, 0x58, 0x12, 0x08, 0x5b, 0x04, 0x02, 0xe0, 0x13, 0x2d, 0x3b, 0x2c, 0x13, 0x79, 0x7e, 0xb0, 0x7e, 0x01, 0x9b, 0x13, 0x2c, 0x3b, 0x2c, 0x13, 0x7a, 0x7e, 0xb1, 0x7e, 0xfe, 0x67, 0x20, 0x24, 0x18, 0x2d, 0x27, 0x21, 0x24, 0x1d, 0x7b, 0x56, 0x2e, 0x41, 0x34, 0xfe, 0x73, 0x13, 0x39, 0x38, 0x2e, 0x02, 0xfc, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0xfc, 0x25, 0x42, 0x20, 0x19, 0x44, 0x47, 0x81, 0x93, 0x8f, 0x7d, 0x4b, 0x53, 0x17, 0x17, 0x42, 0x01, 0xc7, 0x24, 0x62, 0x15, 0x43, 0x16, 0x4a, 0x41, 0x69, 0x3f, 0x6c, 0x3a, 0x31, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x38, 0x35, 0x6a, 0x3f, 0x67, 0x3e, 0x4c, 0x15, 0x43, 0x15, 0x52, 0x34, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0xbd, 0x4d, 0x45, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x44, 0x4d, 0x07, 0x44, 0x07, 0x56, 0x57, 0x24, 0x40, 0x22, 0x3c, 0x3c, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x40, 0x36, 0x20, 0x40, 0x22, 0x4f, 0x60, 0x07, 0x44, 0x51, 0x2b, 0x5a, 0x45, 0x45, 0x59, 0x2c, 0x8c, 0xc4, 0xc4, 0x8c, 0x2b, 0x5a, 0x45, 0x45, 0x59, 0x2c, 0x8c, 0xc4, 0xc4, 0x8c, 0xfe, 0x03, 0x07, 0x0b, 0x07, 0x0a, 0x91, 0x05, 0x04, 0x84, 0x63, 0x27, 0x46, 0x0a, 0x61, 0x61, 0x09, 0x43, 0x00, 0x00, 0x09, 0x00, 0x56, 0xff, 0x6a, 0x08, 0x13, 0x07, 0x14, 0x00, 0x3f, 0x00, 0x48, 0x00, 0x5d, 0x00, 0xa8, 0x00, 0xb6, 0x00, 0xc4, 0x00, 0xce, 0x00, 0xd4, 0x00, 0xda, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x20, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x36, 0x3f, 0x01, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x06, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x17, 0x16, 0x04, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x17, 0x16, 0x33, 0x32, 0x37, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x20, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x16, 0x33, 0x32, 0x05, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x34, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x02, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x26, 0x27, 0x07, 0x06, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x32, 0x16, 0x15, 0x21, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x32, 0x16, 0x15, 0x01, 0x26, 0x27, 0x06, 0x07, 0x15, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x15, 0x36, 0x37, 0x06, 0x23, 0x05, 0x35, 0x23, 0x22, 0x27, 0x16, 0x06, 0xf4, 0x02, 0x09, 0x09, 0x14, 0x03, 0x18, 0x26, 0xd9, 0x8b, 0x68, 0xfe, 0xe7, 0x69, 0x88, 0xdc, 0x26, 0x19, 0x04, 0x13, 0x09, 0x09, 0x01, 0x16, 0x48, 0x7a, 0x27, 0x0f, 0x2e, 0x28, 0x2b, 0x19, 0x07, 0x0e, 0x01, 0x15, 0x14, 0xfe, 0xe7, 0x11, 0x13, 0x5c, 0x94, 0xa3, 0x01, 0xb8, 0xa4, 0x91, 0x5c, 0x18, 0x0e, 0xfe, 0xeb, 0x14, 0x01, 0x0f, 0x0f, 0x07, 0x19, 0x2b, 0x28, 0x2f, 0x0e, 0x2a, 0x7d, 0x49, 0xfd, 0x1b, 0x75, 0x53, 0x37, 0x6c, 0x58, 0x5c, 0x6a, 0x38, 0x90, 0x67, 0x68, 0x8e, 0x84, 0x05, 0x1b, 0x31, 0xf6, 0xfe, 0xbf, 0xf8, 0x36, 0x1f, 0x02, 0x87, 0x90, 0x6c, 0xfc, 0xd6, 0x21, 0x32, 0x38, 0x2f, 0x51, 0x07, 0x5c, 0x04, 0x5a, 0x05, 0x07, 0x10, 0x0b, 0x1d, 0x04, 0x15, 0x22, 0x0d, 0x36, 0x81, 0xe3, 0x55, 0x5e, 0xcb, 0x5f, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x14, 0x04, 0x1c, 0x0b, 0x12, 0x06, 0x04, 0x5e, 0x04, 0x5f, 0x06, 0x03, 0x51, 0x2e, 0x36, 0x30, 0x21, 0x27, 0x2f, 0x10, 0x0d, 0x15, 0x28, 0x68, 0xad, 0xc3, 0xfd, 0xfa, 0xc4, 0xad, 0x68, 0x26, 0x18, 0x0e, 0x20, 0x02, 0x9a, 0x14, 0x2b, 0x3c, 0x2d, 0x12, 0x7a, 0x7e, 0xb0, 0x7e, 0x01, 0x9c, 0x13, 0x2c, 0x3b, 0x2d, 0x12, 0x7a, 0x7e, 0xb0, 0x7e, 0xfe, 0x67, 0x20, 0x24, 0x17, 0x2d, 0x27, 0x21, 0x24, 0x1c, 0x7b, 0x56, 0x2f, 0x41, 0x34, 0xfe, 0x72, 0x12, 0x38, 0x39, 0x2f, 0x03, 0x7c, 0x28, 0x2c, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x2a, 0x27, 0x2c, 0x19, 0x2c, 0x88, 0x33, 0x3c, 0x25, 0x57, 0x4c, 0x69, 0x3f, 0x6c, 0x3a, 0x31, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x38, 0x35, 0x6a, 0x3f, 0x67, 0x44, 0x60, 0x28, 0x3c, 0x33, 0x88, 0x2c, 0x19, 0xaf, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0xfc, 0x25, 0x42, 0x20, 0x19, 0x44, 0x47, 0x81, 0x93, 0x8f, 0x7d, 0x4b, 0x53, 0x17, 0x17, 0x42, 0x41, 0x36, 0x25, 0x2c, 0x34, 0x11, 0x1d, 0x03, 0x4a, 0x07, 0x44, 0x06, 0x4d, 0x45, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x44, 0x4d, 0x07, 0x44, 0x07, 0x34, 0x19, 0x1d, 0x11, 0x34, 0x2c, 0x25, 0x36, 0x3c, 0x33, 0x2a, 0x68, 0x62, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x5d, 0x70, 0x2d, 0x6f, 0x01, 0xc4, 0x2b, 0x5a, 0x45, 0x45, 0x59, 0x2c, 0x8c, 0xc4, 0xc4, 0x8c, 0x2b, 0x5a, 0x45, 0x45, 0x59, 0x2c, 0x8c, 0xc4, 0xc4, 0x8c, 0xfe, 0x03, 0x07, 0x0b, 0x07, 0x0a, 0x91, 0x05, 0x04, 0x84, 0x63, 0x27, 0x46, 0x0a, 0x61, 0x61, 0x09, 0x43, 0x00, 0x09, 0x00, 0x34, 0xff, 0x6a, 0x07, 0x56, 0x07, 0x14, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x5f, 0x00, 0x9c, 0x00, 0xaa, 0x00, 0xb4, 0x00, 0xc3, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x17, 0x16, 0x33, 0x32, 0x37, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x20, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x16, 0x33, 0x32, 0x17, 0x06, 0x23, 0x22, 0x27, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x06, 0x23, 0x22, 0x01, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x37, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x03, 0x88, 0x75, 0x52, 0x38, 0x6c, 0x59, 0x5b, 0x6a, 0x38, 0x90, 0x66, 0x69, 0x8e, 0x83, 0x05, 0x1a, 0x31, 0xf7, 0xfe, 0xbf, 0xf8, 0x35, 0x20, 0x03, 0x86, 0x90, 0x6d, 0x65, 0x67, 0x6b, 0x39, 0x38, 0x2f, 0xad, 0xd3, 0xaa, 0x2d, 0x41, 0x34, 0x69, 0xfc, 0xd6, 0x07, 0x01, 0x2b, 0x05, 0xfe, 0xd5, 0x07, 0x0d, 0x01, 0x15, 0x14, 0xfe, 0xe7, 0x10, 0x14, 0x5c, 0x93, 0xa3, 0x01, 0xb9, 0xa3, 0x90, 0x5d, 0x17, 0x0f, 0xfe, 0xec, 0x13, 0x01, 0x10, 0x0d, 0x07, 0xfe, 0xdb, 0x04, 0x01, 0x26, 0x06, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x73, 0x04, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x04, 0x5e, 0x03, 0x60, 0x08, 0x13, 0x5e, 0x14, 0x5a, 0x11, 0x18, 0x69, 0xac, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xad, 0x68, 0x1b, 0x0e, 0x55, 0x13, 0x58, 0x12, 0x08, 0x5b, 0x04, 0x01, 0xb2, 0x59, 0x3c, 0x38, 0x54, 0x06, 0x2b, 0x44, 0x1e, 0x24, 0x3c, 0x33, 0x07, 0xe4, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x13, 0x02, 0xb2, 0x07, 0x33, 0x3c, 0x21, 0x21, 0x45, 0x2a, 0x07, 0x2d, 0x28, 0x36, 0x3c, 0x59, 0x94, 0x0b, 0x18, 0x29, 0x26, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x02, 0xfc, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0xfc, 0x25, 0x42, 0x20, 0x19, 0x44, 0x47, 0x81, 0x93, 0x8f, 0x7d, 0x4b, 0x53, 0x17, 0x17, 0x42, 0x68, 0x1f, 0x09, 0x45, 0x4c, 0x4d, 0x45, 0x0a, 0x02, 0x4e, 0x24, 0x62, 0x15, 0x43, 0x16, 0x4a, 0x41, 0x69, 0x3f, 0x6c, 0x3a, 0x31, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x38, 0x35, 0x6a, 0x3f, 0x67, 0x3e, 0x4c, 0x15, 0x43, 0x15, 0x52, 0x34, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0xbd, 0x4d, 0x45, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x44, 0x4d, 0x07, 0x44, 0x07, 0x56, 0x57, 0x24, 0x40, 0x22, 0x3c, 0x3c, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x40, 0x36, 0x20, 0x40, 0x22, 0x4f, 0x60, 0x07, 0x44, 0x9f, 0x46, 0x5f, 0x57, 0x3b, 0x45, 0x18, 0x0b, 0x21, 0x17, 0x49, 0x2b, 0x20, 0x0d, 0x0d, 0x06, 0x2f, 0x21, 0x0f, 0x2d, 0x1d, 0x17, 0x21, 0x0c, 0x19, 0x43, 0x42, 0x2a, 0x26, 0x5f, 0x7a, 0x03, 0x14, 0x15, 0x19, 0x0c, 0x0b, 0x03, 0x35, 0x00, 0x06, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x11, 0x00, 0x19, 0x00, 0x4a, 0x00, 0x83, 0x00, 0x98, 0x00, 0xad, 0x00, 0x00, 0x01, 0x37, 0x16, 0x33, 0x32, 0x37, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x01, 0x17, 0x06, 0x22, 0x27, 0x37, 0x16, 0x32, 0x25, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x25, 0x32, 0x16, 0x17, 0x33, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x06, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x35, 0x34, 0x36, 0x02, 0x62, 0x53, 0x3e, 0x52, 0x34, 0x4c, 0x4b, 0x35, 0x51, 0x3f, 0x52, 0x61, 0x81, 0x43, 0x3d, 0x3e, 0x42, 0x82, 0x01, 0x8c, 0x38, 0x6e, 0xae, 0x6e, 0x38, 0x51, 0x78, 0x02, 0x75, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x5d, 0x94, 0xa3, 0x01, 0xb9, 0xa3, 0x93, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfb, 0x46, 0x0f, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xaf, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xae, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x02, 0x99, 0x09, 0x34, 0x29, 0x29, 0x38, 0x38, 0x8f, 0x02, 0x97, 0x2c, 0x02, 0x3a, 0x2a, 0x37, 0x1f, 0x0c, 0x01, 0x7e, 0x28, 0x34, 0x09, 0x01, 0x0c, 0x1f, 0x37, 0x2b, 0x39, 0x01, 0x2d, 0x97, 0x02, 0x8f, 0x37, 0x37, 0x01, 0x8c, 0x62, 0x40, 0x2c, 0x2c, 0x40, 0x62, 0x64, 0x1c, 0x1c, 0x01, 0xa8, 0x78, 0x3d, 0x3d, 0x78, 0x2e, 0x38, 0x82, 0x74, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x74, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0xe7, 0x77, 0x84, 0x84, 0x77, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x3d, 0x7c, 0x8f, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x8f, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0x8e, 0x9e, 0x9e, 0x8c, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0x01, 0x95, 0x30, 0x42, 0x3d, 0x31, 0x4a, 0x4a, 0xbe, 0xcf, 0x3d, 0x42, 0x2a, 0x48, 0x47, 0x1b, 0x10, 0x72, 0x42, 0x30, 0x10, 0x1b, 0x47, 0x48, 0x2a, 0x42, 0x3d, 0xcf, 0xbe, 0x4a, 0x4a, 0x31, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x28, 0x00, 0x37, 0x00, 0x44, 0x00, 0x75, 0x00, 0xae, 0x00, 0xb8, 0x00, 0x00, 0x01, 0x05, 0x07, 0x2d, 0x01, 0x17, 0x05, 0x27, 0x13, 0x17, 0x06, 0x22, 0x27, 0x37, 0x16, 0x32, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x01, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x02, 0x8a, 0x01, 0x10, 0x45, 0xfe, 0xef, 0x02, 0xb5, 0x45, 0xfe, 0xef, 0x45, 0x67, 0x38, 0x6e, 0xae, 0x6e, 0x38, 0x51, 0x78, 0xea, 0x26, 0x49, 0x1d, 0x24, 0x3f, 0x31, 0x12, 0x2f, 0x2b, 0x3a, 0x3f, 0x5b, 0x46, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x14, 0x01, 0x8c, 0x04, 0x5a, 0x3f, 0x3c, 0x2a, 0x30, 0x13, 0x31, 0x3f, 0x24, 0x1d, 0x49, 0x6d, 0x0b, 0x18, 0x2b, 0x24, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x01, 0x6b, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x5d, 0x94, 0xa3, 0x01, 0xb9, 0xa3, 0x93, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfb, 0x46, 0x0f, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xaf, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xae, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x03, 0x8a, 0xb6, 0x80, 0x24, 0x19, 0x68, 0x1f, 0x30, 0xa3, 0xe9, 0x05, 0x67, 0xd4, 0x6f, 0xd5, 0x6e, 0x6e, 0xd5, 0x6f, 0xfe, 0x3d, 0x78, 0x3d, 0x3d, 0x78, 0x2e, 0x01, 0x06, 0x4c, 0x1c, 0x0b, 0x23, 0x24, 0x2d, 0x47, 0x30, 0x2c, 0x61, 0x26, 0x30, 0x24, 0x0e, 0x0f, 0x07, 0x34, 0x25, 0x11, 0x1d, 0x43, 0x61, 0x2c, 0x30, 0x47, 0x2d, 0x24, 0x23, 0x0b, 0x1c, 0x04, 0x03, 0x16, 0x18, 0x1c, 0x0e, 0x0c, 0x03, 0x3b, 0xa7, 0x82, 0x74, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x74, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0xe7, 0x77, 0x84, 0x84, 0x77, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x3d, 0x7c, 0x8f, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x8f, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0x8e, 0x9e, 0x9e, 0x8c, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0xfe, 0x7f, 0x8e, 0x28, 0x2b, 0x48, 0x36, 0x35, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x27, 0x00, 0x34, 0x00, 0x69, 0x00, 0xa8, 0x00, 0xb5, 0x00, 0xbe, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3f, 0x01, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x00, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x06, 0x15, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x07, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x13, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x02, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x03, 0x14, 0x26, 0x49, 0x1d, 0x24, 0x3f, 0x31, 0x12, 0x2f, 0x2b, 0x3a, 0x3f, 0x5b, 0x46, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x14, 0x01, 0x8c, 0x04, 0x5a, 0x3f, 0x3c, 0x2a, 0x30, 0x13, 0x31, 0x3f, 0x24, 0x1d, 0x49, 0x6d, 0x0b, 0x18, 0x2b, 0x24, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x01, 0x6b, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x02, 0x07, 0x08, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x02, 0x5c, 0x93, 0xa3, 0x01, 0xb9, 0xa3, 0x90, 0x5d, 0x03, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfe, 0x0a, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x01, 0x02, 0x0c, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x03, 0x69, 0xac, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xad, 0x68, 0x03, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x61, 0x0c, 0x03, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x93, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0x0a, 0x77, 0x51, 0x38, 0x6b, 0x5a, 0x5b, 0x6a, 0x38, 0x03, 0xa8, 0x4c, 0x1c, 0x0b, 0x23, 0x24, 0x2d, 0x47, 0x30, 0x2c, 0x61, 0x26, 0x30, 0x24, 0x0e, 0x0f, 0x07, 0x34, 0x25, 0x11, 0x1d, 0x43, 0x61, 0x2c, 0x30, 0x47, 0x2d, 0x24, 0x23, 0x0b, 0x1c, 0x04, 0x03, 0x16, 0x18, 0x1c, 0x0e, 0x0c, 0x03, 0x3b, 0xa7, 0x83, 0x73, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x0f, 0x24, 0x82, 0x41, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0x05, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x05, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x03, 0x13, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x07, 0x1c, 0x07, 0x8a, 0x57, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0x08, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x08, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0x0f, 0x60, 0x81, 0x2a, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0xfb, 0x3a, 0x3d, 0x4e, 0x77, 0x8d, 0x59, 0x2e, 0x2d, 0x59, 0x8d, 0x77, 0x4e, 0x3d, 0x01, 0xda, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0x00, 0x0b, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x27, 0x00, 0x34, 0x00, 0x65, 0x00, 0x9e, 0x00, 0xa6, 0x00, 0xaf, 0x00, 0xb8, 0x00, 0xbc, 0x00, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x01, 0x36, 0x32, 0x17, 0x07, 0x26, 0x22, 0x07, 0x25, 0x36, 0x20, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x12, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x01, 0x17, 0x05, 0x27, 0x25, 0x05, 0x07, 0x25, 0x03, 0x14, 0x26, 0x49, 0x1d, 0x24, 0x3f, 0x31, 0x12, 0x2f, 0x2b, 0x3a, 0x3f, 0x5b, 0x46, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x14, 0x01, 0x8c, 0x04, 0x5a, 0x3f, 0x3c, 0x2a, 0x30, 0x13, 0x31, 0x3f, 0x24, 0x1d, 0x49, 0x6d, 0x0b, 0x18, 0x2b, 0x24, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x01, 0x6b, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x5d, 0x94, 0xa3, 0x01, 0xb9, 0xa3, 0x93, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfb, 0x46, 0x0f, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xaf, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xae, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x02, 0xf3, 0x3f, 0xb0, 0x3f, 0x56, 0x1b, 0x4c, 0x1b, 0xfe, 0xb5, 0xa3, 0x01, 0xd2, 0xa3, 0x56, 0x80, 0xb6, 0xb4, 0x81, 0xfb, 0x77, 0x51, 0x38, 0x6b, 0x5a, 0x5b, 0x6a, 0x38, 0x01, 0xc4, 0x45, 0xfe, 0xef, 0x45, 0xfe, 0xa2, 0x01, 0x10, 0x45, 0xfe, 0xef, 0x03, 0xa8, 0x4c, 0x1c, 0x0b, 0x23, 0x24, 0x2d, 0x47, 0x30, 0x2c, 0x61, 0x26, 0x30, 0x24, 0x0e, 0x0f, 0x07, 0x34, 0x25, 0x11, 0x1d, 0x43, 0x61, 0x2c, 0x30, 0x47, 0x2d, 0x24, 0x23, 0x0b, 0x1c, 0x04, 0x03, 0x16, 0x18, 0x1c, 0x0e, 0x0c, 0x03, 0x3b, 0xa7, 0x82, 0x74, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x74, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0xe7, 0x77, 0x84, 0x84, 0x77, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x3d, 0x7c, 0x8f, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x8f, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0x8e, 0x9e, 0x9e, 0x8c, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0xfe, 0x13, 0x63, 0x63, 0x5f, 0x3c, 0x3c, 0xf5, 0xb5, 0xb5, 0x60, 0x8e, 0x8e, 0x01, 0xfa, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0x02, 0x3d, 0x6e, 0xd5, 0x6f, 0xd4, 0xd4, 0x6f, 0xd5, 0x00, 0x00, 0x00, 0x05, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x64, 0x00, 0x8e, 0x00, 0x00, 0x01, 0x14, 0x06, 0x07, 0x17, 0x16, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x35, 0x06, 0x22, 0x27, 0x37, 0x16, 0x32, 0x37, 0x17, 0x36, 0x3f, 0x01, 0x2e, 0x01, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x03, 0x36, 0x20, 0x17, 0x07, 0x26, 0x20, 0x07, 0x01, 0x26, 0x10, 0x36, 0x3f, 0x01, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x00, 0x20, 0x00, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x05, 0x12, 0x21, 0x32, 0x24, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x06, 0x07, 0x26, 0x20, 0x07, 0x26, 0x27, 0x06, 0x0f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0xa2, 0x73, 0x46, 0x1d, 0x18, 0x30, 0x45, 0x30, 0x63, 0xaf, 0x6a, 0x38, 0x52, 0x77, 0x51, 0x2e, 0x07, 0x0d, 0x1d, 0x45, 0x74, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xdf, 0xa3, 0x01, 0xd2, 0xa3, 0x56, 0x80, 0xfe, 0x96, 0x81, 0xfe, 0x0c, 0x0f, 0x1d, 0x13, 0x12, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x12, 0x27, 0x09, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xfe, 0x8d, 0xfd, 0xf9, 0xfe, 0x8f, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x01, 0x1b, 0xc2, 0x01, 0xae, 0xdd, 0x01, 0x36, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0x01, 0x21, 0x10, 0x18, 0x1b, 0x0e, 0x27, 0xda, 0x8a, 0x69, 0xfe, 0xe8, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x0f, 0x1c, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0x04, 0x88, 0x8b, 0xb4, 0x0e, 0x3f, 0x35, 0x4f, 0x36, 0x36, 0x2c, 0x03, 0x03, 0x35, 0x3d, 0x78, 0x2e, 0x2e, 0x63, 0x18, 0x1d, 0x3f, 0x0e, 0xb4, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfc, 0xda, 0xb5, 0xb5, 0x60, 0x8e, 0x8e, 0x01, 0xc6, 0x7c, 0x01, 0x06, 0xc4, 0x6a, 0x61, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x61, 0xcc, 0xa0, 0xc8, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0xfe, 0xd4, 0x01, 0x2a, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0xe6, 0xfe, 0x1e, 0xfb, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x2b, 0x82, 0x51, 0x88, 0x8d, 0xae, 0x62, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x54, 0xa8, 0x6e, 0x6b, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x34, 0x00, 0x73, 0x00, 0x7b, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3f, 0x01, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x00, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x06, 0x15, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x07, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x03, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x05, 0x21, 0x34, 0x37, 0x36, 0x33, 0x32, 0x00, 0x0b, 0x01, 0x37, 0x13, 0x05, 0x27, 0x13, 0x17, 0x06, 0x73, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x02, 0x07, 0x08, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x02, 0x5c, 0x93, 0xa3, 0x01, 0xb9, 0xa3, 0x90, 0x5d, 0x03, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfe, 0x0a, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x01, 0x02, 0x0c, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x03, 0x69, 0xac, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xad, 0x68, 0x03, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x61, 0x0c, 0x03, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x79, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x02, 0xec, 0xfc, 0x74, 0x84, 0x84, 0xbd, 0xbc, 0x01, 0x0b, 0x86, 0xf3, 0x55, 0xf3, 0xfd, 0x2c, 0x56, 0xf3, 0x56, 0x02, 0xda, 0x83, 0x73, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x0f, 0x24, 0x82, 0x41, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0x05, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x05, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x03, 0x13, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x07, 0x1c, 0x07, 0x8a, 0x57, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0x08, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x08, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0x0f, 0x60, 0x81, 0x2a, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0xfb, 0x47, 0x61, 0x4b, 0x74, 0x75, 0x4b, 0xe7, 0xe7, 0xa4, 0xa3, 0xfe, 0xba, 0x01, 0x7e, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x5f, 0x5f, 0x01, 0x0e, 0x5f, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x04, 0x9a, 0x00, 0xb4, 0x06, 0x12, 0x00, 0x03, 0x00, 0x00, 0x11, 0x33, 0x03, 0x23, 0xb3, 0x69, 0x8a, 0x06, 0x12, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x27, 0x05, 0x0e, 0xff, 0x3f, 0x05, 0xd9, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0xfe, 0x88, 0xb6, 0xb6, 0xfe, 0xa0, 0xb7, 0xb7, 0x05, 0xd9, 0xcb, 0xcb, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xb4, 0x04, 0xee, 0xff, 0x0c, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0xfe, 0x65, 0xa6, 0xcd, 0x8a, 0x05, 0xf6, 0xfe, 0xf8, 0x00, 0x00, 0x01, 0xfd, 0x0a, 0x05, 0x0e, 0xff, 0x5d, 0x05, 0xe9, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0xfe, 0x30, 0x34, 0x16, 0x1c, 0x0b, 0x20, 0x24, 0x71, 0x5d, 0x4d, 0x21, 0x37, 0x2b, 0x33, 0x15, 0x1e, 0x0e, 0x1d, 0x24, 0x70, 0x02, 0x5c, 0x4c, 0x1e, 0x36, 0x05, 0x39, 0x21, 0x0e, 0x0b, 0x32, 0x2d, 0x06, 0x65, 0x76, 0x10, 0x1b, 0x1e, 0x0d, 0x0c, 0x33, 0x29, 0x06, 0x64, 0x77, 0x10, 0x00, 0x00, 0x01, 0xfd, 0x57, 0x04, 0xee, 0xfe, 0xb1, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x00, 0x01, 0x13, 0x23, 0x03, 0xfe, 0x00, 0xb0, 0x89, 0xcf, 0x05, 0xf6, 0xfe, 0xf8, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x20, 0x04, 0xee, 0xff, 0x46, 0x05, 0xf8, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x07, 0x23, 0xfd, 0xdf, 0xa9, 0xbe, 0x7d, 0x96, 0x95, 0x7d, 0x05, 0xf8, 0xfe, 0xf6, 0xb2, 0xb2, 0x00, 0x00, 0x01, 0xfd, 0x20, 0x04, 0xee, 0xff, 0x46, 0x05, 0xf8, 0x00, 0x06, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0xfd, 0xdf, 0xbe, 0x7d, 0x95, 0x96, 0x7d, 0xbe, 0x04, 0xee, 0x01, 0x0a, 0xb2, 0xb2, 0xfe, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x19, 0x05, 0x06, 0xff, 0x4d, 0x05, 0xf8, 0x00, 0x0d, 0x00, 0x00, 0x03, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x16, 0xb3, 0x6a, 0x0c, 0x59, 0x4b, 0x4a, 0x57, 0x0e, 0x6a, 0x08, 0x90, 0x81, 0x82, 0x8f, 0x05, 0x06, 0x36, 0x39, 0x37, 0x38, 0x77, 0x7b, 0x7a, 0x00, 0x00, 0x01, 0xfd, 0x19, 0x05, 0x06, 0xff, 0x4d, 0x05, 0xf8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0xfd, 0x1a, 0x6a, 0x0b, 0x59, 0x4b, 0x4a, 0x57, 0x0f, 0x6a, 0x09, 0x90, 0x81, 0x81, 0x90, 0x05, 0xf8, 0x36, 0x39, 0x37, 0x38, 0x77, 0x7b, 0x7a, 0x00, 0x01, 0xfd, 0xd7, 0x05, 0x0e, 0xfe, 0x8f, 0x05, 0xdb, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0xfd, 0xd7, 0xb8, 0xb8, 0x05, 0xdb, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x35, 0x04, 0xee, 0xff, 0xba, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x03, 0x33, 0x03, 0x23, 0x03, 0x33, 0x03, 0x23, 0xed, 0xa7, 0xcd, 0x8a, 0x7d, 0xa6, 0xcd, 0x8a, 0x05, 0xf6, 0xfe, 0xf8, 0x01, 0x08, 0xfe, 0xf8, 0x00, 0x02, 0xfc, 0xac, 0x04, 0xee, 0xff, 0x31, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x13, 0x23, 0x03, 0x21, 0x13, 0x23, 0x03, 0xfd, 0x53, 0xb1, 0x8a, 0xcd, 0x01, 0xd4, 0xb0, 0x8a, 0xcd, 0x05, 0xf6, 0xfe, 0xf8, 0x01, 0x08, 0xfe, 0xf8, 0x01, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x96, 0x00, 0x03, 0x00, 0x00, 0x35, 0x33, 0x15, 0x23, 0x87, 0x87, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x00, 0x96, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0xe1, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x96, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x01, 0x90, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x70, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0x90, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xff, 0x06, 0x01, 0x68, 0x00, 0x96, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x17, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x70, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x64, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x87, 0x00, 0x96, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x87, 0x87, 0x87, 0x87, 0x64, 0x96, 0x01, 0x90, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xff, 0x06, 0x01, 0x68, 0x00, 0x96, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x17, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xe1, 0x87, 0x87, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x87, 0x87, 0x64, 0x96, 0x01, 0x90, 0x96, 0x64, 0x96, 0x01, 0x90, 0x96, 0x00, 0x01, 0x00, 0x75, 0xff, 0xec, 0x07, 0x24, 0x02, 0x9d, 0x00, 0x26, 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x03, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x33, 0x16, 0x06, 0x3e, 0x3e, 0x39, 0x39, 0x36, 0x5c, 0x68, 0x40, 0x48, 0x16, 0x8b, 0xd2, 0xe9, 0xbe, 0xb0, 0x70, 0xfe, 0xd8, 0x01, 0x01, 0x3a, 0xa5, 0x3a, 0xb7, 0x5d, 0x88, 0xea, 0xab, 0xb3, 0x6f, 0x35, 0x1a, 0xa5, 0x12, 0x01, 0xf8, 0xd0, 0x3b, 0x35, 0xb8, 0x49, 0x53, 0x42, 0x83, 0x35, 0x3a, 0x26, 0x65, 0x01, 0x08, 0x8a, 0x5c, 0x5e, 0x88, 0x7d, 0x43, 0x22, 0x02, 0x37, 0x3a, 0x6d, 0x34, 0x77, 0x3e, 0x37, 0x4b, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x01, 0x60, 0x02, 0x58, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x01, 0x0d, 0x41, 0x8d, 0x51, 0x20, 0x59, 0x27, 0x2c, 0xa6, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0xd9, 0xd9, 0xbb, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3f, 0x02, 0x58, 0x00, 0x14, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x01, 0x0d, 0x45, 0x89, 0x51, 0x20, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x31, 0x63, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0xd9, 0xd9, 0x6a, 0x31, 0x2c, 0xb8, 0x00, 0x00, 0x02, 0x00, 0x75, 0xff, 0xa5, 0x07, 0x86, 0x03, 0x11, 0x00, 0x2c, 0x00, 0x3e, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x23, 0x24, 0x27, 0x24, 0x03, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x25, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x05, 0xd2, 0x5d, 0x63, 0xfc, 0xf5, 0xfe, 0xed, 0x70, 0xfe, 0xd8, 0x01, 0x01, 0x3a, 0xa5, 0x3a, 0xb7, 0x48, 0x01, 0x0e, 0xd0, 0x01, 0x01, 0x19, 0x1f, 0x1a, 0x49, 0x03, 0x14, 0xa9, 0x34, 0x2f, 0x4a, 0x49, 0x7b, 0x10, 0x04, 0x48, 0x08, 0x06, 0xed, 0xf1, 0x5f, 0x64, 0x5e, 0x04, 0x0d, 0x2f, 0x1e, 0x24, 0x16, 0x14, 0x37, 0x11, 0x05, 0x25, 0x2c, 0x24, 0x2b, 0x18, 0x3c, 0x01, 0x27, 0x67, 0x01, 0x06, 0x8a, 0x5c, 0x5e, 0x88, 0x73, 0x4d, 0x1f, 0x36, 0x04, 0x1b, 0x2c, 0x7c, 0x79, 0x1f, 0x24, 0x9b, 0x4b, 0x17, 0x32, 0x53, 0x96, 0x25, 0x1e, 0x90, 0x6a, 0x01, 0xb8, 0xdf, 0x41, 0x7a, 0x14, 0x1b, 0x47, 0x27, 0x19, 0x0a, 0x19, 0x3c, 0x13, 0x12, 0x38, 0x42, 0x4e, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x02, 0xec, 0x03, 0xd9, 0x00, 0x0f, 0x00, 0x30, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x07, 0x06, 0x07, 0x06, 0x07, 0x14, 0x17, 0x16, 0x33, 0x32, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x21, 0x02, 0x1a, 0x25, 0x3b, 0x1c, 0x28, 0x2f, 0x24, 0x24, 0x01, 0x32, 0x24, 0x26, 0x41, 0xfd, 0xe9, 0xd9, 0x4b, 0x88, 0x48, 0x36, 0x1b, 0x0e, 0x39, 0x57, 0x75, 0x46, 0x58, 0x07, 0x14, 0x87, 0x47, 0x44, 0x51, 0x3b, 0x57, 0x29, 0x15, 0x46, 0x43, 0x6f, 0x63, 0x82, 0xfe, 0xdf, 0x02, 0x19, 0x2b, 0x4d, 0x3b, 0x33, 0x19, 0x01, 0x01, 0x2a, 0x29, 0x33, 0x50, 0x26, 0x19, 0xfe, 0xb7, 0x17, 0x0c, 0x5d, 0x30, 0x32, 0x37, 0x02, 0x02, 0x45, 0x57, 0x81, 0x34, 0x2c, 0x94, 0x45, 0x24, 0x32, 0x48, 0x66, 0x33, 0x8c, 0xd0, 0x8f, 0x88, 0x2c, 0x27, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xb7, 0x03, 0x08, 0x00, 0x21, 0x00, 0x35, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x07, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x02, 0x29, 0xa4, 0x16, 0x07, 0x13, 0x1a, 0x20, 0x23, 0x84, 0x72, 0xc3, 0x7a, 0xa7, 0xa6, 0x7b, 0xc3, 0x72, 0x85, 0x23, 0x1a, 0x21, 0x13, 0x08, 0x14, 0xa7, 0x1b, 0x3a, 0x39, 0x39, 0x0d, 0x11, 0x32, 0x16, 0x08, 0x15, 0x1c, 0x3d, 0x39, 0x20, 0x17, 0x0a, 0x15, 0x33, 0x11, 0x02, 0xfa, 0x50, 0x96, 0x32, 0x2a, 0x49, 0x31, 0x43, 0x32, 0x11, 0xb8, 0x39, 0x39, 0xb8, 0x11, 0x28, 0x4d, 0x2e, 0x4c, 0x2c, 0x30, 0x8f, 0x57, 0x0e, 0xb8, 0x0a, 0x20, 0x35, 0x15, 0x1d, 0x2b, 0x35, 0x44, 0x16, 0x15, 0x45, 0x32, 0x2e, 0x18, 0x1a, 0x34, 0x21, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x60, 0xfe, 0x0c, 0x06, 0x14, 0x02, 0xe4, 0x00, 0x2e, 0x00, 0x40, 0x00, 0x00, 0x25, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x2b, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x27, 0x24, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x04, 0x3f, 0x3b, 0x2a, 0x6c, 0x34, 0x84, 0x05, 0x24, 0x85, 0x24, 0x4f, 0x65, 0x32, 0x59, 0x2d, 0x12, 0x06, 0x17, 0x03, 0xed, 0xf1, 0x2b, 0x28, 0x38, 0x72, 0x8f, 0x9e, 0xb8, 0xfe, 0xb3, 0x55, 0x3e, 0x38, 0xa6, 0x38, 0x18, 0x36, 0xec, 0x7e, 0x87, 0xc0, 0x61, 0x04, 0x14, 0x11, 0x2b, 0x1e, 0x23, 0x1f, 0x13, 0x2e, 0x13, 0x09, 0x34, 0x44, 0x5a, 0x2a, 0x0a, 0x05, 0x0d, 0x23, 0x2b, 0x6d, 0xb9, 0x3d, 0x1a, 0xa5, 0x45, 0x13, 0x32, 0x58, 0x91, 0x3a, 0xd6, 0x01, 0xb8, 0x7a, 0x46, 0x91, 0x4e, 0x56, 0x01, 0x02, 0xbe, 0x8a, 0x7d, 0xa6, 0x60, 0x6b, 0x9b, 0x4c, 0x3a, 0x82, 0x44, 0x62, 0x01, 0x5a, 0x7a, 0x57, 0x4b, 0x23, 0x19, 0x0a, 0x1b, 0x3a, 0x1e, 0x19, 0x3c, 0x2c, 0x3b, 0x14, 0x09, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0xec, 0x03, 0xd9, 0x10, 0x06, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x03, 0xb7, 0x03, 0x08, 0x10, 0x06, 0x11, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x01, 0x60, 0x03, 0xe8, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3f, 0x03, 0xe8, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8b, 0x01, 0xb7, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x25, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x01, 0x1c, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0xdc, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0xff, 0xff, 0x00, 0x75, 0xfe, 0x90, 0x07, 0x24, 0x03, 0x20, 0x10, 0x27, 0x10, 0xf7, 0x02, 0x76, 0x02, 0x8a, 0x10, 0x27, 0x11, 0x07, 0x02, 0x65, 0xfe, 0x90, 0x10, 0x06, 0x10, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xf4, 0x01, 0xd3, 0x03, 0xe8, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf7, 0x00, 0x59, 0x03, 0x52, 0x10, 0x07, 0x11, 0x07, 0x00, 0x48, 0xfe, 0xf4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xf4, 0x02, 0x3f, 0x03, 0xe8, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf7, 0x00, 0x59, 0x03, 0x52, 0x10, 0x07, 0x11, 0x07, 0x00, 0x48, 0xfe, 0xf4, 0xff, 0xff, 0x00, 0x75, 0xff, 0xec, 0x07, 0x24, 0x03, 0xb6, 0x10, 0x27, 0x10, 0xf9, 0x02, 0x76, 0x03, 0x20, 0x10, 0x06, 0x10, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x01, 0xc2, 0x04, 0xe2, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x00, 0x59, 0x04, 0x4c, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3f, 0x04, 0xe2, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x00, 0x59, 0x04, 0x4c, 0x00, 0x02, 0x00, 0x8d, 0xfe, 0x0c, 0x04, 0xb8, 0x05, 0xaf, 0x00, 0x30, 0x00, 0x49, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x22, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x20, 0x17, 0x15, 0x22, 0x07, 0x17, 0x16, 0x17, 0x16, 0x01, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x04, 0x94, 0x24, 0x2c, 0x74, 0x6f, 0x4a, 0x37, 0x05, 0x42, 0x67, 0x58, 0xc9, 0x42, 0x74, 0x01, 0x29, 0xad, 0xbf, 0x87, 0xe1, 0xfe, 0x88, 0x98, 0x76, 0xbf, 0x56, 0x7b, 0x0a, 0x0c, 0x56, 0x7e, 0x79, 0x56, 0xf5, 0xae, 0x01, 0x08, 0xb4, 0x62, 0x1c, 0x1a, 0x2e, 0x41, 0x51, 0xfd, 0x62, 0x46, 0x28, 0x0e, 0x0e, 0x32, 0x34, 0x53, 0x38, 0x2f, 0x2e, 0x39, 0x3b, 0x10, 0x1a, 0x55, 0x1d, 0x6c, 0xfe, 0xcc, 0xb8, 0xb8, 0x96, 0x64, 0x9c, 0x0f, 0xb2, 0x18, 0x50, 0xb7, 0xfc, 0x89, 0x5e, 0xa4, 0x76, 0xb8, 0x63, 0xc2, 0x96, 0xe0, 0x01, 0x02, 0xdf, 0x65, 0x34, 0x13, 0x13, 0x29, 0xb8, 0x3f, 0x36, 0x9a, 0x0d, 0x5b, 0xa0, 0x5f, 0x77, 0x03, 0xa3, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xed, 0x05, 0x4b, 0x00, 0x1e, 0x00, 0x37, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x01, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x02, 0xfe, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x9b, 0xe8, 0xc6, 0x44, 0x4f, 0x96, 0x42, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0xfe, 0xda, 0x46, 0x28, 0x0e, 0x0f, 0x33, 0x34, 0x53, 0x38, 0x2e, 0x2c, 0x3a, 0x3c, 0x0f, 0x1a, 0x55, 0x1d, 0x6c, 0xfe, 0xcc, 0x02, 0x1d, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x23, 0x34, 0x62, 0x9a, 0x18, 0x34, 0x62, 0x42, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x01, 0xfd, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0xb8, 0x05, 0x4b, 0x00, 0x29, 0x00, 0x42, 0x00, 0x00, 0x01, 0x16, 0x17, 0x15, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x27, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x02, 0x3e, 0xe8, 0xc6, 0x3a, 0x42, 0x2d, 0x1b, 0x5e, 0x66, 0x3c, 0x4e, 0xbc, 0x71, 0x24, 0x35, 0x3e, 0x25, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0x5b, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x26, 0x46, 0x28, 0x0e, 0x0f, 0x33, 0x34, 0x53, 0x38, 0x2e, 0x2c, 0x3a, 0x3c, 0x0f, 0x1a, 0x55, 0x1d, 0x6c, 0xfe, 0xcc, 0x03, 0x0c, 0x34, 0x62, 0x9a, 0x14, 0x29, 0x4e, 0x22, 0x77, 0xb8, 0xa8, 0x36, 0x61, 0x2e, 0x25, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x23, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0xc8, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8d, 0xfe, 0x0c, 0x04, 0xb8, 0x05, 0xaa, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x22, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x20, 0x17, 0x15, 0x22, 0x07, 0x17, 0x16, 0x17, 0x16, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x04, 0x94, 0x24, 0x2c, 0x74, 0x6f, 0x4a, 0x37, 0x05, 0x42, 0x67, 0x58, 0xc9, 0x42, 0x74, 0x01, 0x29, 0xad, 0xbf, 0x87, 0xe1, 0xfe, 0x88, 0x98, 0x76, 0xbf, 0x56, 0x7b, 0x0a, 0x0c, 0x56, 0x7e, 0x79, 0x56, 0xf5, 0xae, 0x01, 0x08, 0xb4, 0x62, 0x1c, 0x1a, 0x2e, 0x41, 0x51, 0xfd, 0xbe, 0x86, 0x86, 0x86, 0x86, 0xb8, 0xb8, 0x96, 0x64, 0x9c, 0x0f, 0xb2, 0x18, 0x50, 0xb7, 0xfc, 0x89, 0x5e, 0xa4, 0x76, 0xb8, 0x63, 0xc2, 0x96, 0xe0, 0x01, 0x02, 0xdf, 0x65, 0x34, 0x13, 0x13, 0x29, 0xb8, 0x3f, 0x36, 0x9a, 0x0d, 0x5b, 0xa0, 0x5f, 0x77, 0x03, 0xf8, 0x96, 0x01, 0x90, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x03, 0xed, 0x05, 0x46, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x03, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x02, 0xfe, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x9b, 0xe8, 0xc6, 0x44, 0x4f, 0x96, 0x42, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0xcb, 0x88, 0x88, 0x88, 0x88, 0x02, 0x1d, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x23, 0x34, 0x62, 0x9a, 0x18, 0x34, 0x62, 0x42, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x02, 0x52, 0x96, 0x01, 0x90, 0x96, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x04, 0xb8, 0x05, 0x46, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x01, 0x16, 0x17, 0x15, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x02, 0x3e, 0xe8, 0xc6, 0x3a, 0x42, 0x2d, 0x1b, 0x5e, 0x66, 0x3c, 0x4e, 0xbc, 0x71, 0x24, 0x35, 0x3e, 0x25, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0x5b, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x35, 0x88, 0x88, 0x88, 0x88, 0x03, 0x0c, 0x34, 0x62, 0x9a, 0x14, 0x29, 0x4e, 0x22, 0x77, 0xb8, 0xa8, 0x36, 0x61, 0x2e, 0x25, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x23, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x01, 0x1d, 0x96, 0x01, 0x90, 0x96, 0x00, 0x04, 0x00, 0x8d, 0xfe, 0x0c, 0x04, 0xb8, 0x05, 0xaa, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x22, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x20, 0x17, 0x15, 0x22, 0x07, 0x17, 0x16, 0x17, 0x16, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x94, 0x24, 0x2c, 0x74, 0x6f, 0x4a, 0x37, 0x05, 0x42, 0x67, 0x58, 0xc9, 0x42, 0x74, 0x01, 0x29, 0xad, 0xbf, 0x87, 0xe1, 0xfe, 0x88, 0x98, 0x76, 0xbf, 0x56, 0x7b, 0x0a, 0x0c, 0x56, 0x7e, 0x79, 0x56, 0xf5, 0xae, 0x01, 0x08, 0xb4, 0x62, 0x1c, 0x1a, 0x2e, 0x41, 0x51, 0xfd, 0xbe, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0xb8, 0x96, 0x64, 0x9c, 0x0f, 0xb2, 0x18, 0x50, 0xb7, 0xfc, 0x89, 0x5e, 0xa4, 0x76, 0xb8, 0x63, 0xc2, 0x96, 0xe0, 0x01, 0x02, 0xdf, 0x65, 0x34, 0x13, 0x13, 0x29, 0xb8, 0x3f, 0x36, 0x9a, 0x0d, 0x5b, 0xa0, 0x5f, 0x77, 0x04, 0xf2, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x03, 0xed, 0x05, 0x46, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x03, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0xfe, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x9b, 0xe8, 0xc6, 0x44, 0x4f, 0x96, 0x42, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0xcb, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x02, 0x1d, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x23, 0x34, 0x62, 0x9a, 0x18, 0x34, 0x62, 0x42, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x03, 0x4c, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x04, 0xb8, 0x05, 0x46, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x01, 0x16, 0x17, 0x15, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0x3e, 0xe8, 0xc6, 0x3a, 0x42, 0x2d, 0x1b, 0x5e, 0x66, 0x3c, 0x4e, 0xbc, 0x71, 0x24, 0x35, 0x3e, 0x25, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0x5b, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x35, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x03, 0x0c, 0x34, 0x62, 0x9a, 0x14, 0x29, 0x4e, 0x22, 0x77, 0xb8, 0xa8, 0x36, 0x61, 0x2e, 0x25, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x23, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x02, 0x17, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x05, 0x00, 0x8d, 0xfe, 0x0c, 0x04, 0xb8, 0x04, 0xb0, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x22, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x20, 0x17, 0x15, 0x22, 0x07, 0x17, 0x16, 0x17, 0x16, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x94, 0x24, 0x2c, 0x74, 0x6f, 0x4a, 0x37, 0x05, 0x42, 0x67, 0x58, 0xc9, 0x42, 0x74, 0x01, 0x29, 0xad, 0xbf, 0x87, 0xe1, 0xfe, 0x88, 0x98, 0x76, 0xbf, 0x56, 0x7b, 0x0a, 0x0c, 0x56, 0x7e, 0x79, 0x56, 0xf5, 0xae, 0x01, 0x08, 0xb4, 0x62, 0x1c, 0x1a, 0x2e, 0x41, 0x51, 0xfd, 0xbe, 0x86, 0x86, 0x21, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0xb8, 0x96, 0x64, 0x9c, 0x0f, 0xb2, 0x18, 0x50, 0xb7, 0xfc, 0x89, 0x5e, 0xa4, 0x76, 0xb8, 0x63, 0xc2, 0x96, 0xe0, 0x01, 0x02, 0xdf, 0x65, 0x34, 0x13, 0x13, 0x29, 0xb8, 0x3f, 0x36, 0x9a, 0x0d, 0x5b, 0xa0, 0x5f, 0x77, 0x03, 0xf8, 0x96, 0xfb, 0x9b, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0xfe, 0x3e, 0x03, 0xed, 0x04, 0x4c, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x02, 0xfe, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x9b, 0xe8, 0xc6, 0x44, 0x4f, 0x96, 0x42, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0xcb, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x70, 0x88, 0x88, 0x02, 0x1d, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x23, 0x34, 0x62, 0x9a, 0x18, 0x34, 0x62, 0x42, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0xfc, 0xda, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x05, 0x14, 0x96, 0x00, 0x05, 0xff, 0xee, 0xfe, 0x3e, 0x04, 0xb8, 0x04, 0x4c, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x00, 0x01, 0x16, 0x17, 0x15, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x02, 0x3e, 0xe8, 0xc6, 0x3a, 0x42, 0x2d, 0x1b, 0x5e, 0x66, 0x3c, 0x4e, 0xbc, 0x71, 0x24, 0x35, 0x3e, 0x25, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0x5b, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x40, 0x87, 0x87, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x65, 0x88, 0x88, 0x03, 0x0c, 0x34, 0x62, 0x9a, 0x14, 0x29, 0x4e, 0x22, 0x77, 0xb8, 0xa8, 0x36, 0x61, 0x2e, 0x25, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x23, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0xfb, 0xa5, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x05, 0x14, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x33, 0x03, 0x09, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x03, 0x09, 0xfc, 0xf7, 0x03, 0x09, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0x00, 0x00, 0x01, 0x00, 0xbf, 0xfe, 0x56, 0x04, 0xa4, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x01, 0x11, 0x23, 0xc0, 0xa5, 0x02, 0x99, 0xa5, 0x4a, 0x49, 0xa2, 0xe5, 0xd2, 0x5e, 0x22, 0x23, 0xfd, 0x67, 0xa5, 0x05, 0xd5, 0xfb, 0x83, 0x04, 0x7d, 0xfa, 0x17, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0xad, 0x04, 0x7d, 0xfb, 0x83, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe9, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xb0, 0xa5, 0x94, 0x94, 0xa5, 0xa2, 0xa2, 0x04, 0x60, 0xfe, 0x08, 0xa4, 0xfe, 0x3c, 0x01, 0xc4, 0xa4, 0x00, 0x00, 0x02, 0xff, 0x0d, 0xfe, 0x56, 0x01, 0xf7, 0x04, 0x60, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x13, 0x20, 0x35, 0x34, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x03, 0x23, 0x22, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x1e, 0xfe, 0xef, 0xf3, 0xae, 0xa5, 0xa3, 0xac, 0x10, 0x30, 0x49, 0x1d, 0xa3, 0x6b, 0x02, 0x04, 0x6f, 0x5e, 0x23, 0x0f, 0xfe, 0x56, 0xdd, 0xcd, 0x04, 0x60, 0xfb, 0xa0, 0x9b, 0x70, 0x3f, 0x60, 0x01, 0x10, 0x33, 0x41, 0x30, 0x17, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x63, 0x03, 0x84, 0x08, 0x33, 0x10, 0x27, 0x00, 0x71, 0x00, 0xaa, 0x02, 0x3d, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x55, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x61, 0x03, 0x84, 0x08, 0x34, 0x10, 0x27, 0x00, 0x71, 0x00, 0xaa, 0x00, 0xff, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x02, 0x5b, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x5e, 0x03, 0x84, 0x08, 0x33, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x43, 0x01, 0x50, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x02, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x01, 0x6a, 0x06, 0x63, 0x03, 0x82, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xec, 0x04, 0x72, 0x02, 0x64, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x55, 0x00, 0x00, 0xff, 0xff, 0x01, 0x6a, 0x06, 0x63, 0x03, 0x82, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xee, 0x04, 0x18, 0x02, 0x64, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x55, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x61, 0x03, 0x84, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xec, 0x04, 0x72, 0x02, 0x64, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x61, 0x03, 0x84, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xee, 0x04, 0x18, 0x02, 0x64, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x6a, 0x03, 0xa3, 0x08, 0x33, 0x10, 0x27, 0x10, 0xed, 0x04, 0x46, 0x01, 0x5c, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x02, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x03, 0x89, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x43, 0x02, 0x62, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x55, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x6a, 0x03, 0xa3, 0x08, 0x56, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x43, 0x02, 0x7d, 0x10, 0x07, 0x10, 0xed, 0x04, 0x46, 0x01, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x03, 0x89, 0x08, 0x57, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x43, 0x01, 0x75, 0x10, 0x07, 0x10, 0xf3, 0x04, 0x43, 0x02, 0x7c, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x6a, 0x03, 0xc5, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xec, 0x04, 0xba, 0x02, 0x64, 0x10, 0x07, 0x10, 0xed, 0x04, 0x46, 0x01, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x04, 0x96, 0x08, 0x3a, 0x10, 0x27, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x10, 0x07, 0x10, 0xec, 0x05, 0x8a, 0x02, 0x44, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x03, 0xfc, 0x08, 0x3a, 0x10, 0x27, 0x10, 0xee, 0x05, 0x4b, 0x02, 0x44, 0x10, 0x07, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x63, 0x03, 0xa3, 0x08, 0x75, 0x10, 0x27, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x10, 0x07, 0x10, 0xed, 0x04, 0x46, 0x02, 0x8c, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x56, 0x03, 0xa3, 0x08, 0x59, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x43, 0x01, 0x50, 0x10, 0x07, 0x10, 0xed, 0x04, 0x46, 0x02, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5c, 0x06, 0x56, 0x03, 0x90, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x43, 0x01, 0x50, 0x10, 0x07, 0x10, 0xec, 0x04, 0x72, 0x02, 0x64, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5c, 0x06, 0x56, 0x03, 0x90, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x43, 0x01, 0x50, 0x10, 0x07, 0x10, 0xee, 0x04, 0x18, 0x02, 0x64, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5c, 0x06, 0x56, 0x03, 0x90, 0x08, 0x8b, 0x10, 0x27, 0x02, 0xba, 0x04, 0x34, 0x02, 0x10, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x43, 0x01, 0x50, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x04, 0x87, 0x08, 0x5b, 0x10, 0x27, 0x02, 0xba, 0x05, 0x75, 0x01, 0xe0, 0x10, 0x07, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xf1, 0x04, 0x7b, 0xff, 0x62, 0x06, 0x6e, 0x10, 0x26, 0x02, 0xb2, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb8, 0xff, 0x12, 0x00, 0x5a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x2c, 0x00, 0x03, 0x00, 0x00, 0x11, 0x21, 0x11, 0x21, 0x01, 0x0e, 0xfe, 0xf2, 0x01, 0x2c, 0xfe, 0xd4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe3, 0x02, 0xfb, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x3d, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x06, 0x23, 0x22, 0x26, 0x52, 0xae, 0x5e, 0x81, 0x65, 0xb6, 0xbe, 0xde, 0x56, 0xab, 0x3d, 0xec, 0x51, 0x51, 0x95, 0xcb, 0x03, 0xee, 0xfc, 0x12, 0xfe, 0xe6, 0xea, 0x2c, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x92, 0x02, 0x26, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x5c, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0xfe, 0x57, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0xaf, 0xe1, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0xfe, 0x0c, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x04, 0x1a, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x77, 0x02, 0x26, 0x00, 0x18, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0xaf, 0xe1, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x00, 0x02, 0x00, 0x81, 0xfe, 0xc8, 0x05, 0x86, 0x07, 0xc4, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x03, 0xaa, 0x46, 0xa6, 0x2c, 0x27, 0x59, 0x44, 0x75, 0x65, 0x46, 0x10, 0x19, 0x6d, 0xea, 0x79, 0x4d, 0x59, 0x3e, 0xfe, 0xf9, 0x01, 0x39, 0xa6, 0x3b, 0x96, 0x24, 0x41, 0x48, 0x63, 0x9c, 0x99, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xb0, 0x49, 0x7e, 0xe3, 0x04, 0x6a, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x33, 0x2e, 0x28, 0xb1, 0x42, 0x22, 0x16, 0x5b, 0x01, 0x12, 0x8a, 0x5c, 0x73, 0x73, 0x7e, 0x42, 0x10, 0x22, 0x35, 0x06, 0xac, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x02, 0x24, 0x07, 0xc4, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x27, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x01, 0x84, 0x4e, 0x48, 0x8b, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x96, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x01, 0x73, 0xb2, 0x65, 0x5c, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0x6a, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x02, 0x75, 0x07, 0xc4, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x0b, 0x01, 0x33, 0x17, 0x37, 0x33, 0x03, 0x01, 0x31, 0x45, 0x89, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x87, 0x8a, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x06, 0x7e, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0xfe, 0xf0, 0x06, 0x13, 0x03, 0x46, 0x00, 0x37, 0x00, 0x3e, 0x00, 0x00, 0x05, 0x36, 0x35, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x03, 0xde, 0x52, 0x01, 0x2a, 0x1a, 0x1b, 0x28, 0x2f, 0x48, 0x4b, 0x1b, 0x26, 0x69, 0x4f, 0x73, 0x1d, 0x1f, 0x1f, 0x67, 0x65, 0x61, 0x17, 0x21, 0x0d, 0x29, 0x3b, 0x42, 0x02, 0x03, 0x66, 0x73, 0xc4, 0x50, 0x5e, 0xa9, 0x69, 0xfe, 0xf8, 0x39, 0xa5, 0x3a, 0x95, 0x3c, 0xa1, 0x52, 0x45, 0x86, 0xfe, 0x8b, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x21, 0x33, 0x21, 0x2b, 0x0d, 0x08, 0x28, 0x3b, 0x3d, 0x41, 0x3c, 0x5e, 0x0e, 0x06, 0x86, 0xc4, 0xb8, 0xac, 0xa5, 0x06, 0x11, 0x23, 0x30, 0x1b, 0x1e, 0x7b, 0x62, 0x56, 0x60, 0x1f, 0x0c, 0x29, 0x67, 0x01, 0x06, 0x99, 0x5a, 0x5a, 0x99, 0x72, 0x4e, 0x1f, 0x08, 0x0f, 0x02, 0x42, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0x00, 0x04, 0x40, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x0b, 0x01, 0x33, 0x17, 0x37, 0x33, 0x0b, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x0d, 0x41, 0x8d, 0x51, 0x20, 0x59, 0x27, 0x2c, 0xa6, 0x96, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x16, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0xd9, 0xd9, 0xbb, 0x02, 0x36, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0xfc, 0x70, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0x3f, 0x04, 0x40, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x0b, 0x01, 0x33, 0x17, 0x37, 0x33, 0x0b, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x0d, 0x45, 0x89, 0x51, 0x20, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x31, 0x63, 0x87, 0x8a, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x16, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0xd9, 0xd9, 0x6a, 0x31, 0x2c, 0xb8, 0x02, 0xfa, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0xfc, 0x70, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x04, 0x72, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x0b, 0x01, 0x33, 0x17, 0x37, 0x33, 0x03, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x35, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x01, 0x8e, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x02, 0x01, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0xae, 0xa5, 0x45, 0x5e, 0x0a, 0x1d, 0xa3, 0x92, 0x06, 0x14, 0xfb, 0x82, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x03, 0xef, 0x02, 0xee, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x17, 0x1e, 0x01, 0x13, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x02, 0x60, 0x0d, 0x0c, 0x0b, 0x0b, 0x6c, 0x4a, 0x64, 0x02, 0x01, 0xa2, 0x68, 0x04, 0x02, 0xa5, 0x01, 0x21, 0x13, 0x32, 0x1c, 0x65, 0x43, 0x75, 0x51, 0x42, 0x28, 0x22, 0x7c, 0x8d, 0x32, 0x34, 0xab, 0xb8, 0x62, 0x01, 0x1a, 0x2a, 0x31, 0x32, 0x65, 0x0c, 0x43, 0x59, 0x3e, 0x29, 0x32, 0x01, 0xd1, 0x27, 0x2b, 0xa8, 0xae, 0x65, 0x4f, 0x2c, 0xb8, 0x33, 0x1f, 0x3b, 0x49, 0x0f, 0x30, 0x9a, 0xad, 0x7f, 0x44, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0xa2, 0x05, 0xf0, 0x10, 0x06, 0x01, 0xe4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x00, 0x05, 0x0f, 0x10, 0x06, 0x01, 0xe5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0xfe, 0x75, 0x01, 0xd7, 0x04, 0x7b, 0x10, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x00, 0x00, 0x02, 0x38, 0x04, 0x60, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x33, 0x13, 0x23, 0x13, 0x21, 0x13, 0x21, 0xb3, 0x79, 0xa0, 0x79, 0x21, 0xfe, 0xd3, 0xc4, 0x01, 0x2d, 0x64, 0x03, 0x98, 0xfc, 0x04, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x2d, 0xfe, 0x56, 0x02, 0x38, 0x04, 0x60, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x05, 0x13, 0x23, 0x03, 0x06, 0x07, 0x36, 0x37, 0x36, 0x05, 0x23, 0x37, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x01, 0x16, 0xb6, 0x79, 0xbb, 0x1f, 0x30, 0x41, 0x2d, 0x43, 0xfe, 0xf9, 0xc6, 0x12, 0x2d, 0x5e, 0x2b, 0x2b, 0x1a, 0xd1, 0x01, 0x2d, 0xc8, 0x25, 0x5a, 0x5b, 0x16, 0x04, 0x12, 0xfb, 0xd0, 0xb5, 0x54, 0x0f, 0x30, 0x48, 0xf4, 0x64, 0x30, 0x31, 0x99, 0x04, 0xac, 0xfb, 0x8c, 0xd6, 0x60, 0x60, 0x00, 0xff, 0xff, 0xff, 0xd7, 0xfe, 0x76, 0x02, 0x2a, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xb0, 0xff, 0x34, 0x00, 0x00, 0x10, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0xab, 0xfe, 0x89, 0x01, 0x54, 0x04, 0x7b, 0x10, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x02, 0xcd, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd8, 0x00, 0xd8, 0x01, 0x96, 0x04, 0xfb, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xd8, 0xbe, 0xbe, 0xbe, 0xbe, 0x01, 0xd6, 0xfe, 0x04, 0x23, 0xfe, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x02, 0xab, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x88, 0x02, 0x21, 0xb5, 0xb6, 0xfd, 0xdf, 0xb5, 0xb6, 0x05, 0xd5, 0xaa, 0xfb, 0x7f, 0xaa, 0xaa, 0x04, 0x81, 0x00, 0x01, 0x01, 0x82, 0x02, 0x95, 0x04, 0x89, 0x03, 0x3f, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x04, 0x88, 0xfc, 0xfa, 0x03, 0x3f, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x04, 0xcb, 0x02, 0xe6, 0x08, 0xf2, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x01, 0x35, 0x25, 0x15, 0x01, 0x35, 0x25, 0x15, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0xfe, 0xe0, 0x02, 0x0e, 0xfd, 0xf2, 0x02, 0x0e, 0x05, 0x84, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0x02, 0xb3, 0x6e, 0x82, 0x6e, 0xfe, 0x8e, 0x6e, 0x82, 0x6e, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x04, 0xcb, 0x02, 0xe6, 0x09, 0x55, 0x00, 0x28, 0x00, 0x4f, 0x00, 0x5e, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x03, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x33, 0x16, 0x33, 0x15, 0x22, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x33, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0x0f, 0x21, 0x13, 0x1e, 0x15, 0x61, 0x3e, 0x1a, 0x38, 0x42, 0x24, 0x31, 0x0b, 0x12, 0x0c, 0x11, 0x12, 0x2b, 0x12, 0x2e, 0x18, 0x43, 0x4d, 0x55, 0x66, 0x32, 0x0e, 0x51, 0x0b, 0x1f, 0x2b, 0x33, 0x8f, 0x03, 0x02, 0x09, 0x1f, 0x12, 0x15, 0x0a, 0x10, 0x29, 0x11, 0x05, 0x84, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0x02, 0x6d, 0x24, 0x2a, 0x07, 0x0d, 0x39, 0x5e, 0x57, 0x34, 0x15, 0x27, 0x36, 0x4f, 0x27, 0x26, 0x01, 0x01, 0x6e, 0x02, 0x05, 0x3d, 0x4e, 0x56, 0x9a, 0x29, 0x71, 0x61, 0x1a, 0x4b, 0xee, 0x07, 0x07, 0x15, 0x18, 0x22, 0x1c, 0x09, 0x0d, 0x1c, 0x25, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x04, 0xba, 0x02, 0xe6, 0x08, 0xe8, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x01, 0x35, 0x25, 0x15, 0x01, 0x35, 0x25, 0x15, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0xfe, 0xe0, 0x02, 0x0e, 0xfd, 0xf2, 0x02, 0x0e, 0x07, 0x78, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0xfe, 0x67, 0x6e, 0x82, 0x6e, 0xfe, 0x8e, 0x6e, 0x82, 0x6e, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x04, 0xcb, 0x02, 0xe6, 0x08, 0x02, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x01, 0x35, 0x25, 0x15, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0xfe, 0xe0, 0x02, 0x0e, 0x05, 0x84, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0x01, 0xc3, 0x6e, 0x82, 0x6e, 0x00, 0x03, 0x00, 0xb4, 0x04, 0xcb, 0x02, 0xe6, 0x09, 0x55, 0x00, 0x28, 0x00, 0x47, 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x33, 0x15, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x35, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0x0c, 0x08, 0x12, 0x61, 0x3e, 0x1a, 0x38, 0x42, 0x24, 0x31, 0x0c, 0x0f, 0x21, 0x12, 0x20, 0x1d, 0x1b, 0x19, 0x26, 0x3f, 0xb4, 0x84, 0x89, 0x7d, 0x15, 0x4d, 0x03, 0x02, 0x09, 0x1f, 0x12, 0x15, 0x0a, 0x10, 0x29, 0x11, 0x05, 0x84, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0x02, 0xc3, 0x02, 0x0a, 0x38, 0x5f, 0x57, 0x34, 0x15, 0x27, 0x36, 0x4f, 0x20, 0x2d, 0x01, 0x01, 0x6e, 0x02, 0x02, 0x03, 0x3d, 0x2a, 0x7b, 0x6e, 0x6d, 0x12, 0x70, 0x07, 0x07, 0x15, 0x18, 0x22, 0x1c, 0x09, 0x0d, 0x1c, 0x25, 0x12, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x04, 0xba, 0x02, 0xe6, 0x08, 0x20, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x01, 0x35, 0x25, 0x15, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0xfe, 0xe0, 0x02, 0x0e, 0x06, 0xb0, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0xfe, 0x3f, 0x6e, 0x82, 0x6e, 0x00, 0x02, 0x00, 0xc6, 0x04, 0xbf, 0x02, 0xd4, 0x07, 0x9e, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x03, 0x35, 0x25, 0x15, 0x01, 0x2e, 0x46, 0x28, 0x0e, 0x0f, 0x33, 0x34, 0x53, 0x37, 0x2f, 0x2d, 0x39, 0x3c, 0x0f, 0x1a, 0x54, 0x1e, 0x6c, 0xfe, 0xcc, 0x68, 0x02, 0x0e, 0x05, 0x23, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x01, 0xef, 0x6e, 0x82, 0x6e, 0x00, 0x03, 0x00, 0xc6, 0x04, 0xbf, 0x02, 0xd4, 0x08, 0xf1, 0x00, 0x18, 0x00, 0x37, 0x00, 0x46, 0x00, 0x00, 0x01, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x33, 0x15, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x35, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x2e, 0x46, 0x28, 0x0e, 0x0f, 0x33, 0x34, 0x53, 0x37, 0x2f, 0x2d, 0x39, 0x3c, 0x0f, 0x1a, 0x54, 0x1e, 0x6c, 0xfe, 0xcc, 0xc4, 0x08, 0x12, 0x61, 0x3e, 0x1a, 0x38, 0x42, 0x24, 0x31, 0x0c, 0x0f, 0x21, 0x12, 0x20, 0x1d, 0x1b, 0x19, 0x26, 0x3f, 0xb4, 0x84, 0x89, 0x7d, 0x15, 0x4d, 0x03, 0x02, 0x09, 0x1f, 0x12, 0x15, 0x0a, 0x10, 0x29, 0x11, 0x05, 0x23, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x02, 0xef, 0x02, 0x0a, 0x38, 0x5f, 0x57, 0x34, 0x15, 0x27, 0x36, 0x4f, 0x20, 0x2d, 0x01, 0x01, 0x6e, 0x02, 0x02, 0x03, 0x3d, 0x2a, 0x7b, 0x6e, 0x6d, 0x12, 0x70, 0x07, 0x07, 0x15, 0x18, 0x22, 0x1c, 0x09, 0x0d, 0x1c, 0x25, 0x12, 0x08, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x02, 0x13, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0xae, 0xa5, 0xc0, 0x05, 0xd5, 0xfa, 0xbe, 0x93, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0x13, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x25, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x33, 0x01, 0x53, 0xc0, 0xfd, 0xdb, 0xc0, 0xa5, 0x93, 0x93, 0x93, 0x05, 0x42, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x01, 0x54, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x33, 0x01, 0x53, 0xfe, 0x9b, 0xc0, 0xa5, 0x93, 0x05, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x2f, 0x03, 0x93, 0x00, 0x07, 0x00, 0x15, 0x00, 0x00, 0x12, 0x10, 0x16, 0x32, 0x36, 0x10, 0x26, 0x22, 0x01, 0x06, 0x23, 0x22, 0x02, 0x10, 0x12, 0x20, 0x12, 0x15, 0x14, 0x07, 0x33, 0x15, 0xf2, 0xa7, 0xeb, 0xa7, 0xa7, 0xeb, 0x01, 0x0c, 0x46, 0x51, 0xaf, 0xf9, 0xf9, 0x01, 0x5f, 0xf9, 0x5d, 0xd5, 0x02, 0x3e, 0xfe, 0xfa, 0xb9, 0xb9, 0x01, 0x06, 0xb9, 0xfd, 0x09, 0x1d, 0x01, 0x15, 0x01, 0x86, 0x01, 0x15, 0xfe, 0xeb, 0xc3, 0xa9, 0x7f, 0x93, 0x00, 0x02, 0xff, 0xee, 0xff, 0xe3, 0x04, 0x2f, 0x03, 0x93, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x12, 0x10, 0x16, 0x32, 0x36, 0x10, 0x26, 0x22, 0x01, 0x06, 0x22, 0x27, 0x21, 0x35, 0x33, 0x26, 0x35, 0x34, 0x12, 0x20, 0x12, 0x15, 0x14, 0x07, 0x33, 0x15, 0xf2, 0xa7, 0xeb, 0xa7, 0xa7, 0xeb, 0x01, 0x0c, 0x46, 0xa1, 0x46, 0xfe, 0x76, 0xd5, 0x5d, 0xf9, 0x01, 0x5f, 0xf9, 0x5d, 0xd5, 0x02, 0x3e, 0xfe, 0xfa, 0xb9, 0xb9, 0x01, 0x06, 0xb9, 0xfd, 0x09, 0x1d, 0x1d, 0x93, 0x7f, 0xa9, 0xc3, 0x01, 0x15, 0xfe, 0xeb, 0xc3, 0xa9, 0x7f, 0x93, 0x00, 0x02, 0xff, 0xee, 0xff, 0xe3, 0x03, 0xb8, 0x03, 0x93, 0x00, 0x07, 0x00, 0x15, 0x00, 0x00, 0x12, 0x10, 0x16, 0x32, 0x36, 0x10, 0x26, 0x22, 0x03, 0x26, 0x35, 0x34, 0x12, 0x20, 0x12, 0x10, 0x02, 0x23, 0x22, 0x27, 0x21, 0x35, 0xf2, 0xa7, 0xeb, 0xa7, 0xa7, 0xeb, 0xd6, 0x5d, 0xf9, 0x01, 0x5f, 0xf9, 0xf9, 0xb0, 0x50, 0x46, 0xfe, 0x76, 0x02, 0x3e, 0xfe, 0xfa, 0xb9, 0xb9, 0x01, 0x06, 0xb9, 0xfd, 0x9c, 0x7f, 0xa9, 0xc3, 0x01, 0x15, 0xfe, 0xeb, 0xfe, 0x7a, 0xfe, 0xeb, 0x1d, 0x93, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0x20, 0x05, 0xd9, 0x00, 0x0a, 0x00, 0x00, 0x29, 0x01, 0x11, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x11, 0x21, 0x03, 0x1f, 0xfe, 0x15, 0xfd, 0xaf, 0xa1, 0xa1, 0xae, 0xfd, 0x01, 0x46, 0x03, 0x2a, 0x02, 0xaf, 0xfe, 0x5d, 0x01, 0xa3, 0xfd, 0x51, 0xfd, 0x69, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x20, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x00, 0x25, 0x15, 0x21, 0x35, 0x21, 0x11, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x11, 0x03, 0x1f, 0xfc, 0xcf, 0x01, 0x46, 0xfd, 0xaf, 0xa1, 0xa1, 0xae, 0xfd, 0x93, 0x93, 0x93, 0x02, 0x97, 0x02, 0xaf, 0xfe, 0x5d, 0x01, 0xa3, 0xfd, 0x51, 0xfd, 0x69, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0xd7, 0x05, 0xd9, 0x00, 0x0a, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x11, 0x12, 0x01, 0x46, 0xfd, 0xaf, 0xa1, 0xa1, 0xae, 0xfd, 0x93, 0x02, 0x97, 0x02, 0xaf, 0xfe, 0x5d, 0x01, 0xa3, 0xfd, 0x51, 0xfc, 0xd6, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x55, 0x03, 0x71, 0x00, 0x08, 0x00, 0x00, 0x21, 0x23, 0x09, 0x01, 0x23, 0x01, 0x33, 0x01, 0x33, 0x04, 0x55, 0xf9, 0xfe, 0xc5, 0xfe, 0xc5, 0xaf, 0x01, 0x7a, 0xe1, 0x01, 0x48, 0x7b, 0x02, 0xbd, 0xfd, 0x43, 0x03, 0x71, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x55, 0x03, 0x71, 0x00, 0x0a, 0x00, 0x00, 0x33, 0x23, 0x35, 0x33, 0x01, 0x33, 0x01, 0x33, 0x15, 0x23, 0x01, 0xe6, 0xf8, 0x7a, 0x01, 0x49, 0xe1, 0x01, 0x48, 0x7b, 0xf9, 0xfe, 0xc5, 0x93, 0x02, 0xde, 0xfd, 0x22, 0x93, 0x02, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0c, 0x03, 0x71, 0x00, 0x08, 0x00, 0x00, 0x33, 0x23, 0x35, 0x33, 0x01, 0x33, 0x01, 0x23, 0x01, 0xe6, 0xf8, 0x7a, 0x01, 0x49, 0xe1, 0x01, 0x7a, 0xb0, 0xfe, 0xc5, 0x93, 0x02, 0xde, 0xfc, 0x8f, 0x02, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x04, 0xc7, 0xfb, 0xe0, 0xa7, 0x02, 0x19, 0xa7, 0xb9, 0x03, 0x71, 0xfd, 0x22, 0x02, 0xde, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x04, 0xc7, 0xfb, 0x27, 0xb9, 0xa7, 0x02, 0x19, 0xa7, 0xb9, 0x93, 0x02, 0xde, 0xfd, 0x22, 0x02, 0xde, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0e, 0x03, 0x71, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x04, 0x0e, 0xfb, 0xe0, 0xb9, 0xa7, 0x02, 0x19, 0xa7, 0x93, 0x02, 0xde, 0xfd, 0x22, 0x02, 0xde, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x09, 0x00, 0x00, 0x33, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0xa7, 0x02, 0xc0, 0xfd, 0x40, 0x03, 0x67, 0xb9, 0x93, 0x02, 0x4b, 0x93, 0xfd, 0x22, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x09, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x12, 0x03, 0x79, 0xfd, 0x40, 0x03, 0x67, 0xb9, 0x93, 0x02, 0x4b, 0x93, 0xfd, 0x22, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0e, 0x03, 0x71, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x04, 0x0e, 0xfb, 0xe0, 0x03, 0x79, 0xfd, 0x40, 0x03, 0x71, 0xfc, 0x8f, 0x93, 0x02, 0x4b, 0x93, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x04, 0x59, 0x05, 0xe2, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x21, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x01, 0xd0, 0x49, 0x43, 0x67, 0x77, 0x77, 0xce, 0xf1, 0xcf, 0x76, 0x76, 0x68, 0x43, 0x4a, 0x01, 0xe2, 0xfc, 0x9a, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x03, 0x0e, 0x0b, 0x20, 0x31, 0xa8, 0xc5, 0xa9, 0x62, 0x62, 0xa9, 0xc5, 0xa8, 0x31, 0x20, 0x0b, 0xfd, 0x85, 0x93, 0x04, 0xad, 0x70, 0x60, 0x38, 0x38, 0x60, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x59, 0x05, 0xe2, 0x00, 0x15, 0x00, 0x21, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x35, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x02, 0x76, 0x01, 0xe2, 0xfb, 0x96, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x77, 0xce, 0xf1, 0xcf, 0x76, 0x76, 0x68, 0x43, 0x4a, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0x93, 0x93, 0x02, 0x7b, 0x0b, 0x20, 0x31, 0xa8, 0xc5, 0xa9, 0x62, 0x62, 0xa9, 0xc5, 0xa8, 0x31, 0x20, 0x0b, 0x01, 0x9f, 0x70, 0x60, 0x38, 0x38, 0x60, 0x70, 0x60, 0x38, 0x38, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe1, 0x05, 0xe2, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x12, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x77, 0xce, 0xf1, 0xcf, 0x76, 0x76, 0x68, 0x43, 0x4a, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0x02, 0x7b, 0x0b, 0x20, 0x31, 0xa8, 0xc5, 0xa9, 0x62, 0x62, 0xa9, 0xc5, 0xa8, 0x31, 0x20, 0x0b, 0xfc, 0xf2, 0x04, 0xad, 0x70, 0x60, 0x38, 0x38, 0x60, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x04, 0xa6, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x10, 0x33, 0x15, 0x22, 0x07, 0x33, 0x15, 0x23, 0x01, 0x21, 0x35, 0x21, 0x01, 0xdc, 0xda, 0x77, 0x02, 0x78, 0xd9, 0x02, 0xeb, 0xfb, 0xe0, 0x04, 0x20, 0x03, 0x9c, 0x01, 0x0a, 0x66, 0x9a, 0x9e, 0xfc, 0xf8, 0x93, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0xc8, 0x04, 0xa6, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x10, 0x33, 0x15, 0x22, 0x07, 0x33, 0x15, 0x23, 0x01, 0x21, 0x35, 0x21, 0x01, 0xdc, 0xda, 0x77, 0x02, 0x78, 0xd9, 0x02, 0xeb, 0xfb, 0x27, 0x04, 0xd9, 0x03, 0x9c, 0x01, 0x0a, 0x66, 0x9a, 0x9e, 0xfc, 0xf8, 0x93, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0e, 0x04, 0xa6, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x10, 0x33, 0x15, 0x22, 0x07, 0x33, 0x15, 0x23, 0x01, 0x21, 0x35, 0x21, 0x01, 0xdc, 0xda, 0x77, 0x02, 0x78, 0xd9, 0x02, 0x32, 0xfb, 0xe0, 0x04, 0x20, 0x03, 0x9c, 0x01, 0x0a, 0x66, 0x9a, 0x9e, 0xfc, 0xf8, 0x93, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x06, 0x0a, 0x05, 0xee, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x10, 0x36, 0x20, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x11, 0x33, 0x15, 0x01, 0x35, 0x34, 0x27, 0x26, 0x22, 0x06, 0x14, 0x16, 0x33, 0x04, 0xa9, 0xfe, 0x70, 0x8d, 0xdf, 0xa9, 0x9e, 0x9f, 0x01, 0x42, 0x55, 0x7d, 0x02, 0x37, 0xb9, 0xfc, 0x83, 0x53, 0x33, 0xb2, 0x62, 0x67, 0x54, 0x02, 0xde, 0xfe, 0xc4, 0x01, 0x3c, 0xd6, 0x01, 0x55, 0xe5, 0x66, 0x98, 0xb6, 0xc9, 0xfd, 0x22, 0x93, 0x03, 0x71, 0xc9, 0x83, 0x5d, 0x38, 0x98, 0xc6, 0x83, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x06, 0x0a, 0x05, 0xee, 0x00, 0x15, 0x00, 0x1f, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x10, 0x36, 0x20, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x11, 0x33, 0x15, 0x21, 0x35, 0x01, 0x35, 0x34, 0x27, 0x26, 0x22, 0x06, 0x14, 0x16, 0x33, 0x04, 0xa9, 0xfe, 0x70, 0x8d, 0xdf, 0xa9, 0x9e, 0x9f, 0x01, 0x42, 0x55, 0x7d, 0x02, 0x37, 0xb9, 0xf9, 0xe5, 0x02, 0x9e, 0x53, 0x33, 0xb2, 0x62, 0x67, 0x54, 0x93, 0x02, 0x4b, 0xfe, 0xc4, 0x01, 0x3c, 0xd6, 0x01, 0x55, 0xe5, 0x66, 0x98, 0xb6, 0xc9, 0xfd, 0x22, 0x93, 0x93, 0x02, 0xde, 0xc9, 0x83, 0x5d, 0x38, 0x98, 0xc6, 0x83, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x05, 0x50, 0x05, 0xee, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x10, 0x36, 0x20, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x11, 0x21, 0x35, 0x01, 0x35, 0x34, 0x27, 0x26, 0x22, 0x06, 0x14, 0x16, 0x33, 0x04, 0xa9, 0xfe, 0x70, 0x8d, 0xdf, 0xa9, 0x9e, 0x9f, 0x01, 0x42, 0x55, 0x7d, 0x02, 0x37, 0xfa, 0x9e, 0x02, 0x9e, 0x53, 0x33, 0xb2, 0x62, 0x67, 0x54, 0x93, 0x02, 0x4b, 0xfe, 0xc4, 0x01, 0x3c, 0xd6, 0x01, 0x55, 0xe5, 0x66, 0x98, 0xb6, 0xc9, 0xfc, 0x8f, 0x93, 0x02, 0xde, 0xc9, 0x83, 0x5d, 0x38, 0x98, 0xc6, 0x83, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0x3a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0xae, 0x02, 0x42, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x01, 0xe6, 0x05, 0xd5, 0x93, 0xfe, 0x2f, 0x92, 0xfd, 0xb4, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x3a, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x12, 0xc0, 0x02, 0x42, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x01, 0xe6, 0x93, 0x05, 0x42, 0x93, 0xfe, 0x2f, 0x92, 0xfd, 0xb4, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0xf1, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x01, 0x53, 0xfe, 0x9b, 0xc0, 0x02, 0x42, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x93, 0x05, 0x42, 0x93, 0xfe, 0x2f, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0x3a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x01, 0xd4, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x02, 0x43, 0xbf, 0x02, 0xdf, 0x92, 0x01, 0xd1, 0x93, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x3a, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x12, 0x01, 0xe6, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x02, 0x43, 0xbf, 0x93, 0x02, 0x4c, 0x92, 0x01, 0xd1, 0x93, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0x7a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x02, 0x7a, 0xfd, 0x74, 0x01, 0xe6, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x02, 0x43, 0x93, 0x02, 0x4c, 0x92, 0x01, 0xd1, 0x93, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x18, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x17, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0x11, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x33, 0x15, 0x02, 0x59, 0xfe, 0xef, 0x01, 0x0e, 0x49, 0x2f, 0x28, 0x28, 0x37, 0xfe, 0x10, 0xa7, 0x01, 0x33, 0x5e, 0x73, 0x4f, 0x47, 0xbe, 0x02, 0xde, 0xfd, 0xb5, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x22, 0x05, 0xd5, 0xfd, 0x9c, 0x87, 0x5f, 0xd2, 0xa4, 0x82, 0x93, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x18, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x33, 0x15, 0x01, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x12, 0xb9, 0xa7, 0x01, 0x33, 0x5e, 0x73, 0x4f, 0x47, 0xbe, 0xfe, 0x41, 0xfe, 0xef, 0x01, 0x0e, 0x49, 0x2f, 0x28, 0x28, 0x37, 0x93, 0x05, 0x42, 0xfd, 0x9c, 0x87, 0x5f, 0xd2, 0xa4, 0x82, 0x93, 0x02, 0xde, 0xfd, 0xb5, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xa1, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x02, 0x59, 0xfe, 0xef, 0x01, 0x0e, 0x49, 0x2f, 0x28, 0x28, 0x37, 0xfd, 0x57, 0xb9, 0xa7, 0x01, 0x33, 0x5e, 0x73, 0x4f, 0x4f, 0x50, 0x61, 0x02, 0xde, 0xfd, 0xb5, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x22, 0x93, 0x05, 0x42, 0xfd, 0x9c, 0x87, 0x5f, 0xd2, 0xad, 0x87, 0x85, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x04, 0x7a, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x21, 0x34, 0x02, 0x27, 0x26, 0x27, 0x03, 0x35, 0x21, 0x15, 0x05, 0x13, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x21, 0x15, 0x02, 0x66, 0x18, 0x30, 0x46, 0x7b, 0xaf, 0x03, 0x0c, 0xfd, 0xd6, 0x8e, 0x7a, 0x2f, 0x3b, 0x06, 0x02, 0x01, 0x70, 0x99, 0x01, 0x5f, 0x96, 0xdc, 0xdc, 0x01, 0x39, 0x56, 0x93, 0x01, 0xfe, 0xef, 0xea, 0xb8, 0xe6, 0x9c, 0x40, 0x39, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x7a, 0x05, 0xd5, 0x00, 0x16, 0x00, 0x00, 0x23, 0x35, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x35, 0x21, 0x15, 0x05, 0x13, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x21, 0x15, 0x12, 0x02, 0x75, 0x03, 0x07, 0x0b, 0x30, 0x46, 0x7b, 0xaf, 0x03, 0x0c, 0xfd, 0xd6, 0x8e, 0x7a, 0x2f, 0x3b, 0x06, 0x02, 0x01, 0x70, 0x93, 0x58, 0x5d, 0xb0, 0x96, 0xdc, 0xdc, 0x01, 0x39, 0x56, 0x93, 0x01, 0xfe, 0xef, 0xea, 0xb8, 0xe6, 0x9c, 0x40, 0x39, 0x93, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x23, 0x35, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x35, 0x21, 0x15, 0x05, 0x13, 0x16, 0x17, 0x16, 0x12, 0x07, 0x12, 0x02, 0x75, 0x03, 0x07, 0x0b, 0x30, 0x46, 0x7b, 0xaf, 0x03, 0x0c, 0xfd, 0xd6, 0x8e, 0x7a, 0x2f, 0x3b, 0x0a, 0x01, 0x93, 0x58, 0x5d, 0xb0, 0x96, 0xdc, 0xdc, 0x01, 0x39, 0x56, 0x93, 0x01, 0xfe, 0xef, 0xea, 0xb8, 0xe6, 0xfe, 0xc9, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x02, 0x98, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x21, 0x11, 0x03, 0x35, 0x13, 0x33, 0x11, 0x33, 0x15, 0x01, 0x32, 0xfb, 0xf9, 0xa8, 0xbf, 0x04, 0xdf, 0xfe, 0xc7, 0xf6, 0x01, 0x39, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0x98, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x03, 0x35, 0x13, 0x33, 0x11, 0x33, 0x15, 0x12, 0x01, 0x44, 0xfb, 0xf9, 0xa8, 0xbf, 0x93, 0x04, 0x4c, 0xfe, 0xc7, 0xf6, 0x01, 0x39, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x01, 0xd8, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x03, 0x35, 0x13, 0x33, 0x11, 0x12, 0x01, 0x44, 0xfb, 0xf9, 0xa8, 0x93, 0x04, 0x4c, 0xfe, 0xc7, 0xf6, 0x01, 0x39, 0xfa, 0x2b, 0x00, 0x00, 0x03, 0x00, 0xad, 0x00, 0x00, 0x06, 0xfa, 0x04, 0x1a, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x33, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x33, 0x15, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0xae, 0xdb, 0xb3, 0x70, 0x6c, 0x30, 0x21, 0x87, 0xbe, 0xbd, 0x55, 0x7a, 0xc0, 0xfe, 0x98, 0x93, 0x51, 0x74, 0x72, 0x01, 0xca, 0xfd, 0x8e, 0x94, 0x50, 0x62, 0x85, 0x01, 0xcb, 0x01, 0xee, 0xa6, 0x00, 0xff, 0x4b, 0x2d, 0x2d, 0xd2, 0x58, 0x80, 0x68, 0xfd, 0xb9, 0x93, 0x02, 0x7c, 0x82, 0x80, 0xc5, 0x95, 0xfe, 0x6e, 0x01, 0x63, 0x83, 0x7f, 0xa7, 0xd2, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x06, 0xfa, 0x04, 0x1a, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x33, 0x15, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x12, 0xc0, 0xdb, 0xb3, 0x70, 0x6c, 0x30, 0x21, 0x87, 0xbe, 0xbd, 0x55, 0x7a, 0xc0, 0xfe, 0x98, 0x93, 0x51, 0x74, 0x72, 0x01, 0xca, 0xfd, 0x8e, 0x94, 0x50, 0x62, 0x85, 0x01, 0xcb, 0x93, 0x01, 0x5b, 0xa6, 0x00, 0xff, 0x4b, 0x2d, 0x2d, 0xd2, 0x58, 0x80, 0x68, 0xfd, 0xb9, 0x93, 0x02, 0x7c, 0x82, 0x80, 0xc5, 0x95, 0xfe, 0x6e, 0x01, 0x63, 0x83, 0x7f, 0xa7, 0xd2, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x06, 0x3a, 0x04, 0x1a, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x12, 0xc0, 0xdb, 0xb3, 0x70, 0x6c, 0x30, 0x21, 0x87, 0xbe, 0xbd, 0x55, 0x7a, 0xa8, 0x93, 0x51, 0x74, 0x72, 0x01, 0xca, 0xfd, 0x8e, 0x94, 0x50, 0x62, 0x85, 0x01, 0xcb, 0x93, 0x01, 0x5b, 0xa6, 0x00, 0xff, 0x4b, 0x2d, 0x2d, 0xd2, 0x58, 0x80, 0x68, 0xfd, 0x26, 0x02, 0x7c, 0x82, 0x80, 0xc5, 0x95, 0xfe, 0x6e, 0x01, 0x63, 0x83, 0x7f, 0xa7, 0xd2, 0xf2, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0x7a, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0x61, 0xfe, 0xd6, 0x01, 0x2a, 0xa5, 0x01, 0x2a, 0xfe, 0xd6, 0x01, 0x73, 0x03, 0x81, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x93, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x7a, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x12, 0x01, 0x73, 0xfe, 0xd6, 0x01, 0x2a, 0xa5, 0x01, 0x2a, 0xfe, 0xd6, 0x01, 0x73, 0x93, 0x02, 0xee, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x93, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x31, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x02, 0x06, 0xfd, 0xe8, 0x01, 0x73, 0xfe, 0xd6, 0x01, 0x2a, 0xa5, 0x01, 0x2a, 0xfe, 0xd6, 0x93, 0x02, 0xee, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x05, 0xb6, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x15, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x07, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x03, 0x9d, 0xfe, 0x6a, 0xa6, 0xfe, 0xd6, 0x01, 0x2a, 0xa6, 0x01, 0x96, 0xa6, 0x01, 0x2b, 0xfe, 0xd5, 0x01, 0x73, 0x93, 0x02, 0xee, 0xfd, 0x12, 0x93, 0x03, 0x81, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x05, 0xb6, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x25, 0x11, 0x21, 0x11, 0x12, 0x01, 0x73, 0xfe, 0xd6, 0x01, 0x2a, 0xa6, 0x01, 0x96, 0xa6, 0x01, 0x2b, 0xfe, 0xd5, 0x01, 0x73, 0xfd, 0xe7, 0xfe, 0x6a, 0x93, 0x02, 0xee, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x93, 0x93, 0x02, 0xee, 0xfd, 0x12, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x05, 0x6e, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x03, 0x11, 0x21, 0x11, 0x04, 0x43, 0xfb, 0xab, 0x01, 0x73, 0xfe, 0xd6, 0x01, 0x2a, 0xa6, 0x01, 0x96, 0xa6, 0x01, 0x2b, 0xfe, 0xd5, 0xa6, 0xfe, 0x6a, 0x93, 0x02, 0xee, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x02, 0xee, 0xfd, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x33, 0x15, 0x01, 0x11, 0x21, 0x11, 0xa7, 0x03, 0x67, 0xb9, 0xfc, 0x87, 0x02, 0x19, 0x03, 0x71, 0xfd, 0x22, 0x93, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x21, 0x11, 0x33, 0x15, 0x01, 0x11, 0x21, 0x11, 0x12, 0xb9, 0x03, 0x67, 0xb9, 0xfc, 0x87, 0x02, 0x19, 0x93, 0x02, 0xde, 0xfd, 0x22, 0x93, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0e, 0x03, 0x71, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x21, 0x05, 0x11, 0x21, 0x11, 0x04, 0x0e, 0xfb, 0xe0, 0xb9, 0x03, 0x67, 0xfd, 0x40, 0x02, 0x19, 0x93, 0x02, 0xde, 0x93, 0xfd, 0xb5, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x92, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x01, 0x21, 0x01, 0x07, 0x01, 0x21, 0x01, 0x21, 0x15, 0x03, 0x65, 0xfd, 0xb6, 0x01, 0x25, 0x68, 0xfe, 0x5f, 0x04, 0x12, 0xfe, 0x91, 0x01, 0xb8, 0x05, 0x42, 0xfb, 0x7e, 0xc0, 0x05, 0xd5, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x92, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x21, 0x01, 0x05, 0x35, 0x21, 0x01, 0x21, 0x01, 0x21, 0x15, 0x03, 0x65, 0xfd, 0xb6, 0x01, 0x25, 0xfd, 0xae, 0x01, 0xb8, 0xfe, 0x91, 0x04, 0x12, 0xfe, 0x91, 0x01, 0xb8, 0x05, 0x42, 0xfb, 0x7e, 0xc0, 0x93, 0x05, 0x42, 0xfa, 0xbe, 0x93, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x4a, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x01, 0x21, 0x01, 0x05, 0x35, 0x21, 0x01, 0x21, 0x01, 0x03, 0x65, 0xfd, 0xb6, 0x01, 0x25, 0xfd, 0xae, 0x01, 0xb8, 0xfe, 0x91, 0x04, 0x12, 0xfe, 0x5f, 0x05, 0x42, 0xfb, 0x7e, 0xc0, 0x93, 0x05, 0x42, 0xfa, 0x2b, 0x00, 0x00, 0x03, 0x00, 0xad, 0x00, 0x00, 0x05, 0x5b, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x2f, 0x01, 0x11, 0x21, 0x15, 0x03, 0x15, 0x97, 0x55, 0x21, 0x1b, 0x1b, 0x1b, 0x5e, 0x94, 0xfe, 0x3f, 0x01, 0x1c, 0xfe, 0x3e, 0x01, 0xc2, 0x01, 0x84, 0x77, 0x3a, 0x3e, 0x01, 0x3d, 0x53, 0x7e, 0xbf, 0x02, 0x46, 0x03, 0x71, 0x51, 0x45, 0x3d, 0x3c, 0x64, 0x5e, 0xfd, 0x9c, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x03, 0x71, 0x02, 0x64, 0x85, 0x90, 0x7c, 0x91, 0x5b, 0x7c, 0x01, 0x01, 0xfd, 0xb5, 0x93, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x05, 0x5b, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x01, 0x11, 0x21, 0x11, 0x01, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x2f, 0x01, 0x11, 0x21, 0x15, 0x03, 0x15, 0x97, 0x55, 0x21, 0x1b, 0x1b, 0x1b, 0x5e, 0x94, 0xfe, 0x3f, 0x01, 0x1c, 0xfd, 0x7e, 0xc0, 0x01, 0xc2, 0x01, 0x84, 0x77, 0x3a, 0x3e, 0x01, 0x3d, 0x53, 0x7e, 0xbf, 0x02, 0x46, 0x03, 0x71, 0x51, 0x45, 0x3d, 0x3c, 0x64, 0x5e, 0xfd, 0x9c, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x93, 0x02, 0xde, 0x02, 0x64, 0x85, 0x90, 0x7c, 0x91, 0x5b, 0x7c, 0x01, 0x01, 0xfd, 0xb5, 0x93, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x04, 0xe3, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x01, 0x11, 0x21, 0x11, 0x13, 0x21, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x2f, 0x01, 0x03, 0x15, 0x97, 0x55, 0x21, 0x1b, 0x1b, 0x1b, 0x5e, 0x94, 0xfe, 0x3f, 0x01, 0x1c, 0xa5, 0xfc, 0xd9, 0xc0, 0x01, 0xc2, 0x01, 0x84, 0x77, 0x3a, 0x3e, 0x01, 0x3d, 0x53, 0x7e, 0xbf, 0x03, 0x71, 0x51, 0x45, 0x3d, 0x3c, 0x64, 0x5e, 0xfd, 0x9c, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x93, 0x02, 0xde, 0x02, 0x64, 0x85, 0x90, 0x7c, 0x91, 0x5b, 0x7c, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x02, 0x7e, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0x2a, 0xa6, 0xbe, 0x03, 0x81, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0x01, 0xc1, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0x2a, 0xa6, 0xbe, 0x93, 0x02, 0xee, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0x01, 0xc1, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x24, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0x2a, 0xa6, 0x93, 0x02, 0xee, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0x01, 0xc1, 0xfa, 0x2b, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x05, 0x49, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0xac, 0x01, 0x12, 0xfe, 0xf2, 0x4a, 0x2f, 0x27, 0x27, 0x37, 0x01, 0x4a, 0xfe, 0xcd, 0x61, 0x70, 0x4f, 0x4f, 0x4f, 0x61, 0x01, 0xfa, 0x01, 0x2b, 0xfe, 0xd5, 0x01, 0xeb, 0x02, 0xf7, 0x02, 0x4b, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x09, 0x02, 0x64, 0x87, 0x5f, 0xd2, 0xad, 0x87, 0x85, 0xfd, 0x22, 0x93, 0xfe, 0x2f, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x05, 0x49, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x35, 0x21, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0xac, 0x01, 0x12, 0xfe, 0xf2, 0x4a, 0x2f, 0x27, 0x27, 0x37, 0xfe, 0x80, 0x02, 0xca, 0xfe, 0xcd, 0x61, 0x70, 0x4f, 0x4f, 0x4f, 0x61, 0x01, 0xfa, 0x01, 0x2b, 0xfe, 0xd5, 0x01, 0xeb, 0x02, 0xf7, 0x02, 0x4b, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x09, 0x93, 0x01, 0xd1, 0x87, 0x5f, 0xd2, 0xad, 0x87, 0x85, 0xfd, 0x22, 0x93, 0xfe, 0x2f, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x89, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x35, 0x21, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xac, 0x01, 0x12, 0xfe, 0xf2, 0x4a, 0x2f, 0x27, 0x27, 0x37, 0xfe, 0x80, 0x02, 0xca, 0xfe, 0xcd, 0x61, 0x70, 0x4f, 0x4f, 0x4f, 0x61, 0x01, 0xfa, 0x01, 0x2b, 0xfe, 0xd5, 0x02, 0xf7, 0x02, 0x4b, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x09, 0x93, 0x01, 0xd1, 0x87, 0x5f, 0xd2, 0xad, 0x87, 0x85, 0xfd, 0x22, 0x93, 0xfd, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0x7a, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0x61, 0xfe, 0xd6, 0x02, 0xf9, 0xfe, 0xd6, 0x01, 0x73, 0x05, 0x42, 0x93, 0x93, 0xfb, 0x51, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x7a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x12, 0x01, 0x73, 0xfe, 0xd6, 0x02, 0xf9, 0xfe, 0xd6, 0x01, 0x73, 0x93, 0x04, 0xaf, 0x93, 0x93, 0xfb, 0x51, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x31, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x06, 0xfd, 0xe8, 0x01, 0x73, 0xfe, 0xd6, 0x02, 0xf9, 0xfe, 0xd6, 0x93, 0x04, 0xaf, 0x93, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x92, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x25, 0x09, 0x01, 0x07, 0x01, 0x33, 0x01, 0x33, 0x15, 0x03, 0x65, 0xfe, 0xdb, 0xfe, 0xdb, 0xe4, 0x01, 0xa1, 0xd0, 0x01, 0x6f, 0x7b, 0x93, 0x04, 0x82, 0xfb, 0x7e, 0x93, 0x05, 0xd5, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x92, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x09, 0x01, 0x05, 0x35, 0x33, 0x01, 0x33, 0x01, 0x33, 0x15, 0x03, 0x65, 0xfe, 0xdb, 0xfe, 0xdb, 0xfe, 0xd3, 0x7b, 0x01, 0x6f, 0xd0, 0x01, 0x6f, 0x7b, 0x93, 0x04, 0x82, 0xfb, 0x7e, 0x93, 0x93, 0x05, 0x42, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x4a, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x25, 0x09, 0x01, 0x05, 0x35, 0x33, 0x01, 0x33, 0x01, 0x03, 0x65, 0xfe, 0xdb, 0xfe, 0xdb, 0xfe, 0xd3, 0x7b, 0x01, 0x6f, 0xd0, 0x01, 0xa1, 0x93, 0x04, 0x82, 0xfb, 0x7e, 0x93, 0x93, 0x05, 0x42, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x01, 0xd0, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x01, 0xd0, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x01, 0xe2, 0xfc, 0x9a, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x01, 0x86, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x93, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x00, 0x23, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x12, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x01, 0xd0, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x01, 0xe2, 0xfc, 0x9a, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x93, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe1, 0x05, 0xd5, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x23, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x12, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x01, 0xd0, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xfe, 0x7b, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x15, 0x02, 0x7e, 0xfe, 0xd6, 0xa6, 0x02, 0x76, 0xbe, 0x05, 0x42, 0xfe, 0xc5, 0x01, 0xce, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x15, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0x02, 0x76, 0xbe, 0x93, 0x04, 0xaf, 0xfe, 0xc5, 0x01, 0xce, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x24, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0x02, 0x76, 0x93, 0x04, 0xaf, 0xfe, 0xc5, 0x01, 0xce, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0xe3, 0x04, 0xe6, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x15, 0x02, 0x7e, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0xd0, 0xbe, 0x03, 0x4f, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0xfc, 0xb1, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe3, 0x04, 0xe6, 0x00, 0x0d, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x15, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0xd0, 0xbe, 0x93, 0x02, 0xbc, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0xfc, 0xb1, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x24, 0x04, 0xe6, 0x00, 0x0b, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0xd0, 0x93, 0x02, 0xbc, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0xfc, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x03, 0xd5, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x01, 0x54, 0x01, 0x1c, 0xfe, 0x3e, 0x01, 0xc2, 0xfe, 0x3e, 0x02, 0x67, 0xc0, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x03, 0x71, 0x01, 0xd1, 0x93, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xd5, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x01, 0x54, 0x01, 0x1c, 0xfd, 0x7e, 0xc0, 0x01, 0xc2, 0xfe, 0x3e, 0x02, 0x67, 0xc0, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x93, 0x02, 0xde, 0x01, 0xd1, 0x93, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0x16, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x54, 0x01, 0x1c, 0xfd, 0x7e, 0xc0, 0x01, 0xc2, 0xfe, 0x3e, 0x02, 0x67, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x93, 0x02, 0xde, 0x01, 0xd1, 0x93, 0xfa, 0x2b, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x00, 0x12, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x13, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0xf2, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x8c, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xa6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x01, 0xe2, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0xfc, 0x7e, 0x01, 0x86, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0x01, 0x86, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x00, 0x12, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x01, 0x15, 0x21, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0xf2, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x03, 0x14, 0xfb, 0x96, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xa6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0xfd, 0x11, 0x93, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0x01, 0x86, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe1, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x00, 0x12, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x13, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x21, 0x35, 0xf2, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x8c, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xa6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0xfd, 0x78, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0xfd, 0x11, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0x01, 0x86, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xfe, 0x7b, 0x93, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x00, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x01, 0xd0, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x02, 0xfa, 0xfe, 0xd6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x01, 0xe2, 0xfc, 0x9a, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x01, 0x86, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0x93, 0xf2, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x93, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x00, 0x25, 0x15, 0x21, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x04, 0x58, 0xfb, 0x96, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x02, 0xfa, 0xfe, 0xd6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0x93, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0x93, 0xf2, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x02, 0x8f, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe1, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x02, 0x76, 0xfd, 0x78, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x02, 0xfa, 0xfe, 0xd6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0x93, 0xf2, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0x01, 0x9d, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0xff, 0xff, 0xfd, 0x3a, 0x03, 0xfb, 0xff, 0x28, 0x06, 0x20, 0x10, 0x07, 0x02, 0x9c, 0xfc, 0x65, 0xff, 0x1a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0xca, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdd, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x01, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x6e, 0x05, 0x18, 0x04, 0x99, 0x05, 0xe0, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x07, 0x23, 0x27, 0x23, 0x07, 0x23, 0x27, 0x23, 0x07, 0x23, 0x27, 0x04, 0x98, 0x5a, 0x2d, 0x2d, 0x9d, 0x2d, 0x2d, 0x2d, 0x9e, 0x2d, 0x2d, 0x5a, 0x05, 0xe0, 0xc8, 0x64, 0x64, 0x64, 0x64, 0xc8, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x05, 0x63, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0xae, 0xb0, 0xfd, 0xac, 0xf5, 0xb0, 0x02, 0x54, 0xf5, 0xb5, 0xfe, 0xb6, 0x78, 0x04, 0xe1, 0xfb, 0x1f, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0xd5, 0xaa, 0xfe, 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x04, 0xb3, 0x04, 0x60, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0x0d, 0xa5, 0xfe, 0x1a, 0xd4, 0xa4, 0x01, 0xe6, 0xd5, 0xa5, 0xfe, 0xfb, 0x6e, 0x03, 0x83, 0xfc, 0x7d, 0x04, 0x60, 0xfc, 0x7f, 0x03, 0x81, 0xfc, 0x39, 0x99, 0xfe, 0x56, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0xfe, 0x56, 0x03, 0xe9, 0x04, 0x7b, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x00, 0x25, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x01, 0x03, 0x43, 0x3c, 0x9f, 0x6a, 0xad, 0xb4, 0xa5, 0x70, 0x6f, 0x87, 0x9b, 0xa6, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0xfe, 0xfa, 0x6a, 0x42, 0x66, 0x63, 0xf0, 0xe7, 0x02, 0xa6, 0xfd, 0x61, 0x9f, 0x9f, 0xbe, 0xa4, 0x02, 0x7b, 0xfc, 0x2b, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0x04, 0xd0, 0x00, 0x03, 0x00, 0x70, 0xfe, 0x90, 0x03, 0xda, 0x03, 0x52, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0x08, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x39, 0x39, 0xa6, 0x39, 0x39, 0x39, 0x39, 0xa6, 0x39, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0xfd, 0xab, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x02, 0x00, 0x70, 0xfe, 0xa2, 0x03, 0xda, 0x03, 0x52, 0x00, 0x20, 0x00, 0x24, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x33, 0x15, 0x23, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0xa3, 0x88, 0x88, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0xfd, 0x77, 0x96, 0x00, 0x04, 0x00, 0x70, 0xfe, 0xa2, 0x03, 0xda, 0x05, 0xf7, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x07, 0x06, 0x17, 0x2b, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x03, 0x33, 0x15, 0x23, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0xba, 0x32, 0x46, 0x14, 0x2f, 0x1b, 0x01, 0x40, 0x2e, 0x15, 0x9d, 0x65, 0x49, 0x5c, 0x20, 0x5e, 0x38, 0x3f, 0x3b, 0x3a, 0x30, 0x98, 0x88, 0x88, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0x02, 0xa7, 0x0d, 0x21, 0x15, 0x20, 0x10, 0x01, 0x1c, 0x15, 0xa8, 0x65, 0x01, 0x8f, 0xfe, 0xbf, 0x49, 0x28, 0x18, 0x1a, 0x19, 0x52, 0x5b, 0x32, 0x2a, 0xfb, 0x35, 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x70, 0xff, 0xda, 0x03, 0xda, 0x05, 0x78, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0xcf, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0x02, 0xbd, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x05, 0x00, 0x70, 0xff, 0xda, 0x03, 0xda, 0x05, 0xaa, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0x5f, 0x87, 0x87, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x87, 0x87, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0x02, 0xef, 0x96, 0x01, 0x90, 0x96, 0x64, 0x96, 0x01, 0x90, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x02, 0x26, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0xd0, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0xfd, 0x4a, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x02, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x02, 0x26, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x33, 0x15, 0x23, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x7a, 0x87, 0x87, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0xfd, 0x40, 0x96, 0x00, 0x03, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x02, 0x26, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x05, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0xfe, 0x3a, 0x87, 0x87, 0x02, 0x40, 0x87, 0x87, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0xe0, 0x96, 0xfe, 0xb6, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x03, 0xb6, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x3b, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x02, 0x18, 0x96, 0x96, 0x96, 0x00, 0x00, 0x05, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x04, 0xb0, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x3b, 0x87, 0x87, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x87, 0x87, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x02, 0x18, 0x96, 0x01, 0x90, 0x96, 0x64, 0x96, 0x01, 0x90, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x75, 0xfe, 0x0c, 0x09, 0x40, 0x03, 0xb6, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x00, 0x25, 0x16, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x33, 0x32, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x2f, 0x01, 0x33, 0x17, 0x16, 0x17, 0x16, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x05, 0x26, 0x46, 0x2b, 0x21, 0xa6, 0x11, 0x3a, 0x63, 0x7f, 0xa6, 0x4b, 0x27, 0x59, 0x44, 0x75, 0x83, 0x6a, 0x3d, 0x62, 0x21, 0x1d, 0x42, 0x2b, 0x7c, 0x10, 0x2c, 0x55, 0x3a, 0x32, 0x7b, 0x24, 0x15, 0x4c, 0x77, 0xae, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x59, 0x55, 0x6d, 0x55, 0x39, 0x01, 0x01, 0x0e, 0x3a, 0xa6, 0x20, 0x0f, 0x19, 0x34, 0x19, 0x86, 0x86, 0x86, 0x88, 0x88, 0xb5, 0x02, 0x7c, 0x5f, 0xca, 0xcd, 0x32, 0xa9, 0x01, 0x18, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5b, 0x19, 0x09, 0x19, 0x46, 0x7b, 0x9f, 0x1e, 0x14, 0x02, 0x02, 0x3c, 0xb3, 0x6b, 0xaa, 0x3e, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x30, 0x9e, 0x6c, 0x8e, 0x7d, 0x3d, 0xea, 0x9c, 0x4a, 0x3c, 0x7e, 0x02, 0xfe, 0x96, 0xfc, 0x18, 0x96, 0x00, 0x03, 0xff, 0xee, 0xfe, 0xa2, 0x05, 0x70, 0x03, 0xe8, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x01, 0x5a, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x52, 0x44, 0x5c, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x01, 0x3c, 0x86, 0x86, 0x86, 0x88, 0x88, 0x8a, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0xc7, 0x71, 0x5c, 0x18, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x03, 0xa7, 0x96, 0xfb, 0xe6, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0xfe, 0xa2, 0x06, 0x7f, 0x03, 0xe8, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x00, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x04, 0x7d, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x24, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x4b, 0x28, 0x59, 0x43, 0x75, 0x82, 0x6a, 0x3e, 0xfd, 0xdb, 0x86, 0x86, 0x86, 0x88, 0x88, 0x14, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x49, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5a, 0x03, 0xe2, 0x96, 0xfb, 0xe6, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x75, 0xfe, 0x0c, 0x09, 0x40, 0x02, 0xee, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x52, 0x00, 0x00, 0x25, 0x16, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x33, 0x32, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x2f, 0x01, 0x33, 0x17, 0x16, 0x17, 0x16, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x05, 0x26, 0x46, 0x2b, 0x21, 0xa6, 0x11, 0x3a, 0x63, 0x7f, 0xa6, 0x4b, 0x27, 0x59, 0x44, 0x75, 0x83, 0x6a, 0x3d, 0x62, 0x21, 0x1d, 0x42, 0x2b, 0x7c, 0x10, 0x2c, 0x55, 0x3a, 0x32, 0x7b, 0x24, 0x15, 0x4c, 0x77, 0xae, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x59, 0x55, 0x6d, 0x55, 0x39, 0x01, 0x01, 0x0e, 0x3a, 0xa6, 0x20, 0x0f, 0x19, 0x34, 0x9f, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb5, 0x02, 0x7c, 0x5f, 0xca, 0xcd, 0x32, 0xa9, 0x01, 0x18, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5b, 0x19, 0x09, 0x19, 0x46, 0x7b, 0x9f, 0x1e, 0x14, 0x02, 0x02, 0x3c, 0xb3, 0x6b, 0xaa, 0x3e, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x30, 0x9e, 0x6c, 0x8e, 0x7d, 0x3d, 0xea, 0x9c, 0x4a, 0x3c, 0x7e, 0xfd, 0xea, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0x0c, 0x05, 0x70, 0x02, 0xee, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x5a, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x52, 0x44, 0x5c, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x01, 0xc2, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x8a, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0xc7, 0x71, 0x5c, 0x18, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0xfe, 0x61, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0xfe, 0x0c, 0x06, 0x7f, 0x02, 0xee, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x44, 0x00, 0x00, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x7d, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x24, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x4b, 0x28, 0x59, 0x43, 0x75, 0x82, 0x6a, 0x3e, 0xfe, 0x61, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x14, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x49, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5a, 0xfe, 0x9c, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x07, 0x00, 0x75, 0xfe, 0x0c, 0x09, 0x40, 0x04, 0xb0, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x52, 0x00, 0x56, 0x00, 0x5a, 0x00, 0x5e, 0x00, 0x00, 0x25, 0x16, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x33, 0x32, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x2f, 0x01, 0x33, 0x17, 0x16, 0x17, 0x16, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x05, 0x26, 0x46, 0x2b, 0x21, 0xa6, 0x11, 0x3a, 0x63, 0x7f, 0xa6, 0x4b, 0x27, 0x59, 0x44, 0x75, 0x83, 0x6a, 0x3d, 0x62, 0x21, 0x1d, 0x42, 0x2b, 0x7c, 0x10, 0x2c, 0x55, 0x3a, 0x32, 0x7b, 0x24, 0x15, 0x4c, 0x77, 0xae, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x59, 0x55, 0x6d, 0x55, 0x39, 0x01, 0x01, 0x0e, 0x3a, 0xa6, 0x20, 0x0f, 0x19, 0x34, 0x19, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xf7, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb5, 0x02, 0x7c, 0x5f, 0xca, 0xcd, 0x32, 0xa9, 0x01, 0x18, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5b, 0x19, 0x09, 0x19, 0x46, 0x7b, 0x9f, 0x1e, 0x14, 0x02, 0x02, 0x3c, 0xb3, 0x6b, 0xaa, 0x3e, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x30, 0x9e, 0x6c, 0x8e, 0x7d, 0x3d, 0xea, 0x9c, 0x4a, 0x3c, 0x7e, 0x03, 0xf8, 0x96, 0x64, 0x96, 0x96, 0x96, 0xfb, 0x82, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xee, 0xfe, 0x0c, 0x05, 0x70, 0x04, 0xb0, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x5a, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x52, 0x44, 0x5c, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x01, 0x3c, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xf7, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x8a, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0xc7, 0x71, 0x5c, 0x18, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x04, 0x6f, 0x96, 0x64, 0x96, 0x96, 0x96, 0xfb, 0x82, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x07, 0xff, 0xee, 0xfe, 0x0c, 0x06, 0x7f, 0x04, 0xb0, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x00, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x7d, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x24, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x4b, 0x28, 0x59, 0x43, 0x75, 0x82, 0x6a, 0x3e, 0xfd, 0xdb, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xf7, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x14, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x49, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5a, 0x04, 0xaa, 0x96, 0x64, 0x96, 0x96, 0x96, 0xfb, 0x82, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x75, 0xfe, 0x0c, 0x08, 0xe5, 0x02, 0xe5, 0x00, 0x3c, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x51, 0x00, 0x00, 0x21, 0x23, 0x22, 0x27, 0x26, 0x35, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x33, 0x06, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x03, 0x22, 0x07, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x05, 0xd0, 0xf9, 0x22, 0x2f, 0x28, 0x43, 0x4f, 0xd6, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x5c, 0x52, 0x92, 0x27, 0x1d, 0x23, 0x9a, 0x01, 0x0d, 0x09, 0x24, 0x67, 0x6f, 0x61, 0x85, 0x40, 0x50, 0x70, 0x57, 0xa8, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x43, 0x75, 0x76, 0x5d, 0x19, 0xb7, 0x10, 0x45, 0x71, 0x98, 0x82, 0xa8, 0xd6, 0x74, 0xa8, 0x01, 0x02, 0x7b, 0x21, 0xfe, 0xe6, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x1e, 0x1a, 0x10, 0xba, 0x80, 0x9b, 0x4d, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x44, 0x8a, 0x6c, 0x7f, 0x93, 0x8a, 0x0f, 0x37, 0x28, 0x32, 0x92, 0x6c, 0x5e, 0x46, 0x22, 0x01, 0x02, 0x25, 0x47, 0xe9, 0x4d, 0x46, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0x02, 0x37, 0x51, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0xfd, 0x01, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0xa2, 0x05, 0x94, 0x02, 0xe5, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x36, 0x00, 0x00, 0x01, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x05, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0x97, 0x82, 0xa8, 0xd6, 0x73, 0xa8, 0x7d, 0x21, 0x2c, 0x44, 0xa8, 0xf8, 0x43, 0x46, 0x3a, 0x23, 0x5c, 0x9b, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x10, 0x28, 0x5b, 0x56, 0x89, 0x82, 0x44, 0x4c, 0x68, 0x60, 0xa7, 0xa5, 0xb6, 0xfe, 0xc5, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0xe6, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0xfd, 0xc9, 0x2a, 0x23, 0x3d, 0x8a, 0xb8, 0x2c, 0x50, 0x64, 0x72, 0x4e, 0x18, 0x50, 0x32, 0x86, 0x54, 0x89, 0x3f, 0x21, 0x27, 0x44, 0xec, 0xa9, 0x6d, 0x78, 0xc8, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0xa2, 0x06, 0x51, 0x02, 0xe5, 0x00, 0x2b, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x00, 0x21, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x03, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x3c, 0xfc, 0x43, 0x46, 0x3a, 0x23, 0x5c, 0x9b, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x10, 0x28, 0x5b, 0x56, 0x89, 0x82, 0x44, 0x4c, 0x66, 0x62, 0xab, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x43, 0x75, 0x75, 0x5d, 0x19, 0xb8, 0xca, 0x97, 0x82, 0xa8, 0xd6, 0x73, 0xa8, 0x7d, 0x21, 0x2c, 0x44, 0xe3, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x2a, 0x23, 0x3d, 0x8a, 0xb8, 0x2c, 0x50, 0x64, 0x72, 0x4e, 0x18, 0x50, 0x32, 0x86, 0x54, 0x89, 0x3f, 0x21, 0x27, 0x44, 0xec, 0x4b, 0x48, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0x01, 0xe6, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0xfd, 0x01, 0x96, 0x96, 0x96, 0x00, 0x05, 0x00, 0x75, 0xfe, 0x0c, 0x08, 0xe5, 0x04, 0xb0, 0x00, 0x3c, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x51, 0x00, 0x55, 0x00, 0x00, 0x21, 0x23, 0x22, 0x27, 0x26, 0x35, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x33, 0x06, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x03, 0x22, 0x07, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x05, 0xd0, 0xf9, 0x22, 0x2f, 0x28, 0x43, 0x4f, 0xd6, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x5c, 0x52, 0x92, 0x27, 0x1d, 0x23, 0x9a, 0x01, 0x0d, 0x09, 0x24, 0x67, 0x6f, 0x61, 0x85, 0x40, 0x50, 0x70, 0x57, 0xa8, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x43, 0x75, 0x76, 0x5d, 0x19, 0xb7, 0x10, 0x45, 0x71, 0x98, 0x82, 0xa8, 0xd6, 0x74, 0xa8, 0x01, 0x02, 0x7b, 0x21, 0xfd, 0x95, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x1e, 0x1a, 0x10, 0xba, 0x80, 0x9b, 0x4d, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x44, 0x8a, 0x6c, 0x7f, 0x93, 0x8a, 0x0f, 0x37, 0x28, 0x32, 0x92, 0x6c, 0x5e, 0x46, 0x22, 0x01, 0x02, 0x25, 0x47, 0xe9, 0x4d, 0x46, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0x02, 0x37, 0x51, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0x02, 0x79, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x05, 0x94, 0x04, 0xb0, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x36, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0x97, 0x82, 0xa8, 0xd6, 0x73, 0xa8, 0x7d, 0x21, 0x2c, 0x44, 0xa8, 0xf8, 0x43, 0x46, 0x3a, 0x23, 0x5c, 0x9b, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x10, 0x28, 0x5b, 0x56, 0x89, 0x82, 0x44, 0x4c, 0x68, 0x60, 0xa7, 0xa5, 0xb6, 0xfd, 0xa0, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0xe6, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0xfd, 0xc9, 0x2a, 0x23, 0x3d, 0x8a, 0xb8, 0x2c, 0x50, 0x64, 0x72, 0x4e, 0x18, 0x50, 0x32, 0x86, 0x54, 0x89, 0x3f, 0x21, 0x27, 0x44, 0xec, 0xa9, 0x6d, 0x78, 0x04, 0xb0, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x06, 0x51, 0x04, 0xb0, 0x00, 0x2b, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x44, 0x00, 0x00, 0x21, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x03, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x3c, 0xfc, 0x43, 0x46, 0x3a, 0x23, 0x5c, 0x9b, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x10, 0x28, 0x5b, 0x56, 0x89, 0x82, 0x44, 0x4c, 0x66, 0x62, 0xab, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x43, 0x75, 0x75, 0x5d, 0x19, 0xb8, 0xca, 0x97, 0x82, 0xa8, 0xd6, 0x73, 0xa8, 0x7d, 0x21, 0x2c, 0x44, 0xfd, 0xf8, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x2a, 0x23, 0x3d, 0x8a, 0xb8, 0x2c, 0x50, 0x64, 0x72, 0x4e, 0x18, 0x50, 0x32, 0x86, 0x54, 0x89, 0x3f, 0x21, 0x27, 0x44, 0xec, 0x4b, 0x48, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0x01, 0xe6, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0x02, 0x79, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x05, 0x00, 0x81, 0x00, 0x00, 0x06, 0xe8, 0x06, 0x14, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x29, 0x02, 0x35, 0x21, 0x11, 0x33, 0x11, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x25, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0xd3, 0xfd, 0xf9, 0xfe, 0xb6, 0x01, 0x4a, 0xa6, 0xc3, 0xf8, 0x53, 0x3d, 0x69, 0x5f, 0xa9, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x44, 0x75, 0x76, 0x5d, 0x19, 0xb8, 0xfe, 0x1f, 0xa8, 0xd5, 0x74, 0xa9, 0x01, 0x02, 0x7b, 0x22, 0x2b, 0x48, 0x6e, 0x9f, 0x32, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x05, 0x5c, 0xfb, 0x0e, 0x01, 0x3f, 0x63, 0x21, 0x27, 0x45, 0xeb, 0x4d, 0x46, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0xb8, 0x3f, 0x5d, 0x44, 0x87, 0x13, 0x05, 0x51, 0x78, 0x03, 0x74, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x05, 0x3f, 0x06, 0x14, 0x00, 0x0c, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x13, 0x21, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0x00, 0xa8, 0xd6, 0x74, 0xa8, 0x01, 0x02, 0x7b, 0x21, 0x2b, 0x48, 0x6e, 0xa0, 0x6a, 0xfd, 0xfa, 0xf0, 0xf0, 0xa6, 0xc3, 0xf9, 0x52, 0x3e, 0x69, 0x5e, 0xa8, 0xa6, 0xb6, 0xfe, 0xca, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x3f, 0x5d, 0x44, 0x87, 0x13, 0x05, 0x51, 0x78, 0xfe, 0x92, 0xb8, 0x05, 0x5c, 0xfb, 0x0e, 0x01, 0x3f, 0x63, 0x21, 0x27, 0x45, 0xeb, 0xa9, 0x6d, 0x78, 0x04, 0xe2, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x05, 0xfa, 0x06, 0x14, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x29, 0x01, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x25, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0xe6, 0xfd, 0xf8, 0xf0, 0xf0, 0xa6, 0xc3, 0xf9, 0x52, 0x3e, 0x69, 0x5e, 0xaa, 0x26, 0x0c, 0x0f, 0x37, 0x49, 0x44, 0x75, 0x76, 0x5d, 0x19, 0xb7, 0xfe, 0x1e, 0xa8, 0xd6, 0x74, 0xa8, 0x01, 0x02, 0x7b, 0x21, 0x2b, 0x48, 0x6e, 0xa0, 0x33, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x05, 0x5c, 0xfb, 0x0e, 0x01, 0x3f, 0x63, 0x21, 0x27, 0x45, 0xeb, 0x4d, 0x46, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0xb8, 0x3f, 0x5d, 0x44, 0x87, 0x13, 0x05, 0x51, 0x78, 0x03, 0x74, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x69, 0xfe, 0x0c, 0x04, 0x3a, 0x05, 0x46, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x06, 0x23, 0x20, 0x27, 0x26, 0x10, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x1e, 0x01, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x01, 0x36, 0x34, 0x22, 0x15, 0x14, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x3a, 0x89, 0xe7, 0xfe, 0x85, 0x8d, 0x59, 0xa9, 0x37, 0x3d, 0x70, 0x57, 0xd7, 0x55, 0x72, 0x52, 0x33, 0x54, 0x3d, 0xa3, 0x4d, 0x90, 0x82, 0xef, 0xdf, 0x8b, 0x25, 0x60, 0x01, 0x3c, 0xae, 0xbf, 0xfd, 0x79, 0x7a, 0xb9, 0x0a, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xfe, 0x6f, 0x63, 0xbc, 0x7a, 0x01, 0x92, 0x8c, 0x32, 0x74, 0x2a, 0x6e, 0x40, 0x30, 0x30, 0x40, 0x70, 0x5b, 0x43, 0x2b, 0x20, 0x40, 0x4d, 0xb8, 0xe4, 0x81, 0x6b, 0x6c, 0x3d, 0x9e, 0x76, 0x02, 0x96, 0x38, 0x60, 0x33, 0x24, 0x03, 0x48, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x03, 0x93, 0x06, 0x40, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x00, 0x37, 0x32, 0x37, 0x26, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x15, 0x22, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x25, 0x15, 0x05, 0x04, 0x2b, 0x01, 0x35, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x36, 0x91, 0xb6, 0x44, 0x2f, 0x4f, 0xb8, 0x70, 0xe2, 0xc4, 0xa7, 0x37, 0x4b, 0x3f, 0x32, 0x42, 0x01, 0x03, 0xfe, 0x86, 0xfe, 0xc5, 0xa0, 0x4f, 0x01, 0x90, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x5d, 0x18, 0x3b, 0x64, 0x8c, 0x01, 0x08, 0x7d, 0x4d, 0xa9, 0x89, 0xff, 0x34, 0x46, 0x21, 0x81, 0xb8, 0xc5, 0xa4, 0xb8, 0x05, 0x88, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x03, 0x8c, 0x05, 0x46, 0x00, 0x24, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x02, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x36, 0x35, 0x34, 0x27, 0x03, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0xbd, 0xaf, 0xb6, 0x6a, 0x56, 0x61, 0x3b, 0x35, 0x24, 0x57, 0x3d, 0x1b, 0x0b, 0x0f, 0x5d, 0x51, 0xd6, 0x50, 0x5d, 0x0f, 0x0c, 0x1c, 0x45, 0x4f, 0x1c, 0x3d, 0x37, 0x65, 0x56, 0x6a, 0xb6, 0x97, 0x2f, 0x1b, 0x2a, 0x5d, 0x5c, 0x2a, 0x71, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb9, 0xb9, 0xb8, 0x28, 0x24, 0x27, 0x55, 0x5a, 0x27, 0x2d, 0x1f, 0x29, 0x37, 0x34, 0x2d, 0x2d, 0x34, 0x37, 0x29, 0x1f, 0x2d, 0x27, 0x62, 0x4d, 0x1f, 0x2c, 0x28, 0xb8, 0x02, 0x55, 0x07, 0x0c, 0x20, 0x1d, 0x5f, 0x5f, 0x1d, 0x20, 0x0c, 0x02, 0xf8, 0x96, 0x64, 0x96, 0x96, 0x96, 0xff, 0xff, 0x00, 0x75, 0xfe, 0xa2, 0x07, 0x86, 0x03, 0x11, 0x10, 0x26, 0x10, 0xff, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x03, 0x14, 0xfe, 0xa2, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0xec, 0x03, 0xd9, 0x10, 0x26, 0x11, 0x00, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0xfe, 0xd4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x03, 0xb7, 0x03, 0x08, 0x10, 0x26, 0x11, 0x01, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0xfe, 0xd4, 0xff, 0xff, 0x00, 0x75, 0xfe, 0xa2, 0x07, 0x86, 0x04, 0x4c, 0x10, 0x26, 0x10, 0xff, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf6, 0x05, 0x5c, 0x03, 0xb6, 0x10, 0x07, 0x10, 0xf6, 0x03, 0x14, 0xfe, 0xa2, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0xec, 0x05, 0x14, 0x10, 0x26, 0x11, 0x00, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf6, 0x01, 0x7e, 0x04, 0x7e, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0xfe, 0xd4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x03, 0xb7, 0x04, 0x7e, 0x10, 0x26, 0x11, 0x01, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf6, 0x01, 0x8f, 0x03, 0xe8, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0xfe, 0xd4, 0xff, 0xff, 0x00, 0x75, 0xfd, 0xa8, 0x07, 0x86, 0x03, 0x11, 0x10, 0x26, 0x10, 0xff, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x02, 0xa3, 0xfe, 0xa2, 0xff, 0xff, 0xff, 0xee, 0xfd, 0xda, 0x02, 0xec, 0x03, 0xd9, 0x10, 0x26, 0x11, 0x00, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x01, 0x0e, 0xfe, 0xd4, 0xff, 0xff, 0xff, 0xee, 0xfd, 0xda, 0x03, 0xb7, 0x03, 0x08, 0x10, 0x26, 0x11, 0x01, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x01, 0x0e, 0xfe, 0xd4, 0xff, 0xff, 0x00, 0x60, 0xfe, 0x0c, 0x06, 0x14, 0x04, 0x01, 0x10, 0x26, 0x11, 0x02, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x03, 0x9a, 0x03, 0x6b, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0xec, 0x05, 0x14, 0x10, 0x26, 0x11, 0x03, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0x04, 0x7e, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x03, 0xb7, 0x04, 0x7e, 0x10, 0x26, 0x11, 0x04, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x8f, 0x03, 0xe8, 0xff, 0xff, 0x00, 0x60, 0xfe, 0x0c, 0x06, 0x14, 0x04, 0xfb, 0x10, 0x26, 0x11, 0x02, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x03, 0x2a, 0x03, 0x6b, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0xec, 0x06, 0x0e, 0x10, 0x26, 0x11, 0x03, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x01, 0x0e, 0x04, 0x7e, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x78, 0x10, 0x26, 0x11, 0x04, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x01, 0x1e, 0x03, 0xe8, 0x00, 0x01, 0x00, 0x75, 0xff, 0xa7, 0x07, 0xa9, 0x06, 0x14, 0x00, 0x37, 0x00, 0x00, 0x25, 0x32, 0x24, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x25, 0x24, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x37, 0x01, 0x21, 0x01, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x05, 0x16, 0x1d, 0x01, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x27, 0x06, 0x04, 0x23, 0x21, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x04, 0x77, 0xa6, 0x01, 0x46, 0x2c, 0x6d, 0xfc, 0xb7, 0xfe, 0xc1, 0x09, 0x11, 0x90, 0x02, 0x6c, 0x01, 0x3c, 0xfc, 0xc4, 0x55, 0x0d, 0x09, 0x04, 0x05, 0x9d, 0x03, 0x69, 0xdf, 0x2b, 0x0d, 0x14, 0x29, 0x51, 0x53, 0x33, 0x0a, 0x4b, 0xfe, 0x95, 0x91, 0xfe, 0x3e, 0xad, 0x73, 0xfe, 0xd7, 0x39, 0xa5, 0x3a, 0xb7, 0x5d, 0x88, 0x58, 0x96, 0x6c, 0x05, 0x09, 0x6b, 0x12, 0x91, 0x37, 0xbe, 0x07, 0x06, 0x3e, 0x63, 0x60, 0x01, 0x9b, 0xfd, 0xe8, 0x37, 0x23, 0x0a, 0x23, 0x35, 0x1b, 0x96, 0x26, 0xf8, 0x45, 0x5e, 0x11, 0x05, 0xb8, 0x32, 0x30, 0x39, 0x82, 0x26, 0x62, 0x01, 0x0b, 0x8a, 0x5c, 0x5e, 0x88, 0x7e, 0x42, 0x22, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x05, 0xde, 0x06, 0x14, 0x00, 0x20, 0x00, 0x00, 0x23, 0x35, 0x21, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x25, 0x24, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x37, 0x01, 0x21, 0x01, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x05, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x12, 0x04, 0x87, 0x85, 0x29, 0x11, 0x03, 0x0b, 0x5a, 0xfc, 0xb7, 0xfe, 0xc1, 0x09, 0x10, 0x91, 0x02, 0x6c, 0x01, 0x3c, 0xfc, 0xc4, 0x55, 0x0d, 0x09, 0x04, 0x05, 0x9d, 0x03, 0x69, 0xdf, 0x38, 0x55, 0xc9, 0xb8, 0x68, 0x2c, 0x1c, 0x6e, 0x0f, 0x91, 0x37, 0xbe, 0x08, 0x05, 0x3e, 0x62, 0x61, 0x01, 0x9b, 0xfd, 0xe8, 0x37, 0x23, 0x0a, 0x23, 0x35, 0x1b, 0x96, 0x26, 0xf8, 0x71, 0x65, 0x9b, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x06, 0x53, 0x06, 0x14, 0x00, 0x29, 0x00, 0x00, 0x23, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x25, 0x24, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x37, 0x01, 0x21, 0x01, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x05, 0x16, 0x1d, 0x01, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x27, 0x06, 0x23, 0x12, 0x04, 0x87, 0x7b, 0x33, 0x0e, 0x65, 0xfc, 0xb7, 0xfe, 0xc1, 0x09, 0x10, 0x91, 0x02, 0x6c, 0x01, 0x3c, 0xfc, 0xc4, 0x55, 0x0d, 0x09, 0x04, 0x05, 0x9d, 0x03, 0x69, 0xdf, 0x2b, 0x0d, 0x14, 0x29, 0x51, 0x51, 0x32, 0x0a, 0x56, 0x97, 0xb8, 0x68, 0x1d, 0x18, 0x7f, 0x11, 0x91, 0x37, 0xbe, 0x08, 0x04, 0x3f, 0x62, 0x61, 0x01, 0x9b, 0xfd, 0xe8, 0x37, 0x23, 0x0a, 0x23, 0x35, 0x1b, 0x96, 0x26, 0xf8, 0x45, 0x5f, 0x10, 0x05, 0xb8, 0x2f, 0x28, 0x57, 0x00, 0x00, 0x00, 0x03, 0x00, 0x75, 0xff, 0xa7, 0x07, 0x11, 0x06, 0x14, 0x00, 0x37, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x13, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x05, 0x0c, 0x59, 0x98, 0xb8, 0xa5, 0xad, 0x73, 0xfe, 0xd7, 0x39, 0xa5, 0x3a, 0xb7, 0x5d, 0x88, 0xa6, 0xae, 0x8e, 0x20, 0x0e, 0x30, 0xfe, 0xe9, 0x2d, 0x09, 0x1f, 0x5a, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0x02, 0x0d, 0x13, 0x23, 0x26, 0x3a, 0x4f, 0x77, 0x3a, 0x34, 0x5d, 0x1e, 0x57, 0x17, 0x99, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x39, 0x39, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x39, 0x78, 0x4c, 0x3c, 0x49, 0x26, 0x62, 0x01, 0x0b, 0x8a, 0x5c, 0x5e, 0x88, 0x7e, 0x42, 0x22, 0x50, 0x41, 0x37, 0x1a, 0x2e, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x77, 0x2a, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfd, 0x3f, 0x1a, 0x0e, 0x10, 0xb8, 0x18, 0x2b, 0x29, 0x78, 0x40, 0x03, 0xbc, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x03, 0x6e, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x37, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x13, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0xf7, 0x5c, 0x38, 0x55, 0xfe, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfe, 0xb6, 0x7b, 0x7b, 0x71, 0x65, 0x9b, 0x04, 0x60, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x29, 0x00, 0x35, 0x00, 0x41, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x01, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0x02, 0x0c, 0x14, 0x22, 0x27, 0x3a, 0x4f, 0x77, 0x3a, 0x35, 0x5c, 0x1e, 0x57, 0x13, 0x10, 0x55, 0x01, 0x01, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfd, 0x3f, 0x1a, 0x0e, 0x10, 0xb8, 0x18, 0x2b, 0x29, 0x78, 0x2e, 0x1b, 0x9b, 0x04, 0x60, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x81, 0xff, 0xc9, 0x06, 0x24, 0x06, 0x14, 0x00, 0x21, 0x00, 0x44, 0x00, 0x48, 0x00, 0x00, 0x01, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x13, 0x06, 0x27, 0x26, 0x27, 0x24, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x03, 0x6e, 0x42, 0x22, 0x48, 0x0c, 0x0b, 0x3d, 0x5c, 0x4f, 0x4a, 0x46, 0x3c, 0x32, 0x3d, 0x29, 0x36, 0x33, 0x36, 0x46, 0x43, 0x10, 0x1d, 0x01, 0x02, 0x43, 0x4d, 0x7c, 0x62, 0x83, 0xba, 0x5b, 0xfe, 0xf9, 0x0e, 0xa6, 0x0d, 0x02, 0x90, 0x6d, 0x72, 0x7e, 0x50, 0x89, 0x58, 0x45, 0xa5, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x89, 0x66, 0x8e, 0xfe, 0x72, 0x87, 0x87, 0x04, 0x6f, 0x52, 0x04, 0x0e, 0x1e, 0x21, 0x1c, 0x12, 0x10, 0x0a, 0x0f, 0x58, 0x6e, 0x2a, 0x27, 0x0b, 0x58, 0x0a, 0x1a, 0x1a, 0x1e, 0x26, 0x11, 0x10, 0x1c, 0x2f, 0x2e, 0x51, 0x26, 0x2b, 0xfb, 0x70, 0x14, 0x02, 0x02, 0x1e, 0x58, 0xc3, 0x4b, 0x35, 0x3a, 0x2c, 0x5c, 0x2e, 0x23, 0x1b, 0x2f, 0x5e, 0x49, 0x01, 0x01, 0x03, 0xb1, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x7b, 0x7e, 0x05, 0xdf, 0x96, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0x6e, 0x06, 0x72, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x33, 0x15, 0x23, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0xf7, 0x5c, 0x38, 0x55, 0xfe, 0xd4, 0x87, 0x87, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfe, 0xb6, 0x7b, 0x7b, 0x71, 0x65, 0x9b, 0x06, 0x72, 0x96, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x72, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x01, 0x33, 0x15, 0x23, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0x02, 0x0c, 0x14, 0x22, 0x27, 0x3a, 0x4f, 0x77, 0x3a, 0x35, 0x5c, 0x1e, 0x57, 0x13, 0x10, 0x55, 0xfe, 0xd7, 0x87, 0x87, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfd, 0x3f, 0x1a, 0x0e, 0x10, 0xb8, 0x18, 0x2b, 0x29, 0x78, 0x2e, 0x1b, 0x9b, 0x06, 0x72, 0x96, 0x00, 0x00, 0x00, 0x05, 0x00, 0x81, 0xfd, 0xa8, 0x06, 0x24, 0x06, 0x14, 0x00, 0x21, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x00, 0x01, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x13, 0x06, 0x27, 0x26, 0x27, 0x24, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0x42, 0x22, 0x48, 0x0c, 0x0b, 0x3d, 0x5c, 0x4f, 0x4a, 0x46, 0x3c, 0x32, 0x3d, 0x29, 0x36, 0x33, 0x36, 0x46, 0x43, 0x10, 0x1d, 0x01, 0x02, 0x43, 0x4d, 0x7c, 0x62, 0x83, 0xba, 0x5b, 0xfe, 0xf9, 0x0e, 0xa6, 0x0d, 0x02, 0x90, 0x6d, 0x72, 0x7e, 0x50, 0x89, 0x58, 0x45, 0xa5, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x89, 0x66, 0x8e, 0xfe, 0x5b, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x04, 0x6f, 0x52, 0x04, 0x0e, 0x1e, 0x21, 0x1c, 0x12, 0x10, 0x0a, 0x0f, 0x58, 0x6e, 0x2a, 0x27, 0x0b, 0x58, 0x0a, 0x1a, 0x1a, 0x1e, 0x26, 0x11, 0x10, 0x1c, 0x2f, 0x2e, 0x51, 0x26, 0x2b, 0xfb, 0x70, 0x14, 0x02, 0x02, 0x1e, 0x58, 0xc3, 0x4b, 0x35, 0x3a, 0x2c, 0x5c, 0x2e, 0x23, 0x1b, 0x2f, 0x5e, 0x49, 0x01, 0x01, 0x03, 0xb1, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x7b, 0x7e, 0xfe, 0x41, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfd, 0xda, 0x03, 0x6e, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0xf7, 0x5c, 0x38, 0x55, 0xbc, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfe, 0xb6, 0x7b, 0x7b, 0x71, 0x65, 0x9b, 0xfe, 0x70, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0xfd, 0xda, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0x02, 0x0c, 0x14, 0x22, 0x27, 0x3a, 0x4f, 0x77, 0x3a, 0x35, 0x5c, 0x1e, 0x57, 0x13, 0x10, 0x55, 0xb9, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfd, 0x3f, 0x1a, 0x0e, 0x10, 0xb8, 0x18, 0x2b, 0x29, 0x78, 0x2e, 0x1b, 0x9b, 0xfe, 0x70, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x03, 0x03, 0x69, 0x03, 0x84, 0x06, 0x72, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x03, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x06, 0x72, 0xfc, 0xf7, 0x03, 0x09, 0x97, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x39, 0x39, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x39, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xfd, 0x35, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x03, 0x00, 0x64, 0x03, 0x84, 0x03, 0x6e, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x03, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0x90, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xfd, 0x35, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x03, 0x00, 0x64, 0x03, 0x84, 0x03, 0x6e, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x03, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0x90, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xfd, 0x35, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x03, 0x02, 0x1c, 0xfe, 0xa2, 0x06, 0x72, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x06, 0x72, 0xfc, 0xf7, 0x03, 0x09, 0xfc, 0x8b, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xf8, 0x0d, 0x96, 0x96, 0x96, 0x00, 0x00, 0x03, 0x00, 0x64, 0xfe, 0xd4, 0x03, 0x6e, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0xfe, 0x27, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xf8, 0x3f, 0x96, 0x96, 0x96, 0x00, 0x00, 0x03, 0x00, 0x64, 0xfe, 0xd4, 0x03, 0x6e, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0xfe, 0x27, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xf8, 0x3f, 0x96, 0x96, 0x96, 0x00, 0x00, 0x04, 0x03, 0x2a, 0x05, 0x33, 0x06, 0x72, 0x08, 0x34, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x06, 0x72, 0xfc, 0xf7, 0x03, 0x09, 0xfd, 0x28, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0x01, 0x09, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x43, 0x05, 0x33, 0x03, 0x6e, 0x08, 0x34, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0xfd, 0x46, 0x87, 0x87, 0x70, 0x88, 0x88, 0xe0, 0x86, 0x86, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0x01, 0x09, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x43, 0x05, 0x33, 0x03, 0x6e, 0x08, 0x34, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0xfd, 0x46, 0x87, 0x87, 0x70, 0x88, 0x88, 0xe0, 0x86, 0x86, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0x01, 0x09, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, 0xfe, 0xc8, 0x05, 0x86, 0x07, 0x9e, 0x00, 0x24, 0x00, 0x28, 0x00, 0x00, 0x25, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x33, 0x15, 0x23, 0x03, 0xaa, 0x46, 0xa6, 0x2c, 0x27, 0x59, 0x44, 0x75, 0x65, 0x46, 0x10, 0x19, 0x6d, 0xea, 0x79, 0x4d, 0x59, 0x3e, 0xfe, 0xf9, 0x01, 0x39, 0xa6, 0x3b, 0x96, 0x24, 0x41, 0x48, 0x63, 0x9c, 0x92, 0x87, 0x87, 0x49, 0x7e, 0xe3, 0x04, 0x6a, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x33, 0x2e, 0x28, 0xb1, 0x42, 0x22, 0x16, 0x5b, 0x01, 0x12, 0x8a, 0x5c, 0x73, 0x73, 0x7e, 0x42, 0x10, 0x22, 0x35, 0x07, 0xcc, 0x96, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x01, 0x84, 0x07, 0x9e, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x03, 0x33, 0x15, 0x23, 0x01, 0x84, 0x4e, 0x48, 0x8b, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x9d, 0x87, 0x87, 0x01, 0x73, 0xb2, 0x65, 0x5c, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0x01, 0x8a, 0x96, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x02, 0x75, 0x07, 0x9e, 0x00, 0x14, 0x00, 0x18, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x01, 0x31, 0x45, 0x89, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x87, 0x91, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x07, 0x9e, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x81, 0xfe, 0xc8, 0x05, 0x86, 0x08, 0x34, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x25, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0xaa, 0x46, 0xa6, 0x2c, 0x27, 0x59, 0x44, 0x75, 0x65, 0x46, 0x10, 0x19, 0x6d, 0xea, 0x79, 0x4d, 0x59, 0x3e, 0xfe, 0xf9, 0x01, 0x39, 0xa6, 0x3b, 0x96, 0x24, 0x41, 0x48, 0x63, 0x9c, 0x8d, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x49, 0x7e, 0xe3, 0x04, 0x6a, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x33, 0x2e, 0x28, 0xb1, 0x42, 0x22, 0x16, 0x5b, 0x01, 0x12, 0x8a, 0x5c, 0x73, 0x73, 0x7e, 0x42, 0x10, 0x22, 0x35, 0x08, 0x62, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x01, 0xdb, 0x08, 0x34, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x19, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x03, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x84, 0x4e, 0x48, 0x8b, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0xa1, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0x73, 0xb2, 0x65, 0x5c, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0x02, 0x20, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x02, 0x75, 0x08, 0x34, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x31, 0x45, 0x89, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x87, 0x95, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x08, 0x34, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x04, 0x00, 0x81, 0xfc, 0xe0, 0x05, 0x86, 0x06, 0x14, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x25, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0xaa, 0x46, 0xa6, 0x2c, 0x27, 0x59, 0x44, 0x75, 0x65, 0x46, 0x10, 0x19, 0x6d, 0xea, 0x79, 0x4d, 0x59, 0x3e, 0xfe, 0xf9, 0x01, 0x39, 0xa6, 0x3b, 0x96, 0x24, 0x41, 0x48, 0x63, 0x9c, 0xfe, 0xf9, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x49, 0x7e, 0xe3, 0x04, 0x6a, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x33, 0x2e, 0x28, 0xb1, 0x42, 0x22, 0x16, 0x5b, 0x01, 0x12, 0x8a, 0x5c, 0x73, 0x73, 0x7e, 0x42, 0x10, 0x22, 0x35, 0xfd, 0xa4, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0xfe, 0x0c, 0x01, 0xc2, 0x06, 0x14, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x19, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x84, 0x4e, 0x48, 0x8b, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0xba, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0x73, 0xb2, 0x65, 0x5c, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xf8, 0x8e, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0x0c, 0x02, 0x75, 0x06, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x31, 0x45, 0x89, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x87, 0x93, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0xfe, 0xa2, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x03, 0x00, 0x84, 0xfc, 0xc7, 0x05, 0x8e, 0x02, 0xbc, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x25, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x04, 0x63, 0x28, 0x18, 0x14, 0x2d, 0x30, 0x36, 0x43, 0x75, 0x40, 0x1e, 0x03, 0x50, 0x6c, 0xd7, 0x58, 0x52, 0x69, 0x65, 0xfe, 0xd8, 0x2b, 0xa5, 0x2c, 0xb5, 0x51, 0x44, 0x50, 0x47, 0xae, 0x44, 0x1d, 0x5a, 0xfe, 0x48, 0x86, 0x86, 0x70, 0x87, 0x87, 0x02, 0x45, 0x61, 0x60, 0x50, 0x3c, 0x40, 0xb8, 0x30, 0x6d, 0x93, 0xc7, 0x42, 0x1b, 0x25, 0x6b, 0x01, 0x63, 0xaf, 0x8d, 0x89, 0xb3, 0xec, 0x35, 0x18, 0x14, 0x30, 0xe3, 0x65, 0x70, 0xb8, 0xcb, 0x77, 0x96, 0xfb, 0x37, 0x96, 0x00, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x01, 0x60, 0x03, 0xe8, 0x10, 0x27, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x00, 0xca, 0xfe, 0xd4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0x3f, 0x03, 0xe8, 0x10, 0x27, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x00, 0xca, 0xfe, 0xd4, 0x00, 0x04, 0x00, 0x84, 0xfc, 0xae, 0x05, 0x8e, 0x02, 0xbc, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x42, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x25, 0x33, 0x15, 0x23, 0x01, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x04, 0x63, 0x28, 0x18, 0x14, 0x2d, 0x30, 0x36, 0x43, 0x75, 0x40, 0x1e, 0x03, 0x50, 0x6c, 0xd7, 0x58, 0x52, 0x69, 0x65, 0xfe, 0xd8, 0x2b, 0xa5, 0x2c, 0xb5, 0x51, 0x44, 0x50, 0x47, 0xae, 0x44, 0x1d, 0x5a, 0xfe, 0x48, 0x86, 0x86, 0x01, 0x05, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x39, 0x39, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x39, 0x02, 0x45, 0x61, 0x60, 0x50, 0x3c, 0x40, 0xb8, 0x30, 0x6d, 0x93, 0xc7, 0x42, 0x1b, 0x25, 0x6b, 0x01, 0x63, 0xaf, 0x8d, 0x89, 0xb3, 0xec, 0x35, 0x18, 0x14, 0x30, 0xe3, 0x65, 0x70, 0xb8, 0xcb, 0x77, 0x96, 0xfb, 0x64, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xf4, 0x01, 0xd3, 0x03, 0xe8, 0x10, 0x27, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x11, 0x07, 0x00, 0x48, 0xfe, 0xf4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xf4, 0x02, 0x3f, 0x03, 0xe8, 0x10, 0x27, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x11, 0x07, 0x00, 0x48, 0xfe, 0xf4, 0x00, 0x04, 0x00, 0x84, 0xfe, 0x0c, 0x05, 0x8e, 0x03, 0xb6, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x63, 0x28, 0x18, 0x14, 0x2d, 0x30, 0x36, 0x43, 0x75, 0x40, 0x1e, 0x03, 0x50, 0x6c, 0xd7, 0x58, 0x52, 0x69, 0x65, 0xfe, 0xd8, 0x2b, 0xa5, 0x2c, 0xb5, 0x51, 0x44, 0x50, 0x47, 0xae, 0x44, 0x1d, 0x5a, 0xfe, 0x74, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x02, 0x45, 0x61, 0x60, 0x50, 0x3c, 0x40, 0xb8, 0x30, 0x6d, 0x93, 0xc7, 0x42, 0x1b, 0x25, 0x6b, 0x01, 0x63, 0xaf, 0x8d, 0x89, 0xb3, 0xec, 0x35, 0x18, 0x14, 0x30, 0xe3, 0x65, 0x70, 0xb8, 0xcb, 0x01, 0x71, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x01, 0xc2, 0x04, 0xe2, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x00, 0x59, 0x03, 0x52, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3f, 0x04, 0xe2, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x00, 0x59, 0x03, 0x52, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x57, 0x0a, 0xdd, 0x83, 0xf3, 0x6b, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x3f, 0xd8, 0x65, 0x00, 0x00, 0x00, 0x00, 0xce, 0x3f, 0xd8, 0x65, 0xf8, 0xa7, 0xfc, 0xae, 0x0c, 0x1a, 0x09, 0x55, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6d, 0xfe, 0x1d, 0x00, 0x00, 0x0c, 0x7e, 0xf8, 0xa7, 0xfc, 0xc9, 0x0c, 0x1a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x0e, 0x04, 0x52, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x00, 0x02, 0x49, 0x00, 0x00, 0x02, 0xe2, 0x01, 0x16, 0x03, 0x4f, 0x00, 0xb1, 0x06, 0x08, 0x00, 0x8e, 0x04, 0x94, 0x00, 0x99, 0x06, 0xd7, 0x00, 0x65, 0x05, 0x9d, 0x00, 0x74, 0x01, 0xfa, 0x00, 0xb1, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0xcf, 0x00, 0x93, 0x03, 0x99, 0x00, 0x36, 0x06, 0x08, 0x00, 0xc3, 0x02, 0x49, 0x00, 0x8e, 0x02, 0x99, 0x00, 0x5a, 0x02, 0x49, 0x00, 0xc5, 0x02, 0x6d, 0x00, 0x00, 0x04, 0x94, 0x00, 0x79, 0x04, 0x94, 0x00, 0xca, 0x04, 0x94, 0x00, 0x87, 0x04, 0x94, 0x00, 0x8c, 0x04, 0x94, 0x00, 0x5a, 0x04, 0x94, 0x00, 0x8e, 0x04, 0x94, 0x00, 0x80, 0x04, 0x94, 0x00, 0x97, 0x04, 0x94, 0x00, 0x7d, 0x04, 0x94, 0x00, 0x74, 0x02, 0x6d, 0x00, 0xd8, 0x02, 0x6d, 0x00, 0x8e, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x03, 0xd2, 0x00, 0x84, 0x07, 0x33, 0x00, 0x79, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xf0, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x24, 0x00, 0xb4, 0x05, 0x94, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0xb4, 0x02, 0x1f, 0xff, 0xa1, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x02, 0x00, 0xb4, 0x06, 0x36, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x57, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x00, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x79, 0x04, 0x65, 0xff, 0xfb, 0x05, 0x45, 0x00, 0xa0, 0x04, 0xec, 0x00, 0x0e, 0x07, 0x1e, 0x00, 0x3d, 0x04, 0xee, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0xee, 0x00, 0x52, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0x6d, 0x00, 0x00, 0x02, 0xcf, 0x00, 0xb3, 0x06, 0x08, 0x00, 0xc3, 0x03, 0x99, 0xff, 0xee, 0x03, 0x99, 0x00, 0x99, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x88, 0x00, 0x2a, 0x04, 0x92, 0x00, 0x65, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xad, 0x02, 0x00, 0xff, 0xdf, 0x04, 0x2b, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xad, 0x07, 0x03, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x92, 0x00, 0x65, 0x02, 0xf5, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x42, 0x00, 0x36, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x35, 0x04, 0x42, 0x00, 0x36, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x94, 0x00, 0xe6, 0x02, 0x6d, 0x00, 0xea, 0x04, 0x94, 0x00, 0xe6, 0x06, 0x08, 0x00, 0xc3, 0x02, 0x49, 0x00, 0x00, 0x02, 0xe2, 0x01, 0x16, 0x04, 0x94, 0x00, 0x9a, 0x04, 0x94, 0x00, 0x74, 0x04, 0x94, 0x00, 0x54, 0x04, 0x94, 0x00, 0x49, 0x02, 0x6d, 0x00, 0xea, 0x03, 0x99, 0x00, 0x52, 0x03, 0x99, 0x00, 0xc1, 0x07, 0x33, 0x00, 0xfe, 0x03, 0x64, 0x00, 0x67, 0x04, 0x67, 0x00, 0x8e, 0x06, 0x08, 0x00, 0xc3, 0x02, 0x99, 0x00, 0x5a, 0x07, 0x33, 0x00, 0xfe, 0x03, 0x99, 0x00, 0xbf, 0x03, 0x99, 0x00, 0xaf, 0x06, 0x08, 0x00, 0xc3, 0x02, 0xe2, 0x00, 0x54, 0x02, 0xe2, 0x00, 0x58, 0x03, 0x99, 0x01, 0x4d, 0x04, 0x94, 0x00, 0x9c, 0x04, 0x94, 0x00, 0x8e, 0x02, 0x49, 0x00, 0xc5, 0x03, 0x99, 0x01, 0x05, 0x02, 0xe2, 0x00, 0x7b, 0x03, 0x64, 0x00, 0x56, 0x04, 0x67, 0x00, 0xad, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x58, 0x03, 0xd2, 0x00, 0x80, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x07, 0x03, 0x00, 0x07, 0x05, 0x07, 0x00, 0x67, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0x35, 0x02, 0x1f, 0x00, 0x91, 0x02, 0x1f, 0xff, 0xff, 0x02, 0x1f, 0x00, 0x05, 0x05, 0x94, 0x00, 0x09, 0x05, 0x62, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xaa, 0x00, 0x67, 0x06, 0x08, 0x00, 0xfc, 0x05, 0xaa, 0x00, 0x5b, 0x05, 0x45, 0x00, 0xa0, 0x05, 0x45, 0x00, 0xa0, 0x05, 0x45, 0x00, 0xa0, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x5b, 0x00, 0xb4, 0x04, 0x89, 0x00, 0xa7, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x07, 0x11, 0x00, 0x6e, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x00, 0xff, 0xcd, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0xff, 0xe2, 0x02, 0x00, 0xff, 0xf6, 0x04, 0x67, 0x00, 0x65, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x06, 0x08, 0x00, 0xc3, 0x04, 0x67, 0x00, 0x40, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x42, 0x00, 0x36, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x42, 0x00, 0x36, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x09, 0x04, 0x92, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0xff, 0xe8, 0x06, 0x98, 0x00, 0xb4, 0x05, 0x00, 0x00, 0x6c, 0x02, 0x1f, 0xff, 0xe7, 0x02, 0x00, 0xff, 0xd8, 0x02, 0x1f, 0x00, 0x02, 0x02, 0x00, 0xff, 0xf4, 0x02, 0x1f, 0xff, 0xf7, 0x02, 0x00, 0xff, 0xe7, 0x02, 0x1f, 0x00, 0x9e, 0x02, 0x00, 0x00, 0x87, 0x02, 0x1f, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xad, 0x04, 0x3f, 0x00, 0xb4, 0x04, 0x00, 0x00, 0xad, 0x02, 0x1f, 0xff, 0xa1, 0x02, 0x00, 0xff, 0xdf, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xad, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x00, 0x00, 0x7a, 0x04, 0x02, 0x00, 0xb4, 0x02, 0xb3, 0x00, 0xad, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x76, 0x00, 0xad, 0x04, 0x0b, 0xff, 0xf4, 0x02, 0x0b, 0x00, 0x01, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xdb, 0x00, 0xb8, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x07, 0xb3, 0x00, 0x67, 0x07, 0x5d, 0x00, 0x65, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0x75, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x02, 0x88, 0x00, 0x2a, 0x04, 0x92, 0x00, 0x1c, 0x05, 0x4a, 0xff, 0xa2, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x04, 0xf0, 0x00, 0x00, 0x04, 0x92, 0x00, 0x00, 0x05, 0x10, 0x00, 0x67, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x94, 0x00, 0x09, 0x05, 0xe5, 0xff, 0xa2, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x8c, 0x00, 0x75, 0x05, 0xaa, 0x00, 0x69, 0x04, 0x6c, 0x00, 0x93, 0x04, 0x24, 0xff, 0xa1, 0x02, 0x88, 0xff, 0x8c, 0x05, 0x94, 0x00, 0x67, 0x04, 0xf1, 0x00, 0x07, 0x07, 0x15, 0x00, 0xa7, 0x02, 0x8b, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0x09, 0x05, 0x5e, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa6, 0x02, 0x00, 0x00, 0x09, 0x04, 0x42, 0x00, 0x36, 0x07, 0x03, 0x00, 0xa0, 0x05, 0x62, 0xff, 0xa1, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xaa, 0x00, 0x67, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0xd4, 0x00, 0x67, 0x05, 0x77, 0x00, 0x65, 0x04, 0xb1, 0xff, 0xa2, 0x04, 0x92, 0x00, 0xa6, 0x05, 0x00, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x66, 0x03, 0xc0, 0x00, 0x5a, 0x04, 0x8c, 0x00, 0xb4, 0x02, 0x6b, 0xff, 0x0d, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0x00, 0x15, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x05, 0x80, 0x00, 0x46, 0x05, 0x30, 0x00, 0xb4, 0x05, 0x5a, 0xff, 0xfd, 0x05, 0x42, 0x00, 0x36, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xcb, 0x00, 0x90, 0x04, 0xcb, 0x00, 0x52, 0x04, 0x28, 0x00, 0x5d, 0x03, 0xc7, 0x00, 0x65, 0x04, 0x94, 0x00, 0x87, 0x04, 0xcb, 0x00, 0x53, 0x04, 0x28, 0x00, 0x5d, 0x03, 0xac, 0x00, 0x4f, 0x04, 0x92, 0x00, 0xa7, 0x02, 0x1f, 0x00, 0xb4, 0x03, 0x8b, 0x00, 0xb4, 0x03, 0x4e, 0x00, 0x12, 0x02, 0x20, 0x00, 0xb4, 0x0a, 0x3c, 0x00, 0xb4, 0x09, 0x5a, 0x00, 0xb4, 0x08, 0x4f, 0x00, 0x65, 0x06, 0x03, 0x00, 0xb4, 0x05, 0xa9, 0x00, 0xb4, 0x03, 0x49, 0x00, 0xad, 0x06, 0xb4, 0x00, 0xb4, 0x06, 0xa6, 0x00, 0xb4, 0x05, 0xbd, 0x00, 0xa7, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x02, 0x1f, 0xff, 0xff, 0x02, 0x00, 0xff, 0xe4, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x6e, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x07, 0x03, 0x00, 0x07, 0x07, 0x11, 0x00, 0x6e, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0xff, 0xec, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0xcb, 0x00, 0x90, 0x04, 0x28, 0x00, 0x4f, 0x02, 0x00, 0xff, 0xdf, 0x0a, 0x3c, 0x00, 0xb4, 0x09, 0x5a, 0x00, 0xb4, 0x08, 0x4f, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x08, 0x03, 0x00, 0xb4, 0x04, 0xe9, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x07, 0x03, 0x00, 0x07, 0x07, 0x11, 0x00, 0x6e, 0x05, 0xaa, 0x00, 0x5b, 0x04, 0x67, 0x00, 0x40, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x1f, 0xff, 0xb0, 0x02, 0x00, 0xff, 0xca, 0x02, 0x1f, 0x00, 0x04, 0x02, 0x00, 0xff, 0xe6, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0x00, 0x00, 0xb3, 0x02, 0xf5, 0x00, 0x75, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x83, 0x00, 0x8c, 0x03, 0xc1, 0x00, 0x3f, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0xff, 0xf2, 0x05, 0x4b, 0x00, 0xb4, 0x06, 0x08, 0x00, 0x65, 0x05, 0x07, 0x00, 0x65, 0x04, 0x65, 0x00, 0x65, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x03, 0x6a, 0x00, 0x7c, 0x06, 0x11, 0x00, 0xa7, 0x03, 0x6f, 0x00, 0x31, 0x02, 0x00, 0xff, 0xdf, 0x07, 0x2f, 0x00, 0x65, 0x07, 0x2f, 0x00, 0x65, 0x04, 0xec, 0xff, 0xfe, 0x05, 0x07, 0x00, 0x0a, 0x03, 0xf5, 0x00, 0x08, 0x04, 0x02, 0x00, 0x09, 0x04, 0x65, 0xff, 0xba, 0x03, 0xc0, 0x00, 0x63, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x57, 0x00, 0x48, 0x03, 0x72, 0x00, 0x48, 0x04, 0xf0, 0x00, 0x09, 0x05, 0x45, 0x00, 0x0a, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x1f, 0xff, 0xa1, 0x02, 0x00, 0xff, 0xdf, 0x05, 0xa0, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x00, 0x00, 0x09, 0x02, 0xf5, 0x00, 0x0c, 0x04, 0x65, 0xff, 0xf7, 0x04, 0x42, 0x00, 0x09, 0x04, 0x52, 0x00, 0x9c, 0x04, 0x92, 0x00, 0x65, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf4, 0x00, 0x72, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x05, 0x03, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x05, 0xe6, 0x00, 0x6f, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xd4, 0x00, 0x77, 0x05, 0x95, 0x00, 0x77, 0x04, 0xc8, 0x00, 0x65, 0x02, 0x00, 0xff, 0xdf, 0x05, 0x02, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x04, 0x88, 0x00, 0x65, 0x04, 0x4a, 0x00, 0x56, 0x04, 0x4a, 0x00, 0x56, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x00, 0x00, 0x0c, 0x02, 0x6f, 0x00, 0x95, 0x02, 0xac, 0x00, 0x68, 0x02, 0xd9, 0x00, 0x43, 0x03, 0x82, 0x00, 0x45, 0x02, 0x01, 0x00, 0xad, 0x05, 0x15, 0x00, 0xad, 0x07, 0x03, 0x00, 0xa7, 0x07, 0x03, 0x00, 0xa7, 0x07, 0x03, 0x00, 0xa7, 0x04, 0xa6, 0xff, 0xdf, 0x04, 0x9f, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa1, 0x04, 0x67, 0x00, 0x65, 0x06, 0x2d, 0x00, 0x65, 0x05, 0x3d, 0x00, 0x85, 0x04, 0xbf, 0x00, 0x64, 0x02, 0xfb, 0x00, 0x00, 0x02, 0xfb, 0x00, 0x00, 0x02, 0xfa, 0x00, 0x00, 0x02, 0xf5, 0x00, 0xa7, 0x02, 0xf4, 0x00, 0xa7, 0x03, 0xd1, 0x00, 0x76, 0x03, 0xd1, 0x00, 0x68, 0x04, 0x58, 0x00, 0xa7, 0x04, 0x58, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x02, 0x6b, 0xff, 0xdd, 0x02, 0x6b, 0xff, 0xdd, 0x03, 0x52, 0x00, 0x31, 0x02, 0x6b, 0xff, 0x0d, 0x02, 0xd2, 0x00, 0x31, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x90, 0x00, 0x00, 0x04, 0x72, 0x00, 0x65, 0x04, 0x4e, 0x00, 0xad, 0x04, 0x42, 0x00, 0x36, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0x00, 0x5b, 0x03, 0xc7, 0x00, 0x4f, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x28, 0x00, 0x4f, 0x04, 0x28, 0x00, 0x62, 0x03, 0xac, 0x00, 0x4f, 0x03, 0xac, 0x00, 0x4f, 0x03, 0xac, 0x00, 0x4f, 0x03, 0xac, 0x00, 0x4f, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x2c, 0x00, 0xa7, 0x04, 0xc8, 0x00, 0x65, 0x05, 0x19, 0x00, 0x65, 0x04, 0xb5, 0x00, 0xa7, 0x02, 0x1a, 0xff, 0x0d, 0x04, 0xcd, 0x00, 0xa7, 0x03, 0xa6, 0x00, 0xa7, 0x05, 0x3c, 0x00, 0x65, 0x03, 0xac, 0x00, 0x4f, 0x03, 0xac, 0x00, 0x4f, 0x07, 0x4d, 0x00, 0x65, 0x07, 0x9d, 0x00, 0x65, 0x07, 0x4a, 0x00, 0x65, 0x05, 0xfa, 0x00, 0x31, 0x04, 0x64, 0x00, 0x31, 0x05, 0x9a, 0x00, 0x31, 0x06, 0x1b, 0x00, 0x2a, 0x05, 0x14, 0x00, 0xad, 0x04, 0xb6, 0x00, 0xad, 0x03, 0xb5, 0x00, 0x30, 0x03, 0xb5, 0x00, 0x30, 0x04, 0xc2, 0x00, 0x00, 0x04, 0xc7, 0x00, 0x00, 0x02, 0xe9, 0x00, 0x69, 0x02, 0xdf, 0x00, 0x69, 0x01, 0x42, 0xff, 0xec, 0x01, 0xdd, 0x00, 0x69, 0x02, 0x20, 0x00, 0x40, 0x02, 0x21, 0x00, 0x40, 0x02, 0xba, 0x00, 0x1c, 0x03, 0xb5, 0x00, 0x30, 0x02, 0xae, 0x00, 0x22, 0x02, 0x01, 0x00, 0x90, 0x03, 0x4f, 0x00, 0x90, 0x02, 0x49, 0x00, 0x9c, 0x02, 0x49, 0x00, 0xa0, 0x02, 0x49, 0x00, 0xb0, 0x02, 0x36, 0x00, 0x69, 0x02, 0x36, 0x00, 0x69, 0x02, 0xa9, 0x00, 0x69, 0x02, 0xa9, 0x00, 0x69, 0x03, 0x99, 0x00, 0xf0, 0x03, 0x99, 0x00, 0xf0, 0x03, 0x99, 0x00, 0xad, 0x03, 0x99, 0x00, 0xad, 0x03, 0x99, 0x00, 0xad, 0x03, 0x99, 0x00, 0xad, 0x01, 0xfa, 0x00, 0xc0, 0x03, 0x99, 0x00, 0xbf, 0x03, 0x99, 0x01, 0x4d, 0x03, 0x99, 0x00, 0x99, 0x01, 0xfa, 0x00, 0xc0, 0x03, 0x99, 0x00, 0xbf, 0x03, 0x99, 0x00, 0x99, 0x03, 0x99, 0x01, 0x4d, 0x02, 0x6d, 0x00, 0x63, 0x02, 0x6d, 0x00, 0x63, 0x02, 0x36, 0x00, 0x69, 0x02, 0x36, 0x00, 0x69, 0x03, 0x99, 0x01, 0x02, 0x03, 0x99, 0x01, 0x02, 0x02, 0xce, 0x00, 0x5a, 0x02, 0x49, 0x00, 0x5a, 0x03, 0x99, 0x00, 0xb3, 0x03, 0x99, 0x01, 0x71, 0x03, 0x99, 0x00, 0xd6, 0x03, 0x99, 0x01, 0x2a, 0x03, 0x99, 0x00, 0xa3, 0x03, 0x99, 0x00, 0xd8, 0x02, 0x45, 0x00, 0x00, 0x03, 0x99, 0x00, 0xd7, 0x03, 0x10, 0x00, 0x69, 0x01, 0x32, 0x00, 0x6d, 0x02, 0xaf, 0x00, 0x69, 0x03, 0x32, 0x00, 0x69, 0x02, 0xa9, 0x00, 0x69, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x99, 0x00, 0xad, 0x03, 0x99, 0x00, 0xbf, 0x03, 0xba, 0x00, 0x9c, 0x03, 0x99, 0x00, 0xd6, 0x03, 0x99, 0x00, 0xa3, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x00, 0xfd, 0xb3, 0x00, 0x00, 0xfd, 0x15, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfd, 0x2a, 0x00, 0x00, 0xfc, 0x55, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0xdf, 0x00, 0x00, 0xfd, 0x28, 0x00, 0x00, 0xfd, 0x7f, 0x00, 0x00, 0xfd, 0x3b, 0x00, 0x00, 0xfd, 0x42, 0x00, 0x00, 0xfd, 0x18, 0x00, 0x00, 0xfd, 0xf6, 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0xfc, 0xbb, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfe, 0x50, 0x00, 0x00, 0xfd, 0xcf, 0x00, 0x00, 0xfd, 0xcf, 0x00, 0x00, 0xff, 0x87, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x00, 0xfd, 0xb3, 0x00, 0x00, 0xfd, 0x6e, 0x00, 0x00, 0xfd, 0xfe, 0x00, 0x00, 0xfe, 0x80, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xfd, 0xc0, 0x00, 0x00, 0xfd, 0x57, 0x00, 0x00, 0xfd, 0x57, 0x00, 0x00, 0xfd, 0x6e, 0x00, 0x00, 0xfd, 0x57, 0x00, 0x00, 0xfd, 0xbb, 0x00, 0x00, 0xfd, 0xb8, 0x00, 0x00, 0xfd, 0xdf, 0x00, 0x00, 0xfd, 0x27, 0x00, 0x00, 0xfd, 0x71, 0x00, 0x00, 0xfd, 0xad, 0x00, 0x00, 0xfd, 0x6d, 0x00, 0x00, 0xfd, 0x92, 0x00, 0x00, 0xfd, 0xf6, 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0xfc, 0xc0, 0x00, 0x00, 0xfd, 0x18, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfd, 0x2a, 0x00, 0x00, 0xfc, 0x55, 0x00, 0x00, 0xfc, 0x55, 0x00, 0x00, 0xfb, 0xfe, 0x00, 0x00, 0xfd, 0xb9, 0x00, 0x00, 0xfb, 0x6f, 0x00, 0x00, 0xfb, 0xde, 0x00, 0x00, 0xfa, 0xaa, 0x00, 0x00, 0xfd, 0xe8, 0x00, 0x00, 0xfd, 0x40, 0x00, 0x00, 0xfd, 0x6b, 0x00, 0x00, 0xfc, 0xc0, 0x00, 0x00, 0xfd, 0x74, 0x00, 0x00, 0xfe, 0x39, 0x00, 0x00, 0xfc, 0x55, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x00, 0xfd, 0xb3, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfd, 0xcf, 0x00, 0x00, 0xfd, 0x37, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0x27, 0x00, 0x00, 0xfd, 0x69, 0x00, 0x00, 0xfd, 0x60, 0x00, 0x00, 0xfd, 0x69, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfc, 0xc0, 0x00, 0x00, 0xfd, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xb9, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x74, 0x00, 0x00, 0xfd, 0xb9, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xfc, 0xe8, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfd, 0x73, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfc, 0xd2, 0x04, 0xb6, 0x00, 0xb4, 0x04, 0x16, 0x00, 0xad, 0x06, 0x34, 0x00, 0xb4, 0x04, 0xa9, 0x00, 0xb4, 0x02, 0x01, 0x00, 0x90, 0x02, 0x01, 0x00, 0x90, 0x05, 0x62, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xa7, 0x03, 0x99, 0x01, 0x8a, 0x03, 0xf4, 0x00, 0x72, 0x03, 0xf5, 0x00, 0x65, 0x03, 0xf4, 0x00, 0x72, 0x02, 0x6d, 0x00, 0x8e, 0x03, 0x99, 0x01, 0x4d, 0x03, 0x99, 0x00, 0xc1, 0x04, 0xfc, 0x00, 0x0e, 0x02, 0x49, 0x00, 0xc5, 0x05, 0x5f, 0xff, 0xea, 0x06, 0x45, 0xff, 0xf5, 0x02, 0xf0, 0xff, 0xef, 0x05, 0xd9, 0xff, 0xf4, 0x05, 0xf0, 0xff, 0xe5, 0x05, 0xf1, 0xff, 0xdf, 0x02, 0x6f, 0x00, 0x04, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x02, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0xee, 0x00, 0x52, 0x05, 0x6a, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x02, 0x1f, 0x00, 0xb4, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x06, 0x36, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x57, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x65, 0xff, 0xfb, 0x04, 0x65, 0xff, 0xfd, 0x05, 0xaa, 0x00, 0x67, 0x04, 0xee, 0x00, 0x36, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x80, 0x00, 0x46, 0x02, 0x1f, 0x00, 0x05, 0x04, 0x65, 0xff, 0xfd, 0x04, 0xbf, 0x00, 0x65, 0x03, 0xe4, 0x00, 0x77, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x6f, 0x00, 0x95, 0x04, 0x2a, 0x00, 0x86, 0x04, 0xbf, 0x00, 0x65, 0x04, 0x98, 0x00, 0xac, 0x04, 0x42, 0x00, 0x1c, 0x04, 0x67, 0x00, 0x65, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xea, 0x00, 0x60, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x02, 0x6f, 0x00, 0x95, 0x04, 0x3e, 0x00, 0xab, 0x04, 0x42, 0x00, 0x36, 0x04, 0x94, 0x00, 0x9c, 0x04, 0x05, 0x00, 0x42, 0x04, 0x03, 0x00, 0x60, 0x04, 0x67, 0x00, 0x65, 0x04, 0x55, 0x00, 0x42, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x39, 0x00, 0x65, 0x04, 0x90, 0x00, 0x65, 0x04, 0x55, 0x00, 0x5a, 0x04, 0x2a, 0x00, 0x86, 0x04, 0xbf, 0x00, 0x64, 0x04, 0x28, 0x00, 0x35, 0x04, 0xbf, 0x00, 0x64, 0x06, 0x07, 0x00, 0x79, 0x02, 0x6f, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x67, 0x00, 0x65, 0x04, 0x2a, 0x00, 0x86, 0x06, 0x07, 0x00, 0x79, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x6c, 0x00, 0x96, 0x04, 0x75, 0x00, 0x65, 0x05, 0x07, 0x00, 0x4e, 0x06, 0x10, 0xff, 0xe5, 0x05, 0x07, 0x00, 0x4e, 0x04, 0xbf, 0x00, 0x64, 0x06, 0x07, 0x00, 0x3a, 0x04, 0xc7, 0x00, 0x64, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0xab, 0x00, 0x7d, 0x04, 0x39, 0x00, 0x65, 0x04, 0x24, 0x00, 0xb4, 0x03, 0x4d, 0xff, 0x54, 0x04, 0xbf, 0x00, 0xa1, 0x04, 0xbf, 0x00, 0xab, 0x06, 0x3a, 0x00, 0x66, 0x04, 0x84, 0x00, 0x6b, 0x06, 0xb8, 0x00, 0x67, 0x06, 0x07, 0x00, 0x79, 0x05, 0x75, 0x00, 0x67, 0x04, 0xbf, 0x00, 0x65, 0x05, 0xb2, 0x00, 0xb4, 0x04, 0x6d, 0x00, 0x28, 0x04, 0xf1, 0x00, 0x47, 0x04, 0x5e, 0x00, 0x5a, 0x05, 0x86, 0x00, 0x67, 0x04, 0x80, 0x00, 0x30, 0x05, 0x08, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0x65, 0x00, 0x27, 0x03, 0xdc, 0x00, 0x31, 0x04, 0xc7, 0x00, 0x64, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf5, 0x00, 0x65, 0x02, 0x00, 0xff, 0xdf, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0xb0, 0x04, 0x5b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x05, 0x07, 0x00, 0x67, 0x06, 0x36, 0x00, 0xb4, 0x04, 0xaf, 0x00, 0x72, 0x04, 0x92, 0x00, 0x4c, 0x05, 0x10, 0x00, 0x67, 0x05, 0x07, 0x00, 0x67, 0x05, 0x10, 0x00, 0x67, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x05, 0xa9, 0xff, 0xfb, 0x04, 0x64, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x04, 0x92, 0x00, 0x79, 0x02, 0x1f, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0x05, 0x02, 0x1f, 0xff, 0xa1, 0x07, 0xe0, 0x00, 0x4b, 0x07, 0x86, 0x00, 0xb4, 0x05, 0xa9, 0xff, 0xfb, 0x05, 0x1c, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x63, 0x00, 0x1f, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x64, 0x00, 0xb4, 0x05, 0xa0, 0x00, 0x5a, 0x04, 0x8c, 0x00, 0xb4, 0x07, 0xc1, 0x00, 0x24, 0x04, 0x9d, 0x00, 0x79, 0x05, 0x62, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x05, 0x1c, 0x00, 0xb4, 0x05, 0x6a, 0x00, 0x4b, 0x06, 0x36, 0x00, 0xb4, 0x05, 0x6a, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x57, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x04, 0x65, 0xff, 0xfb, 0x04, 0x63, 0x00, 0x1f, 0x06, 0x32, 0x00, 0x6c, 0x04, 0xee, 0x00, 0x36, 0x05, 0x97, 0x00, 0xb4, 0x04, 0xef, 0x00, 0x9d, 0x07, 0xb3, 0x00, 0xb4, 0x07, 0xe0, 0x00, 0xb4, 0x05, 0xfe, 0x00, 0x36, 0x06, 0x5a, 0x00, 0xb4, 0x04, 0xf0, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x63, 0x07, 0xc5, 0x00, 0xbd, 0x05, 0x00, 0x00, 0x7a, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x70, 0x00, 0x64, 0x04, 0x3e, 0x00, 0xa7, 0x03, 0xc8, 0x00, 0xa7, 0x04, 0xfa, 0x00, 0x60, 0x04, 0x6e, 0x00, 0x65, 0x06, 0x7c, 0x00, 0x3f, 0x03, 0xd4, 0x00, 0x77, 0x04, 0xad, 0x00, 0xa7, 0x04, 0xad, 0x00, 0xa7, 0x04, 0x59, 0x00, 0xa7, 0x04, 0x9a, 0x00, 0x44, 0x05, 0x6e, 0x00, 0xa7, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x31, 0x00, 0x36, 0x04, 0x42, 0x00, 0x36, 0x06, 0x27, 0x00, 0x64, 0x04, 0x42, 0x00, 0x35, 0x04, 0xe6, 0x00, 0xa7, 0x04, 0x41, 0x00, 0x87, 0x06, 0x96, 0x00, 0xa7, 0x06, 0xc8, 0x00, 0xa7, 0x05, 0x16, 0x00, 0x37, 0x05, 0xaf, 0x00, 0xa7, 0x04, 0x3e, 0x00, 0xa7, 0x03, 0xf3, 0x00, 0x65, 0x06, 0x0f, 0x00, 0xad, 0x04, 0x54, 0x00, 0x68, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x80, 0x00, 0x2a, 0x03, 0xc8, 0x00, 0xa7, 0x03, 0xf3, 0x00, 0x65, 0x03, 0xc0, 0x00, 0x63, 0x02, 0x00, 0x00, 0xad, 0x02, 0x00, 0xff, 0xf6, 0x02, 0x00, 0xff, 0xdf, 0x06, 0x7f, 0x00, 0x44, 0x06, 0x78, 0x00, 0xa7, 0x04, 0xb1, 0x00, 0x2a, 0x04, 0x59, 0x00, 0xa7, 0x04, 0xad, 0x00, 0xa7, 0x04, 0x42, 0x00, 0x36, 0x04, 0xb5, 0x00, 0xa7, 0x06, 0xb8, 0x00, 0x67, 0x06, 0x07, 0x00, 0x79, 0x05, 0x8c, 0x00, 0x1b, 0x04, 0xd6, 0x00, 0x1b, 0x06, 0xc9, 0x00, 0xbd, 0x05, 0x64, 0x00, 0xad, 0x06, 0x54, 0x00, 0x0e, 0x05, 0xa3, 0x00, 0x2d, 0x08, 0x59, 0x00, 0xb4, 0x07, 0x35, 0x00, 0xad, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x60, 0x07, 0x64, 0x00, 0xb4, 0x05, 0xef, 0x00, 0xad, 0x04, 0x94, 0x00, 0x67, 0x03, 0xe4, 0x00, 0x51, 0x06, 0x2a, 0x00, 0x0e, 0x06, 0x4f, 0x00, 0x2d, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xa0, 0x00, 0x0e, 0x04, 0xc9, 0x00, 0x2d, 0x05, 0xa0, 0x00, 0x0e, 0x04, 0xc9, 0x00, 0x2d, 0x07, 0x24, 0x00, 0x67, 0x06, 0x82, 0x00, 0x65, 0x06, 0xdc, 0x00, 0x67, 0x05, 0x75, 0x00, 0x65, 0x08, 0x7e, 0x00, 0x6a, 0x07, 0x66, 0x00, 0x88, 0x06, 0xb8, 0x00, 0x67, 0x06, 0x07, 0x00, 0x79, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x03, 0x9e, 0x00, 0x35, 0x00, 0x00, 0xfc, 0x45, 0x00, 0x00, 0xfd, 0x54, 0x00, 0x00, 0xfd, 0xee, 0x00, 0x00, 0xfd, 0xee, 0x00, 0x00, 0xfa, 0x69, 0x03, 0x02, 0xf8, 0xa7, 0x03, 0x02, 0xf9, 0x1c, 0x05, 0x8f, 0x00, 0xb4, 0x04, 0xdf, 0x00, 0xad, 0x04, 0xf0, 0x00, 0x1d, 0x04, 0x3e, 0x00, 0x22, 0x04, 0x57, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x64, 0x00, 0xb4, 0x03, 0xc8, 0x00, 0xa7, 0x04, 0xdb, 0x00, 0x3f, 0x04, 0x40, 0x00, 0x32, 0x04, 0x7e, 0x00, 0xb4, 0x03, 0xd0, 0x00, 0xa7, 0x07, 0xc1, 0x00, 0x24, 0x06, 0x7c, 0x00, 0x3f, 0x04, 0x9d, 0x00, 0x79, 0x03, 0xd4, 0x00, 0x77, 0x05, 0x1c, 0x00, 0xb4, 0x04, 0x59, 0x00, 0xa7, 0x05, 0x1c, 0x00, 0xb4, 0x04, 0x59, 0x00, 0xa7, 0x05, 0x1c, 0x00, 0x1d, 0x04, 0x59, 0x00, 0x36, 0x06, 0x2a, 0x00, 0x2d, 0x05, 0xfc, 0x00, 0x25, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0xc1, 0x00, 0xad, 0x07, 0x4d, 0x00, 0xb4, 0x06, 0x50, 0x00, 0xad, 0x07, 0xc8, 0x00, 0xb4, 0x06, 0x97, 0x00, 0xad, 0x06, 0x52, 0x00, 0x67, 0x04, 0xfd, 0x00, 0x65, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x65, 0xff, 0xfb, 0x04, 0x31, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x06, 0xb9, 0xff, 0xfb, 0x05, 0xce, 0x00, 0x04, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x41, 0x00, 0x87, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x41, 0x00, 0x87, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x90, 0x00, 0xa7, 0x06, 0xc6, 0x00, 0x12, 0x05, 0x3d, 0x00, 0x0d, 0x06, 0xc6, 0x00, 0x12, 0x05, 0x3d, 0x00, 0x0d, 0x02, 0x1f, 0x00, 0xb4, 0x07, 0xc1, 0x00, 0x24, 0x06, 0x7c, 0x00, 0x3f, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x59, 0x00, 0xab, 0x05, 0x96, 0x00, 0x30, 0x04, 0xd3, 0x00, 0x29, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0xc1, 0x00, 0xad, 0x05, 0x97, 0x00, 0xb4, 0x04, 0xe6, 0x00, 0xad, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x41, 0x00, 0x87, 0x06, 0x64, 0x00, 0xb4, 0x05, 0x93, 0x00, 0xad, 0x02, 0x00, 0x00, 0xad, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x07, 0x03, 0x00, 0x07, 0x07, 0x11, 0x00, 0x6e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x69, 0x04, 0x6e, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x69, 0x04, 0x6e, 0x00, 0x65, 0x07, 0xc1, 0x00, 0x24, 0x06, 0x7c, 0x00, 0x3f, 0x04, 0x9d, 0x00, 0x79, 0x03, 0xd4, 0x00, 0x77, 0x04, 0xcb, 0x00, 0x90, 0x04, 0x28, 0x00, 0x4f, 0x05, 0x62, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xa7, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0x07, 0x00, 0x63, 0x03, 0xf3, 0x00, 0x65, 0x04, 0x63, 0x00, 0x1f, 0x04, 0x42, 0x00, 0x36, 0x04, 0x63, 0x00, 0x1f, 0x04, 0x42, 0x00, 0x36, 0x04, 0x63, 0x00, 0x1f, 0x04, 0x42, 0x00, 0x36, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x41, 0x00, 0x87, 0x04, 0x64, 0x00, 0xb4, 0x03, 0xc8, 0x00, 0xa7, 0x06, 0x5a, 0x00, 0xb4, 0x05, 0xaf, 0x00, 0xa7, 0x04, 0xdb, 0x00, 0x3f, 0x04, 0x40, 0x00, 0x32, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x04, 0xf0, 0x00, 0x82, 0x04, 0x3e, 0x00, 0x65, 0x07, 0x3e, 0x00, 0x82, 0x06, 0x75, 0x00, 0x65, 0x07, 0x04, 0x00, 0xb4, 0x06, 0x42, 0x00, 0x99, 0x04, 0xe3, 0x00, 0xb4, 0x04, 0x3c, 0x00, 0x99, 0x07, 0xb7, 0x00, 0x30, 0x06, 0xe4, 0x00, 0x29, 0x08, 0x03, 0x00, 0xb4, 0x06, 0xf6, 0x00, 0xad, 0x05, 0x94, 0x00, 0x67, 0x04, 0xbf, 0x00, 0x65, 0x05, 0x90, 0xff, 0xfb, 0x05, 0x1e, 0x00, 0x04, 0x04, 0x6c, 0x00, 0x93, 0x03, 0xe4, 0x00, 0x77, 0x05, 0x6a, 0x00, 0x4b, 0x04, 0x9a, 0x00, 0x44, 0x08, 0x6a, 0x00, 0x4b, 0x07, 0x27, 0x00, 0x44, 0x06, 0x6f, 0x00, 0xb4, 0x06, 0x39, 0x00, 0xa7, 0x07, 0x6d, 0x00, 0x7a, 0x07, 0x19, 0x00, 0x68, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x05, 0x1c, 0x00, 0xb4, 0x04, 0x59, 0x00, 0xa7, 0x07, 0xc7, 0x00, 0x4b, 0x06, 0x84, 0x00, 0x44, 0x07, 0xc8, 0x00, 0xb4, 0x06, 0x91, 0x00, 0xa7, 0x05, 0xb5, 0x00, 0xb4, 0x04, 0xea, 0x00, 0xa7, 0x04, 0x42, 0x00, 0x36, 0x05, 0x2a, 0x00, 0x09, 0x07, 0x11, 0x00, 0x6e, 0x04, 0x38, 0x00, 0x37, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x5b, 0x00, 0xa7, 0x04, 0x5b, 0x00, 0x20, 0x03, 0x88, 0x00, 0xa7, 0x03, 0xe4, 0x00, 0x75, 0x02, 0x00, 0x00, 0xad, 0x02, 0xd7, 0x00, 0x00, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0x32, 0x00, 0x01, 0x05, 0x6e, 0x00, 0xa7, 0x04, 0xad, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x03, 0xf5, 0x00, 0x72, 0x04, 0xec, 0x00, 0x65, 0x04, 0xec, 0x00, 0x65, 0x04, 0xec, 0x00, 0x2d, 0x07, 0x5d, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x03, 0xc6, 0x00, 0x87, 0x04, 0x54, 0x00, 0x2d, 0x04, 0x54, 0x00, 0x2d, 0x04, 0x31, 0x00, 0x36, 0x04, 0x22, 0x00, 0xa7, 0x05, 0x4e, 0x00, 0x9c, 0x06, 0xd2, 0x00, 0x9c, 0x04, 0x97, 0x00, 0x2a, 0x04, 0x42, 0x00, 0x36, 0x05, 0xe3, 0x00, 0x4d, 0x03, 0xc7, 0x00, 0x4f, 0x03, 0xc9, 0x00, 0x6c, 0x04, 0x32, 0x00, 0xa1, 0x04, 0x42, 0x00, 0x36, 0x04, 0x0f, 0x00, 0x87, 0x03, 0xc6, 0x00, 0x87, 0x04, 0x40, 0x00, 0x51, 0x04, 0x9a, 0x00, 0x44, 0x03, 0x19, 0x00, 0x09, 0x04, 0x6a, 0x00, 0x04, 0x03, 0x1c, 0x00, 0x72, 0x03, 0x7d, 0x00, 0x72, 0x02, 0xdd, 0x00, 0x72, 0x02, 0xdd, 0x00, 0x4a, 0x03, 0x83, 0x00, 0x40, 0x03, 0x69, 0x00, 0x72, 0x01, 0x56, 0x00, 0x72, 0x01, 0x56, 0xff, 0xc4, 0x02, 0xf9, 0x00, 0x72, 0x02, 0x86, 0x00, 0x72, 0x03, 0xe9, 0x00, 0x72, 0x03, 0x64, 0x00, 0x72, 0x03, 0x64, 0x00, 0x72, 0x03, 0x91, 0x00, 0x40, 0x03, 0x2a, 0x00, 0x3f, 0x02, 0xbc, 0x00, 0x72, 0x03, 0x26, 0x00, 0x72, 0x02, 0xc5, 0xff, 0xfd, 0x03, 0x51, 0x00, 0x64, 0x04, 0x7b, 0x00, 0x26, 0x02, 0xd1, 0x00, 0x45, 0x02, 0xd1, 0x00, 0x45, 0x02, 0xeb, 0x00, 0x3f, 0x04, 0xaa, 0x00, 0x45, 0x03, 0x15, 0x00, 0x69, 0x02, 0xeb, 0x00, 0x3f, 0x03, 0x00, 0x00, 0x3f, 0x03, 0x00, 0x00, 0x3f, 0x02, 0x98, 0x00, 0x4b, 0x02, 0x96, 0x00, 0x49, 0x02, 0xeb, 0x00, 0x3f, 0x01, 0x49, 0x00, 0x6d, 0x03, 0x10, 0x00, 0x69, 0x04, 0x7c, 0x00, 0x69, 0x02, 0xf1, 0x00, 0x69, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0xaa, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x03, 0x15, 0x00, 0x69, 0x02, 0x1f, 0x00, 0x1f, 0x02, 0xea, 0x00, 0x63, 0x03, 0x61, 0x00, 0x63, 0x04, 0x7c, 0x00, 0x69, 0x03, 0x00, 0x00, 0x22, 0x02, 0xe4, 0x00, 0x6c, 0x02, 0xae, 0x00, 0x12, 0x02, 0xc6, 0x00, 0x3f, 0x02, 0xfd, 0x00, 0x3f, 0x02, 0x9e, 0x00, 0x21, 0x01, 0x49, 0x00, 0x6d, 0x01, 0xdd, 0x00, 0x69, 0x02, 0xea, 0x00, 0x63, 0x03, 0x00, 0x00, 0x22, 0x02, 0xe4, 0x00, 0x6c, 0x02, 0xae, 0x00, 0x12, 0x02, 0xf6, 0x00, 0x6c, 0x02, 0xfd, 0x00, 0x3f, 0x02, 0x9e, 0x00, 0x21, 0x04, 0x92, 0x00, 0xa7, 0x03, 0x69, 0x00, 0x72, 0x02, 0xac, 0x00, 0x68, 0x04, 0xcd, 0x00, 0x2d, 0x02, 0x00, 0x00, 0x82, 0x02, 0xeb, 0x00, 0x3f, 0x02, 0xaa, 0x00, 0x3f, 0x02, 0xaa, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0x98, 0x00, 0x4b, 0x02, 0x22, 0x00, 0x1b, 0x01, 0xad, 0xff, 0xec, 0x02, 0xeb, 0x00, 0x3f, 0x02, 0xea, 0x00, 0x63, 0x01, 0xe1, 0x00, 0x41, 0x01, 0xcb, 0x00, 0x6d, 0x01, 0xe0, 0x00, 0x41, 0x01, 0xe1, 0x00, 0x41, 0x01, 0xb0, 0xff, 0x67, 0x01, 0xcb, 0x00, 0x6d, 0x01, 0xb0, 0x00, 0x51, 0x02, 0xb5, 0x00, 0x65, 0x04, 0x7c, 0x00, 0x69, 0x04, 0x7c, 0x00, 0x69, 0x02, 0xf4, 0xff, 0xec, 0x03, 0x73, 0x00, 0x69, 0x02, 0xf1, 0x00, 0x65, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0x98, 0x00, 0x3f, 0x02, 0x10, 0xff, 0xec, 0x02, 0x1f, 0x00, 0x1f, 0x03, 0xa8, 0x00, 0x54, 0x03, 0x03, 0x00, 0x3f, 0x02, 0x9a, 0x00, 0x69, 0x02, 0xec, 0x00, 0x6d, 0x03, 0x00, 0x00, 0x22, 0x02, 0xa3, 0x00, 0x31, 0x03, 0x24, 0x00, 0x31, 0x02, 0xa3, 0x00, 0x31, 0x02, 0xd2, 0x00, 0x31, 0x02, 0xfa, 0x00, 0x3f, 0x00, 0x00, 0xfc, 0xb9, 0x00, 0x00, 0xfc, 0xb9, 0x00, 0x00, 0xfc, 0xb9, 0x00, 0x00, 0xfc, 0xb9, 0x00, 0x00, 0xfc, 0xa2, 0x00, 0x00, 0xfc, 0xa2, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa5, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x24, 0x00, 0xb4, 0x02, 0x88, 0x00, 0x2a, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa5, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0xff, 0xef, 0x05, 0x6a, 0x00, 0x0f, 0x04, 0x90, 0x00, 0x01, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x1f, 0x00, 0x00, 0x02, 0x00, 0xff, 0xd8, 0x02, 0x1f, 0x00, 0x06, 0x02, 0x00, 0xff, 0xf6, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x12, 0x00, 0xb4, 0x04, 0x02, 0x00, 0x02, 0x02, 0x12, 0xff, 0xfe, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x00, 0xff, 0xf6, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x00, 0xff, 0xe2, 0x06, 0x36, 0x00, 0xb4, 0x07, 0x03, 0x00, 0xa7, 0x06, 0x36, 0x00, 0xb4, 0x07, 0x03, 0x00, 0xa7, 0x06, 0x36, 0x00, 0xb4, 0x07, 0x03, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0x57, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x57, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0x4b, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x42, 0x00, 0x36, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x42, 0x00, 0x36, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x90, 0x00, 0xa7, 0x02, 0xd2, 0x00, 0x03, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x36, 0x04, 0x69, 0x00, 0x6e, 0x02, 0x88, 0x00, 0x2a, 0x02, 0x88, 0x00, 0x01, 0x02, 0x88, 0x00, 0x2a, 0x05, 0x88, 0x00, 0xa0, 0x04, 0x67, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x1f, 0x00, 0x51, 0x02, 0x00, 0x00, 0x3d, 0x02, 0x1f, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xab, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x05, 0x89, 0x00, 0xb4, 0x03, 0x6f, 0x00, 0x1c, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x06, 0x51, 0x00, 0x04, 0x06, 0x51, 0x00, 0x05, 0x05, 0x89, 0x00, 0x06, 0x05, 0xc4, 0x00, 0x04, 0x05, 0x19, 0x00, 0x06, 0x05, 0x58, 0x00, 0x03, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x05, 0x1e, 0x00, 0x06, 0x05, 0x1e, 0x00, 0x06, 0x06, 0xf4, 0x00, 0x04, 0x07, 0x04, 0x00, 0x05, 0x06, 0x78, 0x00, 0x06, 0x06, 0xae, 0x00, 0x04, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x06, 0x06, 0x00, 0x06, 0x06, 0x03, 0x00, 0x06, 0x07, 0xd1, 0x00, 0x04, 0x07, 0xd7, 0x00, 0x05, 0x07, 0x64, 0x00, 0x06, 0x07, 0x90, 0x00, 0x04, 0x06, 0xb8, 0x00, 0x06, 0x06, 0xd1, 0x00, 0x03, 0x02, 0x6f, 0x00, 0x8b, 0x02, 0x6f, 0x00, 0x82, 0x02, 0x6f, 0xff, 0xb9, 0x02, 0x6f, 0xff, 0xc2, 0x02, 0x6f, 0x00, 0x04, 0x02, 0x6f, 0xff, 0xd8, 0x02, 0x6f, 0xff, 0xd1, 0x02, 0x6f, 0xff, 0xcc, 0x02, 0xbc, 0x00, 0x06, 0x02, 0xb1, 0x00, 0x06, 0x04, 0x92, 0x00, 0x04, 0x04, 0x92, 0x00, 0x05, 0x04, 0x1b, 0x00, 0x06, 0x04, 0x51, 0x00, 0x04, 0x03, 0x85, 0x00, 0x06, 0x03, 0x8c, 0x00, 0x03, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x05, 0xca, 0x00, 0x06, 0x06, 0x1b, 0x00, 0x06, 0x07, 0xe1, 0x00, 0x04, 0x07, 0xea, 0x00, 0x05, 0x06, 0xc1, 0x00, 0x06, 0x06, 0xfc, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x05, 0xa4, 0x00, 0x06, 0x07, 0x2e, 0x00, 0x05, 0x07, 0x49, 0x00, 0x04, 0x06, 0x76, 0x00, 0x03, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x05, 0xc6, 0x00, 0x06, 0x06, 0x12, 0x00, 0x06, 0x07, 0xd7, 0x00, 0x04, 0x07, 0xe2, 0x00, 0x05, 0x06, 0xcf, 0x00, 0x06, 0x06, 0xff, 0x00, 0x04, 0x06, 0xa2, 0x00, 0x06, 0x06, 0xdb, 0x00, 0x03, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xf2, 0x00, 0x77, 0x04, 0x90, 0x00, 0xa7, 0x04, 0xb6, 0x00, 0xa7, 0x02, 0x6f, 0xff, 0x99, 0x02, 0x6f, 0x00, 0x95, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x06, 0x51, 0x00, 0x04, 0x06, 0x51, 0x00, 0x05, 0x05, 0x89, 0x00, 0x06, 0x05, 0xc4, 0x00, 0x04, 0x05, 0x19, 0x00, 0x06, 0x05, 0x58, 0x00, 0x03, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x06, 0x06, 0x00, 0x06, 0x06, 0x03, 0x00, 0x06, 0x07, 0xd1, 0x00, 0x04, 0x07, 0xd7, 0x00, 0x05, 0x07, 0x64, 0x00, 0x06, 0x07, 0x90, 0x00, 0x04, 0x06, 0xb8, 0x00, 0x06, 0x06, 0xd1, 0x00, 0x03, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x05, 0xc6, 0x00, 0x06, 0x06, 0x12, 0x00, 0x06, 0x07, 0xd7, 0x00, 0x04, 0x07, 0xe2, 0x00, 0x05, 0x06, 0xcf, 0x00, 0x06, 0x06, 0xff, 0x00, 0x04, 0x06, 0xa2, 0x00, 0x06, 0x06, 0xdb, 0x00, 0x03, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x05, 0x28, 0xff, 0xfd, 0x04, 0xfc, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x03, 0x99, 0x01, 0x5f, 0x03, 0x99, 0x01, 0x8a, 0x03, 0x99, 0x01, 0x5f, 0x03, 0x99, 0x00, 0xa3, 0x03, 0x99, 0x00, 0xa3, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0xb6, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xcb, 0xff, 0xfd, 0x05, 0x5f, 0xff, 0xea, 0x06, 0xb3, 0xff, 0xfd, 0x06, 0x45, 0xff, 0xf5, 0x05, 0x6a, 0x00, 0xb4, 0x03, 0x99, 0x00, 0x7b, 0x03, 0x99, 0x00, 0xa2, 0x03, 0x99, 0x00, 0xa3, 0x02, 0x6f, 0xff, 0xee, 0x02, 0x6f, 0xff, 0xe6, 0x02, 0x6f, 0xff, 0xdc, 0x02, 0x6f, 0x00, 0x04, 0x02, 0x6f, 0xff, 0xe7, 0x02, 0x6f, 0xff, 0xe9, 0x02, 0x1f, 0xff, 0xf7, 0x02, 0x1f, 0x00, 0x02, 0x03, 0x6b, 0xff, 0xfd, 0x02, 0xf0, 0xff, 0xef, 0x03, 0x99, 0x00, 0x71, 0x03, 0x99, 0x00, 0x86, 0x03, 0x99, 0x00, 0xa3, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x65, 0xff, 0xfd, 0x06, 0x15, 0xff, 0xfd, 0x05, 0xf0, 0xff, 0xe5, 0x04, 0xee, 0x00, 0x06, 0x03, 0x99, 0x00, 0x99, 0x03, 0x99, 0x00, 0xc1, 0x03, 0x99, 0x00, 0x99, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0xc6, 0xff, 0xfd, 0x05, 0xd9, 0xff, 0xf4, 0x06, 0xa4, 0xff, 0xfd, 0x05, 0xf1, 0xff, 0xdf, 0x05, 0x80, 0x00, 0x46, 0x03, 0x99, 0x01, 0x4d, 0x03, 0x99, 0x01, 0x5f, 0x03, 0x99, 0x00, 0x00, 0x07, 0x33, 0x00, 0x00, 0x03, 0x99, 0x00, 0x00, 0x07, 0x33, 0x00, 0x00, 0x02, 0x5f, 0x00, 0x00, 0x01, 0xcc, 0x00, 0x00, 0x01, 0x33, 0x00, 0x00, 0x04, 0x94, 0x00, 0x00, 0x02, 0x49, 0x00, 0x00, 0x01, 0x70, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, 0x00, 0x5a, 0x02, 0x99, 0x00, 0x5a, 0x04, 0x94, 0x00, 0x5a, 0x03, 0x99, 0x00, 0x5a, 0x07, 0x33, 0x00, 0x5a, 0x07, 0x33, 0x00, 0x00, 0x03, 0x99, 0x00, 0xea, 0x03, 0x99, 0xff, 0xee, 0x02, 0x49, 0x00, 0x9c, 0x02, 0x49, 0x00, 0xa0, 0x02, 0x49, 0x00, 0x9c, 0x02, 0x49, 0x00, 0xa0, 0x03, 0xba, 0x00, 0x9c, 0x03, 0xba, 0x00, 0x9c, 0x03, 0xba, 0x00, 0x9c, 0x03, 0xba, 0x00, 0x9c, 0x03, 0x99, 0x00, 0x33, 0x03, 0x99, 0x00, 0x33, 0x04, 0x3f, 0x01, 0x14, 0x04, 0x3f, 0x01, 0x14, 0x02, 0x68, 0x00, 0xd4, 0x04, 0xce, 0x00, 0xd4, 0x07, 0x33, 0x00, 0xd4, 0x02, 0x49, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x70, 0x00, 0x00, 0x09, 0xa9, 0x00, 0x65, 0x0c, 0x7e, 0x00, 0x65, 0x01, 0xa2, 0x00, 0x24, 0x02, 0xb0, 0x00, 0x24, 0x03, 0xbe, 0x00, 0x24, 0x01, 0xa2, 0x00, 0x24, 0x02, 0xb0, 0x00, 0x24, 0x03, 0xbe, 0x00, 0x24, 0x02, 0x70, 0x00, 0x09, 0x02, 0xe1, 0x00, 0x8e, 0x02, 0xe1, 0x00, 0xad, 0x06, 0x08, 0x00, 0xaf, 0x03, 0x7e, 0x00, 0x84, 0x03, 0xd2, 0x00, 0x84, 0x03, 0x99, 0xff, 0xee, 0x05, 0xc9, 0xff, 0xb0, 0x05, 0xc9, 0xff, 0xb0, 0x01, 0xcc, 0xff, 0xb3, 0x07, 0x33, 0x00, 0x36, 0x03, 0x99, 0x00, 0xc6, 0x01, 0x33, 0xfe, 0xaf, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0xcf, 0x00, 0x9e, 0x06, 0xa3, 0x00, 0x42, 0x05, 0x46, 0x00, 0x84, 0x05, 0x46, 0x00, 0x84, 0x03, 0x94, 0x00, 0x5a, 0x04, 0x94, 0x00, 0xd4, 0x03, 0x99, 0x00, 0xc2, 0x03, 0x99, 0x00, 0xc2, 0x03, 0x99, 0x00, 0x36, 0x02, 0x6d, 0x01, 0x00, 0x05, 0xc9, 0xff, 0xb0, 0x03, 0x99, 0x00, 0x36, 0x03, 0x3c, 0x00, 0x82, 0x07, 0x33, 0x00, 0x5a, 0x05, 0xc9, 0xff, 0xb0, 0x06, 0x08, 0x01, 0x18, 0x04, 0x38, 0x00, 0xe1, 0x04, 0xc6, 0x00, 0x24, 0x06, 0x08, 0x01, 0x42, 0x06, 0x08, 0x01, 0x42, 0x02, 0x49, 0x00, 0xc5, 0x05, 0xbd, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x64, 0x02, 0x49, 0x00, 0xc5, 0x02, 0x49, 0x00, 0xc5, 0x01, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe2, 0x00, 0x4e, 0x01, 0x49, 0x00, 0x6d, 0x02, 0xe2, 0x00, 0x38, 0x02, 0xe2, 0x00, 0x5b, 0x02, 0xe2, 0x00, 0x52, 0x02, 0xe2, 0x00, 0x61, 0x02, 0xe2, 0x00, 0x50, 0x02, 0xe2, 0x00, 0x4a, 0x03, 0xcc, 0x00, 0x7b, 0x03, 0xcc, 0x00, 0x7b, 0x03, 0xcc, 0x00, 0x7b, 0x01, 0xc4, 0x00, 0x63, 0x01, 0xc4, 0x00, 0x5c, 0x02, 0xde, 0x00, 0x69, 0x02, 0xe2, 0x00, 0x4e, 0x02, 0xe2, 0x00, 0x7b, 0x02, 0xe2, 0x00, 0x54, 0x02, 0xe2, 0x00, 0x58, 0x02, 0xe2, 0x00, 0x38, 0x02, 0xe2, 0x00, 0x5b, 0x02, 0xe2, 0x00, 0x52, 0x02, 0xe2, 0x00, 0x61, 0x02, 0xe2, 0x00, 0x50, 0x02, 0xe2, 0x00, 0x4a, 0x03, 0xcc, 0x00, 0x7b, 0x03, 0xcc, 0x00, 0x7b, 0x03, 0xcc, 0x00, 0x7b, 0x01, 0xc4, 0x00, 0x63, 0x01, 0xc4, 0x00, 0x5c, 0x02, 0xd1, 0x00, 0x45, 0x03, 0x00, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x03, 0x32, 0x00, 0x69, 0x03, 0x00, 0x00, 0x3f, 0x02, 0xe9, 0x00, 0x69, 0x03, 0x10, 0x00, 0x69, 0x01, 0x32, 0x00, 0x6d, 0x04, 0x7c, 0x00, 0x69, 0x02, 0xde, 0x00, 0x69, 0x03, 0x15, 0x00, 0x69, 0x02, 0xaf, 0x00, 0x69, 0x02, 0x1f, 0x00, 0x1f, 0x06, 0x50, 0x00, 0x4d, 0x04, 0x94, 0x00, 0x67, 0x04, 0x94, 0x00, 0x56, 0x04, 0x94, 0x00, 0x77, 0x04, 0x94, 0x00, 0x74, 0x07, 0x03, 0x00, 0xa7, 0x05, 0x62, 0x00, 0x69, 0x09, 0x29, 0x00, 0xb4, 0x07, 0xbb, 0x00, 0xb4, 0x07, 0x1e, 0x00, 0x35, 0x05, 0xa5, 0x00, 0x55, 0x04, 0x94, 0x00, 0x65, 0x04, 0x94, 0x00, 0x00, 0x04, 0x94, 0x00, 0x24, 0x04, 0x94, 0x00, 0x12, 0x09, 0x29, 0x00, 0xbb, 0x04, 0x94, 0x00, 0x29, 0x04, 0x94, 0x00, 0x3d, 0x04, 0x94, 0x00, 0x53, 0x04, 0x94, 0x00, 0x0e, 0x05, 0x92, 0x00, 0x69, 0x04, 0x94, 0x00, 0x94, 0x04, 0x94, 0x00, 0x12, 0x04, 0x94, 0x00, 0x5f, 0x04, 0xe3, 0x00, 0x09, 0x00, 0x00, 0xfc, 0x77, 0x00, 0x00, 0xfc, 0x9e, 0x00, 0x00, 0xfc, 0x9e, 0x00, 0x00, 0xfc, 0x9e, 0x00, 0x00, 0xfc, 0x78, 0x00, 0x00, 0xfb, 0xc8, 0x00, 0x00, 0xfc, 0x9e, 0x07, 0x55, 0x00, 0x3c, 0x07, 0x55, 0x00, 0x3c, 0x05, 0x07, 0x00, 0x67, 0x08, 0x16, 0x00, 0xaf, 0x04, 0x9f, 0xff, 0xdb, 0x07, 0x55, 0x00, 0x36, 0x07, 0xae, 0x00, 0x36, 0x04, 0x6c, 0x00, 0x93, 0x05, 0x07, 0x00, 0x63, 0x06, 0xda, 0x00, 0xaf, 0x07, 0x1d, 0x00, 0x41, 0x05, 0x6e, 0x00, 0x01, 0x06, 0x1e, 0x00, 0xb4, 0x04, 0x90, 0x00, 0x40, 0x04, 0x90, 0x00, 0x51, 0x03, 0x61, 0x00, 0x35, 0x05, 0x05, 0x00, 0x5f, 0x05, 0x2f, 0x00, 0x3d, 0x02, 0xf9, 0xff, 0xe7, 0x05, 0xe3, 0x00, 0x1c, 0x05, 0xc4, 0x00, 0xb2, 0x07, 0x7d, 0x00, 0x30, 0x07, 0x33, 0x00, 0xfe, 0x05, 0x05, 0x00, 0x63, 0x05, 0x0c, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xbe, 0x00, 0x3b, 0x05, 0xdc, 0x00, 0x4a, 0x05, 0xb3, 0x00, 0xb4, 0x06, 0x74, 0x00, 0x98, 0x04, 0xec, 0x00, 0xb4, 0x07, 0x57, 0x00, 0xe9, 0x07, 0xbc, 0xff, 0xfd, 0x07, 0x33, 0x01, 0x09, 0x04, 0xec, 0x00, 0x0e, 0x05, 0x5c, 0x00, 0x52, 0x04, 0x28, 0x00, 0x4f, 0x05, 0x80, 0x00, 0x46, 0x05, 0x80, 0x00, 0x46, 0x04, 0x6f, 0x00, 0x15, 0x02, 0x6f, 0x00, 0x3d, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x05, 0xa9, 0x00, 0x52, 0x05, 0x10, 0x00, 0x75, 0x06, 0x27, 0x00, 0x70, 0x04, 0x42, 0x00, 0x4e, 0x04, 0x5c, 0x00, 0x91, 0x05, 0xa9, 0x00, 0x4b, 0x04, 0x24, 0x00, 0xb4, 0x07, 0xb3, 0x00, 0x33, 0x03, 0x53, 0x00, 0x5d, 0x05, 0x5d, 0x00, 0x5c, 0x04, 0xda, 0xff, 0xfc, 0x03, 0x5a, 0x00, 0x18, 0x04, 0xa4, 0x00, 0x4d, 0x02, 0xbc, 0x00, 0x3f, 0x06, 0xaa, 0x00, 0x51, 0x08, 0x98, 0x00, 0x87, 0x05, 0x0e, 0x00, 0x20, 0x05, 0x3d, 0x00, 0x00, 0x04, 0xb6, 0x00, 0xb4, 0x06, 0x1c, 0x00, 0xb4, 0x05, 0xd6, 0x00, 0x16, 0x05, 0x94, 0x00, 0x92, 0x04, 0x02, 0x00, 0x07, 0x04, 0x02, 0x00, 0x06, 0x04, 0x65, 0xff, 0xfd, 0x05, 0xe5, 0x00, 0x4e, 0x05, 0x19, 0x00, 0x51, 0x04, 0x6e, 0x00, 0x51, 0x02, 0x87, 0x00, 0x47, 0x02, 0x87, 0xff, 0x2e, 0x05, 0x9d, 0x00, 0x35, 0x03, 0xca, 0x00, 0x48, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x7b, 0x09, 0xdd, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x54, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x54, 0x06, 0xfa, 0x00, 0x58, 0x06, 0xfa, 0x00, 0x38, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x5b, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x58, 0x06, 0xfa, 0x00, 0x5b, 0x06, 0xfa, 0x00, 0x61, 0x04, 0x16, 0x00, 0x7b, 0x02, 0x1f, 0x00, 0xb4, 0x03, 0x8b, 0x00, 0xb4, 0x04, 0xf6, 0x00, 0xb4, 0x06, 0xa5, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x06, 0xa4, 0x00, 0x0e, 0x08, 0x0f, 0x00, 0x0e, 0x09, 0x7b, 0x00, 0x0e, 0x06, 0x9b, 0x00, 0xb4, 0x04, 0xee, 0x00, 0x36, 0x06, 0xb7, 0x00, 0x36, 0x08, 0x25, 0x00, 0x36, 0x04, 0x02, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x05, 0x8b, 0x00, 0xb4, 0x06, 0x36, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xad, 0x03, 0x4b, 0x00, 0xad, 0x04, 0x96, 0x00, 0xad, 0x05, 0xd7, 0x00, 0xad, 0x04, 0x42, 0x00, 0x36, 0x05, 0xd6, 0x00, 0x36, 0x07, 0x22, 0x00, 0x36, 0x08, 0x6d, 0x00, 0x36, 0x05, 0xe5, 0x00, 0xad, 0x04, 0x42, 0x00, 0x35, 0x05, 0xeb, 0x00, 0x35, 0x07, 0x36, 0x00, 0x35, 0x02, 0x00, 0x00, 0xad, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x07, 0x03, 0x00, 0xa7, 0x08, 0xf7, 0x00, 0x6c, 0x05, 0x8b, 0x00, 0xb4, 0x08, 0xf7, 0x00, 0x6c, 0x05, 0x10, 0x00, 0x67, 0x03, 0xf4, 0x00, 0x72, 0x05, 0x07, 0x00, 0x67, 0x06, 0xfa, 0x00, 0x4e, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x27, 0x06, 0x08, 0x00, 0x13, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x6a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x6a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x0c, 0x06, 0x08, 0x01, 0x37, 0x06, 0x08, 0x01, 0x81, 0x06, 0x08, 0x01, 0x37, 0x06, 0x08, 0x01, 0x81, 0x06, 0x08, 0x01, 0xad, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x28, 0x06, 0x08, 0x00, 0x47, 0x06, 0x08, 0x00, 0xc7, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0xbd, 0x06, 0x08, 0x00, 0x8d, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x02, 0xb7, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x02, 0xb7, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x6b, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x6c, 0x06, 0x08, 0x00, 0x6a, 0x06, 0x08, 0x00, 0x6c, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0xa9, 0x06, 0x08, 0x00, 0xa9, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x60, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x00, 0x40, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x20, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x6d, 0x06, 0x08, 0x00, 0x6d, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x6b, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x31, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x94, 0x00, 0x79, 0x03, 0xb9, 0x00, 0x55, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x06, 0x45, 0x00, 0x8b, 0x04, 0xd1, 0xff, 0xfb, 0x04, 0xd1, 0xff, 0xfb, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x04, 0x94, 0x01, 0x0e, 0x05, 0x73, 0x00, 0x8c, 0x05, 0x73, 0x00, 0x8c, 0x04, 0xda, 0x00, 0x16, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x02, 0x6d, 0x00, 0x00, 0x04, 0x95, 0x01, 0x62, 0x06, 0x08, 0x00, 0xeb, 0x04, 0x81, 0x01, 0x23, 0x04, 0x81, 0x01, 0x35, 0x04, 0x96, 0x00, 0x36, 0x04, 0x96, 0x00, 0x36, 0x04, 0x96, 0x00, 0x36, 0x05, 0x24, 0x00, 0xc6, 0x05, 0xff, 0x00, 0xc6, 0x06, 0x08, 0x00, 0xfe, 0x06, 0x74, 0x00, 0x9d, 0x06, 0x74, 0x00, 0x9d, 0x06, 0x08, 0x00, 0xd5, 0x03, 0x99, 0x01, 0x84, 0x03, 0x99, 0x00, 0x5b, 0x03, 0x99, 0x00, 0xf4, 0x03, 0x99, 0x00, 0x5b, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x03, 0xc0, 0x00, 0x69, 0x05, 0xae, 0x00, 0x69, 0x07, 0x9c, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x05, 0xae, 0x00, 0x69, 0x07, 0x9c, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x04, 0x94, 0x00, 0x6c, 0x04, 0x94, 0x00, 0x6c, 0x01, 0xdf, 0x00, 0x90, 0x04, 0x94, 0x00, 0x6c, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc2, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0x91, 0x06, 0x08, 0x00, 0xc3, 0x02, 0xb3, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc2, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x0a, 0x00, 0xc3, 0x06, 0x0a, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xba, 0x07, 0x33, 0x00, 0xb8, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc4, 0x07, 0x89, 0x00, 0x85, 0x07, 0x89, 0x00, 0x85, 0x03, 0x57, 0x00, 0x9e, 0x06, 0x08, 0x00, 0xc2, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xb7, 0x06, 0x08, 0x00, 0xb7, 0x06, 0x08, 0x00, 0xb7, 0x06, 0x08, 0x00, 0xb7, 0x06, 0x08, 0x00, 0xab, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xab, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xab, 0x06, 0x08, 0x00, 0xab, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x05, 0x9e, 0x00, 0xc3, 0x05, 0x9e, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x03, 0xbf, 0x00, 0x9d, 0x03, 0xbf, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x07, 0x33, 0x00, 0x6c, 0x07, 0x33, 0x00, 0x6c, 0x06, 0x08, 0x00, 0x58, 0x06, 0x08, 0x00, 0x6c, 0x03, 0xbf, 0x00, 0xd6, 0x05, 0x45, 0x00, 0xb4, 0x05, 0x45, 0x00, 0xb4, 0x05, 0x45, 0x00, 0xb4, 0x06, 0x08, 0x00, 0xfe, 0x06, 0x08, 0x00, 0xfe, 0x05, 0xe8, 0xff, 0xfb, 0x05, 0xe8, 0xff, 0xfb, 0x05, 0xe8, 0x00, 0x7e, 0x05, 0xe8, 0x00, 0x7e, 0x03, 0x8e, 0x00, 0x05, 0x02, 0x49, 0x00, 0xc5, 0x04, 0x81, 0x00, 0xe0, 0x06, 0x08, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x05, 0x46, 0x00, 0x59, 0x05, 0x46, 0x00, 0x59, 0x06, 0x08, 0x00, 0xab, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xbd, 0x06, 0x08, 0x00, 0xbd, 0x06, 0x08, 0x01, 0x56, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x0a, 0x3d, 0x00, 0x85, 0x0a, 0x3d, 0x00, 0x85, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xca, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xbf, 0x07, 0x33, 0x03, 0x3a, 0x07, 0x33, 0x00, 0xd4, 0x07, 0x33, 0x00, 0xd4, 0x07, 0x33, 0x00, 0xd4, 0x07, 0x33, 0x00, 0x4f, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x07, 0x33, 0x00, 0x4f, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0xc3, 0x04, 0x55, 0x00, 0x42, 0x04, 0x55, 0x00, 0x66, 0x04, 0x92, 0x00, 0x83, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x79, 0x03, 0x84, 0x01, 0x1b, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0xcf, 0x00, 0xb3, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0xcf, 0x00, 0xb3, 0x05, 0xd2, 0x02, 0xa8, 0x05, 0xd2, 0x00, 0x5a, 0x05, 0xd2, 0x02, 0xa8, 0x05, 0xd2, 0x00, 0x5a, 0x06, 0x08, 0x00, 0xc3, 0x03, 0xb1, 0x00, 0x05, 0x07, 0x33, 0x00, 0xde, 0x06, 0x08, 0x00, 0xc3, 0x03, 0x60, 0x00, 0x9e, 0x03, 0x60, 0x00, 0x78, 0x03, 0x60, 0x00, 0x9e, 0x03, 0x60, 0x00, 0x78, 0x03, 0xc0, 0x01, 0x83, 0x03, 0xc0, 0x00, 0x25, 0x08, 0x4c, 0x00, 0x8c, 0x08, 0x4c, 0x00, 0x8c, 0x0a, 0x2e, 0x00, 0x8c, 0x08, 0x4c, 0x00, 0x8c, 0x0a, 0x64, 0x00, 0x6c, 0x0a, 0x2e, 0x00, 0x00, 0x06, 0x49, 0x00, 0x87, 0x02, 0x6f, 0x00, 0x95, 0x04, 0x92, 0x00, 0xa7, 0x06, 0x07, 0x00, 0x79, 0x04, 0xbf, 0x00, 0x65, 0x05, 0x73, 0x00, 0x17, 0x08, 0x4c, 0x00, 0x8c, 0x06, 0x49, 0x00, 0x1f, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x02, 0x4b, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x02, 0x4b, 0x03, 0x99, 0x00, 0x9e, 0x05, 0x66, 0x02, 0x5f, 0x05, 0x66, 0x00, 0x97, 0x05, 0x66, 0x02, 0x5f, 0x05, 0x66, 0x02, 0x5f, 0x05, 0x66, 0x00, 0x97, 0x05, 0x66, 0x02, 0x5f, 0x05, 0x66, 0x00, 0x97, 0x03, 0xc0, 0x01, 0x83, 0x06, 0x08, 0x00, 0x31, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0x49, 0x00, 0x87, 0x05, 0x89, 0x00, 0x05, 0x04, 0x94, 0x00, 0x50, 0x04, 0x92, 0xff, 0x8f, 0x04, 0x92, 0x00, 0x83, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0xff, 0x9e, 0x04, 0x55, 0xff, 0x9e, 0x04, 0x55, 0xff, 0x9e, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x02, 0x3c, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x02, 0x3c, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0x9a, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0x02, 0xc4, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0x04, 0xe5, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0x02, 0xc4, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0x02, 0xc4, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x04, 0xe1, 0x00, 0xa7, 0x04, 0xe1, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x03, 0xf6, 0x00, 0xa7, 0x03, 0xf6, 0x00, 0xa7, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x06, 0x48, 0x00, 0x64, 0x03, 0x8e, 0x00, 0x05, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x66, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x03, 0xcb, 0x00, 0x64, 0x03, 0xcb, 0x00, 0xa7, 0x05, 0xb2, 0x00, 0xa7, 0x06, 0xfc, 0x00, 0xa7, 0x06, 0xfc, 0x00, 0xa7, 0x06, 0xfc, 0x00, 0xa7, 0x02, 0xc9, 0x00, 0x05, 0x02, 0xc9, 0x00, 0x05, 0x02, 0xc9, 0x00, 0x05, 0x02, 0xc9, 0x00, 0x05, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x04, 0x3f, 0x01, 0x14, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x08, 0x0e, 0x00, 0x64, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0xfa, 0x00, 0xa7, 0x05, 0xfa, 0x00, 0xa7, 0x05, 0x46, 0x00, 0xa7, 0x05, 0x46, 0x00, 0xa7, 0x05, 0x89, 0x00, 0x05, 0x06, 0x74, 0x00, 0x99, 0x07, 0x33, 0x00, 0x5d, 0x06, 0x74, 0x00, 0x5a, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x75, 0x06, 0x74, 0x00, 0x77, 0x06, 0x74, 0x00, 0x77, 0x04, 0x1f, 0x00, 0x99, 0x06, 0x73, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x65, 0x00, 0x70, 0x06, 0x65, 0x00, 0x70, 0x04, 0xd5, 0x00, 0x70, 0x07, 0x4a, 0x00, 0x70, 0x08, 0xf7, 0x00, 0x7e, 0x09, 0x00, 0x00, 0x82, 0x06, 0x74, 0x00, 0xa5, 0x06, 0x74, 0x00, 0xa4, 0x06, 0x74, 0x00, 0xa4, 0x03, 0xd5, 0x00, 0x8a, 0x06, 0x74, 0x00, 0x5a, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x8f, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0xa0, 0x04, 0x62, 0x00, 0x84, 0x06, 0x74, 0x00, 0x9f, 0x04, 0x62, 0x00, 0x84, 0x06, 0x74, 0x00, 0x70, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x5a, 0x04, 0xd1, 0x00, 0x5a, 0x05, 0x5f, 0x00, 0x99, 0x04, 0xad, 0x00, 0x99, 0x05, 0xa4, 0x00, 0x99, 0x03, 0xec, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0xa0, 0x06, 0x74, 0x00, 0x99, 0x05, 0x1d, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x79, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x02, 0x93, 0x06, 0x74, 0x00, 0x99, 0x04, 0x6b, 0x00, 0x9d, 0x05, 0x46, 0x00, 0x9d, 0x05, 0x46, 0x00, 0x9d, 0x06, 0x74, 0x00, 0x91, 0x06, 0x74, 0x01, 0x31, 0x06, 0x74, 0x01, 0x93, 0x06, 0x74, 0x00, 0xdf, 0x06, 0x74, 0x00, 0xea, 0x06, 0x74, 0x01, 0xba, 0x06, 0x74, 0x00, 0x53, 0x06, 0x74, 0x00, 0xa4, 0x06, 0x74, 0x00, 0xac, 0x06, 0x74, 0x00, 0xcf, 0x06, 0x74, 0x01, 0x01, 0x06, 0x74, 0x00, 0x62, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x3e, 0x06, 0x74, 0x00, 0x98, 0x06, 0x74, 0x00, 0xac, 0x06, 0x74, 0x00, 0x9e, 0x06, 0x74, 0x01, 0x20, 0x06, 0x74, 0x00, 0xb4, 0x06, 0x74, 0x00, 0xcb, 0x06, 0x74, 0x01, 0x32, 0x06, 0x74, 0x01, 0x8a, 0x06, 0x74, 0x01, 0x2f, 0x06, 0x74, 0x01, 0x11, 0x06, 0x74, 0x00, 0xb4, 0x06, 0x74, 0x00, 0xcb, 0x06, 0x74, 0x01, 0x32, 0x06, 0x74, 0x01, 0x8a, 0x06, 0x74, 0x01, 0x2a, 0x06, 0x74, 0x01, 0x11, 0x06, 0x74, 0x01, 0x22, 0x06, 0x74, 0x00, 0xa6, 0x06, 0x74, 0x01, 0x35, 0x06, 0x74, 0x00, 0xcd, 0x06, 0x74, 0x01, 0x21, 0x06, 0x74, 0x00, 0xa3, 0x06, 0x74, 0x01, 0x35, 0x06, 0x74, 0x00, 0xcd, 0x06, 0x74, 0x00, 0xc2, 0x03, 0x65, 0x00, 0x9a, 0x04, 0x98, 0x00, 0x9a, 0x06, 0x74, 0x01, 0x52, 0x06, 0x74, 0x00, 0xa9, 0x03, 0x65, 0x00, 0xa2, 0x02, 0x92, 0x00, 0x9a, 0x03, 0x7b, 0x00, 0x9b, 0x05, 0x62, 0x00, 0x9a, 0x05, 0x83, 0x00, 0x76, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x01, 0x12, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x01, 0x35, 0x06, 0x74, 0x01, 0x35, 0x06, 0x74, 0x00, 0x5f, 0x06, 0x74, 0x00, 0xb2, 0x06, 0x74, 0x00, 0xf2, 0x03, 0xe5, 0x00, 0x70, 0x06, 0x74, 0x00, 0x6c, 0x06, 0x74, 0x00, 0x70, 0x06, 0x74, 0x01, 0x0b, 0x06, 0x74, 0x00, 0xae, 0x06, 0x74, 0x00, 0xeb, 0x06, 0x74, 0x00, 0xea, 0x06, 0x74, 0x00, 0xea, 0x06, 0x74, 0x00, 0x5a, 0x05, 0x0e, 0x00, 0x99, 0x07, 0x3b, 0x00, 0x9d, 0x07, 0xd7, 0x00, 0x91, 0x08, 0x75, 0x00, 0x9d, 0x06, 0x80, 0x00, 0x9d, 0x06, 0x08, 0x00, 0xf2, 0x06, 0x08, 0x00, 0xba, 0x06, 0x08, 0x01, 0x59, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x01, 0x58, 0x06, 0x08, 0x01, 0x58, 0x06, 0x08, 0x01, 0xc7, 0x06, 0x08, 0x01, 0x40, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x09, 0x06, 0x13, 0x00, 0xbd, 0x06, 0x08, 0x01, 0x85, 0x05, 0x46, 0x00, 0x9d, 0x05, 0x46, 0x01, 0x36, 0x05, 0x46, 0x00, 0x9e, 0x05, 0x46, 0x00, 0x9e, 0x06, 0x1e, 0x00, 0x6c, 0x05, 0x46, 0x01, 0x66, 0x05, 0x46, 0x01, 0x23, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4d, 0x05, 0x46, 0x00, 0x9d, 0x06, 0x08, 0x00, 0x13, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x13, 0x06, 0x08, 0x00, 0x41, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x6c, 0x06, 0x08, 0x00, 0x76, 0x06, 0x08, 0x01, 0x87, 0x06, 0x08, 0x00, 0x26, 0x06, 0x08, 0x00, 0xa3, 0x06, 0x08, 0x00, 0x2f, 0x06, 0x08, 0x00, 0xa3, 0x06, 0x08, 0x00, 0x4f, 0x06, 0x08, 0x00, 0x7c, 0x06, 0x08, 0x01, 0x14, 0x06, 0x08, 0x00, 0xd5, 0x06, 0x08, 0x00, 0xe9, 0x06, 0x08, 0x00, 0x9d, 0x06, 0x08, 0x00, 0xd8, 0x06, 0x08, 0x00, 0xe2, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x01, 0x30, 0x06, 0x08, 0x00, 0xf1, 0x06, 0x08, 0x01, 0x1e, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4a, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4e, 0x06, 0x08, 0x00, 0x4e, 0x06, 0x08, 0x00, 0x2a, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x2b, 0x06, 0x08, 0x00, 0x2a, 0x06, 0x08, 0x00, 0x2b, 0x06, 0x08, 0x00, 0x2b, 0x06, 0x08, 0x00, 0x2b, 0x06, 0x08, 0x00, 0x2d, 0x06, 0x08, 0x00, 0x76, 0x06, 0x08, 0x00, 0x88, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x39, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x00, 0x63, 0x06, 0x08, 0x00, 0x63, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x00, 0xa3, 0x06, 0x08, 0x00, 0x8c, 0x06, 0x08, 0x00, 0x75, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x00, 0x57, 0x06, 0x08, 0x00, 0x57, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x74, 0x00, 0x5b, 0x06, 0x74, 0x00, 0x6d, 0x06, 0x74, 0x00, 0x6d, 0x06, 0x74, 0x00, 0x6d, 0x06, 0x74, 0x00, 0x6d, 0x06, 0x74, 0x00, 0x99, 0x06, 0x08, 0x02, 0xb7, 0x06, 0x08, 0x02, 0x6b, 0x06, 0x08, 0x01, 0xd2, 0x02, 0x52, 0x00, 0x9c, 0x02, 0x52, 0x00, 0x6c, 0x03, 0xdf, 0x00, 0x9c, 0x03, 0xdf, 0x00, 0x6c, 0x06, 0x08, 0x01, 0x1e, 0x06, 0x08, 0x01, 0x74, 0x06, 0x08, 0x01, 0x2c, 0x06, 0x08, 0x00, 0x63, 0x06, 0x08, 0x01, 0x35, 0x06, 0x08, 0x00, 0x71, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x01, 0x68, 0x06, 0x08, 0x01, 0x68, 0x06, 0x08, 0x01, 0xe6, 0x06, 0x08, 0x01, 0xe6, 0x06, 0x08, 0x01, 0x8c, 0x06, 0x08, 0x01, 0xab, 0x06, 0x08, 0x01, 0x05, 0x06, 0x08, 0x01, 0x19, 0x06, 0x08, 0x01, 0x32, 0x06, 0x08, 0x01, 0x51, 0x06, 0x08, 0x02, 0x7d, 0x06, 0x08, 0x02, 0x2e, 0x06, 0x08, 0x01, 0x42, 0x06, 0x08, 0x01, 0x77, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0xe2, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0xe2, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0xcd, 0x06, 0x08, 0x00, 0xcd, 0x06, 0x08, 0x00, 0xcd, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0xba, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x26, 0x06, 0x08, 0x00, 0x26, 0x06, 0x08, 0x00, 0xf9, 0x06, 0x08, 0x00, 0xf9, 0x06, 0x08, 0x00, 0x72, 0x06, 0x08, 0x00, 0x72, 0x06, 0x08, 0x01, 0x1c, 0x06, 0x08, 0x00, 0x75, 0x06, 0x08, 0x00, 0x94, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x67, 0x06, 0x08, 0x00, 0x87, 0x06, 0x08, 0x00, 0x91, 0x06, 0x08, 0x00, 0x91, 0x06, 0x08, 0x00, 0x69, 0x02, 0xcf, 0x00, 0x63, 0x02, 0xcf, 0x00, 0x47, 0x03, 0x8e, 0x00, 0x05, 0x03, 0x90, 0x00, 0x9e, 0x03, 0x90, 0x00, 0x9d, 0x02, 0xcf, 0x00, 0xa4, 0x02, 0xcf, 0x00, 0x93, 0x04, 0x01, 0x00, 0xa4, 0x04, 0x01, 0x00, 0x93, 0x06, 0x08, 0x00, 0x51, 0x06, 0x08, 0x00, 0x50, 0x06, 0x08, 0x00, 0x47, 0x06, 0x08, 0x00, 0x47, 0x08, 0x55, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x69, 0x05, 0x46, 0x00, 0x00, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0xe6, 0x06, 0x08, 0x00, 0xe6, 0x04, 0xeb, 0x00, 0x47, 0x04, 0xeb, 0x00, 0x47, 0x05, 0x48, 0x00, 0xe6, 0x05, 0x48, 0x00, 0xe6, 0x06, 0x08, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x03, 0x8e, 0x00, 0x05, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x07, 0x33, 0x00, 0x34, 0x07, 0x33, 0x00, 0x34, 0x07, 0x33, 0x00, 0x34, 0x09, 0x8a, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0xff, 0xc5, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x60, 0x06, 0x08, 0x00, 0xfc, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xa2, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0xa2, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x00, 0xa2, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0xa2, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x04, 0x00, 0x69, 0x06, 0x04, 0x00, 0x69, 0x06, 0x04, 0x00, 0x40, 0x06, 0x04, 0x00, 0x40, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0x42, 0x00, 0x20, 0x06, 0x42, 0x00, 0x20, 0x06, 0x49, 0x00, 0x87, 0x06, 0x49, 0x00, 0x87, 0x06, 0x49, 0x00, 0x1e, 0x08, 0x0e, 0x00, 0x64, 0x06, 0x42, 0x00, 0x45, 0x06, 0x42, 0x00, 0x45, 0x04, 0x02, 0x00, 0x09, 0x02, 0x00, 0x00, 0x09, 0x04, 0x02, 0xff, 0xdc, 0x04, 0x57, 0x00, 0x09, 0x05, 0x00, 0x00, 0xb4, 0x04, 0x69, 0x00, 0x40, 0x02, 0xd2, 0xff, 0xeb, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x05, 0xa0, 0x00, 0x67, 0x06, 0x36, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x05, 0xa0, 0x00, 0x67, 0x05, 0x49, 0x00, 0x36, 0x08, 0x1f, 0x00, 0x3d, 0x06, 0xec, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x5d, 0x04, 0xb6, 0x00, 0xb4, 0x04, 0x16, 0x00, 0xad, 0x04, 0xbf, 0x00, 0x64, 0x02, 0xfb, 0x00, 0x00, 0x04, 0x67, 0x00, 0x65, 0x03, 0x88, 0x00, 0x58, 0x01, 0x42, 0xff, 0xec, 0x03, 0x19, 0x00, 0x09, 0x04, 0x92, 0x00, 0x79, 0x04, 0xee, 0x00, 0x52, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x02, 0xa8, 0x00, 0x5b, 0x02, 0xa8, 0x00, 0x5b, 0x01, 0xd1, 0x00, 0xaf, 0x01, 0xd1, 0x00, 0xaf, 0x01, 0xd1, 0x00, 0xaf, 0x02, 0xc6, 0x00, 0x7b, 0x02, 0x90, 0x00, 0x7b, 0x03, 0x65, 0x00, 0x67, 0x03, 0x65, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x06, 0x52, 0xff, 0xfb, 0x05, 0x1b, 0x00, 0x31, 0x04, 0x6c, 0x00, 0x93, 0x03, 0xe4, 0x00, 0x77, 0x03, 0x88, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x08, 0xff, 0x00, 0x0e, 0x07, 0x17, 0x00, 0x6e, 0x08, 0xa9, 0x00, 0x0e, 0x07, 0x20, 0x00, 0x6e, 0x08, 0x39, 0x00, 0x0e, 0x07, 0x10, 0x00, 0x6e, 0x06, 0xfe, 0x00, 0x0e, 0x05, 0xe3, 0x00, 0x6e, 0x06, 0xfe, 0x00, 0x0e, 0x05, 0xe3, 0x00, 0x6e, 0x06, 0xe7, 0x00, 0x0e, 0x05, 0xe3, 0x00, 0x6e, 0x05, 0x10, 0x00, 0x67, 0x03, 0xf4, 0x00, 0x72, 0x04, 0xb8, 0x00, 0x09, 0x04, 0x32, 0x00, 0x0c, 0x04, 0xe5, 0x00, 0xb4, 0x02, 0xd2, 0x00, 0xad, 0x04, 0x2f, 0x00, 0x4a, 0x03, 0x12, 0x00, 0x6c, 0x05, 0xce, 0x00, 0x09, 0x05, 0x11, 0x00, 0x09, 0x09, 0xc6, 0x00, 0x67, 0x07, 0x55, 0x00, 0x65, 0x04, 0x57, 0x00, 0x09, 0x04, 0x92, 0xff, 0xfc, 0x05, 0x48, 0x00, 0x2d, 0x05, 0x93, 0x00, 0x2d, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x04, 0x5b, 0x00, 0x09, 0x04, 0x92, 0xff, 0xfc, 0x04, 0x5b, 0x00, 0x09, 0x04, 0x92, 0xff, 0xfc, 0x04, 0x02, 0x00, 0x09, 0x02, 0x00, 0x00, 0xad, 0x05, 0x4b, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x6d, 0x00, 0xd8, 0x02, 0xb5, 0x00, 0x90, 0x02, 0xe2, 0x01, 0x16, 0x01, 0xfa, 0x00, 0xb1, 0x04, 0xef, 0x00, 0x9d, 0x03, 0x82, 0x00, 0x45, 0x05, 0x8f, 0x00, 0xb4, 0x04, 0xcc, 0x00, 0xa7, 0x05, 0x94, 0x00, 0x03, 0x04, 0x92, 0x00, 0x03, 0x04, 0xb8, 0x00, 0x03, 0x04, 0x2b, 0x00, 0x03, 0x05, 0x62, 0x00, 0x03, 0x04, 0x90, 0x00, 0x03, 0x05, 0x00, 0x00, 0x03, 0x02, 0xf5, 0x00, 0x03, 0x04, 0x92, 0x00, 0x03, 0x03, 0xc0, 0x00, 0x03, 0x05, 0xc4, 0xff, 0xa2, 0x06, 0x96, 0x00, 0xa7, 0x04, 0x24, 0x00, 0x6b, 0x04, 0x57, 0x00, 0x3f, 0x06, 0x36, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0xb4, 0x08, 0xa2, 0x00, 0x3d, 0x01, 0x89, 0x00, 0xae, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xe6, 0x00, 0x56, 0x01, 0xec, 0x00, 0x51, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0x89, 0x00, 0xae, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xe6, 0x00, 0x56, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0x89, 0x00, 0xae, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xe6, 0x00, 0x56, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0x89, 0x00, 0xae, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0xec, 0x00, 0x51, 0x01, 0xe6, 0x00, 0x56, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0x89, 0x00, 0xae, 0x01, 0xfa, 0x00, 0xc0, 0x07, 0x08, 0x00, 0x87, 0x07, 0x08, 0x00, 0x87, 0x07, 0x08, 0x00, 0x87, 0x07, 0x08, 0x00, 0x87, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x7d, 0x00, 0x63, 0x06, 0x66, 0x00, 0x63, 0x04, 0x36, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x04, 0xb3, 0x00, 0x63, 0x06, 0x59, 0x00, 0x63, 0x03, 0xff, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x08, 0x69, 0x00, 0x63, 0x04, 0x3d, 0x00, 0x63, 0x04, 0x3f, 0x00, 0x75, 0x06, 0x42, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x3e, 0x00, 0x63, 0x06, 0x93, 0x00, 0x63, 0x04, 0x3f, 0x00, 0x75, 0x05, 0x43, 0x00, 0x63, 0x04, 0x32, 0x00, 0x2d, 0x06, 0x47, 0x00, 0x63, 0x04, 0x3e, 0x00, 0x63, 0x06, 0x71, 0x00, 0x63, 0x04, 0x3d, 0x00, 0x63, 0x04, 0x3d, 0x00, 0x63, 0x04, 0x40, 0x00, 0x75, 0x04, 0xac, 0x00, 0x64, 0x04, 0x3d, 0x00, 0x63, 0x04, 0x3e, 0x00, 0x75, 0x04, 0x4f, 0x00, 0x63, 0x04, 0x3f, 0x00, 0x75, 0x03, 0xb7, 0x00, 0x2d, 0x04, 0x2c, 0x00, 0x63, 0x04, 0x34, 0x00, 0x6c, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x2e, 0x00, 0x63, 0x04, 0x98, 0x00, 0x63, 0x06, 0xe0, 0x00, 0x63, 0x06, 0xb4, 0x00, 0x6d, 0x05, 0xd1, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xba, 0x00, 0x5a, 0x03, 0xba, 0x00, 0x5a, 0x03, 0xba, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x04, 0x67, 0x00, 0x65, 0x04, 0xf5, 0x00, 0x2a, 0x04, 0x89, 0x00, 0x2a, 0x04, 0x89, 0x00, 0x2a, 0x06, 0xf6, 0x00, 0x2a, 0x06, 0xf6, 0x00, 0x2a, 0x04, 0xf0, 0x00, 0x2a, 0x06, 0x32, 0x00, 0x63, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x62, 0x00, 0x1b, 0x05, 0x73, 0x00, 0x5a, 0x04, 0x5f, 0x00, 0xb4, 0x04, 0x0c, 0x00, 0x5a, 0x04, 0x53, 0x00, 0xb4, 0x03, 0xf3, 0x00, 0xb4, 0x03, 0xf3, 0x00, 0xb4, 0x03, 0x2a, 0x00, 0x87, 0x04, 0x80, 0x00, 0xb4, 0x06, 0x81, 0x00, 0x87, 0x02, 0x0a, 0x00, 0xb4, 0x04, 0x96, 0x00, 0xb4, 0x03, 0xef, 0x00, 0xb4, 0x0a, 0x45, 0x00, 0xb4, 0x06, 0x58, 0x00, 0xb4, 0x06, 0xa6, 0x00, 0xb4, 0x06, 0x81, 0x00, 0x87, 0x04, 0xf0, 0x00, 0xb4, 0x06, 0x40, 0x00, 0xb4, 0x04, 0x38, 0x00, 0x87, 0x04, 0x5d, 0x00, 0xb4, 0x03, 0x2d, 0x00, 0x87, 0x05, 0x03, 0x00, 0x5a, 0x04, 0x95, 0x00, 0xb4, 0x04, 0xf0, 0x00, 0x87, 0x04, 0xec, 0x00, 0x87, 0x05, 0xd4, 0x00, 0x5a, 0x03, 0xcc, 0x00, 0x87, 0x04, 0x03, 0x00, 0xb4, 0x04, 0x03, 0x00, 0xb4, 0x03, 0x2a, 0x00, 0x5a, 0x05, 0x73, 0x00, 0x5a, 0x02, 0x0a, 0x00, 0xb4, 0x05, 0x73, 0x00, 0x5a, 0x04, 0xf0, 0x00, 0x87, 0x05, 0xe3, 0x00, 0x5a, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x05, 0x55, 0x00, 0x0e, 0x05, 0x43, 0x00, 0xb4, 0x05, 0xe5, 0x00, 0xd0, 0x05, 0x40, 0x00, 0xb4, 0x04, 0xd9, 0x00, 0xb4, 0x05, 0x94, 0x00, 0x67, 0x02, 0xd3, 0x00, 0x5b, 0x02, 0xd1, 0xff, 0xa1, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0xb6, 0x00, 0xb4, 0x07, 0x61, 0x00, 0xb0, 0x05, 0xaa, 0x00, 0x66, 0x04, 0x92, 0x00, 0x7a, 0x05, 0x19, 0xff, 0xfb, 0x05, 0xfa, 0x00, 0x9f, 0x05, 0x34, 0x00, 0x0e, 0x07, 0xfa, 0x00, 0x3d, 0x05, 0xcd, 0x00, 0x61, 0x05, 0x17, 0xff, 0xfd, 0x04, 0xc3, 0x00, 0x6e, 0x05, 0x19, 0x00, 0x85, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x19, 0x00, 0x85, 0x04, 0x6e, 0x00, 0x63, 0x03, 0x59, 0x00, 0x2a, 0x05, 0x19, 0x00, 0x65, 0x05, 0x4e, 0x00, 0xa7, 0x02, 0x87, 0x00, 0xcf, 0x02, 0x87, 0xff, 0xdc, 0x04, 0xaf, 0x00, 0xa7, 0x02, 0x87, 0x00, 0xcf, 0x08, 0x38, 0x00, 0xa7, 0x05, 0x4e, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x05, 0x19, 0x00, 0x65, 0x05, 0x19, 0x00, 0x65, 0x03, 0x7b, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x03, 0x59, 0x00, 0x31, 0x05, 0x52, 0x00, 0x9f, 0x04, 0x5f, 0x00, 0x36, 0x06, 0x8d, 0x00, 0x4d, 0x04, 0xdd, 0x00, 0x44, 0x04, 0x7f, 0x00, 0x36, 0x04, 0x3f, 0x00, 0x4f, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xf0, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x24, 0x00, 0xb4, 0x05, 0x94, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x03, 0x31, 0x00, 0x87, 0x02, 0x1f, 0xff, 0xa1, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x02, 0x00, 0xb4, 0x06, 0x36, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x57, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x00, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x79, 0x04, 0x65, 0xff, 0xfb, 0x05, 0x45, 0x00, 0xa0, 0x04, 0xec, 0x00, 0x0e, 0x07, 0x1e, 0x00, 0x3d, 0x04, 0xee, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0xee, 0x00, 0x52, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x88, 0x00, 0x2a, 0x04, 0x92, 0x00, 0x65, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xad, 0x02, 0x00, 0xff, 0xdf, 0x04, 0x2b, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xad, 0x07, 0x03, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x92, 0x00, 0x65, 0x02, 0xf5, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x42, 0x00, 0x36, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x35, 0x04, 0x42, 0x00, 0x36, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x94, 0x00, 0x7a, 0x04, 0x94, 0x00, 0x60, 0x04, 0x94, 0x00, 0x75, 0x04, 0x94, 0x00, 0x8c, 0x04, 0x94, 0x00, 0x51, 0x04, 0x94, 0x00, 0x85, 0x04, 0x94, 0x00, 0x65, 0x04, 0x94, 0x00, 0x3a, 0x04, 0x94, 0x00, 0x7d, 0x04, 0x92, 0x00, 0x5f, 0x04, 0x94, 0x00, 0x79, 0x04, 0x94, 0x00, 0xca, 0x04, 0x94, 0x00, 0x87, 0x04, 0x94, 0x00, 0x8c, 0x04, 0x94, 0x00, 0x5a, 0x04, 0x94, 0x00, 0x8e, 0x04, 0x94, 0x00, 0x80, 0x04, 0x94, 0x00, 0x97, 0x04, 0x94, 0x00, 0x7d, 0x04, 0x94, 0x00, 0x74, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x6c, 0x00, 0xc3, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x82, 0x00, 0x89, 0x08, 0x85, 0x00, 0x43, 0x07, 0x81, 0x00, 0x36, 0x08, 0x53, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x08, 0x69, 0x00, 0x55, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x80, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x08, 0x69, 0x00, 0x55, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x1f, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x0b, 0x8c, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x34, 0x08, 0x69, 0x00, 0x56, 0x07, 0x81, 0x00, 0x34, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0xfd, 0x28, 0x00, 0x00, 0xfd, 0xb5, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfd, 0x58, 0x00, 0x00, 0xfd, 0x21, 0x00, 0x00, 0xfd, 0x21, 0x00, 0x00, 0xfd, 0x1a, 0x00, 0x00, 0xfd, 0x1a, 0x00, 0x00, 0xfd, 0xd8, 0x00, 0x00, 0xfd, 0x36, 0x00, 0x00, 0xfc, 0xad, 0x00, 0x87, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x07, 0x11, 0x00, 0x75, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x07, 0x74, 0x00, 0x75, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x06, 0x01, 0x00, 0x60, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x01, 0x8a, 0x00, 0x00, 0x07, 0x11, 0x00, 0x75, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x07, 0x11, 0x00, 0x75, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x04, 0xa5, 0x00, 0x8d, 0x04, 0x73, 0xff, 0xee, 0x04, 0xa5, 0xff, 0xee, 0x04, 0xa5, 0x00, 0x8d, 0x04, 0x73, 0xff, 0xee, 0x04, 0xa5, 0xff, 0xee, 0x04, 0xa5, 0x00, 0x8d, 0x04, 0x73, 0xff, 0xee, 0x04, 0xa5, 0xff, 0xee, 0x04, 0xa5, 0x00, 0x8d, 0x04, 0x73, 0xff, 0xee, 0x04, 0xa5, 0xff, 0xee, 0x03, 0x08, 0x00, 0x00, 0x05, 0x62, 0x00, 0xbf, 0x02, 0x00, 0x00, 0x0d, 0x02, 0xa3, 0xff, 0x0d, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x6a, 0x04, 0xec, 0x01, 0x6a, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x63, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x63, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x63, 0x04, 0xec, 0x01, 0x63, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x5c, 0x04, 0xec, 0x01, 0x5c, 0x04, 0xec, 0x01, 0x5c, 0x04, 0xec, 0x01, 0x63, 0x00, 0x00, 0xfc, 0xf1, 0x01, 0x0e, 0x00, 0x00, 0x03, 0xaf, 0x00, 0x00, 0x04, 0x65, 0xff, 0xb4, 0x04, 0x65, 0xff, 0xb4, 0x05, 0x73, 0x00, 0x81, 0x02, 0x31, 0xff, 0xee, 0x02, 0x62, 0xff, 0xee, 0x06, 0x00, 0x00, 0x75, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x03, 0xf9, 0xff, 0xb4, 0x02, 0x00, 0x00, 0xad, 0x03, 0xdc, 0x00, 0x82, 0x05, 0x07, 0x00, 0x65, 0x04, 0x65, 0x00, 0x65, 0x02, 0x00, 0x00, 0x87, 0x02, 0x87, 0x00, 0x47, 0x02, 0x87, 0xff, 0x2e, 0x02, 0x00, 0xff, 0xd8, 0x02, 0x00, 0x00, 0xab, 0x02, 0x6d, 0x00, 0xd8, 0x03, 0x31, 0x00, 0x87, 0x06, 0x08, 0x01, 0x82, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc6, 0x02, 0x01, 0x00, 0xad, 0x02, 0x01, 0xff, 0xee, 0x02, 0x01, 0xff, 0xee, 0x04, 0x1d, 0x00, 0x65, 0x04, 0x1d, 0xff, 0xee, 0x04, 0x1d, 0xff, 0xee, 0x03, 0x0d, 0x00, 0x36, 0x03, 0x0d, 0xff, 0xee, 0x03, 0x0d, 0xff, 0xee, 0x04, 0x42, 0x00, 0x36, 0x04, 0x42, 0xff, 0xee, 0x04, 0x42, 0xff, 0xee, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x04, 0x46, 0x00, 0x65, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0xff, 0xee, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x05, 0xf7, 0x00, 0x65, 0x05, 0xf7, 0xff, 0xee, 0x05, 0xf7, 0xff, 0xee, 0x03, 0x27, 0x00, 0xad, 0x03, 0x27, 0xff, 0xee, 0x03, 0x27, 0xff, 0xee, 0x03, 0x27, 0x00, 0x36, 0x03, 0x27, 0xff, 0xee, 0x03, 0x27, 0xff, 0xee, 0x04, 0x05, 0x00, 0xa7, 0x04, 0x05, 0xff, 0xee, 0x04, 0x05, 0xff, 0xee, 0x04, 0x67, 0x00, 0xad, 0x04, 0x67, 0xff, 0xee, 0x04, 0x67, 0xff, 0xee, 0x02, 0x85, 0x00, 0x36, 0x02, 0x85, 0xff, 0xee, 0x02, 0x85, 0xff, 0xee, 0x06, 0xe7, 0x00, 0xad, 0x06, 0xe7, 0xff, 0xee, 0x06, 0xe7, 0xff, 0xee, 0x03, 0x67, 0x00, 0x36, 0x03, 0x67, 0xff, 0xee, 0x03, 0x67, 0xff, 0xee, 0x05, 0xa3, 0x00, 0x36, 0x05, 0xa3, 0xff, 0xee, 0x05, 0xa3, 0xff, 0xee, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x04, 0x80, 0x00, 0x36, 0x04, 0x80, 0xff, 0xee, 0x04, 0x80, 0xff, 0xee, 0x05, 0x48, 0x00, 0xad, 0x05, 0x48, 0xff, 0xee, 0x05, 0x48, 0xff, 0xee, 0x03, 0xd0, 0x00, 0xad, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xd0, 0xff, 0xee, 0x05, 0x36, 0x00, 0x64, 0x05, 0x36, 0xff, 0xee, 0x05, 0x36, 0xff, 0xee, 0x03, 0x67, 0x00, 0x36, 0x03, 0x67, 0xff, 0xee, 0x03, 0x67, 0xff, 0xee, 0x04, 0x80, 0x00, 0x36, 0x04, 0x80, 0xff, 0xee, 0x04, 0x80, 0xff, 0xee, 0x04, 0x46, 0x00, 0x65, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0xff, 0xee, 0x03, 0xd0, 0x00, 0xad, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xd0, 0x00, 0xad, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xc3, 0x00, 0xad, 0x03, 0xc3, 0xff, 0xee, 0x03, 0xc3, 0xff, 0xee, 0x04, 0x46, 0x00, 0x65, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0x00, 0x65, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0xff, 0xee, 0x00, 0x00, 0xfd, 0x3b, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x07, 0x01, 0x6e, 0x05, 0x8f, 0x00, 0xb4, 0x04, 0xdf, 0x00, 0xad, 0x04, 0x90, 0x00, 0x9c, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xf9, 0xff, 0xb4, 0x03, 0xf9, 0xff, 0xb4, 0x03, 0xf9, 0xff, 0xb4, 0x03, 0xf9, 0xff, 0xb4, 0x03, 0xf9, 0xff, 0xb4, 0x09, 0x2d, 0x00, 0x75, 0x06, 0x08, 0xff, 0xee, 0x06, 0x6c, 0xff, 0xee, 0x09, 0x2d, 0x00, 0x75, 0x06, 0x08, 0xff, 0xee, 0x06, 0x6c, 0xff, 0xee, 0x09, 0x2d, 0x00, 0x75, 0x06, 0x08, 0xff, 0xee, 0x06, 0x6c, 0xff, 0xee, 0x08, 0xd2, 0x00, 0x75, 0x06, 0x1d, 0xff, 0xee, 0x06, 0x3e, 0xff, 0xee, 0x08, 0xd2, 0x00, 0x75, 0x06, 0x1d, 0xff, 0xee, 0x06, 0x3e, 0xff, 0xee, 0x06, 0xd5, 0x00, 0x81, 0x05, 0xbb, 0xff, 0xee, 0x05, 0xe8, 0xff, 0xee, 0x03, 0xd5, 0x00, 0x69, 0x04, 0x4b, 0xff, 0xee, 0x03, 0x79, 0xff, 0xee, 0x07, 0x74, 0x00, 0x75, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x07, 0x74, 0x00, 0x75, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x07, 0x74, 0x00, 0x75, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x06, 0x01, 0x00, 0x60, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x06, 0x01, 0x00, 0x60, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x07, 0x96, 0x00, 0x75, 0x06, 0x40, 0xff, 0xee, 0x06, 0x40, 0xff, 0xee, 0x06, 0x71, 0x00, 0x75, 0x03, 0x6d, 0xff, 0xee, 0x03, 0xf9, 0xff, 0xee, 0x06, 0x11, 0x00, 0x81, 0x03, 0x6d, 0xff, 0xee, 0x03, 0xf9, 0xff, 0xee, 0x06, 0x11, 0x00, 0x81, 0x03, 0x6d, 0xff, 0xee, 0x03, 0xf9, 0xff, 0xee, 0x06, 0x71, 0x03, 0x69, 0x03, 0x6d, 0x00, 0x64, 0x03, 0xf9, 0x00, 0x64, 0x06, 0x71, 0x02, 0x1c, 0x03, 0x6d, 0x00, 0x64, 0x03, 0xf9, 0x00, 0x64, 0x06, 0x71, 0x03, 0x2a, 0x03, 0x6d, 0x00, 0x43, 0x03, 0xf9, 0x00, 0x43, 0x05, 0x73, 0x00, 0x81, 0x02, 0x31, 0xff, 0xee, 0x02, 0x62, 0xff, 0xee, 0x05, 0x73, 0x00, 0x81, 0x02, 0x31, 0xff, 0xee, 0x02, 0x62, 0xff, 0xee, 0x05, 0x73, 0x00, 0x81, 0x02, 0x31, 0xff, 0xee, 0x02, 0x62, 0xff, 0xee, 0x05, 0x7b, 0x00, 0x84, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x05, 0x7b, 0x00, 0x84, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x05, 0x7b, 0x00, 0x84, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x01, 0x0a, 0xa7, 0x30, 0x00, 0x00, 0x0b, 0x0f, 0xea, 0x00, 0x10, 0x00, 0x24, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x25, 0xff, 0xb7, 0x00, 0x10, 0x00, 0x2a, 0x00, 0x4b, 0x00, 0x10, 0x00, 0x2d, 0x00, 0x72, 0x00, 0x10, 0x00, 0x32, 0x00, 0x39, 0x00, 0x10, 0x00, 0x34, 0x00, 0x4b, 0x00, 0x10, 0x00, 0x37, 0xff, 0x44, 0x00, 0x10, 0x00, 0x39, 0xff, 0x88, 0x00, 0x10, 0x00, 0x3a, 0xff, 0xad, 0x00, 0x10, 0x00, 0x3b, 0xff, 0x9a, 0x00, 0x10, 0x00, 0x3c, 0xff, 0x0d, 0x00, 0x10, 0x00, 0x52, 0x00, 0x26, 0x00, 0x10, 0x00, 0x59, 0xff, 0xc9, 0x00, 0x10, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x10, 0x00, 0x82, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x83, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x84, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x85, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x86, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x94, 0x00, 0x39, 0x00, 0x10, 0x00, 0x95, 0x00, 0x39, 0x00, 0x10, 0x00, 0x96, 0x00, 0x39, 0x00, 0x10, 0x00, 0x97, 0x00, 0x39, 0x00, 0x10, 0x00, 0x98, 0x00, 0x39, 0x00, 0x10, 0x00, 0x9f, 0xff, 0x0d, 0x00, 0x10, 0x00, 0xb4, 0x00, 0x26, 0x00, 0x10, 0x00, 0xb5, 0x00, 0x26, 0x00, 0x10, 0x00, 0xb6, 0x00, 0x26, 0x00, 0x10, 0x00, 0xb7, 0x00, 0x26, 0x00, 0x10, 0x00, 0xb8, 0x00, 0x26, 0x00, 0x10, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x10, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x10, 0x00, 0xc2, 0xff, 0xd3, 0x00, 0x10, 0x00, 0xc4, 0xff, 0xd3, 0x00, 0x10, 0x00, 0xc6, 0xff, 0xd3, 0x00, 0x10, 0x00, 0xe0, 0x00, 0x4b, 0x00, 0x10, 0x01, 0x26, 0xff, 0x44, 0x00, 0x10, 0x01, 0x3a, 0xff, 0x0d, 0x00, 0x24, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x24, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x24, 0x00, 0x39, 0x00, 0x24, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x37, 0xff, 0x61, 0x00, 0x24, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x24, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x24, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x24, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x24, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x59, 0xff, 0x88, 0x00, 0x24, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x24, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x24, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x24, 0x00, 0x82, 0x00, 0x39, 0x00, 0x24, 0x00, 0x83, 0x00, 0x39, 0x00, 0x24, 0x00, 0x84, 0x00, 0x39, 0x00, 0x24, 0x00, 0x85, 0x00, 0x39, 0x00, 0x24, 0x00, 0x86, 0x00, 0x39, 0x00, 0x24, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x24, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x24, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x24, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x24, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x24, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x24, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xcb, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd3, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x24, 0xff, 0x61, 0x00, 0x24, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x26, 0xff, 0x61, 0x00, 0x24, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x36, 0xff, 0x90, 0x00, 0x24, 0x01, 0x37, 0xff, 0xad, 0x00, 0x24, 0x01, 0x38, 0xff, 0x61, 0x00, 0x24, 0x01, 0x39, 0xff, 0x75, 0x00, 0x24, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x24, 0x01, 0x88, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xac, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xad, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xae, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xaf, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xdc, 0xff, 0x61, 0x00, 0x24, 0x01, 0xdd, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xf3, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xf4, 0xff, 0x61, 0x00, 0x24, 0x01, 0xf5, 0xff, 0x75, 0x00, 0x24, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x24, 0x05, 0xd1, 0xff, 0xad, 0x00, 0x24, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x24, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x24, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x24, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x24, 0x06, 0x42, 0xff, 0x61, 0x00, 0x24, 0x06, 0x43, 0xff, 0x75, 0x00, 0x24, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x24, 0x07, 0x52, 0xff, 0x03, 0x00, 0x24, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x25, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x36, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x39, 0xff, 0xc1, 0x00, 0x25, 0x00, 0x3a, 0xff, 0xb7, 0x00, 0x25, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x25, 0x00, 0x6d, 0xff, 0xc1, 0x00, 0x25, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x25, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xe4, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x1c, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x1e, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x20, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x22, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x36, 0xff, 0xb7, 0x00, 0x25, 0x01, 0x38, 0xff, 0x90, 0x00, 0x25, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x25, 0x01, 0xac, 0xff, 0xdc, 0x00, 0x25, 0x01, 0xae, 0xff, 0xdc, 0x00, 0x25, 0x01, 0xda, 0xff, 0xdc, 0x00, 0x25, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x25, 0x05, 0xd0, 0xff, 0xb7, 0x00, 0x25, 0x05, 0xd2, 0xff, 0xb7, 0x00, 0x25, 0x05, 0xd4, 0xff, 0xb7, 0x00, 0x25, 0x06, 0x42, 0xff, 0x90, 0x00, 0x25, 0x07, 0x51, 0xff, 0x90, 0x00, 0x25, 0x07, 0x52, 0xff, 0x90, 0x00, 0x25, 0x07, 0x53, 0xff, 0xad, 0x00, 0x26, 0x00, 0x3c, 0xff, 0xdc, 0x00, 0x26, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x26, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x26, 0x00, 0x9f, 0xff, 0xdc, 0x00, 0x26, 0x01, 0x38, 0xff, 0xdc, 0x00, 0x26, 0x01, 0x3a, 0xff, 0xdc, 0x00, 0x26, 0x01, 0xf4, 0xff, 0xdc, 0x00, 0x26, 0x06, 0x42, 0xff, 0xdc, 0x00, 0x26, 0x07, 0x52, 0x00, 0x26, 0x00, 0x27, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x27, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x27, 0x00, 0xc2, 0xff, 0xdc, 0x00, 0x27, 0x00, 0xc4, 0xff, 0xdc, 0x00, 0x27, 0x00, 0xc6, 0xff, 0xdc, 0x00, 0x27, 0x01, 0x38, 0xff, 0x90, 0x00, 0x27, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x27, 0x01, 0xf4, 0xff, 0x90, 0x00, 0x27, 0x06, 0x42, 0xff, 0x90, 0x00, 0x27, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x27, 0x07, 0x52, 0xff, 0xc9, 0x00, 0x27, 0x07, 0x53, 0xff, 0x44, 0x00, 0x29, 0x00, 0x11, 0xfe, 0xb7, 0x00, 0x29, 0x00, 0x1d, 0xff, 0x61, 0x00, 0x29, 0x00, 0x24, 0xff, 0x44, 0x00, 0x29, 0x00, 0x36, 0xff, 0xdc, 0x00, 0x29, 0x00, 0x37, 0xff, 0xdc, 0x00, 0x29, 0x00, 0x44, 0xff, 0x44, 0x00, 0x29, 0x00, 0x48, 0xff, 0x90, 0x00, 0x29, 0x00, 0x4c, 0xff, 0x6b, 0x00, 0x29, 0x00, 0x52, 0xff, 0xb7, 0x00, 0x29, 0x00, 0x55, 0xff, 0x6b, 0x00, 0x29, 0x00, 0x58, 0xff, 0x90, 0x00, 0x29, 0x00, 0x5c, 0xff, 0x44, 0x00, 0x29, 0x00, 0x82, 0xff, 0x44, 0x00, 0x29, 0x00, 0x83, 0xff, 0x44, 0x00, 0x29, 0x00, 0x84, 0xff, 0x44, 0x00, 0x29, 0x00, 0x85, 0xff, 0x44, 0x00, 0x29, 0x00, 0x86, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa2, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa3, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa4, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa5, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa6, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa7, 0xff, 0x44, 0x00, 0x29, 0x00, 0xaa, 0xff, 0x90, 0x00, 0x29, 0x00, 0xab, 0xff, 0x90, 0x00, 0x29, 0x00, 0xac, 0xff, 0x90, 0x00, 0x29, 0x00, 0xad, 0xff, 0x90, 0x00, 0x29, 0x00, 0xb4, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xb5, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xb6, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xb7, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xb8, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xbb, 0xff, 0x90, 0x00, 0x29, 0x00, 0xbc, 0xff, 0x90, 0x00, 0x29, 0x00, 0xbd, 0xff, 0x90, 0x00, 0x29, 0x00, 0xbe, 0xff, 0x90, 0x00, 0x29, 0x00, 0xbf, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc1, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc2, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc3, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc4, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc5, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc6, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc7, 0xff, 0x44, 0x00, 0x29, 0x00, 0xd5, 0xff, 0x90, 0x00, 0x29, 0x00, 0xd7, 0xff, 0x90, 0x00, 0x29, 0x00, 0xd9, 0xff, 0x90, 0x00, 0x29, 0x00, 0xdb, 0xff, 0x90, 0x00, 0x29, 0x00, 0xdd, 0xff, 0x90, 0x00, 0x29, 0x00, 0xf1, 0xff, 0x6b, 0x00, 0x29, 0x00, 0xf5, 0xff, 0x6b, 0x00, 0x29, 0x01, 0x0f, 0xff, 0xb7, 0x00, 0x29, 0x01, 0x11, 0xff, 0xb7, 0x00, 0x29, 0x01, 0x13, 0xff, 0xb7, 0x00, 0x29, 0x01, 0x17, 0xff, 0x6b, 0x00, 0x29, 0x01, 0x19, 0xff, 0x6b, 0x00, 0x29, 0x01, 0x1b, 0xff, 0x6b, 0x00, 0x29, 0x01, 0x1c, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x1e, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x20, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x22, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x24, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x26, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x28, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x2b, 0xff, 0x90, 0x00, 0x29, 0x01, 0x2d, 0xff, 0x90, 0x00, 0x29, 0x01, 0x2f, 0xff, 0x90, 0x00, 0x29, 0x01, 0x31, 0xff, 0x90, 0x00, 0x29, 0x01, 0x33, 0xff, 0x90, 0x00, 0x29, 0x01, 0x35, 0xff, 0x90, 0x00, 0x29, 0x01, 0x39, 0xff, 0x44, 0x00, 0x29, 0x01, 0xad, 0xff, 0xb7, 0x00, 0x29, 0x01, 0xaf, 0xff, 0xb7, 0x00, 0x29, 0x01, 0xda, 0xff, 0xdc, 0x00, 0x29, 0x01, 0xdc, 0xff, 0xdc, 0x00, 0x29, 0x01, 0xf1, 0xff, 0xb7, 0x00, 0x29, 0x01, 0xf5, 0xff, 0x44, 0x00, 0x29, 0x06, 0x43, 0xff, 0x44, 0x00, 0x29, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x29, 0x07, 0x53, 0xfe, 0x88, 0x00, 0x2a, 0x00, 0x37, 0xff, 0xb7, 0x00, 0x2a, 0x00, 0x3c, 0xff, 0x9a, 0x00, 0x2a, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x2a, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x2a, 0x00, 0x9f, 0xff, 0x9a, 0x00, 0x2a, 0x01, 0x26, 0xff, 0xb7, 0x00, 0x2a, 0x01, 0x3a, 0xff, 0x9a, 0x00, 0x2a, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x2a, 0x07, 0x52, 0xff, 0xd3, 0x00, 0x2a, 0x07, 0x53, 0xff, 0xc9, 0x00, 0x2b, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x2b, 0x07, 0x51, 0xff, 0xb7, 0x00, 0x2b, 0x07, 0x52, 0xff, 0xc1, 0x00, 0x2b, 0x07, 0x53, 0xff, 0xb7, 0x00, 0x2d, 0x00, 0x10, 0xff, 0xb7, 0x00, 0x2d, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x2d, 0x07, 0x51, 0xff, 0xb7, 0x00, 0x2d, 0x07, 0x52, 0xff, 0xc1, 0x00, 0x2d, 0x07, 0x53, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x10, 0xff, 0x29, 0x00, 0x2e, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x26, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x32, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x37, 0xff, 0x61, 0x00, 0x2e, 0x00, 0x38, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x3a, 0xff, 0xb7, 0x00, 0x2e, 0x00, 0x3c, 0xff, 0xb7, 0x00, 0x2e, 0x00, 0x44, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x48, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0x52, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0x58, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0x5c, 0xff, 0x6b, 0x00, 0x2e, 0x00, 0x6d, 0xff, 0x7d, 0x00, 0x2e, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x89, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x94, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x95, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x96, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x97, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x98, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x9b, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x9c, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x9d, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x9e, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x9f, 0xff, 0xb7, 0x00, 0x2e, 0x00, 0xa2, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa3, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa4, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa5, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa6, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa7, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xaa, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xab, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xac, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xad, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb4, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb5, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb6, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb7, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb8, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbb, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbc, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbd, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbe, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbf, 0xff, 0x6b, 0x00, 0x2e, 0x00, 0xc1, 0xff, 0x6b, 0x00, 0x2e, 0x00, 0xc8, 0xff, 0x90, 0x00, 0x2e, 0x00, 0xce, 0xff, 0x90, 0x00, 0x2e, 0x00, 0xdd, 0xff, 0x9a, 0x00, 0x2e, 0x01, 0x26, 0xff, 0x61, 0x00, 0x2e, 0x01, 0x30, 0xff, 0xc9, 0x00, 0x2e, 0x01, 0x31, 0xff, 0x9a, 0x00, 0x2e, 0x01, 0x3a, 0xff, 0xb7, 0x00, 0x2e, 0x07, 0x51, 0xff, 0xc1, 0x00, 0x2e, 0x07, 0x52, 0xff, 0xc1, 0x00, 0x2f, 0x00, 0x10, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x32, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x37, 0xfe, 0xe6, 0x00, 0x2f, 0x00, 0x38, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x39, 0xff, 0x1f, 0x00, 0x2f, 0x00, 0x3a, 0xff, 0x44, 0x00, 0x2f, 0x00, 0x3c, 0xfe, 0xf0, 0x00, 0x2f, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0x58, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0x5c, 0xff, 0x44, 0x00, 0x2f, 0x00, 0x82, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x83, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x84, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x85, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x86, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x94, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x95, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x96, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x97, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x98, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x9b, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x9c, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x9d, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x9e, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x9f, 0xfe, 0xf0, 0x00, 0x2f, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbc, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbd, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbe, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbf, 0xff, 0x44, 0x00, 0x2f, 0x00, 0xc1, 0xff, 0x44, 0x00, 0x2f, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x2f, 0x01, 0x26, 0xfe, 0xe6, 0x00, 0x2f, 0x01, 0x30, 0xff, 0x9a, 0x00, 0x2f, 0x01, 0x31, 0xff, 0xdc, 0x00, 0x2f, 0x01, 0x3a, 0xfe, 0xf0, 0x00, 0x2f, 0x07, 0x51, 0xfe, 0x61, 0x00, 0x2f, 0x07, 0x52, 0xfd, 0xe6, 0x00, 0x32, 0x00, 0x10, 0x00, 0x39, 0x00, 0x32, 0x00, 0x11, 0xff, 0xad, 0x00, 0x32, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x32, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x32, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x32, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x32, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x32, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x32, 0x07, 0x53, 0xff, 0x44, 0x00, 0x33, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x33, 0x00, 0x11, 0xfe, 0xc1, 0x00, 0x33, 0x00, 0x24, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x3c, 0xff, 0xd3, 0x00, 0x33, 0x00, 0x44, 0xff, 0xa4, 0x00, 0x33, 0x00, 0x48, 0xff, 0xb7, 0x00, 0x33, 0x00, 0x4c, 0xff, 0xd3, 0x00, 0x33, 0x00, 0x51, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x52, 0xff, 0xb7, 0x00, 0x33, 0x00, 0x55, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x56, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x58, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x82, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x83, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x84, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x85, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x86, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x9f, 0xff, 0xd3, 0x00, 0x33, 0x00, 0xa2, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa3, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa4, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa5, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa6, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa7, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xaa, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xab, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xac, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xad, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb3, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xb4, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb5, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb6, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb7, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb8, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xbc, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xbd, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xbe, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xdd, 0xff, 0xb7, 0x00, 0x33, 0x01, 0x0a, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x17, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x1b, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x21, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x23, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x31, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x3a, 0xff, 0xd3, 0x00, 0x33, 0x07, 0x51, 0x00, 0x26, 0x00, 0x33, 0x07, 0x52, 0x00, 0x26, 0x00, 0x33, 0x07, 0x53, 0xfe, 0xb7, 0x00, 0x34, 0x00, 0x10, 0x00, 0x39, 0x00, 0x34, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x34, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x34, 0x07, 0x53, 0xff, 0x7d, 0x00, 0x35, 0x00, 0x10, 0xff, 0xad, 0x00, 0x35, 0x00, 0x11, 0xff, 0xb7, 0x00, 0x35, 0x00, 0x1d, 0xff, 0xc1, 0x00, 0x35, 0x00, 0x24, 0xff, 0xad, 0x00, 0x35, 0x00, 0x26, 0xff, 0x9a, 0x00, 0x35, 0x00, 0x37, 0xff, 0x6b, 0x00, 0x35, 0x00, 0x39, 0xff, 0x90, 0x00, 0x35, 0x00, 0x3a, 0xff, 0xad, 0x00, 0x35, 0x00, 0x3c, 0xff, 0x7d, 0x00, 0x35, 0x00, 0x44, 0xff, 0xd3, 0x00, 0x35, 0x00, 0x48, 0xff, 0xa4, 0x00, 0x35, 0x00, 0x52, 0xff, 0xa4, 0x00, 0x35, 0x00, 0x58, 0xff, 0xa4, 0x00, 0x35, 0x00, 0x5c, 0xff, 0x90, 0x00, 0x35, 0x00, 0x6d, 0xff, 0x90, 0x00, 0x35, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x35, 0x00, 0x82, 0xff, 0xad, 0x00, 0x35, 0x00, 0x83, 0xff, 0xad, 0x00, 0x35, 0x00, 0x84, 0xff, 0xad, 0x00, 0x35, 0x00, 0x85, 0xff, 0xad, 0x00, 0x35, 0x00, 0x86, 0xff, 0xad, 0x00, 0x35, 0x00, 0x89, 0xff, 0x9a, 0x00, 0x35, 0x00, 0x9f, 0xff, 0x7d, 0x00, 0x35, 0x00, 0xa2, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa3, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa4, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa5, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa6, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa7, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xaa, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xab, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xac, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xad, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb4, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb5, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb6, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb7, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb8, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbb, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbc, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbd, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbe, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbf, 0xff, 0x90, 0x00, 0x35, 0x00, 0xc1, 0xff, 0x90, 0x00, 0x35, 0x00, 0xc8, 0xff, 0x9a, 0x00, 0x35, 0x00, 0xce, 0xff, 0x9a, 0x00, 0x35, 0x00, 0xdd, 0xff, 0xa4, 0x00, 0x35, 0x01, 0x26, 0xff, 0x6b, 0x00, 0x35, 0x01, 0x31, 0xff, 0xa4, 0x00, 0x35, 0x01, 0x3a, 0xff, 0x7d, 0x00, 0x35, 0x07, 0x51, 0xff, 0x6b, 0x00, 0x35, 0x07, 0x52, 0xff, 0x7d, 0x00, 0x35, 0x07, 0x53, 0xff, 0xdc, 0x00, 0x36, 0x00, 0x24, 0x00, 0x26, 0x00, 0x36, 0x00, 0x82, 0x00, 0x26, 0x00, 0x36, 0x00, 0x83, 0x00, 0x26, 0x00, 0x36, 0x00, 0x84, 0x00, 0x26, 0x00, 0x36, 0x00, 0x85, 0x00, 0x26, 0x00, 0x36, 0x00, 0x86, 0x00, 0x26, 0x00, 0x37, 0x00, 0x10, 0xff, 0x44, 0x00, 0x37, 0x00, 0x11, 0xff, 0x0d, 0x00, 0x37, 0x00, 0x1d, 0xff, 0x1f, 0x00, 0x37, 0x00, 0x24, 0xff, 0x61, 0x00, 0x37, 0x00, 0x26, 0xff, 0x88, 0x00, 0x37, 0x00, 0x37, 0xff, 0xdc, 0x00, 0x37, 0x00, 0x44, 0xfe, 0xad, 0x00, 0x37, 0x00, 0x46, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0x48, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0x4c, 0xff, 0xc1, 0x00, 0x37, 0x00, 0x52, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0x55, 0xfe, 0xd3, 0x00, 0x37, 0x00, 0x56, 0xfe, 0xad, 0x00, 0x37, 0x00, 0x58, 0xfe, 0xc9, 0x00, 0x37, 0x00, 0x5a, 0xfe, 0xad, 0x00, 0x37, 0x00, 0x5c, 0xfe, 0xc1, 0x00, 0x37, 0x00, 0x6d, 0xff, 0x44, 0x00, 0x37, 0x00, 0x7d, 0xff, 0x90, 0x00, 0x37, 0x00, 0x82, 0xff, 0x61, 0x00, 0x37, 0x00, 0x83, 0xff, 0x61, 0x00, 0x37, 0x00, 0x84, 0xff, 0x61, 0x00, 0x37, 0x00, 0x85, 0xff, 0x61, 0x00, 0x37, 0x00, 0x86, 0xff, 0x61, 0x00, 0x37, 0x00, 0x89, 0xff, 0x88, 0x00, 0x37, 0x00, 0xa2, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa3, 0xfe, 0xad, 0x00, 0x37, 0x00, 0xa4, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa5, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa6, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa7, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa9, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xaa, 0xfe, 0xe0, 0x00, 0x37, 0x00, 0xab, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xac, 0xfe, 0xe0, 0x00, 0x37, 0x00, 0xad, 0xfe, 0xe0, 0x00, 0x37, 0x00, 0xb4, 0xfe, 0xf4, 0x00, 0x37, 0x00, 0xb5, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xb6, 0xfe, 0xf4, 0x00, 0x37, 0x00, 0xb7, 0xfe, 0xf4, 0x00, 0x37, 0x00, 0xb8, 0xfe, 0xf4, 0x00, 0x37, 0x00, 0xbb, 0xfe, 0xe7, 0x00, 0x37, 0x00, 0xbc, 0xfe, 0xc9, 0x00, 0x37, 0x00, 0xbd, 0xfe, 0xe7, 0x00, 0x37, 0x00, 0xbe, 0xfe, 0xe7, 0x00, 0x37, 0x00, 0xbf, 0xfe, 0xc1, 0x00, 0x37, 0x00, 0xc1, 0xfe, 0xc1, 0x00, 0x37, 0x00, 0xc8, 0xff, 0x88, 0x00, 0x37, 0x00, 0xc9, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xce, 0xff, 0x88, 0x00, 0x37, 0x00, 0xcf, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xdd, 0xfe, 0xa4, 0x00, 0x37, 0x01, 0x17, 0xfe, 0xd3, 0x00, 0x37, 0x01, 0x1b, 0xfe, 0xd3, 0x00, 0x37, 0x01, 0x21, 0xfe, 0xad, 0x00, 0x37, 0x01, 0x23, 0xfe, 0xad, 0x00, 0x37, 0x01, 0x26, 0xff, 0xdc, 0x00, 0x37, 0x01, 0x31, 0xfe, 0xc9, 0x00, 0x37, 0x07, 0x52, 0xff, 0xd3, 0x00, 0x37, 0x07, 0x53, 0xfe, 0xf8, 0x00, 0x38, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x38, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x10, 0xff, 0x88, 0x00, 0x39, 0x00, 0x11, 0xfe, 0xf8, 0x00, 0x39, 0x00, 0x1d, 0xff, 0x59, 0x00, 0x39, 0x00, 0x24, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x44, 0xff, 0x61, 0x00, 0x39, 0x00, 0x48, 0xff, 0x61, 0x00, 0x39, 0x00, 0x4c, 0xff, 0xd3, 0x00, 0x39, 0x00, 0x52, 0xff, 0x61, 0x00, 0x39, 0x00, 0x58, 0xff, 0x75, 0x00, 0x39, 0x00, 0x5c, 0xff, 0xc9, 0x00, 0x39, 0x00, 0x6d, 0xff, 0x4e, 0x00, 0x39, 0x00, 0x7d, 0xff, 0x90, 0x00, 0x39, 0x00, 0x82, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x83, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x84, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x85, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x86, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x39, 0x00, 0xa2, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa3, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa4, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa5, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa6, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa7, 0xff, 0x61, 0x00, 0x39, 0x00, 0xaa, 0xff, 0x61, 0x00, 0x39, 0x00, 0xab, 0xff, 0x61, 0x00, 0x39, 0x00, 0xac, 0xff, 0x61, 0x00, 0x39, 0x00, 0xad, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb4, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb5, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb6, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb7, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb8, 0xff, 0x61, 0x00, 0x39, 0x00, 0xbb, 0xff, 0x75, 0x00, 0x39, 0x00, 0xbc, 0xff, 0x75, 0x00, 0x39, 0x00, 0xbd, 0xff, 0x75, 0x00, 0x39, 0x00, 0xbe, 0xff, 0x75, 0x00, 0x39, 0x00, 0xbf, 0xff, 0xc9, 0x00, 0x39, 0x00, 0xc1, 0xff, 0xc9, 0x00, 0x39, 0x00, 0xdd, 0xff, 0x61, 0x00, 0x39, 0x01, 0x31, 0xff, 0x75, 0x00, 0x39, 0x07, 0x53, 0xfe, 0xe6, 0x00, 0x3a, 0x00, 0x10, 0xff, 0xad, 0x00, 0x3a, 0x00, 0x11, 0xff, 0x15, 0x00, 0x3a, 0x00, 0x1d, 0xff, 0x88, 0x00, 0x3a, 0x00, 0x24, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x44, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0x48, 0xff, 0x88, 0x00, 0x3a, 0x00, 0x4c, 0xff, 0xd3, 0x00, 0x3a, 0x00, 0x52, 0xff, 0x88, 0x00, 0x3a, 0x00, 0x55, 0xff, 0xa4, 0x00, 0x3a, 0x00, 0x58, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x3a, 0x00, 0x6d, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x3a, 0x00, 0x82, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x83, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x84, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x85, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x86, 0xff, 0x90, 0x00, 0x3a, 0x00, 0xa2, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa3, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa4, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa5, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa6, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa7, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xaa, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xab, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xac, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xad, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb4, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb5, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb6, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb7, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb8, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xbb, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0xbc, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0xbd, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0xbe, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x3a, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x3a, 0x00, 0xdd, 0xff, 0x88, 0x00, 0x3a, 0x01, 0x17, 0xff, 0xa4, 0x00, 0x3a, 0x01, 0x1b, 0xff, 0xa4, 0x00, 0x3a, 0x01, 0x31, 0xff, 0xb7, 0x00, 0x3a, 0x07, 0x51, 0xff, 0xdc, 0x00, 0x3a, 0x07, 0x53, 0xfe, 0xf8, 0x00, 0x3b, 0x00, 0x10, 0xff, 0x9a, 0x00, 0x3b, 0x00, 0x26, 0xff, 0x6b, 0x00, 0x3b, 0x00, 0x32, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x37, 0xff, 0xdc, 0x00, 0x3b, 0x00, 0x48, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0x6d, 0xff, 0x90, 0x00, 0x3b, 0x00, 0x89, 0xff, 0x6b, 0x00, 0x3b, 0x00, 0x94, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x95, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x96, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x97, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x98, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0xaa, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0xab, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0xac, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0xad, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0xc8, 0xff, 0x6b, 0x00, 0x3b, 0x00, 0xce, 0xff, 0x6b, 0x00, 0x3b, 0x00, 0xdd, 0xff, 0xa4, 0x00, 0x3b, 0x01, 0x26, 0xff, 0xdc, 0x00, 0x3b, 0x07, 0x51, 0xff, 0x61, 0x00, 0x3b, 0x07, 0x52, 0xff, 0xad, 0x00, 0x3b, 0x07, 0x53, 0xff, 0xd3, 0x00, 0x3c, 0x00, 0x10, 0xff, 0x0d, 0x00, 0x3c, 0x00, 0x11, 0xfe, 0x61, 0x00, 0x3c, 0x00, 0x1d, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0x24, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x26, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x32, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x44, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0x48, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0x4c, 0xff, 0xb7, 0x00, 0x3c, 0x00, 0x52, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0x58, 0xff, 0x15, 0x00, 0x3c, 0x00, 0x6d, 0xff, 0x1f, 0x00, 0x3c, 0x00, 0x7d, 0xff, 0x6b, 0x00, 0x3c, 0x00, 0x82, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x83, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x84, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x85, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x86, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x89, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x94, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x95, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x96, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x97, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x98, 0xff, 0x90, 0x00, 0x3c, 0x00, 0xa2, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa3, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa4, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa5, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa6, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa7, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xaa, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xab, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xac, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xad, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb4, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb5, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb6, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb7, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb8, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xbb, 0xff, 0x15, 0x00, 0x3c, 0x00, 0xbc, 0xff, 0x15, 0x00, 0x3c, 0x00, 0xbd, 0xff, 0x15, 0x00, 0x3c, 0x00, 0xbe, 0xff, 0x15, 0x00, 0x3c, 0x00, 0xc8, 0xff, 0x90, 0x00, 0x3c, 0x00, 0xce, 0xff, 0x90, 0x00, 0x3c, 0x00, 0xdd, 0xfe, 0xf0, 0x00, 0x3c, 0x01, 0x31, 0xff, 0x15, 0x00, 0x3c, 0x07, 0x51, 0xff, 0x90, 0x00, 0x3c, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x3c, 0x07, 0x53, 0xfe, 0xf8, 0x00, 0x3d, 0x00, 0x10, 0xff, 0xdc, 0x00, 0x3d, 0x07, 0x51, 0xff, 0xdc, 0x00, 0x3d, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x3d, 0x07, 0x53, 0xff, 0xdc, 0x00, 0x48, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0x49, 0x00, 0x10, 0xff, 0x90, 0x00, 0x49, 0x00, 0x11, 0xff, 0x6b, 0x00, 0x49, 0x00, 0x1d, 0xff, 0xb7, 0x00, 0x49, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x49, 0x00, 0x5a, 0xff, 0xdc, 0x00, 0x49, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x49, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x49, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x49, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x49, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x49, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x49, 0x07, 0x51, 0x00, 0x41, 0x00, 0x49, 0x07, 0x53, 0xff, 0x15, 0x00, 0x4e, 0x00, 0x44, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0x48, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0x52, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0x58, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0x5c, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xa2, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa3, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa4, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa5, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa6, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa7, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xaa, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xab, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xac, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xad, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb4, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb5, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb6, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb7, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb8, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xbb, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0xbc, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0xbd, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0xbe, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0xbf, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xc1, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xdd, 0xff, 0xb7, 0x00, 0x4e, 0x01, 0x31, 0xff, 0xc1, 0x00, 0x51, 0x07, 0x51, 0xff, 0x6b, 0x00, 0x51, 0x07, 0x52, 0xff, 0x90, 0x00, 0x51, 0x07, 0x53, 0xff, 0xa4, 0x00, 0x52, 0x00, 0x10, 0x00, 0x26, 0x00, 0x52, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x52, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0x52, 0x07, 0x51, 0xff, 0x6b, 0x00, 0x52, 0x07, 0x52, 0xff, 0xb7, 0x00, 0x52, 0x07, 0x53, 0xff, 0x7d, 0x00, 0x55, 0x00, 0x10, 0xff, 0x7d, 0x00, 0x55, 0x00, 0x11, 0xff, 0x44, 0x00, 0x55, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x46, 0xff, 0xd3, 0x00, 0x55, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x48, 0xff, 0xd3, 0x00, 0x55, 0x00, 0x4a, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x4b, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x50, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x51, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x52, 0xff, 0xd3, 0x00, 0x55, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x55, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x5b, 0xff, 0xc9, 0x00, 0x55, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x55, 0x00, 0xa9, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xaa, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xab, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xac, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xad, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb3, 0xff, 0xdc, 0x00, 0x55, 0x00, 0xb4, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb5, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb6, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb7, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb8, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xc9, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xcf, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xd1, 0x00, 0x48, 0x00, 0x55, 0x00, 0xdd, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xe1, 0xff, 0xdc, 0x00, 0x55, 0x01, 0x0a, 0xff, 0xdc, 0x00, 0x55, 0x01, 0x17, 0xff, 0xdc, 0x00, 0x55, 0x01, 0x1b, 0xff, 0xdc, 0x00, 0x55, 0x07, 0x52, 0x00, 0x56, 0x00, 0x55, 0x07, 0x53, 0xfe, 0xc9, 0x00, 0x59, 0x00, 0x10, 0xff, 0xc9, 0x00, 0x59, 0x00, 0x11, 0xff, 0x61, 0x00, 0x59, 0x00, 0x1d, 0xff, 0x90, 0x00, 0x59, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x59, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x59, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x59, 0x07, 0x53, 0xfe, 0xf0, 0x00, 0x5a, 0x00, 0x11, 0xff, 0x44, 0x00, 0x5a, 0x00, 0x1d, 0xff, 0x90, 0x00, 0x5a, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x5a, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x5a, 0x07, 0x53, 0xff, 0x29, 0x00, 0x5b, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x5b, 0x00, 0x48, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0x52, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x5b, 0x00, 0xaa, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xab, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xac, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xad, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb4, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb5, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb6, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb7, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb8, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x5b, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x5b, 0x00, 0xdd, 0xff, 0xc1, 0x00, 0x5c, 0x00, 0x10, 0xff, 0xdc, 0x00, 0x5c, 0x00, 0x11, 0xfe, 0xdc, 0x00, 0x5c, 0x00, 0x1d, 0xff, 0x6b, 0x00, 0x5c, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x5c, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x5c, 0x07, 0x53, 0xfe, 0xd3, 0x00, 0x6d, 0x00, 0x25, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x27, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x2d, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x37, 0xff, 0x90, 0x00, 0x6d, 0x00, 0x39, 0xff, 0x90, 0x00, 0x6d, 0x00, 0x3a, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x3c, 0xff, 0x6b, 0x00, 0x6d, 0x00, 0x59, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x5a, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x88, 0x00, 0x97, 0x00, 0x6d, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x9f, 0xff, 0x6b, 0x00, 0x6d, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xd0, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x6d, 0x01, 0x26, 0xff, 0x90, 0x00, 0x6d, 0x01, 0x3a, 0xff, 0x6b, 0x00, 0x7d, 0x00, 0x24, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x25, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x27, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x2d, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x37, 0xff, 0x44, 0x00, 0x7d, 0x00, 0x39, 0xff, 0x4e, 0x00, 0x7d, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x7d, 0x00, 0x3b, 0xff, 0x90, 0x00, 0x7d, 0x00, 0x3c, 0xff, 0x1f, 0x00, 0x7d, 0x00, 0x59, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x5a, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x82, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x83, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x84, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x85, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x86, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x9f, 0xff, 0x1f, 0x00, 0x7d, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0xd0, 0xff, 0xdc, 0x00, 0x7d, 0x01, 0x26, 0xff, 0x44, 0x00, 0x7d, 0x01, 0x3a, 0xff, 0x1f, 0x00, 0x82, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x82, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x24, 0x00, 0x39, 0x00, 0x82, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x37, 0xff, 0x61, 0x00, 0x82, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x82, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x82, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x82, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x82, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x59, 0xff, 0x88, 0x00, 0x82, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x82, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x82, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x82, 0x00, 0x82, 0x00, 0x39, 0x00, 0x82, 0x00, 0x83, 0x00, 0x39, 0x00, 0x82, 0x00, 0x84, 0x00, 0x39, 0x00, 0x82, 0x00, 0x85, 0x00, 0x39, 0x00, 0x82, 0x00, 0x86, 0x00, 0x39, 0x00, 0x82, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x82, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x82, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x82, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x82, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x82, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x82, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x24, 0xff, 0x61, 0x00, 0x82, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x26, 0xff, 0x61, 0x00, 0x82, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x36, 0xff, 0x90, 0x00, 0x82, 0x01, 0x37, 0xff, 0xad, 0x00, 0x82, 0x01, 0x38, 0xff, 0x61, 0x00, 0x82, 0x01, 0x39, 0xff, 0x75, 0x00, 0x82, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x82, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x82, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0x82, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x82, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x82, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x82, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x82, 0x06, 0x42, 0xff, 0x61, 0x00, 0x82, 0x06, 0x43, 0xff, 0x75, 0x00, 0x82, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x82, 0x07, 0x52, 0xff, 0x03, 0x00, 0x82, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x83, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x83, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x24, 0x00, 0x39, 0x00, 0x83, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x37, 0xff, 0x61, 0x00, 0x83, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x83, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x83, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x83, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x83, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x59, 0xff, 0x88, 0x00, 0x83, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x83, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x83, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x83, 0x00, 0x82, 0x00, 0x39, 0x00, 0x83, 0x00, 0x83, 0x00, 0x39, 0x00, 0x83, 0x00, 0x84, 0x00, 0x39, 0x00, 0x83, 0x00, 0x85, 0x00, 0x39, 0x00, 0x83, 0x00, 0x86, 0x00, 0x39, 0x00, 0x83, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x83, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x83, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x83, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x83, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x83, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x83, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x24, 0xff, 0x61, 0x00, 0x83, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x26, 0xff, 0x61, 0x00, 0x83, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x36, 0xff, 0x90, 0x00, 0x83, 0x01, 0x37, 0xff, 0xad, 0x00, 0x83, 0x01, 0x38, 0xff, 0x61, 0x00, 0x83, 0x01, 0x39, 0xff, 0x75, 0x00, 0x83, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x83, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x83, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0x83, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x83, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x83, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x83, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x83, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x83, 0x06, 0x42, 0xff, 0x61, 0x00, 0x83, 0x06, 0x43, 0xff, 0x75, 0x00, 0x83, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x83, 0x07, 0x52, 0xff, 0x03, 0x00, 0x83, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x84, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x84, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x24, 0x00, 0x39, 0x00, 0x84, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x37, 0xff, 0x61, 0x00, 0x84, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x84, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x84, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x84, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x84, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x59, 0xff, 0x88, 0x00, 0x84, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x84, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x84, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x84, 0x00, 0x82, 0x00, 0x39, 0x00, 0x84, 0x00, 0x83, 0x00, 0x39, 0x00, 0x84, 0x00, 0x84, 0x00, 0x39, 0x00, 0x84, 0x00, 0x85, 0x00, 0x39, 0x00, 0x84, 0x00, 0x86, 0x00, 0x39, 0x00, 0x84, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x84, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x84, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x84, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x84, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x84, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x84, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x24, 0xff, 0x61, 0x00, 0x84, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x26, 0xff, 0x61, 0x00, 0x84, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x36, 0xff, 0x90, 0x00, 0x84, 0x01, 0x37, 0xff, 0xad, 0x00, 0x84, 0x01, 0x38, 0xff, 0x61, 0x00, 0x84, 0x01, 0x39, 0xff, 0x75, 0x00, 0x84, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x84, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x84, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0x84, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x84, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x84, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x84, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x84, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x84, 0x06, 0x42, 0xff, 0x61, 0x00, 0x84, 0x06, 0x43, 0xff, 0x75, 0x00, 0x84, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x84, 0x07, 0x52, 0xff, 0x03, 0x00, 0x84, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x85, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x85, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x24, 0x00, 0x39, 0x00, 0x85, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x37, 0xff, 0x61, 0x00, 0x85, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x85, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x85, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x85, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x85, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x59, 0xff, 0x88, 0x00, 0x85, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x85, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x85, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x85, 0x00, 0x82, 0x00, 0x39, 0x00, 0x85, 0x00, 0x83, 0x00, 0x39, 0x00, 0x85, 0x00, 0x84, 0x00, 0x39, 0x00, 0x85, 0x00, 0x85, 0x00, 0x39, 0x00, 0x85, 0x00, 0x86, 0x00, 0x39, 0x00, 0x85, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x85, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x85, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x85, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x85, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x85, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x85, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x24, 0xff, 0x61, 0x00, 0x85, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x26, 0xff, 0x61, 0x00, 0x85, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x36, 0xff, 0x90, 0x00, 0x85, 0x01, 0x37, 0xff, 0xad, 0x00, 0x85, 0x01, 0x38, 0xff, 0x61, 0x00, 0x85, 0x01, 0x39, 0xff, 0x75, 0x00, 0x85, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x85, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x85, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x85, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x85, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x85, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x85, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x85, 0x06, 0x42, 0xff, 0x61, 0x00, 0x85, 0x06, 0x43, 0xff, 0x75, 0x00, 0x85, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x85, 0x07, 0x52, 0xff, 0x03, 0x00, 0x85, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x86, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x86, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x24, 0x00, 0x39, 0x00, 0x86, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x37, 0xff, 0x61, 0x00, 0x86, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x86, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x86, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x86, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x86, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x59, 0xff, 0x88, 0x00, 0x86, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x86, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x86, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x86, 0x00, 0x82, 0x00, 0x39, 0x00, 0x86, 0x00, 0x83, 0x00, 0x39, 0x00, 0x86, 0x00, 0x84, 0x00, 0x39, 0x00, 0x86, 0x00, 0x85, 0x00, 0x39, 0x00, 0x86, 0x00, 0x86, 0x00, 0x39, 0x00, 0x86, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x86, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x86, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x86, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x86, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x86, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x86, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x24, 0xff, 0x61, 0x00, 0x86, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x26, 0xff, 0x61, 0x00, 0x86, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x36, 0xff, 0x90, 0x00, 0x86, 0x01, 0x37, 0xff, 0xad, 0x00, 0x86, 0x01, 0x38, 0xff, 0x61, 0x00, 0x86, 0x01, 0x39, 0xff, 0x75, 0x00, 0x86, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x86, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x86, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0x86, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x86, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x86, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x86, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x86, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x86, 0x06, 0x42, 0xff, 0x61, 0x00, 0x86, 0x06, 0x43, 0xff, 0x75, 0x00, 0x86, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x86, 0x07, 0x52, 0xff, 0x03, 0x00, 0x86, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x88, 0x07, 0x51, 0xff, 0xad, 0x00, 0x88, 0x07, 0x52, 0xff, 0xa4, 0x00, 0x88, 0x07, 0x53, 0xff, 0x90, 0x00, 0x89, 0x00, 0x3c, 0xff, 0xdc, 0x00, 0x89, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x89, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x89, 0x00, 0x9f, 0xff, 0xdc, 0x00, 0x89, 0x01, 0x3a, 0xff, 0xdc, 0x00, 0x89, 0x07, 0x52, 0x00, 0x26, 0x00, 0x92, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x92, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x92, 0x00, 0xc2, 0xff, 0xdc, 0x00, 0x92, 0x00, 0xc4, 0xff, 0xdc, 0x00, 0x92, 0x00, 0xc6, 0xff, 0xdc, 0x00, 0x92, 0x01, 0x38, 0xff, 0x90, 0x00, 0x92, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x92, 0x01, 0xf4, 0xff, 0x90, 0x00, 0x92, 0x06, 0x42, 0xff, 0x90, 0x00, 0x92, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x92, 0x07, 0x52, 0xff, 0xc9, 0x00, 0x92, 0x07, 0x53, 0xff, 0x44, 0x00, 0x94, 0x00, 0x10, 0x00, 0x39, 0x00, 0x94, 0x00, 0x11, 0xff, 0xad, 0x00, 0x94, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x94, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x94, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x94, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x94, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x94, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x94, 0x07, 0x53, 0xff, 0x44, 0x00, 0x95, 0x00, 0x10, 0x00, 0x39, 0x00, 0x95, 0x00, 0x11, 0xff, 0xad, 0x00, 0x95, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x95, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x95, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x95, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x95, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x95, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x95, 0x07, 0x53, 0xff, 0x44, 0x00, 0x96, 0x00, 0x10, 0x00, 0x39, 0x00, 0x96, 0x00, 0x11, 0xff, 0xad, 0x00, 0x96, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x96, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x96, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x96, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x96, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x96, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x96, 0x07, 0x53, 0xff, 0x44, 0x00, 0x97, 0x00, 0x10, 0x00, 0x39, 0x00, 0x97, 0x00, 0x11, 0xff, 0xad, 0x00, 0x97, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x97, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x97, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x97, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x97, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x97, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x97, 0x07, 0x53, 0xff, 0x44, 0x00, 0x98, 0x00, 0x10, 0x00, 0x39, 0x00, 0x98, 0x00, 0x11, 0xff, 0xad, 0x00, 0x98, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x98, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x98, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x98, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x98, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x98, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x98, 0x07, 0x53, 0xff, 0x44, 0x00, 0x9b, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x9b, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x9c, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x9c, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x9d, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x9d, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x9e, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x9e, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x9f, 0x00, 0x10, 0xff, 0x0d, 0x00, 0x9f, 0x00, 0x11, 0xfe, 0x61, 0x00, 0x9f, 0x00, 0x1d, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0x24, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x26, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x32, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x44, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0x48, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0x4c, 0xff, 0xb7, 0x00, 0x9f, 0x00, 0x52, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0x58, 0xff, 0x15, 0x00, 0x9f, 0x00, 0x6d, 0xff, 0x1f, 0x00, 0x9f, 0x00, 0x7d, 0xff, 0x6b, 0x00, 0x9f, 0x00, 0x82, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x83, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x84, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x85, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x86, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x89, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x94, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x95, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x96, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x97, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x98, 0xff, 0x90, 0x00, 0x9f, 0x00, 0xa2, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa3, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa4, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa5, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa6, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa7, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xaa, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xab, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xac, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xad, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb4, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb5, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb6, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb7, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb8, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xbb, 0xff, 0x15, 0x00, 0x9f, 0x00, 0xbc, 0xff, 0x15, 0x00, 0x9f, 0x00, 0xbd, 0xff, 0x15, 0x00, 0x9f, 0x00, 0xbe, 0xff, 0x15, 0x00, 0x9f, 0x00, 0xc8, 0xff, 0x90, 0x00, 0x9f, 0x00, 0xce, 0xff, 0x90, 0x00, 0x9f, 0x00, 0xdd, 0xfe, 0xf0, 0x00, 0x9f, 0x01, 0x31, 0xff, 0x15, 0x00, 0x9f, 0x07, 0x51, 0xff, 0x90, 0x00, 0x9f, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x9f, 0x07, 0x53, 0xfe, 0xf8, 0x00, 0xa0, 0x00, 0x11, 0xff, 0x6b, 0x00, 0xa0, 0x00, 0x1d, 0xff, 0xb7, 0x00, 0xa0, 0x07, 0x51, 0xff, 0xdc, 0x00, 0xa0, 0x07, 0x53, 0xff, 0x44, 0x00, 0xa1, 0x00, 0x10, 0x00, 0x26, 0x00, 0xa1, 0x07, 0x51, 0xff, 0x90, 0x00, 0xa1, 0x07, 0x52, 0xff, 0x90, 0x00, 0xa1, 0x07, 0x53, 0xff, 0xad, 0x00, 0xaa, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xab, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xac, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xad, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xb2, 0x07, 0x51, 0xff, 0xa4, 0x00, 0xb2, 0x07, 0x52, 0xff, 0x90, 0x00, 0xb2, 0x07, 0x53, 0xff, 0xb7, 0x00, 0xb3, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb3, 0x07, 0x52, 0xff, 0x90, 0x00, 0xb3, 0x07, 0x53, 0xff, 0xa4, 0x00, 0xb4, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb4, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb4, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb4, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb4, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb4, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xb5, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb5, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb5, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb5, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb5, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb5, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xb6, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb6, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb6, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb6, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb6, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb6, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xb7, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb7, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb7, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb7, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb7, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb7, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xb8, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb8, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb8, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb8, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb8, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb8, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xbf, 0x00, 0x10, 0xff, 0xdc, 0x00, 0xbf, 0x00, 0x11, 0xfe, 0xdc, 0x00, 0xbf, 0x00, 0x1d, 0xff, 0x6b, 0x00, 0xbf, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xbf, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xbf, 0x07, 0x53, 0xfe, 0xd3, 0x00, 0xc1, 0x00, 0x10, 0xff, 0xdc, 0x00, 0xc1, 0x00, 0x11, 0xfe, 0xdc, 0x00, 0xc1, 0x00, 0x1d, 0xff, 0x6b, 0x00, 0xc1, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xc1, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xc1, 0x07, 0x53, 0xfe, 0xd3, 0x00, 0xc2, 0x00, 0x10, 0xff, 0xd3, 0x00, 0xc2, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x24, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x26, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x32, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x34, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x37, 0xff, 0x61, 0x00, 0xc2, 0x00, 0x39, 0xff, 0x7d, 0x00, 0xc2, 0x00, 0x3a, 0xff, 0x90, 0x00, 0xc2, 0x00, 0x3c, 0xff, 0x61, 0x00, 0xc2, 0x00, 0x46, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x47, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x49, 0xff, 0xb7, 0x00, 0xc2, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x54, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x57, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x59, 0xff, 0x88, 0x00, 0xc2, 0x00, 0x5a, 0xff, 0xad, 0x00, 0xc2, 0x00, 0x5c, 0xff, 0x75, 0x00, 0xc2, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0xc2, 0x00, 0x82, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x83, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x84, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x85, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x86, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x94, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x95, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x96, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x97, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x98, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x9f, 0xff, 0x61, 0x00, 0xc2, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xbf, 0xff, 0x75, 0x00, 0xc2, 0x00, 0xc1, 0xff, 0x75, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x39, 0x00, 0xc2, 0x00, 0xc4, 0x00, 0x39, 0x00, 0xc2, 0x00, 0xc6, 0x00, 0x39, 0x00, 0xc2, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xca, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xce, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd3, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xde, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x10, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x11, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x12, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x13, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x24, 0xff, 0x61, 0x00, 0xc2, 0x01, 0x25, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x26, 0xff, 0x61, 0x00, 0xc2, 0x01, 0x27, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x36, 0xff, 0x90, 0x00, 0xc2, 0x01, 0x37, 0xff, 0xad, 0x00, 0xc2, 0x01, 0x38, 0xff, 0x61, 0x00, 0xc2, 0x01, 0x39, 0xff, 0x75, 0x00, 0xc2, 0x01, 0x3a, 0xff, 0x61, 0x00, 0xc2, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0xc2, 0x05, 0xd0, 0xff, 0x90, 0x00, 0xc2, 0x05, 0xd2, 0xff, 0x90, 0x00, 0xc2, 0x05, 0xd3, 0xff, 0xad, 0x00, 0xc2, 0x05, 0xd4, 0xff, 0x90, 0x00, 0xc2, 0x05, 0xd5, 0xff, 0xad, 0x00, 0xc2, 0x06, 0x42, 0xff, 0x61, 0x00, 0xc2, 0x06, 0x43, 0xff, 0x75, 0x00, 0xc2, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0xc2, 0x07, 0x52, 0xff, 0x02, 0x00, 0xc2, 0x07, 0x53, 0x00, 0x2f, 0x00, 0xc4, 0x00, 0x10, 0xff, 0xd3, 0x00, 0xc4, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x24, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x26, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x32, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x34, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x37, 0xff, 0x61, 0x00, 0xc4, 0x00, 0x39, 0xff, 0x7d, 0x00, 0xc4, 0x00, 0x3a, 0xff, 0x90, 0x00, 0xc4, 0x00, 0x3c, 0xff, 0x61, 0x00, 0xc4, 0x00, 0x46, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x47, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x49, 0xff, 0xb7, 0x00, 0xc4, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x54, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x57, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x59, 0xff, 0x88, 0x00, 0xc4, 0x00, 0x5a, 0xff, 0xad, 0x00, 0xc4, 0x00, 0x5c, 0xff, 0x75, 0x00, 0xc4, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0xc4, 0x00, 0x82, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x83, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x84, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x85, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x86, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x94, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x95, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x96, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x97, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x98, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x9f, 0xff, 0x61, 0x00, 0xc4, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xbf, 0xff, 0x75, 0x00, 0xc4, 0x00, 0xc1, 0xff, 0x75, 0x00, 0xc4, 0x00, 0xc2, 0x00, 0x39, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x39, 0x00, 0xc4, 0x00, 0xc6, 0x00, 0x39, 0x00, 0xc4, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xca, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xce, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd3, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xde, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x10, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x11, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x12, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x13, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x24, 0xff, 0x61, 0x00, 0xc4, 0x01, 0x25, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x26, 0xff, 0x61, 0x00, 0xc4, 0x01, 0x27, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x36, 0xff, 0x90, 0x00, 0xc4, 0x01, 0x37, 0xff, 0xad, 0x00, 0xc4, 0x01, 0x38, 0xff, 0x61, 0x00, 0xc4, 0x01, 0x39, 0xff, 0x75, 0x00, 0xc4, 0x01, 0x3a, 0xff, 0x61, 0x00, 0xc4, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0xc4, 0x05, 0xd0, 0xff, 0x90, 0x00, 0xc4, 0x05, 0xd2, 0xff, 0x90, 0x00, 0xc4, 0x05, 0xd3, 0xff, 0xad, 0x00, 0xc4, 0x05, 0xd4, 0xff, 0x90, 0x00, 0xc4, 0x05, 0xd5, 0xff, 0xad, 0x00, 0xc4, 0x06, 0x42, 0xff, 0x61, 0x00, 0xc4, 0x06, 0x43, 0xff, 0x75, 0x00, 0xc4, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0xc4, 0x07, 0x52, 0xff, 0x02, 0x00, 0xc4, 0x07, 0x53, 0x00, 0x2f, 0x00, 0xc6, 0x00, 0x10, 0xff, 0xd3, 0x00, 0xc6, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x24, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x26, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x32, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x34, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x37, 0xff, 0x61, 0x00, 0xc6, 0x00, 0x39, 0xff, 0x7d, 0x00, 0xc6, 0x00, 0x3a, 0xff, 0x90, 0x00, 0xc6, 0x00, 0x3c, 0xff, 0x61, 0x00, 0xc6, 0x00, 0x46, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x47, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x49, 0xff, 0xb7, 0x00, 0xc6, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x54, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x57, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x59, 0xff, 0x88, 0x00, 0xc6, 0x00, 0x5a, 0xff, 0xad, 0x00, 0xc6, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0xc6, 0x00, 0x82, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x83, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x84, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x85, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x86, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x94, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x95, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x96, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x97, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x98, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x9f, 0xff, 0x61, 0x00, 0xc6, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xc2, 0x00, 0x39, 0x00, 0xc6, 0x00, 0xc4, 0x00, 0x39, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x39, 0x00, 0xc6, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xca, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xce, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd3, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xde, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x10, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x11, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x13, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x24, 0xff, 0x61, 0x00, 0xc6, 0x01, 0x25, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x26, 0xff, 0x61, 0x00, 0xc6, 0x01, 0x27, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x36, 0xff, 0x90, 0x00, 0xc6, 0x01, 0x37, 0xff, 0xad, 0x00, 0xc6, 0x01, 0x38, 0xff, 0x61, 0x00, 0xc6, 0x01, 0x3a, 0xff, 0x61, 0x00, 0xc6, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0xc6, 0x05, 0xd0, 0xff, 0x90, 0x00, 0xc6, 0x05, 0xd2, 0xff, 0x90, 0x00, 0xc6, 0x05, 0xd3, 0xff, 0xad, 0x00, 0xc6, 0x05, 0xd4, 0xff, 0x90, 0x00, 0xc6, 0x05, 0xd5, 0xff, 0xad, 0x00, 0xc6, 0x06, 0x42, 0xff, 0x61, 0x00, 0xc6, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0xc6, 0x07, 0x52, 0xff, 0x02, 0x00, 0xc6, 0x07, 0x53, 0x00, 0x2f, 0x00, 0xc8, 0x00, 0x3c, 0xff, 0xdc, 0x00, 0xc8, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xc8, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xc8, 0x00, 0x9f, 0xff, 0xdc, 0x00, 0xc8, 0x01, 0x3a, 0xff, 0xdc, 0x00, 0xc8, 0x07, 0x52, 0x00, 0x26, 0x00, 0xce, 0x00, 0x3c, 0xff, 0xdc, 0x00, 0xce, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xce, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xce, 0x00, 0x9f, 0xff, 0xdc, 0x00, 0xce, 0x01, 0x3a, 0xff, 0xdc, 0x00, 0xce, 0x07, 0x52, 0x00, 0x26, 0x00, 0xd0, 0x00, 0x24, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x39, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x3c, 0xff, 0x90, 0x00, 0xd0, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x82, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x83, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x84, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x85, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x86, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x9f, 0xff, 0x90, 0x00, 0xd0, 0x00, 0xc2, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0xc4, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0xc6, 0xff, 0xdc, 0x00, 0xd0, 0x01, 0x38, 0xff, 0x90, 0x00, 0xd0, 0x01, 0x3a, 0xff, 0x90, 0x00, 0xd0, 0x01, 0xf4, 0xff, 0x90, 0x00, 0xd0, 0x06, 0x42, 0xff, 0x90, 0x00, 0xd0, 0x07, 0x51, 0xff, 0xd3, 0x00, 0xd0, 0x07, 0x52, 0xff, 0xc9, 0x00, 0xd0, 0x07, 0x53, 0xff, 0x44, 0x00, 0xd2, 0x00, 0x24, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x39, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x3c, 0xff, 0x90, 0x00, 0xd2, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x82, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x83, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x84, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x85, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x86, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x9f, 0xff, 0x90, 0x00, 0xd2, 0x01, 0x3a, 0xff, 0x90, 0x00, 0xd2, 0x07, 0x51, 0xff, 0xd3, 0x00, 0xd2, 0x07, 0x52, 0xff, 0xc9, 0x00, 0xd2, 0x07, 0x53, 0xff, 0x44, 0x00, 0xdd, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xe0, 0x00, 0x37, 0xff, 0xb7, 0x00, 0xe0, 0x00, 0x3c, 0xff, 0x9a, 0x00, 0xe0, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xe0, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xe0, 0x00, 0x9f, 0xff, 0x9a, 0x00, 0xe0, 0x01, 0x26, 0xff, 0xb7, 0x00, 0xe0, 0x01, 0x3a, 0xff, 0x9a, 0x00, 0xe0, 0x07, 0x51, 0xff, 0xd3, 0x00, 0xe0, 0x07, 0x52, 0xff, 0xd3, 0x00, 0xe0, 0x07, 0x53, 0xff, 0xc9, 0x00, 0xfb, 0x00, 0x10, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0x24, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x32, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x37, 0xfe, 0xe6, 0x00, 0xfb, 0x00, 0x38, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x39, 0xff, 0x1f, 0x00, 0xfb, 0x00, 0x3a, 0xff, 0x44, 0x00, 0xfb, 0x00, 0x3c, 0xfe, 0xf0, 0x00, 0xfb, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0x58, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0x5c, 0xff, 0x44, 0x00, 0xfb, 0x00, 0x82, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x83, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x84, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x85, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x86, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x94, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x95, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x96, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x97, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x98, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x9b, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x9c, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x9d, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x9e, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x9f, 0xfe, 0xf0, 0x00, 0xfb, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbc, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbd, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbe, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbf, 0xff, 0x44, 0x00, 0xfb, 0x00, 0xc1, 0xff, 0x44, 0x00, 0xfb, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xfb, 0x01, 0x26, 0xfe, 0xe6, 0x00, 0xfb, 0x01, 0x30, 0xff, 0x9a, 0x00, 0xfb, 0x01, 0x31, 0xff, 0xdc, 0x00, 0xfb, 0x01, 0x3a, 0xfe, 0xf0, 0x00, 0xfb, 0x07, 0x51, 0xfe, 0x61, 0x00, 0xfb, 0x07, 0x52, 0xfd, 0xe6, 0x00, 0xff, 0x00, 0x10, 0xff, 0xdc, 0x00, 0xff, 0x00, 0x24, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x32, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x37, 0xfe, 0xe6, 0x00, 0xff, 0x00, 0x38, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x39, 0xff, 0x1f, 0x00, 0xff, 0x00, 0x3a, 0xff, 0x44, 0x00, 0xff, 0x00, 0x3c, 0xfe, 0xf0, 0x00, 0xff, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xff, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xff, 0x00, 0x58, 0xff, 0xdc, 0x00, 0xff, 0x00, 0x5c, 0xff, 0x44, 0x00, 0xff, 0x00, 0x82, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x83, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x84, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x85, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x86, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x94, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x95, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x96, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x97, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x98, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x9b, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x9c, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x9d, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x9e, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x9f, 0xfe, 0xf0, 0x00, 0xff, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbc, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbd, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbe, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbf, 0xff, 0x44, 0x00, 0xff, 0x00, 0xc1, 0xff, 0x44, 0x00, 0xff, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xff, 0x01, 0x26, 0xfe, 0xe6, 0x00, 0xff, 0x01, 0x30, 0xff, 0x9a, 0x00, 0xff, 0x01, 0x31, 0xff, 0xdc, 0x00, 0xff, 0x01, 0x3a, 0xfe, 0xf0, 0x00, 0xff, 0x07, 0x51, 0xfe, 0x61, 0x00, 0xff, 0x07, 0x52, 0xfd, 0xe6, 0x01, 0x02, 0x00, 0x4f, 0xff, 0x3f, 0x01, 0x0a, 0x07, 0x51, 0xff, 0x6b, 0x01, 0x0a, 0x07, 0x52, 0xff, 0x90, 0x01, 0x0a, 0x07, 0x53, 0xff, 0xa4, 0x01, 0x16, 0x00, 0x10, 0xff, 0xad, 0x01, 0x16, 0x00, 0x11, 0xff, 0xb7, 0x01, 0x16, 0x00, 0x1d, 0xff, 0xc1, 0x01, 0x16, 0x00, 0x24, 0xff, 0xad, 0x01, 0x16, 0x00, 0x26, 0xff, 0x9a, 0x01, 0x16, 0x00, 0x37, 0xff, 0x6b, 0x01, 0x16, 0x00, 0x39, 0xff, 0x90, 0x01, 0x16, 0x00, 0x3a, 0xff, 0xad, 0x01, 0x16, 0x00, 0x3c, 0xff, 0x7d, 0x01, 0x16, 0x00, 0x44, 0xff, 0xd3, 0x01, 0x16, 0x00, 0x48, 0xff, 0xa4, 0x01, 0x16, 0x00, 0x52, 0xff, 0xa4, 0x01, 0x16, 0x00, 0x58, 0xff, 0xa4, 0x01, 0x16, 0x00, 0x5c, 0xff, 0x90, 0x01, 0x16, 0x00, 0x6d, 0xff, 0x90, 0x01, 0x16, 0x00, 0x7d, 0xff, 0xdc, 0x01, 0x16, 0x00, 0x82, 0xff, 0xad, 0x01, 0x16, 0x00, 0x83, 0xff, 0xad, 0x01, 0x16, 0x00, 0x84, 0xff, 0xad, 0x01, 0x16, 0x00, 0x85, 0xff, 0xad, 0x01, 0x16, 0x00, 0x86, 0xff, 0xad, 0x01, 0x16, 0x00, 0x89, 0xff, 0x9a, 0x01, 0x16, 0x00, 0x9f, 0xff, 0x7d, 0x01, 0x16, 0x00, 0xa2, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa3, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa4, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa5, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa6, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa7, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xaa, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xab, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xac, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xad, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb4, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb5, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb6, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb7, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb8, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbb, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbc, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbd, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbe, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbf, 0xff, 0x90, 0x01, 0x16, 0x00, 0xc1, 0xff, 0x90, 0x01, 0x16, 0x00, 0xc8, 0xff, 0x9a, 0x01, 0x16, 0x00, 0xce, 0xff, 0x9a, 0x01, 0x16, 0x00, 0xdd, 0xff, 0xa4, 0x01, 0x16, 0x01, 0x26, 0xff, 0x6b, 0x01, 0x16, 0x01, 0x31, 0xff, 0xa4, 0x01, 0x16, 0x01, 0x3a, 0xff, 0x7d, 0x01, 0x16, 0x07, 0x51, 0xff, 0x6b, 0x01, 0x16, 0x07, 0x52, 0xff, 0x7d, 0x01, 0x16, 0x07, 0x53, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x10, 0xff, 0x7d, 0x01, 0x17, 0x00, 0x11, 0xff, 0x44, 0x01, 0x17, 0x00, 0x1d, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x46, 0xff, 0xd3, 0x01, 0x17, 0x00, 0x47, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x48, 0xff, 0xd3, 0x01, 0x17, 0x00, 0x4a, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x4b, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x50, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x51, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x52, 0xff, 0xd3, 0x01, 0x17, 0x00, 0x54, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x55, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x5b, 0xff, 0xc9, 0x01, 0x17, 0x00, 0x6d, 0xff, 0xb7, 0x01, 0x17, 0x00, 0xa9, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xaa, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xab, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xac, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xad, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb3, 0xff, 0xdc, 0x01, 0x17, 0x00, 0xb4, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb5, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb6, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb7, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb8, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xc9, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xcf, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xd1, 0x00, 0x48, 0x01, 0x17, 0x00, 0xdd, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xe1, 0xff, 0xdc, 0x01, 0x17, 0x01, 0x0a, 0xff, 0xdc, 0x01, 0x17, 0x01, 0x17, 0xff, 0xdc, 0x01, 0x17, 0x01, 0x1b, 0xff, 0xdc, 0x01, 0x17, 0x07, 0x52, 0x00, 0x56, 0x01, 0x17, 0x07, 0x53, 0xfe, 0xc9, 0x01, 0x1a, 0x00, 0x10, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x11, 0xff, 0xb7, 0x01, 0x1a, 0x00, 0x1d, 0xff, 0xc1, 0x01, 0x1a, 0x00, 0x24, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x26, 0xff, 0x9a, 0x01, 0x1a, 0x00, 0x37, 0xff, 0x6b, 0x01, 0x1a, 0x00, 0x39, 0xff, 0x90, 0x01, 0x1a, 0x00, 0x3a, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x3c, 0xff, 0x7d, 0x01, 0x1a, 0x00, 0x44, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0x48, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0x52, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0x58, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0x5c, 0xff, 0x90, 0x01, 0x1a, 0x00, 0x6d, 0xff, 0x90, 0x01, 0x1a, 0x00, 0x7d, 0xff, 0xdc, 0x01, 0x1a, 0x00, 0x82, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x83, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x84, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x85, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x86, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x89, 0xff, 0x9a, 0x01, 0x1a, 0x00, 0x9f, 0xff, 0x7d, 0x01, 0x1a, 0x00, 0xa2, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa3, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa4, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa5, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa6, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa7, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xaa, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xab, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xac, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xad, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb4, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb5, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb6, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb7, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb8, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbb, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbc, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbd, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbe, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbf, 0xff, 0x90, 0x01, 0x1a, 0x00, 0xc1, 0xff, 0x90, 0x01, 0x1a, 0x00, 0xc8, 0xff, 0x9a, 0x01, 0x1a, 0x00, 0xce, 0xff, 0x9a, 0x01, 0x1a, 0x00, 0xdd, 0xff, 0xa4, 0x01, 0x1a, 0x01, 0x26, 0xff, 0x6b, 0x01, 0x1a, 0x01, 0x31, 0xff, 0xa4, 0x01, 0x1a, 0x01, 0x3a, 0xff, 0x7d, 0x01, 0x1a, 0x07, 0x51, 0xff, 0x6b, 0x01, 0x1a, 0x07, 0x52, 0xff, 0x7d, 0x01, 0x1a, 0x07, 0x53, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x10, 0xff, 0x7d, 0x01, 0x1b, 0x00, 0x11, 0xff, 0x44, 0x01, 0x1b, 0x00, 0x1d, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x46, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0x47, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x48, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0x4a, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x4b, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x50, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x51, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x52, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0x54, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x55, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x5b, 0xff, 0xc9, 0x01, 0x1b, 0x00, 0x6d, 0xff, 0xb7, 0x01, 0x1b, 0x00, 0xa9, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xaa, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xab, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xac, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xad, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb3, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0xb4, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb5, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb6, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb7, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb8, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xc9, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xcf, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xd1, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0xdd, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xe1, 0xff, 0xdc, 0x01, 0x1b, 0x01, 0x0a, 0xff, 0xdc, 0x01, 0x1b, 0x01, 0x17, 0xff, 0xdc, 0x01, 0x1b, 0x01, 0x1b, 0xff, 0xdc, 0x01, 0x1b, 0x07, 0x52, 0x00, 0x56, 0x01, 0x1b, 0x07, 0x53, 0xfe, 0xc9, 0x01, 0x20, 0x00, 0x24, 0x00, 0x26, 0x01, 0x20, 0x00, 0x82, 0x00, 0x26, 0x01, 0x20, 0x00, 0x83, 0x00, 0x26, 0x01, 0x20, 0x00, 0x84, 0x00, 0x26, 0x01, 0x20, 0x00, 0x85, 0x00, 0x26, 0x01, 0x20, 0x00, 0x86, 0x00, 0x26, 0x01, 0x22, 0x00, 0x24, 0x00, 0x26, 0x01, 0x22, 0x00, 0x82, 0x00, 0x26, 0x01, 0x22, 0x00, 0x83, 0x00, 0x26, 0x01, 0x22, 0x00, 0x84, 0x00, 0x26, 0x01, 0x22, 0x00, 0x85, 0x00, 0x26, 0x01, 0x22, 0x00, 0x86, 0x00, 0x26, 0x01, 0x26, 0x00, 0x10, 0xff, 0x44, 0x01, 0x26, 0x00, 0x11, 0xff, 0x0d, 0x01, 0x26, 0x00, 0x1d, 0xff, 0x1f, 0x01, 0x26, 0x00, 0x24, 0xff, 0x61, 0x01, 0x26, 0x00, 0x26, 0xff, 0x88, 0x01, 0x26, 0x00, 0x37, 0xff, 0xdc, 0x01, 0x26, 0x00, 0x44, 0xfe, 0xad, 0x01, 0x26, 0x00, 0x46, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0x48, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0x4c, 0xff, 0xc1, 0x01, 0x26, 0x00, 0x52, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0x55, 0xfe, 0xd3, 0x01, 0x26, 0x00, 0x56, 0xfe, 0xad, 0x01, 0x26, 0x00, 0x58, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0x5a, 0xfe, 0xad, 0x01, 0x26, 0x00, 0x5c, 0xfe, 0xc1, 0x01, 0x26, 0x00, 0x6d, 0xff, 0x44, 0x01, 0x26, 0x00, 0x7d, 0xff, 0x90, 0x01, 0x26, 0x00, 0x82, 0xff, 0x61, 0x01, 0x26, 0x00, 0x83, 0xff, 0x61, 0x01, 0x26, 0x00, 0x84, 0xff, 0x61, 0x01, 0x26, 0x00, 0x85, 0xff, 0x61, 0x01, 0x26, 0x00, 0x86, 0xff, 0x61, 0x01, 0x26, 0x00, 0x89, 0xff, 0x88, 0x01, 0x26, 0x00, 0xa2, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa3, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa4, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa5, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa6, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa7, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa9, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xaa, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xab, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xac, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xad, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb4, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb5, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb6, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb7, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb8, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xbb, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0xbc, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0xbd, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0xbe, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0xbf, 0xfe, 0xc1, 0x01, 0x26, 0x00, 0xc1, 0xfe, 0xc1, 0x01, 0x26, 0x00, 0xc8, 0xff, 0x88, 0x01, 0x26, 0x00, 0xc9, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xce, 0xff, 0x88, 0x01, 0x26, 0x00, 0xcf, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xdd, 0xfe, 0xa4, 0x01, 0x26, 0x01, 0x17, 0xfe, 0xd3, 0x01, 0x26, 0x01, 0x1b, 0xfe, 0xd3, 0x01, 0x26, 0x01, 0x21, 0xfe, 0xad, 0x01, 0x26, 0x01, 0x23, 0xfe, 0xad, 0x01, 0x26, 0x01, 0x26, 0xff, 0xdc, 0x01, 0x26, 0x01, 0x31, 0xfe, 0xc9, 0x01, 0x26, 0x07, 0x52, 0xff, 0xd3, 0x01, 0x26, 0x07, 0x53, 0xfe, 0xf8, 0x01, 0x30, 0x00, 0x3d, 0xff, 0xdc, 0x01, 0x30, 0x01, 0x3f, 0xff, 0xdc, 0x01, 0x3a, 0x00, 0x10, 0xff, 0x0d, 0x01, 0x3a, 0x00, 0x11, 0xfe, 0x61, 0x01, 0x3a, 0x00, 0x1d, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0x24, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x26, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x32, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x44, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0x48, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0x4c, 0xff, 0xb7, 0x01, 0x3a, 0x00, 0x52, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0x58, 0xff, 0x15, 0x01, 0x3a, 0x00, 0x6d, 0xff, 0x1f, 0x01, 0x3a, 0x00, 0x7d, 0xff, 0x6b, 0x01, 0x3a, 0x00, 0x82, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x83, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x84, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x85, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x86, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x89, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x94, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x95, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x96, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x97, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x98, 0xff, 0x90, 0x01, 0x3a, 0x00, 0xa2, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa3, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa4, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa5, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa6, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa7, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xaa, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xab, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xac, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xad, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb4, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb5, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb6, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb7, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb8, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xbb, 0xff, 0x15, 0x01, 0x3a, 0x00, 0xbc, 0xff, 0x15, 0x01, 0x3a, 0x00, 0xbd, 0xff, 0x15, 0x01, 0x3a, 0x00, 0xbe, 0xff, 0x15, 0x01, 0x3a, 0x00, 0xc8, 0xff, 0x90, 0x01, 0x3a, 0x00, 0xce, 0xff, 0x90, 0x01, 0x3a, 0x00, 0xdd, 0xfe, 0xf0, 0x01, 0x3a, 0x01, 0x31, 0xff, 0x15, 0x01, 0x3a, 0x07, 0x51, 0xff, 0x90, 0x01, 0x3a, 0x07, 0x52, 0xff, 0xdc, 0x01, 0x3a, 0x07, 0x53, 0xfe, 0xf8, 0x01, 0x3f, 0x00, 0x10, 0xff, 0xdc, 0x01, 0x3f, 0x07, 0x51, 0xff, 0xdc, 0x01, 0x3f, 0x07, 0x52, 0xff, 0xdc, 0x01, 0x3f, 0x07, 0x53, 0xff, 0xdc, 0x07, 0x45, 0x00, 0x24, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x25, 0xff, 0xb7, 0x07, 0x45, 0x00, 0x2a, 0x00, 0x4b, 0x07, 0x45, 0x00, 0x2d, 0x00, 0x72, 0x07, 0x45, 0x00, 0x32, 0x00, 0x39, 0x07, 0x45, 0x00, 0x34, 0x00, 0x4b, 0x07, 0x45, 0x00, 0x37, 0xff, 0x44, 0x07, 0x45, 0x00, 0x39, 0xff, 0x88, 0x07, 0x45, 0x00, 0x3a, 0xff, 0xad, 0x07, 0x45, 0x00, 0x3b, 0xff, 0x9a, 0x07, 0x45, 0x00, 0x3c, 0xff, 0x0d, 0x07, 0x45, 0x00, 0x52, 0x00, 0x26, 0x07, 0x45, 0x00, 0x59, 0xff, 0xc9, 0x07, 0x45, 0x00, 0x5c, 0xff, 0xdc, 0x07, 0x45, 0x00, 0x82, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x83, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x84, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x85, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x86, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x94, 0x00, 0x39, 0x07, 0x45, 0x00, 0x95, 0x00, 0x39, 0x07, 0x45, 0x00, 0x96, 0x00, 0x39, 0x07, 0x45, 0x00, 0x97, 0x00, 0x39, 0x07, 0x45, 0x00, 0x98, 0x00, 0x39, 0x07, 0x45, 0x00, 0x9f, 0xff, 0x0d, 0x07, 0x45, 0x00, 0xb4, 0x00, 0x26, 0x07, 0x45, 0x00, 0xb5, 0x00, 0x26, 0x07, 0x45, 0x00, 0xb6, 0x00, 0x26, 0x07, 0x45, 0x00, 0xb7, 0x00, 0x26, 0x07, 0x45, 0x00, 0xb8, 0x00, 0x26, 0x07, 0x45, 0x00, 0xbf, 0xff, 0xdc, 0x07, 0x45, 0x00, 0xc1, 0xff, 0xdc, 0x07, 0x45, 0x00, 0xe0, 0x00, 0x4b, 0x07, 0x45, 0x01, 0x26, 0xff, 0x44, 0x07, 0x45, 0x01, 0x3a, 0xff, 0x0d, 0x07, 0x51, 0x00, 0x24, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x25, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x26, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x27, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x29, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x2a, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x2b, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x2d, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x2e, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x2f, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x32, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x33, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x34, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x35, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x3b, 0xff, 0x88, 0x07, 0x51, 0x00, 0x3d, 0xff, 0xdc, 0x07, 0x51, 0x00, 0x49, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x51, 0xff, 0x90, 0x07, 0x51, 0x00, 0x52, 0xff, 0x6b, 0x07, 0x51, 0x00, 0x55, 0xff, 0x90, 0x07, 0x51, 0x00, 0x59, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x5a, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x5c, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x82, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x83, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x84, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x85, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x86, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x88, 0xfe, 0x7d, 0x07, 0x51, 0x00, 0x89, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x94, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x95, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x96, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x97, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x98, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xa0, 0xff, 0xc1, 0x07, 0x51, 0x00, 0xa1, 0xff, 0xc1, 0x07, 0x51, 0x00, 0xb2, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xb3, 0xff, 0x90, 0x07, 0x51, 0x00, 0xb4, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xb5, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xb6, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xb7, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xb8, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xbf, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xc1, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xc8, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xce, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xd0, 0xff, 0xc1, 0x07, 0x51, 0x00, 0xe0, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xfb, 0xff, 0xc1, 0x07, 0x51, 0x00, 0xff, 0xff, 0xc1, 0x07, 0x51, 0x01, 0x0a, 0xff, 0x90, 0x07, 0x51, 0x01, 0x16, 0xff, 0xc1, 0x07, 0x51, 0x01, 0x17, 0xff, 0x90, 0x07, 0x51, 0x01, 0x1a, 0xff, 0xc1, 0x07, 0x51, 0x01, 0x1b, 0xff, 0x90, 0x07, 0x51, 0x01, 0x3f, 0xff, 0xdc, 0x07, 0x51, 0x0e, 0x78, 0xff, 0xc1, 0x07, 0x53, 0x00, 0x24, 0x00, 0x26, 0x07, 0x53, 0x00, 0x25, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x26, 0xff, 0x90, 0x07, 0x53, 0x00, 0x27, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x29, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x2a, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x2b, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x2d, 0x00, 0x2f, 0x07, 0x53, 0x00, 0x2e, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x2f, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x32, 0xff, 0x90, 0x07, 0x53, 0x00, 0x33, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x34, 0xff, 0x90, 0x07, 0x53, 0x00, 0x35, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x37, 0xfe, 0xe6, 0x07, 0x53, 0x00, 0x39, 0xfe, 0x88, 0x07, 0x53, 0x00, 0x3a, 0xff, 0x03, 0x07, 0x53, 0x00, 0x3b, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x3c, 0xfe, 0x88, 0x07, 0x53, 0x00, 0x49, 0xff, 0xdc, 0x07, 0x53, 0x00, 0x51, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x52, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x55, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x59, 0xff, 0x15, 0x07, 0x53, 0x00, 0x5a, 0xff, 0x3c, 0x07, 0x53, 0x00, 0x5c, 0xff, 0x90, 0x07, 0x53, 0x00, 0x82, 0x00, 0x26, 0x07, 0x53, 0x00, 0x83, 0x00, 0x26, 0x07, 0x53, 0x00, 0x84, 0x00, 0x26, 0x07, 0x53, 0x00, 0x85, 0x00, 0x26, 0x07, 0x53, 0x00, 0x86, 0x00, 0x26, 0x07, 0x53, 0x00, 0x88, 0x00, 0x26, 0x07, 0x53, 0x00, 0x89, 0xff, 0x90, 0x07, 0x53, 0x00, 0x94, 0xff, 0x90, 0x07, 0x53, 0x00, 0x95, 0xff, 0x90, 0x07, 0x53, 0x00, 0x96, 0xff, 0x90, 0x07, 0x53, 0x00, 0x97, 0xff, 0x90, 0x07, 0x53, 0x00, 0x98, 0xff, 0x90, 0x07, 0x53, 0x00, 0x9f, 0xfe, 0x88, 0x07, 0x53, 0x00, 0xa0, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xa1, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb2, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb3, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb4, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb5, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb6, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb7, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb8, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xbf, 0xff, 0x90, 0x07, 0x53, 0x00, 0xc1, 0xff, 0x90, 0x07, 0x53, 0x00, 0xc8, 0xff, 0x90, 0x07, 0x53, 0x00, 0xce, 0xff, 0x90, 0x07, 0x53, 0x00, 0xd0, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xe0, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xfb, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xff, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x0a, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x16, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x17, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x1a, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x1b, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x26, 0xfe, 0xe6, 0x07, 0x53, 0x01, 0x3a, 0xfe, 0x88, 0x07, 0x53, 0x0e, 0x78, 0xff, 0xb7, 0x0e, 0x60, 0x00, 0x10, 0xff, 0x44, 0x0e, 0x60, 0x00, 0x11, 0xff, 0x0d, 0x0e, 0x60, 0x00, 0x1d, 0xff, 0x1f, 0x0e, 0x60, 0x00, 0x24, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x26, 0xff, 0x88, 0x0e, 0x60, 0x00, 0x37, 0xff, 0xdc, 0x0e, 0x60, 0x00, 0x44, 0xfe, 0xad, 0x0e, 0x60, 0x00, 0x46, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0x48, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0x4c, 0xff, 0xc1, 0x0e, 0x60, 0x00, 0x52, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0x55, 0xfe, 0xd3, 0x0e, 0x60, 0x00, 0x56, 0xfe, 0xad, 0x0e, 0x60, 0x00, 0x58, 0xfe, 0xc9, 0x0e, 0x60, 0x00, 0x5a, 0xfe, 0xad, 0x0e, 0x60, 0x00, 0x5c, 0xfe, 0xc1, 0x0e, 0x60, 0x00, 0x6d, 0xff, 0x44, 0x0e, 0x60, 0x00, 0x7d, 0xff, 0x90, 0x0e, 0x60, 0x00, 0x82, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x83, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x84, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x85, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x86, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x89, 0xff, 0x88, 0x0e, 0x60, 0x00, 0xa2, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa3, 0xfe, 0xad, 0x0e, 0x60, 0x00, 0xa4, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa5, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa6, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa7, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa9, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xaa, 0xfe, 0xe0, 0x0e, 0x60, 0x00, 0xab, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xac, 0xfe, 0xe0, 0x0e, 0x60, 0x00, 0xad, 0xfe, 0xe0, 0x0e, 0x60, 0x00, 0xb4, 0xfe, 0xf4, 0x0e, 0x60, 0x00, 0xb5, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xb6, 0xfe, 0xf4, 0x0e, 0x60, 0x00, 0xb7, 0xfe, 0xf4, 0x0e, 0x60, 0x00, 0xb8, 0xfe, 0xf4, 0x0e, 0x60, 0x00, 0xbb, 0xfe, 0xe7, 0x0e, 0x60, 0x00, 0xbc, 0xfe, 0xc9, 0x0e, 0x60, 0x00, 0xbd, 0xfe, 0xe7, 0x0e, 0x60, 0x00, 0xbe, 0xfe, 0xe7, 0x0e, 0x60, 0x00, 0xbf, 0xfe, 0xc1, 0x0e, 0x60, 0x00, 0xc1, 0xfe, 0xc1, 0x0e, 0x60, 0x00, 0xc8, 0xff, 0x88, 0x0e, 0x60, 0x00, 0xc9, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xce, 0xff, 0x88, 0x0e, 0x60, 0x00, 0xcf, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xdd, 0xfe, 0xa4, 0x0e, 0x60, 0x01, 0x17, 0xfe, 0xd3, 0x0e, 0x60, 0x01, 0x1b, 0xfe, 0xd3, 0x0e, 0x60, 0x01, 0x21, 0xfe, 0xad, 0x0e, 0x60, 0x01, 0x23, 0xfe, 0xad, 0x0e, 0x60, 0x01, 0x26, 0xff, 0xdc, 0x0e, 0x60, 0x01, 0x31, 0xfe, 0xc9, 0x0e, 0x60, 0x07, 0x52, 0xff, 0xd3, 0x0e, 0x60, 0x07, 0x53, 0xfe, 0xf8, 0x0e, 0x78, 0x00, 0x10, 0xff, 0x29, 0x0e, 0x78, 0x00, 0x24, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x26, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x32, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x37, 0xff, 0x61, 0x0e, 0x78, 0x00, 0x38, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x3a, 0xff, 0xb7, 0x0e, 0x78, 0x00, 0x3c, 0xff, 0xb7, 0x0e, 0x78, 0x00, 0x44, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x48, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0x52, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0x58, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0x5c, 0xff, 0x6b, 0x0e, 0x78, 0x00, 0x6d, 0xff, 0x7d, 0x0e, 0x78, 0x00, 0x82, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x83, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x84, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x85, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x86, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x89, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x94, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x95, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x96, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x97, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x98, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x9b, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x9c, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x9d, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x9e, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x9f, 0xff, 0xb7, 0x0e, 0x78, 0x00, 0xa2, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa3, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa4, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa5, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa6, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa7, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xaa, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xab, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xac, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xad, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb4, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb5, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb6, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb7, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb8, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbb, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbc, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbd, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbe, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbf, 0xff, 0x6b, 0x0e, 0x78, 0x00, 0xc1, 0xff, 0x6b, 0x0e, 0x78, 0x00, 0xc8, 0xff, 0x90, 0x0e, 0x78, 0x00, 0xce, 0xff, 0x90, 0x0e, 0x78, 0x00, 0xdd, 0xff, 0x9a, 0x0e, 0x78, 0x01, 0x26, 0xff, 0x61, 0x0e, 0x78, 0x01, 0x30, 0xff, 0xc9, 0x0e, 0x78, 0x01, 0x31, 0xff, 0x9a, 0x0e, 0x78, 0x01, 0x3a, 0xff, 0xb7, 0x0e, 0x78, 0x07, 0x51, 0xff, 0xc1, 0x0e, 0x78, 0x07, 0x52, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0x44, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0x48, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0x52, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0x58, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0x5c, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xa2, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa3, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa4, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa5, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa6, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa7, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xaa, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xab, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xac, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xad, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb4, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb5, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb6, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb7, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb8, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xbb, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0xbc, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0xbd, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0xbe, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0xbf, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xc1, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xdd, 0xff, 0xb7, 0x0e, 0x79, 0x01, 0x31, 0xff, 0xc1, 0x0e, 0xaa, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xab, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xac, 0x0e, 0xc2, 0xff, 0xa3, 0x0e, 0xad, 0x0e, 0xc2, 0xff, 0x9c, 0x0e, 0xae, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xb0, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xb1, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xb2, 0x0e, 0xc2, 0xff, 0xa3, 0x0e, 0xb3, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xb4, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xb6, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xb7, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xb8, 0x0e, 0xc2, 0xff, 0xa3, 0x0e, 0xb9, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xba, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xbc, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xbd, 0x0e, 0xc2, 0xff, 0x9c, 0x0e, 0xbe, 0x0e, 0xc2, 0xff, 0xa3, 0x0e, 0xbf, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xc0, 0x0e, 0xc2, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x00, 0x02, 0xc8, 0x00, 0x00, 0x02, 0xe4, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x03, 0x58, 0x00, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x03, 0xd8, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x04, 0x2c, 0x00, 0x00, 0x04, 0x48, 0x00, 0x00, 0x04, 0xa4, 0x00, 0x00, 0x04, 0xd4, 0x00, 0x00, 0x05, 0x34, 0x00, 0x00, 0x05, 0xac, 0x00, 0x00, 0x05, 0xe8, 0x00, 0x00, 0x06, 0x48, 0x00, 0x00, 0x06, 0xc0, 0x00, 0x00, 0x06, 0xe8, 0x00, 0x00, 0x07, 0x74, 0x00, 0x00, 0x07, 0xec, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x68, 0x00, 0x00, 0x08, 0x90, 0x00, 0x00, 0x08, 0xb8, 0x00, 0x00, 0x09, 0x2c, 0x00, 0x00, 0x0a, 0x14, 0x00, 0x00, 0x0a, 0x4c, 0x00, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x0b, 0x14, 0x00, 0x00, 0x0b, 0x64, 0x00, 0x00, 0x0b, 0x94, 0x00, 0x00, 0x0b, 0xc0, 0x00, 0x00, 0x0c, 0x28, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x00, 0x0c, 0x74, 0x00, 0x00, 0x0c, 0xa0, 0x00, 0x00, 0x0c, 0xd4, 0x00, 0x00, 0x0c, 0xf4, 0x00, 0x00, 0x0d, 0x30, 0x00, 0x00, 0x0d, 0x60, 0x00, 0x00, 0x0d, 0xc4, 0x00, 0x00, 0x0e, 0x08, 0x00, 0x00, 0x0e, 0x7c, 0x00, 0x00, 0x0e, 0xe0, 0x00, 0x00, 0x0f, 0x58, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x0f, 0xc4, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x10, 0x30, 0x00, 0x00, 0x10, 0x70, 0x00, 0x00, 0x10, 0xa0, 0x00, 0x00, 0x10, 0xd0, 0x00, 0x00, 0x10, 0xf4, 0x00, 0x00, 0x11, 0x14, 0x00, 0x00, 0x11, 0x38, 0x00, 0x00, 0x11, 0x64, 0x00, 0x00, 0x11, 0x80, 0x00, 0x00, 0x11, 0xa0, 0x00, 0x00, 0x12, 0x10, 0x00, 0x00, 0x12, 0x70, 0x00, 0x00, 0x12, 0xc8, 0x00, 0x00, 0x13, 0x28, 0x00, 0x00, 0x13, 0x8c, 0x00, 0x00, 0x13, 0xcc, 0x00, 0x00, 0x14, 0x48, 0x00, 0x00, 0x14, 0x8c, 0x00, 0x00, 0x14, 0xb0, 0x00, 0x00, 0x14, 0xe8, 0x00, 0x00, 0x15, 0x1c, 0x00, 0x00, 0x15, 0x38, 0x00, 0x00, 0x15, 0xa0, 0x00, 0x00, 0x15, 0xe4, 0x00, 0x00, 0x16, 0x38, 0x00, 0x00, 0x16, 0x98, 0x00, 0x00, 0x16, 0xf8, 0x00, 0x00, 0x17, 0x38, 0x00, 0x00, 0x17, 0xb0, 0x00, 0x00, 0x17, 0xf4, 0x00, 0x00, 0x18, 0x3c, 0x00, 0x00, 0x18, 0x64, 0x00, 0x00, 0x18, 0xa0, 0x00, 0x00, 0x18, 0xe0, 0x00, 0x00, 0x19, 0x20, 0x00, 0x00, 0x19, 0x50, 0x00, 0x00, 0x19, 0xb4, 0x00, 0x00, 0x19, 0xd0, 0x00, 0x00, 0x1a, 0x34, 0x00, 0x00, 0x1a, 0x94, 0x00, 0x00, 0x1a, 0x94, 0x00, 0x00, 0x1a, 0xc4, 0x00, 0x00, 0x1b, 0x3c, 0x00, 0x00, 0x1b, 0x94, 0x00, 0x00, 0x1c, 0x28, 0x00, 0x00, 0x1c, 0x84, 0x00, 0x00, 0x1c, 0xb0, 0x00, 0x00, 0x1d, 0x68, 0x00, 0x00, 0x1d, 0x90, 0x00, 0x00, 0x1e, 0x6c, 0x00, 0x00, 0x1e, 0xe8, 0x00, 0x00, 0x1f, 0x2c, 0x00, 0x00, 0x1f, 0x4c, 0x00, 0x00, 0x1f, 0x68, 0x00, 0x00, 0x20, 0x50, 0x00, 0x00, 0x20, 0x6c, 0x00, 0x00, 0x20, 0xc4, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x21, 0x58, 0x00, 0x00, 0x21, 0xcc, 0x00, 0x00, 0x21, 0xe8, 0x00, 0x00, 0x22, 0x4c, 0x00, 0x00, 0x22, 0x84, 0x00, 0x00, 0x22, 0x9c, 0x00, 0x00, 0x22, 0xe0, 0x00, 0x00, 0x23, 0x0c, 0x00, 0x00, 0x23, 0x68, 0x00, 0x00, 0x23, 0xb0, 0x00, 0x00, 0x23, 0xd0, 0x00, 0x00, 0x23, 0xf0, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x24, 0x84, 0x00, 0x00, 0x24, 0x9c, 0x00, 0x00, 0x24, 0xb4, 0x00, 0x00, 0x24, 0xd0, 0x00, 0x00, 0x24, 0xec, 0x00, 0x00, 0x25, 0x08, 0x00, 0x00, 0x25, 0x7c, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00, 0x25, 0xe4, 0x00, 0x00, 0x25, 0xfc, 0x00, 0x00, 0x26, 0x14, 0x00, 0x00, 0x26, 0x30, 0x00, 0x00, 0x26, 0x4c, 0x00, 0x00, 0x26, 0x64, 0x00, 0x00, 0x26, 0x7c, 0x00, 0x00, 0x26, 0x98, 0x00, 0x00, 0x26, 0xb4, 0x00, 0x00, 0x27, 0x18, 0x00, 0x00, 0x27, 0x34, 0x00, 0x00, 0x27, 0x4c, 0x00, 0x00, 0x27, 0x64, 0x00, 0x00, 0x27, 0x80, 0x00, 0x00, 0x27, 0x9c, 0x00, 0x00, 0x27, 0xb8, 0x00, 0x00, 0x27, 0xfc, 0x00, 0x00, 0x28, 0x94, 0x00, 0x00, 0x28, 0xac, 0x00, 0x00, 0x28, 0xc4, 0x00, 0x00, 0x28, 0xe0, 0x00, 0x00, 0x28, 0xfc, 0x00, 0x00, 0x29, 0x14, 0x00, 0x00, 0x29, 0x5c, 0x00, 0x00, 0x29, 0xe8, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x18, 0x00, 0x00, 0x2a, 0x30, 0x00, 0x00, 0x2a, 0x48, 0x00, 0x00, 0x2a, 0x60, 0x00, 0x00, 0x2a, 0x78, 0x00, 0x00, 0x2b, 0x30, 0x00, 0x00, 0x2b, 0x48, 0x00, 0x00, 0x2b, 0x60, 0x00, 0x00, 0x2b, 0x78, 0x00, 0x00, 0x2b, 0x90, 0x00, 0x00, 0x2b, 0xa8, 0x00, 0x00, 0x2b, 0xc0, 0x00, 0x00, 0x2b, 0xd8, 0x00, 0x00, 0x2b, 0xf4, 0x00, 0x00, 0x2c, 0x10, 0x00, 0x00, 0x2c, 0x98, 0x00, 0x00, 0x2c, 0xb0, 0x00, 0x00, 0x2c, 0xc8, 0x00, 0x00, 0x2c, 0xe0, 0x00, 0x00, 0x2c, 0xf8, 0x00, 0x00, 0x2d, 0x10, 0x00, 0x00, 0x2d, 0x28, 0x00, 0x00, 0x2d, 0x5c, 0x00, 0x00, 0x2d, 0xec, 0x00, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x2e, 0x1c, 0x00, 0x00, 0x2e, 0x34, 0x00, 0x00, 0x2e, 0x4c, 0x00, 0x00, 0x2e, 0x64, 0x00, 0x00, 0x2e, 0xc4, 0x00, 0x00, 0x2e, 0xdc, 0x00, 0x00, 0x2e, 0xf8, 0x00, 0x00, 0x2f, 0x10, 0x00, 0x00, 0x2f, 0x2c, 0x00, 0x00, 0x2f, 0x44, 0x00, 0x00, 0x2f, 0x5c, 0x00, 0x00, 0x2f, 0x74, 0x00, 0x00, 0x2f, 0x8c, 0x00, 0x00, 0x2f, 0xa4, 0x00, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0x2f, 0xd8, 0x00, 0x00, 0x2f, 0xf0, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x30, 0x24, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00, 0x30, 0x54, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 0x30, 0x80, 0x00, 0x00, 0x30, 0xf4, 0x00, 0x00, 0x31, 0x0c, 0x00, 0x00, 0x31, 0x28, 0x00, 0x00, 0x31, 0x44, 0x00, 0x00, 0x31, 0x60, 0x00, 0x00, 0x31, 0x78, 0x00, 0x00, 0x31, 0x90, 0x00, 0x00, 0x31, 0xa8, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00, 0x31, 0xdc, 0x00, 0x00, 0x31, 0xf8, 0x00, 0x00, 0x32, 0x14, 0x00, 0x00, 0x32, 0x2c, 0x00, 0x00, 0x32, 0x44, 0x00, 0x00, 0x32, 0x5c, 0x00, 0x00, 0x32, 0x78, 0x00, 0x00, 0x32, 0x90, 0x00, 0x00, 0x32, 0xa8, 0x00, 0x00, 0x32, 0xc0, 0x00, 0x00, 0x32, 0xdc, 0x00, 0x00, 0x32, 0xf8, 0x00, 0x00, 0x33, 0x44, 0x00, 0x00, 0x33, 0x9c, 0x00, 0x00, 0x33, 0xb8, 0x00, 0x00, 0x33, 0xd4, 0x00, 0x00, 0x33, 0xf0, 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x34, 0x28, 0x00, 0x00, 0x34, 0x44, 0x00, 0x00, 0x34, 0x5c, 0x00, 0x00, 0x34, 0x74, 0x00, 0x00, 0x34, 0x90, 0x00, 0x00, 0x34, 0xb0, 0x00, 0x00, 0x34, 0xcc, 0x00, 0x00, 0x34, 0xe8, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x35, 0x20, 0x00, 0x00, 0x35, 0x38, 0x00, 0x00, 0x35, 0x50, 0x00, 0x00, 0x35, 0x84, 0x00, 0x00, 0x35, 0x9c, 0x00, 0x00, 0x35, 0xb8, 0x00, 0x00, 0x35, 0xd0, 0x00, 0x00, 0x35, 0xec, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x36, 0x20, 0x00, 0x00, 0x36, 0x38, 0x00, 0x00, 0x36, 0x54, 0x00, 0x00, 0x36, 0x90, 0x00, 0x00, 0x36, 0xc4, 0x00, 0x00, 0x36, 0xe0, 0x00, 0x00, 0x36, 0xf8, 0x00, 0x00, 0x37, 0x10, 0x00, 0x00, 0x37, 0x28, 0x00, 0x00, 0x37, 0x44, 0x00, 0x00, 0x37, 0x5c, 0x00, 0x00, 0x37, 0x74, 0x00, 0x00, 0x37, 0xd0, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, 0x38, 0x4c, 0x00, 0x00, 0x38, 0x64, 0x00, 0x00, 0x38, 0x80, 0x00, 0x00, 0x38, 0x98, 0x00, 0x00, 0x38, 0xb0, 0x00, 0x00, 0x38, 0xc8, 0x00, 0x00, 0x39, 0x2c, 0x00, 0x00, 0x39, 0xcc, 0x00, 0x00, 0x39, 0xe4, 0x00, 0x00, 0x39, 0xfc, 0x00, 0x00, 0x3a, 0x14, 0x00, 0x00, 0x3a, 0x2c, 0x00, 0x00, 0x3a, 0x48, 0x00, 0x00, 0x3a, 0x60, 0x00, 0x00, 0x3a, 0x78, 0x00, 0x00, 0x3a, 0x90, 0x00, 0x00, 0x3a, 0xac, 0x00, 0x00, 0x3a, 0xc4, 0x00, 0x00, 0x3a, 0xdc, 0x00, 0x00, 0x3a, 0xf4, 0x00, 0x00, 0x3b, 0x10, 0x00, 0x00, 0x3b, 0x2c, 0x00, 0x00, 0x3b, 0x44, 0x00, 0x00, 0x3b, 0x5c, 0x00, 0x00, 0x3b, 0x78, 0x00, 0x00, 0x3b, 0x94, 0x00, 0x00, 0x3b, 0xcc, 0x00, 0x00, 0x3c, 0x24, 0x00, 0x00, 0x3c, 0x40, 0x00, 0x00, 0x3c, 0x58, 0x00, 0x00, 0x3c, 0x74, 0x00, 0x00, 0x3c, 0x8c, 0x00, 0x00, 0x3c, 0xa8, 0x00, 0x00, 0x3c, 0xc0, 0x00, 0x00, 0x3c, 0xd8, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0x3d, 0x08, 0x00, 0x00, 0x3d, 0x20, 0x00, 0x00, 0x3d, 0x38, 0x00, 0x00, 0x3d, 0x50, 0x00, 0x00, 0x3d, 0x6c, 0x00, 0x00, 0x3d, 0x88, 0x00, 0x00, 0x3d, 0xa4, 0x00, 0x00, 0x3d, 0xbc, 0x00, 0x00, 0x3d, 0xd8, 0x00, 0x00, 0x3d, 0xf0, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x3e, 0x20, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, 0x3e, 0x54, 0x00, 0x00, 0x3e, 0x6c, 0x00, 0x00, 0x3e, 0xa4, 0x00, 0x00, 0x3f, 0x2c, 0x00, 0x00, 0x3f, 0xb0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x40, 0x3c, 0x00, 0x00, 0x40, 0x94, 0x00, 0x00, 0x40, 0xfc, 0x00, 0x00, 0x41, 0x58, 0x00, 0x00, 0x41, 0xd0, 0x00, 0x00, 0x42, 0x3c, 0x00, 0x00, 0x42, 0x4c, 0x00, 0x00, 0x42, 0xb4, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x43, 0x64, 0x00, 0x00, 0x43, 0xe4, 0x00, 0x00, 0x44, 0x18, 0x00, 0x00, 0x44, 0x80, 0x00, 0x00, 0x44, 0xf8, 0x00, 0x00, 0x45, 0x38, 0x00, 0x00, 0x45, 0x8c, 0x00, 0x00, 0x46, 0x08, 0x00, 0x00, 0x46, 0x88, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, 0x47, 0x34, 0x00, 0x00, 0x47, 0x60, 0x00, 0x00, 0x47, 0xb8, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x2c, 0x00, 0x00, 0x48, 0x74, 0x00, 0x00, 0x48, 0xec, 0x00, 0x00, 0x49, 0x2c, 0x00, 0x00, 0x49, 0x3c, 0x00, 0x00, 0x49, 0xac, 0x00, 0x00, 0x49, 0xc4, 0x00, 0x00, 0x49, 0xdc, 0x00, 0x00, 0x4a, 0x50, 0x00, 0x00, 0x4a, 0xc0, 0x00, 0x00, 0x4b, 0x1c, 0x00, 0x00, 0x4b, 0x8c, 0x00, 0x00, 0x4b, 0xf0, 0x00, 0x00, 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0xd4, 0x00, 0x00, 0x4c, 0xe4, 0x00, 0x00, 0x4d, 0x48, 0x00, 0x00, 0x4d, 0xa0, 0x00, 0x00, 0x4d, 0xd8, 0x00, 0x00, 0x4e, 0x2c, 0x00, 0x00, 0x4e, 0x64, 0x00, 0x00, 0x4e, 0x7c, 0x00, 0x00, 0x4e, 0x94, 0x00, 0x00, 0x4f, 0x04, 0x00, 0x00, 0x4f, 0x64, 0x00, 0x00, 0x4f, 0xbc, 0x00, 0x00, 0x50, 0x24, 0x00, 0x00, 0x50, 0x6c, 0x00, 0x00, 0x50, 0xb0, 0x00, 0x00, 0x51, 0x20, 0x00, 0x00, 0x51, 0x90, 0x00, 0x00, 0x51, 0xfc, 0x00, 0x00, 0x52, 0x68, 0x00, 0x00, 0x52, 0xdc, 0x00, 0x00, 0x53, 0x38, 0x00, 0x00, 0x53, 0x90, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x54, 0x70, 0x00, 0x00, 0x54, 0x88, 0x00, 0x00, 0x54, 0xcc, 0x00, 0x00, 0x54, 0xdc, 0x00, 0x00, 0x54, 0xf4, 0x00, 0x00, 0x55, 0x0c, 0x00, 0x00, 0x55, 0x24, 0x00, 0x00, 0x55, 0x3c, 0x00, 0x00, 0x55, 0x54, 0x00, 0x00, 0x55, 0x6c, 0x00, 0x00, 0x55, 0x84, 0x00, 0x00, 0x55, 0x9c, 0x00, 0x00, 0x55, 0xb4, 0x00, 0x00, 0x55, 0xd0, 0x00, 0x00, 0x55, 0xe8, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x56, 0x20, 0x00, 0x00, 0x56, 0x38, 0x00, 0x00, 0x56, 0x50, 0x00, 0x00, 0x56, 0x6c, 0x00, 0x00, 0x56, 0x84, 0x00, 0x00, 0x56, 0x9c, 0x00, 0x00, 0x56, 0xb4, 0x00, 0x00, 0x56, 0xcc, 0x00, 0x00, 0x56, 0xe4, 0x00, 0x00, 0x56, 0xfc, 0x00, 0x00, 0x57, 0x14, 0x00, 0x00, 0x57, 0x2c, 0x00, 0x00, 0x57, 0x44, 0x00, 0x00, 0x57, 0x54, 0x00, 0x00, 0x57, 0x6c, 0x00, 0x00, 0x57, 0x84, 0x00, 0x00, 0x57, 0x9c, 0x00, 0x00, 0x57, 0xb4, 0x00, 0x00, 0x57, 0xcc, 0x00, 0x00, 0x57, 0xe4, 0x00, 0x00, 0x58, 0x5c, 0x00, 0x00, 0x58, 0xf8, 0x00, 0x00, 0x59, 0x14, 0x00, 0x00, 0x59, 0x2c, 0x00, 0x00, 0x59, 0x44, 0x00, 0x00, 0x59, 0x60, 0x00, 0x00, 0x59, 0x78, 0x00, 0x00, 0x59, 0x90, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x00, 0x59, 0xc0, 0x00, 0x00, 0x59, 0xd8, 0x00, 0x00, 0x59, 0xf0, 0x00, 0x00, 0x5a, 0x0c, 0x00, 0x00, 0x5a, 0x24, 0x00, 0x00, 0x5a, 0x3c, 0x00, 0x00, 0x5a, 0x54, 0x00, 0x00, 0x5a, 0x6c, 0x00, 0x00, 0x5a, 0x84, 0x00, 0x00, 0x5a, 0xe4, 0x00, 0x00, 0x5b, 0x3c, 0x00, 0x00, 0x5b, 0x54, 0x00, 0x00, 0x5b, 0x6c, 0x00, 0x00, 0x5b, 0x84, 0x00, 0x00, 0x5b, 0x9c, 0x00, 0x00, 0x5b, 0xb4, 0x00, 0x00, 0x5b, 0xcc, 0x00, 0x00, 0x5b, 0xe4, 0x00, 0x00, 0x5b, 0xfc, 0x00, 0x00, 0x5c, 0x14, 0x00, 0x00, 0x5c, 0x2c, 0x00, 0x00, 0x5c, 0x44, 0x00, 0x00, 0x5c, 0x5c, 0x00, 0x00, 0x5c, 0x74, 0x00, 0x00, 0x5c, 0x8c, 0x00, 0x00, 0x5c, 0xa4, 0x00, 0x00, 0x5c, 0xbc, 0x00, 0x00, 0x5c, 0xd4, 0x00, 0x00, 0x5c, 0xec, 0x00, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x5d, 0x1c, 0x00, 0x00, 0x5d, 0x34, 0x00, 0x00, 0x5d, 0x4c, 0x00, 0x00, 0x5d, 0x64, 0x00, 0x00, 0x5d, 0x7c, 0x00, 0x00, 0x5d, 0x94, 0x00, 0x00, 0x5d, 0xac, 0x00, 0x00, 0x5d, 0xc4, 0x00, 0x00, 0x5d, 0xdc, 0x00, 0x00, 0x5d, 0xf4, 0x00, 0x00, 0x5e, 0x0c, 0x00, 0x00, 0x5e, 0x24, 0x00, 0x00, 0x5e, 0x3c, 0x00, 0x00, 0x5e, 0x54, 0x00, 0x00, 0x5e, 0x6c, 0x00, 0x00, 0x5e, 0x84, 0x00, 0x00, 0x5e, 0x9c, 0x00, 0x00, 0x5f, 0x24, 0x00, 0x00, 0x5f, 0xb4, 0x00, 0x00, 0x5f, 0xcc, 0x00, 0x00, 0x5f, 0xe8, 0x00, 0x00, 0x60, 0x2c, 0x00, 0x00, 0x60, 0xd0, 0x00, 0x00, 0x61, 0x84, 0x00, 0x00, 0x62, 0x28, 0x00, 0x00, 0x62, 0x74, 0x00, 0x00, 0x62, 0xc0, 0x00, 0x00, 0x62, 0xd8, 0x00, 0x00, 0x62, 0xf0, 0x00, 0x00, 0x63, 0x08, 0x00, 0x00, 0x63, 0x20, 0x00, 0x00, 0x63, 0x38, 0x00, 0x00, 0x63, 0x50, 0x00, 0x00, 0x63, 0x68, 0x00, 0x00, 0x63, 0x80, 0x00, 0x00, 0x63, 0x98, 0x00, 0x00, 0x63, 0xb0, 0x00, 0x00, 0x63, 0xc8, 0x00, 0x00, 0x63, 0xe0, 0x00, 0x00, 0x63, 0xf8, 0x00, 0x00, 0x64, 0x10, 0x00, 0x00, 0x64, 0x64, 0x00, 0x00, 0x64, 0xe8, 0x00, 0x00, 0x65, 0x50, 0x00, 0x00, 0x65, 0x7c, 0x00, 0x00, 0x66, 0x1c, 0x00, 0x00, 0x66, 0xbc, 0x00, 0x00, 0x67, 0x28, 0x00, 0x00, 0x67, 0xbc, 0x00, 0x00, 0x68, 0x48, 0x00, 0x00, 0x68, 0x7c, 0x00, 0x00, 0x68, 0xd0, 0x00, 0x00, 0x69, 0x88, 0x00, 0x00, 0x69, 0xe0, 0x00, 0x00, 0x6a, 0x2c, 0x00, 0x00, 0x6a, 0x7c, 0x00, 0x00, 0x6a, 0xfc, 0x00, 0x00, 0x6b, 0x5c, 0x00, 0x00, 0x6b, 0x6c, 0x00, 0x00, 0x6b, 0xd4, 0x00, 0x00, 0x6c, 0x80, 0x00, 0x00, 0x6c, 0xc0, 0x00, 0x00, 0x6d, 0x08, 0x00, 0x00, 0x6d, 0x84, 0x00, 0x00, 0x6d, 0xf8, 0x00, 0x00, 0x6e, 0x64, 0x00, 0x00, 0x6e, 0xb4, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6f, 0x60, 0x00, 0x00, 0x6f, 0xd0, 0x00, 0x00, 0x70, 0x30, 0x00, 0x00, 0x70, 0x90, 0x00, 0x00, 0x71, 0x04, 0x00, 0x00, 0x71, 0x5c, 0x00, 0x00, 0x71, 0xec, 0x00, 0x00, 0x72, 0x60, 0x00, 0x00, 0x72, 0xd0, 0x00, 0x00, 0x73, 0x44, 0x00, 0x00, 0x73, 0xa4, 0x00, 0x00, 0x74, 0x4c, 0x00, 0x00, 0x74, 0x5c, 0x00, 0x00, 0x74, 0x6c, 0x00, 0x00, 0x75, 0x1c, 0x00, 0x00, 0x75, 0xac, 0x00, 0x00, 0x75, 0xec, 0x00, 0x00, 0x76, 0x7c, 0x00, 0x00, 0x76, 0xf0, 0x00, 0x00, 0x77, 0x50, 0x00, 0x00, 0x77, 0xcc, 0x00, 0x00, 0x78, 0x48, 0x00, 0x00, 0x78, 0x8c, 0x00, 0x00, 0x78, 0xe0, 0x00, 0x00, 0x79, 0x44, 0x00, 0x00, 0x79, 0x7c, 0x00, 0x00, 0x79, 0x8c, 0x00, 0x00, 0x79, 0xb8, 0x00, 0x00, 0x7a, 0x28, 0x00, 0x00, 0x7a, 0x78, 0x00, 0x00, 0x7a, 0xa8, 0x00, 0x00, 0x7b, 0x1c, 0x00, 0x00, 0x7b, 0x90, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0x7c, 0x90, 0x00, 0x00, 0x7c, 0xe4, 0x00, 0x00, 0x7d, 0x40, 0x00, 0x00, 0x7d, 0x70, 0x00, 0x00, 0x7d, 0xd4, 0x00, 0x00, 0x7e, 0x38, 0x00, 0x00, 0x7e, 0xb8, 0x00, 0x00, 0x7e, 0xc8, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7f, 0x38, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xe4, 0x00, 0x00, 0x81, 0x44, 0x00, 0x00, 0x81, 0xd0, 0x00, 0x00, 0x82, 0x10, 0x00, 0x00, 0x82, 0x6c, 0x00, 0x00, 0x82, 0xac, 0x00, 0x00, 0x83, 0x0c, 0x00, 0x00, 0x83, 0x50, 0x00, 0x00, 0x83, 0x94, 0x00, 0x00, 0x83, 0xf4, 0x00, 0x00, 0x84, 0x58, 0x00, 0x00, 0x84, 0xbc, 0x00, 0x00, 0x84, 0xe4, 0x00, 0x00, 0x85, 0x1c, 0x00, 0x00, 0x85, 0x64, 0x00, 0x00, 0x85, 0x94, 0x00, 0x00, 0x85, 0xd8, 0x00, 0x00, 0x86, 0x48, 0x00, 0x00, 0x86, 0xb0, 0x00, 0x00, 0x87, 0x40, 0x00, 0x00, 0x87, 0x9c, 0x00, 0x00, 0x87, 0xfc, 0x00, 0x00, 0x88, 0x5c, 0x00, 0x00, 0x88, 0xcc, 0x00, 0x00, 0x89, 0x54, 0x00, 0x00, 0x89, 0x64, 0x00, 0x00, 0x89, 0xf8, 0x00, 0x00, 0x8a, 0x70, 0x00, 0x00, 0x8a, 0x80, 0x00, 0x00, 0x8a, 0xd4, 0x00, 0x00, 0x8b, 0x0c, 0x00, 0x00, 0x8b, 0x2c, 0x00, 0x00, 0x8b, 0xa0, 0x00, 0x00, 0x8c, 0x10, 0x00, 0x00, 0x8c, 0x80, 0x00, 0x00, 0x8d, 0x10, 0x00, 0x00, 0x8d, 0xd8, 0x00, 0x00, 0x8e, 0x94, 0x00, 0x00, 0x8f, 0x38, 0x00, 0x00, 0x8f, 0xc4, 0x00, 0x00, 0x90, 0x94, 0x00, 0x00, 0x91, 0x28, 0x00, 0x00, 0x91, 0xa0, 0x00, 0x00, 0x91, 0xdc, 0x00, 0x00, 0x92, 0x40, 0x00, 0x00, 0x92, 0x80, 0x00, 0x00, 0x92, 0xd0, 0x00, 0x00, 0x93, 0x34, 0x00, 0x00, 0x93, 0x78, 0x00, 0x00, 0x93, 0xcc, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x94, 0x48, 0x00, 0x00, 0x94, 0x88, 0x00, 0x00, 0x94, 0xdc, 0x00, 0x00, 0x95, 0x48, 0x00, 0x00, 0x95, 0x80, 0x00, 0x00, 0x95, 0xc4, 0x00, 0x00, 0x95, 0xd4, 0x00, 0x00, 0x95, 0xec, 0x00, 0x00, 0x95, 0xfc, 0x00, 0x00, 0x96, 0x0c, 0x00, 0x00, 0x96, 0x30, 0x00, 0x00, 0x96, 0x64, 0x00, 0x00, 0x96, 0x9c, 0x00, 0x00, 0x96, 0xf8, 0x00, 0x00, 0x97, 0x58, 0x00, 0x00, 0x97, 0x80, 0x00, 0x00, 0x97, 0xa8, 0x00, 0x00, 0x97, 0xd0, 0x00, 0x00, 0x97, 0xf8, 0x00, 0x00, 0x98, 0x1c, 0x00, 0x00, 0x98, 0x44, 0x00, 0x00, 0x98, 0x60, 0x00, 0x00, 0x98, 0x70, 0x00, 0x00, 0x98, 0x8c, 0x00, 0x00, 0x98, 0xac, 0x00, 0x00, 0x98, 0xc8, 0x00, 0x00, 0x98, 0xdc, 0x00, 0x00, 0x98, 0xfc, 0x00, 0x00, 0x99, 0x18, 0x00, 0x00, 0x99, 0x40, 0x00, 0x00, 0x99, 0x5c, 0x00, 0x00, 0x99, 0x70, 0x00, 0x00, 0x99, 0x84, 0x00, 0x00, 0x99, 0xa8, 0x00, 0x00, 0x99, 0xcc, 0x00, 0x00, 0x99, 0xf8, 0x00, 0x00, 0x9a, 0x14, 0x00, 0x00, 0x9a, 0x48, 0x00, 0x00, 0x9a, 0x64, 0x00, 0x00, 0x9a, 0xb0, 0x00, 0x00, 0x9a, 0xf0, 0x00, 0x00, 0x9b, 0x4c, 0x00, 0x00, 0x9b, 0x78, 0x00, 0x00, 0x9b, 0xb0, 0x00, 0x00, 0x9b, 0xe4, 0x00, 0x00, 0x9c, 0x30, 0x00, 0x00, 0x9c, 0x4c, 0x00, 0x00, 0x9c, 0xe4, 0x00, 0x00, 0x9d, 0x1c, 0x00, 0x00, 0x9d, 0x2c, 0x00, 0x00, 0x9d, 0x4c, 0x00, 0x00, 0x9d, 0x70, 0x00, 0x00, 0x9d, 0x94, 0x00, 0x00, 0x9d, 0xb8, 0x00, 0x00, 0x9d, 0xd8, 0x00, 0x00, 0x9d, 0xec, 0x00, 0x00, 0x9e, 0x04, 0x00, 0x00, 0x9e, 0x14, 0x00, 0x00, 0x9e, 0x28, 0x00, 0x00, 0x9e, 0x94, 0x00, 0x00, 0x9e, 0xbc, 0x00, 0x00, 0x9e, 0xe0, 0x00, 0x00, 0x9f, 0x0c, 0x00, 0x00, 0x9f, 0x20, 0x00, 0x00, 0x9f, 0x34, 0x00, 0x00, 0x9f, 0x48, 0x00, 0x00, 0x9f, 0x5c, 0x00, 0x00, 0x9f, 0x7c, 0x00, 0x00, 0x9f, 0xa8, 0x00, 0x00, 0x9f, 0xfc, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xa0, 0x24, 0x00, 0x00, 0xa0, 0x50, 0x00, 0x00, 0xa0, 0x6c, 0x00, 0x00, 0xa0, 0x88, 0x00, 0x00, 0xa0, 0xb4, 0x00, 0x00, 0xa0, 0xd0, 0x00, 0x00, 0xa1, 0x04, 0x00, 0x00, 0xa1, 0x20, 0x00, 0x00, 0xa1, 0x48, 0x00, 0x00, 0xa1, 0x6c, 0x00, 0x00, 0xa1, 0x88, 0x00, 0x00, 0xa1, 0x9c, 0x00, 0x00, 0xa1, 0xb0, 0x00, 0x00, 0xa1, 0xd4, 0x00, 0x00, 0xa1, 0xf4, 0x00, 0x00, 0xa2, 0x14, 0x00, 0x00, 0xa2, 0x58, 0x00, 0x00, 0xa2, 0x8c, 0x00, 0x00, 0xa2, 0xb0, 0x00, 0x00, 0xa2, 0xd4, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa3, 0x1c, 0x00, 0x00, 0xa3, 0x4c, 0x00, 0x00, 0xa3, 0x7c, 0x00, 0x00, 0xa3, 0x94, 0x00, 0x00, 0xa3, 0xa8, 0x00, 0x00, 0xa3, 0xf4, 0x00, 0x00, 0xa4, 0x10, 0x00, 0x00, 0xa4, 0x24, 0x00, 0x00, 0xa4, 0x38, 0x00, 0x00, 0xa4, 0x54, 0x00, 0x00, 0xa4, 0x78, 0x00, 0x00, 0xa4, 0xc0, 0x00, 0x00, 0xa4, 0xd4, 0x00, 0x00, 0xa4, 0xe8, 0x00, 0x00, 0xa4, 0xfc, 0x00, 0x00, 0xa5, 0x30, 0x00, 0x00, 0xa5, 0x44, 0x00, 0x00, 0xa5, 0x58, 0x00, 0x00, 0xa5, 0x6c, 0x00, 0x00, 0xa5, 0x80, 0x00, 0x00, 0xa5, 0xdc, 0x00, 0x00, 0xa5, 0xf8, 0x00, 0x00, 0xa6, 0x14, 0x00, 0x00, 0xa6, 0x34, 0x00, 0x00, 0xa6, 0x54, 0x00, 0x00, 0xa6, 0x84, 0x00, 0x00, 0xa6, 0xa8, 0x00, 0x00, 0xa6, 0xd0, 0x00, 0x00, 0xa7, 0x18, 0x00, 0x00, 0xa7, 0x4c, 0x00, 0x00, 0xa7, 0xac, 0x00, 0x00, 0xa7, 0xc8, 0x00, 0x00, 0xa7, 0xdc, 0x00, 0x00, 0xa7, 0xf0, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0xa8, 0x14, 0x00, 0x00, 0xa8, 0x28, 0x00, 0x00, 0xa8, 0x3c, 0x00, 0x00, 0xa8, 0x60, 0x00, 0x00, 0xa8, 0x88, 0x00, 0x00, 0xa8, 0xb0, 0x00, 0x00, 0xa8, 0xd0, 0x00, 0x00, 0xa9, 0x4c, 0x00, 0x00, 0xa9, 0xc0, 0x00, 0x00, 0xa9, 0xd8, 0x00, 0x00, 0xaa, 0x10, 0x00, 0x00, 0xaa, 0x38, 0x00, 0x00, 0xaa, 0x38, 0x00, 0x00, 0xaa, 0x78, 0x00, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xaa, 0xa4, 0x00, 0x00, 0xaa, 0xe4, 0x00, 0x00, 0xaa, 0xf8, 0x00, 0x00, 0xab, 0x5c, 0x00, 0x00, 0xab, 0x70, 0x00, 0x00, 0xab, 0x84, 0x00, 0x00, 0xab, 0xa0, 0x00, 0x00, 0xab, 0xbc, 0x00, 0x00, 0xac, 0x30, 0x00, 0x00, 0xac, 0x44, 0x00, 0x00, 0xac, 0x6c, 0x00, 0x00, 0xac, 0x7c, 0x00, 0x00, 0xac, 0x8c, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0xac, 0xec, 0x00, 0x00, 0xad, 0x08, 0x00, 0x00, 0xad, 0x24, 0x00, 0x00, 0xad, 0x34, 0x00, 0x00, 0xad, 0x44, 0x00, 0x00, 0xad, 0x78, 0x00, 0x00, 0xad, 0x88, 0x00, 0x00, 0xad, 0xa0, 0x00, 0x00, 0xad, 0xb8, 0x00, 0x00, 0xad, 0xc8, 0x00, 0x00, 0xad, 0xe4, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xae, 0x18, 0x00, 0x00, 0xae, 0x28, 0x00, 0x00, 0xae, 0x44, 0x00, 0x00, 0xae, 0x60, 0x00, 0x00, 0xae, 0x7c, 0x00, 0x00, 0xae, 0x94, 0x00, 0x00, 0xae, 0xb0, 0x00, 0x00, 0xae, 0xc8, 0x00, 0x00, 0xae, 0xe0, 0x00, 0x00, 0xae, 0xf0, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xaf, 0x20, 0x00, 0x00, 0xaf, 0x50, 0x00, 0x00, 0xaf, 0x60, 0x00, 0x00, 0xaf, 0x70, 0x00, 0x00, 0xaf, 0x80, 0x00, 0x00, 0xaf, 0xfc, 0x00, 0x00, 0xb0, 0x0c, 0x00, 0x00, 0xb0, 0x1c, 0x00, 0x00, 0xb0, 0x44, 0x00, 0x00, 0xb0, 0x54, 0x00, 0x00, 0xb0, 0x64, 0x00, 0x00, 0xb0, 0x9c, 0x00, 0x00, 0xb0, 0xac, 0x00, 0x00, 0xb0, 0xbc, 0x00, 0x00, 0xb0, 0xcc, 0x00, 0x00, 0xb1, 0x04, 0x00, 0x00, 0xb1, 0x14, 0x00, 0x00, 0xb1, 0x24, 0x00, 0x00, 0xb1, 0xa8, 0x00, 0x00, 0xb1, 0xb8, 0x00, 0x00, 0xb2, 0x20, 0x00, 0x00, 0xb2, 0x9c, 0x00, 0x00, 0xb2, 0xb8, 0x00, 0x00, 0xb2, 0xd4, 0x00, 0x00, 0xb2, 0xec, 0x00, 0x00, 0xb3, 0x04, 0x00, 0x00, 0xb3, 0x1c, 0x00, 0x00, 0xb3, 0x34, 0x00, 0x00, 0xb3, 0x4c, 0x00, 0x00, 0xb3, 0xd4, 0x00, 0x00, 0xb4, 0x38, 0x00, 0x00, 0xb4, 0x78, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb5, 0x9c, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb6, 0x48, 0x00, 0x00, 0xb6, 0xc4, 0x00, 0x00, 0xb6, 0xf8, 0x00, 0x00, 0xb7, 0x30, 0x00, 0x00, 0xb7, 0x70, 0x00, 0x00, 0xb7, 0x80, 0x00, 0x00, 0xb7, 0xd0, 0x00, 0x00, 0xb8, 0x4c, 0x00, 0x00, 0xb8, 0x5c, 0x00, 0x00, 0xb8, 0xa8, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0xb9, 0xe4, 0x00, 0x00, 0xba, 0x20, 0x00, 0x00, 0xba, 0x80, 0x00, 0x00, 0xbb, 0x04, 0x00, 0x00, 0xbb, 0x60, 0x00, 0x00, 0xbb, 0xbc, 0x00, 0x00, 0xbc, 0x18, 0x00, 0x00, 0xbc, 0x30, 0x00, 0x00, 0xbc, 0x48, 0x00, 0x00, 0xbc, 0x60, 0x00, 0x00, 0xbc, 0x78, 0x00, 0x00, 0xbc, 0x90, 0x00, 0x00, 0xbc, 0xcc, 0x00, 0x00, 0xbd, 0x54, 0x00, 0x00, 0xbd, 0xc4, 0x00, 0x00, 0xbe, 0x34, 0x00, 0x00, 0xbe, 0x50, 0x00, 0x00, 0xbe, 0x68, 0x00, 0x00, 0xbe, 0xf0, 0x00, 0x00, 0xbf, 0x58, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0xc0, 0x78, 0x00, 0x00, 0xc0, 0xe4, 0x00, 0x00, 0xc1, 0x58, 0x00, 0x00, 0xc1, 0xc0, 0x00, 0x00, 0xc1, 0xd0, 0x00, 0x00, 0xc2, 0x48, 0x00, 0x00, 0xc2, 0xa4, 0x00, 0x00, 0xc2, 0xd0, 0x00, 0x00, 0xc3, 0x44, 0x00, 0x00, 0xc3, 0xa0, 0x00, 0x00, 0xc4, 0x60, 0x00, 0x00, 0xc4, 0xe0, 0x00, 0x00, 0xc5, 0x48, 0x00, 0x00, 0xc5, 0xa8, 0x00, 0x00, 0xc6, 0x24, 0x00, 0x00, 0xc7, 0x0c, 0x00, 0x00, 0xc7, 0x80, 0x00, 0x00, 0xc7, 0xec, 0x00, 0x00, 0xc8, 0x9c, 0x00, 0x00, 0xc9, 0x4c, 0x00, 0x00, 0xc9, 0xe0, 0x00, 0x00, 0xca, 0x78, 0x00, 0x00, 0xca, 0xb0, 0x00, 0x00, 0xca, 0xe8, 0x00, 0x00, 0xcb, 0x84, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x10, 0x00, 0x00, 0xcc, 0x20, 0x00, 0x00, 0xcc, 0x30, 0x00, 0x00, 0xcc, 0x9c, 0x00, 0x00, 0xcd, 0x08, 0x00, 0x00, 0xcd, 0x18, 0x00, 0x00, 0xcd, 0x28, 0x00, 0x00, 0xcd, 0x38, 0x00, 0x00, 0xcd, 0x74, 0x00, 0x00, 0xcd, 0xac, 0x00, 0x00, 0xce, 0x2c, 0x00, 0x00, 0xce, 0x3c, 0x00, 0x00, 0xce, 0x54, 0x00, 0x00, 0xce, 0x6c, 0x00, 0x00, 0xce, 0x84, 0x00, 0x00, 0xce, 0xa0, 0x00, 0x00, 0xce, 0xf8, 0x00, 0x00, 0xcf, 0x10, 0x00, 0x00, 0xcf, 0x68, 0x00, 0x00, 0xcf, 0x78, 0x00, 0x00, 0xcf, 0x88, 0x00, 0x00, 0xcf, 0x98, 0x00, 0x00, 0xcf, 0xa8, 0x00, 0x00, 0xd0, 0x0c, 0x00, 0x00, 0xd0, 0x68, 0x00, 0x00, 0xd0, 0xac, 0x00, 0x00, 0xd0, 0xc4, 0x00, 0x00, 0xd0, 0xdc, 0x00, 0x00, 0xd0, 0xf4, 0x00, 0x00, 0xd1, 0x24, 0x00, 0x00, 0xd1, 0x34, 0x00, 0x00, 0xd1, 0x84, 0x00, 0x00, 0xd1, 0x94, 0x00, 0x00, 0xd1, 0xb4, 0x00, 0x00, 0xd2, 0x0c, 0x00, 0x00, 0xd2, 0x1c, 0x00, 0x00, 0xd2, 0x74, 0x00, 0x00, 0xd2, 0xec, 0x00, 0x00, 0xd3, 0x1c, 0x00, 0x00, 0xd3, 0x38, 0x00, 0x00, 0xd3, 0x70, 0x00, 0x00, 0xd3, 0xac, 0x00, 0x00, 0xd3, 0xbc, 0x00, 0x00, 0xd3, 0xcc, 0x00, 0x00, 0xd3, 0xdc, 0x00, 0x00, 0xd4, 0x04, 0x00, 0x00, 0xd4, 0x14, 0x00, 0x00, 0xd4, 0x24, 0x00, 0x00, 0xd4, 0x34, 0x00, 0x00, 0xd4, 0x78, 0x00, 0x00, 0xd4, 0xf0, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd5, 0x30, 0x00, 0x00, 0xd5, 0x68, 0x00, 0x00, 0xd5, 0x98, 0x00, 0x00, 0xd5, 0xd4, 0x00, 0x00, 0xd6, 0x28, 0x00, 0x00, 0xd6, 0x40, 0x00, 0x00, 0xd6, 0x90, 0x00, 0x00, 0xd6, 0xe8, 0x00, 0x00, 0xd7, 0x70, 0x00, 0x00, 0xd7, 0xc4, 0x00, 0x00, 0xd7, 0xd4, 0x00, 0x00, 0xd8, 0x60, 0x00, 0x00, 0xd8, 0xcc, 0x00, 0x00, 0xd8, 0xec, 0x00, 0x00, 0xd9, 0x40, 0x00, 0x00, 0xd9, 0x50, 0x00, 0x00, 0xd9, 0xa8, 0x00, 0x00, 0xda, 0x1c, 0x00, 0x00, 0xda, 0x4c, 0x00, 0x00, 0xda, 0x68, 0x00, 0x00, 0xda, 0xa0, 0x00, 0x00, 0xda, 0xdc, 0x00, 0x00, 0xdb, 0x18, 0x00, 0x00, 0xdb, 0x48, 0x00, 0x00, 0xdb, 0x58, 0x00, 0x00, 0xdb, 0x80, 0x00, 0x00, 0xdb, 0x90, 0x00, 0x00, 0xdb, 0xa0, 0x00, 0x00, 0xdb, 0xc8, 0x00, 0x00, 0xdb, 0xd8, 0x00, 0x00, 0xdc, 0x80, 0x00, 0x00, 0xdc, 0x90, 0x00, 0x00, 0xdc, 0xc0, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xdd, 0x30, 0x00, 0x00, 0xdd, 0x6c, 0x00, 0x00, 0xdd, 0xb8, 0x00, 0x00, 0xdd, 0xd0, 0x00, 0x00, 0xde, 0x18, 0x00, 0x00, 0xde, 0x6c, 0x00, 0x00, 0xde, 0xd4, 0x00, 0x00, 0xdf, 0x28, 0x00, 0x00, 0xdf, 0x40, 0x00, 0x00, 0xdf, 0x5c, 0x00, 0x00, 0xdf, 0xc0, 0x00, 0x00, 0xdf, 0xd8, 0x00, 0x00, 0xe0, 0x30, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0xe0, 0x50, 0x00, 0x00, 0xe0, 0x60, 0x00, 0x00, 0xe0, 0x70, 0x00, 0x00, 0xe0, 0xd4, 0x00, 0x00, 0xe1, 0x30, 0x00, 0x00, 0xe1, 0x88, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xb8, 0x00, 0x00, 0xe1, 0xd0, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe2, 0xa0, 0x00, 0x00, 0xe2, 0xb0, 0x00, 0x00, 0xe3, 0x10, 0x00, 0x00, 0xe3, 0x68, 0x00, 0x00, 0xe3, 0xf4, 0x00, 0x00, 0xe4, 0x64, 0x00, 0x00, 0xe4, 0xa4, 0x00, 0x00, 0xe4, 0xe4, 0x00, 0x00, 0xe5, 0x3c, 0x00, 0x00, 0xe5, 0x94, 0x00, 0x00, 0xe5, 0xfc, 0x00, 0x00, 0xe6, 0x64, 0x00, 0x00, 0xe6, 0xe0, 0x00, 0x00, 0xe7, 0x58, 0x00, 0x00, 0xe8, 0x44, 0x00, 0x00, 0xe9, 0x20, 0x00, 0x00, 0xe9, 0x84, 0x00, 0x00, 0xe9, 0xe8, 0x00, 0x00, 0xe9, 0xf8, 0x00, 0x00, 0xea, 0x08, 0x00, 0x00, 0xea, 0x54, 0x00, 0x00, 0xea, 0xa4, 0x00, 0x00, 0xea, 0xbc, 0x00, 0x00, 0xea, 0xd4, 0x00, 0x00, 0xeb, 0x78, 0x00, 0x00, 0xeb, 0xfc, 0x00, 0x00, 0xec, 0xf4, 0x00, 0x00, 0xed, 0xdc, 0x00, 0x00, 0xee, 0xb8, 0x00, 0x00, 0xef, 0x68, 0x00, 0x00, 0xef, 0x80, 0x00, 0x00, 0xef, 0x98, 0x00, 0x00, 0xef, 0xfc, 0x00, 0x00, 0xf0, 0x58, 0x00, 0x00, 0xf0, 0xa4, 0x00, 0x00, 0xf1, 0x3c, 0x00, 0x00, 0xf1, 0x70, 0x00, 0x00, 0xf1, 0x98, 0x00, 0x00, 0xf1, 0xc0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf3, 0x44, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x18, 0x00, 0x00, 0xf4, 0x30, 0x00, 0x00, 0xf4, 0x90, 0x00, 0x00, 0xf4, 0xf4, 0x00, 0x00, 0xf5, 0x54, 0x00, 0x00, 0xf5, 0xd8, 0x00, 0x00, 0xf5, 0xfc, 0x00, 0x00, 0xf6, 0x20, 0x00, 0x00, 0xf6, 0x54, 0x00, 0x00, 0xf6, 0x88, 0x00, 0x00, 0xf6, 0xe0, 0x00, 0x00, 0xf7, 0x3c, 0x00, 0x00, 0xf7, 0xa0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x00, 0x00, 0xf8, 0x30, 0x00, 0x00, 0xf8, 0x74, 0x00, 0x00, 0xf8, 0xb8, 0x00, 0x00, 0xf9, 0x04, 0x00, 0x00, 0xf9, 0x4c, 0x00, 0x00, 0xf9, 0x98, 0x00, 0x00, 0xf9, 0xe4, 0x00, 0x00, 0xfa, 0x24, 0x00, 0x00, 0xfa, 0x64, 0x00, 0x00, 0xfa, 0xa0, 0x00, 0x00, 0xfa, 0xdc, 0x00, 0x00, 0xfb, 0x14, 0x00, 0x00, 0xfb, 0x4c, 0x00, 0x00, 0xfb, 0xac, 0x00, 0x00, 0xfc, 0x10, 0x00, 0x00, 0xfd, 0x04, 0x00, 0x00, 0xfd, 0xe0, 0x00, 0x00, 0xfd, 0xf8, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0xfe, 0x40, 0x00, 0x00, 0xfe, 0x70, 0x00, 0x00, 0xfe, 0x80, 0x00, 0x00, 0xfe, 0xb0, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x7c, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x01, 0x00, 0x84, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x01, 0x01, 0x1c, 0x00, 0x01, 0x01, 0x68, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x01, 0x01, 0xb4, 0x00, 0x01, 0x02, 0x44, 0x00, 0x01, 0x02, 0xd4, 0x00, 0x01, 0x03, 0x6c, 0x00, 0x01, 0x04, 0x04, 0x00, 0x01, 0x04, 0x14, 0x00, 0x01, 0x04, 0x2c, 0x00, 0x01, 0x04, 0x44, 0x00, 0x01, 0x04, 0xa0, 0x00, 0x01, 0x05, 0x00, 0x00, 0x01, 0x05, 0x4c, 0x00, 0x01, 0x05, 0x98, 0x00, 0x01, 0x05, 0xe0, 0x00, 0x01, 0x06, 0x28, 0x00, 0x01, 0x06, 0x64, 0x00, 0x01, 0x06, 0xa0, 0x00, 0x01, 0x06, 0xe8, 0x00, 0x01, 0x07, 0x30, 0x00, 0x01, 0x07, 0x7c, 0x00, 0x01, 0x07, 0xc4, 0x00, 0x01, 0x07, 0xd4, 0x00, 0x01, 0x07, 0xf0, 0x00, 0x01, 0x08, 0x08, 0x00, 0x01, 0x08, 0x24, 0x00, 0x01, 0x08, 0x3c, 0x00, 0x01, 0x08, 0x4c, 0x00, 0x01, 0x08, 0x5c, 0x00, 0x01, 0x08, 0x78, 0x00, 0x01, 0x08, 0x94, 0x00, 0x01, 0x08, 0xa4, 0x00, 0x01, 0x08, 0xb4, 0x00, 0x01, 0x08, 0xcc, 0x00, 0x01, 0x08, 0xe4, 0x00, 0x01, 0x08, 0xfc, 0x00, 0x01, 0x09, 0x14, 0x00, 0x01, 0x09, 0x2c, 0x00, 0x01, 0x09, 0x44, 0x00, 0x01, 0x09, 0x54, 0x00, 0x01, 0x09, 0x64, 0x00, 0x01, 0x09, 0x7c, 0x00, 0x01, 0x09, 0x94, 0x00, 0x01, 0x09, 0xac, 0x00, 0x01, 0x09, 0xc4, 0x00, 0x01, 0x09, 0xe0, 0x00, 0x01, 0x09, 0xf8, 0x00, 0x01, 0x0a, 0x08, 0x00, 0x01, 0x0a, 0x18, 0x00, 0x01, 0x0a, 0x30, 0x00, 0x01, 0x0a, 0x48, 0x00, 0x01, 0x0a, 0x60, 0x00, 0x01, 0x0a, 0x78, 0x00, 0x01, 0x0a, 0x90, 0x00, 0x01, 0x0a, 0xa8, 0x00, 0x01, 0x0a, 0xc0, 0x00, 0x01, 0x0a, 0xd8, 0x00, 0x01, 0x0a, 0xf0, 0x00, 0x01, 0x0b, 0x08, 0x00, 0x01, 0x0b, 0x20, 0x00, 0x01, 0x0b, 0x38, 0x00, 0x01, 0x0b, 0x60, 0x00, 0x01, 0x0b, 0x88, 0x00, 0x01, 0x0b, 0xa0, 0x00, 0x01, 0x0b, 0xb8, 0x00, 0x01, 0x0c, 0x08, 0x00, 0x01, 0x0c, 0x58, 0x00, 0x01, 0x0c, 0xb8, 0x00, 0x01, 0x0d, 0x18, 0x00, 0x01, 0x0d, 0x68, 0x00, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x0e, 0x08, 0x00, 0x01, 0x0e, 0x5c, 0x00, 0x01, 0x0e, 0xf0, 0x00, 0x01, 0x0f, 0x80, 0x00, 0x01, 0x10, 0x20, 0x00, 0x01, 0x10, 0xbc, 0x00, 0x01, 0x11, 0x38, 0x00, 0x01, 0x11, 0xb4, 0x00, 0x01, 0x12, 0x24, 0x00, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0xa0, 0x00, 0x01, 0x12, 0xfc, 0x00, 0x01, 0x13, 0x5c, 0x00, 0x01, 0x13, 0xb4, 0x00, 0x01, 0x14, 0x08, 0x00, 0x01, 0x14, 0x5c, 0x00, 0x01, 0x14, 0x6c, 0x00, 0x01, 0x14, 0x7c, 0x00, 0x01, 0x14, 0xcc, 0x00, 0x01, 0x15, 0x1c, 0x00, 0x01, 0x15, 0x80, 0x00, 0x01, 0x15, 0xe8, 0x00, 0x01, 0x16, 0x48, 0x00, 0x01, 0x16, 0xc0, 0x00, 0x01, 0x17, 0x28, 0x00, 0x01, 0x17, 0xc0, 0x00, 0x01, 0x17, 0xd0, 0x00, 0x01, 0x17, 0xe0, 0x00, 0x01, 0x17, 0xf0, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0x18, 0x54, 0x00, 0x01, 0x18, 0xa0, 0x00, 0x01, 0x19, 0x14, 0x00, 0x01, 0x19, 0x88, 0x00, 0x01, 0x19, 0xf0, 0x00, 0x01, 0x1a, 0x5c, 0x00, 0x01, 0x1a, 0x8c, 0x00, 0x01, 0x1a, 0xbc, 0x00, 0x01, 0x1a, 0xf4, 0x00, 0x01, 0x1b, 0x44, 0x00, 0x01, 0x1c, 0x1c, 0x00, 0x01, 0x1c, 0x88, 0x00, 0x01, 0x1c, 0x98, 0x00, 0x01, 0x1c, 0xe0, 0x00, 0x01, 0x1d, 0x38, 0x00, 0x01, 0x1d, 0x68, 0x00, 0x01, 0x1d, 0xf8, 0x00, 0x01, 0x1e, 0x1c, 0x00, 0x01, 0x1e, 0x58, 0x00, 0x01, 0x1e, 0x68, 0x00, 0x01, 0x1e, 0xa0, 0x00, 0x01, 0x1e, 0xb0, 0x00, 0x01, 0x1e, 0xc0, 0x00, 0x01, 0x1e, 0xd0, 0x00, 0x01, 0x1e, 0xe0, 0x00, 0x01, 0x1f, 0x34, 0x00, 0x01, 0x1f, 0x88, 0x00, 0x01, 0x20, 0x18, 0x00, 0x01, 0x20, 0xd4, 0x00, 0x01, 0x21, 0x0c, 0x00, 0x01, 0x21, 0x44, 0x00, 0x01, 0x21, 0x88, 0x00, 0x01, 0x21, 0xf8, 0x00, 0x01, 0x22, 0x68, 0x00, 0x01, 0x22, 0x78, 0x00, 0x01, 0x22, 0xb0, 0x00, 0x01, 0x22, 0xf4, 0x00, 0x01, 0x23, 0x50, 0x00, 0x01, 0x23, 0xc4, 0x00, 0x01, 0x23, 0xd4, 0x00, 0x01, 0x23, 0xe4, 0x00, 0x01, 0x23, 0xf4, 0x00, 0x01, 0x24, 0x44, 0x00, 0x01, 0x24, 0x64, 0x00, 0x01, 0x24, 0x74, 0x00, 0x01, 0x24, 0x9c, 0x00, 0x01, 0x24, 0xac, 0x00, 0x01, 0x25, 0x08, 0x00, 0x01, 0x25, 0x18, 0x00, 0x01, 0x25, 0x4c, 0x00, 0x01, 0x25, 0x98, 0x00, 0x01, 0x26, 0x14, 0x00, 0x01, 0x26, 0x5c, 0x00, 0x01, 0x26, 0x8c, 0x00, 0x01, 0x26, 0xbc, 0x00, 0x01, 0x27, 0x2c, 0x00, 0x01, 0x27, 0x5c, 0x00, 0x01, 0x27, 0x78, 0x00, 0x01, 0x27, 0xa8, 0x00, 0x01, 0x27, 0xdc, 0x00, 0x01, 0x27, 0xfc, 0x00, 0x01, 0x28, 0x34, 0x00, 0x01, 0x28, 0x64, 0x00, 0x01, 0x28, 0x94, 0x00, 0x01, 0x28, 0xf4, 0x00, 0x01, 0x29, 0xb0, 0x00, 0x01, 0x29, 0xfc, 0x00, 0x01, 0x2a, 0x68, 0x00, 0x01, 0x2a, 0x90, 0x00, 0x01, 0x2a, 0xd4, 0x00, 0x01, 0x2b, 0x0c, 0x00, 0x01, 0x2b, 0x8c, 0x00, 0x01, 0x2c, 0x14, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x01, 0x2d, 0x54, 0x00, 0x01, 0x2d, 0xb8, 0x00, 0x01, 0x2e, 0x20, 0x00, 0x01, 0x2e, 0x94, 0x00, 0x01, 0x2e, 0xf0, 0x00, 0x01, 0x2f, 0x84, 0x00, 0x01, 0x30, 0x14, 0x00, 0x01, 0x30, 0xa8, 0x00, 0x01, 0x30, 0xcc, 0x00, 0x01, 0x31, 0x00, 0x00, 0x01, 0x31, 0x68, 0x00, 0x01, 0x31, 0xc8, 0x00, 0x01, 0x32, 0x14, 0x00, 0x01, 0x32, 0x7c, 0x00, 0x01, 0x32, 0xb8, 0x00, 0x01, 0x32, 0xf0, 0x00, 0x01, 0x33, 0x54, 0x00, 0x01, 0x33, 0x94, 0x00, 0x01, 0x33, 0xe0, 0x00, 0x01, 0x34, 0x2c, 0x00, 0x01, 0x34, 0xa8, 0x00, 0x01, 0x34, 0xcc, 0x00, 0x01, 0x35, 0x2c, 0x00, 0x01, 0x35, 0x64, 0x00, 0x01, 0x35, 0xec, 0x00, 0x01, 0x36, 0x68, 0x00, 0x01, 0x36, 0xc0, 0x00, 0x01, 0x36, 0xd4, 0x00, 0x01, 0x36, 0xe8, 0x00, 0x01, 0x36, 0xfc, 0x00, 0x01, 0x37, 0x10, 0x00, 0x01, 0x37, 0x24, 0x00, 0x01, 0x37, 0x38, 0x00, 0x01, 0x37, 0x94, 0x00, 0x01, 0x37, 0xa8, 0x00, 0x01, 0x37, 0xbc, 0x00, 0x01, 0x38, 0x38, 0x00, 0x01, 0x38, 0x48, 0x00, 0x01, 0x38, 0x88, 0x00, 0x01, 0x39, 0x14, 0x00, 0x01, 0x39, 0x50, 0x00, 0x01, 0x39, 0xb8, 0x00, 0x01, 0x3a, 0x18, 0x00, 0x01, 0x3a, 0x9c, 0x00, 0x01, 0x3b, 0x2c, 0x00, 0x01, 0x3b, 0xbc, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x3c, 0x44, 0x00, 0x01, 0x3c, 0xcc, 0x00, 0x01, 0x3d, 0x18, 0x00, 0x01, 0x3d, 0x50, 0x00, 0x01, 0x3d, 0x80, 0x00, 0x01, 0x3d, 0xac, 0x00, 0x01, 0x3d, 0xe8, 0x00, 0x01, 0x3e, 0x40, 0x00, 0x01, 0x3e, 0x74, 0x00, 0x01, 0x3e, 0xb4, 0x00, 0x01, 0x3e, 0xd4, 0x00, 0x01, 0x3f, 0x6c, 0x00, 0x01, 0x3f, 0xe8, 0x00, 0x01, 0x40, 0x48, 0x00, 0x01, 0x40, 0xac, 0x00, 0x01, 0x40, 0xdc, 0x00, 0x01, 0x41, 0x4c, 0x00, 0x01, 0x41, 0xdc, 0x00, 0x01, 0x42, 0x84, 0x00, 0x01, 0x42, 0xd4, 0x00, 0x01, 0x43, 0x2c, 0x00, 0x01, 0x43, 0x94, 0x00, 0x01, 0x44, 0x08, 0x00, 0x01, 0x44, 0x4c, 0x00, 0x01, 0x44, 0xb0, 0x00, 0x01, 0x44, 0xd8, 0x00, 0x01, 0x45, 0x08, 0x00, 0x01, 0x45, 0x54, 0x00, 0x01, 0x45, 0xac, 0x00, 0x01, 0x46, 0x14, 0x00, 0x01, 0x46, 0x80, 0x00, 0x01, 0x46, 0xa0, 0x00, 0x01, 0x46, 0xc4, 0x00, 0x01, 0x46, 0xe8, 0x00, 0x01, 0x47, 0x08, 0x00, 0x01, 0x47, 0x34, 0x00, 0x01, 0x47, 0x64, 0x00, 0x01, 0x47, 0x7c, 0x00, 0x01, 0x47, 0x94, 0x00, 0x01, 0x47, 0xac, 0x00, 0x01, 0x47, 0xc4, 0x00, 0x01, 0x47, 0xdc, 0x00, 0x01, 0x47, 0xf4, 0x00, 0x01, 0x48, 0x0c, 0x00, 0x01, 0x48, 0x24, 0x00, 0x01, 0x48, 0x3c, 0x00, 0x01, 0x48, 0x54, 0x00, 0x01, 0x48, 0x6c, 0x00, 0x01, 0x48, 0x84, 0x00, 0x01, 0x48, 0x9c, 0x00, 0x01, 0x48, 0xb4, 0x00, 0x01, 0x48, 0xcc, 0x00, 0x01, 0x48, 0xe4, 0x00, 0x01, 0x48, 0xfc, 0x00, 0x01, 0x49, 0x14, 0x00, 0x01, 0x49, 0x2c, 0x00, 0x01, 0x49, 0x44, 0x00, 0x01, 0x49, 0x5c, 0x00, 0x01, 0x49, 0x74, 0x00, 0x01, 0x49, 0x8c, 0x00, 0x01, 0x49, 0xa4, 0x00, 0x01, 0x49, 0xbc, 0x00, 0x01, 0x49, 0xd4, 0x00, 0x01, 0x49, 0xec, 0x00, 0x01, 0x4a, 0x04, 0x00, 0x01, 0x4a, 0x24, 0x00, 0x01, 0x4a, 0x40, 0x00, 0x01, 0x4a, 0x58, 0x00, 0x01, 0x4a, 0x70, 0x00, 0x01, 0x4a, 0x88, 0x00, 0x01, 0x4a, 0xa0, 0x00, 0x01, 0x4a, 0xb8, 0x00, 0x01, 0x4a, 0xd0, 0x00, 0x01, 0x4a, 0xe8, 0x00, 0x01, 0x4b, 0x00, 0x00, 0x01, 0x4b, 0x18, 0x00, 0x01, 0x4b, 0x30, 0x00, 0x01, 0x4b, 0x48, 0x00, 0x01, 0x4b, 0x60, 0x00, 0x01, 0x4b, 0x78, 0x00, 0x01, 0x4b, 0x90, 0x00, 0x01, 0x4b, 0xa8, 0x00, 0x01, 0x4b, 0xc0, 0x00, 0x01, 0x4b, 0xd8, 0x00, 0x01, 0x4b, 0xf0, 0x00, 0x01, 0x4c, 0x08, 0x00, 0x01, 0x4c, 0x20, 0x00, 0x01, 0x4c, 0x38, 0x00, 0x01, 0x4c, 0x50, 0x00, 0x01, 0x4c, 0x68, 0x00, 0x01, 0x4c, 0x80, 0x00, 0x01, 0x4c, 0x98, 0x00, 0x01, 0x4c, 0xb0, 0x00, 0x01, 0x4c, 0xd0, 0x00, 0x01, 0x4c, 0xe8, 0x00, 0x01, 0x4d, 0x00, 0x00, 0x01, 0x4d, 0x18, 0x00, 0x01, 0x4d, 0x30, 0x00, 0x01, 0x4d, 0x48, 0x00, 0x01, 0x4d, 0x60, 0x00, 0x01, 0x4d, 0x78, 0x00, 0x01, 0x4d, 0x90, 0x00, 0x01, 0x4d, 0xa8, 0x00, 0x01, 0x4d, 0xc0, 0x00, 0x01, 0x4d, 0xd8, 0x00, 0x01, 0x4d, 0xf0, 0x00, 0x01, 0x4e, 0x08, 0x00, 0x01, 0x4e, 0x20, 0x00, 0x01, 0x4e, 0x38, 0x00, 0x01, 0x4e, 0x50, 0x00, 0x01, 0x4e, 0x68, 0x00, 0x01, 0x4e, 0x80, 0x00, 0x01, 0x4e, 0x98, 0x00, 0x01, 0x4e, 0xb0, 0x00, 0x01, 0x4e, 0xc8, 0x00, 0x01, 0x4e, 0xe0, 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, 0x4f, 0x18, 0x00, 0x01, 0x4f, 0x30, 0x00, 0x01, 0x4f, 0x48, 0x00, 0x01, 0x4f, 0x60, 0x00, 0x01, 0x4f, 0x78, 0x00, 0x01, 0x4f, 0x90, 0x00, 0x01, 0x4f, 0xa8, 0x00, 0x01, 0x4f, 0xc0, 0x00, 0x01, 0x4f, 0xd8, 0x00, 0x01, 0x4f, 0xf0, 0x00, 0x01, 0x50, 0x08, 0x00, 0x01, 0x50, 0x20, 0x00, 0x01, 0x50, 0x38, 0x00, 0x01, 0x50, 0x50, 0x00, 0x01, 0x50, 0x68, 0x00, 0x01, 0x50, 0x80, 0x00, 0x01, 0x50, 0x98, 0x00, 0x01, 0x50, 0xb0, 0x00, 0x01, 0x50, 0xc8, 0x00, 0x01, 0x50, 0xe0, 0x00, 0x01, 0x51, 0x00, 0x00, 0x01, 0x51, 0x20, 0x00, 0x01, 0x51, 0x38, 0x00, 0x01, 0x51, 0x50, 0x00, 0x01, 0x51, 0x68, 0x00, 0x01, 0x51, 0x80, 0x00, 0x01, 0x51, 0x98, 0x00, 0x01, 0x51, 0xb0, 0x00, 0x01, 0x51, 0xc8, 0x00, 0x01, 0x51, 0xe0, 0x00, 0x01, 0x51, 0xf8, 0x00, 0x01, 0x52, 0x10, 0x00, 0x01, 0x52, 0x28, 0x00, 0x01, 0x52, 0x40, 0x00, 0x01, 0x52, 0x58, 0x00, 0x01, 0x52, 0x70, 0x00, 0x01, 0x52, 0x88, 0x00, 0x01, 0x52, 0xa0, 0x00, 0x01, 0x52, 0xb8, 0x00, 0x01, 0x52, 0xd0, 0x00, 0x01, 0x52, 0xe8, 0x00, 0x01, 0x53, 0x00, 0x00, 0x01, 0x53, 0x18, 0x00, 0x01, 0x53, 0x30, 0x00, 0x01, 0x53, 0x48, 0x00, 0x01, 0x53, 0x60, 0x00, 0x01, 0x53, 0x78, 0x00, 0x01, 0x53, 0x90, 0x00, 0x01, 0x53, 0xa8, 0x00, 0x01, 0x53, 0xc0, 0x00, 0x01, 0x53, 0xd8, 0x00, 0x01, 0x53, 0xf0, 0x00, 0x01, 0x54, 0x08, 0x00, 0x01, 0x54, 0x20, 0x00, 0x01, 0x54, 0x38, 0x00, 0x01, 0x54, 0x50, 0x00, 0x01, 0x54, 0x68, 0x00, 0x01, 0x54, 0x80, 0x00, 0x01, 0x54, 0x98, 0x00, 0x01, 0x54, 0xb0, 0x00, 0x01, 0x54, 0xc8, 0x00, 0x01, 0x54, 0xe0, 0x00, 0x01, 0x54, 0xf8, 0x00, 0x01, 0x55, 0x10, 0x00, 0x01, 0x55, 0x28, 0x00, 0x01, 0x55, 0x40, 0x00, 0x01, 0x55, 0x58, 0x00, 0x01, 0x55, 0x70, 0x00, 0x01, 0x55, 0x88, 0x00, 0x01, 0x55, 0xa0, 0x00, 0x01, 0x55, 0xb8, 0x00, 0x01, 0x55, 0xd0, 0x00, 0x01, 0x55, 0xe8, 0x00, 0x01, 0x56, 0x00, 0x00, 0x01, 0x56, 0x18, 0x00, 0x01, 0x56, 0x30, 0x00, 0x01, 0x56, 0x80, 0x00, 0x01, 0x56, 0xc8, 0x00, 0x01, 0x57, 0x60, 0x00, 0x01, 0x57, 0x70, 0x00, 0x01, 0x57, 0x88, 0x00, 0x01, 0x57, 0xa0, 0x00, 0x01, 0x57, 0xb8, 0x00, 0x01, 0x57, 0xd0, 0x00, 0x01, 0x57, 0xe8, 0x00, 0x01, 0x58, 0x00, 0x00, 0x01, 0x58, 0x18, 0x00, 0x01, 0x58, 0x30, 0x00, 0x01, 0x58, 0x48, 0x00, 0x01, 0x58, 0x60, 0x00, 0x01, 0x58, 0x78, 0x00, 0x01, 0x58, 0x90, 0x00, 0x01, 0x58, 0xa8, 0x00, 0x01, 0x58, 0xc0, 0x00, 0x01, 0x58, 0xd8, 0x00, 0x01, 0x58, 0xf0, 0x00, 0x01, 0x59, 0x08, 0x00, 0x01, 0x59, 0x20, 0x00, 0x01, 0x59, 0x38, 0x00, 0x01, 0x59, 0x50, 0x00, 0x01, 0x59, 0x68, 0x00, 0x01, 0x59, 0x80, 0x00, 0x01, 0x59, 0x98, 0x00, 0x01, 0x59, 0xb0, 0x00, 0x01, 0x59, 0xc8, 0x00, 0x01, 0x59, 0xe0, 0x00, 0x01, 0x59, 0xf8, 0x00, 0x01, 0x5a, 0x10, 0x00, 0x01, 0x5a, 0x28, 0x00, 0x01, 0x5a, 0x40, 0x00, 0x01, 0x5a, 0x58, 0x00, 0x01, 0x5a, 0x70, 0x00, 0x01, 0x5a, 0x88, 0x00, 0x01, 0x5a, 0xa0, 0x00, 0x01, 0x5a, 0xb8, 0x00, 0x01, 0x5a, 0xd0, 0x00, 0x01, 0x5a, 0xe8, 0x00, 0x01, 0x5b, 0x00, 0x00, 0x01, 0x5b, 0x18, 0x00, 0x01, 0x5b, 0x38, 0x00, 0x01, 0x5b, 0x50, 0x00, 0x01, 0x5b, 0x68, 0x00, 0x01, 0x5b, 0x80, 0x00, 0x01, 0x5b, 0x98, 0x00, 0x01, 0x5b, 0xb0, 0x00, 0x01, 0x5b, 0xc8, 0x00, 0x01, 0x5b, 0xe0, 0x00, 0x01, 0x5b, 0xf8, 0x00, 0x01, 0x5c, 0x10, 0x00, 0x01, 0x5c, 0x28, 0x00, 0x01, 0x5c, 0x40, 0x00, 0x01, 0x5c, 0x58, 0x00, 0x01, 0x5c, 0x70, 0x00, 0x01, 0x5c, 0x88, 0x00, 0x01, 0x5c, 0xa0, 0x00, 0x01, 0x5c, 0xb8, 0x00, 0x01, 0x5c, 0xd0, 0x00, 0x01, 0x5c, 0xf0, 0x00, 0x01, 0x5d, 0x08, 0x00, 0x01, 0x5d, 0x20, 0x00, 0x01, 0x5d, 0x38, 0x00, 0x01, 0x5d, 0x50, 0x00, 0x01, 0x5d, 0x68, 0x00, 0x01, 0x5d, 0x80, 0x00, 0x01, 0x5d, 0x98, 0x00, 0x01, 0x5d, 0xb0, 0x00, 0x01, 0x5d, 0xc8, 0x00, 0x01, 0x5d, 0xe0, 0x00, 0x01, 0x5d, 0xf8, 0x00, 0x01, 0x5e, 0x10, 0x00, 0x01, 0x5e, 0x28, 0x00, 0x01, 0x5e, 0x40, 0x00, 0x01, 0x5e, 0x58, 0x00, 0x01, 0x5e, 0x70, 0x00, 0x01, 0x5e, 0x88, 0x00, 0x01, 0x5e, 0xa0, 0x00, 0x01, 0x5e, 0xb8, 0x00, 0x01, 0x5e, 0xd0, 0x00, 0x01, 0x5e, 0xe8, 0x00, 0x01, 0x5f, 0x00, 0x00, 0x01, 0x5f, 0x18, 0x00, 0x01, 0x5f, 0x30, 0x00, 0x01, 0x5f, 0x48, 0x00, 0x01, 0x5f, 0x60, 0x00, 0x01, 0x5f, 0x78, 0x00, 0x01, 0x5f, 0x90, 0x00, 0x01, 0x5f, 0xa8, 0x00, 0x01, 0x5f, 0xc0, 0x00, 0x01, 0x5f, 0xd8, 0x00, 0x01, 0x5f, 0xf0, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x01, 0x60, 0x58, 0x00, 0x01, 0x60, 0x70, 0x00, 0x01, 0x60, 0x88, 0x00, 0x01, 0x60, 0xa0, 0x00, 0x01, 0x60, 0xb8, 0x00, 0x01, 0x60, 0xd0, 0x00, 0x01, 0x60, 0xe8, 0x00, 0x01, 0x61, 0x00, 0x00, 0x01, 0x61, 0x18, 0x00, 0x01, 0x61, 0x30, 0x00, 0x01, 0x61, 0x48, 0x00, 0x01, 0x61, 0x60, 0x00, 0x01, 0x61, 0x78, 0x00, 0x01, 0x61, 0x94, 0x00, 0x01, 0x61, 0xb0, 0x00, 0x01, 0x61, 0xc8, 0x00, 0x01, 0x61, 0xe0, 0x00, 0x01, 0x61, 0xf8, 0x00, 0x01, 0x62, 0x10, 0x00, 0x01, 0x62, 0x28, 0x00, 0x01, 0x62, 0x40, 0x00, 0x01, 0x62, 0x58, 0x00, 0x01, 0x62, 0x70, 0x00, 0x01, 0x62, 0x8c, 0x00, 0x01, 0x62, 0xa8, 0x00, 0x01, 0x62, 0xc0, 0x00, 0x01, 0x62, 0xd8, 0x00, 0x01, 0x62, 0xf4, 0x00, 0x01, 0x63, 0x10, 0x00, 0x01, 0x63, 0x28, 0x00, 0x01, 0x63, 0x40, 0x00, 0x01, 0x63, 0x58, 0x00, 0x01, 0x63, 0x70, 0x00, 0x01, 0x63, 0x88, 0x00, 0x01, 0x63, 0xa0, 0x00, 0x01, 0x63, 0xb8, 0x00, 0x01, 0x63, 0xd0, 0x00, 0x01, 0x63, 0xec, 0x00, 0x01, 0x64, 0x08, 0x00, 0x01, 0x64, 0x20, 0x00, 0x01, 0x64, 0x38, 0x00, 0x01, 0x64, 0x54, 0x00, 0x01, 0x64, 0x70, 0x00, 0x01, 0x64, 0x8c, 0x00, 0x01, 0x64, 0xa8, 0x00, 0x01, 0x64, 0xc0, 0x00, 0x01, 0x64, 0xd8, 0x00, 0x01, 0x64, 0xf0, 0x00, 0x01, 0x65, 0x08, 0x00, 0x01, 0x65, 0x20, 0x00, 0x01, 0x65, 0x38, 0x00, 0x01, 0x65, 0x50, 0x00, 0x01, 0x65, 0x68, 0x00, 0x01, 0x65, 0x84, 0x00, 0x01, 0x65, 0xa0, 0x00, 0x01, 0x65, 0xb8, 0x00, 0x01, 0x65, 0xd0, 0x00, 0x01, 0x65, 0xec, 0x00, 0x01, 0x66, 0x08, 0x00, 0x01, 0x66, 0x24, 0x00, 0x01, 0x66, 0x40, 0x00, 0x01, 0x66, 0x58, 0x00, 0x01, 0x66, 0x70, 0x00, 0x01, 0x66, 0x88, 0x00, 0x01, 0x66, 0xa0, 0x00, 0x01, 0x66, 0xb8, 0x00, 0x01, 0x66, 0xd0, 0x00, 0x01, 0x66, 0xe8, 0x00, 0x01, 0x67, 0x00, 0x00, 0x01, 0x67, 0x18, 0x00, 0x01, 0x67, 0x30, 0x00, 0x01, 0x67, 0x4c, 0x00, 0x01, 0x67, 0x68, 0x00, 0x01, 0x67, 0x80, 0x00, 0x01, 0x67, 0x98, 0x00, 0x01, 0x67, 0xb0, 0x00, 0x01, 0x67, 0xc8, 0x00, 0x01, 0x67, 0xe0, 0x00, 0x01, 0x67, 0xf8, 0x00, 0x01, 0x68, 0x10, 0x00, 0x01, 0x68, 0x28, 0x00, 0x01, 0x68, 0x44, 0x00, 0x01, 0x68, 0x5c, 0x00, 0x01, 0x68, 0x78, 0x00, 0x01, 0x68, 0x94, 0x00, 0x01, 0x68, 0xac, 0x00, 0x01, 0x68, 0xc4, 0x00, 0x01, 0x68, 0xdc, 0x00, 0x01, 0x68, 0xf4, 0x00, 0x01, 0x69, 0x0c, 0x00, 0x01, 0x69, 0x24, 0x00, 0x01, 0x69, 0x3c, 0x00, 0x01, 0x69, 0x54, 0x00, 0x01, 0x69, 0x6c, 0x00, 0x01, 0x69, 0x88, 0x00, 0x01, 0x69, 0xa0, 0x00, 0x01, 0x69, 0xb8, 0x00, 0x01, 0x69, 0xd4, 0x00, 0x01, 0x69, 0xf0, 0x00, 0x01, 0x6a, 0x0c, 0x00, 0x01, 0x6a, 0x28, 0x00, 0x01, 0x6a, 0x40, 0x00, 0x01, 0x6a, 0x50, 0x00, 0x01, 0x6a, 0x68, 0x00, 0x01, 0x6a, 0x78, 0x00, 0x01, 0x6a, 0x90, 0x00, 0x01, 0x6a, 0xa0, 0x00, 0x01, 0x6a, 0xb8, 0x00, 0x01, 0x6a, 0xc8, 0x00, 0x01, 0x6a, 0xe0, 0x00, 0x01, 0x6a, 0xf0, 0x00, 0x01, 0x6b, 0x08, 0x00, 0x01, 0x6b, 0x18, 0x00, 0x01, 0x6b, 0x30, 0x00, 0x01, 0x6b, 0x40, 0x00, 0x01, 0x6b, 0x58, 0x00, 0x01, 0x6b, 0x70, 0x00, 0x01, 0x6b, 0x88, 0x00, 0x01, 0x6b, 0xa0, 0x00, 0x01, 0x6b, 0xb8, 0x00, 0x01, 0x6b, 0xd0, 0x00, 0x01, 0x6b, 0xe8, 0x00, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x6c, 0x18, 0x00, 0x01, 0x6c, 0x30, 0x00, 0x01, 0x6c, 0x48, 0x00, 0x01, 0x6c, 0x60, 0x00, 0x01, 0x6c, 0x78, 0x00, 0x01, 0x6c, 0x90, 0x00, 0x01, 0x6c, 0xa8, 0x00, 0x01, 0x6c, 0xc0, 0x00, 0x01, 0x6c, 0xd8, 0x00, 0x01, 0x6c, 0xf0, 0x00, 0x01, 0x6d, 0x08, 0x00, 0x01, 0x6d, 0x20, 0x00, 0x01, 0x6d, 0x38, 0x00, 0x01, 0x6d, 0x50, 0x00, 0x01, 0x6d, 0x68, 0x00, 0x01, 0x6d, 0x80, 0x00, 0x01, 0x6d, 0x98, 0x00, 0x01, 0x6d, 0xb0, 0x00, 0x01, 0x6d, 0xc8, 0x00, 0x01, 0x6d, 0xe0, 0x00, 0x01, 0x6d, 0xf8, 0x00, 0x01, 0x6e, 0x10, 0x00, 0x01, 0x6e, 0x28, 0x00, 0x01, 0x6e, 0x40, 0x00, 0x01, 0x6e, 0x58, 0x00, 0x01, 0x6e, 0x70, 0x00, 0x01, 0x6e, 0x88, 0x00, 0x01, 0x6e, 0xa0, 0x00, 0x01, 0x6e, 0xb8, 0x00, 0x01, 0x6e, 0xd0, 0x00, 0x01, 0x6e, 0xe8, 0x00, 0x01, 0x6f, 0x00, 0x00, 0x01, 0x6f, 0x18, 0x00, 0x01, 0x6f, 0x30, 0x00, 0x01, 0x6f, 0x48, 0x00, 0x01, 0x6f, 0x60, 0x00, 0x01, 0x6f, 0x78, 0x00, 0x01, 0x6f, 0x90, 0x00, 0x01, 0x6f, 0xa8, 0x00, 0x01, 0x6f, 0xc0, 0x00, 0x01, 0x6f, 0xd8, 0x00, 0x01, 0x6f, 0xf0, 0x00, 0x01, 0x70, 0x08, 0x00, 0x01, 0x70, 0x20, 0x00, 0x01, 0x70, 0x38, 0x00, 0x01, 0x70, 0x50, 0x00, 0x01, 0x70, 0x68, 0x00, 0x01, 0x70, 0x80, 0x00, 0x01, 0x70, 0x98, 0x00, 0x01, 0x70, 0xb0, 0x00, 0x01, 0x70, 0xc0, 0x00, 0x01, 0x70, 0xd8, 0x00, 0x01, 0x70, 0xe8, 0x00, 0x01, 0x70, 0xf8, 0x00, 0x01, 0x71, 0x20, 0x00, 0x01, 0x71, 0x30, 0x00, 0x01, 0x71, 0x48, 0x00, 0x01, 0x71, 0x60, 0x00, 0x01, 0x71, 0x78, 0x00, 0x01, 0x71, 0x90, 0x00, 0x01, 0x71, 0xa8, 0x00, 0x01, 0x71, 0xc0, 0x00, 0x01, 0x71, 0xdc, 0x00, 0x01, 0x71, 0xec, 0x00, 0x01, 0x72, 0x08, 0x00, 0x01, 0x72, 0x18, 0x00, 0x01, 0x72, 0x30, 0x00, 0x01, 0x72, 0x4c, 0x00, 0x01, 0x72, 0x64, 0x00, 0x01, 0x72, 0x7c, 0x00, 0x01, 0x72, 0x94, 0x00, 0x01, 0x72, 0xac, 0x00, 0x01, 0x72, 0xc4, 0x00, 0x01, 0x72, 0xd4, 0x00, 0x01, 0x72, 0xec, 0x00, 0x01, 0x73, 0x04, 0x00, 0x01, 0x73, 0x1c, 0x00, 0x01, 0x73, 0x34, 0x00, 0x01, 0x73, 0x50, 0x00, 0x01, 0x73, 0x60, 0x00, 0x01, 0x73, 0x7c, 0x00, 0x01, 0x73, 0x94, 0x00, 0x01, 0x73, 0xac, 0x00, 0x01, 0x73, 0xc4, 0x00, 0x01, 0x73, 0xdc, 0x00, 0x01, 0x73, 0xf4, 0x00, 0x01, 0x74, 0x04, 0x00, 0x01, 0x74, 0x1c, 0x00, 0x01, 0x74, 0x34, 0x00, 0x01, 0x74, 0x4c, 0x00, 0x01, 0x74, 0x64, 0x00, 0x01, 0x74, 0x7c, 0x00, 0x01, 0x74, 0x94, 0x00, 0x01, 0x74, 0xb0, 0x00, 0x01, 0x74, 0xc0, 0x00, 0x01, 0x74, 0xdc, 0x00, 0x01, 0x74, 0xf4, 0x00, 0x01, 0x75, 0x04, 0x00, 0x01, 0x75, 0x14, 0x00, 0x01, 0x75, 0x2c, 0x00, 0x01, 0x75, 0x44, 0x00, 0x01, 0x75, 0x5c, 0x00, 0x01, 0x75, 0x74, 0x00, 0x01, 0x75, 0x8c, 0x00, 0x01, 0x75, 0xa8, 0x00, 0x01, 0x75, 0xb8, 0x00, 0x01, 0x75, 0xd4, 0x00, 0x01, 0x75, 0xe4, 0x00, 0x01, 0x75, 0xfc, 0x00, 0x01, 0x76, 0x0c, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x4c, 0x00, 0x01, 0x76, 0x5c, 0x00, 0x01, 0x76, 0x78, 0x00, 0x01, 0x76, 0x94, 0x00, 0x01, 0x76, 0xb0, 0x00, 0x01, 0x76, 0xcc, 0x00, 0x01, 0x76, 0xe4, 0x00, 0x01, 0x76, 0xfc, 0x00, 0x01, 0x77, 0x20, 0x00, 0x01, 0x77, 0x40, 0x00, 0x01, 0x77, 0x60, 0x00, 0x01, 0x77, 0x84, 0x00, 0x01, 0x77, 0xbc, 0x00, 0x01, 0x77, 0xf0, 0x00, 0x01, 0x78, 0x24, 0x00, 0x01, 0x78, 0x58, 0x00, 0x01, 0x78, 0x88, 0x00, 0x01, 0x78, 0xd0, 0x00, 0x01, 0x79, 0x00, 0x00, 0x01, 0x79, 0x1c, 0x00, 0x01, 0x79, 0x34, 0x00, 0x01, 0x79, 0x58, 0x00, 0x01, 0x79, 0x88, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x7a, 0x7c, 0x00, 0x01, 0x7b, 0x8c, 0x00, 0x01, 0x7b, 0xac, 0x00, 0x01, 0x7b, 0xc4, 0x00, 0x01, 0x7b, 0xe4, 0x00, 0x01, 0x7c, 0x00, 0x00, 0x01, 0x7c, 0x18, 0x00, 0x01, 0x7c, 0x38, 0x00, 0x01, 0x7c, 0x5c, 0x00, 0x01, 0x7c, 0x84, 0x00, 0x01, 0x7c, 0xb0, 0x00, 0x01, 0x7c, 0xe0, 0x00, 0x01, 0x7c, 0xfc, 0x00, 0x01, 0x7d, 0x78, 0x00, 0x01, 0x7d, 0x8c, 0x00, 0x01, 0x7d, 0xc8, 0x00, 0x01, 0x7e, 0x04, 0x00, 0x01, 0x7e, 0x30, 0x00, 0x01, 0x7e, 0x54, 0x00, 0x01, 0x7e, 0x70, 0x00, 0x01, 0x7e, 0x8c, 0x00, 0x01, 0x7e, 0xbc, 0x00, 0x01, 0x7e, 0xec, 0x00, 0x01, 0x7f, 0x04, 0x00, 0x01, 0x7f, 0x1c, 0x00, 0x01, 0x7f, 0x38, 0x00, 0x01, 0x7f, 0x6c, 0x00, 0x01, 0x7f, 0xa0, 0x00, 0x01, 0x7f, 0xd0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x01, 0x80, 0x44, 0x00, 0x01, 0x80, 0x5c, 0x00, 0x01, 0x80, 0x78, 0x00, 0x01, 0x80, 0x9c, 0x00, 0x01, 0x80, 0xfc, 0x00, 0x01, 0x81, 0x10, 0x00, 0x01, 0x81, 0x64, 0x00, 0x01, 0x81, 0x98, 0x00, 0x01, 0x81, 0xc0, 0x00, 0x01, 0x82, 0x00, 0x00, 0x01, 0x82, 0x4c, 0x00, 0x01, 0x82, 0x70, 0x00, 0x01, 0x82, 0xac, 0x00, 0x01, 0x83, 0x10, 0x00, 0x01, 0x83, 0x40, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0xd0, 0x00, 0x01, 0x83, 0xf4, 0x00, 0x01, 0x84, 0x2c, 0x00, 0x01, 0x84, 0x90, 0x00, 0x01, 0x85, 0x20, 0x00, 0x01, 0x85, 0x48, 0x00, 0x01, 0x85, 0xf8, 0x00, 0x01, 0x86, 0x84, 0x00, 0x01, 0x86, 0xb8, 0x00, 0x01, 0x86, 0xd4, 0x00, 0x01, 0x86, 0xfc, 0x00, 0x01, 0x87, 0x34, 0x00, 0x01, 0x87, 0x70, 0x00, 0x01, 0x87, 0xb4, 0x00, 0x01, 0x87, 0xc8, 0x00, 0x01, 0x87, 0xdc, 0x00, 0x01, 0x87, 0xf0, 0x00, 0x01, 0x88, 0x04, 0x00, 0x01, 0x88, 0x18, 0x00, 0x01, 0x88, 0x2c, 0x00, 0x01, 0x88, 0x40, 0x00, 0x01, 0x88, 0x54, 0x00, 0x01, 0x88, 0x68, 0x00, 0x01, 0x88, 0x7c, 0x00, 0x01, 0x88, 0x90, 0x00, 0x01, 0x88, 0xa4, 0x00, 0x01, 0x88, 0xb8, 0x00, 0x01, 0x88, 0xcc, 0x00, 0x01, 0x88, 0xe0, 0x00, 0x01, 0x88, 0xf4, 0x00, 0x01, 0x89, 0x08, 0x00, 0x01, 0x89, 0x1c, 0x00, 0x01, 0x89, 0x30, 0x00, 0x01, 0x89, 0x44, 0x00, 0x01, 0x89, 0x58, 0x00, 0x01, 0x89, 0x6c, 0x00, 0x01, 0x89, 0x80, 0x00, 0x01, 0x89, 0x94, 0x00, 0x01, 0x89, 0xa8, 0x00, 0x01, 0x89, 0xbc, 0x00, 0x01, 0x89, 0xd0, 0x00, 0x01, 0x89, 0xe4, 0x00, 0x01, 0x8a, 0x58, 0x00, 0x01, 0x8b, 0x08, 0x00, 0x01, 0x8b, 0x98, 0x00, 0x01, 0x8b, 0xd8, 0x00, 0x01, 0x8c, 0x40, 0x00, 0x01, 0x8c, 0xc4, 0x00, 0x01, 0x8d, 0x48, 0x00, 0x01, 0x8e, 0x2c, 0x00, 0x01, 0x8e, 0xf8, 0x00, 0x01, 0x8f, 0xa4, 0x00, 0x01, 0x90, 0x04, 0x00, 0x01, 0x90, 0x1c, 0x00, 0x01, 0x90, 0xb4, 0x00, 0x01, 0x90, 0xfc, 0x00, 0x01, 0x91, 0x54, 0x00, 0x01, 0x92, 0xe0, 0x00, 0x01, 0x93, 0x7c, 0x00, 0x01, 0x94, 0x14, 0x00, 0x01, 0x94, 0xa8, 0x00, 0x01, 0x95, 0x14, 0x00, 0x01, 0x95, 0xb4, 0x00, 0x01, 0x96, 0x44, 0x00, 0x01, 0x96, 0x78, 0x00, 0x01, 0x96, 0xf8, 0x00, 0x01, 0x97, 0x60, 0x00, 0x01, 0x97, 0x84, 0x00, 0x01, 0x97, 0xa4, 0x00, 0x01, 0x97, 0xcc, 0x00, 0x01, 0x97, 0xf4, 0x00, 0x01, 0x98, 0x2c, 0x00, 0x01, 0x98, 0x70, 0x00, 0x01, 0x98, 0xa8, 0x00, 0x01, 0x99, 0x68, 0x00, 0x01, 0x9a, 0x40, 0x00, 0x01, 0x9a, 0xb8, 0x00, 0x01, 0x9a, 0xd0, 0x00, 0x01, 0x9b, 0x5c, 0x00, 0x01, 0x9b, 0xf8, 0x00, 0x01, 0x9c, 0x90, 0x00, 0x01, 0x9c, 0xa0, 0x00, 0x01, 0x9c, 0xb4, 0x00, 0x01, 0x9c, 0xcc, 0x00, 0x01, 0x9e, 0x0c, 0x00, 0x01, 0x9e, 0xfc, 0x00, 0x01, 0x9f, 0x4c, 0x00, 0x01, 0x9f, 0xa8, 0x00, 0x01, 0xa0, 0x08, 0x00, 0x01, 0xa0, 0xb4, 0x00, 0x01, 0xa1, 0x48, 0x00, 0x01, 0xa2, 0x24, 0x00, 0x01, 0xa2, 0xa4, 0x00, 0x01, 0xa3, 0x20, 0x00, 0x01, 0xa3, 0x64, 0x00, 0x01, 0xa3, 0xf4, 0x00, 0x01, 0xa4, 0x98, 0x00, 0x01, 0xa5, 0x4c, 0x00, 0x01, 0xa5, 0xbc, 0x00, 0x01, 0xa6, 0x58, 0x00, 0x01, 0xa7, 0x70, 0x00, 0x01, 0xa8, 0x6c, 0x00, 0x01, 0xa9, 0x1c, 0x00, 0x01, 0xa9, 0x8c, 0x00, 0x01, 0xaa, 0x34, 0x00, 0x01, 0xaa, 0xd4, 0x00, 0x01, 0xab, 0x34, 0x00, 0x01, 0xab, 0x80, 0x00, 0x01, 0xab, 0xd0, 0x00, 0x01, 0xac, 0x10, 0x00, 0x01, 0xac, 0x7c, 0x00, 0x01, 0xac, 0x8c, 0x00, 0x01, 0xac, 0x9c, 0x00, 0x01, 0xad, 0x90, 0x00, 0x01, 0xad, 0xc4, 0x00, 0x01, 0xad, 0xd4, 0x00, 0x01, 0xad, 0xe4, 0x00, 0x01, 0xae, 0xd8, 0x00, 0x01, 0xaf, 0x9c, 0x00, 0x01, 0xb0, 0x24, 0x00, 0x01, 0xb0, 0xa0, 0x00, 0x01, 0xb1, 0x68, 0x00, 0x01, 0xb2, 0x48, 0x00, 0x01, 0xb2, 0x74, 0x00, 0x01, 0xb3, 0xb8, 0x00, 0x01, 0xb4, 0x0c, 0x00, 0x01, 0xb4, 0xb0, 0x00, 0x01, 0xb5, 0x40, 0x00, 0x01, 0xb5, 0xcc, 0x00, 0x01, 0xb6, 0x44, 0x00, 0x01, 0xb6, 0x8c, 0x00, 0x01, 0xb6, 0xfc, 0x00, 0x01, 0xb7, 0x7c, 0x00, 0x01, 0xb8, 0x10, 0x00, 0x01, 0xb8, 0x84, 0x00, 0x01, 0xb8, 0xb4, 0x00, 0x01, 0xb8, 0xf8, 0x00, 0x01, 0xb9, 0x4c, 0x00, 0x01, 0xb9, 0xb4, 0x00, 0x01, 0xb9, 0xd4, 0x00, 0x01, 0xb9, 0xf8, 0x00, 0x01, 0xba, 0x24, 0x00, 0x01, 0xba, 0xa8, 0x00, 0x01, 0xbb, 0x54, 0x00, 0x01, 0xbb, 0xf4, 0x00, 0x01, 0xbc, 0x2c, 0x00, 0x01, 0xbc, 0x94, 0x00, 0x01, 0xbd, 0x2c, 0x00, 0x01, 0xbd, 0x58, 0x00, 0x01, 0xbd, 0x78, 0x00, 0x01, 0xbd, 0x98, 0x00, 0x01, 0xbd, 0xc0, 0x00, 0x01, 0xbd, 0xe0, 0x00, 0x01, 0xbe, 0x00, 0x00, 0x01, 0xbe, 0x20, 0x00, 0x01, 0xbe, 0x40, 0x00, 0x01, 0xbe, 0x60, 0x00, 0x01, 0xbe, 0x80, 0x00, 0x01, 0xbe, 0xa0, 0x00, 0x01, 0xbe, 0xc0, 0x00, 0x01, 0xbe, 0xe0, 0x00, 0x01, 0xbf, 0x00, 0x00, 0x01, 0xbf, 0x20, 0x00, 0x01, 0xbf, 0x40, 0x00, 0x01, 0xbf, 0x58, 0x00, 0x01, 0xbf, 0x68, 0x00, 0x01, 0xbf, 0x80, 0x00, 0x01, 0xbf, 0xa0, 0x00, 0x01, 0xbf, 0xb8, 0x00, 0x01, 0xbf, 0xc8, 0x00, 0x01, 0xbf, 0xe0, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x28, 0x00, 0x01, 0xc0, 0x40, 0x00, 0x01, 0xc0, 0x50, 0x00, 0x01, 0xc0, 0x68, 0x00, 0x01, 0xc0, 0x88, 0x00, 0x01, 0xc0, 0x98, 0x00, 0x01, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xb8, 0x00, 0x01, 0xc0, 0xc8, 0x00, 0x01, 0xc0, 0xd8, 0x00, 0x01, 0xc0, 0xf0, 0x00, 0x01, 0xc1, 0x10, 0x00, 0x01, 0xc1, 0x28, 0x00, 0x01, 0xc1, 0x38, 0x00, 0x01, 0xc1, 0x50, 0x00, 0x01, 0xc1, 0x70, 0x00, 0x01, 0xc1, 0x98, 0x00, 0x01, 0xc1, 0xb0, 0x00, 0x01, 0xc1, 0xc0, 0x00, 0x01, 0xc1, 0xd8, 0x00, 0x01, 0xc1, 0xf8, 0x00, 0x01, 0xc2, 0x08, 0x00, 0x01, 0xc2, 0x18, 0x00, 0x01, 0xc2, 0x28, 0x00, 0x01, 0xc2, 0x38, 0x00, 0x01, 0xc2, 0xbc, 0x00, 0x01, 0xc3, 0x38, 0x00, 0x01, 0xc4, 0x14, 0x00, 0x01, 0xc4, 0x24, 0x00, 0x01, 0xc4, 0x34, 0x00, 0x01, 0xc4, 0x9c, 0x00, 0x01, 0xc4, 0xbc, 0x00, 0x01, 0xc4, 0xec, 0x00, 0x01, 0xc5, 0x1c, 0x00, 0x01, 0xc5, 0x4c, 0x00, 0x01, 0xc5, 0x7c, 0x00, 0x01, 0xc5, 0xc0, 0x00, 0x01, 0xc6, 0x04, 0x00, 0x01, 0xc6, 0x34, 0x00, 0x01, 0xc6, 0x64, 0x00, 0x01, 0xc6, 0x94, 0x00, 0x01, 0xc6, 0xc4, 0x00, 0x01, 0xc7, 0x10, 0x00, 0x01, 0xc7, 0x5c, 0x00, 0x01, 0xc8, 0x04, 0x00, 0x01, 0xc8, 0xac, 0x00, 0x01, 0xc8, 0xf8, 0x00, 0x01, 0xc9, 0x44, 0x00, 0x01, 0xc9, 0x90, 0x00, 0x01, 0xc9, 0xdc, 0x00, 0x01, 0xca, 0x24, 0x00, 0x01, 0xca, 0x70, 0x00, 0x01, 0xca, 0xac, 0x00, 0x01, 0xca, 0xe8, 0x00, 0x01, 0xcb, 0x24, 0x00, 0x01, 0xcb, 0x60, 0x00, 0x01, 0xcb, 0xb4, 0x00, 0x01, 0xcc, 0x34, 0x00, 0x01, 0xcc, 0xc0, 0x00, 0x01, 0xcd, 0x84, 0x00, 0x01, 0xce, 0x48, 0x00, 0x01, 0xcf, 0x5c, 0x00, 0x01, 0xcf, 0xbc, 0x00, 0x01, 0xd0, 0x04, 0x00, 0x01, 0xd0, 0x3c, 0x00, 0x01, 0xd0, 0x74, 0x00, 0x01, 0xd0, 0xac, 0x00, 0x01, 0xd0, 0xe4, 0x00, 0x01, 0xd1, 0x1c, 0x00, 0x01, 0xd1, 0x54, 0x00, 0x01, 0xd1, 0xd4, 0x00, 0x01, 0xd2, 0x54, 0x00, 0x01, 0xd2, 0x90, 0x00, 0x01, 0xd2, 0xfc, 0x00, 0x01, 0xd3, 0xa4, 0x00, 0x01, 0xd4, 0x4c, 0x00, 0x01, 0xd4, 0x70, 0x00, 0x01, 0xd4, 0x98, 0x00, 0x01, 0xd4, 0xc0, 0x00, 0x01, 0xd4, 0xe8, 0x00, 0x01, 0xd5, 0x10, 0x00, 0x01, 0xd5, 0x38, 0x00, 0x01, 0xd5, 0x5c, 0x00, 0x01, 0xd5, 0x80, 0x00, 0x01, 0xd5, 0x9c, 0x00, 0x01, 0xd5, 0xb8, 0x00, 0x01, 0xd5, 0xd4, 0x00, 0x01, 0xd6, 0x1c, 0x00, 0x01, 0xd6, 0x64, 0x00, 0x01, 0xd6, 0xac, 0x00, 0x01, 0xd6, 0xf4, 0x00, 0x01, 0xd7, 0x10, 0x00, 0x01, 0xd7, 0x2c, 0x00, 0x01, 0xd7, 0x94, 0x00, 0x01, 0xd8, 0x14, 0x00, 0x01, 0xd8, 0x7c, 0x00, 0x01, 0xd8, 0xbc, 0x00, 0x01, 0xd8, 0xfc, 0x00, 0x01, 0xd9, 0x3c, 0x00, 0x01, 0xd9, 0x7c, 0x00, 0x01, 0xd9, 0xd8, 0x00, 0x01, 0xda, 0x34, 0x00, 0x01, 0xda, 0x74, 0x00, 0x01, 0xda, 0xb4, 0x00, 0x01, 0xda, 0xf4, 0x00, 0x01, 0xdb, 0x34, 0x00, 0x01, 0xdb, 0x74, 0x00, 0x01, 0xdb, 0xb4, 0x00, 0x01, 0xdc, 0x10, 0x00, 0x01, 0xdc, 0x6c, 0x00, 0x01, 0xdc, 0xc4, 0x00, 0x01, 0xdd, 0x1c, 0x00, 0x01, 0xdd, 0x60, 0x00, 0x01, 0xdd, 0xa8, 0x00, 0x01, 0xdd, 0xf0, 0x00, 0x01, 0xde, 0x3c, 0x00, 0x01, 0xde, 0x78, 0x00, 0x01, 0xde, 0xb4, 0x00, 0x01, 0xde, 0xf8, 0x00, 0x01, 0xdf, 0x38, 0x00, 0x01, 0xdf, 0x78, 0x00, 0x01, 0xdf, 0xb4, 0x00, 0x01, 0xe0, 0x10, 0x00, 0x01, 0xe0, 0x60, 0x00, 0x01, 0xe0, 0xc0, 0x00, 0x01, 0xe1, 0x1c, 0x00, 0x01, 0xe1, 0x7c, 0x00, 0x01, 0xe1, 0xf0, 0x00, 0x01, 0xe2, 0x44, 0x00, 0x01, 0xe2, 0x88, 0x00, 0x01, 0xe2, 0xcc, 0x00, 0x01, 0xe3, 0x20, 0x00, 0x01, 0xe3, 0xfc, 0x00, 0x01, 0xe4, 0x18, 0x00, 0x01, 0xe4, 0x78, 0x00, 0x01, 0xe4, 0xbc, 0x00, 0x01, 0xe5, 0x04, 0x00, 0x01, 0xe5, 0x60, 0x00, 0x01, 0xe5, 0xb8, 0x00, 0x01, 0xe6, 0x14, 0x00, 0x01, 0xe6, 0x84, 0x00, 0x01, 0xe6, 0xb8, 0x00, 0x01, 0xe6, 0xec, 0x00, 0x01, 0xe7, 0x3c, 0x00, 0x01, 0xe7, 0x74, 0x00, 0x01, 0xe7, 0xd8, 0x00, 0x01, 0xe8, 0x6c, 0x00, 0x01, 0xe8, 0xa0, 0x00, 0x01, 0xe9, 0x08, 0x00, 0x01, 0xe9, 0xc8, 0x00, 0x01, 0xe9, 0xf4, 0x00, 0x01, 0xea, 0x24, 0x00, 0x01, 0xea, 0x88, 0x00, 0x01, 0xeb, 0x2c, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x01, 0xeb, 0xe4, 0x00, 0x01, 0xec, 0x88, 0x00, 0x01, 0xec, 0xdc, 0x00, 0x01, 0xec, 0xf8, 0x00, 0x01, 0xed, 0x20, 0x00, 0x01, 0xed, 0x48, 0x00, 0x01, 0xed, 0x80, 0x00, 0x01, 0xed, 0x9c, 0x00, 0x01, 0xed, 0xd8, 0x00, 0x01, 0xee, 0x14, 0x00, 0x01, 0xee, 0x24, 0x00, 0x01, 0xee, 0x38, 0x00, 0x01, 0xee, 0x84, 0x00, 0x01, 0xee, 0x98, 0x00, 0x01, 0xee, 0xa8, 0x00, 0x01, 0xee, 0xdc, 0x00, 0x01, 0xee, 0xf4, 0x00, 0x01, 0xef, 0x0c, 0x00, 0x01, 0xef, 0xa4, 0x00, 0x01, 0xf0, 0x5c, 0x00, 0x01, 0xf0, 0x7c, 0x00, 0x01, 0xf0, 0xa0, 0x00, 0x01, 0xf1, 0x0c, 0x00, 0x01, 0xf1, 0x84, 0x00, 0x01, 0xf1, 0xa0, 0x00, 0x01, 0xf1, 0xd4, 0x00, 0x01, 0xf1, 0xfc, 0x00, 0x01, 0xf2, 0x44, 0x00, 0x01, 0xf2, 0x6c, 0x00, 0x01, 0xf2, 0x94, 0x00, 0x01, 0xf2, 0xd4, 0x00, 0x01, 0xf3, 0x14, 0x00, 0x01, 0xf3, 0x64, 0x00, 0x01, 0xf3, 0x7c, 0x00, 0x01, 0xf3, 0x9c, 0x00, 0x01, 0xf4, 0x68, 0x00, 0x01, 0xf5, 0xa0, 0x00, 0x01, 0xf7, 0x48, 0x00, 0x01, 0xf7, 0xe8, 0x00, 0x01, 0xf8, 0xb0, 0x00, 0x01, 0xf9, 0x78, 0x00, 0x01, 0xf9, 0x9c, 0x00, 0x01, 0xf9, 0xc0, 0x00, 0x01, 0xf9, 0xdc, 0x00, 0x01, 0xfa, 0x08, 0x00, 0x01, 0xfa, 0x20, 0x00, 0x01, 0xfa, 0x54, 0x00, 0x01, 0xfa, 0x84, 0x00, 0x01, 0xfa, 0xa4, 0x00, 0x01, 0xfb, 0x04, 0x00, 0x01, 0xfb, 0x64, 0x00, 0x01, 0xfb, 0xe0, 0x00, 0x01, 0xfc, 0x28, 0x00, 0x01, 0xfc, 0x88, 0x00, 0x01, 0xfc, 0xe8, 0x00, 0x01, 0xfd, 0x54, 0x00, 0x01, 0xfd, 0xbc, 0x00, 0x01, 0xfe, 0x3c, 0x00, 0x01, 0xfe, 0xb0, 0x00, 0x01, 0xff, 0x40, 0x00, 0x01, 0xff, 0xd0, 0x00, 0x02, 0x00, 0x84, 0x00, 0x02, 0x01, 0x24, 0x00, 0x02, 0x01, 0xd4, 0x00, 0x02, 0x02, 0xbc, 0x00, 0x02, 0x03, 0x30, 0x00, 0x02, 0x03, 0x88, 0x00, 0x02, 0x04, 0x40, 0x00, 0x02, 0x04, 0xb4, 0x00, 0x02, 0x04, 0xcc, 0x00, 0x02, 0x04, 0xec, 0x00, 0x02, 0x05, 0x0c, 0x00, 0x02, 0x05, 0x2c, 0x00, 0x02, 0x05, 0x50, 0x00, 0x02, 0x05, 0x70, 0x00, 0x02, 0x05, 0xcc, 0x00, 0x02, 0x06, 0x38, 0x00, 0x02, 0x06, 0x7c, 0x00, 0x02, 0x06, 0xc0, 0x00, 0x02, 0x07, 0x00, 0x00, 0x02, 0x07, 0x4c, 0x00, 0x02, 0x07, 0x90, 0x00, 0x02, 0x08, 0x70, 0x00, 0x02, 0x08, 0xf4, 0x00, 0x02, 0x09, 0x80, 0x00, 0x02, 0x09, 0xcc, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x02, 0x0a, 0x60, 0x00, 0x02, 0x0a, 0xa4, 0x00, 0x02, 0x0a, 0xe0, 0x00, 0x02, 0x0b, 0x18, 0x00, 0x02, 0x0b, 0x60, 0x00, 0x02, 0x0b, 0xa0, 0x00, 0x02, 0x0c, 0x08, 0x00, 0x02, 0x0c, 0x6c, 0x00, 0x02, 0x0c, 0xb4, 0x00, 0x02, 0x0c, 0xf8, 0x00, 0x02, 0x0d, 0x80, 0x00, 0x02, 0x0d, 0xe8, 0x00, 0x02, 0x0e, 0x3c, 0x00, 0x02, 0x0e, 0x90, 0x00, 0x02, 0x0e, 0xfc, 0x00, 0x02, 0x0f, 0x64, 0x00, 0x02, 0x0f, 0xe4, 0x00, 0x02, 0x10, 0x5c, 0x00, 0x02, 0x11, 0x10, 0x00, 0x02, 0x11, 0xc4, 0x00, 0x02, 0x12, 0x08, 0x00, 0x02, 0x12, 0x50, 0x00, 0x02, 0x12, 0xdc, 0x00, 0x02, 0x13, 0x64, 0x00, 0x02, 0x13, 0xa0, 0x00, 0x02, 0x13, 0xd8, 0x00, 0x02, 0x14, 0x2c, 0x00, 0x02, 0x14, 0x7c, 0x00, 0x02, 0x15, 0x0c, 0x00, 0x02, 0x15, 0x98, 0x00, 0x02, 0x16, 0x08, 0x00, 0x02, 0x16, 0x78, 0x00, 0x02, 0x16, 0xbc, 0x00, 0x02, 0x17, 0x00, 0x00, 0x02, 0x17, 0x68, 0x00, 0x02, 0x17, 0xd0, 0x00, 0x02, 0x18, 0x24, 0x00, 0x02, 0x18, 0x74, 0x00, 0x02, 0x18, 0xf0, 0x00, 0x02, 0x19, 0x70, 0x00, 0x02, 0x19, 0xdc, 0x00, 0x02, 0x1a, 0x48, 0x00, 0x02, 0x1a, 0xa8, 0x00, 0x02, 0x1a, 0xc0, 0x00, 0x02, 0x1b, 0x1c, 0x00, 0x02, 0x1b, 0x44, 0x00, 0x02, 0x1b, 0x6c, 0x00, 0x02, 0x1b, 0xa0, 0x00, 0x02, 0x1b, 0xd4, 0x00, 0x02, 0x1b, 0xfc, 0x00, 0x02, 0x1c, 0x20, 0x00, 0x02, 0x1c, 0xe8, 0x00, 0x02, 0x1d, 0x9c, 0x00, 0x02, 0x1e, 0x68, 0x00, 0x02, 0x1f, 0x20, 0x00, 0x02, 0x1f, 0xd0, 0x00, 0x02, 0x20, 0xb8, 0x00, 0x02, 0x21, 0x9c, 0x00, 0x02, 0x22, 0x5c, 0x00, 0x02, 0x23, 0x10, 0x00, 0x02, 0x23, 0x60, 0x00, 0x02, 0x23, 0x9c, 0x00, 0x02, 0x24, 0x00, 0x00, 0x02, 0x24, 0x38, 0x00, 0x02, 0x24, 0x5c, 0x00, 0x02, 0x24, 0x80, 0x00, 0x02, 0x24, 0xa8, 0x00, 0x02, 0x24, 0xcc, 0x00, 0x02, 0x24, 0xf0, 0x00, 0x02, 0x25, 0x20, 0x00, 0x02, 0x25, 0x50, 0x00, 0x02, 0x25, 0x80, 0x00, 0x02, 0x25, 0xc0, 0x00, 0x02, 0x25, 0xfc, 0x00, 0x02, 0x26, 0x40, 0x00, 0x02, 0x26, 0x9c, 0x00, 0x02, 0x26, 0xf0, 0x00, 0x02, 0x27, 0x58, 0x00, 0x02, 0x27, 0xdc, 0x00, 0x02, 0x28, 0x64, 0x00, 0x02, 0x28, 0x94, 0x00, 0x02, 0x28, 0xc0, 0x00, 0x02, 0x28, 0xf8, 0x00, 0x02, 0x29, 0x30, 0x00, 0x02, 0x29, 0x9c, 0x00, 0x02, 0x2a, 0x08, 0x00, 0x02, 0x2a, 0x58, 0x00, 0x02, 0x2a, 0x9c, 0x00, 0x02, 0x2a, 0xc0, 0x00, 0x02, 0x2a, 0xf4, 0x00, 0x02, 0x2b, 0x2c, 0x00, 0x02, 0x2b, 0x60, 0x00, 0x02, 0x2b, 0xb4, 0x00, 0x02, 0x2b, 0xe4, 0x00, 0x02, 0x2c, 0x10, 0x00, 0x02, 0x2c, 0x3c, 0x00, 0x02, 0x2c, 0x80, 0x00, 0x02, 0x2c, 0xc4, 0x00, 0x02, 0x2c, 0xd4, 0x00, 0x02, 0x2c, 0xec, 0x00, 0x02, 0x2d, 0x20, 0x00, 0x02, 0x2d, 0x8c, 0x00, 0x02, 0x2d, 0xd0, 0x00, 0x02, 0x2e, 0x10, 0x00, 0x02, 0x2e, 0x50, 0x00, 0x02, 0x2e, 0x7c, 0x00, 0x02, 0x2e, 0xac, 0x00, 0x02, 0x2f, 0x10, 0x00, 0x02, 0x2f, 0x48, 0x00, 0x02, 0x2f, 0x80, 0x00, 0x02, 0x30, 0x00, 0x00, 0x02, 0x30, 0x80, 0x00, 0x02, 0x30, 0xf8, 0x00, 0x02, 0x31, 0x70, 0x00, 0x02, 0x31, 0xcc, 0x00, 0x02, 0x32, 0x30, 0x00, 0x02, 0x32, 0x68, 0x00, 0x02, 0x32, 0x9c, 0x00, 0x02, 0x33, 0x04, 0x00, 0x02, 0x33, 0x64, 0x00, 0x02, 0x33, 0xbc, 0x00, 0x02, 0x34, 0x10, 0x00, 0x02, 0x34, 0x48, 0x00, 0x02, 0x34, 0x80, 0x00, 0x02, 0x34, 0xd4, 0x00, 0x02, 0x35, 0x28, 0x00, 0x02, 0x35, 0xb8, 0x00, 0x02, 0x36, 0x48, 0x00, 0x02, 0x36, 0xb0, 0x00, 0x02, 0x37, 0x18, 0x00, 0x02, 0x37, 0x64, 0x00, 0x02, 0x37, 0xb0, 0x00, 0x02, 0x38, 0x28, 0x00, 0x02, 0x38, 0xa0, 0x00, 0x02, 0x39, 0x28, 0x00, 0x02, 0x39, 0xb0, 0x00, 0x02, 0x3a, 0x08, 0x00, 0x02, 0x3a, 0x60, 0x00, 0x02, 0x3a, 0xd4, 0x00, 0x02, 0x3b, 0x44, 0x00, 0x02, 0x3b, 0x68, 0x00, 0x02, 0x3b, 0x88, 0x00, 0x02, 0x3b, 0xac, 0x00, 0x02, 0x3b, 0xd0, 0x00, 0x02, 0x3c, 0x44, 0x00, 0x02, 0x3c, 0xa8, 0x00, 0x02, 0x3d, 0x00, 0x00, 0x02, 0x3d, 0x18, 0x00, 0x02, 0x3d, 0x8c, 0x00, 0x02, 0x3d, 0xec, 0x00, 0x02, 0x3e, 0x60, 0x00, 0x02, 0x3e, 0xcc, 0x00, 0x02, 0x3f, 0x40, 0x00, 0x02, 0x3f, 0xa4, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x74, 0x00, 0x02, 0x40, 0xd8, 0x00, 0x02, 0x41, 0x0c, 0x00, 0x02, 0x41, 0x84, 0x00, 0x02, 0x41, 0xb0, 0x00, 0x02, 0x41, 0xe8, 0x00, 0x02, 0x42, 0x18, 0x00, 0x02, 0x42, 0x44, 0x00, 0x02, 0x42, 0x5c, 0x00, 0x02, 0x42, 0x7c, 0x00, 0x02, 0x42, 0xd4, 0x00, 0x02, 0x42, 0xf4, 0x00, 0x02, 0x43, 0x14, 0x00, 0x02, 0x43, 0x34, 0x00, 0x02, 0x43, 0x54, 0x00, 0x02, 0x43, 0x7c, 0x00, 0x02, 0x43, 0xa4, 0x00, 0x02, 0x43, 0xcc, 0x00, 0x02, 0x43, 0xf4, 0x00, 0x02, 0x44, 0x14, 0x00, 0x02, 0x44, 0x64, 0x00, 0x02, 0x45, 0x5c, 0x00, 0x02, 0x45, 0x80, 0x00, 0x02, 0x45, 0xa4, 0x00, 0x02, 0x45, 0xc4, 0x00, 0x02, 0x45, 0xe4, 0x00, 0x02, 0x46, 0x04, 0x00, 0x02, 0x46, 0x5c, 0x00, 0x02, 0x46, 0xb4, 0x00, 0x02, 0x47, 0x00, 0x00, 0x02, 0x47, 0x38, 0x00, 0x02, 0x47, 0xa4, 0x00, 0x02, 0x48, 0x04, 0x00, 0x02, 0x4c, 0xb8, 0x00, 0x02, 0x4d, 0x24, 0x00, 0x02, 0x4d, 0x98, 0x00, 0x02, 0x4d, 0xa8, 0x00, 0x02, 0x4d, 0xb8, 0x00, 0x02, 0x4d, 0xc8, 0x00, 0x02, 0x4d, 0xd8, 0x00, 0x02, 0x4e, 0x08, 0x00, 0x02, 0x4e, 0x54, 0x00, 0x02, 0x4e, 0x98, 0x00, 0x02, 0x4e, 0xd0, 0x00, 0x02, 0x4e, 0xec, 0x00, 0x02, 0x4f, 0x24, 0x00, 0x02, 0x4f, 0x5c, 0x00, 0x02, 0x4f, 0x78, 0x00, 0x02, 0x4f, 0xb0, 0x00, 0x02, 0x4f, 0xd0, 0x00, 0x02, 0x4f, 0xec, 0x00, 0x02, 0x50, 0x10, 0x00, 0x02, 0x50, 0x34, 0x00, 0x02, 0x50, 0x50, 0x00, 0x02, 0x50, 0x70, 0x00, 0x02, 0x50, 0xa4, 0x00, 0x02, 0x50, 0xfc, 0x00, 0x02, 0x51, 0x30, 0x00, 0x02, 0x51, 0x4c, 0x00, 0x02, 0x51, 0x80, 0x00, 0x02, 0x51, 0xd8, 0x00, 0x02, 0x52, 0x0c, 0x00, 0x02, 0x52, 0x28, 0x00, 0x02, 0x52, 0x78, 0x00, 0x02, 0x52, 0xa4, 0x00, 0x02, 0x53, 0x4c, 0x00, 0x02, 0x53, 0x5c, 0x00, 0x02, 0x53, 0xc8, 0x00, 0x02, 0x54, 0x38, 0x00, 0x02, 0x54, 0x60, 0x00, 0x02, 0x54, 0xf4, 0x00, 0x02, 0x55, 0xb8, 0x00, 0x02, 0x56, 0x90, 0x00, 0x02, 0x57, 0x2c, 0x00, 0x02, 0x57, 0xec, 0x00, 0x02, 0x58, 0xc0, 0x00, 0x02, 0x59, 0x4c, 0x00, 0x02, 0x5a, 0x3c, 0x00, 0x02, 0x5b, 0x10, 0x00, 0x02, 0x5b, 0xe0, 0x00, 0x02, 0x5b, 0xfc, 0x00, 0x02, 0x5c, 0x18, 0x00, 0x02, 0x5c, 0x34, 0x00, 0x02, 0x5c, 0x50, 0x00, 0x02, 0x5c, 0x84, 0x00, 0x02, 0x5c, 0xbc, 0x00, 0x02, 0x5c, 0xf4, 0x00, 0x02, 0x5d, 0x30, 0x00, 0x02, 0x5d, 0x68, 0x00, 0x02, 0x5d, 0xa8, 0x00, 0x02, 0x5d, 0xf0, 0x00, 0x02, 0x5e, 0x3c, 0x00, 0x02, 0x5e, 0x60, 0x00, 0x02, 0x5e, 0x84, 0x00, 0x02, 0x5e, 0xa8, 0x00, 0x02, 0x5e, 0xcc, 0x00, 0x02, 0x5e, 0xf0, 0x00, 0x02, 0x5f, 0x14, 0x00, 0x02, 0x5f, 0x38, 0x00, 0x02, 0x5f, 0x5c, 0x00, 0x02, 0x5f, 0x7c, 0x00, 0x02, 0x5f, 0xa0, 0x00, 0x02, 0x5f, 0xc4, 0x00, 0x02, 0x5f, 0xe8, 0x00, 0x02, 0x60, 0x08, 0x00, 0x02, 0x60, 0x28, 0x00, 0x02, 0x60, 0x48, 0x00, 0x02, 0x60, 0x6c, 0x00, 0x02, 0x60, 0x94, 0x00, 0x02, 0x60, 0xbc, 0x00, 0x02, 0x60, 0xe8, 0x00, 0x02, 0x61, 0x14, 0x00, 0x02, 0x61, 0x3c, 0x00, 0x02, 0x61, 0x6c, 0x00, 0x02, 0x61, 0x98, 0x00, 0x02, 0x61, 0xc0, 0x00, 0x02, 0x61, 0xe8, 0x00, 0x02, 0x62, 0x10, 0x00, 0x02, 0x62, 0x3c, 0x00, 0x02, 0x62, 0x68, 0x00, 0x02, 0x62, 0x90, 0x00, 0x02, 0x62, 0xc0, 0x00, 0x02, 0x62, 0xec, 0x00, 0x02, 0x63, 0x14, 0x00, 0x02, 0x63, 0x3c, 0x00, 0x02, 0x63, 0x68, 0x00, 0x02, 0x63, 0x94, 0x00, 0x02, 0x63, 0xbc, 0x00, 0x02, 0x63, 0xe4, 0x00, 0x02, 0x64, 0x10, 0x00, 0x02, 0x64, 0x3c, 0x00, 0x02, 0x64, 0x64, 0x00, 0x02, 0x64, 0x88, 0x00, 0x02, 0x64, 0xb4, 0x00, 0x02, 0x64, 0xe0, 0x00, 0x02, 0x65, 0x08, 0x00, 0x02, 0x65, 0x30, 0x00, 0x02, 0x65, 0x5c, 0x00, 0x02, 0x65, 0x88, 0x00, 0x02, 0x65, 0xb0, 0x00, 0x02, 0x65, 0xe0, 0x00, 0x02, 0x66, 0x14, 0x00, 0x02, 0x66, 0x48, 0x00, 0x02, 0x66, 0x7c, 0x00, 0x02, 0x66, 0xb0, 0x00, 0x02, 0x66, 0xe4, 0x00, 0x02, 0x67, 0x18, 0x00, 0x02, 0x67, 0x50, 0x00, 0x02, 0x67, 0x88, 0x00, 0x02, 0x67, 0xc0, 0x00, 0x02, 0x67, 0xf8, 0x00, 0x02, 0x68, 0x2c, 0x00, 0x02, 0x68, 0x60, 0x00, 0x02, 0x68, 0x94, 0x00, 0x02, 0x68, 0xc8, 0x00, 0x02, 0x68, 0xfc, 0x00, 0x02, 0x69, 0x20, 0x00, 0x02, 0x69, 0x4c, 0x00, 0x02, 0x69, 0x78, 0x00, 0x02, 0x69, 0xa4, 0x00, 0x02, 0x69, 0xcc, 0x00, 0x02, 0x69, 0xf4, 0x00, 0x02, 0x6a, 0x20, 0x00, 0x02, 0x6a, 0x4c, 0x00, 0x02, 0x6a, 0x80, 0x00, 0x02, 0x6a, 0xac, 0x00, 0x02, 0x6a, 0xd8, 0x00, 0x02, 0x6b, 0x0c, 0x00, 0x02, 0x6b, 0x38, 0x00, 0x02, 0x6b, 0x64, 0x00, 0x02, 0x6b, 0x98, 0x00, 0x02, 0x6b, 0xc4, 0x00, 0x02, 0x6b, 0xf0, 0x00, 0x02, 0x6c, 0x24, 0x00, 0x02, 0x6c, 0x54, 0x00, 0x02, 0x6c, 0x88, 0x00, 0x02, 0x6c, 0xcc, 0x00, 0x02, 0x6c, 0xfc, 0x00, 0x02, 0x6d, 0x30, 0x00, 0x02, 0x6d, 0x70, 0x00, 0x02, 0x6d, 0xa4, 0x00, 0x02, 0x6d, 0xd4, 0x00, 0x02, 0x6e, 0x14, 0x00, 0x02, 0x6e, 0x48, 0x00, 0x02, 0x6e, 0x78, 0x00, 0x02, 0x6e, 0xb8, 0x00, 0x02, 0x6f, 0x00, 0x00, 0x02, 0x6f, 0x44, 0x00, 0x02, 0x6f, 0xa0, 0x00, 0x02, 0x6f, 0xd4, 0x00, 0x02, 0x70, 0x0c, 0x00, 0x02, 0x70, 0x3c, 0x00, 0x02, 0x70, 0x70, 0x00, 0x02, 0x70, 0x90, 0x00, 0x02, 0x70, 0xac, 0x00, 0x02, 0x70, 0xec, 0x00, 0x02, 0x71, 0x08, 0x00, 0x02, 0x71, 0x24, 0x00, 0x02, 0x71, 0x40, 0x00, 0x02, 0x71, 0x5c, 0x00, 0x02, 0x71, 0x78, 0x00, 0x02, 0x71, 0x94, 0x00, 0x02, 0x71, 0xb0, 0x00, 0x02, 0x71, 0xcc, 0x00, 0x02, 0x71, 0xf0, 0x00, 0x02, 0x72, 0x18, 0x00, 0x02, 0x72, 0x3c, 0x00, 0x02, 0x72, 0x64, 0x00, 0x02, 0x72, 0x78, 0x00, 0x02, 0x72, 0x94, 0x00, 0x02, 0x72, 0xb0, 0x00, 0x02, 0x72, 0xcc, 0x00, 0x02, 0x72, 0xe8, 0x00, 0x02, 0x73, 0x04, 0x00, 0x02, 0x73, 0x20, 0x00, 0x02, 0x73, 0x3c, 0x00, 0x02, 0x73, 0x58, 0x00, 0x02, 0x73, 0x74, 0x00, 0x02, 0x73, 0x90, 0x00, 0x02, 0x73, 0xac, 0x00, 0x02, 0x73, 0xc8, 0x00, 0x02, 0x73, 0xe4, 0x00, 0x02, 0x74, 0x00, 0x00, 0x02, 0x74, 0x1c, 0x00, 0x02, 0x74, 0x30, 0x00, 0x02, 0x74, 0xe4, 0x00, 0x02, 0x77, 0xf8, 0x00, 0x02, 0x78, 0xa0, 0x00, 0x02, 0x78, 0xb4, 0x00, 0x02, 0x78, 0xc8, 0x00, 0x02, 0x78, 0xe4, 0x00, 0x02, 0x79, 0x00, 0x00, 0x02, 0x79, 0x1c, 0x00, 0x02, 0x79, 0x40, 0x00, 0x02, 0x79, 0x68, 0x00, 0x02, 0x79, 0x8c, 0x00, 0x02, 0x79, 0xb0, 0x00, 0x02, 0x79, 0xcc, 0x00, 0x02, 0x79, 0xf4, 0x00, 0x02, 0x7a, 0x18, 0x00, 0x02, 0x7a, 0x34, 0x00, 0x02, 0x7a, 0x60, 0x00, 0x02, 0x7a, 0xb4, 0x00, 0x02, 0x7a, 0xcc, 0x00, 0x02, 0x7b, 0x24, 0x00, 0x02, 0x7b, 0x84, 0x00, 0x02, 0x7c, 0xc0, 0x00, 0x02, 0x7d, 0x48, 0x00, 0x02, 0x7d, 0xd0, 0x00, 0x02, 0x7f, 0x8c, 0x00, 0x02, 0x7f, 0xa8, 0x00, 0x02, 0x7f, 0xd4, 0x00, 0x02, 0x7f, 0xf0, 0x00, 0x02, 0x80, 0x1c, 0x00, 0x02, 0x80, 0x38, 0x00, 0x02, 0x80, 0x64, 0x00, 0x02, 0x80, 0x84, 0x00, 0x02, 0x80, 0xb4, 0x00, 0x02, 0x80, 0xd0, 0x00, 0x02, 0x80, 0xf8, 0x00, 0x02, 0x81, 0x14, 0x00, 0x02, 0x81, 0x3c, 0x00, 0x02, 0x81, 0x58, 0x00, 0x02, 0x81, 0x84, 0x00, 0x02, 0x81, 0xa0, 0x00, 0x02, 0x81, 0xcc, 0x00, 0x02, 0x81, 0xe8, 0x00, 0x02, 0x82, 0x14, 0x00, 0x02, 0x82, 0x30, 0x00, 0x02, 0x82, 0x5c, 0x00, 0x02, 0x82, 0x78, 0x00, 0x02, 0x82, 0xa4, 0x00, 0x02, 0x82, 0xc0, 0x00, 0x02, 0x82, 0xec, 0x00, 0x02, 0x83, 0x08, 0x00, 0x02, 0x83, 0x34, 0x00, 0x02, 0x83, 0x50, 0x00, 0x02, 0x83, 0x7c, 0x00, 0x02, 0x83, 0x9c, 0x00, 0x02, 0x83, 0xd0, 0x00, 0x02, 0x84, 0x14, 0x00, 0x02, 0x84, 0xa4, 0x00, 0x02, 0x84, 0xd8, 0x00, 0x02, 0x85, 0x40, 0x00, 0x02, 0x86, 0x38, 0x00, 0x02, 0x86, 0xec, 0x00, 0x02, 0x87, 0xa8, 0x00, 0x02, 0x87, 0xf8, 0x00, 0x02, 0x88, 0x50, 0x00, 0x02, 0x88, 0xa8, 0x00, 0x02, 0x89, 0x04, 0x00, 0x02, 0x89, 0x60, 0x00, 0x02, 0x89, 0xc8, 0x00, 0x02, 0x8a, 0x18, 0x00, 0x02, 0x8a, 0x40, 0x00, 0x02, 0x8a, 0x68, 0x00, 0x02, 0x8a, 0xa4, 0x00, 0x02, 0x8b, 0x1c, 0x00, 0x02, 0x8b, 0x70, 0x00, 0x02, 0x8b, 0xc4, 0x00, 0x02, 0x8b, 0xf0, 0x00, 0x02, 0x8c, 0x1c, 0x00, 0x02, 0x8c, 0x48, 0x00, 0x02, 0x8c, 0x78, 0x00, 0x02, 0x8c, 0xbc, 0x00, 0x02, 0x8d, 0x00, 0x00, 0x02, 0x8d, 0x1c, 0x00, 0x02, 0x8d, 0x38, 0x00, 0x02, 0x8d, 0x50, 0x00, 0x02, 0x8d, 0x68, 0x00, 0x02, 0x8d, 0xb0, 0x00, 0x02, 0x8d, 0xdc, 0x00, 0x02, 0x8e, 0x08, 0x00, 0x02, 0x8e, 0x30, 0x00, 0x02, 0x8e, 0x58, 0x00, 0x02, 0x8e, 0x94, 0x00, 0x02, 0x8e, 0xd8, 0x00, 0x02, 0x8f, 0x04, 0x00, 0x02, 0x8f, 0x2c, 0x00, 0x02, 0x8f, 0x94, 0x00, 0x02, 0x8f, 0xd4, 0x00, 0x02, 0x90, 0x14, 0x00, 0x02, 0x90, 0x54, 0x00, 0x02, 0x90, 0x94, 0x00, 0x02, 0x91, 0x14, 0x00, 0x02, 0x91, 0x94, 0x00, 0x02, 0x92, 0x14, 0x00, 0x02, 0x92, 0x94, 0x00, 0x02, 0x92, 0xbc, 0x00, 0x02, 0x92, 0xe4, 0x00, 0x02, 0x93, 0x0c, 0x00, 0x02, 0x93, 0x38, 0x00, 0x02, 0x93, 0x54, 0x00, 0x02, 0x93, 0x80, 0x00, 0x02, 0x93, 0x9c, 0x00, 0x02, 0x93, 0xc4, 0x00, 0x02, 0x94, 0xb4, 0x00, 0x02, 0x95, 0x20, 0x00, 0x02, 0x95, 0xd4, 0x00, 0x02, 0x9e, 0xb4, 0x00, 0x02, 0xa1, 0x94, 0x00, 0x02, 0xa1, 0xcc, 0x00, 0x02, 0xa2, 0x30, 0x00, 0x02, 0xa2, 0x80, 0x00, 0x02, 0xa2, 0xe4, 0x00, 0x02, 0xa3, 0x78, 0x00, 0x02, 0xa4, 0x44, 0x00, 0x02, 0xa5, 0x10, 0x00, 0x02, 0xa5, 0x74, 0x00, 0x02, 0xa6, 0x10, 0x00, 0x02, 0xa8, 0x90, 0x00, 0x02, 0xab, 0x70, 0x00, 0x02, 0xab, 0xa8, 0x00, 0x02, 0xac, 0x20, 0x00, 0x02, 0xac, 0x94, 0x00, 0x02, 0xac, 0xec, 0x00, 0x02, 0xae, 0x48, 0x00, 0x02, 0xaf, 0xf4, 0x00, 0x02, 0xb0, 0x3c, 0x00, 0x02, 0xb0, 0x70, 0x00, 0x02, 0xb1, 0x64, 0x00, 0x02, 0xb2, 0x34, 0x00, 0x02, 0xb2, 0xc8, 0x00, 0x02, 0xb3, 0x5c, 0x00, 0x02, 0xb4, 0x20, 0x00, 0x02, 0xb4, 0xe8, 0x00, 0x02, 0xb5, 0xac, 0x00, 0x02, 0xb6, 0x70, 0x00, 0x02, 0xb9, 0xf4, 0x00, 0x02, 0xba, 0x70, 0x00, 0x02, 0xbb, 0x90, 0x00, 0x02, 0xbd, 0x2c, 0x00, 0x02, 0xc0, 0x88, 0x00, 0x02, 0xc1, 0x08, 0x00, 0x02, 0xc1, 0x8c, 0x00, 0x02, 0xc2, 0x00, 0x00, 0x02, 0xc2, 0x64, 0x00, 0x02, 0xc2, 0xe8, 0x00, 0x02, 0xc3, 0x78, 0x00, 0x02, 0xc4, 0xbc, 0x00, 0x02, 0xc5, 0xec, 0x00, 0x02, 0xc6, 0x88, 0x00, 0x02, 0xc7, 0x1c, 0x00, 0x02, 0xc7, 0xd0, 0x00, 0x02, 0xc7, 0xf0, 0x00, 0x02, 0xc8, 0x10, 0x00, 0x02, 0xc8, 0x30, 0x00, 0x02, 0xc8, 0x50, 0x00, 0x02, 0xc8, 0x70, 0x00, 0x02, 0xc8, 0x90, 0x00, 0x02, 0xc8, 0xb0, 0x00, 0x02, 0xc8, 0xd0, 0x00, 0x02, 0xca, 0x44, 0x00, 0x02, 0xcb, 0x20, 0x00, 0x02, 0xcb, 0xfc, 0x00, 0x02, 0xcc, 0xa8, 0x00, 0x02, 0xcd, 0xc4, 0x00, 0x02, 0xce, 0x54, 0x00, 0x02, 0xce, 0xe4, 0x00, 0x02, 0xcf, 0x9c, 0x00, 0x02, 0xd0, 0x10, 0x00, 0x02, 0xd0, 0x84, 0x00, 0x02, 0xd0, 0xf8, 0x00, 0x02, 0xd1, 0x50, 0x00, 0x02, 0xd1, 0xac, 0x00, 0x02, 0xd2, 0x40, 0x00, 0x02, 0xd2, 0xec, 0x00, 0x02, 0xd3, 0x54, 0x00, 0x02, 0xd3, 0xc8, 0x00, 0x02, 0xd4, 0x60, 0x00, 0x02, 0xd4, 0xc4, 0x00, 0x02, 0xd5, 0x84, 0x00, 0x02, 0xd6, 0x64, 0x00, 0x02, 0xd7, 0x34, 0x00, 0x02, 0xd7, 0xa8, 0x00, 0x02, 0xd8, 0x4c, 0x00, 0x02, 0xd8, 0xa8, 0x00, 0x02, 0xd9, 0x44, 0x00, 0x02, 0xda, 0x2c, 0x00, 0x02, 0xda, 0xa8, 0x00, 0x02, 0xdb, 0xd0, 0x00, 0x02, 0xdd, 0xfc, 0x00, 0x02, 0xde, 0x94, 0x00, 0x02, 0xdf, 0xb0, 0x00, 0x02, 0xe0, 0xf8, 0x00, 0x02, 0xe2, 0x0c, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x02, 0xe4, 0x98, 0x00, 0x02, 0xe5, 0x18, 0x00, 0x02, 0xe5, 0xdc, 0x00, 0x02, 0xe6, 0xc4, 0x00, 0x02, 0xe7, 0x58, 0x00, 0x02, 0xe7, 0xcc, 0x00, 0x02, 0xe8, 0x6c, 0x00, 0x02, 0xe8, 0xb4, 0x00, 0x02, 0xe9, 0x54, 0x00, 0x02, 0xea, 0x1c, 0x00, 0x02, 0xea, 0x70, 0x00, 0x02, 0xea, 0xa0, 0x00, 0x02, 0xeb, 0xc0, 0x00, 0x02, 0xec, 0xac, 0x00, 0x02, 0xec, 0xec, 0x00, 0x02, 0xed, 0x48, 0x00, 0x02, 0xed, 0xac, 0x00, 0x02, 0xee, 0x0c, 0x00, 0x02, 0xee, 0x60, 0x00, 0x02, 0xee, 0xac, 0x00, 0x02, 0xef, 0x40, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x02, 0xf0, 0xe8, 0x00, 0x02, 0xf2, 0xf4, 0x00, 0x02, 0xf3, 0xe8, 0x00, 0x02, 0xf5, 0x0c, 0x00, 0x02, 0xf6, 0x48, 0x00, 0x02, 0xf7, 0x48, 0x00, 0x02, 0xf8, 0x6c, 0x00, 0x02, 0xf9, 0xa0, 0x00, 0x02, 0xfa, 0x90, 0x00, 0x02, 0xfb, 0x64, 0x00, 0x02, 0xfc, 0x70, 0x00, 0x02, 0xfd, 0xa4, 0x00, 0x02, 0xfe, 0xfc, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x98, 0x00, 0x03, 0x01, 0x08, 0x00, 0x03, 0x01, 0xbc, 0x00, 0x03, 0x02, 0xb0, 0x00, 0x03, 0x03, 0xe8, 0x00, 0x03, 0x05, 0x64, 0x00, 0x03, 0x07, 0x24, 0x00, 0x03, 0x07, 0xc0, 0x00, 0x03, 0x08, 0x80, 0x00, 0x03, 0x08, 0xe8, 0x00, 0x03, 0x09, 0x74, 0x00, 0x03, 0x09, 0x90, 0x00, 0x03, 0x09, 0xb8, 0x00, 0x03, 0x09, 0xd0, 0x00, 0x03, 0x09, 0xe8, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x03, 0x0a, 0x18, 0x00, 0x03, 0x0a, 0x98, 0x00, 0x03, 0x0a, 0xe8, 0x00, 0x03, 0x0b, 0x6c, 0x00, 0x03, 0x0c, 0x64, 0x00, 0x03, 0x0d, 0x0c, 0x00, 0x03, 0x0e, 0x2c, 0x00, 0x03, 0x0e, 0xdc, 0x00, 0x03, 0x0f, 0x64, 0x00, 0x03, 0x10, 0x08, 0x00, 0x03, 0x11, 0x0c, 0x00, 0x03, 0x12, 0xf4, 0x00, 0x03, 0x15, 0xb8, 0x00, 0x03, 0x17, 0x78, 0x00, 0x03, 0x17, 0xfc, 0x00, 0x03, 0x18, 0x48, 0x00, 0x03, 0x19, 0x20, 0x00, 0x03, 0x1a, 0x08, 0x00, 0x03, 0x1a, 0xec, 0x00, 0x03, 0x1b, 0x78, 0x00, 0x03, 0x1c, 0x58, 0x00, 0x03, 0x1d, 0x68, 0x00, 0x03, 0x1e, 0x40, 0x00, 0x03, 0x1f, 0x1c, 0x00, 0x03, 0x1f, 0x6c, 0x00, 0x03, 0x1f, 0xa0, 0x00, 0x03, 0x1f, 0xec, 0x00, 0x03, 0x20, 0x8c, 0x00, 0x03, 0x21, 0xd8, 0x00, 0x03, 0x23, 0x1c, 0x00, 0x03, 0x23, 0x58, 0x00, 0x03, 0x23, 0xd8, 0x00, 0x03, 0x24, 0x30, 0x00, 0x03, 0x24, 0x8c, 0x00, 0x03, 0x24, 0xe4, 0x00, 0x03, 0x25, 0x50, 0x00, 0x03, 0x25, 0xb4, 0x00, 0x03, 0x26, 0x1c, 0x00, 0x03, 0x26, 0x80, 0x00, 0x03, 0x27, 0x28, 0x00, 0x03, 0x28, 0x08, 0x00, 0x03, 0x29, 0x18, 0x00, 0x03, 0x2a, 0x84, 0x00, 0x03, 0x2b, 0x18, 0x00, 0x03, 0x2c, 0xa8, 0x00, 0x03, 0x2e, 0x0c, 0x00, 0x03, 0x2f, 0x98, 0x00, 0x03, 0x33, 0x58, 0x00, 0x03, 0x34, 0xe4, 0x00, 0x03, 0x36, 0x5c, 0x00, 0x03, 0x36, 0xe8, 0x00, 0x03, 0x37, 0x98, 0x00, 0x03, 0x3a, 0x4c, 0x00, 0x03, 0x3b, 0xec, 0x00, 0x03, 0x3d, 0x04, 0x00, 0x03, 0x3d, 0xf0, 0x00, 0x03, 0x3f, 0x04, 0x00, 0x03, 0x3f, 0xec, 0x00, 0x03, 0x40, 0x74, 0x00, 0x03, 0x40, 0xd8, 0x00, 0x03, 0x41, 0x3c, 0x00, 0x03, 0x41, 0x80, 0x00, 0x03, 0x41, 0xc0, 0x00, 0x03, 0x42, 0x8c, 0x00, 0x03, 0x43, 0x84, 0x00, 0x03, 0x44, 0x04, 0x00, 0x03, 0x44, 0x38, 0x00, 0x03, 0x44, 0x74, 0x00, 0x03, 0x44, 0xb8, 0x00, 0x03, 0x44, 0xe8, 0x00, 0x03, 0x45, 0x48, 0x00, 0x03, 0x45, 0xbc, 0x00, 0x03, 0x46, 0xa0, 0x00, 0x03, 0x47, 0x38, 0x00, 0x03, 0x47, 0xf4, 0x00, 0x03, 0x49, 0x74, 0x00, 0x03, 0x4a, 0xf8, 0x00, 0x03, 0x4e, 0x58, 0x00, 0x03, 0x4e, 0xb8, 0x00, 0x03, 0x4f, 0x68, 0x00, 0x03, 0x4f, 0xd0, 0x00, 0x03, 0x50, 0x5c, 0x00, 0x03, 0x50, 0xec, 0x00, 0x03, 0x51, 0xac, 0x00, 0x03, 0x52, 0x38, 0x00, 0x03, 0x52, 0xb8, 0x00, 0x03, 0x53, 0x34, 0x00, 0x03, 0x53, 0xa4, 0x00, 0x03, 0x53, 0xf8, 0x00, 0x03, 0x54, 0x60, 0x00, 0x03, 0x54, 0xc4, 0x00, 0x03, 0x55, 0x1c, 0x00, 0x03, 0x55, 0xe0, 0x00, 0x03, 0x56, 0x24, 0x00, 0x03, 0x56, 0x78, 0x00, 0x03, 0x56, 0xc8, 0x00, 0x03, 0x57, 0x34, 0x00, 0x03, 0x57, 0xf0, 0x00, 0x03, 0x59, 0x9c, 0x00, 0x03, 0x5b, 0x90, 0x00, 0x03, 0x5c, 0xbc, 0x00, 0x03, 0x5e, 0xec, 0x00, 0x03, 0x60, 0x4c, 0x00, 0x03, 0x62, 0xc4, 0x00, 0x03, 0x68, 0x14, 0x00, 0x03, 0x69, 0x4c, 0x00, 0x03, 0x6b, 0x9c, 0x00, 0x03, 0x6c, 0x60, 0x00, 0x03, 0x6d, 0x24, 0x00, 0x03, 0x6d, 0xf0, 0x00, 0x03, 0x6f, 0x74, 0x00, 0x03, 0x70, 0xf4, 0x00, 0x03, 0x72, 0x54, 0x00, 0x03, 0x73, 0xb0, 0x00, 0x03, 0x74, 0xfc, 0x00, 0x03, 0x75, 0x80, 0x00, 0x03, 0x75, 0xb4, 0x00, 0x03, 0x75, 0xe8, 0x00, 0x03, 0x76, 0x18, 0x00, 0x03, 0x76, 0x48, 0x00, 0x03, 0x76, 0xa0, 0x00, 0x03, 0x76, 0xbc, 0x00, 0x03, 0x76, 0xd8, 0x00, 0x03, 0x76, 0xf4, 0x00, 0x03, 0x77, 0x1c, 0x00, 0x03, 0x77, 0x40, 0x00, 0x03, 0x77, 0x58, 0x00, 0x03, 0x77, 0x70, 0x00, 0x03, 0x78, 0x4c, 0x00, 0x03, 0x78, 0xe4, 0x00, 0x03, 0x79, 0xa0, 0x00, 0x03, 0x7a, 0x10, 0x00, 0x03, 0x7a, 0x84, 0x00, 0x03, 0x7b, 0xa4, 0x00, 0x03, 0x7c, 0x8c, 0x00, 0x03, 0x7c, 0xf8, 0x00, 0x03, 0x7d, 0x68, 0x00, 0x03, 0x7d, 0xa4, 0x00, 0x03, 0x7d, 0xe0, 0x00, 0x03, 0x7e, 0x08, 0x00, 0x03, 0x7e, 0x34, 0x00, 0x03, 0x7e, 0x5c, 0x00, 0x03, 0x7e, 0x88, 0x00, 0x03, 0x7e, 0xb0, 0x00, 0x03, 0x7e, 0xdc, 0x00, 0x03, 0x7f, 0x08, 0x00, 0x03, 0x7f, 0x34, 0x00, 0x03, 0x7f, 0x98, 0x00, 0x03, 0x7f, 0xfc, 0x00, 0x03, 0x80, 0x5c, 0x00, 0x03, 0x80, 0xec, 0x00, 0x03, 0x81, 0x94, 0x00, 0x03, 0x82, 0x00, 0x00, 0x03, 0x82, 0x90, 0x00, 0x03, 0x83, 0x34, 0x00, 0x03, 0x83, 0x90, 0x00, 0x03, 0x84, 0x54, 0x00, 0x03, 0x84, 0xf8, 0x00, 0x03, 0x85, 0x98, 0x00, 0x03, 0x86, 0x6c, 0x00, 0x03, 0x87, 0x70, 0x00, 0x03, 0x88, 0x88, 0x00, 0x03, 0x89, 0x64, 0x00, 0x03, 0x8a, 0x64, 0x00, 0x03, 0x8b, 0x7c, 0x00, 0x03, 0x8c, 0x48, 0x00, 0x03, 0x8d, 0x70, 0x00, 0x03, 0x8e, 0x88, 0x00, 0x03, 0x8f, 0xb8, 0x00, 0x03, 0x90, 0x38, 0x00, 0x03, 0x90, 0xe8, 0x00, 0x03, 0x91, 0xb0, 0x00, 0x03, 0x92, 0x3c, 0x00, 0x03, 0x92, 0xec, 0x00, 0x03, 0x93, 0xb4, 0x00, 0x03, 0x94, 0x2c, 0x00, 0x03, 0x95, 0x04, 0x00, 0x03, 0x95, 0xcc, 0x00, 0x03, 0x96, 0x90, 0x00, 0x03, 0x96, 0xc0, 0x00, 0x03, 0x96, 0xec, 0x00, 0x03, 0x97, 0x18, 0x00, 0x03, 0x97, 0x44, 0x00, 0x03, 0x97, 0x74, 0x00, 0x03, 0x98, 0x00, 0x00, 0x03, 0x98, 0x28, 0x00, 0x03, 0x98, 0x50, 0x00, 0x03, 0x98, 0xa4, 0x00, 0x03, 0x98, 0xf8, 0x00, 0x03, 0x99, 0x20, 0x00, 0x03, 0x99, 0x50, 0x00, 0x03, 0x99, 0x80, 0x00, 0x03, 0x99, 0xa0, 0x00, 0x03, 0x99, 0xf0, 0x00, 0x03, 0x9a, 0x40, 0x00, 0x03, 0x9a, 0x6c, 0x00, 0x03, 0x9a, 0x9c, 0x00, 0x03, 0x9a, 0xe4, 0x00, 0x03, 0x9b, 0x2c, 0x00, 0x03, 0x9b, 0x80, 0x00, 0x03, 0x9b, 0xd0, 0x00, 0x03, 0x9c, 0x1c, 0x00, 0x03, 0x9c, 0x6c, 0x00, 0x03, 0x9c, 0xc0, 0x00, 0x03, 0x9d, 0x14, 0x00, 0x03, 0x9d, 0x80, 0x00, 0x03, 0x9e, 0x24, 0x00, 0x03, 0x9e, 0x7c, 0x00, 0x03, 0x9e, 0xc4, 0x00, 0x03, 0x9f, 0x1c, 0x00, 0x03, 0x9f, 0xa8, 0x00, 0x03, 0xa0, 0x28, 0x00, 0x03, 0xa0, 0xb4, 0x00, 0x03, 0xa1, 0x84, 0x00, 0x03, 0xa2, 0x14, 0x00, 0x03, 0xa3, 0x38, 0x00, 0x03, 0xa4, 0x64, 0x00, 0x03, 0xa4, 0xf0, 0x00, 0x03, 0xa5, 0x50, 0x00, 0x03, 0xa5, 0xb0, 0x00, 0x03, 0xa5, 0xec, 0x00, 0x03, 0xa6, 0x20, 0x00, 0x03, 0xa6, 0x54, 0x00, 0x03, 0xa6, 0x78, 0x00, 0x03, 0xa6, 0x9c, 0x00, 0x03, 0xa6, 0xb4, 0x00, 0x03, 0xa6, 0xcc, 0x00, 0x03, 0xa7, 0x24, 0x00, 0x03, 0xa7, 0x78, 0x00, 0x03, 0xa8, 0x3c, 0x00, 0x03, 0xa8, 0xfc, 0x00, 0x03, 0xa9, 0xf8, 0x00, 0x03, 0xaa, 0x28, 0x00, 0x03, 0xaa, 0x58, 0x00, 0x03, 0xaa, 0x9c, 0x00, 0x03, 0xaa, 0xdc, 0x00, 0x03, 0xab, 0x1c, 0x00, 0x03, 0xab, 0x78, 0x00, 0x03, 0xab, 0xb4, 0x00, 0x03, 0xab, 0xf0, 0x00, 0x03, 0xac, 0x3c, 0x00, 0x03, 0xac, 0x88, 0x00, 0x03, 0xad, 0x0c, 0x00, 0x03, 0xad, 0x0c, 0x00, 0x03, 0xad, 0x20, 0x00, 0x03, 0xad, 0x34, 0x00, 0x03, 0xad, 0x50, 0x00, 0x03, 0xad, 0x64, 0x00, 0x03, 0xad, 0x80, 0x00, 0x03, 0xad, 0x9c, 0x00, 0x03, 0xad, 0xc0, 0x00, 0x03, 0xad, 0xd4, 0x00, 0x03, 0xad, 0xf0, 0x00, 0x03, 0xae, 0x0c, 0x00, 0x03, 0xae, 0x30, 0x00, 0x03, 0xae, 0x4c, 0x00, 0x03, 0xae, 0x70, 0x00, 0x03, 0xae, 0x94, 0x00, 0x03, 0xae, 0xc0, 0x00, 0x03, 0xae, 0xd4, 0x00, 0x03, 0xae, 0xf0, 0x00, 0x03, 0xaf, 0x0c, 0x00, 0x03, 0xaf, 0x30, 0x00, 0x03, 0xaf, 0x4c, 0x00, 0x03, 0xaf, 0x70, 0x00, 0x03, 0xaf, 0x94, 0x00, 0x03, 0xaf, 0xc0, 0x00, 0x03, 0xaf, 0xdc, 0x00, 0x03, 0xb0, 0x00, 0x00, 0x03, 0xb0, 0x24, 0x00, 0x03, 0xb0, 0x50, 0x00, 0x03, 0xb0, 0x74, 0x00, 0x03, 0xb0, 0xa0, 0x00, 0x03, 0xb0, 0xcc, 0x00, 0x03, 0xb1, 0x00, 0x00, 0x03, 0xb1, 0x14, 0x00, 0x03, 0xb1, 0x30, 0x00, 0x03, 0xb1, 0x4c, 0x00, 0x03, 0xb1, 0x70, 0x00, 0x03, 0xb1, 0x8c, 0x00, 0x03, 0xb1, 0xb0, 0x00, 0x03, 0xb1, 0xd4, 0x00, 0x03, 0xb2, 0x00, 0x00, 0x03, 0xb2, 0x1c, 0x00, 0x03, 0xb2, 0x40, 0x00, 0x03, 0xb2, 0x64, 0x00, 0x03, 0xb2, 0x90, 0x00, 0x03, 0xb2, 0xb4, 0x00, 0x03, 0xb2, 0xe0, 0x00, 0x03, 0xb3, 0x0c, 0x00, 0x03, 0xb3, 0x40, 0x00, 0x03, 0xb3, 0x5c, 0x00, 0x03, 0xb3, 0x80, 0x00, 0x03, 0xb3, 0xa4, 0x00, 0x03, 0xb3, 0xd0, 0x00, 0x03, 0xb3, 0xf4, 0x00, 0x03, 0xb4, 0x20, 0x00, 0x03, 0xb4, 0x4c, 0x00, 0x03, 0xb4, 0x80, 0x00, 0x03, 0xb4, 0xa4, 0x00, 0x03, 0xb4, 0xd0, 0x00, 0x03, 0xb4, 0xfc, 0x00, 0x03, 0xb5, 0x30, 0x00, 0x03, 0xb5, 0x5c, 0x00, 0x03, 0xb5, 0x90, 0x00, 0x03, 0xb5, 0xc4, 0x00, 0x03, 0xb6, 0x00, 0x00, 0x03, 0xb6, 0x14, 0x00, 0x03, 0xb6, 0x30, 0x00, 0x03, 0xb6, 0x4c, 0x00, 0x03, 0xb6, 0x70, 0x00, 0x03, 0xb6, 0x8c, 0x00, 0x03, 0xb6, 0xb0, 0x00, 0x03, 0xb6, 0xd4, 0x00, 0x03, 0xb7, 0x00, 0x00, 0x03, 0xb7, 0x1c, 0x00, 0x03, 0xb7, 0x40, 0x00, 0x03, 0xb7, 0x64, 0x00, 0x03, 0xb7, 0x90, 0x00, 0x03, 0xb7, 0xb4, 0x00, 0x03, 0xb7, 0xe0, 0x00, 0x03, 0xb8, 0x0c, 0x00, 0x03, 0xb8, 0x40, 0x00, 0x03, 0xb8, 0x5c, 0x00, 0x03, 0xb8, 0x80, 0x00, 0x03, 0xb8, 0xa4, 0x00, 0x03, 0xb8, 0xd0, 0x00, 0x03, 0xb8, 0xf4, 0x00, 0x03, 0xb9, 0x20, 0x00, 0x03, 0xb9, 0x4c, 0x00, 0x03, 0xb9, 0x80, 0x00, 0x03, 0xb9, 0xa4, 0x00, 0x03, 0xb9, 0xd0, 0x00, 0x03, 0xb9, 0xfc, 0x00, 0x03, 0xba, 0x30, 0x00, 0x03, 0xba, 0x5c, 0x00, 0x03, 0xba, 0x90, 0x00, 0x03, 0xba, 0xc4, 0x00, 0x03, 0xbb, 0x00, 0x00, 0x03, 0xbb, 0x1c, 0x00, 0x03, 0xbb, 0x40, 0x00, 0x03, 0xbb, 0x64, 0x00, 0x03, 0xbb, 0x90, 0x00, 0x03, 0xbb, 0xb4, 0x00, 0x03, 0xbb, 0xe0, 0x00, 0x03, 0xbc, 0x0c, 0x00, 0x03, 0xbc, 0x40, 0x00, 0x03, 0xbc, 0x64, 0x00, 0x03, 0xbc, 0x90, 0x00, 0x03, 0xbc, 0xbc, 0x00, 0x03, 0xbc, 0xf0, 0x00, 0x03, 0xbd, 0x1c, 0x00, 0x03, 0xbd, 0x50, 0x00, 0x03, 0xbd, 0x84, 0x00, 0x03, 0xbd, 0xc0, 0x00, 0x03, 0xbd, 0xe4, 0x00, 0x03, 0xbe, 0x10, 0x00, 0x03, 0xbe, 0x3c, 0x00, 0x03, 0xbe, 0x70, 0x00, 0x03, 0xbe, 0x9c, 0x00, 0x03, 0xbe, 0xd0, 0x00, 0x03, 0xbf, 0x04, 0x00, 0x03, 0xbf, 0x40, 0x00, 0x03, 0xbf, 0x6c, 0x00, 0x03, 0xbf, 0xa0, 0x00, 0x03, 0xbf, 0xd4, 0x00, 0x03, 0xc0, 0x10, 0x00, 0x03, 0xc0, 0x44, 0x00, 0x03, 0xc0, 0x80, 0x00, 0x03, 0xc0, 0xbc, 0x00, 0x03, 0xc1, 0x00, 0x00, 0x03, 0xc1, 0x14, 0x00, 0x03, 0xc1, 0x30, 0x00, 0x03, 0xc1, 0x4c, 0x00, 0x03, 0xc1, 0x70, 0x00, 0x03, 0xc1, 0x8c, 0x00, 0x03, 0xc1, 0xb0, 0x00, 0x03, 0xc1, 0xd4, 0x00, 0x03, 0xc2, 0x00, 0x00, 0x03, 0xc2, 0x1c, 0x00, 0x03, 0xc2, 0x40, 0x00, 0x03, 0xc2, 0x64, 0x00, 0x03, 0xc2, 0x90, 0x00, 0x03, 0xc2, 0xb4, 0x00, 0x03, 0xc2, 0xe0, 0x00, 0x03, 0xc3, 0x0c, 0x00, 0x03, 0xc3, 0x40, 0x00, 0x03, 0xc3, 0x5c, 0x00, 0x03, 0xc3, 0x80, 0x00, 0x03, 0xc3, 0xa4, 0x00, 0x03, 0xc3, 0xd0, 0x00, 0x03, 0xc3, 0xf4, 0x00, 0x03, 0xc4, 0x20, 0x00, 0x03, 0xc4, 0x4c, 0x00, 0x03, 0xc4, 0x80, 0x00, 0x03, 0xc4, 0xa4, 0x00, 0x03, 0xc4, 0xd0, 0x00, 0x03, 0xc4, 0xfc, 0x00, 0x03, 0xc5, 0x30, 0x00, 0x03, 0xc5, 0x5c, 0x00, 0x03, 0xc5, 0x90, 0x00, 0x03, 0xc5, 0xc4, 0x00, 0x03, 0xc6, 0x00, 0x00, 0x03, 0xc6, 0x1c, 0x00, 0x03, 0xc6, 0x40, 0x00, 0x03, 0xc6, 0x64, 0x00, 0x03, 0xc6, 0x90, 0x00, 0x03, 0xc6, 0xb4, 0x00, 0x03, 0xc6, 0xe0, 0x00, 0x03, 0xc7, 0x0c, 0x00, 0x03, 0xc7, 0x40, 0x00, 0x03, 0xc7, 0x64, 0x00, 0x03, 0xc7, 0x90, 0x00, 0x03, 0xc7, 0xbc, 0x00, 0x03, 0xc7, 0xf0, 0x00, 0x03, 0xc8, 0x1c, 0x00, 0x03, 0xc8, 0x50, 0x00, 0x03, 0xc8, 0x84, 0x00, 0x03, 0xc8, 0xc0, 0x00, 0x03, 0xc8, 0xe4, 0x00, 0x03, 0xc9, 0x10, 0x00, 0x03, 0xc9, 0x3c, 0x00, 0x03, 0xc9, 0x70, 0x00, 0x03, 0xc9, 0x9c, 0x00, 0x03, 0xc9, 0xd0, 0x00, 0x03, 0xca, 0x04, 0x00, 0x03, 0xca, 0x40, 0x00, 0x03, 0xca, 0x6c, 0x00, 0x03, 0xca, 0xa0, 0x00, 0x03, 0xca, 0xd4, 0x00, 0x03, 0xcb, 0x10, 0x00, 0x03, 0xcb, 0x44, 0x00, 0x03, 0xcb, 0x80, 0x00, 0x03, 0xcb, 0xbc, 0x00, 0x03, 0xcc, 0x00, 0x00, 0x03, 0xcc, 0x1c, 0x00, 0x03, 0xcc, 0x40, 0x00, 0x03, 0xcc, 0x64, 0x00, 0x03, 0xcc, 0x90, 0x00, 0x03, 0xcc, 0xb4, 0x00, 0x03, 0xcc, 0xe0, 0x00, 0x03, 0xcd, 0x0c, 0x00, 0x03, 0xcd, 0x40, 0x00, 0x03, 0xcd, 0x64, 0x00, 0x03, 0xcd, 0x90, 0x00, 0x03, 0xcd, 0xbc, 0x00, 0x03, 0xcd, 0xf0, 0x00, 0x03, 0xce, 0x1c, 0x00, 0x03, 0xce, 0x50, 0x00, 0x03, 0xce, 0x84, 0x00, 0x03, 0xce, 0xc0, 0x00, 0x03, 0xce, 0xe4, 0x00, 0x03, 0xcf, 0x10, 0x00, 0x03, 0xcf, 0x3c, 0x00, 0x03, 0xcf, 0x70, 0x00, 0x03, 0xcf, 0x9c, 0x00, 0x03, 0xcf, 0xd0, 0x00, 0x03, 0xd0, 0x04, 0x00, 0x03, 0xd0, 0x40, 0x00, 0x03, 0xd0, 0x6c, 0x00, 0x03, 0xd0, 0xa0, 0x00, 0x03, 0xd0, 0xd4, 0x00, 0x03, 0xd1, 0x10, 0x00, 0x03, 0xd1, 0x44, 0x00, 0x03, 0xd1, 0x80, 0x00, 0x03, 0xd1, 0xbc, 0x00, 0x03, 0xd2, 0x00, 0x00, 0x03, 0xd2, 0x24, 0x00, 0x03, 0xd2, 0x50, 0x00, 0x03, 0xd2, 0x7c, 0x00, 0x03, 0xd2, 0xb0, 0x00, 0x03, 0xd2, 0xdc, 0x00, 0x03, 0xd3, 0x10, 0x00, 0x03, 0xd3, 0x44, 0x00, 0x03, 0xd3, 0x80, 0x00, 0x03, 0xd3, 0xac, 0x00, 0x03, 0xd3, 0xe0, 0x00, 0x03, 0xd4, 0x14, 0x00, 0x03, 0xd4, 0x50, 0x00, 0x03, 0xd4, 0x84, 0x00, 0x03, 0xd4, 0xc0, 0x00, 0x03, 0xd4, 0xfc, 0x00, 0x03, 0xd5, 0x40, 0x00, 0x03, 0xd5, 0x6c, 0x00, 0x03, 0xd5, 0xa0, 0x00, 0x03, 0xd5, 0xd4, 0x00, 0x03, 0xd6, 0x10, 0x00, 0x03, 0xd6, 0x44, 0x00, 0x03, 0xd6, 0x80, 0x00, 0x03, 0xd6, 0xbc, 0x00, 0x03, 0xd7, 0x00, 0x00, 0x03, 0xd7, 0x34, 0x00, 0x03, 0xd7, 0x70, 0x00, 0x03, 0xd7, 0xac, 0x00, 0x03, 0xd7, 0xf0, 0x00, 0x03, 0xd8, 0x2c, 0x00, 0x03, 0xd8, 0x70, 0x00, 0x03, 0xd8, 0xb4, 0x00, 0x03, 0xd9, 0x00, 0x00, 0x03, 0xd9, 0x4c, 0x00, 0x03, 0xd9, 0x98, 0x00, 0x03, 0xd9, 0xe0, 0x00, 0x03, 0xda, 0x24, 0x00, 0x03, 0xda, 0xf0, 0x00, 0x03, 0xdb, 0xb8, 0x00, 0x03, 0xdc, 0x40, 0x00, 0x03, 0xdc, 0xc8, 0x00, 0x03, 0xdd, 0x14, 0x00, 0x03, 0xdd, 0x50, 0x00, 0x03, 0xdd, 0x8c, 0x00, 0x03, 0xdd, 0xc0, 0x00, 0x03, 0xdd, 0xf4, 0x00, 0x03, 0xde, 0x1c, 0x00, 0x03, 0xde, 0x50, 0x00, 0x03, 0xde, 0x84, 0x00, 0x03, 0xde, 0xa4, 0x00, 0x03, 0xde, 0xec, 0x00, 0x03, 0xdf, 0x44, 0x00, 0x03, 0xe0, 0x04, 0x00, 0x03, 0xe0, 0xd8, 0x00, 0x03, 0xe1, 0xbc, 0x00, 0x03, 0xe1, 0xe4, 0x00, 0x03, 0xe2, 0x44, 0x00, 0x03, 0xe2, 0xbc, 0x00, 0x03, 0xe3, 0x28, 0x00, 0x03, 0xe3, 0xd4, 0x00, 0x03, 0xe4, 0x74, 0x00, 0x03, 0xe4, 0xe8, 0x00, 0x03, 0xe5, 0x78, 0x00, 0x03, 0xe6, 0x0c, 0x00, 0x03, 0xe6, 0xb0, 0x00, 0x03, 0xe7, 0x30, 0x00, 0x03, 0xe7, 0xc8, 0x00, 0x03, 0xe8, 0x44, 0x00, 0x03, 0xe8, 0xcc, 0x00, 0x03, 0xe9, 0x50, 0x00, 0x03, 0xe9, 0xb0, 0x00, 0x03, 0xea, 0x10, 0x00, 0x03, 0xea, 0x20, 0x00, 0x03, 0xea, 0x38, 0x00, 0x03, 0xea, 0x58, 0x00, 0x03, 0xea, 0x94, 0x00, 0x03, 0xea, 0xcc, 0x00, 0x03, 0xea, 0xe4, 0x00, 0x03, 0xea, 0xfc, 0x00, 0x03, 0xeb, 0x14, 0x00, 0x03, 0xeb, 0x2c, 0x00, 0x03, 0xeb, 0x44, 0x00, 0x03, 0xeb, 0x5c, 0x00, 0x03, 0xec, 0x2c, 0x00, 0x03, 0xec, 0xf8, 0x00, 0x03, 0xed, 0x48, 0x00, 0x03, 0xed, 0x98, 0x00, 0x03, 0xee, 0x5c, 0x00, 0x03, 0xef, 0x18, 0x00, 0x03, 0xef, 0x7c, 0x00, 0x03, 0xef, 0xd8, 0x00, 0x03, 0xf0, 0x5c, 0x00, 0x03, 0xf0, 0xdc, 0x00, 0x03, 0xf1, 0x6c, 0x00, 0x03, 0xf1, 0xfc, 0x00, 0x03, 0xf2, 0x58, 0x00, 0x03, 0xf2, 0xbc, 0x00, 0x03, 0xf3, 0x24, 0x00, 0x03, 0xf3, 0x88, 0x00, 0x03, 0xf3, 0xc4, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x03, 0xf4, 0x18, 0x00, 0x03, 0xf4, 0x30, 0x00, 0x03, 0xf4, 0x74, 0x00, 0x03, 0xf4, 0xbc, 0x00, 0x03, 0xf5, 0x04, 0x00, 0x03, 0xf5, 0x54, 0x00, 0x03, 0xf5, 0xcc, 0x00, 0x03, 0xf6, 0x48, 0x00, 0x03, 0xf6, 0xdc, 0x00, 0x03, 0xf7, 0x74, 0x00, 0x03, 0xf7, 0xf4, 0x00, 0x03, 0xf8, 0x3c, 0x00, 0x03, 0xf8, 0x80, 0x00, 0x03, 0xf8, 0xe4, 0x00, 0x03, 0xf9, 0x44, 0x00, 0x03, 0xf9, 0x98, 0x00, 0x03, 0xf9, 0xec, 0x00, 0x03, 0xfa, 0x64, 0x00, 0x03, 0xfa, 0xd8, 0x00, 0x03, 0xfb, 0xb8, 0x00, 0x03, 0xfc, 0x98, 0x00, 0x03, 0xfd, 0x68, 0x00, 0x03, 0xfe, 0x38, 0x00, 0x03, 0xfe, 0x84, 0x00, 0x03, 0xfe, 0xcc, 0x00, 0x03, 0xff, 0x14, 0x00, 0x03, 0xff, 0x5c, 0x00, 0x03, 0xff, 0xa4, 0x00, 0x03, 0xff, 0xec, 0x00, 0x04, 0x00, 0x44, 0x00, 0x04, 0x00, 0x6c, 0x00, 0x04, 0x00, 0x94, 0x00, 0x04, 0x00, 0xbc, 0x00, 0x04, 0x00, 0xe8, 0x00, 0x04, 0x01, 0x14, 0x00, 0x04, 0x01, 0x40, 0x00, 0x04, 0x01, 0x6c, 0x00, 0x04, 0x01, 0xa4, 0x00, 0x04, 0x01, 0xd8, 0x00, 0x04, 0x02, 0x0c, 0x00, 0x04, 0x02, 0x44, 0x00, 0x04, 0x02, 0x7c, 0x00, 0x04, 0x02, 0xb0, 0x00, 0x04, 0x02, 0xdc, 0x00, 0x04, 0x03, 0x08, 0x00, 0x04, 0x03, 0x34, 0x00, 0x04, 0x03, 0x5c, 0x00, 0x04, 0x03, 0x8c, 0x00, 0x04, 0x03, 0xbc, 0x00, 0x04, 0x03, 0xec, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x04, 0x04, 0xc8, 0x00, 0x04, 0x04, 0xec, 0x00, 0x04, 0x05, 0x24, 0x00, 0x04, 0x05, 0x68, 0x00, 0x04, 0x05, 0x90, 0x00, 0x04, 0x05, 0xbc, 0x00, 0x04, 0x05, 0xf4, 0x00, 0x04, 0x06, 0x18, 0x00, 0x04, 0x06, 0x54, 0x00, 0x04, 0x06, 0x9c, 0x00, 0x04, 0x06, 0xdc, 0x00, 0x04, 0x07, 0x4c, 0x00, 0x04, 0x07, 0xa8, 0x00, 0x04, 0x08, 0x1c, 0x00, 0x04, 0x08, 0xcc, 0x00, 0x04, 0x09, 0x28, 0x00, 0x04, 0x09, 0x38, 0x00, 0x04, 0x09, 0x88, 0x00, 0x04, 0x09, 0xc4, 0x00, 0x04, 0x0a, 0x04, 0x00, 0x04, 0x0a, 0x38, 0x00, 0x04, 0x0a, 0x6c, 0x00, 0x04, 0x0a, 0xd4, 0x00, 0x04, 0x0b, 0x24, 0x00, 0x04, 0x0b, 0x5c, 0x00, 0x04, 0x0b, 0xb8, 0x00, 0x04, 0x0c, 0x04, 0x00, 0x04, 0x0c, 0x70, 0x00, 0x04, 0x0c, 0xd0, 0x00, 0x04, 0x0d, 0x30, 0x00, 0x04, 0x0d, 0x58, 0x00, 0x04, 0x0d, 0x80, 0x00, 0x04, 0x0e, 0x00, 0x00, 0x04, 0x0e, 0x4c, 0x00, 0x04, 0x0e, 0xc4, 0x00, 0x04, 0x0e, 0xf8, 0x00, 0x04, 0x0f, 0x0c, 0x00, 0x04, 0x0f, 0x38, 0x00, 0x04, 0x0f, 0xe4, 0x00, 0x04, 0x10, 0x3c, 0x00, 0x04, 0x10, 0x64, 0x00, 0x04, 0x10, 0x8c, 0x00, 0x04, 0x10, 0xb4, 0x00, 0x04, 0x10, 0xdc, 0x00, 0x04, 0x11, 0x04, 0x00, 0x04, 0x11, 0x2c, 0x00, 0x04, 0x11, 0x54, 0x00, 0x04, 0x11, 0x7c, 0x00, 0x04, 0x11, 0xa4, 0x00, 0x04, 0x11, 0xc8, 0x00, 0x04, 0x11, 0xe8, 0x00, 0x04, 0x12, 0x0c, 0x00, 0x04, 0x12, 0x30, 0x00, 0x04, 0x12, 0x54, 0x00, 0x04, 0x12, 0x74, 0x00, 0x04, 0x12, 0xa0, 0x00, 0x04, 0x12, 0xcc, 0x00, 0x04, 0x12, 0xf8, 0x00, 0x04, 0x13, 0x24, 0x00, 0x04, 0x13, 0x38, 0x00, 0x04, 0x13, 0x7c, 0x00, 0x04, 0x13, 0xc0, 0x00, 0x04, 0x13, 0xf0, 0x00, 0x04, 0x14, 0x20, 0x00, 0x04, 0x14, 0x64, 0x00, 0x04, 0x14, 0xbc, 0x00, 0x04, 0x15, 0x40, 0x00, 0x04, 0x15, 0xd0, 0x00, 0x04, 0x15, 0xe0, 0x00, 0x04, 0x16, 0x70, 0x00, 0x04, 0x16, 0x9c, 0x00, 0x04, 0x16, 0xac, 0x00, 0x04, 0x17, 0x0c, 0x00, 0x04, 0x17, 0xe4, 0x00, 0x04, 0x18, 0x68, 0x00, 0x04, 0x19, 0x14, 0x00, 0x04, 0x19, 0x70, 0x00, 0x04, 0x1a, 0x04, 0x00, 0x04, 0x1a, 0x4c, 0x00, 0x04, 0x1a, 0xc8, 0x00, 0x04, 0x1b, 0x24, 0x00, 0x04, 0x1b, 0xb4, 0x00, 0x04, 0x1c, 0x14, 0x00, 0x04, 0x1c, 0xa8, 0x00, 0x04, 0x1c, 0xb8, 0x00, 0x04, 0x1c, 0xc8, 0x00, 0x04, 0x1d, 0x10, 0x00, 0x04, 0x1d, 0x58, 0x00, 0x04, 0x1d, 0x84, 0x00, 0x04, 0x1d, 0xac, 0x00, 0x04, 0x1d, 0xdc, 0x00, 0x04, 0x1e, 0x08, 0x00, 0x04, 0x1e, 0x90, 0x00, 0x04, 0x1f, 0x14, 0x00, 0x04, 0x1f, 0xc8, 0x00, 0x04, 0x20, 0x68, 0x00, 0x04, 0x20, 0xc4, 0x00, 0x04, 0x21, 0x2c, 0x00, 0x04, 0x21, 0xa0, 0x00, 0x04, 0x22, 0x38, 0x00, 0x04, 0x22, 0xc0, 0x00, 0x04, 0x23, 0x28, 0x00, 0x04, 0x23, 0x80, 0x00, 0x04, 0x23, 0xe8, 0x00, 0x04, 0x24, 0x40, 0x00, 0x04, 0x24, 0xac, 0x00, 0x04, 0x24, 0xcc, 0x00, 0x04, 0x24, 0xec, 0x00, 0x04, 0x25, 0x34, 0x00, 0x04, 0x25, 0x78, 0x00, 0x04, 0x25, 0x88, 0x00, 0x04, 0x25, 0xb0, 0x00, 0x04, 0x25, 0xd4, 0x00, 0x04, 0x25, 0xf0, 0x00, 0x04, 0x26, 0x00, 0x00, 0x04, 0x26, 0x60, 0x00, 0x04, 0x26, 0x98, 0x00, 0x04, 0x26, 0xe4, 0x00, 0x04, 0x27, 0x6c, 0x00, 0x04, 0x28, 0x20, 0x00, 0x04, 0x28, 0x7c, 0x00, 0x04, 0x28, 0xd8, 0x00, 0x04, 0x29, 0x40, 0x00, 0x04, 0x29, 0xb0, 0x00, 0x04, 0x2a, 0x44, 0x00, 0x04, 0x2a, 0x9c, 0x00, 0x04, 0x2b, 0x30, 0x00, 0x04, 0x2b, 0xc4, 0x00, 0x04, 0x2c, 0x0c, 0x00, 0x04, 0x2c, 0x1c, 0x00, 0x04, 0x2c, 0x48, 0x00, 0x04, 0x2c, 0x8c, 0x00, 0x04, 0x2c, 0xc8, 0x00, 0x04, 0x2c, 0xe4, 0x00, 0x04, 0x2d, 0x30, 0x00, 0x04, 0x2d, 0x4c, 0x00, 0x04, 0x2d, 0x6c, 0x00, 0x04, 0x2d, 0x90, 0x00, 0x04, 0x2d, 0xb4, 0x00, 0x04, 0x2d, 0xd8, 0x00, 0x04, 0x2d, 0xf8, 0x00, 0x04, 0x2e, 0x0c, 0x00, 0x04, 0x2e, 0x20, 0x00, 0x04, 0x2e, 0x34, 0x00, 0x04, 0x2e, 0x48, 0x00, 0x04, 0x2e, 0x6c, 0x00, 0x04, 0x2e, 0x80, 0x00, 0x04, 0x2e, 0x94, 0x00, 0x04, 0x2e, 0xa8, 0x00, 0x04, 0x2e, 0xbc, 0x00, 0x04, 0x2e, 0xe0, 0x00, 0x04, 0x2e, 0xf4, 0x00, 0x04, 0x2f, 0x08, 0x00, 0x04, 0x2f, 0x1c, 0x00, 0x04, 0x2f, 0x30, 0x00, 0x04, 0x2f, 0x54, 0x00, 0x04, 0x2f, 0x68, 0x00, 0x04, 0x2f, 0x7c, 0x00, 0x04, 0x2f, 0x90, 0x00, 0x04, 0x2f, 0xa4, 0x00, 0x04, 0x2f, 0xbc, 0x00, 0x04, 0x30, 0x8c, 0x00, 0x04, 0x31, 0x5c, 0x00, 0x04, 0x32, 0x2c, 0x00, 0x04, 0x32, 0xfc, 0x00, 0x04, 0x33, 0x50, 0x00, 0x04, 0x33, 0xb8, 0x00, 0x04, 0x34, 0x2c, 0x00, 0x04, 0x34, 0xc8, 0x00, 0x04, 0x35, 0x20, 0x00, 0x04, 0x35, 0x90, 0x00, 0x04, 0x36, 0x14, 0x00, 0x04, 0x36, 0x90, 0x00, 0x04, 0x36, 0xe4, 0x00, 0x04, 0x37, 0x48, 0x00, 0x04, 0x37, 0xf4, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x38, 0xc0, 0x00, 0x04, 0x39, 0x34, 0x00, 0x04, 0x39, 0x98, 0x00, 0x04, 0x39, 0xf0, 0x00, 0x04, 0x3a, 0x74, 0x00, 0x04, 0x3a, 0xc4, 0x00, 0x04, 0x3b, 0x44, 0x00, 0x04, 0x3b, 0xac, 0x00, 0x04, 0x3c, 0x54, 0x00, 0x04, 0x3c, 0xb4, 0x00, 0x04, 0x3d, 0x44, 0x00, 0x04, 0x3d, 0xac, 0x00, 0x04, 0x3e, 0x20, 0x00, 0x04, 0x3e, 0x88, 0x00, 0x04, 0x3f, 0x04, 0x00, 0x04, 0x3f, 0x58, 0x00, 0x04, 0x3f, 0xcc, 0x00, 0x04, 0x40, 0x44, 0x00, 0x04, 0x40, 0x98, 0x00, 0x04, 0x41, 0x0c, 0x00, 0x04, 0x41, 0x7c, 0x00, 0x04, 0x41, 0xf4, 0x00, 0x04, 0x42, 0x68, 0x00, 0x04, 0x42, 0xcc, 0x00, 0x04, 0x43, 0x38, 0x00, 0x04, 0x43, 0xbc, 0x00, 0x04, 0x44, 0x4c, 0x00, 0x04, 0x44, 0xd8, 0x00, 0x04, 0x45, 0xa4, 0x00, 0x04, 0x45, 0xf8, 0x00, 0x04, 0x46, 0x58, 0x00, 0x04, 0x46, 0xc8, 0x00, 0x04, 0x47, 0x1c, 0x00, 0x04, 0x47, 0x80, 0x00, 0x04, 0x47, 0xe4, 0x00, 0x04, 0x48, 0x44, 0x00, 0x04, 0x48, 0xa4, 0x00, 0x04, 0x49, 0x14, 0x00, 0x04, 0x49, 0x84, 0x00, 0x04, 0x49, 0xdc, 0x00, 0x04, 0x4a, 0x34, 0x00, 0x04, 0x4a, 0x98, 0x00, 0x04, 0x4b, 0x0c, 0x00, 0x04, 0x4b, 0x8c, 0x00, 0x04, 0x4c, 0x1c, 0x00, 0x04, 0x4c, 0x90, 0x00, 0x04, 0x4d, 0x14, 0x00, 0x04, 0x4d, 0x8c, 0x00, 0x04, 0x4e, 0x10, 0x00, 0x04, 0x4e, 0xa0, 0x00, 0x04, 0x4f, 0x18, 0x00, 0x04, 0x4f, 0xa0, 0x00, 0x04, 0x50, 0x24, 0x00, 0x04, 0x50, 0x94, 0x00, 0x04, 0x50, 0xfc, 0x00, 0x04, 0x51, 0x50, 0x00, 0x04, 0x51, 0x98, 0x00, 0x04, 0x52, 0x1c, 0x00, 0x04, 0x52, 0x8c, 0x00, 0x04, 0x53, 0x0c, 0x00, 0x04, 0x54, 0x04, 0x00, 0x04, 0x54, 0x2c, 0x00, 0x04, 0x54, 0x54, 0x00, 0x04, 0x54, 0x9c, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x55, 0x70, 0x00, 0x04, 0x55, 0xa8, 0x00, 0x04, 0x56, 0x20, 0x00, 0x04, 0x56, 0x4c, 0x00, 0x04, 0x56, 0x9c, 0x00, 0x04, 0x56, 0xdc, 0x00, 0x04, 0x57, 0x0c, 0x00, 0x04, 0x57, 0x38, 0x00, 0x04, 0x57, 0x74, 0x00, 0x04, 0x58, 0x0c, 0x00, 0x04, 0x58, 0x28, 0x00, 0x04, 0x58, 0x60, 0x00, 0x04, 0x58, 0x88, 0x00, 0x04, 0x58, 0xc8, 0x00, 0x04, 0x58, 0xf8, 0x00, 0x04, 0x59, 0x54, 0x00, 0x04, 0x59, 0xe4, 0x00, 0x04, 0x5a, 0x2c, 0x00, 0x04, 0x5a, 0x64, 0x00, 0x04, 0x5a, 0xcc, 0x00, 0x04, 0x5b, 0x20, 0x00, 0x04, 0x5b, 0x58, 0x00, 0x04, 0x5b, 0x84, 0x00, 0x04, 0x5b, 0xac, 0x00, 0x04, 0x5b, 0xf0, 0x00, 0x04, 0x5c, 0x6c, 0x00, 0x04, 0x5c, 0xa4, 0x00, 0x04, 0x5d, 0x24, 0x00, 0x04, 0x5d, 0x68, 0x00, 0x04, 0x5d, 0xb0, 0x00, 0x04, 0x5d, 0xd4, 0x00, 0x04, 0x5e, 0x1c, 0x00, 0x04, 0x5e, 0x2c, 0x00, 0x04, 0x5e, 0x58, 0x00, 0x04, 0x5e, 0x68, 0x00, 0x04, 0x5e, 0x9c, 0x00, 0x04, 0x5e, 0xd4, 0x00, 0x04, 0x5e, 0xf0, 0x00, 0x04, 0x5f, 0x0c, 0x00, 0x04, 0x5f, 0x28, 0x00, 0x04, 0x5f, 0x44, 0x00, 0x04, 0x5f, 0x60, 0x00, 0x04, 0x5f, 0x88, 0x00, 0x04, 0x5f, 0xb0, 0x00, 0x04, 0x5f, 0xdc, 0x00, 0x04, 0x60, 0x04, 0x00, 0x04, 0x60, 0x2c, 0x00, 0x04, 0x60, 0x58, 0x00, 0x04, 0x60, 0x80, 0x00, 0x04, 0x60, 0xa8, 0x00, 0x04, 0x60, 0xd0, 0x00, 0x04, 0x60, 0xf8, 0x00, 0x04, 0x61, 0x20, 0x00, 0x04, 0x61, 0x4c, 0x00, 0x04, 0x61, 0x74, 0x00, 0x04, 0x61, 0x9c, 0x00, 0x04, 0x61, 0xc8, 0x00, 0x04, 0x61, 0xf0, 0x00, 0x04, 0x62, 0x18, 0x00, 0x04, 0x62, 0x40, 0x00, 0x04, 0x62, 0x68, 0x00, 0x04, 0x62, 0x90, 0x00, 0x04, 0x62, 0xbc, 0x00, 0x04, 0x62, 0xe4, 0x00, 0x04, 0x63, 0x0c, 0x00, 0x04, 0x63, 0x38, 0x00, 0x04, 0x63, 0x60, 0x00, 0x04, 0x63, 0x88, 0x00, 0x04, 0x63, 0xb0, 0x00, 0x04, 0x63, 0xd8, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0x64, 0x2c, 0x00, 0x04, 0x64, 0x54, 0x00, 0x04, 0x64, 0x7c, 0x00, 0x04, 0x64, 0xa8, 0x00, 0x04, 0x64, 0xd0, 0x00, 0x04, 0x64, 0xf8, 0x00, 0x04, 0x65, 0x20, 0x00, 0x04, 0x65, 0x48, 0x00, 0x04, 0x65, 0x70, 0x00, 0x04, 0x65, 0x9c, 0x00, 0x04, 0x65, 0xc4, 0x00, 0x04, 0x65, 0xec, 0x00, 0x04, 0x66, 0x18, 0x00, 0x04, 0x66, 0x40, 0x00, 0x04, 0x66, 0x68, 0x00, 0x04, 0x66, 0x90, 0x00, 0x04, 0x66, 0xb8, 0x00, 0x04, 0x66, 0xe0, 0x00, 0x04, 0x67, 0x0c, 0x00, 0x04, 0x67, 0x34, 0x00, 0x04, 0x67, 0x5c, 0x00, 0x04, 0x67, 0x88, 0x00, 0x04, 0x67, 0xb0, 0x00, 0x04, 0x67, 0xd8, 0x00, 0x04, 0x68, 0x00, 0x00, 0x04, 0x68, 0x28, 0x00, 0x04, 0x68, 0x50, 0x00, 0x04, 0x68, 0x7c, 0x00, 0x04, 0x68, 0xa4, 0x00, 0x04, 0x68, 0xcc, 0x00, 0x04, 0x68, 0xf8, 0x00, 0x04, 0x69, 0x20, 0x00, 0x04, 0x69, 0x48, 0x00, 0x04, 0x69, 0x70, 0x00, 0x04, 0x69, 0x98, 0x00, 0x04, 0x69, 0xc0, 0x00, 0x04, 0x69, 0xec, 0x00, 0x04, 0x6a, 0x14, 0x00, 0x04, 0x6a, 0x3c, 0x00, 0x04, 0x6a, 0x68, 0x00, 0x04, 0x6a, 0x90, 0x00, 0x04, 0x6a, 0xb8, 0x00, 0x04, 0x6a, 0xe0, 0x00, 0x04, 0x6b, 0x08, 0x00, 0x04, 0x6b, 0x30, 0x00, 0x04, 0x6b, 0x5c, 0x00, 0x04, 0x6b, 0x84, 0x00, 0x04, 0x6b, 0xac, 0x00, 0x04, 0x6b, 0xd8, 0x00, 0x04, 0x6c, 0x00, 0x00, 0x04, 0x6c, 0x28, 0x00, 0x04, 0x6c, 0x50, 0x00, 0x04, 0x6c, 0x9c, 0x00, 0x04, 0x6d, 0x2c, 0x00, 0x04, 0x6d, 0x98, 0x00, 0x04, 0x6d, 0xd8, 0x00, 0x04, 0x6e, 0x14, 0x00, 0x04, 0x6e, 0x9c, 0x00, 0x04, 0x6e, 0xd8, 0x00, 0x04, 0x6f, 0x24, 0x00, 0x04, 0x6f, 0x68, 0x00, 0x04, 0x6f, 0x98, 0x00, 0x04, 0x6f, 0xf4, 0x00, 0x04, 0x70, 0x8c, 0x00, 0x04, 0x71, 0x28, 0x00, 0x04, 0x71, 0x60, 0x00, 0x04, 0x71, 0xd4, 0x00, 0x04, 0x72, 0x10, 0x00, 0x04, 0x72, 0x78, 0x00, 0x04, 0x72, 0xcc, 0x00, 0x04, 0x73, 0x14, 0x00, 0x04, 0x73, 0xb8, 0x00, 0x04, 0x74, 0x54, 0x00, 0x04, 0x74, 0xcc, 0x00, 0x04, 0x75, 0x68, 0x00, 0x04, 0x75, 0xdc, 0x00, 0x04, 0x76, 0x44, 0x00, 0x04, 0x77, 0x0c, 0x00, 0x04, 0x77, 0x80, 0x00, 0x04, 0x77, 0xb8, 0x00, 0x04, 0x78, 0x14, 0x00, 0x04, 0x78, 0x58, 0x00, 0x04, 0x78, 0xa4, 0x00, 0x04, 0x79, 0x60, 0x00, 0x04, 0x79, 0xd4, 0x00, 0x04, 0x7a, 0x5c, 0x00, 0x04, 0x7a, 0xf8, 0x00, 0x04, 0x7b, 0x94, 0x00, 0x04, 0x7b, 0xe0, 0x00, 0x04, 0x7c, 0xac, 0x00, 0x04, 0x7d, 0x08, 0x00, 0x04, 0x7d, 0x7c, 0x00, 0x04, 0x7d, 0xb8, 0x00, 0x04, 0x7e, 0x14, 0x00, 0x04, 0x7e, 0x68, 0x00, 0x04, 0x7e, 0xb8, 0x00, 0x04, 0x7e, 0xfc, 0x00, 0x04, 0x7f, 0x0c, 0x00, 0x04, 0x7f, 0x1c, 0x00, 0x04, 0x7f, 0x2c, 0x00, 0x04, 0x7f, 0x3c, 0x00, 0x04, 0x7f, 0x4c, 0x00, 0x04, 0x7f, 0x5c, 0x00, 0x04, 0x7f, 0x6c, 0x00, 0x04, 0x7f, 0x7c, 0x00, 0x04, 0x7f, 0x8c, 0x00, 0x04, 0x7f, 0x9c, 0x00, 0x04, 0x7f, 0xac, 0x00, 0x04, 0x7f, 0xbc, 0x00, 0x04, 0x7f, 0xcc, 0x00, 0x04, 0x7f, 0xdc, 0x00, 0x04, 0x7f, 0xec, 0x00, 0x04, 0x7f, 0xfc, 0x00, 0x04, 0x80, 0x0c, 0x00, 0x04, 0x80, 0x1c, 0x00, 0x04, 0x80, 0x2c, 0x00, 0x04, 0x80, 0x3c, 0x00, 0x04, 0x80, 0x4c, 0x00, 0x04, 0x80, 0x5c, 0x00, 0x04, 0x80, 0x6c, 0x00, 0x04, 0x80, 0x7c, 0x00, 0x04, 0x80, 0x8c, 0x00, 0x04, 0x80, 0x9c, 0x00, 0x04, 0x80, 0xac, 0x00, 0x04, 0x80, 0xbc, 0x00, 0x04, 0x80, 0xcc, 0x00, 0x04, 0x80, 0xdc, 0x00, 0x04, 0x80, 0xec, 0x00, 0x04, 0x80, 0xfc, 0x00, 0x04, 0x81, 0x0c, 0x00, 0x04, 0x81, 0x1c, 0x00, 0x04, 0x81, 0x2c, 0x00, 0x04, 0x81, 0x3c, 0x00, 0x04, 0x81, 0x4c, 0x00, 0x04, 0x81, 0x5c, 0x00, 0x04, 0x81, 0x6c, 0x00, 0x04, 0x81, 0x7c, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x04, 0x81, 0x9c, 0x00, 0x04, 0x81, 0xac, 0x00, 0x04, 0x81, 0xbc, 0x00, 0x04, 0x81, 0xcc, 0x00, 0x04, 0x81, 0xdc, 0x00, 0x04, 0x81, 0xec, 0x00, 0x04, 0x81, 0xfc, 0x00, 0x04, 0x82, 0x0c, 0x00, 0x04, 0x82, 0x1c, 0x00, 0x04, 0x82, 0x2c, 0x00, 0x04, 0x82, 0x3c, 0x00, 0x04, 0x82, 0xa8, 0x00, 0x04, 0x82, 0xe8, 0x00, 0x04, 0x83, 0x74, 0x00, 0x04, 0x84, 0x04, 0x00, 0x04, 0x84, 0x50, 0x00, 0x04, 0x84, 0xc0, 0x00, 0x04, 0x85, 0x48, 0x00, 0x04, 0x85, 0x84, 0x00, 0x04, 0x86, 0x5c, 0x00, 0x04, 0x86, 0xe8, 0x00, 0x04, 0x86, 0xf8, 0x00, 0x04, 0x87, 0x08, 0x00, 0x04, 0x87, 0x18, 0x00, 0x04, 0x87, 0x28, 0x00, 0x04, 0x87, 0x38, 0x00, 0x04, 0x87, 0x48, 0x00, 0x04, 0x87, 0x58, 0x00, 0x04, 0x87, 0x68, 0x00, 0x04, 0x87, 0x78, 0x00, 0x04, 0x87, 0x88, 0x00, 0x04, 0x87, 0xb4, 0x00, 0x04, 0x87, 0xec, 0x00, 0x04, 0x88, 0x68, 0x00, 0x04, 0x89, 0x24, 0x00, 0x04, 0x8a, 0x20, 0x00, 0x04, 0x8b, 0x5c, 0x00, 0x04, 0x8c, 0xd8, 0x00, 0x04, 0x8e, 0x8c, 0x00, 0x04, 0x8f, 0x08, 0x00, 0x04, 0x8f, 0xc4, 0x00, 0x04, 0x90, 0xc4, 0x00, 0x04, 0x92, 0x00, 0x00, 0x04, 0x93, 0x7c, 0x00, 0x04, 0x95, 0x38, 0x00, 0x04, 0x97, 0x2c, 0x00, 0x04, 0x97, 0xe8, 0x00, 0x04, 0x98, 0xe4, 0x00, 0x04, 0x9a, 0x20, 0x00, 0x04, 0x9b, 0x9c, 0x00, 0x04, 0x9d, 0x4c, 0x00, 0x04, 0x9f, 0x48, 0x00, 0x04, 0xa1, 0x7c, 0x00, 0x04, 0xa2, 0x78, 0x00, 0x04, 0xa3, 0xb4, 0x00, 0x04, 0xa5, 0x34, 0x00, 0x04, 0xa6, 0xf0, 0x00, 0x04, 0xa8, 0xec, 0x00, 0x04, 0xab, 0x28, 0x00, 0x04, 0xad, 0x9c, 0x00, 0x04, 0xae, 0xd0, 0x00, 0x04, 0xb0, 0x44, 0x00, 0x04, 0xb2, 0x04, 0x00, 0x04, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x3c, 0x00, 0x04, 0xb8, 0xb8, 0x00, 0x04, 0xbb, 0x6c, 0x00, 0x04, 0xbc, 0xe4, 0x00, 0x04, 0xbe, 0xa0, 0x00, 0x04, 0xc0, 0x9c, 0x00, 0x04, 0xc2, 0xd8, 0x00, 0x04, 0xc5, 0x54, 0x00, 0x04, 0xc8, 0x10, 0x00, 0x04, 0xcb, 0x04, 0x00, 0x04, 0xcc, 0xc4, 0x00, 0x04, 0xce, 0xcc, 0x00, 0x04, 0xd1, 0x14, 0x00, 0x04, 0xd3, 0x9c, 0x00, 0x04, 0xd6, 0x60, 0x00, 0x04, 0xd9, 0x64, 0x00, 0x04, 0xdc, 0x94, 0x00, 0x04, 0xdc, 0xc0, 0x00, 0x04, 0xdc, 0xf8, 0x00, 0x04, 0xdd, 0x74, 0x00, 0x04, 0xde, 0x30, 0x00, 0x04, 0xdf, 0x28, 0x00, 0x04, 0xe0, 0x64, 0x00, 0x04, 0xe1, 0xe0, 0x00, 0x04, 0xe3, 0x94, 0x00, 0x04, 0xe4, 0x10, 0x00, 0x04, 0xe4, 0xcc, 0x00, 0x04, 0xe5, 0xcc, 0x00, 0x04, 0xe7, 0x08, 0x00, 0x04, 0xe8, 0x84, 0x00, 0x04, 0xea, 0x40, 0x00, 0x04, 0xec, 0x34, 0x00, 0x04, 0xec, 0xf0, 0x00, 0x04, 0xed, 0xec, 0x00, 0x04, 0xef, 0x28, 0x00, 0x04, 0xf0, 0xa0, 0x00, 0x04, 0xf2, 0x5c, 0x00, 0x04, 0xf4, 0x58, 0x00, 0x04, 0xf6, 0x8c, 0x00, 0x04, 0xf7, 0x84, 0x00, 0x04, 0xf8, 0xc0, 0x00, 0x04, 0xfa, 0x3c, 0x00, 0x04, 0xfb, 0xf8, 0x00, 0x04, 0xfd, 0xf0, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x05, 0x02, 0x9c, 0x00, 0x05, 0x03, 0xd0, 0x00, 0x05, 0x05, 0x44, 0x00, 0x05, 0x07, 0x00, 0x00, 0x05, 0x08, 0xfc, 0x00, 0x05, 0x0b, 0x38, 0x00, 0x05, 0x0d, 0xa4, 0x00, 0x05, 0x10, 0x58, 0x00, 0x05, 0x11, 0xd0, 0x00, 0x05, 0x13, 0x8c, 0x00, 0x05, 0x15, 0x7c, 0x00, 0x05, 0x17, 0xb8, 0x00, 0x05, 0x1a, 0x34, 0x00, 0x05, 0x1c, 0xf0, 0x00, 0x05, 0x1f, 0xe4, 0x00, 0x05, 0x21, 0xa8, 0x00, 0x05, 0x23, 0xb0, 0x00, 0x05, 0x25, 0xf8, 0x00, 0x05, 0x28, 0x7c, 0x00, 0x05, 0x2b, 0x40, 0x00, 0x05, 0x2e, 0x30, 0x00, 0x05, 0x31, 0x60, 0x00, 0x05, 0x31, 0xbc, 0x00, 0x05, 0x32, 0x78, 0x00, 0x05, 0x33, 0x54, 0x00, 0x05, 0x34, 0x50, 0x00, 0x05, 0x35, 0x10, 0x00, 0x05, 0x35, 0xfc, 0x00, 0x05, 0x37, 0x14, 0x00, 0x05, 0x37, 0xc0, 0x00, 0x05, 0x38, 0xf4, 0x00, 0x05, 0x3a, 0x08, 0x00, 0x05, 0x3a, 0xf8, 0x00, 0x05, 0x3b, 0xac, 0x00, 0x05, 0x3c, 0x84, 0x00, 0x05, 0x3d, 0x64, 0x00, 0x05, 0x3e, 0x20, 0x00, 0x05, 0x3e, 0xd8, 0x00, 0x05, 0x3f, 0xb0, 0x00, 0x05, 0x40, 0xa8, 0x00, 0x05, 0x41, 0x64, 0x00, 0x05, 0x42, 0x4c, 0x00, 0x05, 0x43, 0x60, 0x00, 0x05, 0x44, 0x08, 0x00, 0x05, 0x45, 0x38, 0x00, 0x05, 0x46, 0x48, 0x00, 0x05, 0x47, 0x34, 0x00, 0x05, 0x47, 0xe4, 0x00, 0x05, 0x48, 0xb8, 0x00, 0x05, 0x49, 0x94, 0x00, 0x05, 0x4a, 0x4c, 0x00, 0x05, 0x4a, 0xd8, 0x00, 0x05, 0x4b, 0x88, 0x00, 0x05, 0x4c, 0x58, 0x00, 0x05, 0x4c, 0xe8, 0x00, 0x05, 0x4d, 0xa4, 0x00, 0x05, 0x4e, 0x8c, 0x00, 0x05, 0x4f, 0x0c, 0x00, 0x05, 0x50, 0x14, 0x00, 0x05, 0x50, 0xfc, 0x00, 0x05, 0x51, 0xc0, 0x00, 0x05, 0x52, 0x48, 0x00, 0x05, 0x52, 0xf4, 0x00, 0x05, 0x53, 0xa8, 0x00, 0x05, 0x54, 0x34, 0x00, 0x05, 0x54, 0xb0, 0x00, 0x05, 0x55, 0x84, 0x00, 0x05, 0x56, 0x7c, 0x00, 0x05, 0x57, 0x94, 0x00, 0x05, 0x58, 0x6c, 0x00, 0x05, 0x59, 0x70, 0x00, 0x05, 0x5a, 0xa0, 0x00, 0x05, 0x5b, 0x68, 0x00, 0x05, 0x5c, 0xb8, 0x00, 0x05, 0x5d, 0xe8, 0x00, 0x05, 0x5e, 0xf4, 0x00, 0x05, 0x5f, 0xc4, 0x00, 0x05, 0x60, 0xb8, 0x00, 0x05, 0x61, 0xb4, 0x00, 0x05, 0x62, 0x88, 0x00, 0x05, 0x63, 0x28, 0x00, 0x05, 0x65, 0x30, 0x00, 0x05, 0x68, 0x14, 0x00, 0x05, 0x6a, 0x3c, 0x00, 0x05, 0x6c, 0x58, 0x00, 0x05, 0x6d, 0x58, 0x00, 0x05, 0x6e, 0x58, 0x00, 0x05, 0x6f, 0xf0, 0x00, 0x05, 0x70, 0xd0, 0x00, 0x05, 0x71, 0xb0, 0x00, 0x05, 0x72, 0xb4, 0x00, 0x05, 0x73, 0x88, 0x00, 0x05, 0x74, 0xc0, 0x00, 0x05, 0x75, 0xcc, 0x00, 0x05, 0x76, 0xa4, 0x00, 0x05, 0x77, 0x84, 0x00, 0x05, 0x78, 0x90, 0x00, 0x05, 0x79, 0x70, 0x00, 0x05, 0x7a, 0x98, 0x00, 0x05, 0x7b, 0x6c, 0x00, 0x05, 0x7c, 0x10, 0x00, 0x05, 0x7c, 0xc8, 0x00, 0x05, 0x7d, 0x5c, 0x00, 0x05, 0x7e, 0x1c, 0x00, 0x05, 0x7f, 0x10, 0x00, 0x05, 0x7f, 0xc8, 0x00, 0x05, 0x80, 0x80, 0x00, 0x05, 0x81, 0x74, 0x00, 0x05, 0x82, 0x48, 0x00, 0x05, 0x83, 0x5c, 0x00, 0x05, 0x84, 0x30, 0x00, 0x05, 0x85, 0x04, 0x00, 0x05, 0x85, 0xdc, 0x00, 0x05, 0x86, 0xac, 0x00, 0x05, 0x87, 0x78, 0x00, 0x05, 0x88, 0x78, 0x00, 0x05, 0x89, 0xa8, 0x00, 0x05, 0x8a, 0xa8, 0x00, 0x05, 0x8b, 0xdc, 0x00, 0x05, 0x8c, 0xec, 0x00, 0x05, 0x8d, 0xc0, 0x00, 0x05, 0x8e, 0xa0, 0x00, 0x05, 0x8f, 0x80, 0x00, 0x05, 0x90, 0x7c, 0x00, 0x05, 0x92, 0x78, 0x00, 0x05, 0x93, 0x5c, 0x00, 0x05, 0x94, 0x70, 0x00, 0x05, 0x95, 0x44, 0x00, 0x05, 0x96, 0x90, 0x00, 0x05, 0x97, 0x54, 0x00, 0x05, 0x98, 0x34, 0x00, 0x05, 0x99, 0x30, 0x00, 0x05, 0x9a, 0xf8, 0x00, 0x05, 0x9c, 0x38, 0x00, 0x05, 0x9d, 0xb4, 0x00, 0x05, 0x9e, 0xd4, 0x00, 0x05, 0x9f, 0xa8, 0x00, 0x05, 0xa0, 0x50, 0x00, 0x05, 0xa1, 0x30, 0x00, 0x05, 0xa3, 0x74, 0x00, 0x05, 0xa5, 0xf4, 0x00, 0x05, 0xa8, 0x60, 0x00, 0x05, 0xaa, 0x68, 0x00, 0x05, 0xac, 0xa0, 0x00, 0x05, 0xae, 0xdc, 0x00, 0x05, 0xb1, 0x2c, 0x00, 0x05, 0xb2, 0xec, 0x00, 0x05, 0xb4, 0xa8, 0x00, 0x05, 0xb4, 0xc4, 0x00, 0x05, 0xb4, 0xec, 0x00, 0x05, 0xb5, 0x08, 0x00, 0x05, 0xb5, 0x64, 0x00, 0x05, 0xb5, 0x84, 0x00, 0x05, 0xb5, 0xa8, 0x00, 0x05, 0xb5, 0xd0, 0x00, 0x05, 0xb6, 0x04, 0x00, 0x05, 0xb6, 0x38, 0x00, 0x05, 0xb6, 0x54, 0x00, 0x05, 0xb6, 0x7c, 0x00, 0x05, 0xb6, 0xa8, 0x00, 0x05, 0xb6, 0xc0, 0x00, 0x05, 0xb6, 0xe4, 0x00, 0x05, 0xb7, 0x14, 0x00, 0x05, 0xb7, 0x44, 0x00, 0x05, 0xb7, 0x68, 0x00, 0x05, 0xb7, 0xa0, 0x00, 0x05, 0xb8, 0x18, 0x00, 0x05, 0xb8, 0x48, 0x00, 0x05, 0xb8, 0x88, 0x00, 0x05, 0xb9, 0x44, 0x00, 0x05, 0xb9, 0xe0, 0x00, 0x05, 0xba, 0x80, 0x00, 0x05, 0xbb, 0x44, 0x00, 0x05, 0xbb, 0x54, 0x00, 0x05, 0xbb, 0x64, 0x00, 0x05, 0xbb, 0x7c, 0x00, 0x05, 0xbb, 0x94, 0x00, 0x05, 0xbb, 0xe4, 0x00, 0x05, 0xbc, 0x04, 0x00, 0x05, 0xbc, 0x24, 0x00, 0x05, 0xbc, 0x44, 0x00, 0x05, 0xbc, 0x5c, 0x00, 0x05, 0xbc, 0x74, 0x00, 0x05, 0xbc, 0x8c, 0x00, 0x05, 0xbd, 0x64, 0x00, 0x05, 0xbe, 0x10, 0x00, 0x05, 0xbe, 0xd8, 0x00, 0x05, 0xbf, 0x84, 0x00, 0x05, 0xc0, 0x00, 0x00, 0x05, 0xc0, 0x98, 0x00, 0x05, 0xc1, 0x4c, 0x00, 0x05, 0xc1, 0xd4, 0x00, 0x05, 0xc2, 0x78, 0x00, 0x05, 0xc3, 0x3c, 0x00, 0x05, 0xc3, 0xd0, 0x00, 0x05, 0xc4, 0x80, 0x00, 0x05, 0xc4, 0xa0, 0x00, 0x05, 0xc4, 0xe8, 0x00, 0x05, 0xc5, 0x14, 0x00, 0x05, 0xc5, 0x64, 0x00, 0x05, 0xc5, 0x80, 0x00, 0x05, 0xc5, 0x9c, 0x00, 0x05, 0xc5, 0xb8, 0x00, 0x05, 0xc5, 0xd4, 0x00, 0x05, 0xc5, 0xf0, 0x00, 0x05, 0xc6, 0x0c, 0x00, 0x05, 0xc6, 0x28, 0x00, 0x05, 0xc6, 0x44, 0x00, 0x05, 0xc6, 0x60, 0x00, 0x05, 0xc6, 0x7c, 0x00, 0x05, 0xc6, 0x98, 0x00, 0x05, 0xc6, 0xb4, 0x00, 0x05, 0xc6, 0xd0, 0x00, 0x05, 0xc6, 0xec, 0x00, 0x05, 0xc7, 0x08, 0x00, 0x05, 0xc7, 0x24, 0x00, 0x05, 0xc7, 0x40, 0x00, 0x05, 0xc7, 0x5c, 0x00, 0x05, 0xc7, 0x78, 0x00, 0x05, 0xc7, 0x94, 0x00, 0x05, 0xc7, 0xac, 0x00, 0x05, 0xc7, 0xc8, 0x00, 0x05, 0xc8, 0x00, 0x00, 0x05, 0xc8, 0x70, 0x00, 0x05, 0xc8, 0xc4, 0x00, 0x05, 0xc9, 0x4c, 0x00, 0x05, 0xc9, 0x98, 0x00, 0x05, 0xc9, 0xf4, 0x00, 0x05, 0xca, 0xb0, 0x00, 0x05, 0xcb, 0x10, 0x00, 0x05, 0xcb, 0x80, 0x00, 0x05, 0xcb, 0xec, 0x00, 0x05, 0xcc, 0x18, 0x00, 0x05, 0xcc, 0x90, 0x00, 0x05, 0xcc, 0xa0, 0x00, 0x05, 0xcc, 0xb0, 0x00, 0x05, 0xcc, 0xc8, 0x00, 0x05, 0xcc, 0xf4, 0x00, 0x05, 0xcd, 0x4c, 0x00, 0x05, 0xcd, 0x64, 0x00, 0x05, 0xcd, 0x7c, 0x00, 0x05, 0xcd, 0xa0, 0x00, 0x05, 0xcd, 0xcc, 0x00, 0x05, 0xcd, 0xe8, 0x00, 0x05, 0xce, 0x80, 0x00, 0x05, 0xcf, 0x8c, 0x00, 0x05, 0xd0, 0x24, 0x00, 0x05, 0xd0, 0xac, 0x00, 0x05, 0xd1, 0xa4, 0x00, 0x05, 0xd2, 0x2c, 0x00, 0x05, 0xd2, 0x8c, 0x00, 0x05, 0xd3, 0x5c, 0x00, 0x05, 0xd3, 0x78, 0x00, 0x05, 0xd3, 0x9c, 0x00, 0x05, 0xd3, 0xbc, 0x00, 0x05, 0xd4, 0x0c, 0x00, 0x05, 0xd4, 0x64, 0x00, 0x05, 0xd4, 0xb4, 0x00, 0x05, 0xd4, 0xe8, 0x00, 0x05, 0xd5, 0x20, 0x00, 0x05, 0xd5, 0x50, 0x00, 0x05, 0xd5, 0x80, 0x00, 0x05, 0xd5, 0xb0, 0x00, 0x05, 0xd5, 0xdc, 0x00, 0x05, 0xd6, 0x08, 0x00, 0x05, 0xd6, 0x38, 0x00, 0x05, 0xd6, 0x60, 0x00, 0x05, 0xd6, 0x88, 0x00, 0x05, 0xd6, 0xb0, 0x00, 0x05, 0xd6, 0xd8, 0x00, 0x05, 0xd7, 0x44, 0x00, 0x05, 0xd7, 0xb4, 0x00, 0x05, 0xd8, 0x20, 0x00, 0x05, 0xd8, 0x54, 0x00, 0x05, 0xd8, 0x88, 0x00, 0x05, 0xd8, 0xbc, 0x00, 0x05, 0xd9, 0x1c, 0x00, 0x05, 0xd9, 0x84, 0x00, 0x05, 0xd9, 0xe8, 0x00, 0x05, 0xda, 0x18, 0x00, 0x05, 0xda, 0x4c, 0x00, 0x05, 0xda, 0x7c, 0x00, 0x05, 0xda, 0xac, 0x00, 0x05, 0xda, 0xe0, 0x00, 0x05, 0xdb, 0x10, 0x00, 0x05, 0xdb, 0x64, 0x00, 0x05, 0xdb, 0xb8, 0x00, 0x05, 0xdc, 0x10, 0x00, 0x05, 0xdc, 0x5c, 0x00, 0x05, 0xdc, 0xac, 0x00, 0x05, 0xdc, 0xf8, 0x00, 0x05, 0xdd, 0x20, 0x00, 0x05, 0xdd, 0x4c, 0x00, 0x05, 0xdd, 0x74, 0x00, 0x05, 0xdd, 0xe8, 0x00, 0x05, 0xde, 0x60, 0x00, 0x05, 0xde, 0xd0, 0x00, 0x05, 0xdf, 0x04, 0x00, 0x05, 0xdf, 0x3c, 0x00, 0x05, 0xdf, 0x70, 0x00, 0x05, 0xdf, 0xc0, 0x00, 0x05, 0xe0, 0x14, 0x00, 0x05, 0xe0, 0x64, 0x00, 0x05, 0xe0, 0x94, 0x00, 0x05, 0xe0, 0xc8, 0x00, 0x05, 0xe0, 0xf8, 0x00, 0x05, 0xe1, 0x2c, 0x00, 0x05, 0xe1, 0x64, 0x00, 0x05, 0xe1, 0x98, 0x00, 0x05, 0xe2, 0x08, 0x00, 0x05, 0xe2, 0x7c, 0x00, 0x05, 0xe2, 0xec, 0x00, 0x05, 0xe3, 0x20, 0x00, 0x05, 0xe3, 0x58, 0x00, 0x05, 0xe3, 0x8c, 0x00, 0x05, 0xe3, 0xf4, 0x00, 0x05, 0xe4, 0x60, 0x00, 0x05, 0xe4, 0xc8, 0x00, 0x05, 0xe4, 0xf4, 0x00, 0x05, 0xe5, 0x24, 0x00, 0x05, 0xe5, 0x50, 0x00, 0x05, 0xe5, 0x84, 0x00, 0x05, 0xe5, 0xbc, 0x00, 0x05, 0xe5, 0xf0, 0x00, 0x05, 0xe6, 0x74, 0x00, 0x05, 0xe6, 0xfc, 0x00, 0x05, 0xe7, 0x80, 0x00, 0x05, 0xe7, 0xac, 0x00, 0x05, 0xe7, 0xdc, 0x00, 0x05, 0xe8, 0x08, 0x00, 0x05, 0xe8, 0x38, 0x00, 0x05, 0xe8, 0x6c, 0x00, 0x05, 0xe8, 0x9c, 0x00, 0x05, 0xe8, 0xd8, 0x00, 0x05, 0xe9, 0x18, 0x00, 0x05, 0xe9, 0x54, 0x00, 0x05, 0xe9, 0xd4, 0x00, 0x05, 0xea, 0x58, 0x00, 0x05, 0xea, 0xd8, 0x00, 0x05, 0xeb, 0x60, 0x00, 0x05, 0xeb, 0xec, 0x00, 0x05, 0xec, 0x74, 0x00, 0x05, 0xec, 0x88, 0x00, 0x05, 0xec, 0xac, 0x00, 0x05, 0xec, 0xd0, 0x00, 0x05, 0xec, 0xf4, 0x00, 0x05, 0xed, 0x18, 0x00, 0x05, 0xed, 0x3c, 0x00, 0x05, 0xed, 0x60, 0x00, 0x05, 0xed, 0x84, 0x00, 0x05, 0xed, 0xa8, 0x00, 0x05, 0xed, 0xd8, 0x00, 0x05, 0xee, 0x14, 0x00, 0x05, 0xee, 0x50, 0x00, 0x05, 0xee, 0xb8, 0x00, 0x05, 0xef, 0x60, 0x00, 0x05, 0xef, 0xd0, 0x00, 0x05, 0xf0, 0x90, 0x00, 0x05, 0xf1, 0x18, 0x00, 0x05, 0xf1, 0xac, 0x00, 0x05, 0xf2, 0x44, 0x00, 0x05, 0xf2, 0xa4, 0x00, 0x05, 0xf3, 0x14, 0x00, 0x05, 0xf3, 0x80, 0x00, 0x05, 0xf4, 0x04, 0x00, 0x05, 0xf4, 0xec, 0x00, 0x05, 0xf5, 0x98, 0x00, 0x05, 0xf6, 0x54, 0x00, 0x05, 0xf7, 0x48, 0x00, 0x05, 0xf7, 0xfc, 0x00, 0x05, 0xf8, 0xc0, 0x00, 0x05, 0xf9, 0xd8, 0x00, 0x05, 0xfa, 0xb0, 0x00, 0x05, 0xfb, 0x98, 0x00, 0x05, 0xfc, 0x8c, 0x00, 0x05, 0xfd, 0x30, 0x00, 0x05, 0xfd, 0xe8, 0x00, 0x05, 0xfe, 0xe4, 0x00, 0x05, 0xff, 0x94, 0x00, 0x06, 0x00, 0x58, 0x00, 0x06, 0x00, 0xfc, 0x00, 0x06, 0x01, 0x88, 0x00, 0x06, 0x02, 0x2c, 0x00, 0x06, 0x02, 0xd4, 0x00, 0x06, 0x03, 0x50, 0x00, 0x06, 0x04, 0x00, 0x00, 0x06, 0x04, 0x18, 0x00, 0x06, 0x04, 0x30, 0x00, 0x06, 0x04, 0x48, 0x00, 0x06, 0x04, 0x68, 0x00, 0x06, 0x04, 0x88, 0x00, 0x06, 0x04, 0xa8, 0x00, 0x06, 0x04, 0xc0, 0x00, 0x06, 0x04, 0xd8, 0x00, 0x06, 0x04, 0xf0, 0x00, 0x06, 0x05, 0x08, 0x00, 0x06, 0x05, 0x20, 0x00, 0x06, 0x05, 0x38, 0x00, 0x06, 0x05, 0x50, 0x00, 0x06, 0x05, 0x68, 0x00, 0x06, 0x05, 0x80, 0x00, 0x06, 0x06, 0x2c, 0x00, 0x06, 0x06, 0x9c, 0x00, 0x06, 0x07, 0x20, 0x00, 0x06, 0x08, 0x10, 0x00, 0x06, 0x08, 0xc0, 0x00, 0x06, 0x09, 0x8c, 0x00, 0x06, 0x0a, 0x64, 0x00, 0x06, 0x0a, 0xdc, 0x00, 0x06, 0x0b, 0x70, 0x00, 0x06, 0x0c, 0x60, 0x00, 0x06, 0x0c, 0xec, 0x00, 0x06, 0x0d, 0x94, 0x00, 0x06, 0x0d, 0xf8, 0x00, 0x06, 0x0e, 0x5c, 0x00, 0x06, 0x0e, 0xc0, 0x00, 0x06, 0x0e, 0xf8, 0x00, 0x06, 0x0f, 0x30, 0x00, 0x06, 0x0f, 0x68, 0x00, 0x06, 0x0f, 0xac, 0x00, 0x06, 0x0f, 0xf0, 0x00, 0x06, 0x10, 0x34, 0x00, 0x06, 0x10, 0xb0, 0x00, 0x06, 0x10, 0xf0, 0x00, 0x06, 0x11, 0x40, 0x00, 0x06, 0x11, 0xd4, 0x00, 0x06, 0x12, 0x28, 0x00, 0x06, 0x12, 0x8c, 0x00, 0x06, 0x13, 0x20, 0x00, 0x06, 0x13, 0x78, 0x00, 0x06, 0x13, 0xdc, 0x00, 0x06, 0x14, 0x6c, 0x00, 0x06, 0x14, 0x8c, 0x00, 0x06, 0x14, 0xac, 0x00, 0x06, 0x15, 0x74, 0x00, 0x06, 0x15, 0x94, 0x00, 0x06, 0x15, 0xb4, 0x00, 0x06, 0x16, 0x50, 0x00, 0x06, 0x16, 0x68, 0x00, 0x06, 0x16, 0x80, 0x00, 0x01, 0x00, 0x00, 0x12, 0x0e, 0x03, 0x54, 0x00, 0x2b, 0x00, 0x68, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x10, 0x00, 0x99, 0x00, 0x08, 0x00, 0x00, 0x04, 0x15, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1a, 0x01, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x01, 0x32, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x19, 0x01, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x19, 0x02, 0x5c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x19, 0x02, 0xaa, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0c, 0x02, 0xde, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x16, 0x03, 0x19, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x03, 0x54, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x1d, 0x03, 0xa2, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x12, 0x9d, 0x28, 0xfc, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x34, 0x3c, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x3c, 0x59, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x09, 0x3c, 0x7d, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x32, 0x01, 0xcb, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x08, 0x02, 0x19, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x32, 0x02, 0x28, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x32, 0x02, 0x76, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x18, 0x02, 0xc4, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x2c, 0x02, 0xeb, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x08, 0x00, 0x22, 0x03, 0x30, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x3a, 0x03, 0x66, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0d, 0x25, 0x3a, 0x03, 0xc0, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0e, 0x00, 0x68, 0x3b, 0x9a, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x10, 0x00, 0x1e, 0x3c, 0x39, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x11, 0x00, 0x12, 0x3c, 0x69, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x36, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x70, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x0a, 0x00, 0x00, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x33, 0x20, 0x62, 0x79, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x62, 0x79, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x0a, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x4c, 0x47, 0x43, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6b, 0x00, 0x00, 0x42, 0x6f, 0x6f, 0x6b, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x4c, 0x47, 0x43, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x4c, 0x47, 0x43, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x34, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x33, 0x34, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x4c, 0x47, 0x43, 0x53, 0x61, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x65, 0x61, 0x6d, 0x00, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x76, 0x00, 0x75, 0x00, 0x2e, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x6a, 0x61, 0x76, 0x75, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x00, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x28, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x29, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x70, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x20, 0x00, 0x28, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x29, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x50, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x67, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x0a, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x28, 0x00, 0x22, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x22, 0x00, 0x29, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x28, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x22, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x75, 0x00, 0x63, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x2f, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x0a, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x20, 0x00, 0x69, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x65, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x73, 0x00, 0x20, 0x00, 0x22, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x76, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, 0x68, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x0a, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x0a, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x66, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x20, 0x00, 0x49, 0x00, 0x53, 0x00, 0x20, 0x00, 0x50, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x56, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x44, 0x00, 0x20, 0x00, 0x22, 0x00, 0x41, 0x00, 0x53, 0x00, 0x20, 0x00, 0x49, 0x00, 0x53, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x57, 0x00, 0x49, 0x00, 0x54, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x59, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x4b, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x45, 0x00, 0x58, 0x00, 0x50, 0x00, 0x52, 0x00, 0x45, 0x00, 0x53, 0x00, 0x53, 0x00, 0x0a, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x50, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x45, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x42, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x49, 0x00, 0x54, 0x00, 0x45, 0x00, 0x44, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x49, 0x00, 0x45, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x48, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x49, 0x00, 0x54, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x53, 0x00, 0x53, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x50, 0x00, 0x41, 0x00, 0x52, 0x00, 0x54, 0x00, 0x49, 0x00, 0x43, 0x00, 0x55, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x52, 0x00, 0x20, 0x00, 0x50, 0x00, 0x55, 0x00, 0x52, 0x00, 0x50, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x46, 0x00, 0x52, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x45, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x59, 0x00, 0x52, 0x00, 0x49, 0x00, 0x47, 0x00, 0x48, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x50, 0x00, 0x41, 0x00, 0x54, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x44, 0x00, 0x45, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x52, 0x00, 0x4b, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x52, 0x00, 0x49, 0x00, 0x47, 0x00, 0x48, 0x00, 0x54, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x45, 0x00, 0x56, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x48, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x20, 0x00, 0x42, 0x00, 0x49, 0x00, 0x54, 0x00, 0x53, 0x00, 0x54, 0x00, 0x52, 0x00, 0x45, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x41, 0x00, 0x54, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x42, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x42, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x47, 0x00, 0x45, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x47, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x53, 0x00, 0x50, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x49, 0x00, 0x52, 0x00, 0x45, 0x00, 0x43, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x53, 0x00, 0x45, 0x00, 0x51, 0x00, 0x55, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x49, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x47, 0x00, 0x45, 0x00, 0x53, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x57, 0x00, 0x48, 0x00, 0x45, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x43, 0x00, 0x54, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x43, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x57, 0x00, 0x49, 0x00, 0x53, 0x00, 0x45, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x41, 0x00, 0x52, 0x00, 0x49, 0x00, 0x53, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x46, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x46, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x44, 0x00, 0x45, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x53, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x45, 0x00, 0x78, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x73, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x77, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x75, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, 0x7a, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x0a, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x70, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x76, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x72, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x36, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x50, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x67, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x28, 0x00, 0x22, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x22, 0x00, 0x29, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x73, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x28, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x22, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x75, 0x00, 0x63, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x70, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x2f, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x0a, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x73, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x20, 0x00, 0x69, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x65, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x73, 0x00, 0x20, 0x00, 0x22, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x20, 0x00, 0x22, 0x00, 0x41, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x76, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x0a, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, 0x68, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x20, 0x00, 0x41, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x0a, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x66, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x20, 0x00, 0x49, 0x00, 0x53, 0x00, 0x20, 0x00, 0x50, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x56, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x44, 0x00, 0x20, 0x00, 0x22, 0x00, 0x41, 0x00, 0x53, 0x00, 0x20, 0x00, 0x49, 0x00, 0x53, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x57, 0x00, 0x49, 0x00, 0x54, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x59, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x4b, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x45, 0x00, 0x58, 0x00, 0x50, 0x00, 0x52, 0x00, 0x45, 0x00, 0x53, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x50, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x45, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x42, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x49, 0x00, 0x54, 0x00, 0x45, 0x00, 0x44, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x49, 0x00, 0x45, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x0a, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x48, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x46, 0x00, 0x49, 0x00, 0x54, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x53, 0x00, 0x53, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x50, 0x00, 0x41, 0x00, 0x52, 0x00, 0x54, 0x00, 0x49, 0x00, 0x43, 0x00, 0x55, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x52, 0x00, 0x20, 0x00, 0x50, 0x00, 0x55, 0x00, 0x52, 0x00, 0x50, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x46, 0x00, 0x52, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x45, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x0a, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x59, 0x00, 0x52, 0x00, 0x49, 0x00, 0x47, 0x00, 0x48, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x50, 0x00, 0x41, 0x00, 0x54, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x44, 0x00, 0x45, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x52, 0x00, 0x4b, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x52, 0x00, 0x49, 0x00, 0x47, 0x00, 0x48, 0x00, 0x54, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x45, 0x00, 0x56, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x48, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x41, 0x00, 0x56, 0x00, 0x4d, 0x00, 0x4a, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x42, 0x00, 0x41, 0x00, 0x48, 0x00, 0x20, 0x00, 0x42, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x42, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x47, 0x00, 0x45, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x47, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x53, 0x00, 0x50, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x49, 0x00, 0x52, 0x00, 0x45, 0x00, 0x43, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x53, 0x00, 0x45, 0x00, 0x51, 0x00, 0x55, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x49, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x0a, 0x00, 0x44, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x47, 0x00, 0x45, 0x00, 0x53, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x57, 0x00, 0x48, 0x00, 0x45, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x43, 0x00, 0x54, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x43, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x57, 0x00, 0x49, 0x00, 0x53, 0x00, 0x45, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x41, 0x00, 0x52, 0x00, 0x49, 0x00, 0x53, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x46, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x0a, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x44, 0x00, 0x45, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x53, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x45, 0x00, 0x78, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x20, 0x00, 0x73, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x77, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x75, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, 0x7a, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x0a, 0x00, 0x66, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x72, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x74, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x2e, 0x00, 0x00, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x28, 0x63, 0x29, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x29, 0x2e, 0x20, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x20, 0x47, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x41, 0x72, 0x65, 0x76, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x28, 0x63, 0x29, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x75, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x29, 0x0a, 0x0a, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x56, 0x65, 0x72, 0x61, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x33, 0x20, 0x62, 0x79, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x56, 0x65, 0x72, 0x61, 0x20, 0x69, 0x73, 0x0a, 0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x62, 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x22, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x22, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x2c, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x72, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x0a, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x22, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x0a, 0x22, 0x56, 0x65, 0x72, 0x61, 0x22, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x0a, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x56, 0x65, 0x72, 0x61, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x79, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x0a, 0x0a, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, 0x22, 0x2c, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x4f, 0x46, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x20, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x0a, 0x4f, 0x52, 0x20, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, 0x20, 0x4f, 0x46, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x0a, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x4e, 0x4f, 0x4e, 0x49, 0x4e, 0x46, 0x52, 0x49, 0x4e, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x2c, 0x20, 0x50, 0x41, 0x54, 0x45, 0x4e, 0x54, 0x2c, 0x0a, 0x54, 0x52, 0x41, 0x44, 0x45, 0x4d, 0x41, 0x52, 0x4b, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x52, 0x49, 0x47, 0x48, 0x54, 0x2e, 0x20, 0x49, 0x4e, 0x20, 0x4e, 0x4f, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x42, 0x49, 0x54, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x20, 0x4f, 0x52, 0x20, 0x54, 0x48, 0x45, 0x20, 0x47, 0x4e, 0x4f, 0x4d, 0x45, 0x0a, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x42, 0x45, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x2c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x0a, 0x41, 0x4e, 0x59, 0x20, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x2c, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x2c, 0x20, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x2c, 0x0a, 0x57, 0x48, 0x45, 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x41, 0x4e, 0x20, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, 0x54, 0x4f, 0x52, 0x54, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x57, 0x49, 0x53, 0x45, 0x2c, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, 0x47, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x2c, 0x20, 0x4f, 0x55, 0x54, 0x20, 0x4f, 0x46, 0x0a, 0x54, 0x48, 0x45, 0x20, 0x55, 0x53, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, 0x54, 0x4f, 0x20, 0x55, 0x53, 0x45, 0x20, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x44, 0x45, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x53, 0x20, 0x49, 0x4e, 0x20, 0x54, 0x48, 0x45, 0x0a, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x2e, 0x0a, 0x0a, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x47, 0x6e, 0x6f, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x6e, 0x6f, 0x6d, 0x65, 0x0a, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x2c, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x64, 0x65, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x49, 0x6e, 0x63, 0x2e, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x3a, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x74, 0x20, 0x67, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x74, 0x0a, 0x6f, 0x72, 0x67, 0x2e, 0x20, 0x0a, 0x0a, 0x41, 0x72, 0x65, 0x76, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x62, 0x79, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x62, 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x22, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x22, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x56, 0x65, 0x72, 0x61, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x0a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2c, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x72, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x0a, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x22, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x22, 0x41, 0x72, 0x65, 0x76, 0x22, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x0a, 0x6f, 0x72, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x0a, 0x22, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x20, 0x41, 0x72, 0x65, 0x76, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x62, 0x75, 0x74, 0x0a, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x79, 0x0a, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x0a, 0x0a, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, 0x22, 0x2c, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x4f, 0x46, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x0a, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, 0x20, 0x4f, 0x46, 0x0a, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x4e, 0x4f, 0x4e, 0x49, 0x4e, 0x46, 0x52, 0x49, 0x4e, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x0a, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x2c, 0x20, 0x50, 0x41, 0x54, 0x45, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x52, 0x41, 0x44, 0x45, 0x4d, 0x41, 0x52, 0x4b, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x52, 0x49, 0x47, 0x48, 0x54, 0x2e, 0x20, 0x49, 0x4e, 0x20, 0x4e, 0x4f, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x0a, 0x54, 0x41, 0x56, 0x4d, 0x4a, 0x4f, 0x4e, 0x47, 0x20, 0x42, 0x41, 0x48, 0x20, 0x42, 0x45, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x2c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x0a, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x2c, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x2c, 0x20, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x0a, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x2c, 0x20, 0x57, 0x48, 0x45, 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x41, 0x4e, 0x20, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, 0x54, 0x4f, 0x52, 0x54, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x57, 0x49, 0x53, 0x45, 0x2c, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, 0x47, 0x0a, 0x46, 0x52, 0x4f, 0x4d, 0x2c, 0x20, 0x4f, 0x55, 0x54, 0x20, 0x4f, 0x46, 0x20, 0x54, 0x48, 0x45, 0x20, 0x55, 0x53, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, 0x54, 0x4f, 0x20, 0x55, 0x53, 0x45, 0x20, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x0a, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x44, 0x45, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x53, 0x20, 0x49, 0x4e, 0x20, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x2e, 0x0a, 0x0a, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x0a, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x0a, 0x64, 0x65, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x40, 0x20, 0x66, 0x72, 0x65, 0x65, 0x0a, 0x2e, 0x20, 0x66, 0x72, 0x2e, 0x00, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x76, 0x00, 0x75, 0x00, 0x2e, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x74, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x2f, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x2e, 0x00, 0x70, 0x00, 0x68, 0x00, 0x70, 0x00, 0x2f, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x6a, 0x61, 0x76, 0x75, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x77, 0x69, 0x6b, 0x69, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x70, 0x68, 0x70, 0x2f, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x4c, 0x47, 0x43, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x00, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7e, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0xac, 0x00, 0xa3, 0x00, 0x84, 0x00, 0x85, 0x00, 0xbd, 0x00, 0x96, 0x00, 0xe8, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8b, 0x00, 0x9d, 0x00, 0xa9, 0x00, 0xa4, 0x01, 0x02, 0x00, 0x8a, 0x00, 0xda, 0x00, 0x83, 0x00, 0x93, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x8d, 0x00, 0x97, 0x00, 0x88, 0x00, 0xc3, 0x00, 0xde, 0x00, 0xf1, 0x00, 0x9e, 0x00, 0xaa, 0x00, 0xf5, 0x00, 0xf4, 0x00, 0xf6, 0x00, 0xa2, 0x00, 0xad, 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xae, 0x00, 0x62, 0x00, 0x63, 0x00, 0x90, 0x00, 0x64, 0x00, 0xcb, 0x00, 0x65, 0x00, 0xc8, 0x00, 0xca, 0x00, 0xcf, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xe9, 0x00, 0x66, 0x00, 0xd3, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xaf, 0x00, 0x67, 0x00, 0xf0, 0x00, 0x91, 0x00, 0xd6, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x68, 0x00, 0xeb, 0x00, 0xed, 0x00, 0x89, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6e, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0x71, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x75, 0x00, 0x74, 0x00, 0x76, 0x00, 0x77, 0x00, 0xea, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x7c, 0x00, 0xb8, 0x00, 0xa1, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x80, 0x00, 0x81, 0x00, 0xec, 0x00, 0xee, 0x00, 0xba, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x00, 0xfd, 0x00, 0xfe, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x00, 0xff, 0x01, 0x00, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x01, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x00, 0xf8, 0x00, 0xf9, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x00, 0xfa, 0x00, 0xd7, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x00, 0xe2, 0x00, 0xe3, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x00, 0xb0, 0x00, 0xb1, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xe4, 0x00, 0xe5, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x00, 0xbb, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x00, 0xe6, 0x00, 0xe7, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x00, 0xa6, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x02, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, 0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x72, 0x02, 0x73, 0x02, 0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x00, 0xd8, 0x00, 0xe1, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xe0, 0x00, 0xd9, 0x00, 0xdf, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0xc8, 0x02, 0xc9, 0x02, 0xca, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x03, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0x20, 0x03, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, 0x28, 0x03, 0x29, 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, 0x03, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x00, 0x9f, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x00, 0x9b, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, 0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xe0, 0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe6, 0x03, 0xe7, 0x03, 0xe8, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xec, 0x03, 0xed, 0x03, 0xee, 0x03, 0xef, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, 0x03, 0xf8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xff, 0x04, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, 0x04, 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, 0x04, 0x30, 0x04, 0x31, 0x04, 0x32, 0x04, 0x33, 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, 0x04, 0x40, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x44, 0x04, 0x45, 0x04, 0x46, 0x04, 0x47, 0x04, 0x48, 0x04, 0x49, 0x04, 0x4a, 0x04, 0x4b, 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x4f, 0x04, 0x50, 0x04, 0x51, 0x04, 0x52, 0x04, 0x53, 0x04, 0x54, 0x04, 0x55, 0x04, 0x56, 0x04, 0x57, 0x04, 0x58, 0x04, 0x59, 0x04, 0x5a, 0x04, 0x5b, 0x04, 0x5c, 0x04, 0x5d, 0x04, 0x5e, 0x04, 0x5f, 0x04, 0x60, 0x04, 0x61, 0x04, 0x62, 0x04, 0x63, 0x04, 0x64, 0x04, 0x65, 0x04, 0x66, 0x04, 0x67, 0x04, 0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x6b, 0x04, 0x6c, 0x04, 0x6d, 0x04, 0x6e, 0x04, 0x6f, 0x04, 0x70, 0x04, 0x71, 0x04, 0x72, 0x04, 0x73, 0x04, 0x74, 0x04, 0x75, 0x04, 0x76, 0x04, 0x77, 0x04, 0x78, 0x04, 0x79, 0x04, 0x7a, 0x04, 0x7b, 0x04, 0x7c, 0x04, 0x7d, 0x04, 0x7e, 0x04, 0x7f, 0x04, 0x80, 0x04, 0x81, 0x04, 0x82, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, 0x87, 0x04, 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, 0x04, 0x90, 0x04, 0x91, 0x04, 0x92, 0x04, 0x93, 0x04, 0x94, 0x04, 0x95, 0x04, 0x96, 0x04, 0x97, 0x04, 0x98, 0x04, 0x99, 0x04, 0x9a, 0x04, 0x9b, 0x04, 0x9c, 0x04, 0x9d, 0x04, 0x9e, 0x04, 0x9f, 0x04, 0xa0, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa3, 0x04, 0xa4, 0x04, 0xa5, 0x04, 0xa6, 0x04, 0xa7, 0x04, 0xa8, 0x04, 0xa9, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xac, 0x04, 0xad, 0x04, 0xae, 0x04, 0xaf, 0x04, 0xb0, 0x04, 0xb1, 0x04, 0xb2, 0x04, 0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xb6, 0x04, 0xb7, 0x04, 0xb8, 0x04, 0xb9, 0x04, 0xba, 0x04, 0xbb, 0x04, 0xbc, 0x04, 0xbd, 0x04, 0xbe, 0x04, 0xbf, 0x04, 0xc0, 0x04, 0xc1, 0x04, 0xc2, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0xc6, 0x04, 0xc7, 0x04, 0xc8, 0x04, 0xc9, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xce, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd8, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe0, 0x04, 0xe1, 0x04, 0xe2, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe5, 0x04, 0xe6, 0x04, 0xe7, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf1, 0x04, 0xf2, 0x04, 0xf3, 0x04, 0xf4, 0x04, 0xf5, 0x04, 0xf6, 0x04, 0xf7, 0x04, 0xf8, 0x04, 0xf9, 0x04, 0xfa, 0x04, 0xfb, 0x04, 0xfc, 0x04, 0xfd, 0x04, 0xfe, 0x04, 0xff, 0x05, 0x00, 0x05, 0x01, 0x05, 0x02, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x07, 0x05, 0x08, 0x05, 0x09, 0x05, 0x0a, 0x05, 0x0b, 0x05, 0x0c, 0x05, 0x0d, 0x05, 0x0e, 0x05, 0x0f, 0x05, 0x10, 0x05, 0x11, 0x05, 0x12, 0x05, 0x13, 0x05, 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, 0x17, 0x05, 0x18, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x1d, 0x05, 0x1e, 0x05, 0x1f, 0x05, 0x20, 0x05, 0x21, 0x05, 0x22, 0x05, 0x23, 0x05, 0x24, 0x05, 0x25, 0x05, 0x26, 0x05, 0x27, 0x05, 0x28, 0x05, 0x29, 0x05, 0x2a, 0x05, 0x2b, 0x05, 0x2c, 0x05, 0x2d, 0x05, 0x2e, 0x05, 0x2f, 0x05, 0x30, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, 0x34, 0x05, 0x35, 0x05, 0x36, 0x05, 0x37, 0x05, 0x38, 0x05, 0x39, 0x05, 0x3a, 0x05, 0x3b, 0x05, 0x3c, 0x05, 0x3d, 0x05, 0x3e, 0x05, 0x3f, 0x05, 0x40, 0x05, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4b, 0x05, 0x4c, 0x05, 0x4d, 0x05, 0x4e, 0x05, 0x4f, 0x05, 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0x57, 0x05, 0x58, 0x05, 0x59, 0x05, 0x5a, 0x05, 0x5b, 0x05, 0x5c, 0x05, 0x5d, 0x05, 0x5e, 0x05, 0x5f, 0x05, 0x60, 0x05, 0x61, 0x05, 0x62, 0x05, 0x63, 0x05, 0x64, 0x05, 0x65, 0x05, 0x66, 0x05, 0x67, 0x05, 0x68, 0x05, 0x69, 0x05, 0x6a, 0x05, 0x6b, 0x05, 0x6c, 0x05, 0x6d, 0x05, 0x6e, 0x05, 0x6f, 0x05, 0x70, 0x05, 0x71, 0x05, 0x72, 0x05, 0x73, 0x05, 0x74, 0x05, 0x75, 0x05, 0x76, 0x05, 0x77, 0x05, 0x78, 0x05, 0x79, 0x05, 0x7a, 0x05, 0x7b, 0x05, 0x7c, 0x05, 0x7d, 0x05, 0x7e, 0x05, 0x7f, 0x05, 0x80, 0x05, 0x81, 0x05, 0x82, 0x05, 0x83, 0x05, 0x84, 0x05, 0x85, 0x05, 0x86, 0x05, 0x87, 0x05, 0x88, 0x05, 0x89, 0x05, 0x8a, 0x05, 0x8b, 0x05, 0x8c, 0x05, 0x8d, 0x05, 0x8e, 0x05, 0x8f, 0x05, 0x90, 0x05, 0x91, 0x05, 0x92, 0x05, 0x93, 0x05, 0x94, 0x05, 0x95, 0x05, 0x96, 0x05, 0x97, 0x05, 0x98, 0x05, 0x99, 0x05, 0x9a, 0x05, 0x9b, 0x05, 0x9c, 0x05, 0x9d, 0x05, 0x9e, 0x05, 0x9f, 0x05, 0xa0, 0x05, 0xa1, 0x05, 0xa2, 0x05, 0xa3, 0x05, 0xa4, 0x05, 0xa5, 0x05, 0xa6, 0x05, 0xa7, 0x05, 0xa8, 0x05, 0xa9, 0x05, 0xaa, 0x05, 0xab, 0x05, 0xac, 0x05, 0xad, 0x05, 0xae, 0x05, 0xaf, 0x05, 0xb0, 0x05, 0xb1, 0x05, 0xb2, 0x05, 0xb3, 0x05, 0xb4, 0x05, 0xb5, 0x05, 0xb6, 0x05, 0xb7, 0x05, 0xb8, 0x05, 0xb9, 0x05, 0xba, 0x05, 0xbb, 0x05, 0xbc, 0x05, 0xbd, 0x05, 0xbe, 0x05, 0xbf, 0x05, 0xc0, 0x05, 0xc1, 0x05, 0xc2, 0x05, 0xc3, 0x05, 0xc4, 0x05, 0xc5, 0x05, 0xc6, 0x05, 0xc7, 0x05, 0xc8, 0x05, 0xc9, 0x05, 0xca, 0x05, 0xcb, 0x05, 0xcc, 0x05, 0xcd, 0x05, 0xce, 0x05, 0xcf, 0x05, 0xd0, 0x05, 0xd1, 0x05, 0xd2, 0x05, 0xd3, 0x05, 0xd4, 0x05, 0xd5, 0x05, 0xd6, 0x05, 0xd7, 0x05, 0xd8, 0x05, 0xd9, 0x05, 0xda, 0x05, 0xdb, 0x05, 0xdc, 0x05, 0xdd, 0x05, 0xde, 0x05, 0xdf, 0x05, 0xe0, 0x05, 0xe1, 0x05, 0xe2, 0x05, 0xe3, 0x05, 0xe4, 0x05, 0xe5, 0x05, 0xe6, 0x05, 0xe7, 0x05, 0xe8, 0x05, 0xe9, 0x05, 0xea, 0x05, 0xeb, 0x05, 0xec, 0x05, 0xed, 0x05, 0xee, 0x05, 0xef, 0x05, 0xf0, 0x05, 0xf1, 0x05, 0xf2, 0x05, 0xf3, 0x05, 0xf4, 0x05, 0xf5, 0x05, 0xf6, 0x05, 0xf7, 0x05, 0xf8, 0x05, 0xf9, 0x05, 0xfa, 0x05, 0xfb, 0x05, 0xfc, 0x05, 0xfd, 0x05, 0xfe, 0x05, 0xff, 0x06, 0x00, 0x06, 0x01, 0x06, 0x02, 0x06, 0x03, 0x06, 0x04, 0x06, 0x05, 0x06, 0x06, 0x06, 0x07, 0x06, 0x08, 0x06, 0x09, 0x06, 0x0a, 0x06, 0x0b, 0x06, 0x0c, 0x06, 0x0d, 0x06, 0x0e, 0x06, 0x0f, 0x06, 0x10, 0x06, 0x11, 0x06, 0x12, 0x06, 0x13, 0x06, 0x14, 0x06, 0x15, 0x06, 0x16, 0x06, 0x17, 0x06, 0x18, 0x06, 0x19, 0x06, 0x1a, 0x06, 0x1b, 0x06, 0x1c, 0x06, 0x1d, 0x06, 0x1e, 0x06, 0x1f, 0x06, 0x20, 0x06, 0x21, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2a, 0x06, 0x2b, 0x06, 0x2c, 0x06, 0x2d, 0x06, 0x2e, 0x06, 0x2f, 0x06, 0x30, 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3a, 0x06, 0x3b, 0x06, 0x3c, 0x06, 0x3d, 0x06, 0x3e, 0x06, 0x3f, 0x06, 0x40, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4a, 0x06, 0x4b, 0x06, 0x4c, 0x06, 0x4d, 0x06, 0x4e, 0x06, 0x4f, 0x06, 0x50, 0x06, 0x51, 0x06, 0x52, 0x06, 0x53, 0x06, 0x54, 0x06, 0x55, 0x06, 0x56, 0x06, 0x57, 0x06, 0x58, 0x06, 0x59, 0x06, 0x5a, 0x06, 0x5b, 0x06, 0x5c, 0x06, 0x5d, 0x06, 0x5e, 0x06, 0x5f, 0x06, 0x60, 0x06, 0x61, 0x06, 0x62, 0x06, 0x63, 0x06, 0x64, 0x06, 0x65, 0x06, 0x66, 0x06, 0x67, 0x06, 0x68, 0x06, 0x69, 0x06, 0x6a, 0x06, 0x6b, 0x06, 0x6c, 0x06, 0x6d, 0x06, 0x6e, 0x06, 0x6f, 0x06, 0x70, 0x06, 0x71, 0x06, 0x72, 0x06, 0x73, 0x06, 0x74, 0x06, 0x75, 0x06, 0x76, 0x06, 0x77, 0x06, 0x78, 0x06, 0x79, 0x06, 0x7a, 0x06, 0x7b, 0x06, 0x7c, 0x06, 0x7d, 0x06, 0x7e, 0x06, 0x7f, 0x06, 0x80, 0x06, 0x81, 0x06, 0x82, 0x06, 0x83, 0x06, 0x84, 0x06, 0x85, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, 0x06, 0x89, 0x06, 0x8a, 0x06, 0x8b, 0x06, 0x8c, 0x06, 0x8d, 0x06, 0x8e, 0x06, 0x8f, 0x06, 0x90, 0x06, 0x91, 0x06, 0x92, 0x06, 0x93, 0x06, 0x94, 0x06, 0x95, 0x06, 0x96, 0x06, 0x97, 0x06, 0x98, 0x06, 0x99, 0x06, 0x9a, 0x06, 0x9b, 0x06, 0x9c, 0x06, 0x9d, 0x06, 0x9e, 0x06, 0x9f, 0x06, 0xa0, 0x06, 0xa1, 0x06, 0xa2, 0x06, 0xa3, 0x06, 0xa4, 0x06, 0xa5, 0x06, 0xa6, 0x06, 0xa7, 0x06, 0xa8, 0x06, 0xa9, 0x06, 0xaa, 0x06, 0xab, 0x06, 0xac, 0x06, 0xad, 0x06, 0xae, 0x06, 0xaf, 0x06, 0xb0, 0x06, 0xb1, 0x06, 0xb2, 0x06, 0xb3, 0x06, 0xb4, 0x06, 0xb5, 0x06, 0xb6, 0x06, 0xb7, 0x06, 0xb8, 0x06, 0xb9, 0x06, 0xba, 0x06, 0xbb, 0x06, 0xbc, 0x06, 0xbd, 0x06, 0xbe, 0x06, 0xbf, 0x06, 0xc0, 0x06, 0xc1, 0x06, 0xc2, 0x06, 0xc3, 0x06, 0xc4, 0x06, 0xc5, 0x06, 0xc6, 0x06, 0xc7, 0x06, 0xc8, 0x06, 0xc9, 0x06, 0xca, 0x06, 0xcb, 0x06, 0xcc, 0x06, 0xcd, 0x06, 0xce, 0x06, 0xcf, 0x06, 0xd0, 0x06, 0xd1, 0x06, 0xd2, 0x06, 0xd3, 0x06, 0xd4, 0x06, 0xd5, 0x06, 0xd6, 0x06, 0xd7, 0x06, 0xd8, 0x06, 0xd9, 0x06, 0xda, 0x06, 0xdb, 0x06, 0xdc, 0x06, 0xdd, 0x06, 0xde, 0x06, 0xdf, 0x06, 0xe0, 0x06, 0xe1, 0x06, 0xe2, 0x06, 0xe3, 0x06, 0xe4, 0x06, 0xe5, 0x06, 0xe6, 0x06, 0xe7, 0x06, 0xe8, 0x06, 0xe9, 0x06, 0xea, 0x06, 0xeb, 0x06, 0xec, 0x06, 0xed, 0x06, 0xee, 0x06, 0xef, 0x06, 0xf0, 0x06, 0xf1, 0x06, 0xf2, 0x06, 0xf3, 0x06, 0xf4, 0x06, 0xf5, 0x06, 0xf6, 0x06, 0xf7, 0x06, 0xf8, 0x06, 0xf9, 0x06, 0xfa, 0x06, 0xfb, 0x06, 0xfc, 0x06, 0xfd, 0x06, 0xfe, 0x06, 0xff, 0x07, 0x00, 0x07, 0x01, 0x07, 0x02, 0x07, 0x03, 0x07, 0x04, 0x07, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x08, 0x07, 0x09, 0x07, 0x0a, 0x07, 0x0b, 0x07, 0x0c, 0x07, 0x0d, 0x07, 0x0e, 0x07, 0x0f, 0x07, 0x10, 0x07, 0x11, 0x07, 0x12, 0x07, 0x13, 0x07, 0x14, 0x07, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x18, 0x07, 0x19, 0x07, 0x1a, 0x07, 0x1b, 0x07, 0x1c, 0x07, 0x1d, 0x07, 0x1e, 0x07, 0x1f, 0x07, 0x20, 0x07, 0x21, 0x07, 0x22, 0x07, 0x23, 0x07, 0x24, 0x07, 0x25, 0x07, 0x26, 0x07, 0x27, 0x07, 0x28, 0x07, 0x29, 0x07, 0x2a, 0x07, 0x2b, 0x07, 0x2c, 0x07, 0x2d, 0x07, 0x2e, 0x07, 0x2f, 0x07, 0x30, 0x07, 0x31, 0x07, 0x32, 0x07, 0x33, 0x07, 0x34, 0x07, 0x35, 0x07, 0x36, 0x07, 0x37, 0x07, 0x38, 0x07, 0x39, 0x07, 0x3a, 0x07, 0x3b, 0x07, 0x3c, 0x07, 0x3d, 0x07, 0x3e, 0x07, 0x3f, 0x07, 0x40, 0x07, 0x41, 0x07, 0x42, 0x07, 0x43, 0x07, 0x44, 0x07, 0x45, 0x07, 0x46, 0x07, 0x47, 0x07, 0x48, 0x07, 0x49, 0x07, 0x4a, 0x07, 0x4b, 0x07, 0x4c, 0x07, 0x4d, 0x07, 0x4e, 0x07, 0x4f, 0x07, 0x50, 0x07, 0x51, 0x07, 0x52, 0x07, 0x53, 0x07, 0x54, 0x07, 0x55, 0x07, 0x56, 0x07, 0x57, 0x07, 0x58, 0x07, 0x59, 0x07, 0x5a, 0x07, 0x5b, 0x07, 0x5c, 0x07, 0x5d, 0x07, 0x5e, 0x07, 0x5f, 0x07, 0x60, 0x07, 0x61, 0x07, 0x62, 0x07, 0x63, 0x07, 0x64, 0x07, 0x65, 0x07, 0x66, 0x07, 0x67, 0x07, 0x68, 0x07, 0x69, 0x00, 0xb2, 0x00, 0xb3, 0x07, 0x6a, 0x07, 0x6b, 0x07, 0x6c, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xc4, 0x07, 0x6d, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xc5, 0x07, 0x6e, 0x00, 0x82, 0x00, 0xc2, 0x00, 0x87, 0x07, 0x6f, 0x07, 0x70, 0x07, 0x71, 0x00, 0xab, 0x07, 0x72, 0x07, 0x73, 0x07, 0x74, 0x07, 0x75, 0x07, 0x76, 0x07, 0x77, 0x07, 0x78, 0x07, 0x79, 0x07, 0x7a, 0x00, 0xc6, 0x07, 0x7b, 0x07, 0x7c, 0x07, 0x7d, 0x07, 0x7e, 0x07, 0x7f, 0x07, 0x80, 0x07, 0x81, 0x07, 0x82, 0x00, 0xbe, 0x00, 0xbf, 0x07, 0x83, 0x07, 0x84, 0x07, 0x85, 0x07, 0x86, 0x07, 0x87, 0x07, 0x88, 0x07, 0x89, 0x07, 0x8a, 0x07, 0x8b, 0x00, 0xbc, 0x07, 0x8c, 0x07, 0x8d, 0x07, 0x8e, 0x07, 0x8f, 0x07, 0x90, 0x07, 0x91, 0x07, 0x92, 0x07, 0x93, 0x07, 0x94, 0x07, 0x95, 0x07, 0x96, 0x07, 0x97, 0x07, 0x98, 0x07, 0x99, 0x07, 0x9a, 0x07, 0x9b, 0x07, 0x9c, 0x07, 0x9d, 0x07, 0x9e, 0x07, 0x9f, 0x07, 0xa0, 0x07, 0xa1, 0x07, 0xa2, 0x07, 0xa3, 0x07, 0xa4, 0x07, 0xa5, 0x07, 0xa6, 0x07, 0xa7, 0x07, 0xa8, 0x07, 0xa9, 0x07, 0xaa, 0x07, 0xab, 0x07, 0xac, 0x07, 0xad, 0x07, 0xae, 0x07, 0xaf, 0x07, 0xb0, 0x07, 0xb1, 0x07, 0xb2, 0x07, 0xb3, 0x07, 0xb4, 0x07, 0xb5, 0x07, 0xb6, 0x07, 0xb7, 0x07, 0xb8, 0x07, 0xb9, 0x07, 0xba, 0x07, 0xbb, 0x07, 0xbc, 0x07, 0xbd, 0x07, 0xbe, 0x07, 0xbf, 0x07, 0xc0, 0x07, 0xc1, 0x07, 0xc2, 0x07, 0xc3, 0x07, 0xc4, 0x07, 0xc5, 0x07, 0xc6, 0x07, 0xc7, 0x07, 0xc8, 0x07, 0xc9, 0x07, 0xca, 0x07, 0xcb, 0x07, 0xcc, 0x07, 0xcd, 0x07, 0xce, 0x07, 0xcf, 0x07, 0xd0, 0x07, 0xd1, 0x07, 0xd2, 0x07, 0xd3, 0x07, 0xd4, 0x07, 0xd5, 0x07, 0xd6, 0x07, 0xd7, 0x07, 0xd8, 0x07, 0xd9, 0x07, 0xda, 0x07, 0xdb, 0x07, 0xdc, 0x07, 0xdd, 0x07, 0xde, 0x00, 0xf7, 0x07, 0xdf, 0x07, 0xe0, 0x07, 0xe1, 0x07, 0xe2, 0x07, 0xe3, 0x07, 0xe4, 0x07, 0xe5, 0x07, 0xe6, 0x07, 0xe7, 0x07, 0xe8, 0x07, 0xe9, 0x07, 0xea, 0x07, 0xeb, 0x07, 0xec, 0x07, 0xed, 0x07, 0xee, 0x07, 0xef, 0x07, 0xf0, 0x07, 0xf1, 0x07, 0xf2, 0x07, 0xf3, 0x07, 0xf4, 0x07, 0xf5, 0x07, 0xf6, 0x07, 0xf7, 0x07, 0xf8, 0x07, 0xf9, 0x07, 0xfa, 0x07, 0xfb, 0x07, 0xfc, 0x07, 0xfd, 0x07, 0xfe, 0x07, 0xff, 0x08, 0x00, 0x08, 0x01, 0x08, 0x02, 0x08, 0x03, 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 0x08, 0x07, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0a, 0x08, 0x0b, 0x08, 0x0c, 0x08, 0x0d, 0x08, 0x0e, 0x08, 0x0f, 0x08, 0x10, 0x08, 0x11, 0x08, 0x12, 0x08, 0x13, 0x08, 0x14, 0x08, 0x15, 0x08, 0x16, 0x08, 0x17, 0x08, 0x18, 0x08, 0x19, 0x08, 0x1a, 0x08, 0x1b, 0x00, 0x8c, 0x08, 0x1c, 0x08, 0x1d, 0x08, 0x1e, 0x08, 0x1f, 0x08, 0x20, 0x08, 0x21, 0x08, 0x22, 0x08, 0x23, 0x08, 0x24, 0x08, 0x25, 0x08, 0x26, 0x08, 0x27, 0x08, 0x28, 0x08, 0x29, 0x08, 0x2a, 0x08, 0x2b, 0x08, 0x2c, 0x08, 0x2d, 0x08, 0x2e, 0x08, 0x2f, 0x08, 0x30, 0x08, 0x31, 0x08, 0x32, 0x08, 0x33, 0x08, 0x34, 0x08, 0x35, 0x08, 0x36, 0x08, 0x37, 0x08, 0x38, 0x08, 0x39, 0x08, 0x3a, 0x08, 0x3b, 0x08, 0x3c, 0x08, 0x3d, 0x08, 0x3e, 0x08, 0x3f, 0x08, 0x40, 0x08, 0x41, 0x08, 0x42, 0x08, 0x43, 0x08, 0x44, 0x08, 0x45, 0x08, 0x46, 0x08, 0x47, 0x08, 0x48, 0x08, 0x49, 0x08, 0x4a, 0x08, 0x4b, 0x08, 0x4c, 0x08, 0x4d, 0x08, 0x4e, 0x08, 0x4f, 0x08, 0x50, 0x08, 0x51, 0x08, 0x52, 0x08, 0x53, 0x08, 0x54, 0x08, 0x55, 0x08, 0x56, 0x08, 0x57, 0x08, 0x58, 0x08, 0x59, 0x08, 0x5a, 0x08, 0x5b, 0x08, 0x5c, 0x08, 0x5d, 0x08, 0x5e, 0x08, 0x5f, 0x08, 0x60, 0x08, 0x61, 0x08, 0x62, 0x08, 0x63, 0x08, 0x64, 0x08, 0x65, 0x08, 0x66, 0x08, 0x67, 0x08, 0x68, 0x08, 0x69, 0x08, 0x6a, 0x08, 0x6b, 0x08, 0x6c, 0x08, 0x6d, 0x08, 0x6e, 0x08, 0x6f, 0x08, 0x70, 0x08, 0x71, 0x08, 0x72, 0x08, 0x73, 0x08, 0x74, 0x08, 0x75, 0x08, 0x76, 0x08, 0x77, 0x08, 0x78, 0x08, 0x79, 0x08, 0x7a, 0x08, 0x7b, 0x08, 0x7c, 0x08, 0x7d, 0x08, 0x7e, 0x08, 0x7f, 0x08, 0x80, 0x08, 0x81, 0x08, 0x82, 0x08, 0x83, 0x08, 0x84, 0x08, 0x85, 0x08, 0x86, 0x08, 0x87, 0x08, 0x88, 0x08, 0x89, 0x08, 0x8a, 0x08, 0x8b, 0x08, 0x8c, 0x08, 0x8d, 0x08, 0x8e, 0x08, 0x8f, 0x08, 0x90, 0x08, 0x91, 0x08, 0x92, 0x08, 0x93, 0x08, 0x94, 0x08, 0x95, 0x08, 0x96, 0x08, 0x97, 0x08, 0x98, 0x08, 0x99, 0x08, 0x9a, 0x08, 0x9b, 0x08, 0x9c, 0x08, 0x9d, 0x08, 0x9e, 0x08, 0x9f, 0x08, 0xa0, 0x08, 0xa1, 0x08, 0xa2, 0x08, 0xa3, 0x08, 0xa4, 0x08, 0xa5, 0x08, 0xa6, 0x08, 0xa7, 0x08, 0xa8, 0x08, 0xa9, 0x08, 0xaa, 0x08, 0xab, 0x08, 0xac, 0x08, 0xad, 0x08, 0xae, 0x08, 0xaf, 0x08, 0xb0, 0x08, 0xb1, 0x08, 0xb2, 0x08, 0xb3, 0x08, 0xb4, 0x08, 0xb5, 0x08, 0xb6, 0x08, 0xb7, 0x08, 0xb8, 0x08, 0xb9, 0x08, 0xba, 0x08, 0xbb, 0x08, 0xbc, 0x08, 0xbd, 0x08, 0xbe, 0x08, 0xbf, 0x08, 0xc0, 0x08, 0xc1, 0x08, 0xc2, 0x08, 0xc3, 0x08, 0xc4, 0x08, 0xc5, 0x08, 0xc6, 0x08, 0xc7, 0x08, 0xc8, 0x08, 0xc9, 0x08, 0xca, 0x08, 0xcb, 0x08, 0xcc, 0x08, 0xcd, 0x08, 0xce, 0x08, 0xcf, 0x08, 0xd0, 0x08, 0xd1, 0x08, 0xd2, 0x08, 0xd3, 0x08, 0xd4, 0x08, 0xd5, 0x08, 0xd6, 0x08, 0xd7, 0x08, 0xd8, 0x08, 0xd9, 0x08, 0xda, 0x08, 0xdb, 0x08, 0xdc, 0x08, 0xdd, 0x08, 0xde, 0x08, 0xdf, 0x08, 0xe0, 0x08, 0xe1, 0x08, 0xe2, 0x08, 0xe3, 0x08, 0xe4, 0x08, 0xe5, 0x08, 0xe6, 0x08, 0xe7, 0x08, 0xe8, 0x08, 0xe9, 0x08, 0xea, 0x08, 0xeb, 0x08, 0xec, 0x08, 0xed, 0x00, 0x98, 0x08, 0xee, 0x08, 0xef, 0x08, 0xf0, 0x00, 0xa8, 0x08, 0xf1, 0x08, 0xf2, 0x08, 0xf3, 0x08, 0xf4, 0x08, 0xf5, 0x08, 0xf6, 0x08, 0xf7, 0x08, 0xf8, 0x00, 0x9a, 0x08, 0xf9, 0x00, 0x99, 0x00, 0xef, 0x08, 0xfa, 0x08, 0xfb, 0x08, 0xfc, 0x08, 0xfd, 0x08, 0xfe, 0x08, 0xff, 0x09, 0x00, 0x00, 0xa5, 0x09, 0x01, 0x09, 0x02, 0x09, 0x03, 0x00, 0x92, 0x09, 0x04, 0x09, 0x05, 0x09, 0x06, 0x09, 0x07, 0x09, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x09, 0x0b, 0x09, 0x0c, 0x09, 0x0d, 0x09, 0x0e, 0x09, 0x0f, 0x00, 0x9c, 0x09, 0x10, 0x09, 0x11, 0x09, 0x12, 0x09, 0x13, 0x09, 0x14, 0x09, 0x15, 0x09, 0x16, 0x09, 0x17, 0x09, 0x18, 0x09, 0x19, 0x09, 0x1a, 0x09, 0x1b, 0x09, 0x1c, 0x09, 0x1d, 0x09, 0x1e, 0x09, 0x1f, 0x09, 0x20, 0x09, 0x21, 0x09, 0x22, 0x09, 0x23, 0x09, 0x24, 0x09, 0x25, 0x09, 0x26, 0x09, 0x27, 0x09, 0x28, 0x09, 0x29, 0x09, 0x2a, 0x09, 0x2b, 0x00, 0xa7, 0x09, 0x2c, 0x09, 0x2d, 0x09, 0x2e, 0x09, 0x2f, 0x09, 0x30, 0x09, 0x31, 0x09, 0x32, 0x09, 0x33, 0x09, 0x34, 0x09, 0x35, 0x09, 0x36, 0x09, 0x37, 0x09, 0x38, 0x09, 0x39, 0x09, 0x3a, 0x09, 0x3b, 0x09, 0x3c, 0x09, 0x3d, 0x09, 0x3e, 0x09, 0x3f, 0x09, 0x40, 0x09, 0x41, 0x09, 0x42, 0x00, 0x8f, 0x09, 0x43, 0x09, 0x44, 0x09, 0x45, 0x00, 0x94, 0x00, 0x95, 0x09, 0x46, 0x09, 0x47, 0x09, 0x48, 0x09, 0x49, 0x09, 0x4a, 0x09, 0x4b, 0x09, 0x4c, 0x09, 0x4d, 0x09, 0x4e, 0x09, 0x4f, 0x09, 0x50, 0x09, 0x51, 0x09, 0x52, 0x09, 0x53, 0x09, 0x54, 0x09, 0x55, 0x09, 0x56, 0x09, 0x57, 0x09, 0x58, 0x09, 0x59, 0x09, 0x5a, 0x09, 0x5b, 0x09, 0x5c, 0x09, 0x5d, 0x09, 0x5e, 0x09, 0x5f, 0x09, 0x60, 0x09, 0x61, 0x09, 0x62, 0x09, 0x63, 0x09, 0x64, 0x09, 0x65, 0x09, 0x66, 0x09, 0x67, 0x09, 0x68, 0x09, 0x69, 0x09, 0x6a, 0x09, 0x6b, 0x09, 0x6c, 0x09, 0x6d, 0x09, 0x6e, 0x09, 0x6f, 0x09, 0x70, 0x09, 0x71, 0x09, 0x72, 0x09, 0x73, 0x09, 0x74, 0x09, 0x75, 0x09, 0x76, 0x09, 0x77, 0x09, 0x78, 0x09, 0x79, 0x09, 0x7a, 0x09, 0x7b, 0x09, 0x7c, 0x09, 0x7d, 0x09, 0x7e, 0x09, 0x7f, 0x09, 0x80, 0x09, 0x81, 0x09, 0x82, 0x09, 0x83, 0x09, 0x84, 0x09, 0x85, 0x09, 0x86, 0x09, 0x87, 0x09, 0x88, 0x09, 0x89, 0x09, 0x8a, 0x09, 0x8b, 0x09, 0x8c, 0x09, 0x8d, 0x09, 0x8e, 0x09, 0x8f, 0x09, 0x90, 0x09, 0x91, 0x09, 0x92, 0x09, 0x93, 0x09, 0x94, 0x09, 0x95, 0x09, 0x96, 0x09, 0x97, 0x09, 0x98, 0x09, 0x99, 0x09, 0x9a, 0x09, 0x9b, 0x09, 0x9c, 0x09, 0x9d, 0x09, 0x9e, 0x09, 0x9f, 0x09, 0xa0, 0x09, 0xa1, 0x09, 0xa2, 0x09, 0xa3, 0x09, 0xa4, 0x09, 0xa5, 0x09, 0xa6, 0x09, 0xa7, 0x09, 0xa8, 0x09, 0xa9, 0x09, 0xaa, 0x09, 0xab, 0x09, 0xac, 0x09, 0xad, 0x09, 0xae, 0x09, 0xaf, 0x09, 0xb0, 0x09, 0xb1, 0x09, 0xb2, 0x09, 0xb3, 0x09, 0xb4, 0x09, 0xb5, 0x09, 0xb6, 0x09, 0xb7, 0x09, 0xb8, 0x09, 0xb9, 0x09, 0xba, 0x09, 0xbb, 0x09, 0xbc, 0x09, 0xbd, 0x09, 0xbe, 0x09, 0xbf, 0x09, 0xc0, 0x09, 0xc1, 0x09, 0xc2, 0x09, 0xc3, 0x09, 0xc4, 0x09, 0xc5, 0x09, 0xc6, 0x09, 0xc7, 0x09, 0xc8, 0x09, 0xc9, 0x09, 0xca, 0x09, 0xcb, 0x09, 0xcc, 0x09, 0xcd, 0x09, 0xce, 0x09, 0xcf, 0x09, 0xd0, 0x09, 0xd1, 0x09, 0xd2, 0x09, 0xd3, 0x09, 0xd4, 0x09, 0xd5, 0x09, 0xd6, 0x09, 0xd7, 0x09, 0xd8, 0x09, 0xd9, 0x09, 0xda, 0x09, 0xdb, 0x09, 0xdc, 0x09, 0xdd, 0x09, 0xde, 0x09, 0xdf, 0x09, 0xe0, 0x09, 0xe1, 0x09, 0xe2, 0x09, 0xe3, 0x09, 0xe4, 0x09, 0xe5, 0x09, 0xe6, 0x09, 0xe7, 0x09, 0xe8, 0x09, 0xe9, 0x09, 0xea, 0x09, 0xeb, 0x09, 0xec, 0x09, 0xed, 0x09, 0xee, 0x09, 0xef, 0x09, 0xf0, 0x09, 0xf1, 0x09, 0xf2, 0x09, 0xf3, 0x09, 0xf4, 0x09, 0xf5, 0x09, 0xf6, 0x09, 0xf7, 0x09, 0xf8, 0x09, 0xf9, 0x09, 0xfa, 0x09, 0xfb, 0x09, 0xfc, 0x09, 0xfd, 0x09, 0xfe, 0x09, 0xff, 0x0a, 0x00, 0x0a, 0x01, 0x0a, 0x02, 0x0a, 0x03, 0x0a, 0x04, 0x0a, 0x05, 0x0a, 0x06, 0x0a, 0x07, 0x0a, 0x08, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0a, 0x0c, 0x0a, 0x0d, 0x0a, 0x0e, 0x0a, 0x0f, 0x0a, 0x10, 0x0a, 0x11, 0x0a, 0x12, 0x0a, 0x13, 0x0a, 0x14, 0x0a, 0x15, 0x0a, 0x16, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x0a, 0x1a, 0x0a, 0x1b, 0x0a, 0x1c, 0x0a, 0x1d, 0x0a, 0x1e, 0x0a, 0x1f, 0x0a, 0x20, 0x0a, 0x21, 0x0a, 0x22, 0x0a, 0x23, 0x0a, 0x24, 0x0a, 0x25, 0x0a, 0x26, 0x0a, 0x27, 0x0a, 0x28, 0x0a, 0x29, 0x0a, 0x2a, 0x0a, 0x2b, 0x0a, 0x2c, 0x0a, 0x2d, 0x0a, 0x2e, 0x0a, 0x2f, 0x0a, 0x30, 0x0a, 0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a, 0x34, 0x0a, 0x35, 0x0a, 0x36, 0x0a, 0x37, 0x0a, 0x38, 0x0a, 0x39, 0x0a, 0x3a, 0x0a, 0x3b, 0x0a, 0x3c, 0x0a, 0x3d, 0x0a, 0x3e, 0x0a, 0x3f, 0x0a, 0x40, 0x0a, 0x41, 0x0a, 0x42, 0x0a, 0x43, 0x0a, 0x44, 0x0a, 0x45, 0x0a, 0x46, 0x0a, 0x47, 0x0a, 0x48, 0x0a, 0x49, 0x0a, 0x4a, 0x0a, 0x4b, 0x0a, 0x4c, 0x0a, 0x4d, 0x0a, 0x4e, 0x0a, 0x4f, 0x0a, 0x50, 0x0a, 0x51, 0x0a, 0x52, 0x0a, 0x53, 0x0a, 0x54, 0x0a, 0x55, 0x0a, 0x56, 0x0a, 0x57, 0x0a, 0x58, 0x0a, 0x59, 0x0a, 0x5a, 0x0a, 0x5b, 0x0a, 0x5c, 0x0a, 0x5d, 0x0a, 0x5e, 0x0a, 0x5f, 0x0a, 0x60, 0x0a, 0x61, 0x0a, 0x62, 0x0a, 0x63, 0x0a, 0x64, 0x0a, 0x65, 0x0a, 0x66, 0x0a, 0x67, 0x0a, 0x68, 0x0a, 0x69, 0x0a, 0x6a, 0x0a, 0x6b, 0x0a, 0x6c, 0x0a, 0x6d, 0x0a, 0x6e, 0x0a, 0x6f, 0x0a, 0x70, 0x0a, 0x71, 0x0a, 0x72, 0x0a, 0x73, 0x0a, 0x74, 0x0a, 0x75, 0x0a, 0x76, 0x0a, 0x77, 0x0a, 0x78, 0x0a, 0x79, 0x0a, 0x7a, 0x0a, 0x7b, 0x0a, 0x7c, 0x0a, 0x7d, 0x0a, 0x7e, 0x0a, 0x7f, 0x0a, 0x80, 0x0a, 0x81, 0x0a, 0x82, 0x0a, 0x83, 0x0a, 0x84, 0x0a, 0x85, 0x0a, 0x86, 0x0a, 0x87, 0x0a, 0x88, 0x0a, 0x89, 0x0a, 0x8a, 0x0a, 0x8b, 0x0a, 0x8c, 0x0a, 0x8d, 0x0a, 0x8e, 0x0a, 0x8f, 0x0a, 0x90, 0x0a, 0x91, 0x0a, 0x92, 0x0a, 0x93, 0x0a, 0x94, 0x0a, 0x95, 0x0a, 0x96, 0x0a, 0x97, 0x0a, 0x98, 0x0a, 0x99, 0x0a, 0x9a, 0x0a, 0x9b, 0x0a, 0x9c, 0x0a, 0x9d, 0x0a, 0x9e, 0x0a, 0x9f, 0x0a, 0xa0, 0x0a, 0xa1, 0x0a, 0xa2, 0x0a, 0xa3, 0x0a, 0xa4, 0x0a, 0xa5, 0x0a, 0xa6, 0x0a, 0xa7, 0x0a, 0xa8, 0x0a, 0xa9, 0x0a, 0xaa, 0x0a, 0xab, 0x0a, 0xac, 0x0a, 0xad, 0x0a, 0xae, 0x0a, 0xaf, 0x0a, 0xb0, 0x0a, 0xb1, 0x0a, 0xb2, 0x0a, 0xb3, 0x0a, 0xb4, 0x0a, 0xb5, 0x0a, 0xb6, 0x0a, 0xb7, 0x0a, 0xb8, 0x0a, 0xb9, 0x0a, 0xba, 0x0a, 0xbb, 0x0a, 0xbc, 0x0a, 0xbd, 0x0a, 0xbe, 0x0a, 0xbf, 0x0a, 0xc0, 0x0a, 0xc1, 0x0a, 0xc2, 0x0a, 0xc3, 0x0a, 0xc4, 0x0a, 0xc5, 0x0a, 0xc6, 0x0a, 0xc7, 0x0a, 0xc8, 0x0a, 0xc9, 0x0a, 0xca, 0x0a, 0xcb, 0x0a, 0xcc, 0x0a, 0xcd, 0x0a, 0xce, 0x0a, 0xcf, 0x0a, 0xd0, 0x0a, 0xd1, 0x0a, 0xd2, 0x0a, 0xd3, 0x0a, 0xd4, 0x0a, 0xd5, 0x0a, 0xd6, 0x0a, 0xd7, 0x0a, 0xd8, 0x0a, 0xd9, 0x0a, 0xda, 0x0a, 0xdb, 0x0a, 0xdc, 0x0a, 0xdd, 0x0a, 0xde, 0x0a, 0xdf, 0x0a, 0xe0, 0x0a, 0xe1, 0x0a, 0xe2, 0x0a, 0xe3, 0x0a, 0xe4, 0x0a, 0xe5, 0x0a, 0xe6, 0x0a, 0xe7, 0x0a, 0xe8, 0x0a, 0xe9, 0x0a, 0xea, 0x0a, 0xeb, 0x0a, 0xec, 0x0a, 0xed, 0x0a, 0xee, 0x0a, 0xef, 0x0a, 0xf0, 0x0a, 0xf1, 0x0a, 0xf2, 0x0a, 0xf3, 0x0a, 0xf4, 0x0a, 0xf5, 0x0a, 0xf6, 0x00, 0xb9, 0x0a, 0xf7, 0x0a, 0xf8, 0x0a, 0xf9, 0x0a, 0xfa, 0x0a, 0xfb, 0x0a, 0xfc, 0x0a, 0xfd, 0x0a, 0xfe, 0x0a, 0xff, 0x0b, 0x00, 0x0b, 0x01, 0x0b, 0x02, 0x0b, 0x03, 0x0b, 0x04, 0x0b, 0x05, 0x0b, 0x06, 0x0b, 0x07, 0x0b, 0x08, 0x0b, 0x09, 0x0b, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0b, 0x0d, 0x0b, 0x0e, 0x0b, 0x0f, 0x0b, 0x10, 0x0b, 0x11, 0x0b, 0x12, 0x0b, 0x13, 0x0b, 0x14, 0x0b, 0x15, 0x0b, 0x16, 0x0b, 0x17, 0x0b, 0x18, 0x0b, 0x19, 0x0b, 0x1a, 0x0b, 0x1b, 0x0b, 0x1c, 0x0b, 0x1d, 0x0b, 0x1e, 0x0b, 0x1f, 0x0b, 0x20, 0x0b, 0x21, 0x0b, 0x22, 0x0b, 0x23, 0x0b, 0x24, 0x0b, 0x25, 0x0b, 0x26, 0x0b, 0x27, 0x0b, 0x28, 0x0b, 0x29, 0x0b, 0x2a, 0x0b, 0x2b, 0x0b, 0x2c, 0x0b, 0x2d, 0x0b, 0x2e, 0x0b, 0x2f, 0x0b, 0x30, 0x0b, 0x31, 0x0b, 0x32, 0x0b, 0x33, 0x0b, 0x34, 0x0b, 0x35, 0x0b, 0x36, 0x0b, 0x37, 0x0b, 0x38, 0x0b, 0x39, 0x0b, 0x3a, 0x0b, 0x3b, 0x0b, 0x3c, 0x0b, 0x3d, 0x0b, 0x3e, 0x0b, 0x3f, 0x0b, 0x40, 0x0b, 0x41, 0x0b, 0x42, 0x0b, 0x43, 0x0b, 0x44, 0x0b, 0x45, 0x0b, 0x46, 0x0b, 0x47, 0x0b, 0x48, 0x0b, 0x49, 0x0b, 0x4a, 0x0b, 0x4b, 0x0b, 0x4c, 0x0b, 0x4d, 0x0b, 0x4e, 0x0b, 0x4f, 0x0b, 0x50, 0x0b, 0x51, 0x0b, 0x52, 0x0b, 0x53, 0x0b, 0x54, 0x0b, 0x55, 0x0b, 0x56, 0x0b, 0x57, 0x0b, 0x58, 0x0b, 0x59, 0x0b, 0x5a, 0x0b, 0x5b, 0x0b, 0x5c, 0x0b, 0x5d, 0x0b, 0x5e, 0x0b, 0x5f, 0x0b, 0x60, 0x0b, 0x61, 0x0b, 0x62, 0x0b, 0x63, 0x0b, 0x64, 0x0b, 0x65, 0x0b, 0x66, 0x0b, 0x67, 0x0b, 0x68, 0x0b, 0x69, 0x0b, 0x6a, 0x0b, 0x6b, 0x0b, 0x6c, 0x0b, 0x6d, 0x0b, 0x6e, 0x0b, 0x6f, 0x0b, 0x70, 0x0b, 0x71, 0x0b, 0x72, 0x0b, 0x73, 0x0b, 0x74, 0x0b, 0x75, 0x0b, 0x76, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x79, 0x0b, 0x7a, 0x0b, 0x7b, 0x0b, 0x7c, 0x0b, 0x7d, 0x0b, 0x7e, 0x0b, 0x7f, 0x0b, 0x80, 0x0b, 0x81, 0x0b, 0x82, 0x0b, 0x83, 0x0b, 0x84, 0x0b, 0x85, 0x0b, 0x86, 0x0b, 0x87, 0x0b, 0x88, 0x0b, 0x89, 0x0b, 0x8a, 0x0b, 0x8b, 0x0b, 0x8c, 0x0b, 0x8d, 0x0b, 0x8e, 0x0b, 0x8f, 0x0b, 0x90, 0x0b, 0x91, 0x0b, 0x92, 0x0b, 0x93, 0x0b, 0x94, 0x0b, 0x95, 0x0b, 0x96, 0x0b, 0x97, 0x0b, 0x98, 0x0b, 0x99, 0x0b, 0x9a, 0x0b, 0x9b, 0x0b, 0x9c, 0x0b, 0x9d, 0x0b, 0x9e, 0x0b, 0x9f, 0x0b, 0xa0, 0x0b, 0xa1, 0x0b, 0xa2, 0x0b, 0xa3, 0x0b, 0xa4, 0x0b, 0xa5, 0x0b, 0xa6, 0x0b, 0xa7, 0x0b, 0xa8, 0x0b, 0xa9, 0x0b, 0xaa, 0x0b, 0xab, 0x0b, 0xac, 0x0b, 0xad, 0x0b, 0xae, 0x0b, 0xaf, 0x0b, 0xb0, 0x0b, 0xb1, 0x0b, 0xb2, 0x0b, 0xb3, 0x0b, 0xb4, 0x0b, 0xb5, 0x0b, 0xb6, 0x0b, 0xb7, 0x0b, 0xb8, 0x0b, 0xb9, 0x0b, 0xba, 0x0b, 0xbb, 0x0b, 0xbc, 0x0b, 0xbd, 0x0b, 0xbe, 0x0b, 0xbf, 0x0b, 0xc0, 0x0b, 0xc1, 0x0b, 0xc2, 0x0b, 0xc3, 0x0b, 0xc4, 0x0b, 0xc5, 0x0b, 0xc6, 0x0b, 0xc7, 0x0b, 0xc8, 0x0b, 0xc9, 0x0b, 0xca, 0x0b, 0xcb, 0x0b, 0xcc, 0x0b, 0xcd, 0x0b, 0xce, 0x0b, 0xcf, 0x0b, 0xd0, 0x0b, 0xd1, 0x0b, 0xd2, 0x0b, 0xd3, 0x0b, 0xd4, 0x0b, 0xd5, 0x0b, 0xd6, 0x0b, 0xd7, 0x0b, 0xd8, 0x0b, 0xd9, 0x0b, 0xda, 0x0b, 0xdb, 0x0b, 0xdc, 0x0b, 0xdd, 0x0b, 0xde, 0x0b, 0xdf, 0x0b, 0xe0, 0x0b, 0xe1, 0x0b, 0xe2, 0x0b, 0xe3, 0x0b, 0xe4, 0x0b, 0xe5, 0x0b, 0xe6, 0x0b, 0xe7, 0x0b, 0xe8, 0x0b, 0xe9, 0x0b, 0xea, 0x0b, 0xeb, 0x0b, 0xec, 0x0b, 0xed, 0x0b, 0xee, 0x0b, 0xef, 0x0b, 0xf0, 0x0b, 0xf1, 0x0b, 0xf2, 0x0b, 0xf3, 0x0b, 0xf4, 0x0b, 0xf5, 0x0b, 0xf6, 0x0b, 0xf7, 0x0b, 0xf8, 0x0b, 0xf9, 0x0b, 0xfa, 0x0b, 0xfb, 0x0b, 0xfc, 0x0b, 0xfd, 0x0b, 0xfe, 0x0b, 0xff, 0x0c, 0x00, 0x0c, 0x01, 0x0c, 0x02, 0x0c, 0x03, 0x0c, 0x04, 0x0c, 0x05, 0x0c, 0x06, 0x0c, 0x07, 0x0c, 0x08, 0x0c, 0x09, 0x0c, 0x0a, 0x0c, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0c, 0x0e, 0x0c, 0x0f, 0x0c, 0x10, 0x0c, 0x11, 0x0c, 0x12, 0x0c, 0x13, 0x0c, 0x14, 0x0c, 0x15, 0x0c, 0x16, 0x0c, 0x17, 0x0c, 0x18, 0x0c, 0x19, 0x0c, 0x1a, 0x0c, 0x1b, 0x0c, 0x1c, 0x0c, 0x1d, 0x0c, 0x1e, 0x0c, 0x1f, 0x0c, 0x20, 0x0c, 0x21, 0x0c, 0x22, 0x0c, 0x23, 0x0c, 0x24, 0x0c, 0x25, 0x0c, 0x26, 0x0c, 0x27, 0x0c, 0x28, 0x0c, 0x29, 0x0c, 0x2a, 0x0c, 0x2b, 0x0c, 0x2c, 0x0c, 0x2d, 0x0c, 0x2e, 0x0c, 0x2f, 0x0c, 0x30, 0x0c, 0x31, 0x0c, 0x32, 0x0c, 0x33, 0x0c, 0x34, 0x0c, 0x35, 0x0c, 0x36, 0x0c, 0x37, 0x0c, 0x38, 0x0c, 0x39, 0x0c, 0x3a, 0x0c, 0x3b, 0x0c, 0x3c, 0x0c, 0x3d, 0x0c, 0x3e, 0x0c, 0x3f, 0x0c, 0x40, 0x0c, 0x41, 0x0c, 0x42, 0x0c, 0x43, 0x0c, 0x44, 0x0c, 0x45, 0x0c, 0x46, 0x0c, 0x47, 0x0c, 0x48, 0x0c, 0x49, 0x0c, 0x4a, 0x0c, 0x4b, 0x0c, 0x4c, 0x0c, 0x4d, 0x0c, 0x4e, 0x0c, 0x4f, 0x0c, 0x50, 0x0c, 0x51, 0x0c, 0x52, 0x0c, 0x53, 0x0c, 0x54, 0x0c, 0x55, 0x0c, 0x56, 0x0c, 0x57, 0x0c, 0x58, 0x0c, 0x59, 0x0c, 0x5a, 0x0c, 0x5b, 0x0c, 0x5c, 0x0c, 0x5d, 0x0c, 0x5e, 0x0c, 0x5f, 0x0c, 0x60, 0x0c, 0x61, 0x0c, 0x62, 0x0c, 0x63, 0x0c, 0x64, 0x0c, 0x65, 0x0c, 0x66, 0x0c, 0x67, 0x0c, 0x68, 0x0c, 0x69, 0x0c, 0x6a, 0x0c, 0x6b, 0x0c, 0x6c, 0x0c, 0x6d, 0x0c, 0x6e, 0x0c, 0x6f, 0x0c, 0x70, 0x0c, 0x71, 0x0c, 0x72, 0x0c, 0x73, 0x0c, 0x74, 0x0c, 0x75, 0x0c, 0x76, 0x0c, 0x77, 0x0c, 0x78, 0x0c, 0x79, 0x0c, 0x7a, 0x0c, 0x7b, 0x0c, 0x7c, 0x0c, 0x7d, 0x0c, 0x7e, 0x0c, 0x7f, 0x0c, 0x80, 0x0c, 0x81, 0x0c, 0x82, 0x0c, 0x83, 0x0c, 0x84, 0x0c, 0x85, 0x0c, 0x86, 0x0c, 0x87, 0x0c, 0x88, 0x0c, 0x89, 0x0c, 0x8a, 0x0c, 0x8b, 0x0c, 0x8c, 0x0c, 0x8d, 0x0c, 0x8e, 0x0c, 0x8f, 0x0c, 0x90, 0x0c, 0x91, 0x0c, 0x92, 0x0c, 0x93, 0x0c, 0x94, 0x0c, 0x95, 0x0c, 0x96, 0x0c, 0x97, 0x0c, 0x98, 0x0c, 0x99, 0x0c, 0x9a, 0x0c, 0x9b, 0x0c, 0x9c, 0x0c, 0x9d, 0x0c, 0x9e, 0x0c, 0x9f, 0x0c, 0xa0, 0x0c, 0xa1, 0x0c, 0xa2, 0x0c, 0xa3, 0x0c, 0xa4, 0x0c, 0xa5, 0x0c, 0xa6, 0x0c, 0xa7, 0x0c, 0xa8, 0x0c, 0xa9, 0x0c, 0xaa, 0x0c, 0xab, 0x0c, 0xac, 0x0c, 0xad, 0x0c, 0xae, 0x0c, 0xaf, 0x0c, 0xb0, 0x0c, 0xb1, 0x0c, 0xb2, 0x0c, 0xb3, 0x0c, 0xb4, 0x0c, 0xb5, 0x0c, 0xb6, 0x0c, 0xb7, 0x0c, 0xb8, 0x0c, 0xb9, 0x0c, 0xba, 0x0c, 0xbb, 0x0c, 0xbc, 0x0c, 0xbd, 0x0c, 0xbe, 0x0c, 0xbf, 0x0c, 0xc0, 0x0c, 0xc1, 0x0c, 0xc2, 0x0c, 0xc3, 0x0c, 0xc4, 0x0c, 0xc5, 0x0c, 0xc6, 0x0c, 0xc7, 0x0c, 0xc8, 0x0c, 0xc9, 0x0c, 0xca, 0x0c, 0xcb, 0x0c, 0xcc, 0x0c, 0xcd, 0x0c, 0xce, 0x0c, 0xcf, 0x0c, 0xd0, 0x0c, 0xd1, 0x0c, 0xd2, 0x0c, 0xd3, 0x0c, 0xd4, 0x0c, 0xd5, 0x0c, 0xd6, 0x0c, 0xd7, 0x0c, 0xd8, 0x0c, 0xd9, 0x0c, 0xda, 0x0c, 0xdb, 0x0c, 0xdc, 0x0c, 0xdd, 0x0c, 0xde, 0x0c, 0xdf, 0x0c, 0xe0, 0x0c, 0xe1, 0x0c, 0xe2, 0x0c, 0xe3, 0x0c, 0xe4, 0x0c, 0xe5, 0x0c, 0xe6, 0x0c, 0xe7, 0x0c, 0xe8, 0x0c, 0xe9, 0x0c, 0xea, 0x0c, 0xeb, 0x0c, 0xec, 0x0c, 0xed, 0x0c, 0xee, 0x0c, 0xef, 0x0c, 0xf0, 0x0c, 0xf1, 0x0c, 0xf2, 0x0c, 0xf3, 0x0c, 0xf4, 0x0c, 0xf5, 0x0c, 0xf6, 0x0c, 0xf7, 0x0c, 0xf8, 0x0c, 0xf9, 0x0c, 0xfa, 0x0c, 0xfb, 0x0c, 0xfc, 0x0c, 0xfd, 0x0c, 0xfe, 0x0c, 0xff, 0x0d, 0x00, 0x0d, 0x01, 0x0d, 0x02, 0x0d, 0x03, 0x0d, 0x04, 0x0d, 0x05, 0x0d, 0x06, 0x0d, 0x07, 0x0d, 0x08, 0x0d, 0x09, 0x0d, 0x0a, 0x0d, 0x0b, 0x0d, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0d, 0x0f, 0x0d, 0x10, 0x0d, 0x11, 0x0d, 0x12, 0x0d, 0x13, 0x0d, 0x14, 0x0d, 0x15, 0x0d, 0x16, 0x0d, 0x17, 0x0d, 0x18, 0x0d, 0x19, 0x0d, 0x1a, 0x0d, 0x1b, 0x0d, 0x1c, 0x0d, 0x1d, 0x0d, 0x1e, 0x0d, 0x1f, 0x0d, 0x20, 0x0d, 0x21, 0x0d, 0x22, 0x0d, 0x23, 0x0d, 0x24, 0x0d, 0x25, 0x0d, 0x26, 0x0d, 0x27, 0x0d, 0x28, 0x0d, 0x29, 0x0d, 0x2a, 0x0d, 0x2b, 0x0d, 0x2c, 0x0d, 0x2d, 0x0d, 0x2e, 0x0d, 0x2f, 0x0d, 0x30, 0x0d, 0x31, 0x0d, 0x32, 0x0d, 0x33, 0x0d, 0x34, 0x0d, 0x35, 0x0d, 0x36, 0x0d, 0x37, 0x0d, 0x38, 0x0d, 0x39, 0x0d, 0x3a, 0x0d, 0x3b, 0x0d, 0x3c, 0x0d, 0x3d, 0x0d, 0x3e, 0x0d, 0x3f, 0x0d, 0x40, 0x0d, 0x41, 0x0d, 0x42, 0x0d, 0x43, 0x0d, 0x44, 0x0d, 0x45, 0x0d, 0x46, 0x0d, 0x47, 0x0d, 0x48, 0x0d, 0x49, 0x0d, 0x4a, 0x0d, 0x4b, 0x0d, 0x4c, 0x0d, 0x4d, 0x0d, 0x4e, 0x0d, 0x4f, 0x0d, 0x50, 0x0d, 0x51, 0x0d, 0x52, 0x0d, 0x53, 0x0d, 0x54, 0x0d, 0x55, 0x0d, 0x56, 0x0d, 0x57, 0x0d, 0x58, 0x0d, 0x59, 0x0d, 0x5a, 0x0d, 0x5b, 0x0d, 0x5c, 0x0d, 0x5d, 0x0d, 0x5e, 0x0d, 0x5f, 0x0d, 0x60, 0x0d, 0x61, 0x0d, 0x62, 0x0d, 0x63, 0x0d, 0x64, 0x0d, 0x65, 0x0d, 0x66, 0x0d, 0x67, 0x0d, 0x68, 0x0d, 0x69, 0x0d, 0x6a, 0x0d, 0x6b, 0x0d, 0x6c, 0x0d, 0x6d, 0x0d, 0x6e, 0x0d, 0x6f, 0x0d, 0x70, 0x0d, 0x71, 0x0d, 0x72, 0x0d, 0x73, 0x0d, 0x74, 0x0d, 0x75, 0x0d, 0x76, 0x0d, 0x77, 0x0d, 0x78, 0x0d, 0x79, 0x0d, 0x7a, 0x0d, 0x7b, 0x0d, 0x7c, 0x0d, 0x7d, 0x0d, 0x7e, 0x0d, 0x7f, 0x0d, 0x80, 0x0d, 0x81, 0x0d, 0x82, 0x0d, 0x83, 0x0d, 0x84, 0x0d, 0x85, 0x0d, 0x86, 0x0d, 0x87, 0x0d, 0x88, 0x0d, 0x89, 0x0d, 0x8a, 0x0d, 0x8b, 0x0d, 0x8c, 0x0d, 0x8d, 0x0d, 0x8e, 0x0d, 0x8f, 0x0d, 0x90, 0x0d, 0x91, 0x0d, 0x92, 0x0d, 0x93, 0x0d, 0x94, 0x0d, 0x95, 0x0d, 0x96, 0x0d, 0x97, 0x0d, 0x98, 0x0d, 0x99, 0x0d, 0x9a, 0x0d, 0x9b, 0x0d, 0x9c, 0x0d, 0x9d, 0x0d, 0x9e, 0x0d, 0x9f, 0x0d, 0xa0, 0x0d, 0xa1, 0x0d, 0xa2, 0x0d, 0xa3, 0x0d, 0xa4, 0x0d, 0xa5, 0x0d, 0xa6, 0x0d, 0xa7, 0x0d, 0xa8, 0x0d, 0xa9, 0x0d, 0xaa, 0x0d, 0xab, 0x0d, 0xac, 0x0d, 0xad, 0x0d, 0xae, 0x0d, 0xaf, 0x0d, 0xb0, 0x0d, 0xb1, 0x0d, 0xb2, 0x0d, 0xb3, 0x0d, 0xb4, 0x0d, 0xb5, 0x0d, 0xb6, 0x0d, 0xb7, 0x0d, 0xb8, 0x0d, 0xb9, 0x0d, 0xba, 0x0d, 0xbb, 0x0d, 0xbc, 0x0d, 0xbd, 0x0d, 0xbe, 0x0d, 0xbf, 0x0d, 0xc0, 0x0d, 0xc1, 0x0d, 0xc2, 0x0d, 0xc3, 0x0d, 0xc4, 0x0d, 0xc5, 0x0d, 0xc6, 0x0d, 0xc7, 0x0d, 0xc8, 0x0d, 0xc9, 0x0d, 0xca, 0x0d, 0xcb, 0x0d, 0xcc, 0x0d, 0xcd, 0x0d, 0xce, 0x0d, 0xcf, 0x0d, 0xd0, 0x0d, 0xd1, 0x0d, 0xd2, 0x0d, 0xd3, 0x0d, 0xd4, 0x0d, 0xd5, 0x0d, 0xd6, 0x0d, 0xd7, 0x0d, 0xd8, 0x0d, 0xd9, 0x0d, 0xda, 0x0d, 0xdb, 0x0d, 0xdc, 0x0d, 0xdd, 0x0d, 0xde, 0x0d, 0xdf, 0x0d, 0xe0, 0x0d, 0xe1, 0x0d, 0xe2, 0x0d, 0xe3, 0x0d, 0xe4, 0x0d, 0xe5, 0x0d, 0xe6, 0x0d, 0xe7, 0x0d, 0xe8, 0x0d, 0xe9, 0x0d, 0xea, 0x0d, 0xeb, 0x0d, 0xec, 0x0d, 0xed, 0x0d, 0xee, 0x0d, 0xef, 0x0d, 0xf0, 0x0d, 0xf1, 0x0d, 0xf2, 0x0d, 0xf3, 0x0d, 0xf4, 0x0d, 0xf5, 0x0d, 0xf6, 0x0d, 0xf7, 0x0d, 0xf8, 0x0d, 0xf9, 0x0d, 0xfa, 0x0d, 0xfb, 0x0d, 0xfc, 0x0d, 0xfd, 0x0d, 0xfe, 0x0d, 0xff, 0x0e, 0x00, 0x0e, 0x01, 0x0e, 0x02, 0x0e, 0x03, 0x0e, 0x04, 0x0e, 0x05, 0x0e, 0x06, 0x0e, 0x07, 0x0e, 0x08, 0x0e, 0x09, 0x0e, 0x0a, 0x0e, 0x0b, 0x0e, 0x0c, 0x0e, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0e, 0x10, 0x0e, 0x11, 0x0e, 0x12, 0x0e, 0x13, 0x0e, 0x14, 0x0e, 0x15, 0x0e, 0x16, 0x0e, 0x17, 0x0e, 0x18, 0x0e, 0x19, 0x0e, 0x1a, 0x0e, 0x1b, 0x0e, 0x1c, 0x0e, 0x1d, 0x0e, 0x1e, 0x0e, 0x1f, 0x0e, 0x20, 0x0e, 0x21, 0x0e, 0x22, 0x0e, 0x23, 0x0e, 0x24, 0x0e, 0x25, 0x0e, 0x26, 0x0e, 0x27, 0x0e, 0x28, 0x0e, 0x29, 0x0e, 0x2a, 0x0e, 0x2b, 0x0e, 0x2c, 0x0e, 0x2d, 0x0e, 0x2e, 0x0e, 0x2f, 0x0e, 0x30, 0x0e, 0x31, 0x0e, 0x32, 0x0e, 0x33, 0x0e, 0x34, 0x0e, 0x35, 0x0e, 0x36, 0x0e, 0x37, 0x0e, 0x38, 0x0e, 0x39, 0x0e, 0x3a, 0x0e, 0x3b, 0x0e, 0x3c, 0x0e, 0x3d, 0x0e, 0x3e, 0x0e, 0x3f, 0x0e, 0x40, 0x0e, 0x41, 0x0e, 0x42, 0x0e, 0x43, 0x0e, 0x44, 0x0e, 0x45, 0x0e, 0x46, 0x0e, 0x47, 0x0e, 0x48, 0x0e, 0x49, 0x0e, 0x4a, 0x0e, 0x4b, 0x0e, 0x4c, 0x0e, 0x4d, 0x0e, 0x4e, 0x0e, 0x4f, 0x0e, 0x50, 0x0e, 0x51, 0x0e, 0x52, 0x0e, 0x53, 0x0e, 0x54, 0x0e, 0x55, 0x0e, 0x56, 0x0e, 0x57, 0x0e, 0x58, 0x0e, 0x59, 0x0e, 0x5a, 0x0e, 0x5b, 0x0e, 0x5c, 0x0e, 0x5d, 0x0e, 0x5e, 0x0e, 0x5f, 0x0e, 0x60, 0x0e, 0x61, 0x0e, 0x62, 0x0e, 0x63, 0x0e, 0x64, 0x0e, 0x65, 0x0e, 0x66, 0x0e, 0x67, 0x0e, 0x68, 0x0e, 0x69, 0x0e, 0x6a, 0x0e, 0x6b, 0x0e, 0x6c, 0x0e, 0x6d, 0x0e, 0x6e, 0x0e, 0x6f, 0x0e, 0x70, 0x0e, 0x71, 0x0e, 0x72, 0x0e, 0x73, 0x0e, 0x74, 0x0e, 0x75, 0x0e, 0x76, 0x0e, 0x77, 0x0e, 0x78, 0x0e, 0x79, 0x0e, 0x7a, 0x0e, 0x7b, 0x0e, 0x7c, 0x0e, 0x7d, 0x0e, 0x7e, 0x0e, 0x7f, 0x0e, 0x80, 0x0e, 0x81, 0x0e, 0x82, 0x0e, 0x83, 0x0e, 0x84, 0x0e, 0x85, 0x0e, 0x86, 0x0e, 0x87, 0x0e, 0x88, 0x0e, 0x89, 0x0e, 0x8a, 0x0e, 0x8b, 0x0e, 0x8c, 0x0e, 0x8d, 0x0e, 0x8e, 0x0e, 0x8f, 0x0e, 0x90, 0x0e, 0x91, 0x0e, 0x92, 0x0e, 0x93, 0x0e, 0x94, 0x0e, 0x95, 0x0e, 0x96, 0x0e, 0x97, 0x0e, 0x98, 0x0e, 0x99, 0x0e, 0x9a, 0x0e, 0x9b, 0x0e, 0x9c, 0x0e, 0x9d, 0x0e, 0x9e, 0x0e, 0x9f, 0x0e, 0xa0, 0x0e, 0xa1, 0x0e, 0xa2, 0x0e, 0xa3, 0x0e, 0xa4, 0x0e, 0xa5, 0x0e, 0xa6, 0x0e, 0xa7, 0x0e, 0xa8, 0x0e, 0xa9, 0x0e, 0xaa, 0x0e, 0xab, 0x0e, 0xac, 0x0e, 0xad, 0x0e, 0xae, 0x0e, 0xaf, 0x0e, 0xb0, 0x0e, 0xb1, 0x0e, 0xb2, 0x0e, 0xb3, 0x0e, 0xb4, 0x0e, 0xb5, 0x0e, 0xb6, 0x0e, 0xb7, 0x0e, 0xb8, 0x0e, 0xb9, 0x0e, 0xba, 0x0e, 0xbb, 0x0e, 0xbc, 0x0e, 0xbd, 0x0e, 0xbe, 0x0e, 0xbf, 0x0e, 0xc0, 0x0e, 0xc1, 0x0e, 0xc2, 0x0e, 0xc3, 0x0e, 0xc4, 0x0e, 0xc5, 0x0e, 0xc6, 0x0e, 0xc7, 0x0e, 0xc8, 0x0e, 0xc9, 0x0e, 0xca, 0x0e, 0xcb, 0x0e, 0xcc, 0x0e, 0xcd, 0x0e, 0xce, 0x0e, 0xcf, 0x0e, 0xd0, 0x0e, 0xd1, 0x0e, 0xd2, 0x0e, 0xd3, 0x0e, 0xd4, 0x0e, 0xd5, 0x0e, 0xd6, 0x0e, 0xd7, 0x0e, 0xd8, 0x0e, 0xd9, 0x0e, 0xda, 0x0e, 0xdb, 0x0e, 0xdc, 0x0e, 0xdd, 0x0e, 0xde, 0x0e, 0xdf, 0x0e, 0xe0, 0x0e, 0xe1, 0x0e, 0xe2, 0x0e, 0xe3, 0x0e, 0xe4, 0x0e, 0xe5, 0x0e, 0xe6, 0x0e, 0xe7, 0x0e, 0xe8, 0x0e, 0xe9, 0x0e, 0xea, 0x0e, 0xeb, 0x0e, 0xec, 0x0e, 0xed, 0x0e, 0xee, 0x0e, 0xef, 0x0e, 0xf0, 0x0e, 0xf1, 0x0e, 0xf2, 0x0e, 0xf3, 0x0e, 0xf4, 0x0e, 0xf5, 0x0e, 0xf6, 0x0e, 0xf7, 0x0e, 0xf8, 0x0e, 0xf9, 0x0e, 0xfa, 0x0e, 0xfb, 0x0e, 0xfc, 0x0e, 0xfd, 0x0e, 0xfe, 0x0e, 0xff, 0x0f, 0x00, 0x0f, 0x01, 0x0f, 0x02, 0x0f, 0x03, 0x0f, 0x04, 0x0f, 0x05, 0x0f, 0x06, 0x0f, 0x07, 0x0f, 0x08, 0x0f, 0x09, 0x0f, 0x0a, 0x0f, 0x0b, 0x0f, 0x0c, 0x00, 0xc0, 0x00, 0xc1, 0x0f, 0x0d, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f, 0x10, 0x0f, 0x11, 0x0f, 0x12, 0x0f, 0x13, 0x0f, 0x14, 0x0f, 0x15, 0x0f, 0x16, 0x0f, 0x17, 0x0f, 0x18, 0x0f, 0x19, 0x0f, 0x1a, 0x0f, 0x1b, 0x0f, 0x1c, 0x0f, 0x1d, 0x0f, 0x1e, 0x0f, 0x1f, 0x0f, 0x20, 0x0f, 0x21, 0x0f, 0x22, 0x0f, 0x23, 0x0f, 0x24, 0x0f, 0x25, 0x0f, 0x26, 0x0f, 0x27, 0x0f, 0x28, 0x0f, 0x29, 0x0f, 0x2a, 0x0f, 0x2b, 0x0f, 0x2c, 0x0f, 0x2d, 0x0f, 0x2e, 0x0f, 0x2f, 0x0f, 0x30, 0x0f, 0x31, 0x0f, 0x32, 0x0f, 0x33, 0x0f, 0x34, 0x0f, 0x35, 0x0f, 0x36, 0x0f, 0x37, 0x0f, 0x38, 0x0f, 0x39, 0x0f, 0x3a, 0x0f, 0x3b, 0x0f, 0x3c, 0x0f, 0x3d, 0x0f, 0x3e, 0x0f, 0x3f, 0x0f, 0x40, 0x0f, 0x41, 0x0f, 0x42, 0x0f, 0x43, 0x0f, 0x44, 0x0f, 0x45, 0x0f, 0x46, 0x0f, 0x47, 0x0f, 0x48, 0x0f, 0x49, 0x0f, 0x4a, 0x0f, 0x4b, 0x0f, 0x4c, 0x0f, 0x4d, 0x0f, 0x4e, 0x0f, 0x4f, 0x0f, 0x50, 0x0f, 0x51, 0x0f, 0x52, 0x0f, 0x53, 0x0f, 0x54, 0x0f, 0x55, 0x0f, 0x56, 0x0f, 0x57, 0x0f, 0x58, 0x0f, 0x59, 0x0f, 0x5a, 0x0f, 0x5b, 0x0f, 0x5c, 0x0f, 0x5d, 0x0f, 0x5e, 0x0f, 0x5f, 0x0f, 0x60, 0x0f, 0x61, 0x0f, 0x62, 0x0f, 0x63, 0x0f, 0x64, 0x0f, 0x65, 0x0f, 0x66, 0x0f, 0x67, 0x0f, 0x68, 0x0f, 0x69, 0x0f, 0x6a, 0x0f, 0x6b, 0x0f, 0x6c, 0x0f, 0x6d, 0x0f, 0x6e, 0x0f, 0x6f, 0x0f, 0x70, 0x0f, 0x71, 0x0f, 0x72, 0x0f, 0x73, 0x0f, 0x74, 0x0f, 0x75, 0x0f, 0x76, 0x0f, 0x77, 0x0f, 0x78, 0x0f, 0x79, 0x0f, 0x7a, 0x0f, 0x7b, 0x0f, 0x7c, 0x0f, 0x7d, 0x0f, 0x7e, 0x0f, 0x7f, 0x0f, 0x80, 0x0f, 0x81, 0x0f, 0x82, 0x0f, 0x83, 0x0f, 0x84, 0x0f, 0x85, 0x0f, 0x86, 0x0f, 0x87, 0x0f, 0x88, 0x0f, 0x89, 0x0f, 0x8a, 0x0f, 0x8b, 0x0f, 0x8c, 0x0f, 0x8d, 0x0f, 0x8e, 0x0f, 0x8f, 0x0f, 0x90, 0x0f, 0x91, 0x0f, 0x92, 0x0f, 0x93, 0x0f, 0x94, 0x0f, 0x95, 0x0f, 0x96, 0x0f, 0x97, 0x0f, 0x98, 0x0f, 0x99, 0x0f, 0x9a, 0x0f, 0x9b, 0x0f, 0x9c, 0x0f, 0x9d, 0x0f, 0x9e, 0x0f, 0x9f, 0x0f, 0xa0, 0x0f, 0xa1, 0x0f, 0xa2, 0x0f, 0xa3, 0x0f, 0xa4, 0x0f, 0xa5, 0x0f, 0xa6, 0x0f, 0xa7, 0x0f, 0xa8, 0x0f, 0xa9, 0x0f, 0xaa, 0x0f, 0xab, 0x0f, 0xac, 0x0f, 0xad, 0x0f, 0xae, 0x0f, 0xaf, 0x0f, 0xb0, 0x0f, 0xb1, 0x0f, 0xb2, 0x0f, 0xb3, 0x0f, 0xb4, 0x0f, 0xb5, 0x0f, 0xb6, 0x0f, 0xb7, 0x0f, 0xb8, 0x0f, 0xb9, 0x0f, 0xba, 0x0f, 0xbb, 0x0f, 0xbc, 0x0f, 0xbd, 0x0f, 0xbe, 0x0f, 0xbf, 0x0f, 0xc0, 0x0f, 0xc1, 0x0f, 0xc2, 0x0f, 0xc3, 0x0f, 0xc4, 0x0f, 0xc5, 0x0f, 0xc6, 0x0f, 0xc7, 0x0f, 0xc8, 0x0f, 0xc9, 0x0f, 0xca, 0x0f, 0xcb, 0x0f, 0xcc, 0x0f, 0xcd, 0x0f, 0xce, 0x0f, 0xcf, 0x0f, 0xd0, 0x0f, 0xd1, 0x0f, 0xd2, 0x0f, 0xd3, 0x0f, 0xd4, 0x0f, 0xd5, 0x0f, 0xd6, 0x0f, 0xd7, 0x0f, 0xd8, 0x0f, 0xd9, 0x0f, 0xda, 0x0f, 0xdb, 0x0f, 0xdc, 0x0f, 0xdd, 0x0f, 0xde, 0x0f, 0xdf, 0x0f, 0xe0, 0x0f, 0xe1, 0x0f, 0xe2, 0x0f, 0xe3, 0x0f, 0xe4, 0x0f, 0xe5, 0x0f, 0xe6, 0x0f, 0xe7, 0x0f, 0xe8, 0x0f, 0xe9, 0x0f, 0xea, 0x0f, 0xeb, 0x0f, 0xec, 0x0f, 0xed, 0x0f, 0xee, 0x0f, 0xef, 0x0f, 0xf0, 0x0f, 0xf1, 0x0f, 0xf2, 0x0f, 0xf3, 0x0f, 0xf4, 0x0f, 0xf5, 0x0f, 0xf6, 0x0f, 0xf7, 0x0f, 0xf8, 0x0f, 0xf9, 0x0f, 0xfa, 0x0f, 0xfb, 0x0f, 0xfc, 0x0f, 0xfd, 0x0f, 0xfe, 0x0f, 0xff, 0x10, 0x00, 0x10, 0x01, 0x10, 0x02, 0x10, 0x03, 0x10, 0x04, 0x10, 0x05, 0x10, 0x06, 0x10, 0x07, 0x10, 0x08, 0x10, 0x09, 0x10, 0x0a, 0x10, 0x0b, 0x10, 0x0c, 0x10, 0x0d, 0x10, 0x0e, 0x10, 0x0f, 0x10, 0x10, 0x10, 0x11, 0x10, 0x12, 0x10, 0x13, 0x10, 0x14, 0x10, 0x15, 0x10, 0x16, 0x10, 0x17, 0x10, 0x18, 0x10, 0x19, 0x10, 0x1a, 0x10, 0x1b, 0x10, 0x1c, 0x10, 0x1d, 0x10, 0x1e, 0x10, 0x1f, 0x10, 0x20, 0x10, 0x21, 0x10, 0x22, 0x10, 0x23, 0x10, 0x24, 0x10, 0x25, 0x10, 0x26, 0x10, 0x27, 0x10, 0x28, 0x10, 0x29, 0x10, 0x2a, 0x10, 0x2b, 0x10, 0x2c, 0x10, 0x2d, 0x10, 0x2e, 0x10, 0x2f, 0x10, 0x30, 0x10, 0x31, 0x10, 0x32, 0x10, 0x33, 0x10, 0x34, 0x10, 0x35, 0x10, 0x36, 0x10, 0x37, 0x10, 0x38, 0x10, 0x39, 0x10, 0x3a, 0x10, 0x3b, 0x10, 0x3c, 0x10, 0x3d, 0x10, 0x3e, 0x10, 0x3f, 0x10, 0x40, 0x10, 0x41, 0x10, 0x42, 0x10, 0x43, 0x10, 0x44, 0x10, 0x45, 0x10, 0x46, 0x10, 0x47, 0x10, 0x48, 0x10, 0x49, 0x10, 0x4a, 0x10, 0x4b, 0x10, 0x4c, 0x10, 0x4d, 0x10, 0x4e, 0x10, 0x4f, 0x10, 0x50, 0x10, 0x51, 0x10, 0x52, 0x10, 0x53, 0x10, 0x54, 0x10, 0x55, 0x10, 0x56, 0x10, 0x57, 0x10, 0x58, 0x10, 0x59, 0x10, 0x5a, 0x10, 0x5b, 0x10, 0x5c, 0x10, 0x5d, 0x10, 0x5e, 0x10, 0x5f, 0x10, 0x60, 0x10, 0x61, 0x10, 0x62, 0x10, 0x63, 0x10, 0x64, 0x10, 0x65, 0x10, 0x66, 0x10, 0x67, 0x10, 0x68, 0x10, 0x69, 0x10, 0x6a, 0x10, 0x6b, 0x10, 0x6c, 0x10, 0x6d, 0x10, 0x6e, 0x10, 0x6f, 0x10, 0x70, 0x10, 0x71, 0x10, 0x72, 0x10, 0x73, 0x10, 0x74, 0x10, 0x75, 0x10, 0x76, 0x10, 0x77, 0x10, 0x78, 0x10, 0x79, 0x10, 0x7a, 0x10, 0x7b, 0x10, 0x7c, 0x10, 0x7d, 0x10, 0x7e, 0x10, 0x7f, 0x10, 0x80, 0x10, 0x81, 0x10, 0x82, 0x10, 0x83, 0x10, 0x84, 0x10, 0x85, 0x10, 0x86, 0x10, 0x87, 0x10, 0x88, 0x10, 0x89, 0x10, 0x8a, 0x10, 0x8b, 0x10, 0x8c, 0x10, 0x8d, 0x10, 0x8e, 0x10, 0x8f, 0x10, 0x90, 0x10, 0x91, 0x10, 0x92, 0x10, 0x93, 0x10, 0x94, 0x10, 0x95, 0x10, 0x96, 0x10, 0x97, 0x10, 0x98, 0x10, 0x99, 0x10, 0x9a, 0x10, 0x9b, 0x10, 0x9c, 0x10, 0x9d, 0x10, 0x9e, 0x10, 0x9f, 0x10, 0xa0, 0x10, 0xa1, 0x10, 0xa2, 0x10, 0xa3, 0x10, 0xa4, 0x10, 0xa5, 0x10, 0xa6, 0x10, 0xa7, 0x10, 0xa8, 0x10, 0xa9, 0x10, 0xaa, 0x10, 0xab, 0x10, 0xac, 0x10, 0xad, 0x10, 0xae, 0x10, 0xaf, 0x10, 0xb0, 0x10, 0xb1, 0x10, 0xb2, 0x10, 0xb3, 0x10, 0xb4, 0x10, 0xb5, 0x10, 0xb6, 0x10, 0xb7, 0x10, 0xb8, 0x10, 0xb9, 0x10, 0xba, 0x10, 0xbb, 0x10, 0xbc, 0x10, 0xbd, 0x10, 0xbe, 0x10, 0xbf, 0x10, 0xc0, 0x10, 0xc1, 0x10, 0xc2, 0x10, 0xc3, 0x10, 0xc4, 0x10, 0xc5, 0x10, 0xc6, 0x10, 0xc7, 0x10, 0xc8, 0x10, 0xc9, 0x10, 0xca, 0x10, 0xcb, 0x10, 0xcc, 0x10, 0xcd, 0x10, 0xce, 0x10, 0xcf, 0x10, 0xd0, 0x10, 0xd1, 0x10, 0xd2, 0x10, 0xd3, 0x10, 0xd4, 0x10, 0xd5, 0x10, 0xd6, 0x10, 0xd7, 0x10, 0xd8, 0x10, 0xd9, 0x10, 0xda, 0x10, 0xdb, 0x10, 0xdc, 0x10, 0xdd, 0x10, 0xde, 0x10, 0xdf, 0x10, 0xe0, 0x10, 0xe1, 0x10, 0xe2, 0x10, 0xe3, 0x10, 0xe4, 0x10, 0xe5, 0x10, 0xe6, 0x10, 0xe7, 0x10, 0xe8, 0x10, 0xe9, 0x10, 0xea, 0x10, 0xeb, 0x10, 0xec, 0x10, 0xed, 0x10, 0xee, 0x10, 0xef, 0x10, 0xf0, 0x10, 0xf1, 0x10, 0xf2, 0x10, 0xf3, 0x10, 0xf4, 0x10, 0xf5, 0x10, 0xf6, 0x10, 0xf7, 0x10, 0xf8, 0x10, 0xf9, 0x10, 0xfa, 0x10, 0xfb, 0x10, 0xfc, 0x10, 0xfd, 0x10, 0xfe, 0x10, 0xff, 0x11, 0x00, 0x11, 0x01, 0x11, 0x02, 0x11, 0x03, 0x11, 0x04, 0x11, 0x05, 0x11, 0x06, 0x11, 0x07, 0x11, 0x08, 0x11, 0x09, 0x11, 0x0a, 0x11, 0x0b, 0x11, 0x0c, 0x11, 0x0d, 0x11, 0x0e, 0x11, 0x0f, 0x11, 0x10, 0x11, 0x11, 0x11, 0x12, 0x11, 0x13, 0x11, 0x14, 0x11, 0x15, 0x11, 0x16, 0x11, 0x17, 0x11, 0x18, 0x11, 0x19, 0x11, 0x1a, 0x11, 0x1b, 0x11, 0x1c, 0x11, 0x1d, 0x11, 0x1e, 0x11, 0x1f, 0x11, 0x20, 0x11, 0x21, 0x11, 0x22, 0x11, 0x23, 0x11, 0x24, 0x11, 0x25, 0x11, 0x26, 0x11, 0x27, 0x11, 0x28, 0x11, 0x29, 0x11, 0x2a, 0x11, 0x2b, 0x11, 0x2c, 0x11, 0x2d, 0x11, 0x2e, 0x11, 0x2f, 0x11, 0x30, 0x11, 0x31, 0x11, 0x32, 0x11, 0x33, 0x11, 0x34, 0x11, 0x35, 0x11, 0x36, 0x11, 0x37, 0x11, 0x38, 0x11, 0x39, 0x11, 0x3a, 0x11, 0x3b, 0x11, 0x3c, 0x11, 0x3d, 0x11, 0x3e, 0x11, 0x3f, 0x11, 0x40, 0x11, 0x41, 0x11, 0x42, 0x11, 0x43, 0x11, 0x44, 0x11, 0x45, 0x11, 0x46, 0x11, 0x47, 0x11, 0x48, 0x11, 0x49, 0x11, 0x4a, 0x11, 0x4b, 0x11, 0x4c, 0x11, 0x4d, 0x11, 0x4e, 0x11, 0x4f, 0x11, 0x50, 0x11, 0x51, 0x11, 0x52, 0x11, 0x53, 0x11, 0x54, 0x11, 0x55, 0x11, 0x56, 0x11, 0x57, 0x11, 0x58, 0x11, 0x59, 0x11, 0x5a, 0x11, 0x5b, 0x11, 0x5c, 0x11, 0x5d, 0x11, 0x5e, 0x11, 0x5f, 0x11, 0x60, 0x11, 0x61, 0x11, 0x62, 0x11, 0x63, 0x11, 0x64, 0x11, 0x65, 0x11, 0x66, 0x11, 0x67, 0x11, 0x68, 0x11, 0x69, 0x11, 0x6a, 0x11, 0x6b, 0x11, 0x6c, 0x11, 0x6d, 0x11, 0x6e, 0x11, 0x6f, 0x11, 0x70, 0x11, 0x71, 0x11, 0x72, 0x11, 0x73, 0x11, 0x74, 0x11, 0x75, 0x11, 0x76, 0x11, 0x77, 0x11, 0x78, 0x11, 0x79, 0x11, 0x7a, 0x11, 0x7b, 0x11, 0x7c, 0x11, 0x7d, 0x11, 0x7e, 0x11, 0x7f, 0x11, 0x80, 0x11, 0x81, 0x11, 0x82, 0x11, 0x83, 0x11, 0x84, 0x11, 0x85, 0x11, 0x86, 0x11, 0x87, 0x11, 0x88, 0x11, 0x89, 0x11, 0x8a, 0x11, 0x8b, 0x11, 0x8c, 0x11, 0x8d, 0x11, 0x8e, 0x11, 0x8f, 0x11, 0x90, 0x11, 0x91, 0x11, 0x92, 0x11, 0x93, 0x11, 0x94, 0x11, 0x95, 0x11, 0x96, 0x11, 0x97, 0x11, 0x98, 0x11, 0x99, 0x11, 0x9a, 0x11, 0x9b, 0x11, 0x9c, 0x11, 0x9d, 0x11, 0x9e, 0x11, 0x9f, 0x11, 0xa0, 0x11, 0xa1, 0x11, 0xa2, 0x11, 0xa3, 0x11, 0xa4, 0x11, 0xa5, 0x11, 0xa6, 0x11, 0xa7, 0x11, 0xa8, 0x11, 0xa9, 0x11, 0xaa, 0x11, 0xab, 0x11, 0xac, 0x11, 0xad, 0x11, 0xae, 0x11, 0xaf, 0x11, 0xb0, 0x11, 0xb1, 0x11, 0xb2, 0x11, 0xb3, 0x11, 0xb4, 0x11, 0xb5, 0x11, 0xb6, 0x11, 0xb7, 0x11, 0xb8, 0x11, 0xb9, 0x11, 0xba, 0x11, 0xbb, 0x11, 0xbc, 0x11, 0xbd, 0x11, 0xbe, 0x11, 0xbf, 0x11, 0xc0, 0x11, 0xc1, 0x11, 0xc2, 0x11, 0xc3, 0x11, 0xc4, 0x11, 0xc5, 0x11, 0xc6, 0x11, 0xc7, 0x11, 0xc8, 0x11, 0xc9, 0x11, 0xca, 0x11, 0xcb, 0x11, 0xcc, 0x11, 0xcd, 0x11, 0xce, 0x11, 0xcf, 0x11, 0xd0, 0x11, 0xd1, 0x11, 0xd2, 0x11, 0xd3, 0x11, 0xd4, 0x11, 0xd5, 0x11, 0xd6, 0x11, 0xd7, 0x11, 0xd8, 0x11, 0xd9, 0x11, 0xda, 0x11, 0xdb, 0x11, 0xdc, 0x11, 0xdd, 0x11, 0xde, 0x11, 0xdf, 0x11, 0xe0, 0x11, 0xe1, 0x11, 0xe2, 0x11, 0xe3, 0x11, 0xe4, 0x11, 0xe5, 0x11, 0xe6, 0x11, 0xe7, 0x11, 0xe8, 0x11, 0xe9, 0x11, 0xea, 0x11, 0xeb, 0x11, 0xec, 0x11, 0xed, 0x11, 0xee, 0x11, 0xef, 0x11, 0xf0, 0x11, 0xf1, 0x11, 0xf2, 0x11, 0xf3, 0x11, 0xf4, 0x11, 0xf5, 0x11, 0xf6, 0x11, 0xf7, 0x11, 0xf8, 0x11, 0xf9, 0x11, 0xfa, 0x11, 0xfb, 0x11, 0xfc, 0x11, 0xfd, 0x11, 0xfe, 0x11, 0xff, 0x12, 0x00, 0x12, 0x01, 0x12, 0x02, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, 0x12, 0x06, 0x12, 0x07, 0x12, 0x08, 0x12, 0x09, 0x12, 0x0a, 0x12, 0x0b, 0x12, 0x0c, 0x12, 0x0d, 0x12, 0x0e, 0x09, 0x73, 0x66, 0x74, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x07, 0x41, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x61, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x41, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x61, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x41, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x61, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0b, 0x43, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x63, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x43, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x63, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x64, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x44, 0x63, 0x72, 0x6f, 0x61, 0x74, 0x07, 0x45, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x65, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x45, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x65, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0a, 0x45, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x65, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x45, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x65, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x06, 0x45, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x65, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x47, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x67, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x47, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x67, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x47, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0b, 0x48, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x68, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x04, 0x48, 0x62, 0x61, 0x72, 0x04, 0x68, 0x62, 0x61, 0x72, 0x06, 0x49, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x69, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x69, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x49, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x69, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x49, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x69, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x02, 0x49, 0x4a, 0x02, 0x69, 0x6a, 0x0b, 0x4a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x6a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0c, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x06, 0x4c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x6c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, 0x4c, 0x64, 0x6f, 0x74, 0x04, 0x6c, 0x64, 0x6f, 0x74, 0x06, 0x4e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x4e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, 0x65, 0x03, 0x45, 0x6e, 0x67, 0x03, 0x65, 0x6e, 0x67, 0x07, 0x4f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x6f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x4f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x6f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0d, 0x4f, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x6f, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x06, 0x52, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x72, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x72, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x53, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x73, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x53, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x73, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0c, 0x54, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x74, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x54, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, 0x54, 0x62, 0x61, 0x72, 0x04, 0x74, 0x62, 0x61, 0x72, 0x06, 0x55, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x75, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, 0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x75, 0x62, 0x72, 0x65, 0x76, 0x65, 0x05, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x05, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x0d, 0x55, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x75, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x07, 0x55, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x75, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0b, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x77, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x79, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x06, 0x5a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x7a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x7a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x05, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x46, 0x05, 0x4f, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x6f, 0x68, 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x45, 0x05, 0x55, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x35, 0x06, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x39, 0x0a, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x41, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x61, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x4f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x6f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x37, 0x0c, 0x53, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x36, 0x08, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x6a, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x37, 0x09, 0x67, 0x72, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x09, 0x61, 0x63, 0x75, 0x74, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x09, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x0d, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x32, 0x0c, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x45, 0x05, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0d, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x61, 0x6e, 0x6f, 0x74, 0x65, 0x6c, 0x65, 0x69, 0x61, 0x0c, 0x45, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x45, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x49, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x11, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x05, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x42, 0x65, 0x74, 0x61, 0x05, 0x47, 0x61, 0x6d, 0x6d, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x39, 0x34, 0x07, 0x45, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x5a, 0x65, 0x74, 0x61, 0x03, 0x45, 0x74, 0x61, 0x05, 0x54, 0x68, 0x65, 0x74, 0x61, 0x04, 0x49, 0x6f, 0x74, 0x61, 0x05, 0x4b, 0x61, 0x70, 0x70, 0x61, 0x06, 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x02, 0x4d, 0x75, 0x02, 0x4e, 0x75, 0x02, 0x58, 0x69, 0x07, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x02, 0x50, 0x69, 0x03, 0x52, 0x68, 0x6f, 0x05, 0x53, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x54, 0x61, 0x75, 0x07, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x50, 0x68, 0x69, 0x03, 0x43, 0x68, 0x69, 0x03, 0x50, 0x73, 0x69, 0x0c, 0x49, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0f, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x65, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x69, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x14, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x62, 0x65, 0x74, 0x61, 0x05, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x05, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x07, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x7a, 0x65, 0x74, 0x61, 0x03, 0x65, 0x74, 0x61, 0x05, 0x74, 0x68, 0x65, 0x74, 0x61, 0x04, 0x69, 0x6f, 0x74, 0x61, 0x05, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x06, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, 0x43, 0x02, 0x6e, 0x75, 0x02, 0x78, 0x69, 0x07, 0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x03, 0x72, 0x68, 0x6f, 0x06, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x31, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x74, 0x61, 0x75, 0x07, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x70, 0x68, 0x69, 0x03, 0x63, 0x68, 0x69, 0x03, 0x70, 0x73, 0x69, 0x05, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x0c, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0f, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x30, 0x06, 0x74, 0x68, 0x65, 0x74, 0x61, 0x31, 0x08, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x34, 0x04, 0x70, 0x68, 0x69, 0x31, 0x06, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x46, 0x06, 0x57, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x77, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x57, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x77, 0x61, 0x63, 0x75, 0x74, 0x65, 0x09, 0x57, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x09, 0x77, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x31, 0x06, 0x59, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x79, 0x67, 0x72, 0x61, 0x76, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x31, 0x0a, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x61, 0x73, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x36, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x64, 0x62, 0x6c, 0x0d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x33, 0x0e, 0x6f, 0x6e, 0x65, 0x64, 0x6f, 0x74, 0x65, 0x6e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0e, 0x74, 0x77, 0x6f, 0x64, 0x6f, 0x74, 0x65, 0x6e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x31, 0x06, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x42, 0x09, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x64, 0x62, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x30, 0x0d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x6d, 0x6f, 0x6e, 0x65, 0x74, 0x61, 0x72, 0x79, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x32, 0x04, 0x6c, 0x69, 0x72, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x36, 0x06, 0x70, 0x65, 0x73, 0x65, 0x74, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x41, 0x04, 0x64, 0x6f, 0x6e, 0x67, 0x04, 0x45, 0x75, 0x72, 0x6f, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x30, 0x08, 0x49, 0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x37, 0x0b, 0x77, 0x65, 0x69, 0x65, 0x72, 0x73, 0x74, 0x72, 0x61, 0x73, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x42, 0x08, 0x52, 0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x44, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x44, 0x09, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x34, 0x05, 0x61, 0x6c, 0x65, 0x70, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x32, 0x08, 0x6f, 0x6e, 0x65, 0x74, 0x68, 0x69, 0x72, 0x64, 0x09, 0x74, 0x77, 0x6f, 0x74, 0x68, 0x69, 0x72, 0x64, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x41, 0x09, 0x6f, 0x6e, 0x65, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x65, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x0b, 0x66, 0x69, 0x76, 0x65, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x0c, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x39, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x07, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x0a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x64, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x37, 0x0c, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x64, 0x6e, 0x62, 0x73, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x34, 0x0e, 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x46, 0x0c, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x6c, 0x65, 0x66, 0x74, 0x0a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x75, 0x70, 0x0d, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0c, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x0c, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x62, 0x6f, 0x74, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x46, 0x09, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x31, 0x0b, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x34, 0x08, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x73, 0x65, 0x74, 0x08, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x6e, 0x6f, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x41, 0x08, 0x73, 0x75, 0x63, 0x68, 0x74, 0x68, 0x61, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x36, 0x0c, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x6d, 0x61, 0x74, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x43, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x0a, 0x6f, 0x72, 0x74, 0x68, 0x6f, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x05, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x36, 0x0a, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x09, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6f, 0x72, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x33, 0x09, 0x74, 0x68, 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x42, 0x07, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x34, 0x09, 0x63, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x46, 0x0b, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x31, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x74, 0x09, 0x6e, 0x6f, 0x74, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x35, 0x0c, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x0e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x34, 0x0a, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x70, 0x6c, 0x75, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x36, 0x0e, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x34, 0x0d, 0x70, 0x65, 0x72, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x34, 0x07, 0x64, 0x6f, 0x74, 0x6d, 0x61, 0x74, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x31, 0x05, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x46, 0x0d, 0x72, 0x65, 0x76, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x46, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, 0x70, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x62, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x39, 0x08, 0x53, 0x46, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x31, 0x08, 0x53, 0x46, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x42, 0x08, 0x53, 0x46, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x46, 0x08, 0x53, 0x46, 0x30, 0x33, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x33, 0x08, 0x53, 0x46, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x37, 0x08, 0x53, 0x46, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x42, 0x08, 0x53, 0x46, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x33, 0x08, 0x53, 0x46, 0x30, 0x39, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x42, 0x08, 0x53, 0x46, 0x30, 0x36, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x33, 0x08, 0x53, 0x46, 0x30, 0x37, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x42, 0x08, 0x53, 0x46, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x46, 0x08, 0x53, 0x46, 0x34, 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x31, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x34, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x46, 0x07, 0x75, 0x70, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x33, 0x07, 0x64, 0x6e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x37, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x42, 0x07, 0x6c, 0x66, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x46, 0x07, 0x72, 0x74, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x6c, 0x74, 0x73, 0x68, 0x61, 0x64, 0x65, 0x05, 0x73, 0x68, 0x61, 0x64, 0x65, 0x07, 0x64, 0x6b, 0x73, 0x68, 0x61, 0x64, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x46, 0x09, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x62, 0x6f, 0x78, 0x06, 0x48, 0x32, 0x32, 0x30, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x39, 0x06, 0x48, 0x31, 0x38, 0x35, 0x34, 0x33, 0x06, 0x48, 0x31, 0x38, 0x35, 0x35, 0x31, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x72, 0x65, 0x63, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x31, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x75, 0x70, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x39, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x72, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x42, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x64, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x33, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x6c, 0x66, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x39, 0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x45, 0x06, 0x48, 0x31, 0x38, 0x35, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x37, 0x09, 0x69, 0x6e, 0x76, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x09, 0x69, 0x6e, 0x76, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x35, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x39, 0x09, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x66, 0x61, 0x63, 0x65, 0x0c, 0x69, 0x6e, 0x76, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x66, 0x61, 0x63, 0x65, 0x03, 0x73, 0x75, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x46, 0x06, 0x66, 0x65, 0x6d, 0x61, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x31, 0x04, 0x6d, 0x61, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x46, 0x05, 0x73, 0x70, 0x61, 0x64, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x32, 0x04, 0x63, 0x6c, 0x75, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x34, 0x05, 0x68, 0x65, 0x61, 0x72, 0x74, 0x07, 0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x39, 0x0b, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x0e, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x62, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x46, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x31, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x31, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x31, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x31, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x31, 0x04, 0x73, 0x74, 0x65, 0x6d, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x30, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x30, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x30, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x36, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x44, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x30, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x31, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x32, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x33, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x34, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x35, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x36, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x37, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x38, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x39, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x41, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x42, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x43, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x44, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x45, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x46, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x30, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x31, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x32, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x33, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x34, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x35, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x36, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x37, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x38, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x39, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x41, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x42, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x43, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x44, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x45, 0x06, 0x75, 0x31, 0x30, 0x33, 0x32, 0x30, 0x06, 0x75, 0x31, 0x30, 0x33, 0x32, 0x31, 0x06, 0x75, 0x31, 0x30, 0x33, 0x32, 0x32, 0x06, 0x75, 0x31, 0x30, 0x33, 0x32, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x44, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x44, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x44, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x44, 0x33, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x38, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x39, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x41, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x42, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x43, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x44, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x45, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x46, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x30, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x31, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x32, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x33, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x34, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x35, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x36, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x37, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x38, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x39, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x41, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x39, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x39, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x39, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x39, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x46, 0x06, 0x75, 0x31, 0x46, 0x34, 0x32, 0x44, 0x06, 0x75, 0x31, 0x46, 0x34, 0x32, 0x45, 0x06, 0x75, 0x31, 0x46, 0x34, 0x33, 0x31, 0x06, 0x75, 0x31, 0x46, 0x34, 0x33, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x30, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x31, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x32, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x33, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x34, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x36, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x37, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x38, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x39, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x41, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x42, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x43, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x44, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x45, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x46, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x30, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x31, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x32, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x33, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x34, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x36, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x37, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x38, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x39, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x41, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x42, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x43, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x44, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x45, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x46, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x30, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x31, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x32, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x33, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x36, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x37, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x38, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x39, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x41, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x42, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x44, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x45, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x46, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x30, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x31, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x32, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x33, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x34, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x36, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x37, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x38, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x39, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x41, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x42, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x43, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x44, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x45, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x46, 0x06, 0x75, 0x31, 0x46, 0x36, 0x34, 0x30, 0x09, 0x64, 0x6c, 0x4c, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x08, 0x44, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x05, 0x41, 0x63, 0x75, 0x74, 0x65, 0x05, 0x54, 0x69, 0x6c, 0x64, 0x65, 0x05, 0x47, 0x72, 0x61, 0x76, 0x65, 0x0a, 0x43, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x05, 0x43, 0x61, 0x72, 0x6f, 0x6e, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x31, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x05, 0x42, 0x72, 0x65, 0x76, 0x65, 0x09, 0x44, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x48, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0b, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0a, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x64, 0x6f, 0x74, 0x0c, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x32, 0x64, 0x6f, 0x74, 0x73, 0x0c, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x33, 0x64, 0x6f, 0x74, 0x73, 0x0e, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x33, 0x64, 0x6f, 0x74, 0x73, 0x5f, 0x61, 0x0e, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x32, 0x64, 0x6f, 0x74, 0x73, 0x5f, 0x61, 0x0c, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x34, 0x64, 0x6f, 0x74, 0x73, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x31, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x31, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0b, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x31, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x31, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0e, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x67, 0x61, 0x66, 0x5f, 0x62, 0x61, 0x72, 0x07, 0x45, 0x6e, 0x67, 0x2e, 0x61, 0x6c, 0x74, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x38, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x44, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x34, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, 0x38, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x37, 0x30, 0x33, 0x30, 0x34, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x30, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, 0x30, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x34, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x43, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x38, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x43, 0x30, 0x33, 0x30, 0x37, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x30, 0x30, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x30, 0x33, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x33, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x30, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x30, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x31, 0x30, 0x33, 0x30, 0x37, 0x0a, 0x62, 0x72, 0x61, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x6f, 0x74, 0x05, 0x4a, 0x2e, 0x61, 0x6c, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x16, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x41, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x74, 0x61, 0x72, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x43, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x43, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x43, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x05, 0x6c, 0x2e, 0x61, 0x6c, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x44, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x11, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x38, 0x2e, 0x6d, 0x6f, 0x6e, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x11, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x39, 0x2e, 0x6d, 0x6f, 0x6e, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x0f, 0x69, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x38, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x39, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x44, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x42, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x03, 0x64, 0x63, 0x6f, 0x05, 0x49, 0x2e, 0x61, 0x6c, 0x74, 0x0a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x31, 0x30, 0x36, 0x34, 0x42, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x31, 0x30, 0x36, 0x34, 0x43, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x34, 0x42, 0x30, 0x36, 0x35, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x31, 0x30, 0x36, 0x34, 0x45, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x31, 0x30, 0x36, 0x34, 0x46, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x34, 0x45, 0x30, 0x36, 0x35, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x34, 0x30, 0x36, 0x34, 0x45, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x34, 0x30, 0x36, 0x34, 0x46, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x42, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x42, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x30, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x30, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x31, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x31, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x33, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x33, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x33, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x34, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x34, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x34, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x36, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x36, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x36, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x37, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x37, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x38, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x38, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x38, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x39, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x39, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x39, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x42, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x42, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x30, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x30, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x31, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x31, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x33, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x33, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x33, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x34, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x34, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x34, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x36, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x36, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x36, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x37, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x37, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x09, 0x52, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x30, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x31, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x32, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x33, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x34, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x35, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x36, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x37, 0x2e, 0x61, 0x6c, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x45, 0x2e, 0x64, 0x69, 0x61, 0x63, 0x11, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, 0x2e, 0x62, 0x72, 0x65, 0x76, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x11, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x42, 0x2e, 0x62, 0x72, 0x65, 0x76, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x05, 0x79, 0x2e, 0x61, 0x6c, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x39, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x33, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x34, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x36, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x39, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x42, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x42, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x30, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x30, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x33, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x33, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x33, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x37, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x37, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x38, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x38, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x38, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x42, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x42, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x30, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x30, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x34, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x34, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x34, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x36, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x36, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x36, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x37, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x37, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x38, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x38, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x38, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x39, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x39, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x39, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x80, 0x40, 0xff, 0xfb, 0xfe, 0x03, 0xfa, 0x14, 0x03, 0xf9, 0x25, 0x03, 0xf8, 0x32, 0x03, 0xf7, 0x96, 0x03, 0xf6, 0x0e, 0x03, 0xf5, 0xfe, 0x03, 0xf4, 0xfe, 0x03, 0xf3, 0x25, 0x03, 0xf2, 0x0e, 0x03, 0xf1, 0x96, 0x03, 0xf0, 0x25, 0x03, 0xef, 0x8a, 0x41, 0x05, 0xef, 0xfe, 0x03, 0xee, 0x96, 0x03, 0xed, 0x96, 0x03, 0xec, 0xfa, 0x03, 0xeb, 0xfa, 0x03, 0xea, 0xfe, 0x03, 0xe9, 0x3a, 0x03, 0xe8, 0x42, 0x03, 0xe7, 0xfe, 0x03, 0xe6, 0x32, 0x03, 0xe5, 0xe4, 0x53, 0x05, 0xe5, 0x96, 0x03, 0xe4, 0x8a, 0x41, 0x05, 0xe4, 0x53, 0x03, 0xe3, 0xe2, 0x2f, 0x05, 0xe3, 0xfa, 0x03, 0xe2, 0x2f, 0x03, 0xe1, 0xfe, 0x03, 0xe0, 0xfe, 0x03, 0xdf, 0x32, 0x03, 0xde, 0x14, 0x03, 0xdd, 0x96, 0x03, 0xdc, 0xfe, 0x03, 0xdb, 0x12, 0x03, 0xda, 0x7d, 0x03, 0xd9, 0xbb, 0x03, 0xd8, 0xfe, 0x03, 0xd6, 0x8a, 0x41, 0x05, 0xd6, 0x7d, 0x03, 0xd5, 0xd4, 0x47, 0x05, 0xd5, 0x7d, 0x03, 0xd4, 0x47, 0x03, 0xd3, 0xd2, 0x1b, 0x05, 0xd3, 0xfe, 0x03, 0xd2, 0x1b, 0x03, 0xd1, 0xfe, 0x03, 0xd0, 0xfe, 0x03, 0xcf, 0xfe, 0x03, 0xce, 0xfe, 0x03, 0xcd, 0x96, 0x03, 0xcc, 0xcb, 0x1e, 0x05, 0xcc, 0xfe, 0x03, 0xcb, 0x1e, 0x03, 0xca, 0x32, 0x03, 0xc9, 0xfe, 0x03, 0xc6, 0x85, 0x11, 0x05, 0xc6, 0x1c, 0x03, 0xc5, 0x16, 0x03, 0xc4, 0xfe, 0x03, 0xc3, 0xfe, 0x03, 0xc2, 0xfe, 0x03, 0xc1, 0xfe, 0x03, 0xc0, 0xfe, 0x03, 0xbf, 0xfe, 0x03, 0xbe, 0xfe, 0x03, 0xbd, 0xfe, 0x03, 0xbc, 0xfe, 0x03, 0xbb, 0xfe, 0x03, 0xba, 0x11, 0x03, 0xb9, 0x86, 0x25, 0x05, 0xb9, 0xfe, 0x03, 0xb8, 0xb7, 0xbb, 0x05, 0xb8, 0xfe, 0x03, 0xb7, 0xb6, 0x5d, 0x05, 0xb7, 0xbb, 0x03, 0xb7, 0x80, 0x04, 0xb6, 0xb5, 0x25, 0x05, 0xb6, 0x5d, 0x40, 0xff, 0x03, 0xb6, 0x40, 0x04, 0xb5, 0x25, 0x03, 0xb4, 0xfe, 0x03, 0xb3, 0x96, 0x03, 0xb2, 0xfe, 0x03, 0xb1, 0xfe, 0x03, 0xb0, 0xfe, 0x03, 0xaf, 0xfe, 0x03, 0xae, 0x64, 0x03, 0xad, 0x0e, 0x03, 0xac, 0xab, 0x25, 0x05, 0xac, 0x64, 0x03, 0xab, 0xaa, 0x12, 0x05, 0xab, 0x25, 0x03, 0xaa, 0x12, 0x03, 0xa9, 0x8a, 0x41, 0x05, 0xa9, 0xfa, 0x03, 0xa8, 0xfe, 0x03, 0xa7, 0xfe, 0x03, 0xa6, 0xfe, 0x03, 0xa5, 0x12, 0x03, 0xa4, 0xfe, 0x03, 0xa3, 0xa2, 0x0e, 0x05, 0xa3, 0x32, 0x03, 0xa2, 0x0e, 0x03, 0xa1, 0x64, 0x03, 0xa0, 0x8a, 0x41, 0x05, 0xa0, 0x96, 0x03, 0x9f, 0xfe, 0x03, 0x9e, 0x9d, 0x0c, 0x05, 0x9e, 0xfe, 0x03, 0x9d, 0x0c, 0x03, 0x9c, 0x9b, 0x19, 0x05, 0x9c, 0x64, 0x03, 0x9b, 0x9a, 0x10, 0x05, 0x9b, 0x19, 0x03, 0x9a, 0x10, 0x03, 0x99, 0x0a, 0x03, 0x98, 0xfe, 0x03, 0x97, 0x96, 0x0d, 0x05, 0x97, 0xfe, 0x03, 0x96, 0x0d, 0x03, 0x95, 0x8a, 0x41, 0x05, 0x95, 0x96, 0x03, 0x94, 0x93, 0x0e, 0x05, 0x94, 0x28, 0x03, 0x93, 0x0e, 0x03, 0x92, 0xfa, 0x03, 0x91, 0x90, 0xbb, 0x05, 0x91, 0xfe, 0x03, 0x90, 0x8f, 0x5d, 0x05, 0x90, 0xbb, 0x03, 0x90, 0x80, 0x04, 0x8f, 0x8e, 0x25, 0x05, 0x8f, 0x5d, 0x03, 0x8f, 0x40, 0x04, 0x8e, 0x25, 0x03, 0x8d, 0xfe, 0x03, 0x8c, 0x8b, 0x2e, 0x05, 0x8c, 0xfe, 0x03, 0x8b, 0x2e, 0x03, 0x8a, 0x86, 0x25, 0x05, 0x8a, 0x41, 0x03, 0x89, 0x88, 0x0b, 0x05, 0x89, 0x14, 0x03, 0x88, 0x0b, 0x03, 0x87, 0x86, 0x25, 0x05, 0x87, 0x64, 0x03, 0x86, 0x85, 0x11, 0x05, 0x86, 0x25, 0x03, 0x85, 0x11, 0x03, 0x84, 0xfe, 0x03, 0x83, 0x82, 0x11, 0x05, 0x83, 0xfe, 0x03, 0x82, 0x11, 0x03, 0x81, 0xfe, 0x03, 0x80, 0xfe, 0x03, 0x7f, 0xfe, 0x03, 0x40, 0xff, 0x7e, 0x7d, 0x7d, 0x05, 0x7e, 0xfe, 0x03, 0x7d, 0x7d, 0x03, 0x7c, 0x64, 0x03, 0x7b, 0x54, 0x15, 0x05, 0x7b, 0x25, 0x03, 0x7a, 0xfe, 0x03, 0x79, 0xfe, 0x03, 0x78, 0x0e, 0x03, 0x77, 0x0c, 0x03, 0x76, 0x0a, 0x03, 0x75, 0xfe, 0x03, 0x74, 0xfa, 0x03, 0x73, 0xfa, 0x03, 0x72, 0xfa, 0x03, 0x71, 0xfa, 0x03, 0x70, 0xfe, 0x03, 0x6f, 0xfe, 0x03, 0x6e, 0xfe, 0x03, 0x6c, 0x21, 0x03, 0x6b, 0xfe, 0x03, 0x6a, 0x11, 0x42, 0x05, 0x6a, 0x53, 0x03, 0x69, 0xfe, 0x03, 0x68, 0x7d, 0x03, 0x67, 0x11, 0x42, 0x05, 0x66, 0xfe, 0x03, 0x65, 0xfe, 0x03, 0x64, 0xfe, 0x03, 0x63, 0xfe, 0x03, 0x62, 0xfe, 0x03, 0x61, 0x3a, 0x03, 0x60, 0xfa, 0x03, 0x5e, 0x0c, 0x03, 0x5d, 0xfe, 0x03, 0x5b, 0xfe, 0x03, 0x5a, 0xfe, 0x03, 0x59, 0x58, 0x0a, 0x05, 0x59, 0xfa, 0x03, 0x58, 0x0a, 0x03, 0x57, 0x16, 0x19, 0x05, 0x57, 0x32, 0x03, 0x56, 0xfe, 0x03, 0x55, 0x54, 0x15, 0x05, 0x55, 0x42, 0x03, 0x54, 0x15, 0x03, 0x53, 0x01, 0x10, 0x05, 0x53, 0x18, 0x03, 0x52, 0x14, 0x03, 0x51, 0x4a, 0x13, 0x05, 0x51, 0xfe, 0x03, 0x50, 0x0b, 0x03, 0x4f, 0xfe, 0x03, 0x4e, 0x4d, 0x10, 0x05, 0x4e, 0xfe, 0x03, 0x4d, 0x10, 0x03, 0x4c, 0xfe, 0x03, 0x4b, 0x4a, 0x13, 0x05, 0x4b, 0xfe, 0x03, 0x4a, 0x49, 0x10, 0x05, 0x4a, 0x13, 0x03, 0x49, 0x1d, 0x0d, 0x05, 0x49, 0x10, 0x03, 0x48, 0x0d, 0x03, 0x47, 0xfe, 0x03, 0x46, 0x96, 0x03, 0x45, 0x96, 0x03, 0x44, 0xfe, 0x03, 0x43, 0x02, 0x2d, 0x05, 0x43, 0xfa, 0x03, 0x42, 0xbb, 0x03, 0x41, 0x4b, 0x03, 0x40, 0xfe, 0x03, 0x3f, 0xfe, 0x03, 0x3e, 0x3d, 0x12, 0x05, 0x3e, 0x14, 0x03, 0x3d, 0x3c, 0x0f, 0x05, 0x3d, 0x12, 0x03, 0x3c, 0x3b, 0x0d, 0x05, 0x3c, 0x40, 0xff, 0x0f, 0x03, 0x3b, 0x0d, 0x03, 0x3a, 0xfe, 0x03, 0x39, 0xfe, 0x03, 0x38, 0x37, 0x14, 0x05, 0x38, 0xfa, 0x03, 0x37, 0x36, 0x10, 0x05, 0x37, 0x14, 0x03, 0x36, 0x35, 0x0b, 0x05, 0x36, 0x10, 0x03, 0x35, 0x0b, 0x03, 0x34, 0x1e, 0x03, 0x33, 0x0d, 0x03, 0x32, 0x31, 0x0b, 0x05, 0x32, 0xfe, 0x03, 0x31, 0x0b, 0x03, 0x30, 0x2f, 0x0b, 0x05, 0x30, 0x0d, 0x03, 0x2f, 0x0b, 0x03, 0x2e, 0x2d, 0x09, 0x05, 0x2e, 0x10, 0x03, 0x2d, 0x09, 0x03, 0x2c, 0x32, 0x03, 0x2b, 0x2a, 0x25, 0x05, 0x2b, 0x64, 0x03, 0x2a, 0x29, 0x12, 0x05, 0x2a, 0x25, 0x03, 0x29, 0x12, 0x03, 0x28, 0x27, 0x25, 0x05, 0x28, 0x41, 0x03, 0x27, 0x25, 0x03, 0x26, 0x25, 0x0b, 0x05, 0x26, 0x0f, 0x03, 0x25, 0x0b, 0x03, 0x24, 0xfe, 0x03, 0x23, 0xfe, 0x03, 0x22, 0x0f, 0x03, 0x21, 0x01, 0x10, 0x05, 0x21, 0x12, 0x03, 0x20, 0x64, 0x03, 0x1f, 0xfa, 0x03, 0x1e, 0x1d, 0x0d, 0x05, 0x1e, 0x64, 0x03, 0x1d, 0x0d, 0x03, 0x1c, 0x11, 0x42, 0x05, 0x1c, 0xfe, 0x03, 0x1b, 0xfa, 0x03, 0x1a, 0x42, 0x03, 0x19, 0x11, 0x42, 0x05, 0x19, 0xfe, 0x03, 0x18, 0x64, 0x03, 0x17, 0x16, 0x19, 0x05, 0x17, 0xfe, 0x03, 0x16, 0x01, 0x10, 0x05, 0x16, 0x19, 0x03, 0x15, 0xfe, 0x03, 0x14, 0xfe, 0x03, 0x13, 0xfe, 0x03, 0x12, 0x11, 0x42, 0x05, 0x12, 0xfe, 0x03, 0x11, 0x02, 0x2d, 0x05, 0x11, 0x42, 0x03, 0x10, 0x7d, 0x03, 0x0f, 0x64, 0x03, 0x0e, 0xfe, 0x03, 0x0d, 0x0c, 0x16, 0x05, 0x0d, 0xfe, 0x03, 0x0c, 0x01, 0x10, 0x05, 0x0c, 0x16, 0x03, 0x0b, 0xfe, 0x03, 0x0a, 0x10, 0x03, 0x09, 0xfe, 0x03, 0x08, 0x02, 0x2d, 0x05, 0x08, 0xfe, 0x03, 0x07, 0x14, 0x03, 0x06, 0x64, 0x03, 0x04, 0x01, 0x10, 0x05, 0x04, 0xfe, 0x03, 0x40, 0x15, 0x03, 0x02, 0x2d, 0x05, 0x03, 0xfe, 0x03, 0x02, 0x01, 0x10, 0x05, 0x02, 0x2d, 0x03, 0x01, 0x10, 0x03, 0x00, 0xfe, 0x03, 0x01, 0xb8, 0x01, 0x64, 0x85, 0x8d, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x1d }; unsigned int dejavu_sans_condensed_ttf_len = 552620; #endif mapserver-8.4.0/src/dxfcolor.h000066400000000000000000000107731474174441300163300ustar00rootroot00000000000000struct dxfcolor { int r, g, b; }; struct dxfcolor ctable[256] = { {0, 0, 0}, {255, 0, 0}, {255, 255, 0}, {0, 255, 0}, {0, 255, 255}, {0, 0, 255}, {255, 0, 255}, {255, 255, 255}, {128, 128, 128}, {192, 192, 192}, {255, 0, 0}, {255, 127, 127}, {204, 0, 0}, {204, 102, 102}, {153, 0, 0}, {153, 76, 76}, {127, 0, 0}, {127, 63, 63}, {76, 0, 0}, {76, 38, 38}, {255, 63, 0}, {255, 159, 127}, {204, 51, 0}, {204, 127, 102}, {153, 38, 0}, {153, 95, 76}, {127, 31, 0}, {127, 79, 63}, {76, 19, 0}, {76, 47, 38}, {255, 127, 0}, {255, 191, 127}, {204, 102, 0}, {204, 153, 102}, {153, 76, 0}, {153, 114, 76}, {127, 63, 0}, {127, 95, 63}, {76, 38, 0}, {76, 57, 38}, {255, 191, 0}, {255, 223, 127}, {204, 153, 0}, {204, 178, 102}, {153, 114, 0}, {153, 133, 76}, {127, 95, 0}, {127, 111, 63}, {76, 57, 0}, {76, 66, 38}, {255, 255, 0}, {255, 255, 127}, {204, 204, 0}, {204, 204, 102}, {153, 153, 0}, {153, 153, 76}, {127, 127, 0}, {127, 127, 63}, {76, 76, 0}, {76, 76, 38}, {191, 255, 0}, {223, 255, 127}, {153, 204, 0}, {178, 204, 102}, {114, 153, 0}, {133, 153, 76}, {95, 127, 0}, {111, 127, 63}, {57, 76, 0}, {66, 76, 38}, {127, 255, 0}, {191, 255, 127}, {102, 204, 0}, {153, 204, 102}, {76, 153, 0}, {114, 153, 76}, {63, 127, 0}, {95, 127, 63}, {38, 76, 0}, {57, 76, 38}, {63, 255, 0}, {159, 255, 127}, {51, 204, 0}, {127, 204, 102}, {38, 153, 0}, {95, 153, 76}, {31, 127, 0}, {79, 127, 63}, {19, 76, 0}, {47, 76, 38}, {0, 255, 0}, {127, 255, 127}, {0, 204, 0}, {102, 204, 102}, {0, 153, 0}, {76, 153, 76}, {0, 127, 0}, {63, 127, 63}, {0, 76, 0}, {38, 76, 38}, {0, 255, 63}, {127, 255, 159}, {0, 204, 51}, {102, 204, 127}, {0, 153, 38}, {76, 153, 95}, {0, 127, 31}, {63, 127, 79}, {0, 76, 19}, {38, 76, 47}, {0, 255, 127}, {127, 255, 191}, {0, 204, 102}, {102, 204, 153}, {0, 153, 76}, {76, 153, 114}, {0, 127, 63}, {63, 127, 95}, {0, 76, 38}, {38, 76, 57}, {0, 255, 191}, {127, 255, 223}, {0, 204, 153}, {102, 204, 178}, {0, 153, 114}, {76, 153, 133}, {0, 127, 95}, {63, 127, 111}, {0, 76, 57}, {38, 76, 66}, {0, 255, 255}, {127, 255, 255}, {0, 204, 204}, {102, 204, 204}, {0, 153, 153}, {76, 153, 153}, {0, 127, 127}, {63, 127, 127}, {0, 76, 76}, {38, 76, 76}, {0, 191, 255}, {127, 223, 255}, {0, 153, 204}, {102, 178, 204}, {0, 114, 153}, {76, 133, 153}, {0, 95, 127}, {63, 111, 127}, {0, 57, 76}, {38, 66, 76}, {0, 127, 255}, {127, 191, 255}, {0, 102, 204}, {102, 153, 204}, {0, 76, 153}, {76, 114, 153}, {0, 63, 127}, {63, 95, 127}, {0, 38, 76}, {38, 57, 76}, {0, 63, 255}, {127, 159, 255}, {0, 51, 204}, {102, 127, 204}, {0, 38, 153}, {76, 95, 153}, {0, 31, 127}, {63, 79, 127}, {0, 19, 76}, {38, 47, 76}, {0, 0, 255}, {127, 127, 255}, {0, 0, 204}, {102, 102, 204}, {0, 0, 153}, {76, 76, 153}, {0, 0, 127}, {63, 63, 127}, {0, 0, 76}, {38, 38, 76}, {63, 0, 255}, {159, 127, 255}, {51, 0, 204}, {127, 102, 204}, {38, 0, 153}, {95, 76, 153}, {31, 0, 127}, {79, 63, 127}, {19, 0, 76}, {47, 38, 76}, {127, 0, 255}, {191, 127, 255}, {102, 0, 204}, {153, 102, 204}, {76, 0, 153}, {114, 76, 153}, {63, 0, 127}, {95, 63, 127}, {38, 0, 76}, {57, 38, 76}, {191, 0, 255}, {223, 127, 255}, {153, 0, 204}, {178, 102, 204}, {114, 0, 153}, {133, 76, 153}, {95, 0, 127}, {111, 63, 127}, {57, 0, 76}, {66, 38, 76}, {255, 0, 255}, {255, 127, 255}, {204, 0, 204}, {204, 102, 204}, {153, 0, 153}, {153, 76, 153}, {127, 0, 127}, {127, 63, 127}, {76, 0, 76}, {76, 38, 76}, {255, 0, 191}, {255, 127, 223}, {204, 0, 153}, {204, 102, 178}, {153, 0, 114}, {153, 76, 133}, {127, 0, 95}, {127, 63, 111}, {76, 0, 57}, {76, 38, 66}, {255, 0, 127}, {255, 127, 191}, {204, 0, 102}, {204, 102, 153}, {153, 0, 76}, {153, 76, 114}, {127, 0, 63}, {127, 63, 95}, {76, 0, 38}, {76, 38, 57}, {255, 0, 63}, {255, 127, 159}, {204, 0, 51}, {204, 102, 127}, {153, 0, 38}, {153, 76, 95}, {127, 0, 31}, {127, 63, 79}, {76, 0, 19}, {76, 38, 47}, {51, 51, 51}, {91, 91, 91}, {132, 132, 132}, {173, 173, 173}, {214, 214, 214}, {255, 255, 255}, }; mapserver-8.4.0/src/flatgeobuf/000077500000000000000000000000001474174441300164455ustar00rootroot00000000000000mapserver-8.4.0/src/flatgeobuf/LICENSE000066400000000000000000000023671474174441300174620ustar00rootroot00000000000000Copyright (c) 2018, Björn Harrtell Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mapserver-8.4.0/src/flatgeobuf/feature_generated.h000066400000000000000000000242351474174441300222750ustar00rootroot00000000000000// automatically generated by the FlatBuffers compiler, do not modify #ifndef FLATBUFFERS_GENERATED_FEATURE_FLATGEOBUF_H_ #define FLATBUFFERS_GENERATED_FEATURE_FLATGEOBUF_H_ #include "flatbuffers/flatbuffers.h" // Ensure the included flatbuffers.h is the same version as when this file was // generated, otherwise it may not be compatible. static_assert(FLATBUFFERS_VERSION_MAJOR == 2 && FLATBUFFERS_VERSION_MINOR == 0 && FLATBUFFERS_VERSION_REVISION == 6, "Non-compatible flatbuffers version included"); #include "header_generated.h" namespace mapserver { namespace FlatGeobuf { struct Geometry; struct GeometryBuilder; struct Feature; struct FeatureBuilder; struct Geometry FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef GeometryBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_ENDS = 4, VT_XY = 6, VT_Z = 8, VT_M = 10, VT_T = 12, VT_TM = 14, VT_TYPE = 16, VT_PARTS = 18 }; const flatbuffers::Vector *ends() const { return GetPointer *>(VT_ENDS); } const flatbuffers::Vector *xy() const { return GetPointer *>(VT_XY); } const flatbuffers::Vector *z() const { return GetPointer *>(VT_Z); } const flatbuffers::Vector *m() const { return GetPointer *>(VT_M); } const flatbuffers::Vector *t() const { return GetPointer *>(VT_T); } const flatbuffers::Vector *tm() const { return GetPointer *>(VT_TM); } FlatGeobuf::GeometryType type() const { return static_cast(GetField(VT_TYPE, 0)); } const flatbuffers::Vector> *parts() const { return GetPointer> *>(VT_PARTS); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_ENDS) && verifier.VerifyVector(ends()) && VerifyOffset(verifier, VT_XY) && verifier.VerifyVector(xy()) && VerifyOffset(verifier, VT_Z) && verifier.VerifyVector(z()) && VerifyOffset(verifier, VT_M) && verifier.VerifyVector(m()) && VerifyOffset(verifier, VT_T) && verifier.VerifyVector(t()) && VerifyOffset(verifier, VT_TM) && verifier.VerifyVector(tm()) && VerifyField(verifier, VT_TYPE, 1) && VerifyOffset(verifier, VT_PARTS) && verifier.VerifyVector(parts()) && verifier.VerifyVectorOfTables(parts()) && verifier.EndTable(); } }; struct GeometryBuilder { typedef Geometry Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_ends(flatbuffers::Offset> ends) { fbb_.AddOffset(Geometry::VT_ENDS, ends); } void add_xy(flatbuffers::Offset> xy) { fbb_.AddOffset(Geometry::VT_XY, xy); } void add_z(flatbuffers::Offset> z) { fbb_.AddOffset(Geometry::VT_Z, z); } void add_m(flatbuffers::Offset> m) { fbb_.AddOffset(Geometry::VT_M, m); } void add_t(flatbuffers::Offset> t) { fbb_.AddOffset(Geometry::VT_T, t); } void add_tm(flatbuffers::Offset> tm) { fbb_.AddOffset(Geometry::VT_TM, tm); } void add_type(FlatGeobuf::GeometryType type) { fbb_.AddElement(Geometry::VT_TYPE, static_cast(type), 0); } void add_parts(flatbuffers::Offset>> parts) { fbb_.AddOffset(Geometry::VT_PARTS, parts); } explicit GeometryBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); return o; } }; inline flatbuffers::Offset CreateGeometry( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset> ends = 0, flatbuffers::Offset> xy = 0, flatbuffers::Offset> z = 0, flatbuffers::Offset> m = 0, flatbuffers::Offset> t = 0, flatbuffers::Offset> tm = 0, FlatGeobuf::GeometryType type = FlatGeobuf::GeometryType::Unknown, flatbuffers::Offset>> parts = 0) { GeometryBuilder builder_(_fbb); builder_.add_parts(parts); builder_.add_tm(tm); builder_.add_t(t); builder_.add_m(m); builder_.add_z(z); builder_.add_xy(xy); builder_.add_ends(ends); builder_.add_type(type); return builder_.Finish(); } inline flatbuffers::Offset CreateGeometryDirect( flatbuffers::FlatBufferBuilder &_fbb, const std::vector *ends = nullptr, const std::vector *xy = nullptr, const std::vector *z = nullptr, const std::vector *m = nullptr, const std::vector *t = nullptr, const std::vector *tm = nullptr, FlatGeobuf::GeometryType type = FlatGeobuf::GeometryType::Unknown, const std::vector> *parts = nullptr) { auto ends__ = ends ? _fbb.CreateVector(*ends) : 0; auto xy__ = xy ? _fbb.CreateVector(*xy) : 0; auto z__ = z ? _fbb.CreateVector(*z) : 0; auto m__ = m ? _fbb.CreateVector(*m) : 0; auto t__ = t ? _fbb.CreateVector(*t) : 0; auto tm__ = tm ? _fbb.CreateVector(*tm) : 0; auto parts__ = parts ? _fbb.CreateVector>(*parts) : 0; return FlatGeobuf::CreateGeometry( _fbb, ends__, xy__, z__, m__, t__, tm__, type, parts__); } struct Feature FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef FeatureBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_GEOMETRY = 4, VT_PROPERTIES = 6, VT_COLUMNS = 8 }; const FlatGeobuf::Geometry *geometry() const { return GetPointer(VT_GEOMETRY); } const flatbuffers::Vector *properties() const { return GetPointer *>(VT_PROPERTIES); } const flatbuffers::Vector> *columns() const { return GetPointer> *>(VT_COLUMNS); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_GEOMETRY) && verifier.VerifyTable(geometry()) && VerifyOffset(verifier, VT_PROPERTIES) && verifier.VerifyVector(properties()) && VerifyOffset(verifier, VT_COLUMNS) && verifier.VerifyVector(columns()) && verifier.VerifyVectorOfTables(columns()) && verifier.EndTable(); } }; struct FeatureBuilder { typedef Feature Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_geometry(flatbuffers::Offset geometry) { fbb_.AddOffset(Feature::VT_GEOMETRY, geometry); } void add_properties(flatbuffers::Offset> properties) { fbb_.AddOffset(Feature::VT_PROPERTIES, properties); } void add_columns(flatbuffers::Offset>> columns) { fbb_.AddOffset(Feature::VT_COLUMNS, columns); } explicit FeatureBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); return o; } }; inline flatbuffers::Offset CreateFeature( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset geometry = 0, flatbuffers::Offset> properties = 0, flatbuffers::Offset>> columns = 0) { FeatureBuilder builder_(_fbb); builder_.add_columns(columns); builder_.add_properties(properties); builder_.add_geometry(geometry); return builder_.Finish(); } inline flatbuffers::Offset CreateFeatureDirect( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset geometry = 0, const std::vector *properties = nullptr, const std::vector> *columns = nullptr) { auto properties__ = properties ? _fbb.CreateVector(*properties) : 0; auto columns__ = columns ? _fbb.CreateVector>(*columns) : 0; return FlatGeobuf::CreateFeature( _fbb, geometry, properties__, columns__); } inline const FlatGeobuf::Feature *GetFeature(const void *buf) { return flatbuffers::GetRoot(buf); } inline const FlatGeobuf::Feature *GetSizePrefixedFeature(const void *buf) { return flatbuffers::GetSizePrefixedRoot(buf); } inline bool VerifyFeatureBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer(nullptr); } inline bool VerifySizePrefixedFeatureBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifySizePrefixedBuffer(nullptr); } inline void FinishFeatureBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.Finish(root); } inline void FinishSizePrefixedFeatureBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.FinishSizePrefixed(root); } } // namespace FlatGeobuf } #endif // FLATBUFFERS_GENERATED_FEATURE_FLATGEOBUF_H_ mapserver-8.4.0/src/flatgeobuf/flatgeobuf_c.cpp000066400000000000000000000315311474174441300215740ustar00rootroot00000000000000#include "flatgeobuf_c.h" #include "feature_generated.h" #include "geometryreader.h" #include "packedrtree.h" #include using namespace mapserver::flatbuffers; using namespace mapserver::FlatGeobuf; typedef flatgeobuf_ctx ctx; uint8_t flatgeobuf_magicbytes[] = { 0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x01 }; uint8_t FLATGEOBUF_MAGICBYTES_SIZE = sizeof(flatgeobuf_magicbytes); uint32_t INIT_BUFFER_SIZE = 1024 * 4; template void parse_value(uint8_t *data, char **values, uint16_t i, uint32_t &offset, bool found) { using std::to_string; if (found) { msFree(values[i]); values[i] = msStrdup(to_string(*((T*) (data + offset))).c_str()); } offset += sizeof(T); } ctx *flatgeobuf_init_ctx() { ctx *c = (ctx *) malloc(sizeof(ctx)); memset(c, 0, sizeof(ctx)); c->is_null_geom = false; c->done = false; return c; } void flatgeobuf_free_ctx(ctx *ctx) { if (ctx->columns) { for (uint32_t i = 0; i < ctx->columns_len; i++) free(ctx->columns[i].name); free(ctx->columns); } if (ctx->search_result) free(ctx->search_result); if (ctx->buf) free(ctx->buf); if (ctx->wkt) free(ctx->wkt); free(ctx); } void flatgeobuf_ensure_line(ctx *ctx, uint32_t len) { if (!ctx->line) { ctx->line_len = len; ctx->line = (lineObj *) malloc(ctx->line_len * sizeof(lineObj)); return; } if (ctx->line_len < len) { ctx->line_len = len; ctx->line = (lineObj *) realloc(ctx->buf, ctx->line_len * sizeof(lineObj)); } } void flatgeobuf_ensure_point(ctx *ctx, uint32_t len) { if (!ctx->point) { ctx->point_len = len; ctx->point = (pointObj *) malloc(ctx->point_len * sizeof(pointObj)); return; } if (ctx->point_len < len) { ctx->point_len = len; ctx->point = (pointObj *) realloc(ctx->buf, ctx->point_len * sizeof(pointObj)); } } int flatgeobuf_ensure_buf(ctx *ctx, uint32_t size) { if (size > 100 * 1024 * 1024) { msSetError(MS_FGBERR, "Invalid buffer size requested", "flatgeobuf_ensure_buf"); return -1; } if (!ctx->buf) { ctx->buf_size = std::max(INIT_BUFFER_SIZE, size); ctx->buf = (uint8_t *) malloc(ctx->buf_size); if (ctx->buf == NULL) { msSetError(MS_FGBERR, "Failed to allocate buffer", "flatgeobuf_ensure_buf"); return -1; } return 0; } if (ctx->buf_size < size) { ctx->buf_size = std::max(ctx->buf_size * 2, size); auto buf = (uint8_t *) realloc(ctx->buf, ctx->buf_size); if (buf == NULL) { msSetError(MS_FGBERR, "Failed to reallocate buffer", "flatgeobuf_ensure_buf"); return -1; } ctx->buf = buf; } return 0; } int flatgeobuf_decode_feature(ctx *ctx, layerObj *layer, shapeObj *shape) { ctx->is_null_geom = false; uint32_t featureSize; if (VSIFReadL(&featureSize, sizeof(featureSize), 1, ctx->file) != 1) { if (VSIFEofL(ctx->file)) { ctx->done = true; return 0; } return -1; } ctx->offset += sizeof(uoffset_t); if (flatgeobuf_ensure_buf(ctx, featureSize) != 0) { return -1; } if (VSIFReadL(ctx->buf, 1, featureSize, ctx->file) != featureSize) { msSetError(MS_FGBERR, "Failed to read feature", "flatgeobuf_decode_feature"); return -1; } ctx->offset += featureSize; auto feature = GetFeature(ctx->buf); const auto geometry = feature->geometry(); if (geometry) { GeometryReader(ctx, geometry).read(shape); } else { ctx->is_null_geom = true; return 0; } auto properties = feature->properties(); if (properties && properties->size() != 0) { ctx->properties = (uint8_t *) properties->data(); ctx->properties_size = properties->size(); flatgeobuf_decode_properties(ctx, layer, shape); } else { ctx->properties_size = 0; } return 0; } int flatgeobuf_decode_properties(ctx *ctx, layerObj *layer, shapeObj *shape) { uint8_t type; uint32_t offset = 0; uint8_t *data = ctx->properties; uint32_t size = ctx->properties_size; uint16_t numvalues = layer->numitems; bool found; char **values; if (numvalues == 0) return 0; values = (char **) msSmallCalloc(sizeof(char *), numvalues); if (shape->values) msFreeCharArray(shape->values, shape->numvalues); shape->numvalues = numvalues; shape->values = values; if (size > 0 && size < (sizeof(uint16_t) + sizeof(uint8_t))) { msSetError(MS_FGBERR, "Unexpected properties data size", "flatgeobuf_decode_properties"); return -1; } while (offset + 1 < size) { uint16_t i; memcpy(&i, data + offset, sizeof(uint16_t)); offset += sizeof(uint16_t); if (i >= ctx->columns_len) { msSetError(MS_FGBERR, "Column index out of range", "flatgeobuf_decode_properties"); return -1; } const auto& column = ctx->columns[i]; const int32_t ii = column.itemindex; found = ii != -1; type = column.type; switch (type) { case flatgeobuf_column_type_bool: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_byte: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_ubyte: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_short: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_ushort: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_int: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_uint: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_long: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_ulong: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_float: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_double: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_datetime: case flatgeobuf_column_type_string: { uint32_t len; if (offset + sizeof(len) > size){ msSetError(MS_FGBERR, "Invalid size for string value", "flatgeobuf_decode_properties"); return -1; } memcpy(&len, data + offset, sizeof(uint32_t)); offset += sizeof(len); if (found) { char *str = (char *) msSmallMalloc(len + 1); memcpy(str, data + offset, len); str[len] = '\0'; msFree(values[ii]); values[ii] = str; } offset += len; break; } } } for(int i = 0; i < shape->numvalues; i++) { if( shape->values[i] == NULL) shape->values[i] = msStrdup(""); } return 0; } int flatgeobuf_check_magicbytes(ctx *ctx) { if (ctx->offset != 0) { msSetError(MS_FGBERR, "Unexpected offset", "flatgeobuf_check_magicbytes"); return -1; } if (flatgeobuf_ensure_buf(ctx, FLATGEOBUF_MAGICBYTES_SIZE) != 0) return -1; if (VSIFReadL(ctx->buf, 8, 1, ctx->file) != 1) { msSetError(MS_FGBERR, "Failed to read magicbytes", "flatgeobuf_check_magicbytes"); return -1; } uint32_t i; for (i = 0; i < FLATGEOBUF_MAGICBYTES_SIZE / 2; i++) { if (ctx->buf[i] != flatgeobuf_magicbytes[i]) { msSetError(MS_FGBERR, "Data is not FlatGeobuf", "flatgeobuf_check_magicbytes"); return -1; } } ctx->offset += FLATGEOBUF_MAGICBYTES_SIZE; return 0; } int flatgeobuf_decode_header(ctx *ctx) { if (ctx->offset != FLATGEOBUF_MAGICBYTES_SIZE) { msSetError(MS_FGBERR, "Unexpected offset", "flatgeobuf_decode_header"); return -1; } if (VSIFSeekL(ctx->file, ctx->offset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Unable to get seek in file", "flatgeobuf_decode_header"); return -1; } uint32_t headerSize; if (VSIFReadL(&headerSize, 4, 1, ctx->file) != 1) { msSetError(MS_FGBERR, "Failed to read header size", "flatgeobuf_decode_header"); return -1; } ctx->offset += sizeof(uoffset_t); if (flatgeobuf_ensure_buf(ctx, headerSize) != 0) { return -1; } if (VSIFReadL(ctx->buf, 1, headerSize, ctx->file) != headerSize) { msSetError(MS_FGBERR, "Failed to read header", "flatgeobuf_decode_header"); return -1; } auto header = GetHeader(ctx->buf); ctx->offset += headerSize; ctx->geometry_type = (uint8_t) header->geometry_type(); ctx->features_count = header->features_count(); auto envelope = header->envelope(); if (envelope != nullptr) { ctx->has_extent = true; ctx->xmin = envelope->Get(0); ctx->ymin = envelope->Get(1); ctx->xmax = envelope->Get(2); ctx->ymax = envelope->Get(3); ctx->bounds.minx = ctx->xmin; ctx->bounds.miny = ctx->ymin; ctx->bounds.maxx = ctx->xmax; ctx->bounds.maxy = ctx->ymax; } ctx->has_z = header->has_z(); ctx->has_m = header->has_m(); ctx->has_t = header->has_t(); ctx->has_tm = header->has_tm(); ctx->index_node_size = header->index_node_size(); auto crs = header->crs(); if (crs != nullptr) { ctx->srid = crs->code(); auto wkt = crs->wkt(); if (wkt != nullptr) ctx->wkt = msStrdup(wkt->c_str()); } auto columns = header->columns(); if (columns != nullptr) { auto size = columns->size(); ctx->columns = (flatgeobuf_column *) malloc(size * sizeof(flatgeobuf_column)); memset(ctx->columns, 0, size * sizeof(flatgeobuf_column)); ctx->columns_len = size; for (uint32_t i = 0; i < size; i++) { auto column = columns->Get(i); ctx->columns[i].name = msStrdup(column->name()->c_str()); ctx->columns[i].type = (uint8_t) column->type(); ctx->columns[i].itemindex = -1; } } ctx->index_offset = ctx->offset; ctx->feature_offset = ctx->offset; if ( ctx->index_node_size > 0) ctx->feature_offset += PackedRTree::size(ctx->features_count, ctx->index_node_size); return 0; } int flatgeobuf_index_search(ctx *ctx, rectObj *rect) { const auto treeOffset = ctx->offset; const auto readNode = [treeOffset, ctx] (uint8_t *buf, size_t i, size_t s) { if (VSIFSeekL(ctx->file, treeOffset + i, SEEK_SET) == -1) throw std::runtime_error("Unable to seek in file"); if (VSIFReadL(buf, 1, s, ctx->file) != s) throw std::runtime_error("Unable to read file"); }; NodeItem n { rect->minx, rect->miny, rect->maxx, rect->maxy, 0 }; try { const auto foundItems = PackedRTree::streamSearch(ctx->features_count, ctx->index_node_size, n, readNode); ctx->search_result = (flatgeobuf_search_item *) malloc(foundItems.size() * sizeof(flatgeobuf_search_item)); memcpy(ctx->search_result, foundItems.data(), foundItems.size() * sizeof(flatgeobuf_search_item)); ctx->search_result_len = (uint32_t) foundItems.size(); } catch (const std::exception &e) { msSetError(MS_FGBERR, "Unable to seek or read file", "flatgeobuf_index_search"); return -1; } return 0; } int flatgeobuf_index_skip(ctx *ctx) { auto treeSize = PackedRTree::size(ctx->features_count, ctx->index_node_size); ctx->offset += treeSize; if (VSIFSeekL(ctx->file, ctx->offset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Unable to seek in file", "flatgeobuf_index_skip"); return -1; } return 0; } int flatgeobuf_read_feature_offset(ctx *ctx, uint64_t index, uint64_t *featureOffset) { try { const auto levelBounds = PackedRTree::generateLevelBounds(ctx->features_count, ctx->index_node_size); const auto bottomLevelOffset = ctx->index_offset + (levelBounds.front().first * sizeof(NodeItem)); const auto nodeItemOffset = bottomLevelOffset + (index * sizeof(NodeItem)); const auto featureOffsetOffset = nodeItemOffset + (sizeof(double) * 4); if (VSIFSeekL(ctx->file, featureOffsetOffset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Failed to seek feature offset", "flatgeobuf_read_feature_offset"); return -1; } if (VSIFReadL(featureOffset, sizeof(uint64_t), 1, ctx->file) != 1) { msSetError(MS_FGBERR, "Failed to read feature offset", "flatgeobuf_read_feature_offset"); return -1; } return 0; } catch (const std::exception& e) { msSetError(MS_FGBERR, "Failed to calculate tree size", "flatgeobuf_read_feature_offset"); return -1; } } mapserver-8.4.0/src/flatgeobuf/flatgeobuf_c.h000066400000000000000000000064711474174441300212460ustar00rootroot00000000000000#ifndef FLATGEOBUF_C_H #define FLATGEOBUF_C_H #include "../../mapserver.h" #include "../../maperror.h" #include "../../mapprimitive.h" #include #include #ifdef __cplusplus extern "C" { #endif extern uint8_t flatgeobuf_magicbytes[]; extern uint8_t FLATGEOBUF_MAGICBYTES_SIZE; // need c compatible variant of this enum #define flatgeobuf_column_type_byte UINT8_C(0) #define flatgeobuf_column_type_ubyte UINT8_C(1) #define flatgeobuf_column_type_bool UINT8_C(2) #define flatgeobuf_column_type_short UINT8_C(3) #define flatgeobuf_column_type_ushort UINT8_C(4) #define flatgeobuf_column_type_int UINT8_C(5) #define flatgeobuf_column_type_uint UINT8_C(6) #define flatgeobuf_column_type_long UINT8_C(7) #define flatgeobuf_column_type_ulong UINT8_C(8) #define flatgeobuf_column_type_float UINT8_C(9) #define flatgeobuf_column_type_double UINT8_C(10) #define flatgeobuf_column_type_string UINT8_C(11) #define flatgeobuf_column_type_json UINT8_C(12) #define flatgeobuf_column_type_datetime UINT8_C(13) #define flatgeobuf_column_type_binary UINT8_C(14) typedef struct flatgeobuf_column { char *name; uint8_t type; const char *title; const char *description; uint32_t width; uint32_t precision; uint32_t scale; bool nullable; bool unique; bool primary_key; const char * metadata; int32_t itemindex; } flatgeobuf_column; typedef struct flatgeobuf_item { double xmin; double xmax; double ymin; double ymax; uint32_t size; uint64_t offset; } flatgeobuf_item; typedef struct flatgeobuf_search_item { uint64_t offset; uint64_t index; } flatgeobuf_search_item; typedef struct flatgeobuf_ctx { VSILFILE *file; uint64_t index_offset; uint64_t feature_offset; uint64_t offset; uint8_t *buf; uint32_t buf_size; bool done; // header contents const char *name; uint64_t features_count; uint8_t geometry_type; bool has_extent; double xmin; double xmax; double ymin; double ymax; bool has_z; bool has_m; bool has_t; bool has_tm; uint16_t index_node_size; int32_t srid; char *wkt; flatgeobuf_column *columns; uint16_t columns_len; // mapserver structs rectObj bounds; // index search result flatgeobuf_search_item *search_result; uint32_t search_result_len; uint32_t search_index; // shape parts buffers // NOTE: not used at this time, need to introduce optional free in mapdraw lineObj *line; uint32_t line_len; pointObj *point; uint32_t point_len; bool is_null_geom; uint64_t feature_index; int ms_type; uint8_t *properties; uint32_t properties_size; } flatgeobuf_ctx; flatgeobuf_ctx *flatgeobuf_init_ctx(); void flatgeobuf_free_ctx(flatgeobuf_ctx *ctx); int flatgeobuf_ensure_buf(flatgeobuf_ctx *ctx, uint32_t size); void flatgeobuf_ensure_line(flatgeobuf_ctx *ctx, uint32_t len); void flatgeobuf_ensure_point(flatgeobuf_ctx *ctx, uint32_t len); int flatgeobuf_check_magicbytes(flatgeobuf_ctx *ctx); int flatgeobuf_decode_header(flatgeobuf_ctx *ctx); int flatgeobuf_decode_feature(flatgeobuf_ctx *ctx, layerObj *layer, shapeObj *shape); int flatgeobuf_decode_properties(flatgeobuf_ctx *ctx, layerObj *layer, shapeObj *shape); int flatgeobuf_index_search(flatgeobuf_ctx *ctx, rectObj *rect); int flatgeobuf_index_skip(flatgeobuf_ctx *ctx); int flatgeobuf_read_feature_offset(flatgeobuf_ctx *ctx, uint64_t index, uint64_t *featureOffset); #ifdef __cplusplus } #endif #endif /* FLATGEOBUF_C_H */ mapserver-8.4.0/src/flatgeobuf/geometryreader.cpp000066400000000000000000000106441474174441300221740ustar00rootroot00000000000000#include "geometryreader.h" using namespace mapserver::flatbuffers; using namespace mapserver::FlatGeobuf; void GeometryReader::readPoint(shapeObj *shape) { lineObj *l = (lineObj *) malloc(sizeof(lineObj)); pointObj *p = (pointObj *) malloc(sizeof(pointObj)); p->x = m_xy[m_offset + 0]; p->y = m_xy[m_offset + 1]; if (m_has_z) p->z = m_geometry->z()->data()[m_offset]; if (m_has_m) p->m = m_geometry->m()->data()[m_offset]; l[0].numpoints = 1; l[0].point = p; shape->numlines = 1; shape->line = l; shape->type = MS_SHAPE_POINT; } void GeometryReader::readLineObj(lineObj *line) { const double *z = m_has_z ? m_geometry->z()->data() : nullptr; const double *m = m_has_m ? m_geometry->m()->data() : nullptr; line->point = (pointObj *) malloc(m_length * sizeof(pointObj)); line->numpoints = m_length; for (uint32_t i = m_offset; i < m_offset + m_length; i++) { pointObj *point = &line->point[i - m_offset]; memcpy(point, &m_xy[i * 2], 2 * sizeof(double)); if (m_has_z) point->z = z[i]; if (m_has_m) point->m = m[i]; } } void GeometryReader::readMultiPoint(shapeObj *shape) { readLineString(shape); shape->type = MS_SHAPE_POINT; } void GeometryReader::readLineString(shapeObj *shape) { lineObj *line = (lineObj *) malloc(sizeof(lineObj)); readLineObj(line); shape->numlines = 1; shape->line = line; shape->type = MS_SHAPE_LINE; } void GeometryReader::readMultiLineString(shapeObj *shape) { readPolygon(shape); shape->type = MS_SHAPE_LINE; } void GeometryReader::readPolygon(shapeObj *shape) { const auto ends = m_geometry->ends(); uint32_t nrings = 1; if (ends != nullptr && ends->size() > 1) nrings = ends->size(); lineObj *line = (lineObj *) malloc(nrings * sizeof(lineObj)); if (nrings > 1) { for (uint32_t i = 0; i < nrings; i++) { const auto e = ends->Get(i); m_length = e - m_offset; readLineObj(&line[i]); m_offset = e; } } else { readLineObj(line); } shape->numlines = nrings; shape->line = line; shape->type = MS_SHAPE_POLYGON; } void GeometryReader::readMultiPolygon(shapeObj *shape) { const auto parts = m_geometry->parts(); lineObj *line = (lineObj *) nullptr; auto numlines = 0; for (size_t i = 0; i < parts->size(); i++) { GeometryReader(m_ctx, parts->Get(i), GeometryType::Polygon).read(shape); lineObj *tmp = line; line = (lineObj *) realloc(line, (numlines + shape->numlines) * sizeof(lineObj)); if (!line) { free(tmp); free(shape->line); break; } for (int j = 0; j < shape->numlines; j++) line[numlines + j] = shape->line[j]; numlines += shape->numlines; free(shape->line); } shape->line = line; shape->numlines = numlines; } /*void GeometryReader::readGeometryCollection(shapeObj *shape) { // TODO return; }*/ void GeometryReader::read(shapeObj *shape) { // nested types switch (m_geometry_type) { //case GeometryType::GeometryCollection: return readGeometryCollection(shape); case GeometryType::MultiPolygon: return readMultiPolygon(shape); /*case GeometryType::CompoundCurve: return readCompoundCurve(); case GeometryType::CurvePolygon: return readCurvePolygon(); case GeometryType::MultiCurve: return readMultiCurve(); case GeometryType::MultiSurface: return readMultiSurface(); case GeometryType::PolyhedralSurface: return readPolyhedralSurface();*/ default: break; } // if not nested must have geometry data const auto pXy = m_geometry->xy(); const auto xySize = pXy->size(); m_xy = pXy->data(); m_length = xySize / 2; switch (m_geometry_type) { case GeometryType::Point: return readPoint(shape); case GeometryType::MultiPoint: return readMultiPoint(shape); case GeometryType::LineString: return readLineString(shape); case GeometryType::MultiLineString: return readMultiLineString(shape); case GeometryType::Polygon: return readPolygon(shape); /* case GeometryType::CircularString: return readSimpleCurve(true); case GeometryType::Triangle: return readTriangle(); case GeometryType::TIN: return readTIN(); */ default: break; } }mapserver-8.4.0/src/flatgeobuf/geometryreader.h000066400000000000000000000032361474174441300216400ustar00rootroot00000000000000#ifndef FLATGEOBUF_GEOMETRYREADER_H #define FLATGEOBUF_GEOMETRYREADER_H #include "../../mapserver.h" #include "../../maperror.h" #include "../../mapprimitive.h" #include "flatgeobuf_c.h" #include "feature_generated.h" namespace mapserver { namespace FlatGeobuf { class GeometryReader { private: flatgeobuf_ctx *m_ctx; const FlatGeobuf::Geometry *m_geometry; FlatGeobuf::GeometryType m_geometry_type; bool m_has_z; bool m_has_m; const double *m_xy = nullptr; uint32_t m_length = 0; uint32_t m_offset = 0; void readPoint(shapeObj *); void readMultiPoint(shapeObj *); void readLineString(shapeObj *); void readMultiLineString(shapeObj *); void readPolygon(shapeObj *); void readMultiPolygon(shapeObj *); //void readGeometryCollection(shapeObj *); void readLineObj(lineObj *line); public: GeometryReader( flatgeobuf_ctx *ctx, const FlatGeobuf::Geometry *geometry) : m_ctx (ctx), m_geometry (geometry), m_geometry_type ((FlatGeobuf::GeometryType) ctx->geometry_type), m_has_z (ctx->has_z), m_has_m (ctx->has_m) { } GeometryReader( flatgeobuf_ctx *ctx, const FlatGeobuf::Geometry *geometry, const FlatGeobuf::GeometryType geometry_type) : m_ctx (ctx), m_geometry (geometry), m_geometry_type (geometry_type), m_has_z (ctx->has_z), m_has_m (ctx->has_m) { } void read(shapeObj *); }; } } #endif /* FLATGEOBUF_GEOMETRYREADER_H */mapserver-8.4.0/src/flatgeobuf/header_generated.h000066400000000000000000000547361474174441300221030ustar00rootroot00000000000000// automatically generated by the FlatBuffers compiler, do not modify #ifndef FLATBUFFERS_GENERATED_HEADER_FLATGEOBUF_H_ #define FLATBUFFERS_GENERATED_HEADER_FLATGEOBUF_H_ #include "flatbuffers/flatbuffers.h" // Ensure the included flatbuffers.h is the same version as when this file was // generated, otherwise it may not be compatible. static_assert(FLATBUFFERS_VERSION_MAJOR == 2 && FLATBUFFERS_VERSION_MINOR == 0 && FLATBUFFERS_VERSION_REVISION == 6, "Non-compatible flatbuffers version included"); namespace mapserver { namespace FlatGeobuf { struct Column; struct ColumnBuilder; struct Crs; struct CrsBuilder; struct Header; struct HeaderBuilder; enum class GeometryType : uint8_t { Unknown = 0, Point = 1, LineString = 2, Polygon = 3, MultiPoint = 4, MultiLineString = 5, MultiPolygon = 6, GeometryCollection = 7, CircularString = 8, CompoundCurve = 9, CurvePolygon = 10, MultiCurve = 11, MultiSurface = 12, Curve = 13, Surface = 14, PolyhedralSurface = 15, TIN = 16, Triangle = 17, MIN = Unknown, MAX = Triangle }; inline const GeometryType (&EnumValuesGeometryType())[18] { static const GeometryType values[] = { GeometryType::Unknown, GeometryType::Point, GeometryType::LineString, GeometryType::Polygon, GeometryType::MultiPoint, GeometryType::MultiLineString, GeometryType::MultiPolygon, GeometryType::GeometryCollection, GeometryType::CircularString, GeometryType::CompoundCurve, GeometryType::CurvePolygon, GeometryType::MultiCurve, GeometryType::MultiSurface, GeometryType::Curve, GeometryType::Surface, GeometryType::PolyhedralSurface, GeometryType::TIN, GeometryType::Triangle }; return values; } inline const char * const *EnumNamesGeometryType() { static const char * const names[19] = { "Unknown", "Point", "LineString", "Polygon", "MultiPoint", "MultiLineString", "MultiPolygon", "GeometryCollection", "CircularString", "CompoundCurve", "CurvePolygon", "MultiCurve", "MultiSurface", "Curve", "Surface", "PolyhedralSurface", "TIN", "Triangle", nullptr }; return names; } inline const char *EnumNameGeometryType(GeometryType e) { if (flatbuffers::IsOutRange(e, GeometryType::Unknown, GeometryType::Triangle)) return ""; const size_t index = static_cast(e); return EnumNamesGeometryType()[index]; } enum class ColumnType : uint8_t { Byte = 0, UByte = 1, Bool = 2, Short = 3, UShort = 4, Int = 5, UInt = 6, Long = 7, ULong = 8, Float = 9, Double = 10, String = 11, Json = 12, DateTime = 13, Binary = 14, MIN = Byte, MAX = Binary }; inline const ColumnType (&EnumValuesColumnType())[15] { static const ColumnType values[] = { ColumnType::Byte, ColumnType::UByte, ColumnType::Bool, ColumnType::Short, ColumnType::UShort, ColumnType::Int, ColumnType::UInt, ColumnType::Long, ColumnType::ULong, ColumnType::Float, ColumnType::Double, ColumnType::String, ColumnType::Json, ColumnType::DateTime, ColumnType::Binary }; return values; } inline const char * const *EnumNamesColumnType() { static const char * const names[16] = { "Byte", "UByte", "Bool", "Short", "UShort", "Int", "UInt", "Long", "ULong", "Float", "Double", "String", "Json", "DateTime", "Binary", nullptr }; return names; } inline const char *EnumNameColumnType(ColumnType e) { if (flatbuffers::IsOutRange(e, ColumnType::Byte, ColumnType::Binary)) return ""; const size_t index = static_cast(e); return EnumNamesColumnType()[index]; } struct Column FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ColumnBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_TYPE = 6, VT_TITLE = 8, VT_DESCRIPTION = 10, VT_WIDTH = 12, VT_PRECISION = 14, VT_SCALE = 16, VT_NULLABLE = 18, VT_UNIQUE = 20, VT_PRIMARY_KEY = 22, VT_METADATA = 24 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } FlatGeobuf::ColumnType type() const { return static_cast(GetField(VT_TYPE, 0)); } const flatbuffers::String *title() const { return GetPointer(VT_TITLE); } const flatbuffers::String *description() const { return GetPointer(VT_DESCRIPTION); } int32_t width() const { return GetField(VT_WIDTH, -1); } int32_t precision() const { return GetField(VT_PRECISION, -1); } int32_t scale() const { return GetField(VT_SCALE, -1); } bool nullable() const { return GetField(VT_NULLABLE, 1) != 0; } bool unique() const { return GetField(VT_UNIQUE, 0) != 0; } bool primary_key() const { return GetField(VT_PRIMARY_KEY, 0) != 0; } const flatbuffers::String *metadata() const { return GetPointer(VT_METADATA); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyField(verifier, VT_TYPE, 1) && VerifyOffset(verifier, VT_TITLE) && verifier.VerifyString(title()) && VerifyOffset(verifier, VT_DESCRIPTION) && verifier.VerifyString(description()) && VerifyField(verifier, VT_WIDTH, 4) && VerifyField(verifier, VT_PRECISION, 4) && VerifyField(verifier, VT_SCALE, 4) && VerifyField(verifier, VT_NULLABLE, 1) && VerifyField(verifier, VT_UNIQUE, 1) && VerifyField(verifier, VT_PRIMARY_KEY, 1) && VerifyOffset(verifier, VT_METADATA) && verifier.VerifyString(metadata()) && verifier.EndTable(); } }; struct ColumnBuilder { typedef Column Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Column::VT_NAME, name); } void add_type(FlatGeobuf::ColumnType type) { fbb_.AddElement(Column::VT_TYPE, static_cast(type), 0); } void add_title(flatbuffers::Offset title) { fbb_.AddOffset(Column::VT_TITLE, title); } void add_description(flatbuffers::Offset description) { fbb_.AddOffset(Column::VT_DESCRIPTION, description); } void add_width(int32_t width) { fbb_.AddElement(Column::VT_WIDTH, width, -1); } void add_precision(int32_t precision) { fbb_.AddElement(Column::VT_PRECISION, precision, -1); } void add_scale(int32_t scale) { fbb_.AddElement(Column::VT_SCALE, scale, -1); } void add_nullable(bool nullable) { fbb_.AddElement(Column::VT_NULLABLE, static_cast(nullable), 1); } void add_unique(bool unique) { fbb_.AddElement(Column::VT_UNIQUE, static_cast(unique), 0); } void add_primary_key(bool primary_key) { fbb_.AddElement(Column::VT_PRIMARY_KEY, static_cast(primary_key), 0); } void add_metadata(flatbuffers::Offset metadata) { fbb_.AddOffset(Column::VT_METADATA, metadata); } explicit ColumnBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Column::VT_NAME); return o; } }; inline flatbuffers::Offset CreateColumn( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, FlatGeobuf::ColumnType type = FlatGeobuf::ColumnType::Byte, flatbuffers::Offset title = 0, flatbuffers::Offset description = 0, int32_t width = -1, int32_t precision = -1, int32_t scale = -1, bool nullable = true, bool unique = false, bool primary_key = false, flatbuffers::Offset metadata = 0) { ColumnBuilder builder_(_fbb); builder_.add_metadata(metadata); builder_.add_scale(scale); builder_.add_precision(precision); builder_.add_width(width); builder_.add_description(description); builder_.add_title(title); builder_.add_name(name); builder_.add_primary_key(primary_key); builder_.add_unique(unique); builder_.add_nullable(nullable); builder_.add_type(type); return builder_.Finish(); } inline flatbuffers::Offset CreateColumnDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, FlatGeobuf::ColumnType type = FlatGeobuf::ColumnType::Byte, const char *title = nullptr, const char *description = nullptr, int32_t width = -1, int32_t precision = -1, int32_t scale = -1, bool nullable = true, bool unique = false, bool primary_key = false, const char *metadata = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto title__ = title ? _fbb.CreateString(title) : 0; auto description__ = description ? _fbb.CreateString(description) : 0; auto metadata__ = metadata ? _fbb.CreateString(metadata) : 0; return FlatGeobuf::CreateColumn( _fbb, name__, type, title__, description__, width, precision, scale, nullable, unique, primary_key, metadata__); } struct Crs FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef CrsBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_ORG = 4, VT_CODE = 6, VT_NAME = 8, VT_DESCRIPTION = 10, VT_WKT = 12, VT_CODE_STRING = 14 }; const flatbuffers::String *org() const { return GetPointer(VT_ORG); } int32_t code() const { return GetField(VT_CODE, 0); } const flatbuffers::String *name() const { return GetPointer(VT_NAME); } const flatbuffers::String *description() const { return GetPointer(VT_DESCRIPTION); } const flatbuffers::String *wkt() const { return GetPointer(VT_WKT); } const flatbuffers::String *code_string() const { return GetPointer(VT_CODE_STRING); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_ORG) && verifier.VerifyString(org()) && VerifyField(verifier, VT_CODE, 4) && VerifyOffset(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffset(verifier, VT_DESCRIPTION) && verifier.VerifyString(description()) && VerifyOffset(verifier, VT_WKT) && verifier.VerifyString(wkt()) && VerifyOffset(verifier, VT_CODE_STRING) && verifier.VerifyString(code_string()) && verifier.EndTable(); } }; struct CrsBuilder { typedef Crs Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_org(flatbuffers::Offset org) { fbb_.AddOffset(Crs::VT_ORG, org); } void add_code(int32_t code) { fbb_.AddElement(Crs::VT_CODE, code, 0); } void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Crs::VT_NAME, name); } void add_description(flatbuffers::Offset description) { fbb_.AddOffset(Crs::VT_DESCRIPTION, description); } void add_wkt(flatbuffers::Offset wkt) { fbb_.AddOffset(Crs::VT_WKT, wkt); } void add_code_string(flatbuffers::Offset code_string) { fbb_.AddOffset(Crs::VT_CODE_STRING, code_string); } explicit CrsBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); return o; } }; inline flatbuffers::Offset CreateCrs( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset org = 0, int32_t code = 0, flatbuffers::Offset name = 0, flatbuffers::Offset description = 0, flatbuffers::Offset wkt = 0, flatbuffers::Offset code_string = 0) { CrsBuilder builder_(_fbb); builder_.add_code_string(code_string); builder_.add_wkt(wkt); builder_.add_description(description); builder_.add_name(name); builder_.add_code(code); builder_.add_org(org); return builder_.Finish(); } inline flatbuffers::Offset CreateCrsDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *org = nullptr, int32_t code = 0, const char *name = nullptr, const char *description = nullptr, const char *wkt = nullptr, const char *code_string = nullptr) { auto org__ = org ? _fbb.CreateString(org) : 0; auto name__ = name ? _fbb.CreateString(name) : 0; auto description__ = description ? _fbb.CreateString(description) : 0; auto wkt__ = wkt ? _fbb.CreateString(wkt) : 0; auto code_string__ = code_string ? _fbb.CreateString(code_string) : 0; return FlatGeobuf::CreateCrs( _fbb, org__, code, name__, description__, wkt__, code_string__); } struct Header FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef HeaderBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_ENVELOPE = 6, VT_GEOMETRY_TYPE = 8, VT_HAS_Z = 10, VT_HAS_M = 12, VT_HAS_T = 14, VT_HAS_TM = 16, VT_COLUMNS = 18, VT_FEATURES_COUNT = 20, VT_INDEX_NODE_SIZE = 22, VT_CRS = 24, VT_TITLE = 26, VT_DESCRIPTION = 28, VT_METADATA = 30 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } const flatbuffers::Vector *envelope() const { return GetPointer *>(VT_ENVELOPE); } FlatGeobuf::GeometryType geometry_type() const { return static_cast(GetField(VT_GEOMETRY_TYPE, 0)); } bool has_z() const { return GetField(VT_HAS_Z, 0) != 0; } bool has_m() const { return GetField(VT_HAS_M, 0) != 0; } bool has_t() const { return GetField(VT_HAS_T, 0) != 0; } bool has_tm() const { return GetField(VT_HAS_TM, 0) != 0; } const flatbuffers::Vector> *columns() const { return GetPointer> *>(VT_COLUMNS); } uint64_t features_count() const { return GetField(VT_FEATURES_COUNT, 0); } uint16_t index_node_size() const { return GetField(VT_INDEX_NODE_SIZE, 16); } const FlatGeobuf::Crs *crs() const { return GetPointer(VT_CRS); } const flatbuffers::String *title() const { return GetPointer(VT_TITLE); } const flatbuffers::String *description() const { return GetPointer(VT_DESCRIPTION); } const flatbuffers::String *metadata() const { return GetPointer(VT_METADATA); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffset(verifier, VT_ENVELOPE) && verifier.VerifyVector(envelope()) && VerifyField(verifier, VT_GEOMETRY_TYPE, 1) && VerifyField(verifier, VT_HAS_Z, 1) && VerifyField(verifier, VT_HAS_M, 1) && VerifyField(verifier, VT_HAS_T, 1) && VerifyField(verifier, VT_HAS_TM, 1) && VerifyOffset(verifier, VT_COLUMNS) && verifier.VerifyVector(columns()) && verifier.VerifyVectorOfTables(columns()) && VerifyField(verifier, VT_FEATURES_COUNT, 8) && VerifyField(verifier, VT_INDEX_NODE_SIZE, 2) && VerifyOffset(verifier, VT_CRS) && verifier.VerifyTable(crs()) && VerifyOffset(verifier, VT_TITLE) && verifier.VerifyString(title()) && VerifyOffset(verifier, VT_DESCRIPTION) && verifier.VerifyString(description()) && VerifyOffset(verifier, VT_METADATA) && verifier.VerifyString(metadata()) && verifier.EndTable(); } }; struct HeaderBuilder { typedef Header Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Header::VT_NAME, name); } void add_envelope(flatbuffers::Offset> envelope) { fbb_.AddOffset(Header::VT_ENVELOPE, envelope); } void add_geometry_type(FlatGeobuf::GeometryType geometry_type) { fbb_.AddElement(Header::VT_GEOMETRY_TYPE, static_cast(geometry_type), 0); } void add_has_z(bool has_z) { fbb_.AddElement(Header::VT_HAS_Z, static_cast(has_z), 0); } void add_has_m(bool has_m) { fbb_.AddElement(Header::VT_HAS_M, static_cast(has_m), 0); } void add_has_t(bool has_t) { fbb_.AddElement(Header::VT_HAS_T, static_cast(has_t), 0); } void add_has_tm(bool has_tm) { fbb_.AddElement(Header::VT_HAS_TM, static_cast(has_tm), 0); } void add_columns(flatbuffers::Offset>> columns) { fbb_.AddOffset(Header::VT_COLUMNS, columns); } void add_features_count(uint64_t features_count) { fbb_.AddElement(Header::VT_FEATURES_COUNT, features_count, 0); } void add_index_node_size(uint16_t index_node_size) { fbb_.AddElement(Header::VT_INDEX_NODE_SIZE, index_node_size, 16); } void add_crs(flatbuffers::Offset crs) { fbb_.AddOffset(Header::VT_CRS, crs); } void add_title(flatbuffers::Offset title) { fbb_.AddOffset(Header::VT_TITLE, title); } void add_description(flatbuffers::Offset description) { fbb_.AddOffset(Header::VT_DESCRIPTION, description); } void add_metadata(flatbuffers::Offset metadata) { fbb_.AddOffset(Header::VT_METADATA, metadata); } explicit HeaderBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset
Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset
(end); return o; } }; inline flatbuffers::Offset
CreateHeader( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset> envelope = 0, FlatGeobuf::GeometryType geometry_type = FlatGeobuf::GeometryType::Unknown, bool has_z = false, bool has_m = false, bool has_t = false, bool has_tm = false, flatbuffers::Offset>> columns = 0, uint64_t features_count = 0, uint16_t index_node_size = 16, flatbuffers::Offset crs = 0, flatbuffers::Offset title = 0, flatbuffers::Offset description = 0, flatbuffers::Offset metadata = 0) { HeaderBuilder builder_(_fbb); builder_.add_features_count(features_count); builder_.add_metadata(metadata); builder_.add_description(description); builder_.add_title(title); builder_.add_crs(crs); builder_.add_columns(columns); builder_.add_envelope(envelope); builder_.add_name(name); builder_.add_index_node_size(index_node_size); builder_.add_has_tm(has_tm); builder_.add_has_t(has_t); builder_.add_has_m(has_m); builder_.add_has_z(has_z); builder_.add_geometry_type(geometry_type); return builder_.Finish(); } inline flatbuffers::Offset
CreateHeaderDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, const std::vector *envelope = nullptr, FlatGeobuf::GeometryType geometry_type = FlatGeobuf::GeometryType::Unknown, bool has_z = false, bool has_m = false, bool has_t = false, bool has_tm = false, const std::vector> *columns = nullptr, uint64_t features_count = 0, uint16_t index_node_size = 16, flatbuffers::Offset crs = 0, const char *title = nullptr, const char *description = nullptr, const char *metadata = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto envelope__ = envelope ? _fbb.CreateVector(*envelope) : 0; auto columns__ = columns ? _fbb.CreateVector>(*columns) : 0; auto title__ = title ? _fbb.CreateString(title) : 0; auto description__ = description ? _fbb.CreateString(description) : 0; auto metadata__ = metadata ? _fbb.CreateString(metadata) : 0; return FlatGeobuf::CreateHeader( _fbb, name__, envelope__, geometry_type, has_z, has_m, has_t, has_tm, columns__, features_count, index_node_size, crs, title__, description__, metadata__); } inline const FlatGeobuf::Header *GetHeader(const void *buf) { return flatbuffers::GetRoot(buf); } inline const FlatGeobuf::Header *GetSizePrefixedHeader(const void *buf) { return flatbuffers::GetSizePrefixedRoot(buf); } inline bool VerifyHeaderBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer(nullptr); } inline bool VerifySizePrefixedHeaderBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifySizePrefixedBuffer(nullptr); } inline void FinishHeaderBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.Finish(root); } inline void FinishSizePrefixedHeaderBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.FinishSizePrefixed(root); } } // namespace FlatGeobuf } #endif // FLATBUFFERS_GENERATED_HEADER_FLATGEOBUF_H_ mapserver-8.4.0/src/flatgeobuf/include/000077500000000000000000000000001474174441300200705ustar00rootroot00000000000000mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/000077500000000000000000000000001474174441300223735ustar00rootroot00000000000000mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/LICENSE000066400000000000000000000261171474174441300234070ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2014 Google Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/allocator.h000066400000000000000000000051131474174441300245240ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_ALLOCATOR_H_ #define FLATBUFFERS_ALLOCATOR_H_ #include "flatbuffers/base.h" namespace mapserver { namespace flatbuffers { // Allocator interface. This is flatbuffers-specific and meant only for // `vector_downward` usage. class Allocator { public: virtual ~Allocator() {} // Allocate `size` bytes of memory. virtual uint8_t *allocate(size_t size) = 0; // Deallocate `size` bytes of memory at `p` allocated by this allocator. virtual void deallocate(uint8_t *p, size_t size) = 0; // Reallocate `new_size` bytes of memory, replacing the old region of size // `old_size` at `p`. In contrast to a normal realloc, this grows downwards, // and is intended specifcally for `vector_downward` use. // `in_use_back` and `in_use_front` indicate how much of `old_size` is // actually in use at each end, and needs to be copied. virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front) { FLATBUFFERS_ASSERT(new_size > old_size); // vector_downward only grows uint8_t *new_p = allocate(new_size); memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, in_use_front); deallocate(old_p, old_size); return new_p; } protected: // Called by `reallocate_downward` to copy memory from `old_p` of `old_size` // to `new_p` of `new_size`. Only memory of size `in_use_front` and // `in_use_back` will be copied from the front and back of the old memory // allocation. void memcpy_downward(uint8_t *old_p, size_t old_size, uint8_t *new_p, size_t new_size, size_t in_use_back, size_t in_use_front) { memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back, in_use_back); memcpy(new_p, old_p, in_use_front); } }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_ALLOCATOR_H_mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/array.h000066400000000000000000000211621474174441300236640ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_ARRAY_H_ #define FLATBUFFERS_ARRAY_H_ #include "flatbuffers/base.h" #include "flatbuffers/stl_emulation.h" #include "flatbuffers/vector.h" namespace mapserver { namespace flatbuffers { // This is used as a helper type for accessing arrays. template class Array { // Array can carry only POD data types (scalars or structs). typedef typename flatbuffers::bool_constant::value> scalar_tag; typedef typename flatbuffers::conditional::type IndirectHelperType; public: typedef uint16_t size_type; typedef typename IndirectHelper::return_type return_type; typedef VectorIterator const_iterator; typedef VectorReverseIterator const_reverse_iterator; // If T is a LE-scalar or a struct (!scalar_tag::value). static FLATBUFFERS_CONSTEXPR bool is_span_observable = (scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1)) || !scalar_tag::value; FLATBUFFERS_CONSTEXPR uint16_t size() const { return length; } return_type Get(uoffset_t i) const { FLATBUFFERS_ASSERT(i < size()); return IndirectHelper::Read(Data(), i); } return_type operator[](uoffset_t i) const { return Get(i); } // If this is a Vector of enums, T will be its storage type, not the enum // type. This function makes it convenient to retrieve value with enum // type E. template E GetEnum(uoffset_t i) const { return static_cast(Get(i)); } const_iterator begin() const { return const_iterator(Data(), 0); } const_iterator end() const { return const_iterator(Data(), size()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } const_iterator cbegin() const { return begin(); } const_iterator cend() const { return end(); } const_reverse_iterator crbegin() const { return rbegin(); } const_reverse_iterator crend() const { return rend(); } // Get a mutable pointer to elements inside this array. // This method used to mutate arrays of structs followed by a @p Mutate // operation. For primitive types use @p Mutate directly. // @warning Assignments and reads to/from the dereferenced pointer are not // automatically converted to the correct endianness. typename flatbuffers::conditional::type GetMutablePointer(uoffset_t i) const { FLATBUFFERS_ASSERT(i < size()); return const_cast(&data()[i]); } // Change elements if you have a non-const pointer to this object. void Mutate(uoffset_t i, const T &val) { MutateImpl(scalar_tag(), i, val); } // The raw data in little endian format. Use with care. const uint8_t *Data() const { return data_; } uint8_t *Data() { return data_; } // Similarly, but typed, much like std::vector::data const T *data() const { return reinterpret_cast(Data()); } T *data() { return reinterpret_cast(Data()); } // Copy data from a span with endian conversion. // If this Array and the span overlap, the behavior is undefined. void CopyFromSpan(flatbuffers::span src) { const auto p1 = reinterpret_cast(src.data()); const auto p2 = Data(); FLATBUFFERS_ASSERT(!(p1 >= p2 && p1 < (p2 + length)) && !(p2 >= p1 && p2 < (p1 + length))); (void)p1; (void)p2; CopyFromSpanImpl(flatbuffers::bool_constant(), src); } protected: void MutateImpl(flatbuffers::true_type, uoffset_t i, const T &val) { FLATBUFFERS_ASSERT(i < size()); WriteScalar(data() + i, val); } void MutateImpl(flatbuffers::false_type, uoffset_t i, const T &val) { *(GetMutablePointer(i)) = val; } void CopyFromSpanImpl(flatbuffers::true_type, flatbuffers::span src) { // Use std::memcpy() instead of std::copy() to avoid performance degradation // due to aliasing if T is char or unsigned char. // The size is known at compile time, so memcpy would be inlined. std::memcpy(data(), src.data(), length * sizeof(T)); } // Copy data from flatbuffers::span with endian conversion. void CopyFromSpanImpl(flatbuffers::false_type, flatbuffers::span src) { for (size_type k = 0; k < length; k++) { Mutate(k, src[k]); } } // This class is only used to access pre-existing data. Don't ever // try to construct these manually. // 'constexpr' allows us to use 'size()' at compile time. // @note Must not use 'FLATBUFFERS_CONSTEXPR' here, as const is not allowed on // a constructor. #if defined(__cpp_constexpr) constexpr Array(); #else Array(); #endif uint8_t data_[length * sizeof(T)]; private: // This class is a pointer. Copying will therefore create an invalid object. // Private and unimplemented copy constructor. Array(const Array &); Array &operator=(const Array &); }; // Specialization for Array[struct] with access using Offset pointer. // This specialization used by idl_gen_text.cpp. template class Array, length> { static_assert(flatbuffers::is_same::value, "unexpected type T"); public: typedef const void *return_type; const uint8_t *Data() const { return data_; } // Make idl_gen_text.cpp::PrintContainer happy. return_type operator[](uoffset_t) const { FLATBUFFERS_ASSERT(false); return nullptr; } private: // This class is only used to access pre-existing data. Array(); Array(const Array &); Array &operator=(const Array &); uint8_t data_[1]; }; template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(Array &arr) FLATBUFFERS_NOEXCEPT { static_assert( Array::is_span_observable, "wrong type U, only plain struct, LE-scalar, or byte types are allowed"); return span(arr.data(), N); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span( const Array &arr) FLATBUFFERS_NOEXCEPT { static_assert( Array::is_span_observable, "wrong type U, only plain struct, LE-scalar, or byte types are allowed"); return span(arr.data(), N); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_bytes_span(Array &arr) FLATBUFFERS_NOEXCEPT { static_assert(Array::is_span_observable, "internal error, Array might hold only scalars or structs"); return span(arr.Data(), sizeof(U) * N); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_bytes_span(const Array &arr) FLATBUFFERS_NOEXCEPT { static_assert(Array::is_span_observable, "internal error, Array might hold only scalars or structs"); return span(arr.Data(), sizeof(U) * N); } // Cast a raw T[length] to a raw flatbuffers::Array // without endian conversion. Use with care. // TODO: move these Cast-methods to `internal` namespace. template Array &CastToArray(T (&arr)[length]) { return *reinterpret_cast *>(arr); } template const Array &CastToArray(const T (&arr)[length]) { return *reinterpret_cast *>(arr); } template Array &CastToArrayOfEnum(T (&arr)[length]) { static_assert(sizeof(E) == sizeof(T), "invalid enum type E"); return *reinterpret_cast *>(arr); } template const Array &CastToArrayOfEnum(const T (&arr)[length]) { static_assert(sizeof(E) == sizeof(T), "invalid enum type E"); return *reinterpret_cast *>(arr); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_ARRAY_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/base.h000066400000000000000000000403561474174441300234660ustar00rootroot00000000000000#ifndef FLATBUFFERS_BASE_H_ #define FLATBUFFERS_BASE_H_ // clang-format off // If activate should be declared and included first. #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \ defined(_MSC_VER) && defined(_DEBUG) // The _CRTDBG_MAP_ALLOC inside will replace // calloc/free (etc) to its debug version using #define directives. #define _CRTDBG_MAP_ALLOC #include #include // Replace operator new by trace-enabled version. #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) #define new DEBUG_NEW #endif #if !defined(FLATBUFFERS_ASSERT) #include #define FLATBUFFERS_ASSERT assert #elif defined(FLATBUFFERS_ASSERT_INCLUDE) // Include file with forward declaration #include FLATBUFFERS_ASSERT_INCLUDE #endif #ifndef ARDUINO #include #endif #include #include #include #if defined(ARDUINO) && !defined(ARDUINOSTL_M_H) #include #else #include #endif #include #include #include #include #include #include #include #if defined(__unix__) && !defined(FLATBUFFERS_LOCALE_INDEPENDENT) #include #endif #ifdef __ANDROID__ #include #endif #if defined(__ICCARM__) #include #endif // Note the __clang__ check is needed, because clang presents itself // as an older GNUC compiler (4.2). // Clang 3.3 and later implement all of the ISO C++ 2011 standard. // Clang 3.4 and later implement all of the ISO C++ 2014 standard. // http://clang.llvm.org/cxx_status.html // Note the MSVC value '__cplusplus' may be incorrect: // The '__cplusplus' predefined macro in the MSVC stuck at the value 199711L, // indicating (erroneously!) that the compiler conformed to the C++98 Standard. // This value should be correct starting from MSVC2017-15.7-Preview-3. // The '__cplusplus' will be valid only if MSVC2017-15.7-P3 and the `/Zc:__cplusplus` switch is set. // Workaround (for details see MSDN): // Use the _MSC_VER and _MSVC_LANG definition instead of the __cplusplus for compatibility. // The _MSVC_LANG macro reports the Standard version regardless of the '/Zc:__cplusplus' switch. #if defined(__GNUC__) && !defined(__clang__) #define FLATBUFFERS_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #else #define FLATBUFFERS_GCC 0 #endif #if defined(__clang__) #define FLATBUFFERS_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) #else #define FLATBUFFERS_CLANG 0 #endif /// @cond FLATBUFFERS_INTERNAL #if __cplusplus <= 199711L && \ (!defined(_MSC_VER) || _MSC_VER < 1600) && \ (!defined(__GNUC__) || \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40400)) #error A C++11 compatible compiler with support for the auto typing is \ required for FlatBuffers. #error __cplusplus _MSC_VER __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ #endif #if !defined(__clang__) && \ defined(__GNUC__) && \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40600) // Backwards compatibility for g++ 4.4, and 4.5 which don't have the nullptr // and constexpr keywords. Note the __clang__ check is needed, because clang // presents itself as an older GNUC compiler. #ifndef nullptr_t const class nullptr_t { public: template inline operator T*() const { return 0; } private: void operator&() const; } nullptr = {}; #endif #ifndef constexpr #define constexpr const #endif #endif // The wire format uses a little endian encoding (since that's efficient for // the common platforms). #if defined(__s390x__) #define FLATBUFFERS_LITTLEENDIAN 0 #endif // __s390x__ #if !defined(FLATBUFFERS_LITTLEENDIAN) #if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) #if (defined(__BIG_ENDIAN__) || \ (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) #define FLATBUFFERS_LITTLEENDIAN 0 #else #define FLATBUFFERS_LITTLEENDIAN 1 #endif // __BIG_ENDIAN__ #elif defined(_MSC_VER) #if defined(_M_PPC) #define FLATBUFFERS_LITTLEENDIAN 0 #else #define FLATBUFFERS_LITTLEENDIAN 1 #endif #else #error Unable to determine endianness, define FLATBUFFERS_LITTLEENDIAN. #endif #endif // !defined(FLATBUFFERS_LITTLEENDIAN) #define FLATBUFFERS_VERSION_MAJOR 2 #define FLATBUFFERS_VERSION_MINOR 0 #define FLATBUFFERS_VERSION_REVISION 6 #define FLATBUFFERS_STRING_EXPAND(X) #X #define FLATBUFFERS_STRING(X) FLATBUFFERS_STRING_EXPAND(X) namespace mapserver { namespace flatbuffers { // Returns version as string "MAJOR.MINOR.REVISION". const char* FLATBUFFERS_VERSION(); } } #if (!defined(_MSC_VER) || _MSC_VER > 1600) && \ (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 407)) || \ defined(__clang__) #define FLATBUFFERS_FINAL_CLASS final #define FLATBUFFERS_OVERRIDE override #define FLATBUFFERS_EXPLICIT_CPP11 explicit #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE : flatbuffers::voffset_t #else #define FLATBUFFERS_FINAL_CLASS #define FLATBUFFERS_OVERRIDE #define FLATBUFFERS_EXPLICIT_CPP11 #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE #endif #if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ (defined(__cpp_constexpr) && __cpp_constexpr >= 200704) #define FLATBUFFERS_CONSTEXPR constexpr #define FLATBUFFERS_CONSTEXPR_CPP11 constexpr #define FLATBUFFERS_CONSTEXPR_DEFINED #else #define FLATBUFFERS_CONSTEXPR const #define FLATBUFFERS_CONSTEXPR_CPP11 #endif #if (defined(__cplusplus) && __cplusplus >= 201402L) || \ (defined(__cpp_constexpr) && __cpp_constexpr >= 201304) #define FLATBUFFERS_CONSTEXPR_CPP14 FLATBUFFERS_CONSTEXPR_CPP11 #else #define FLATBUFFERS_CONSTEXPR_CPP14 #endif #if (defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023026)) || \ defined(__clang__) #define FLATBUFFERS_NOEXCEPT noexcept #else #define FLATBUFFERS_NOEXCEPT #endif // NOTE: the FLATBUFFERS_DELETE_FUNC macro may change the access mode to // private, so be sure to put it at the end or reset access mode explicitly. #if (!defined(_MSC_VER) || _MSC_FULL_VER >= 180020827) && \ (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)) || \ defined(__clang__) #define FLATBUFFERS_DELETE_FUNC(func) func = delete #else #define FLATBUFFERS_DELETE_FUNC(func) private: func #endif #if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \ defined(__clang__) #define FLATBUFFERS_DEFAULT_DECLARATION #endif // Check if we can use template aliases // Not possible if Microsoft Compiler before 2012 // Possible is the language feature __cpp_alias_templates is defined well // Or possible if the C++ std is C+11 or newer #if (defined(_MSC_VER) && _MSC_VER > 1700 /* MSVC2012 */) \ || (defined(__cpp_alias_templates) && __cpp_alias_templates >= 200704) \ || (defined(__cplusplus) && __cplusplus >= 201103L) #define FLATBUFFERS_TEMPLATES_ALIASES #endif #ifndef FLATBUFFERS_HAS_STRING_VIEW // Only provide flatbuffers::string_view if __has_include can be used // to detect a header that provides an implementation #if defined(__has_include) // Check for std::string_view (in c++17) #if __has_include() && (__cplusplus >= 201606 || (defined(_HAS_CXX17) && _HAS_CXX17)) #include namespace mapserver { namespace flatbuffers { typedef std::string_view string_view; } } #define FLATBUFFERS_HAS_STRING_VIEW 1 // Check for std::experimental::string_view (in c++14, compiler-dependent) #elif __has_include() && (__cplusplus >= 201411) #include namespace mapserver { namespace flatbuffers { typedef std::experimental::string_view string_view; } } #define FLATBUFFERS_HAS_STRING_VIEW 1 // Check for absl::string_view #elif __has_include("absl/strings/string_view.h") && (__cplusplus >= 201411) #include "absl/strings/string_view.h" namespace mapserver { namespace flatbuffers { typedef absl::string_view string_view; } } #define FLATBUFFERS_HAS_STRING_VIEW 1 #endif #endif // __has_include #endif // !FLATBUFFERS_HAS_STRING_VIEW #ifndef FLATBUFFERS_GENERAL_HEAP_ALLOC_OK // Allow heap allocations to be used #define FLATBUFFERS_GENERAL_HEAP_ALLOC_OK 1 #endif // !FLATBUFFERS_GENERAL_HEAP_ALLOC_OK #ifndef FLATBUFFERS_HAS_NEW_STRTOD // Modern (C++11) strtod and strtof functions are available for use. // 1) nan/inf strings as argument of strtod; // 2) hex-float as argument of strtod/strtof. #if (defined(_MSC_VER) && _MSC_VER >= 1900) || \ (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \ (defined(__clang__)) #define FLATBUFFERS_HAS_NEW_STRTOD 1 #endif #endif // !FLATBUFFERS_HAS_NEW_STRTOD #ifndef FLATBUFFERS_LOCALE_INDEPENDENT // Enable locale independent functions {strtof_l, strtod_l,strtoll_l, strtoull_l}. #if ((defined(_MSC_VER) && _MSC_VER >= 1800) || \ (defined(_XOPEN_VERSION) && (_XOPEN_VERSION>=700)) && (!defined(__ANDROID_API__) || (defined(__ANDROID_API__) && (__ANDROID_API__>=21)))) #define FLATBUFFERS_LOCALE_INDEPENDENT 1 #else #define FLATBUFFERS_LOCALE_INDEPENDENT 0 #endif #endif // !FLATBUFFERS_LOCALE_INDEPENDENT // Suppress Undefined Behavior Sanitizer (recoverable only). Usage: // - __supress_ubsan__("undefined") // - __supress_ubsan__("signed-integer-overflow") #if defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >=7)) #define __supress_ubsan__(type) __attribute__((no_sanitize(type))) #elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409) #define __supress_ubsan__(type) __attribute__((no_sanitize_undefined)) #else #define __supress_ubsan__(type) #endif // This is constexpr function used for checking compile-time constants. // Avoid `#pragma warning(disable: 4127) // C4127: expression is constant`. template FLATBUFFERS_CONSTEXPR inline bool IsConstTrue(T t) { return !!t; } // Enable C++ attribute [[]] if std:c++17 or higher. #if ((__cplusplus >= 201703L) \ || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L))) // All attributes unknown to an implementation are ignored without causing an error. #define FLATBUFFERS_ATTRIBUTE(attr) attr #define FLATBUFFERS_FALLTHROUGH() [[fallthrough]] #else #define FLATBUFFERS_ATTRIBUTE(attr) #if FLATBUFFERS_CLANG >= 30800 #define FLATBUFFERS_FALLTHROUGH() [[clang::fallthrough]] #elif FLATBUFFERS_GCC >= 70300 #define FLATBUFFERS_FALLTHROUGH() [[gnu::fallthrough]] #else #define FLATBUFFERS_FALLTHROUGH() #endif #endif /// @endcond /// @file namespace mapserver { namespace flatbuffers { /// @cond FLATBUFFERS_INTERNAL // Our default offset / size type, 32bit on purpose on 64bit systems. // Also, using a consistent offset type maintains compatibility of serialized // offset values between 32bit and 64bit systems. typedef uint32_t uoffset_t; // Signed offsets for references that can go in both directions. typedef int32_t soffset_t; // Offset/index used in v-tables, can be changed to uint8_t in // format forks to save a bit of space if desired. typedef uint16_t voffset_t; typedef uintmax_t largest_scalar_t; // In 32bits, this evaluates to 2GB - 1 #define FLATBUFFERS_MAX_BUFFER_SIZE ((1ULL << (sizeof(::mapserver::flatbuffers::soffset_t) * 8 - 1)) - 1) // We support aligning the contents of buffers up to this size. #ifndef FLATBUFFERS_MAX_ALIGNMENT #define FLATBUFFERS_MAX_ALIGNMENT 32 #endif /// @brief The length of a FlatBuffer file header. static const size_t kFileIdentifierLength = 4; inline bool VerifyAlignmentRequirements(size_t align, size_t min_align = 1) { return (min_align <= align) && (align <= (FLATBUFFERS_MAX_ALIGNMENT)) && (align & (align - 1)) == 0; // must be power of 2 } #if defined(_MSC_VER) #pragma warning(disable: 4351) // C4351: new behavior: elements of array ... will be default initialized #pragma warning(push) #pragma warning(disable: 4127) // C4127: conditional expression is constant #endif template T EndianSwap(T t) { #if defined(_MSC_VER) #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64 #elif defined(__ICCARM__) #define FLATBUFFERS_BYTESWAP16 __REV16 #define FLATBUFFERS_BYTESWAP32 __REV #define FLATBUFFERS_BYTESWAP64(x) \ ((__REV(static_cast(x >> 32U))) | (static_cast(__REV(static_cast(x)))) << 32U) #else #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 && !defined(__clang__) // __builtin_bswap16 was missing prior to GCC 4.8. #define FLATBUFFERS_BYTESWAP16(x) \ static_cast(__builtin_bswap32(static_cast(x) << 16)) #else #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16 #endif #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32 #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64 #endif if (sizeof(T) == 1) { // Compile-time if-then's. return t; } else if (sizeof(T) == 2) { union { T t; uint16_t i; } u = { t }; u.i = FLATBUFFERS_BYTESWAP16(u.i); return u.t; } else if (sizeof(T) == 4) { union { T t; uint32_t i; } u = { t }; u.i = FLATBUFFERS_BYTESWAP32(u.i); return u.t; } else if (sizeof(T) == 8) { union { T t; uint64_t i; } u = { t }; u.i = FLATBUFFERS_BYTESWAP64(u.i); return u.t; } else { FLATBUFFERS_ASSERT(0); return t; } } #if defined(_MSC_VER) #pragma warning(pop) #endif template T EndianScalar(T t) { #if FLATBUFFERS_LITTLEENDIAN return t; #else return EndianSwap(t); #endif } template // UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. __supress_ubsan__("alignment") T ReadScalar(const void *p) { return EndianScalar(*reinterpret_cast(p)); } // See https://github.com/google/flatbuffers/issues/5950 #if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstringop-overflow" #endif template // UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. __supress_ubsan__("alignment") void WriteScalar(void *p, T t) { *reinterpret_cast(p) = EndianScalar(t); } template struct Offset; template __supress_ubsan__("alignment") void WriteScalar(void *p, Offset t) { *reinterpret_cast(p) = EndianScalar(t.o); } #if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000) #pragma GCC diagnostic pop #endif // Computes how many bytes you'd have to pad to be able to write an // "scalar_size" scalar if the buffer had grown to "buf_size" (downwards in // memory). __supress_ubsan__("unsigned-integer-overflow") inline size_t PaddingBytes(size_t buf_size, size_t scalar_size) { return ((~buf_size) + 1) & (scalar_size - 1); } // Generic 'operator==' with conditional specialisations. // T e - new value of a scalar field. // T def - default of scalar (is known at compile-time). template inline bool IsTheSameAs(T e, T def) { return e == def; } #if defined(FLATBUFFERS_NAN_DEFAULTS) && \ defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0) // Like `operator==(e, def)` with weak NaN if T=(float|double). template inline bool IsFloatTheSameAs(T e, T def) { return (e == def) || ((def != def) && (e != e)); } template<> inline bool IsTheSameAs(float e, float def) { return IsFloatTheSameAs(e, def); } template<> inline bool IsTheSameAs(double e, double def) { return IsFloatTheSameAs(e, def); } #endif // Check 'v' is out of closed range [low; high]. // Workaround for GCC warning [-Werror=type-limits]: // comparison is always true due to limited range of data type. template inline bool IsOutRange(const T &v, const T &low, const T &high) { return (v < low) || (high < v); } // Check 'v' is in closed range [low; high]. template inline bool IsInRange(const T &v, const T &low, const T &high) { return !IsOutRange(v, low, high); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_BASE_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/bfbs_generator.h000066400000000000000000000024141474174441300255270ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_BFBS_GENERATOR_H_ #define FLATBUFFERS_BFBS_GENERATOR_H_ #include namespace mapserver { namespace flatbuffers { enum GeneratorStatus { OK, FAILED, FAILED_VERIFICATION, }; // A Flatbuffer Code Generator that receives a binary serialized reflection.fbs // and generates code from it. class BfbsGenerator { public: virtual ~BfbsGenerator() {} // Generate code from the provided `buffer` of given `length`. The buffer is // a serialized reflection.fbs. virtual GeneratorStatus Generate(const uint8_t *buffer, int64_t length) = 0; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_BFBS_GENERATOR_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/buffer.h000066400000000000000000000122211474174441300240130ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_BUFFER_H_ #define FLATBUFFERS_BUFFER_H_ #include "flatbuffers/base.h" namespace mapserver { namespace flatbuffers { // Wrapper for uoffset_t to allow safe template specialization. // Value is allowed to be 0 to indicate a null object (see e.g. AddOffset). template struct Offset { uoffset_t o; Offset() : o(0) {} Offset(uoffset_t _o) : o(_o) {} Offset Union() const { return Offset(o); } bool IsNull() const { return !o; } }; inline void EndianCheck() { int endiantest = 1; // If this fails, see FLATBUFFERS_LITTLEENDIAN above. FLATBUFFERS_ASSERT(*reinterpret_cast(&endiantest) == FLATBUFFERS_LITTLEENDIAN); (void)endiantest; } template FLATBUFFERS_CONSTEXPR size_t AlignOf() { // clang-format off #ifdef _MSC_VER return __alignof(T); #else #ifndef alignof return __alignof__(T); #else return alignof(T); #endif #endif // clang-format on } // Lexicographically compare two strings (possibly containing nulls), and // return true if the first is less than the second. static inline bool StringLessThan(const char *a_data, uoffset_t a_size, const char *b_data, uoffset_t b_size) { const auto cmp = memcmp(a_data, b_data, (std::min)(a_size, b_size)); return cmp == 0 ? a_size < b_size : cmp < 0; } // When we read serialized data from memory, in the case of most scalars, // we want to just read T, but in the case of Offset, we want to actually // perform the indirection and return a pointer. // The template specialization below does just that. // It is wrapped in a struct since function templates can't overload on the // return type like this. // The typedef is for the convenience of callers of this function // (avoiding the need for a trailing return decltype) template struct IndirectHelper { typedef T return_type; typedef T mutable_return_type; static const size_t element_stride = sizeof(T); static return_type Read(const uint8_t *p, uoffset_t i) { return EndianScalar((reinterpret_cast(p))[i]); } }; template struct IndirectHelper> { typedef const T *return_type; typedef T *mutable_return_type; static const size_t element_stride = sizeof(uoffset_t); static return_type Read(const uint8_t *p, uoffset_t i) { p += i * sizeof(uoffset_t); return reinterpret_cast(p + ReadScalar(p)); } }; template struct IndirectHelper { typedef const T *return_type; typedef T *mutable_return_type; static const size_t element_stride = sizeof(T); static return_type Read(const uint8_t *p, uoffset_t i) { return reinterpret_cast(p + i * sizeof(T)); } }; /// @brief Get a pointer to the the file_identifier section of the buffer. /// @return Returns a const char pointer to the start of the file_identifier /// characters in the buffer. The returned char * has length /// 'flatbuffers::FlatBufferBuilder::kFileIdentifierLength'. /// This function is UNDEFINED for FlatBuffers whose schema does not include /// a file_identifier (likely points at padding or the start of a the root /// vtable). inline const char *GetBufferIdentifier(const void *buf, bool size_prefixed = false) { return reinterpret_cast(buf) + ((size_prefixed) ? 2 * sizeof(uoffset_t) : sizeof(uoffset_t)); } // Helper to see if the identifier in a buffer has the expected value. inline bool BufferHasIdentifier(const void *buf, const char *identifier, bool size_prefixed = false) { return strncmp(GetBufferIdentifier(buf, size_prefixed), identifier, flatbuffers::kFileIdentifierLength) == 0; } /// @cond FLATBUFFERS_INTERNAL // Helpers to get a typed pointer to the root object contained in the buffer. template T *GetMutableRoot(void *buf) { EndianCheck(); return reinterpret_cast( reinterpret_cast(buf) + EndianScalar(*reinterpret_cast(buf))); } template T *GetMutableSizePrefixedRoot(void *buf) { return GetMutableRoot(reinterpret_cast(buf) + sizeof(uoffset_t)); } template const T *GetRoot(const void *buf) { return GetMutableRoot(const_cast(buf)); } template const T *GetSizePrefixedRoot(const void *buf) { return GetRoot(reinterpret_cast(buf) + sizeof(uoffset_t)); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_BUFFER_H_mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/buffer_ref.h000066400000000000000000000030261474174441300246520ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_BUFFER_REF_H_ #define FLATBUFFERS_BUFFER_REF_H_ #include "flatbuffers/base.h" #include "flatbuffers/verifier.h" namespace mapserver { namespace flatbuffers { // Convenient way to bundle a buffer and its length, to pass it around // typed by its root. // A BufferRef does not own its buffer. struct BufferRefBase {}; // for std::is_base_of template struct BufferRef : BufferRefBase { BufferRef() : buf(nullptr), len(0), must_free(false) {} BufferRef(uint8_t *_buf, uoffset_t _len) : buf(_buf), len(_len), must_free(false) {} ~BufferRef() { if (must_free) free(buf); } const T *GetRoot() const { return flatbuffers::GetRoot(buf); } bool Verify() { Verifier verifier(buf, len); return verifier.VerifyBuffer(nullptr); } uint8_t *buf; uoffset_t len; bool must_free; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_BUFFER_REF_H_mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/code_generators.h000066400000000000000000000176251474174441300257220ustar00rootroot00000000000000/* * Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_CODE_GENERATORS_H_ #define FLATBUFFERS_CODE_GENERATORS_H_ #include #include #include "flatbuffers/idl.h" namespace mapserver { namespace flatbuffers { // Utility class to assist in generating code through use of text templates. // // Example code: // CodeWriter code("\t"); // code.SetValue("NAME", "Foo"); // code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; // code.SetValue("NAME", "Bar"); // code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; // std::cout << code.ToString() << std::endl; // // Output: // void Foo() { printf("%s", "Foo"); } // void Bar() { printf("%s", "Bar"); } class CodeWriter { public: CodeWriter(std::string pad = std::string()) : pad_(pad), cur_ident_lvl_(0), ignore_ident_(false) {} // Clears the current "written" code. void Clear() { stream_.str(""); stream_.clear(); } // Associates a key with a value. All subsequent calls to operator+=, where // the specified key is contained in {{ and }} delimiters will be replaced by // the given value. void SetValue(const std::string &key, const std::string &value) { value_map_[key] = value; } std::string GetValue(const std::string &key) const { const auto it = value_map_.find(key); return it == value_map_.end() ? "" : it->second; } // Appends the given text to the generated code as well as a newline // character. Any text within {{ and }} delimiters is replaced by values // previously stored in the CodeWriter by calling SetValue above. The newline // will be suppressed if the text ends with the \\ character. void operator+=(std::string text); // Returns the current contents of the CodeWriter as a std::string. std::string ToString() const { return stream_.str(); } // Increase ident level for writing code void IncrementIdentLevel() { cur_ident_lvl_++; } // Decrease ident level for writing code void DecrementIdentLevel() { if (cur_ident_lvl_) cur_ident_lvl_--; } void SetPadding(const std::string &padding) { pad_ = padding; } private: std::map value_map_; std::stringstream stream_; std::string pad_; int cur_ident_lvl_; bool ignore_ident_; // Add ident padding (tab or space) based on ident level void AppendIdent(std::stringstream &stream); }; class BaseGenerator { public: virtual bool generate() = 0; static std::string NamespaceDir(const Parser &parser, const std::string &path, const Namespace &ns, const bool dasherize = false); std::string GeneratedFileName(const std::string &path, const std::string &file_name, const IDLOptions &options) const; protected: BaseGenerator(const Parser &parser, const std::string &path, const std::string &file_name, std::string qualifying_start, std::string qualifying_separator, std::string default_extension) : parser_(parser), path_(path), file_name_(file_name), qualifying_start_(qualifying_start), qualifying_separator_(qualifying_separator), default_extension_(default_extension) {} virtual ~BaseGenerator() {} // No copy/assign. BaseGenerator &operator=(const BaseGenerator &); BaseGenerator(const BaseGenerator &); std::string NamespaceDir(const Namespace &ns, const bool dasherize = false) const; static const char *FlatBuffersGeneratedWarning(); static std::string FullNamespace(const char *separator, const Namespace &ns); static std::string LastNamespacePart(const Namespace &ns); // tracks the current namespace for early exit in WrapInNameSpace // c++, java and csharp returns a different namespace from // the following default (no early exit, always fully qualify), // which works for js and php virtual const Namespace *CurrentNameSpace() const { return nullptr; } // Ensure that a type is prefixed with its namespace even within // its own namespace to avoid conflict between generated method // names and similarly named classes or structs std::string WrapInNameSpace(const Namespace *ns, const std::string &name) const; std::string WrapInNameSpace(const Definition &def) const; std::string GetNameSpace(const Definition &def) const; const Parser &parser_; const std::string &path_; const std::string &file_name_; const std::string qualifying_start_; const std::string qualifying_separator_; const std::string default_extension_; }; struct CommentConfig { const char *first_line; const char *content_line_prefix; const char *last_line; }; extern void GenComment(const std::vector &dc, std::string *code_ptr, const CommentConfig *config, const char *prefix = ""); class FloatConstantGenerator { public: virtual ~FloatConstantGenerator() {} std::string GenFloatConstant(const FieldDef &field) const; private: virtual std::string Value(double v, const std::string &src) const = 0; virtual std::string Inf(double v) const = 0; virtual std::string NaN(double v) const = 0; virtual std::string Value(float v, const std::string &src) const = 0; virtual std::string Inf(float v) const = 0; virtual std::string NaN(float v) const = 0; template std::string GenFloatConstantImpl(const FieldDef &field) const; }; class SimpleFloatConstantGenerator : public FloatConstantGenerator { public: SimpleFloatConstantGenerator(const char *nan_number, const char *pos_inf_number, const char *neg_inf_number); private: std::string Value(double v, const std::string &src) const FLATBUFFERS_OVERRIDE; std::string Inf(double v) const FLATBUFFERS_OVERRIDE; std::string NaN(double v) const FLATBUFFERS_OVERRIDE; std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; std::string Inf(float v) const FLATBUFFERS_OVERRIDE; std::string NaN(float v) const FLATBUFFERS_OVERRIDE; const std::string nan_number_; const std::string pos_inf_number_; const std::string neg_inf_number_; }; // C++, C#, Java like generator. class TypedFloatConstantGenerator : public FloatConstantGenerator { public: TypedFloatConstantGenerator(const char *double_prefix, const char *single_prefix, const char *nan_number, const char *pos_inf_number, const char *neg_inf_number = ""); private: std::string Value(double v, const std::string &src) const FLATBUFFERS_OVERRIDE; std::string Inf(double v) const FLATBUFFERS_OVERRIDE; std::string NaN(double v) const FLATBUFFERS_OVERRIDE; std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; std::string Inf(float v) const FLATBUFFERS_OVERRIDE; std::string NaN(float v) const FLATBUFFERS_OVERRIDE; std::string MakeNaN(const std::string &prefix) const; std::string MakeInf(bool neg, const std::string &prefix) const; const std::string double_prefix_; const std::string single_prefix_; const std::string nan_number_; const std::string pos_inf_number_; const std::string neg_inf_number_; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_CODE_GENERATORS_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/default_allocator.h000066400000000000000000000045741474174441300262420ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_DEFAULT_ALLOCATOR_H_ #define FLATBUFFERS_DEFAULT_ALLOCATOR_H_ #include "flatbuffers/allocator.h" #include "flatbuffers/base.h" namespace mapserver { namespace flatbuffers { // DefaultAllocator uses new/delete to allocate memory regions class DefaultAllocator : public Allocator { public: uint8_t *allocate(size_t size) FLATBUFFERS_OVERRIDE { return new uint8_t[size]; } void deallocate(uint8_t *p, size_t) FLATBUFFERS_OVERRIDE { delete[] p; } static void dealloc(void *p, size_t) { delete[] static_cast(p); } }; // These functions allow for a null allocator to mean use the default allocator, // as used by DetachedBuffer and vector_downward below. // This is to avoid having a statically or dynamically allocated default // allocator, or having to move it between the classes that may own it. inline uint8_t *Allocate(Allocator *allocator, size_t size) { return allocator ? allocator->allocate(size) : DefaultAllocator().allocate(size); } inline void Deallocate(Allocator *allocator, uint8_t *p, size_t size) { if (allocator) allocator->deallocate(p, size); else DefaultAllocator().deallocate(p, size); } inline uint8_t *ReallocateDownward(Allocator *allocator, uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front) { return allocator ? allocator->reallocate_downward(old_p, old_size, new_size, in_use_back, in_use_front) : DefaultAllocator().reallocate_downward( old_p, old_size, new_size, in_use_back, in_use_front); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_DEFAULT_ALLOCATOR_H_mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/detached_buffer.h000066400000000000000000000060271474174441300256430ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_DETACHED_BUFFER_H_ #define FLATBUFFERS_DETACHED_BUFFER_H_ #include "flatbuffers/allocator.h" #include "flatbuffers/base.h" #include "flatbuffers/default_allocator.h" namespace mapserver { namespace flatbuffers { // DetachedBuffer is a finished flatbuffer memory region, detached from its // builder. The original memory region and allocator are also stored so that // the DetachedBuffer can manage the memory lifetime. class DetachedBuffer { public: DetachedBuffer() : allocator_(nullptr), own_allocator_(false), buf_(nullptr), reserved_(0), cur_(nullptr), size_(0) {} DetachedBuffer(Allocator *allocator, bool own_allocator, uint8_t *buf, size_t reserved, uint8_t *cur, size_t sz) : allocator_(allocator), own_allocator_(own_allocator), buf_(buf), reserved_(reserved), cur_(cur), size_(sz) {} DetachedBuffer(DetachedBuffer &&other) : allocator_(other.allocator_), own_allocator_(other.own_allocator_), buf_(other.buf_), reserved_(other.reserved_), cur_(other.cur_), size_(other.size_) { other.reset(); } DetachedBuffer &operator=(DetachedBuffer &&other) { if (this == &other) return *this; destroy(); allocator_ = other.allocator_; own_allocator_ = other.own_allocator_; buf_ = other.buf_; reserved_ = other.reserved_; cur_ = other.cur_; size_ = other.size_; other.reset(); return *this; } ~DetachedBuffer() { destroy(); } const uint8_t *data() const { return cur_; } uint8_t *data() { return cur_; } size_t size() const { return size_; } // These may change access mode, leave these at end of public section FLATBUFFERS_DELETE_FUNC(DetachedBuffer(const DetachedBuffer &other)); FLATBUFFERS_DELETE_FUNC( DetachedBuffer &operator=(const DetachedBuffer &other)); protected: Allocator *allocator_; bool own_allocator_; uint8_t *buf_; size_t reserved_; uint8_t *cur_; size_t size_; inline void destroy() { if (buf_) Deallocate(allocator_, buf_, reserved_); if (own_allocator_ && allocator_) { delete allocator_; } reset(); } inline void reset() { allocator_ = nullptr; own_allocator_ = false; buf_ = nullptr; reserved_ = 0; cur_ = nullptr; size_ = 0; } }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_DETACHED_BUFFER_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/flatbuffer_builder.h000066400000000000000000001433471474174441300264060ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_FLATBUFFER_BUILDER_H_ #define FLATBUFFERS_FLATBUFFER_BUILDER_H_ #include #include #include "flatbuffers/allocator.h" #include "flatbuffers/array.h" #include "flatbuffers/base.h" #include "flatbuffers/buffer_ref.h" #include "flatbuffers/default_allocator.h" #include "flatbuffers/detached_buffer.h" #include "flatbuffers/stl_emulation.h" #include "flatbuffers/string.h" #include "flatbuffers/struct.h" #include "flatbuffers/table.h" #include "flatbuffers/vector.h" #include "flatbuffers/vector_downward.h" #include "flatbuffers/verifier.h" namespace mapserver { namespace flatbuffers { // Converts a Field ID to a virtual table offset. inline voffset_t FieldIndexToOffset(voffset_t field_id) { // Should correspond to what EndTable() below builds up. const int fixed_fields = 2; // Vtable size and Object Size. return static_cast((field_id + fixed_fields) * sizeof(voffset_t)); } template> const T *data(const std::vector &v) { // Eventually the returned pointer gets passed down to memcpy, so // we need it to be non-null to avoid undefined behavior. static uint8_t t; return v.empty() ? reinterpret_cast(&t) : &v.front(); } template> T *data(std::vector &v) { // Eventually the returned pointer gets passed down to memcpy, so // we need it to be non-null to avoid undefined behavior. static uint8_t t; return v.empty() ? reinterpret_cast(&t) : &v.front(); } /// @addtogroup flatbuffers_cpp_api /// @{ /// @class FlatBufferBuilder /// @brief Helper class to hold data needed in creation of a FlatBuffer. /// To serialize data, you typically call one of the `Create*()` functions in /// the generated code, which in turn call a sequence of `StartTable`/ /// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/ /// `CreateVector` functions. Do this is depth-first order to build up a tree to /// the root. `Finish()` wraps up the buffer ready for transport. class FlatBufferBuilder { public: /// @brief Default constructor for FlatBufferBuilder. /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults /// to `1024`. /// @param[in] allocator An `Allocator` to use. If null will use /// `DefaultAllocator`. /// @param[in] own_allocator Whether the builder/vector should own the /// allocator. Defaults to / `false`. /// @param[in] buffer_minalign Force the buffer to be aligned to the given /// minimum alignment upon reallocation. Only needed if you intend to store /// types with custom alignment AND you wish to read the buffer in-place /// directly after creation. explicit FlatBufferBuilder( size_t initial_size = 1024, Allocator *allocator = nullptr, bool own_allocator = false, size_t buffer_minalign = AlignOf()) : buf_(initial_size, allocator, own_allocator, buffer_minalign), num_field_loc(0), max_voffset_(0), nested(false), finished(false), minalign_(1), force_defaults_(false), dedup_vtables_(true), string_pool(nullptr) { EndianCheck(); } /// @brief Move constructor for FlatBufferBuilder. FlatBufferBuilder(FlatBufferBuilder &&other) : buf_(1024, nullptr, false, AlignOf()), num_field_loc(0), max_voffset_(0), nested(false), finished(false), minalign_(1), force_defaults_(false), dedup_vtables_(true), string_pool(nullptr) { EndianCheck(); // Default construct and swap idiom. // Lack of delegating constructors in vs2010 makes it more verbose than // needed. Swap(other); } /// @brief Move assignment operator for FlatBufferBuilder. FlatBufferBuilder &operator=(FlatBufferBuilder &&other) { // Move construct a temporary and swap idiom FlatBufferBuilder temp(std::move(other)); Swap(temp); return *this; } void Swap(FlatBufferBuilder &other) { using std::swap; buf_.swap(other.buf_); swap(num_field_loc, other.num_field_loc); swap(max_voffset_, other.max_voffset_); swap(nested, other.nested); swap(finished, other.finished); swap(minalign_, other.minalign_); swap(force_defaults_, other.force_defaults_); swap(dedup_vtables_, other.dedup_vtables_); swap(string_pool, other.string_pool); } ~FlatBufferBuilder() { if (string_pool) delete string_pool; } void Reset() { Clear(); // clear builder state buf_.reset(); // deallocate buffer } /// @brief Reset all the state in this FlatBufferBuilder so it can be reused /// to construct another buffer. void Clear() { ClearOffsets(); buf_.clear(); nested = false; finished = false; minalign_ = 1; if (string_pool) string_pool->clear(); } /// @brief The current size of the serialized buffer, counting from the end. /// @return Returns an `uoffset_t` with the current size of the buffer. uoffset_t GetSize() const { return buf_.size(); } /// @brief Get the serialized buffer (after you call `Finish()`). /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the /// buffer. uint8_t *GetBufferPointer() const { Finished(); return buf_.data(); } /// @brief Get the serialized buffer (after you call `Finish()`) as a span. /// @return Returns a constructed flatbuffers::span that is a view over the /// FlatBuffer data inside the buffer. flatbuffers::span GetBufferSpan() const { Finished(); return flatbuffers::span(buf_.data(), buf_.size()); } /// @brief Get a pointer to an unfinished buffer. /// @return Returns a `uint8_t` pointer to the unfinished buffer. uint8_t *GetCurrentBufferPointer() const { return buf_.data(); } /// @brief Get the released pointer to the serialized buffer. /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards! /// @return A `FlatBuffer` that owns the buffer and its allocator and /// behaves similar to a `unique_ptr` with a deleter. FLATBUFFERS_ATTRIBUTE([[deprecated("use Release() instead")]]) DetachedBuffer ReleaseBufferPointer() { Finished(); return buf_.release(); } /// @brief Get the released DetachedBuffer. /// @return A `DetachedBuffer` that owns the buffer and its allocator. DetachedBuffer Release() { Finished(); return buf_.release(); } /// @brief Get the released pointer to the serialized buffer. /// @param size The size of the memory block containing /// the serialized `FlatBuffer`. /// @param offset The offset from the released pointer where the finished /// `FlatBuffer` starts. /// @return A raw pointer to the start of the memory block containing /// the serialized `FlatBuffer`. /// @remark If the allocator is owned, it gets deleted when the destructor is /// called.. uint8_t *ReleaseRaw(size_t &size, size_t &offset) { Finished(); return buf_.release_raw(size, offset); } /// @brief get the minimum alignment this buffer needs to be accessed /// properly. This is only known once all elements have been written (after /// you call Finish()). You can use this information if you need to embed /// a FlatBuffer in some other buffer, such that you can later read it /// without first having to copy it into its own buffer. size_t GetBufferMinAlignment() const { Finished(); return minalign_; } /// @cond FLATBUFFERS_INTERNAL void Finished() const { // If you get this assert, you're attempting to get access a buffer // which hasn't been finished yet. Be sure to call // FlatBufferBuilder::Finish with your root table. // If you really need to access an unfinished buffer, call // GetCurrentBufferPointer instead. FLATBUFFERS_ASSERT(finished); } /// @endcond /// @brief In order to save space, fields that are set to their default value /// don't get serialized into the buffer. /// @param[in] fd When set to `true`, always serializes default values that /// are set. Optional fields which are not set explicitly, will still not be /// serialized. void ForceDefaults(bool fd) { force_defaults_ = fd; } /// @brief By default vtables are deduped in order to save space. /// @param[in] dedup When set to `true`, dedup vtables. void DedupVtables(bool dedup) { dedup_vtables_ = dedup; } /// @cond FLATBUFFERS_INTERNAL void Pad(size_t num_bytes) { buf_.fill(num_bytes); } void TrackMinAlign(size_t elem_size) { if (elem_size > minalign_) minalign_ = elem_size; } void Align(size_t elem_size) { TrackMinAlign(elem_size); buf_.fill(PaddingBytes(buf_.size(), elem_size)); } void PushFlatBuffer(const uint8_t *bytes, size_t size) { PushBytes(bytes, size); finished = true; } void PushBytes(const uint8_t *bytes, size_t size) { buf_.push(bytes, size); } void PopBytes(size_t amount) { buf_.pop(amount); } template void AssertScalarT() { // The code assumes power of 2 sizes and endian-swap-ability. static_assert(flatbuffers::is_scalar::value, "T must be a scalar type"); } // Write a single aligned scalar to the buffer template uoffset_t PushElement(T element) { AssertScalarT(); Align(sizeof(T)); buf_.push_small(EndianScalar(element)); return GetSize(); } template uoffset_t PushElement(Offset off) { // Special case for offsets: see ReferTo below. return PushElement(ReferTo(off.o)); } // When writing fields, we track where they are, so we can create correct // vtables later. void TrackField(voffset_t field, uoffset_t off) { FieldLoc fl = { off, field }; buf_.scratch_push_small(fl); num_field_loc++; if (field > max_voffset_) { max_voffset_ = field; } } // Like PushElement, but additionally tracks the field this represents. template void AddElement(voffset_t field, T e, T def) { // We don't serialize values equal to the default. if (IsTheSameAs(e, def) && !force_defaults_) return; TrackField(field, PushElement(e)); } template void AddElement(voffset_t field, T e) { TrackField(field, PushElement(e)); } template void AddOffset(voffset_t field, Offset off) { if (off.IsNull()) return; // Don't store. AddElement(field, ReferTo(off.o), static_cast(0)); } template void AddStruct(voffset_t field, const T *structptr) { if (!structptr) return; // Default, don't store. Align(AlignOf()); buf_.push_small(*structptr); TrackField(field, GetSize()); } void AddStructOffset(voffset_t field, uoffset_t off) { TrackField(field, off); } // Offsets initially are relative to the end of the buffer (downwards). // This function converts them to be relative to the current location // in the buffer (when stored here), pointing upwards. uoffset_t ReferTo(uoffset_t off) { // Align to ensure GetSize() below is correct. Align(sizeof(uoffset_t)); // Offset must refer to something already in buffer. const uoffset_t size = GetSize(); FLATBUFFERS_ASSERT(off && off <= size); return size - off + static_cast(sizeof(uoffset_t)); } void NotNested() { // If you hit this, you're trying to construct a Table/Vector/String // during the construction of its parent table (between the MyTableBuilder // and table.Finish(). // Move the creation of these sub-objects to above the MyTableBuilder to // not get this assert. // Ignoring this assert may appear to work in simple cases, but the reason // it is here is that storing objects in-line may cause vtable offsets // to not fit anymore. It also leads to vtable duplication. FLATBUFFERS_ASSERT(!nested); // If you hit this, fields were added outside the scope of a table. FLATBUFFERS_ASSERT(!num_field_loc); } // From generated code (or from the parser), we call StartTable/EndTable // with a sequence of AddElement calls in between. uoffset_t StartTable() { NotNested(); nested = true; return GetSize(); } // This finishes one serialized object by generating the vtable if it's a // table, comparing it against existing vtables, and writing the // resulting vtable offset. uoffset_t EndTable(uoffset_t start) { // If you get this assert, a corresponding StartTable wasn't called. FLATBUFFERS_ASSERT(nested); // Write the vtable offset, which is the start of any Table. // We fill it's value later. auto vtableoffsetloc = PushElement(0); // Write a vtable, which consists entirely of voffset_t elements. // It starts with the number of offsets, followed by a type id, followed // by the offsets themselves. In reverse: // Include space for the last offset and ensure empty tables have a // minimum size. max_voffset_ = (std::max)(static_cast(max_voffset_ + sizeof(voffset_t)), FieldIndexToOffset(0)); buf_.fill_big(max_voffset_); auto table_object_size = vtableoffsetloc - start; // Vtable use 16bit offsets. FLATBUFFERS_ASSERT(table_object_size < 0x10000); WriteScalar(buf_.data() + sizeof(voffset_t), static_cast(table_object_size)); WriteScalar(buf_.data(), max_voffset_); // Write the offsets into the table for (auto it = buf_.scratch_end() - num_field_loc * sizeof(FieldLoc); it < buf_.scratch_end(); it += sizeof(FieldLoc)) { auto field_location = reinterpret_cast(it); auto pos = static_cast(vtableoffsetloc - field_location->off); // If this asserts, it means you've set a field twice. FLATBUFFERS_ASSERT( !ReadScalar(buf_.data() + field_location->id)); WriteScalar(buf_.data() + field_location->id, pos); } ClearOffsets(); auto vt1 = reinterpret_cast(buf_.data()); auto vt1_size = ReadScalar(vt1); auto vt_use = GetSize(); // See if we already have generated a vtable with this exact same // layout before. If so, make it point to the old one, remove this one. if (dedup_vtables_) { for (auto it = buf_.scratch_data(); it < buf_.scratch_end(); it += sizeof(uoffset_t)) { auto vt_offset_ptr = reinterpret_cast(it); auto vt2 = reinterpret_cast(buf_.data_at(*vt_offset_ptr)); auto vt2_size = ReadScalar(vt2); if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size)) continue; vt_use = *vt_offset_ptr; buf_.pop(GetSize() - vtableoffsetloc); break; } } // If this is a new vtable, remember it. if (vt_use == GetSize()) { buf_.scratch_push_small(vt_use); } // Fill the vtable offset we created above. // The offset points from the beginning of the object to where the // vtable is stored. // Offsets default direction is downward in memory for future format // flexibility (storing all vtables at the start of the file). WriteScalar(buf_.data_at(vtableoffsetloc), static_cast(vt_use) - static_cast(vtableoffsetloc)); nested = false; return vtableoffsetloc; } FLATBUFFERS_ATTRIBUTE([[deprecated("call the version above instead")]]) uoffset_t EndTable(uoffset_t start, voffset_t /*numfields*/) { return EndTable(start); } // This checks a required field has been set in a given table that has // just been constructed. template void Required(Offset table, voffset_t field); uoffset_t StartStruct(size_t alignment) { Align(alignment); return GetSize(); } uoffset_t EndStruct() { return GetSize(); } void ClearOffsets() { buf_.scratch_pop(num_field_loc * sizeof(FieldLoc)); num_field_loc = 0; max_voffset_ = 0; } // Aligns such that when "len" bytes are written, an object can be written // after it with "alignment" without padding. void PreAlign(size_t len, size_t alignment) { if (len == 0) return; TrackMinAlign(alignment); buf_.fill(PaddingBytes(GetSize() + len, alignment)); } template void PreAlign(size_t len) { AssertScalarT(); PreAlign(len, sizeof(T)); } /// @endcond /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const char pointer to the data to be stored as a string. /// @param[in] len The number of bytes that should be stored from `str`. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(const char *str, size_t len) { NotNested(); PreAlign(len + 1); // Always 0-terminated. buf_.fill(1); PushBytes(reinterpret_cast(str), len); PushElement(static_cast(len)); return Offset(GetSize()); } /// @brief Store a string in the buffer, which is null-terminated. /// @param[in] str A const char pointer to a C-string to add to the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(const char *str) { return CreateString(str, strlen(str)); } /// @brief Store a string in the buffer, which is null-terminated. /// @param[in] str A char pointer to a C-string to add to the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(char *str) { return CreateString(str, strlen(str)); } /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const reference to a std::string to store in the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(const std::string &str) { return CreateString(str.c_str(), str.length()); } // clang-format off #ifdef FLATBUFFERS_HAS_STRING_VIEW /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const string_view to copy in to the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(flatbuffers::string_view str) { return CreateString(str.data(), str.size()); } #endif // FLATBUFFERS_HAS_STRING_VIEW // clang-format on /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const pointer to a `String` struct to add to the buffer. /// @return Returns the offset in the buffer where the string starts Offset CreateString(const String *str) { return str ? CreateString(str->c_str(), str->size()) : 0; } /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const reference to a std::string like type with support /// of T::c_str() and T::length() to store in the buffer. /// @return Returns the offset in the buffer where the string starts. template Offset CreateString(const T &str) { return CreateString(str.c_str(), str.length()); } /// @brief Store a string in the buffer, which can contain any binary data. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const char pointer to the data to be stored as a string. /// @param[in] len The number of bytes that should be stored from `str`. /// @return Returns the offset in the buffer where the string starts. Offset CreateSharedString(const char *str, size_t len) { FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK); if (!string_pool) string_pool = new StringOffsetMap(StringOffsetCompare(buf_)); auto size_before_string = buf_.size(); // Must first serialize the string, since the set is all offsets into // buffer. auto off = CreateString(str, len); auto it = string_pool->find(off); // If it exists we reuse existing serialized data! if (it != string_pool->end()) { // We can remove the string we serialized. buf_.pop(buf_.size() - size_before_string); return *it; } // Record this string for future use. string_pool->insert(off); return off; } #ifdef FLATBUFFERS_HAS_STRING_VIEW /// @brief Store a string in the buffer, which can contain any binary data. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const std::string_view to store in the buffer. /// @return Returns the offset in the buffer where the string starts Offset CreateSharedString(const flatbuffers::string_view str) { return CreateSharedString(str.data(), str.size()); } #else /// @brief Store a string in the buffer, which null-terminated. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const char pointer to a C-string to add to the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateSharedString(const char *str) { return CreateSharedString(str, strlen(str)); } /// @brief Store a string in the buffer, which can contain any binary data. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const reference to a std::string to store in the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateSharedString(const std::string &str) { return CreateSharedString(str.c_str(), str.length()); } #endif /// @brief Store a string in the buffer, which can contain any binary data. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const pointer to a `String` struct to add to the buffer. /// @return Returns the offset in the buffer where the string starts Offset CreateSharedString(const String *str) { return CreateSharedString(str->c_str(), str->size()); } /// @cond FLATBUFFERS_INTERNAL uoffset_t EndVector(size_t len) { FLATBUFFERS_ASSERT(nested); // Hit if no corresponding StartVector. nested = false; return PushElement(static_cast(len)); } void StartVector(size_t len, size_t elemsize) { NotNested(); nested = true; PreAlign(len * elemsize); PreAlign(len * elemsize, elemsize); // Just in case elemsize > uoffset_t. } // Call this right before StartVector/CreateVector if you want to force the // alignment to be something different than what the element size would // normally dictate. // This is useful when storing a nested_flatbuffer in a vector of bytes, // or when storing SIMD floats, etc. void ForceVectorAlignment(size_t len, size_t elemsize, size_t alignment) { if (len == 0) return; FLATBUFFERS_ASSERT(VerifyAlignmentRequirements(alignment)); PreAlign(len * elemsize, alignment); } // Similar to ForceVectorAlignment but for String fields. void ForceStringAlignment(size_t len, size_t alignment) { if (len == 0) return; FLATBUFFERS_ASSERT(VerifyAlignmentRequirements(alignment)); PreAlign((len + 1) * sizeof(char), alignment); } /// @endcond /// @brief Serialize an array into a FlatBuffer `vector`. /// @tparam T The data type of the array elements. /// @param[in] v A pointer to the array of type `T` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(const T *v, size_t len) { // If this assert hits, you're specifying a template argument that is // causing the wrong overload to be selected, remove it. AssertScalarT(); StartVector(len, sizeof(T)); if (len == 0) { return Offset>(EndVector(len)); } // clang-format off #if FLATBUFFERS_LITTLEENDIAN PushBytes(reinterpret_cast(v), len * sizeof(T)); #else if (sizeof(T) == 1) { PushBytes(reinterpret_cast(v), len); } else { for (auto i = len; i > 0; ) { PushElement(v[--i]); } } #endif // clang-format on return Offset>(EndVector(len)); } /// @brief Serialize an array like object into a FlatBuffer `vector`. /// @tparam T The data type of the array elements. /// @tparam C The type of the array. /// @param[in] array A reference to an array like object of type `T` to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(const C &array) { return CreateVector(array.data(), array.size()); } /// @brief Serialize an initializer list into a FlatBuffer `vector`. /// @tparam T The data type of the initializer list elements. /// @param[in] v The value of the initializer list. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(std::initializer_list v) { return CreateVector(v.begin(), v.size()); } template Offset>> CreateVector(const Offset *v, size_t len) { StartVector(len, sizeof(Offset)); for (auto i = len; i > 0;) { PushElement(v[--i]); } return Offset>>(EndVector(len)); } /// @brief Serialize a `std::vector` into a FlatBuffer `vector`. /// @tparam T The data type of the `std::vector` elements. /// @param v A const reference to the `std::vector` to serialize into the /// buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVector(const std::vector &v) { return CreateVector(data(v), v.size()); } // vector may be implemented using a bit-set, so we can't access it as // an array. Instead, read elements manually. // Background: https://isocpp.org/blog/2012/11/on-vectorbool Offset> CreateVector(const std::vector &v) { StartVector(v.size(), sizeof(uint8_t)); for (auto i = v.size(); i > 0;) { PushElement(static_cast(v[--i])); } return Offset>(EndVector(v.size())); } /// @brief Serialize values returned by a function into a FlatBuffer `vector`. /// This is a convenience function that takes care of iteration for you. /// @tparam T The data type of the `std::vector` elements. /// @param f A function that takes the current iteration 0..vector_size-1 and /// returns any type that you can construct a FlatBuffers vector out of. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(size_t vector_size, const std::function &f) { FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK); std::vector elems(vector_size); for (size_t i = 0; i < vector_size; i++) elems[i] = f(i); return CreateVector(elems); } /// @brief Serialize values returned by a function into a FlatBuffer `vector`. /// This is a convenience function that takes care of iteration for you. This /// uses a vector stored on the heap to store the intermediate results of the /// iteration. /// @tparam T The data type of the `std::vector` elements. /// @param f A function that takes the current iteration 0..vector_size-1, /// and the state parameter returning any type that you can construct a /// FlatBuffers vector out of. /// @param state State passed to f. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(size_t vector_size, F f, S *state) { FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK); std::vector elems(vector_size); for (size_t i = 0; i < vector_size; i++) elems[i] = f(i, state); return CreateVector(elems); } /// @brief Serialize a `std::vector` into a FlatBuffer `vector`. /// whereas StringType is any type that is accepted by the CreateString() /// overloads. /// This is a convenience function for a common case. /// @param v A const reference to the `std::vector` to serialize into the /// buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset>> CreateVectorOfStrings( const std::vector &v) { return CreateVectorOfStrings(v.cbegin(), v.cend()); } /// @brief Serialize a collection of Strings into a FlatBuffer `vector`. /// This is a convenience function for a common case. /// @param begin The beginning iterator of the collection /// @param end The ending iterator of the collection /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset>> CreateVectorOfStrings(It begin, It end) { auto size = std::distance(begin, end); auto scratch_buffer_usage = size * sizeof(Offset); // If there is not enough space to store the offsets, there definitely won't // be enough space to store all the strings. So ensuring space for the // scratch region is OK, for it it fails, it would have failed later. buf_.ensure_space(scratch_buffer_usage); for (auto it = begin; it != end; ++it) { buf_.scratch_push_small(CreateString(*it)); } StartVector(size, sizeof(Offset)); for (auto i = 1; i <= size; i++) { // Note we re-evaluate the buf location each iteration to account for any // underlying buffer resizing that may occur. PushElement(*reinterpret_cast *>( buf_.scratch_end() - i * sizeof(Offset))); } buf_.scratch_pop(scratch_buffer_usage); return Offset>>(EndVector(size)); } /// @brief Serialize an array of structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @param[in] v A pointer to the array of type `T` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfStructs(const T *v, size_t len) { StartVector(len * sizeof(T) / AlignOf(), AlignOf()); if (len > 0) { PushBytes(reinterpret_cast(v), sizeof(T) * len); } return Offset>(EndVector(len)); } /// @brief Serialize an array of native structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @tparam S The data type of the native struct array elements. /// @param[in] v A pointer to the array of type `S` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @param[in] pack_func Pointer to a function to convert the native struct /// to the FlatBuffer struct. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfNativeStructs( const S *v, size_t len, T (*const pack_func)(const S &)) { FLATBUFFERS_ASSERT(pack_func); auto structs = StartVectorOfStructs(len); for (size_t i = 0; i < len; i++) { structs[i] = pack_func(v[i]); } return EndVectorOfStructs(len); } /// @brief Serialize an array of native structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @tparam S The data type of the native struct array elements. /// @param[in] v A pointer to the array of type `S` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfNativeStructs(const S *v, size_t len) { extern T Pack(const S &); return CreateVectorOfNativeStructs(v, len, Pack); } /// @brief Serialize an array of structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @param[in] filler A function that takes the current iteration /// 0..vector_size-1 and a pointer to the struct that must be filled. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. /// This is mostly useful when flatbuffers are generated with mutation /// accessors. template Offset> CreateVectorOfStructs( size_t vector_size, const std::function &filler) { T *structs = StartVectorOfStructs(vector_size); for (size_t i = 0; i < vector_size; i++) { filler(i, structs); structs++; } return EndVectorOfStructs(vector_size); } /// @brief Serialize an array of structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @param[in] f A function that takes the current iteration 0..vector_size-1, /// a pointer to the struct that must be filled and the state argument. /// @param[in] state Arbitrary state to pass to f. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. /// This is mostly useful when flatbuffers are generated with mutation /// accessors. template Offset> CreateVectorOfStructs(size_t vector_size, F f, S *state) { T *structs = StartVectorOfStructs(vector_size); for (size_t i = 0; i < vector_size; i++) { f(i, structs, state); structs++; } return EndVectorOfStructs(vector_size); } /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`. /// @tparam T The data type of the `std::vector` struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfStructs( const std::vector &v) { return CreateVectorOfStructs(data(v), v.size()); } /// @brief Serialize a `std::vector` of native structs into a FlatBuffer /// `vector`. /// @tparam T The data type of the `std::vector` struct elements. /// @tparam S The data type of the `std::vector` native struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @param[in] pack_func Pointer to a function to convert the native struct /// to the FlatBuffer struct. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfNativeStructs( const std::vector &v, T (*const pack_func)(const S &)) { return CreateVectorOfNativeStructs(data(v), v.size(), pack_func); } /// @brief Serialize a `std::vector` of native structs into a FlatBuffer /// `vector`. /// @tparam T The data type of the `std::vector` struct elements. /// @tparam S The data type of the `std::vector` native struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfNativeStructs( const std::vector &v) { return CreateVectorOfNativeStructs(data(v), v.size()); } /// @cond FLATBUFFERS_INTERNAL template struct StructKeyComparator { bool operator()(const T &a, const T &b) const { return a.KeyCompareLessThan(&b); } }; /// @endcond /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector` /// in sorted order. /// @tparam T The data type of the `std::vector` struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfSortedStructs( std::vector *v) { return CreateVectorOfSortedStructs(data(*v), v->size()); } /// @brief Serialize a `std::vector` of native structs into a FlatBuffer /// `vector` in sorted order. /// @tparam T The data type of the `std::vector` struct elements. /// @tparam S The data type of the `std::vector` native struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfSortedNativeStructs( std::vector *v) { return CreateVectorOfSortedNativeStructs(data(*v), v->size()); } /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted /// order. /// @tparam T The data type of the struct array elements. /// @param[in] v A pointer to the array of type `T` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfSortedStructs(T *v, size_t len) { std::stable_sort(v, v + len, StructKeyComparator()); return CreateVectorOfStructs(v, len); } /// @brief Serialize an array of native structs into a FlatBuffer `vector` in /// sorted order. /// @tparam T The data type of the struct array elements. /// @tparam S The data type of the native struct array elements. /// @param[in] v A pointer to the array of type `S` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfSortedNativeStructs(S *v, size_t len) { extern T Pack(const S &); auto structs = StartVectorOfStructs(len); for (size_t i = 0; i < len; i++) { structs[i] = Pack(v[i]); } std::stable_sort(structs, structs + len, StructKeyComparator()); return EndVectorOfStructs(len); } /// @cond FLATBUFFERS_INTERNAL template struct TableKeyComparator { TableKeyComparator(vector_downward &buf) : buf_(buf) {} TableKeyComparator(const TableKeyComparator &other) : buf_(other.buf_) {} bool operator()(const Offset &a, const Offset &b) const { auto table_a = reinterpret_cast(buf_.data_at(a.o)); auto table_b = reinterpret_cast(buf_.data_at(b.o)); return table_a->KeyCompareLessThan(table_b); } vector_downward &buf_; private: FLATBUFFERS_DELETE_FUNC( TableKeyComparator &operator=(const TableKeyComparator &other)); }; /// @endcond /// @brief Serialize an array of `table` offsets as a `vector` in the buffer /// in sorted order. /// @tparam T The data type that the offset refers to. /// @param[in] v An array of type `Offset` that contains the `table` /// offsets to store in the buffer in sorted order. /// @param[in] len The number of elements to store in the `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset>> CreateVectorOfSortedTables(Offset *v, size_t len) { std::stable_sort(v, v + len, TableKeyComparator(buf_)); return CreateVector(v, len); } /// @brief Serialize an array of `table` offsets as a `vector` in the buffer /// in sorted order. /// @tparam T The data type that the offset refers to. /// @param[in] v An array of type `Offset` that contains the `table` /// offsets to store in the buffer in sorted order. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset>> CreateVectorOfSortedTables( std::vector, Alloc> *v) { return CreateVectorOfSortedTables(data(*v), v->size()); } /// @brief Specialized version of `CreateVector` for non-copying use cases. /// Write the data any time later to the returned buffer pointer `buf`. /// @param[in] len The number of elements to store in the `vector`. /// @param[in] elemsize The size of each element in the `vector`. /// @param[out] buf A pointer to a `uint8_t` pointer that can be /// written to at a later time to serialize the data into a `vector` /// in the buffer. uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, uint8_t **buf) { NotNested(); StartVector(len, elemsize); buf_.make_space(len * elemsize); auto vec_start = GetSize(); auto vec_end = EndVector(len); *buf = buf_.data_at(vec_start); return vec_end; } /// @brief Specialized version of `CreateVector` for non-copying use cases. /// Write the data any time later to the returned buffer pointer `buf`. /// @tparam T The data type of the data that will be stored in the buffer /// as a `vector`. /// @param[in] len The number of elements to store in the `vector`. /// @param[out] buf A pointer to a pointer of type `T` that can be /// written to at a later time to serialize the data into a `vector` /// in the buffer. template Offset> CreateUninitializedVector(size_t len, T **buf) { AssertScalarT(); return CreateUninitializedVector(len, sizeof(T), reinterpret_cast(buf)); } template Offset> CreateUninitializedVectorOfStructs(size_t len, T **buf) { return CreateUninitializedVector(len, sizeof(T), reinterpret_cast(buf)); } // @brief Create a vector of scalar type T given as input a vector of scalar // type U, useful with e.g. pre "enum class" enums, or any existing scalar // data of the wrong type. template Offset> CreateVectorScalarCast(const U *v, size_t len) { AssertScalarT(); AssertScalarT(); StartVector(len, sizeof(T)); for (auto i = len; i > 0;) { PushElement(static_cast(v[--i])); } return Offset>(EndVector(len)); } /// @brief Write a struct by itself, typically to be part of a union. template Offset CreateStruct(const T &structobj) { NotNested(); Align(AlignOf()); buf_.push_small(structobj); return Offset(GetSize()); } /// @brief Finish serializing a buffer by writing the root offset. /// @param[in] file_identifier If a `file_identifier` is given, the buffer /// will be prefixed with a standard FlatBuffers file header. template void Finish(Offset root, const char *file_identifier = nullptr) { Finish(root.o, file_identifier, false); } /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the /// buffer following the size field). These buffers are NOT compatible /// with standard buffers created by Finish, i.e. you can't call GetRoot /// on them, you have to use GetSizePrefixedRoot instead. /// All >32 bit quantities in this buffer will be aligned when the whole /// size pre-fixed buffer is aligned. /// These kinds of buffers are useful for creating a stream of FlatBuffers. template void FinishSizePrefixed(Offset root, const char *file_identifier = nullptr) { Finish(root.o, file_identifier, true); } void SwapBufAllocator(FlatBufferBuilder &other) { buf_.swap_allocator(other.buf_); } /// @brief The length of a FlatBuffer file header. static const size_t kFileIdentifierLength = ::mapserver::flatbuffers::kFileIdentifierLength; protected: // You shouldn't really be copying instances of this class. FlatBufferBuilder(const FlatBufferBuilder &); FlatBufferBuilder &operator=(const FlatBufferBuilder &); void Finish(uoffset_t root, const char *file_identifier, bool size_prefix) { NotNested(); buf_.clear_scratch(); // This will cause the whole buffer to be aligned. PreAlign((size_prefix ? sizeof(uoffset_t) : 0) + sizeof(uoffset_t) + (file_identifier ? kFileIdentifierLength : 0), minalign_); if (file_identifier) { FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength); PushBytes(reinterpret_cast(file_identifier), kFileIdentifierLength); } PushElement(ReferTo(root)); // Location of root. if (size_prefix) { PushElement(GetSize()); } finished = true; } struct FieldLoc { uoffset_t off; voffset_t id; }; vector_downward buf_; // Accumulating offsets of table members while it is being built. // We store these in the scratch pad of buf_, after the vtable offsets. uoffset_t num_field_loc; // Track how much of the vtable is in use, so we can output the most compact // possible vtable. voffset_t max_voffset_; // Ensure objects are not nested. bool nested; // Ensure the buffer is finished before it is being accessed. bool finished; size_t minalign_; bool force_defaults_; // Serialize values equal to their defaults anyway. bool dedup_vtables_; struct StringOffsetCompare { StringOffsetCompare(const vector_downward &buf) : buf_(&buf) {} bool operator()(const Offset &a, const Offset &b) const { auto stra = reinterpret_cast(buf_->data_at(a.o)); auto strb = reinterpret_cast(buf_->data_at(b.o)); return StringLessThan(stra->data(), stra->size(), strb->data(), strb->size()); } const vector_downward *buf_; }; // For use with CreateSharedString. Instantiated on first use only. typedef std::set, StringOffsetCompare> StringOffsetMap; StringOffsetMap *string_pool; private: // Allocates space for a vector of structures. // Must be completed with EndVectorOfStructs(). template T *StartVectorOfStructs(size_t vector_size) { StartVector(vector_size * sizeof(T) / AlignOf(), AlignOf()); return reinterpret_cast(buf_.make_space(vector_size * sizeof(T))); } // End the vector of structures in the flatbuffers. // Vector should have previously be started with StartVectorOfStructs(). template Offset> EndVectorOfStructs(size_t vector_size) { return Offset>(EndVector(vector_size)); } }; /// @} /// Helpers to get a typed pointer to objects that are currently being built. /// @warning Creating new objects will lead to reallocations and invalidates /// the pointer! template T *GetMutableTemporaryPointer(FlatBufferBuilder &fbb, Offset offset) { return reinterpret_cast(fbb.GetCurrentBufferPointer() + fbb.GetSize() - offset.o); } template const T *GetTemporaryPointer(FlatBufferBuilder &fbb, Offset offset) { return GetMutableTemporaryPointer(fbb, offset); } template void FlatBufferBuilder::Required(Offset table, voffset_t field) { auto table_ptr = reinterpret_cast(buf_.data_at(table.o)); bool ok = table_ptr->GetOptionalFieldOffset(field) != 0; // If this fails, the caller will show what field needs to be set. FLATBUFFERS_ASSERT(ok); (void)ok; } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_VECTOR_DOWNWARD_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/flatbuffers.h000066400000000000000000000242521474174441300250540ustar00rootroot00000000000000/* * Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_H_ #define FLATBUFFERS_H_ // TODO: These includes are for mitigating the pains of users editing their // source because they relied on flatbuffers.h to include everything for them. #include "flatbuffers/array.h" #include "flatbuffers/base.h" #include "flatbuffers/buffer.h" #include "flatbuffers/buffer_ref.h" #include "flatbuffers/detached_buffer.h" #include "flatbuffers/flatbuffer_builder.h" #include "flatbuffers/stl_emulation.h" #include "flatbuffers/string.h" #include "flatbuffers/struct.h" #include "flatbuffers/table.h" #include "flatbuffers/vector.h" #include "flatbuffers/vector_downward.h" #include "flatbuffers/verifier.h" namespace mapserver { namespace flatbuffers { /// @brief This can compute the start of a FlatBuffer from a root pointer, i.e. /// it is the opposite transformation of GetRoot(). /// This may be useful if you want to pass on a root and have the recipient /// delete the buffer afterwards. inline const uint8_t *GetBufferStartFromRootPointer(const void *root) { auto table = reinterpret_cast(root); auto vtable = table->GetVTable(); // Either the vtable is before the root or after the root. auto start = (std::min)(vtable, reinterpret_cast(root)); // Align to at least sizeof(uoffset_t). start = reinterpret_cast(reinterpret_cast(start) & ~(sizeof(uoffset_t) - 1)); // Additionally, there may be a file_identifier in the buffer, and the root // offset. The buffer may have been aligned to any size between // sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align"). // Sadly, the exact alignment is only known when constructing the buffer, // since it depends on the presence of values with said alignment properties. // So instead, we simply look at the next uoffset_t values (root, // file_identifier, and alignment padding) to see which points to the root. // None of the other values can "impersonate" the root since they will either // be 0 or four ASCII characters. static_assert(flatbuffers::kFileIdentifierLength == sizeof(uoffset_t), "file_identifier is assumed to be the same size as uoffset_t"); for (auto possible_roots = FLATBUFFERS_MAX_ALIGNMENT / sizeof(uoffset_t) + 1; possible_roots; possible_roots--) { start -= sizeof(uoffset_t); if (ReadScalar(start) + start == reinterpret_cast(root)) return start; } // We didn't find the root, either the "root" passed isn't really a root, // or the buffer is corrupt. // Assert, because calling this function with bad data may cause reads // outside of buffer boundaries. FLATBUFFERS_ASSERT(false); return nullptr; } /// @brief This return the prefixed size of a FlatBuffer. inline uoffset_t GetPrefixedSize(const uint8_t *buf) { return ReadScalar(buf); } // Base class for native objects (FlatBuffer data de-serialized into native // C++ data structures). // Contains no functionality, purely documentative. struct NativeTable {}; /// @brief Function types to be used with resolving hashes into objects and /// back again. The resolver gets a pointer to a field inside an object API /// object that is of the type specified in the schema using the attribute /// `cpp_type` (it is thus important whatever you write to this address /// matches that type). The value of this field is initially null, so you /// may choose to implement a delayed binding lookup using this function /// if you wish. The resolver does the opposite lookup, for when the object /// is being serialized again. typedef uint64_t hash_value_t; typedef std::function resolver_function_t; typedef std::function rehasher_function_t; // Helper function to test if a field is present, using any of the field // enums in the generated code. // `table` must be a generated table type. Since this is a template parameter, // this is not typechecked to be a subclass of Table, so beware! // Note: this function will return false for fields equal to the default // value, since they're not stored in the buffer (unless force_defaults was // used). template bool IsFieldPresent(const T *table, typename T::FlatBuffersVTableOffset field) { // Cast, since Table is a private baseclass of any table types. return reinterpret_cast(table)->CheckField( static_cast(field)); } // Utility function for reverse lookups on the EnumNames*() functions // (in the generated C++ code) // names must be NULL terminated. inline int LookupEnum(const char **names, const char *name) { for (const char **p = names; *p; p++) if (!strcmp(*p, name)) return static_cast(p - names); return -1; } // These macros allow us to layout a struct with a guarantee that they'll end // up looking the same on different compilers and platforms. // It does this by disallowing the compiler to do any padding, and then // does padding itself by inserting extra padding fields that make every // element aligned to its own size. // Additionally, it manually sets the alignment of the struct as a whole, // which is typically its largest element, or a custom size set in the schema // by the force_align attribute. // These are used in the generated code only. // clang-format off #if defined(_MSC_VER) #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \ __pragma(pack(1)) \ struct __declspec(align(alignment)) #define FLATBUFFERS_STRUCT_END(name, size) \ __pragma(pack()) \ static_assert(sizeof(name) == size, "compiler breaks packing rules") #elif defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \ _Pragma("pack(1)") \ struct __attribute__((aligned(alignment))) #define FLATBUFFERS_STRUCT_END(name, size) \ _Pragma("pack()") \ static_assert(sizeof(name) == size, "compiler breaks packing rules") #else #error Unknown compiler, please define structure alignment macros #endif // clang-format on // Minimal reflection via code generation. // Besides full-fat reflection (see reflection.h) and parsing/printing by // loading schemas (see idl.h), we can also have code generation for minimal // reflection data which allows pretty-printing and other uses without needing // a schema or a parser. // Generate code with --reflect-types (types only) or --reflect-names (names // also) to enable. // See minireflect.h for utilities using this functionality. // These types are organized slightly differently as the ones in idl.h. enum SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM }; // Scalars have the same order as in idl.h // clang-format off #define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \ ET(ET_UTYPE) \ ET(ET_BOOL) \ ET(ET_CHAR) \ ET(ET_UCHAR) \ ET(ET_SHORT) \ ET(ET_USHORT) \ ET(ET_INT) \ ET(ET_UINT) \ ET(ET_LONG) \ ET(ET_ULONG) \ ET(ET_FLOAT) \ ET(ET_DOUBLE) \ ET(ET_STRING) \ ET(ET_SEQUENCE) // See SequenceType. enum ElementaryType { #define FLATBUFFERS_ET(E) E, FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET) #undef FLATBUFFERS_ET }; inline const char * const *ElementaryTypeNames() { static const char * const names[] = { #define FLATBUFFERS_ET(E) #E, FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET) #undef FLATBUFFERS_ET }; return names; } // clang-format on // Basic type info cost just 16bits per field! // We're explicitly defining the signedness since the signedness of integer // bitfields is otherwise implementation-defined and causes warnings on older // GCC compilers. struct TypeCode { // ElementaryType unsigned short base_type : 4; // Either vector (in table) or array (in struct) unsigned short is_repeating : 1; // Index into type_refs below, or -1 for none. signed short sequence_ref : 11; }; static_assert(sizeof(TypeCode) == 2, "TypeCode"); struct TypeTable; // Signature of the static method present in each type. typedef const TypeTable *(*TypeFunction)(); struct TypeTable { SequenceType st; size_t num_elems; // of type_codes, values, names (but not type_refs). const TypeCode *type_codes; // num_elems count const TypeFunction *type_refs; // less than num_elems entries (see TypeCode). const int16_t *array_sizes; // less than num_elems entries (see TypeCode). const int64_t *values; // Only set for non-consecutive enum/union or structs. const char *const *names; // Only set if compiled with --reflect-names. }; // String which identifies the current version of FlatBuffers. inline const char *flatbuffers_version_string() { return "FlatBuffers " FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) "." FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) "." FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION); } // clang-format off #define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\ inline E operator | (E lhs, E rhs){\ return E(T(lhs) | T(rhs));\ }\ inline E operator & (E lhs, E rhs){\ return E(T(lhs) & T(rhs));\ }\ inline E operator ^ (E lhs, E rhs){\ return E(T(lhs) ^ T(rhs));\ }\ inline E operator ~ (E lhs){\ return E(~T(lhs));\ }\ inline E operator |= (E &lhs, E rhs){\ lhs = lhs | rhs;\ return lhs;\ }\ inline E operator &= (E &lhs, E rhs){\ lhs = lhs & rhs;\ return lhs;\ }\ inline E operator ^= (E &lhs, E rhs){\ lhs = lhs ^ rhs;\ return lhs;\ }\ inline bool operator !(E rhs) \ {\ return !bool(T(rhs)); \ } /// @endcond } // namespace flatbuffers } // namespace mapserver // clang-format on #endif // FLATBUFFERS_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/flatc.h000066400000000000000000000073271474174441300236460ustar00rootroot00000000000000/* * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_FLATC_H_ #define FLATBUFFERS_FLATC_H_ #include #include #include #include "flatbuffers/bfbs_generator.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/idl.h" #include "flatbuffers/util.h" namespace mapserver { namespace flatbuffers { extern void LogCompilerWarn(const std::string &warn); extern void LogCompilerError(const std::string &err); struct FlatCOption { std::string short_opt; std::string long_opt; std::string parameter; std::string description; }; class FlatCompiler { public: // Output generator for the various programming languages and formats we // support. struct Generator { typedef bool (*GenerateFn)(const flatbuffers::Parser &parser, const std::string &path, const std::string &file_name); typedef std::string (*MakeRuleFn)(const flatbuffers::Parser &parser, const std::string &path, const std::string &file_name); typedef bool (*ParsingCompletedFn)(const flatbuffers::Parser &parser, const std::string &output_path); GenerateFn generate; const char *lang_name; bool schema_only; GenerateFn generateGRPC; flatbuffers::IDLOptions::Language lang; FlatCOption option; MakeRuleFn make_rule; BfbsGenerator *bfbs_generator; ParsingCompletedFn parsing_completed; }; typedef void (*WarnFn)(const FlatCompiler *flatc, const std::string &warn, bool show_exe_name); typedef void (*ErrorFn)(const FlatCompiler *flatc, const std::string &err, bool usage, bool show_exe_name); // Parameters required to initialize the FlatCompiler. struct InitParams { InitParams() : generators(nullptr), num_generators(0), warn_fn(nullptr), error_fn(nullptr) {} const Generator *generators; size_t num_generators; WarnFn warn_fn; ErrorFn error_fn; }; explicit FlatCompiler(const InitParams ¶ms) : params_(params) {} int Compile(int argc, const char **argv); std::string GetShortUsageString(const char *program_name) const; std::string GetUsageString(const char *program_name) const; private: void ParseFile(flatbuffers::Parser &parser, const std::string &filename, const std::string &contents, std::vector &include_directories) const; void LoadBinarySchema(Parser &parser, const std::string &filename, const std::string &contents); void Warn(const std::string &warn, bool show_exe_name = true) const; void Error(const std::string &err, bool usage = true, bool show_exe_name = true) const; void AnnotateBinaries(const uint8_t *binary_schema, uint64_t binary_schema_size, const std::string & schema_filename, const std::vector &binary_files); InitParams params_; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_FLATC_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/flex_flat_util.h000066400000000000000000000023041474174441300255440ustar00rootroot00000000000000/* * Copyright 2022 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_FLEX_FLAT_UTIL_H_ #define FLATBUFFERS_FLEX_FLAT_UTIL_H_ #include "flatbuffers/flatbuffers.h" #include "flatbuffers/flexbuffers.h" namespace flexbuffers { // Verifies the `nested` flexbuffer within a flatbuffer vector is valid. inline bool VerifyNestedFlexBuffer( const flatbuffers::Vector *const nested, flatbuffers::Verifier &verifier) { if (!nested) return true; return verifier.Check(flexbuffers::VerifyBuffer( nested->data(), nested->size(), verifier.GetFlexReuseTracker())); } } // namespace flexbuffers #endif // FLATBUFFERS_FLEX_FLAT_UTIL_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/flexbuffers.h000066400000000000000000001767761474174441300251070ustar00rootroot00000000000000/* * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_FLEXBUFFERS_H_ #define FLATBUFFERS_FLEXBUFFERS_H_ #include // Used to select STL variant. #include "flatbuffers/base.h" // We use the basic binary writing functions from the regular FlatBuffers. #include "flatbuffers/util.h" #ifdef _MSC_VER # include #endif #if defined(_MSC_VER) # pragma warning(push) # pragma warning(disable : 4127) // C4127: conditional expression is constant #endif namespace flexbuffers { class Reference; class Map; // These are used in the lower 2 bits of a type field to determine the size of // the elements (and or size field) of the item pointed to (e.g. vector). enum BitWidth { BIT_WIDTH_8 = 0, BIT_WIDTH_16 = 1, BIT_WIDTH_32 = 2, BIT_WIDTH_64 = 3, }; // These are used as the upper 6 bits of a type field to indicate the actual // type. enum Type { FBT_NULL = 0, FBT_INT = 1, FBT_UINT = 2, FBT_FLOAT = 3, // Types above stored inline, types below (except FBT_BOOL) store an offset. FBT_KEY = 4, FBT_STRING = 5, FBT_INDIRECT_INT = 6, FBT_INDIRECT_UINT = 7, FBT_INDIRECT_FLOAT = 8, FBT_MAP = 9, FBT_VECTOR = 10, // Untyped. FBT_VECTOR_INT = 11, // Typed any size (stores no type table). FBT_VECTOR_UINT = 12, FBT_VECTOR_FLOAT = 13, FBT_VECTOR_KEY = 14, // DEPRECATED, use FBT_VECTOR or FBT_VECTOR_KEY instead. // Read test.cpp/FlexBuffersDeprecatedTest() for details on why. FBT_VECTOR_STRING_DEPRECATED = 15, FBT_VECTOR_INT2 = 16, // Typed tuple (no type table, no size field). FBT_VECTOR_UINT2 = 17, FBT_VECTOR_FLOAT2 = 18, FBT_VECTOR_INT3 = 19, // Typed triple (no type table, no size field). FBT_VECTOR_UINT3 = 20, FBT_VECTOR_FLOAT3 = 21, FBT_VECTOR_INT4 = 22, // Typed quad (no type table, no size field). FBT_VECTOR_UINT4 = 23, FBT_VECTOR_FLOAT4 = 24, FBT_BLOB = 25, FBT_BOOL = 26, FBT_VECTOR_BOOL = 36, // To Allow the same type of conversion of type to vector type FBT_MAX_TYPE = 37 }; inline bool IsInline(Type t) { return t <= FBT_FLOAT || t == FBT_BOOL; } inline bool IsTypedVectorElementType(Type t) { return (t >= FBT_INT && t <= FBT_STRING) || t == FBT_BOOL; } inline bool IsTypedVector(Type t) { return (t >= FBT_VECTOR_INT && t <= FBT_VECTOR_STRING_DEPRECATED) || t == FBT_VECTOR_BOOL; } inline bool IsFixedTypedVector(Type t) { return t >= FBT_VECTOR_INT2 && t <= FBT_VECTOR_FLOAT4; } inline Type ToTypedVector(Type t, size_t fixed_len = 0) { FLATBUFFERS_ASSERT(IsTypedVectorElementType(t)); switch (fixed_len) { case 0: return static_cast(t - FBT_INT + FBT_VECTOR_INT); case 2: return static_cast(t - FBT_INT + FBT_VECTOR_INT2); case 3: return static_cast(t - FBT_INT + FBT_VECTOR_INT3); case 4: return static_cast(t - FBT_INT + FBT_VECTOR_INT4); default: FLATBUFFERS_ASSERT(0); return FBT_NULL; } } inline Type ToTypedVectorElementType(Type t) { FLATBUFFERS_ASSERT(IsTypedVector(t)); return static_cast(t - FBT_VECTOR_INT + FBT_INT); } inline Type ToFixedTypedVectorElementType(Type t, uint8_t *len) { FLATBUFFERS_ASSERT(IsFixedTypedVector(t)); auto fixed_type = t - FBT_VECTOR_INT2; *len = static_cast(fixed_type / 3 + 2); // 3 types each, starting from length 2. return static_cast(fixed_type % 3 + FBT_INT); } // TODO: implement proper support for 8/16bit floats, or decide not to // support them. typedef int16_t half; typedef int8_t quarter; // TODO: can we do this without conditionals using intrinsics or inline asm // on some platforms? Given branch prediction the method below should be // decently quick, but it is the most frequently executed function. // We could do an (unaligned) 64-bit read if we ifdef out the platforms for // which that doesn't work (or where we'd read into un-owned memory). template R ReadSizedScalar(const uint8_t *data, uint8_t byte_width) { return byte_width < 4 ? (byte_width < 2 ? static_cast(flatbuffers::ReadScalar(data)) : static_cast(flatbuffers::ReadScalar(data))) : (byte_width < 8 ? static_cast(flatbuffers::ReadScalar(data)) : static_cast(flatbuffers::ReadScalar(data))); } inline int64_t ReadInt64(const uint8_t *data, uint8_t byte_width) { return ReadSizedScalar( data, byte_width); } inline uint64_t ReadUInt64(const uint8_t *data, uint8_t byte_width) { // This is the "hottest" function (all offset lookups use this), so worth // optimizing if possible. // TODO: GCC apparently replaces memcpy by a rep movsb, but only if count is a // constant, which here it isn't. Test if memcpy is still faster than // the conditionals in ReadSizedScalar. Can also use inline asm. // clang-format off #if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC) // This is 64-bit Windows only, __movsb does not work on 32-bit Windows. uint64_t u = 0; __movsb(reinterpret_cast(&u), reinterpret_cast(data), byte_width); return flatbuffers::EndianScalar(u); #else return ReadSizedScalar( data, byte_width); #endif // clang-format on } inline double ReadDouble(const uint8_t *data, uint8_t byte_width) { return ReadSizedScalar(data, byte_width); } inline const uint8_t *Indirect(const uint8_t *offset, uint8_t byte_width) { return offset - ReadUInt64(offset, byte_width); } template const uint8_t *Indirect(const uint8_t *offset) { return offset - flatbuffers::ReadScalar(offset); } inline BitWidth WidthU(uint64_t u) { #define FLATBUFFERS_GET_FIELD_BIT_WIDTH(value, width) \ { \ if (!((u) & ~((1ULL << (width)) - 1ULL))) return BIT_WIDTH_##width; \ } FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 8); FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 16); FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 32); #undef FLATBUFFERS_GET_FIELD_BIT_WIDTH return BIT_WIDTH_64; } inline BitWidth WidthI(int64_t i) { auto u = static_cast(i) << 1; return WidthU(i >= 0 ? u : ~u); } inline BitWidth WidthF(double f) { return static_cast(static_cast(f)) == f ? BIT_WIDTH_32 : BIT_WIDTH_64; } // Base class of all types below. // Points into the data buffer and allows access to one type. class Object { public: Object(const uint8_t *data, uint8_t byte_width) : data_(data), byte_width_(byte_width) {} protected: const uint8_t *data_; uint8_t byte_width_; }; // Object that has a size, obtained either from size prefix, or elsewhere. class Sized : public Object { public: // Size prefix. Sized(const uint8_t *data, uint8_t byte_width) : Object(data, byte_width), size_(read_size()) {} // Manual size. Sized(const uint8_t *data, uint8_t byte_width, size_t sz) : Object(data, byte_width), size_(sz) {} size_t size() const { return size_; } // Access size stored in `byte_width_` bytes before data_ pointer. size_t read_size() const { return static_cast(ReadUInt64(data_ - byte_width_, byte_width_)); } protected: size_t size_; }; class String : public Sized { public: // Size prefix. String(const uint8_t *data, uint8_t byte_width) : Sized(data, byte_width) {} // Manual size. String(const uint8_t *data, uint8_t byte_width, size_t sz) : Sized(data, byte_width, sz) {} size_t length() const { return size(); } const char *c_str() const { return reinterpret_cast(data_); } std::string str() const { return std::string(c_str(), size()); } static String EmptyString() { static const char *empty_string = ""; return String(reinterpret_cast(empty_string), 1, 0); } bool IsTheEmptyString() const { return data_ == EmptyString().data_; } }; class Blob : public Sized { public: Blob(const uint8_t *data_buf, uint8_t byte_width) : Sized(data_buf, byte_width) {} static Blob EmptyBlob() { static const uint8_t empty_blob[] = { 0 /*len*/ }; return Blob(empty_blob + 1, 1); } bool IsTheEmptyBlob() const { return data_ == EmptyBlob().data_; } const uint8_t *data() const { return data_; } }; class Vector : public Sized { public: Vector(const uint8_t *data, uint8_t byte_width) : Sized(data, byte_width) {} Reference operator[](size_t i) const; static Vector EmptyVector() { static const uint8_t empty_vector[] = { 0 /*len*/ }; return Vector(empty_vector + 1, 1); } bool IsTheEmptyVector() const { return data_ == EmptyVector().data_; } }; class TypedVector : public Sized { public: TypedVector(const uint8_t *data, uint8_t byte_width, Type element_type) : Sized(data, byte_width), type_(element_type) {} Reference operator[](size_t i) const; static TypedVector EmptyTypedVector() { static const uint8_t empty_typed_vector[] = { 0 /*len*/ }; return TypedVector(empty_typed_vector + 1, 1, FBT_INT); } bool IsTheEmptyVector() const { return data_ == TypedVector::EmptyTypedVector().data_; } Type ElementType() { return type_; } friend Reference; private: Type type_; friend Map; }; class FixedTypedVector : public Object { public: FixedTypedVector(const uint8_t *data, uint8_t byte_width, Type element_type, uint8_t len) : Object(data, byte_width), type_(element_type), len_(len) {} Reference operator[](size_t i) const; static FixedTypedVector EmptyFixedTypedVector() { static const uint8_t fixed_empty_vector[] = { 0 /* unused */ }; return FixedTypedVector(fixed_empty_vector, 1, FBT_INT, 0); } bool IsTheEmptyFixedTypedVector() const { return data_ == FixedTypedVector::EmptyFixedTypedVector().data_; } Type ElementType() const { return type_; } uint8_t size() const { return len_; } private: Type type_; uint8_t len_; }; class Map : public Vector { public: Map(const uint8_t *data, uint8_t byte_width) : Vector(data, byte_width) {} Reference operator[](const char *key) const; Reference operator[](const std::string &key) const; Vector Values() const { return Vector(data_, byte_width_); } TypedVector Keys() const { const size_t num_prefixed_fields = 3; auto keys_offset = data_ - byte_width_ * num_prefixed_fields; return TypedVector(Indirect(keys_offset, byte_width_), static_cast( ReadUInt64(keys_offset + byte_width_, byte_width_)), FBT_KEY); } static Map EmptyMap() { static const uint8_t empty_map[] = { 0 /*keys_len*/, 0 /*keys_offset*/, 1 /*keys_width*/, 0 /*len*/ }; return Map(empty_map + 4, 1); } bool IsTheEmptyMap() const { return data_ == EmptyMap().data_; } }; template void AppendToString(std::string &s, T &&v, bool keys_quoted) { s += "[ "; for (size_t i = 0; i < v.size(); i++) { if (i) s += ", "; v[i].ToString(true, keys_quoted, s); } s += " ]"; } class Reference { public: Reference() : data_(nullptr), parent_width_(0), byte_width_(0), type_(FBT_NULL) {} Reference(const uint8_t *data, uint8_t parent_width, uint8_t byte_width, Type type) : data_(data), parent_width_(parent_width), byte_width_(byte_width), type_(type) {} Reference(const uint8_t *data, uint8_t parent_width, uint8_t packed_type) : data_(data), parent_width_(parent_width) { byte_width_ = 1U << static_cast(packed_type & 3); type_ = static_cast(packed_type >> 2); } Type GetType() const { return type_; } bool IsNull() const { return type_ == FBT_NULL; } bool IsBool() const { return type_ == FBT_BOOL; } bool IsInt() const { return type_ == FBT_INT || type_ == FBT_INDIRECT_INT; } bool IsUInt() const { return type_ == FBT_UINT || type_ == FBT_INDIRECT_UINT; } bool IsIntOrUint() const { return IsInt() || IsUInt(); } bool IsFloat() const { return type_ == FBT_FLOAT || type_ == FBT_INDIRECT_FLOAT; } bool IsNumeric() const { return IsIntOrUint() || IsFloat(); } bool IsString() const { return type_ == FBT_STRING; } bool IsKey() const { return type_ == FBT_KEY; } bool IsVector() const { return type_ == FBT_VECTOR || type_ == FBT_MAP; } bool IsUntypedVector() const { return type_ == FBT_VECTOR; } bool IsTypedVector() const { return flexbuffers::IsTypedVector(type_); } bool IsFixedTypedVector() const { return flexbuffers::IsFixedTypedVector(type_); } bool IsAnyVector() const { return (IsTypedVector() || IsFixedTypedVector() || IsVector()); } bool IsMap() const { return type_ == FBT_MAP; } bool IsBlob() const { return type_ == FBT_BLOB; } bool AsBool() const { return (type_ == FBT_BOOL ? ReadUInt64(data_, parent_width_) : AsUInt64()) != 0; } // Reads any type as a int64_t. Never fails, does most sensible conversion. // Truncates floats, strings are attempted to be parsed for a number, // vectors/maps return their size. Returns 0 if all else fails. int64_t AsInt64() const { if (type_ == FBT_INT) { // A fast path for the common case. return ReadInt64(data_, parent_width_); } else switch (type_) { case FBT_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_); case FBT_UINT: return ReadUInt64(data_, parent_width_); case FBT_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_); case FBT_FLOAT: return static_cast(ReadDouble(data_, parent_width_)); case FBT_INDIRECT_FLOAT: return static_cast(ReadDouble(Indirect(), byte_width_)); case FBT_NULL: return 0; case FBT_STRING: return flatbuffers::StringToInt(AsString().c_str()); case FBT_VECTOR: return static_cast(AsVector().size()); case FBT_BOOL: return ReadInt64(data_, parent_width_); default: // Convert other things to int. return 0; } } // TODO: could specialize these to not use AsInt64() if that saves // extension ops in generated code, and use a faster op than ReadInt64. int32_t AsInt32() const { return static_cast(AsInt64()); } int16_t AsInt16() const { return static_cast(AsInt64()); } int8_t AsInt8() const { return static_cast(AsInt64()); } uint64_t AsUInt64() const { if (type_ == FBT_UINT) { // A fast path for the common case. return ReadUInt64(data_, parent_width_); } else switch (type_) { case FBT_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_); case FBT_INT: return ReadInt64(data_, parent_width_); case FBT_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_); case FBT_FLOAT: return static_cast(ReadDouble(data_, parent_width_)); case FBT_INDIRECT_FLOAT: return static_cast(ReadDouble(Indirect(), byte_width_)); case FBT_NULL: return 0; case FBT_STRING: return flatbuffers::StringToUInt(AsString().c_str()); case FBT_VECTOR: return static_cast(AsVector().size()); case FBT_BOOL: return ReadUInt64(data_, parent_width_); default: // Convert other things to uint. return 0; } } uint32_t AsUInt32() const { return static_cast(AsUInt64()); } uint16_t AsUInt16() const { return static_cast(AsUInt64()); } uint8_t AsUInt8() const { return static_cast(AsUInt64()); } double AsDouble() const { if (type_ == FBT_FLOAT) { // A fast path for the common case. return ReadDouble(data_, parent_width_); } else switch (type_) { case FBT_INDIRECT_FLOAT: return ReadDouble(Indirect(), byte_width_); case FBT_INT: return static_cast(ReadInt64(data_, parent_width_)); case FBT_UINT: return static_cast(ReadUInt64(data_, parent_width_)); case FBT_INDIRECT_INT: return static_cast(ReadInt64(Indirect(), byte_width_)); case FBT_INDIRECT_UINT: return static_cast(ReadUInt64(Indirect(), byte_width_)); case FBT_NULL: return 0.0; case FBT_STRING: { double d; flatbuffers::StringToNumber(AsString().c_str(), &d); return d; } case FBT_VECTOR: return static_cast(AsVector().size()); case FBT_BOOL: return static_cast(ReadUInt64(data_, parent_width_)); default: // Convert strings and other things to float. return 0; } } float AsFloat() const { return static_cast(AsDouble()); } const char *AsKey() const { if (type_ == FBT_KEY || type_ == FBT_STRING) { return reinterpret_cast(Indirect()); } else { return ""; } } // This function returns the empty string if you try to read something that // is not a string or key. String AsString() const { if (type_ == FBT_STRING) { return String(Indirect(), byte_width_); } else if (type_ == FBT_KEY) { auto key = Indirect(); return String(key, byte_width_, strlen(reinterpret_cast(key))); } else { return String::EmptyString(); } } // Unlike AsString(), this will convert any type to a std::string. std::string ToString() const { std::string s; ToString(false, false, s); return s; } // Convert any type to a JSON-like string. strings_quoted determines if // string values at the top level receive "" quotes (inside other values // they always do). keys_quoted determines if keys are quoted, at any level. // TODO(wvo): add further options to have indentation/newlines. void ToString(bool strings_quoted, bool keys_quoted, std::string &s) const { if (type_ == FBT_STRING) { String str(Indirect(), byte_width_); if (strings_quoted) { flatbuffers::EscapeString(str.c_str(), str.length(), &s, true, false); } else { s.append(str.c_str(), str.length()); } } else if (IsKey()) { auto str = AsKey(); if (keys_quoted) { flatbuffers::EscapeString(str, strlen(str), &s, true, false); } else { s += str; } } else if (IsInt()) { s += flatbuffers::NumToString(AsInt64()); } else if (IsUInt()) { s += flatbuffers::NumToString(AsUInt64()); } else if (IsFloat()) { s += flatbuffers::NumToString(AsDouble()); } else if (IsNull()) { s += "null"; } else if (IsBool()) { s += AsBool() ? "true" : "false"; } else if (IsMap()) { s += "{ "; auto m = AsMap(); auto keys = m.Keys(); auto vals = m.Values(); for (size_t i = 0; i < keys.size(); i++) { bool kq = keys_quoted; if (!kq) { // FlexBuffers keys may contain arbitrary characters, only allow // unquoted if it looks like an "identifier": const char *p = keys[i].AsKey(); if (!flatbuffers::is_alpha(*p) && *p != '_') { kq = true; } else { while (*++p) { if (!flatbuffers::is_alnum(*p) && *p != '_') { kq = true; break; } } } } keys[i].ToString(true, kq, s); s += ": "; vals[i].ToString(true, keys_quoted, s); if (i < keys.size() - 1) s += ", "; } s += " }"; } else if (IsVector()) { AppendToString(s, AsVector(), keys_quoted); } else if (IsTypedVector()) { AppendToString(s, AsTypedVector(), keys_quoted); } else if (IsFixedTypedVector()) { AppendToString(s, AsFixedTypedVector(), keys_quoted); } else if (IsBlob()) { auto blob = AsBlob(); flatbuffers::EscapeString(reinterpret_cast(blob.data()), blob.size(), &s, true, false); } else { s += "(?)"; } } // This function returns the empty blob if you try to read a not-blob. // Strings can be viewed as blobs too. Blob AsBlob() const { if (type_ == FBT_BLOB || type_ == FBT_STRING) { return Blob(Indirect(), byte_width_); } else { return Blob::EmptyBlob(); } } // This function returns the empty vector if you try to read a not-vector. // Maps can be viewed as vectors too. Vector AsVector() const { if (type_ == FBT_VECTOR || type_ == FBT_MAP) { return Vector(Indirect(), byte_width_); } else { return Vector::EmptyVector(); } } TypedVector AsTypedVector() const { if (IsTypedVector()) { auto tv = TypedVector(Indirect(), byte_width_, ToTypedVectorElementType(type_)); if (tv.type_ == FBT_STRING) { // These can't be accessed as strings, since we don't know the bit-width // of the size field, see the declaration of // FBT_VECTOR_STRING_DEPRECATED above for details. // We change the type here to be keys, which are a subtype of strings, // and will ignore the size field. This will truncate strings with // embedded nulls. tv.type_ = FBT_KEY; } return tv; } else { return TypedVector::EmptyTypedVector(); } } FixedTypedVector AsFixedTypedVector() const { if (IsFixedTypedVector()) { uint8_t len = 0; auto vtype = ToFixedTypedVectorElementType(type_, &len); return FixedTypedVector(Indirect(), byte_width_, vtype, len); } else { return FixedTypedVector::EmptyFixedTypedVector(); } } Map AsMap() const { if (type_ == FBT_MAP) { return Map(Indirect(), byte_width_); } else { return Map::EmptyMap(); } } template T As() const; // Experimental: Mutation functions. // These allow scalars in an already created buffer to be updated in-place. // Since by default scalars are stored in the smallest possible space, // the new value may not fit, in which case these functions return false. // To avoid this, you can construct the values you intend to mutate using // Builder::ForceMinimumBitWidth. bool MutateInt(int64_t i) { if (type_ == FBT_INT) { return Mutate(data_, i, parent_width_, WidthI(i)); } else if (type_ == FBT_INDIRECT_INT) { return Mutate(Indirect(), i, byte_width_, WidthI(i)); } else if (type_ == FBT_UINT) { auto u = static_cast(i); return Mutate(data_, u, parent_width_, WidthU(u)); } else if (type_ == FBT_INDIRECT_UINT) { auto u = static_cast(i); return Mutate(Indirect(), u, byte_width_, WidthU(u)); } else { return false; } } bool MutateBool(bool b) { return type_ == FBT_BOOL && Mutate(data_, b, parent_width_, BIT_WIDTH_8); } bool MutateUInt(uint64_t u) { if (type_ == FBT_UINT) { return Mutate(data_, u, parent_width_, WidthU(u)); } else if (type_ == FBT_INDIRECT_UINT) { return Mutate(Indirect(), u, byte_width_, WidthU(u)); } else if (type_ == FBT_INT) { auto i = static_cast(u); return Mutate(data_, i, parent_width_, WidthI(i)); } else if (type_ == FBT_INDIRECT_INT) { auto i = static_cast(u); return Mutate(Indirect(), i, byte_width_, WidthI(i)); } else { return false; } } bool MutateFloat(float f) { if (type_ == FBT_FLOAT) { return MutateF(data_, f, parent_width_, BIT_WIDTH_32); } else if (type_ == FBT_INDIRECT_FLOAT) { return MutateF(Indirect(), f, byte_width_, BIT_WIDTH_32); } else { return false; } } bool MutateFloat(double d) { if (type_ == FBT_FLOAT) { return MutateF(data_, d, parent_width_, WidthF(d)); } else if (type_ == FBT_INDIRECT_FLOAT) { return MutateF(Indirect(), d, byte_width_, WidthF(d)); } else { return false; } } bool MutateString(const char *str, size_t len) { auto s = AsString(); if (s.IsTheEmptyString()) return false; // This is very strict, could allow shorter strings, but that creates // garbage. if (s.length() != len) return false; memcpy(const_cast(s.c_str()), str, len); return true; } bool MutateString(const char *str) { return MutateString(str, strlen(str)); } bool MutateString(const std::string &str) { return MutateString(str.data(), str.length()); } private: const uint8_t *Indirect() const { return flexbuffers::Indirect(data_, parent_width_); } template bool Mutate(const uint8_t *dest, T t, size_t byte_width, BitWidth value_width) { auto fits = static_cast(static_cast(1U) << value_width) <= byte_width; if (fits) { t = flatbuffers::EndianScalar(t); memcpy(const_cast(dest), &t, byte_width); } return fits; } template bool MutateF(const uint8_t *dest, T t, size_t byte_width, BitWidth value_width) { if (byte_width == sizeof(double)) return Mutate(dest, static_cast(t), byte_width, value_width); if (byte_width == sizeof(float)) return Mutate(dest, static_cast(t), byte_width, value_width); FLATBUFFERS_ASSERT(false); return false; } friend class Verifier; const uint8_t *data_; uint8_t parent_width_; uint8_t byte_width_; Type type_; }; // Template specialization for As(). template<> inline bool Reference::As() const { return AsBool(); } template<> inline int8_t Reference::As() const { return AsInt8(); } template<> inline int16_t Reference::As() const { return AsInt16(); } template<> inline int32_t Reference::As() const { return AsInt32(); } template<> inline int64_t Reference::As() const { return AsInt64(); } template<> inline uint8_t Reference::As() const { return AsUInt8(); } template<> inline uint16_t Reference::As() const { return AsUInt16(); } template<> inline uint32_t Reference::As() const { return AsUInt32(); } template<> inline uint64_t Reference::As() const { return AsUInt64(); } template<> inline double Reference::As() const { return AsDouble(); } template<> inline float Reference::As() const { return AsFloat(); } template<> inline String Reference::As() const { return AsString(); } template<> inline std::string Reference::As() const { return AsString().str(); } template<> inline Blob Reference::As() const { return AsBlob(); } template<> inline Vector Reference::As() const { return AsVector(); } template<> inline TypedVector Reference::As() const { return AsTypedVector(); } template<> inline FixedTypedVector Reference::As() const { return AsFixedTypedVector(); } template<> inline Map Reference::As() const { return AsMap(); } inline uint8_t PackedType(BitWidth bit_width, Type type) { return static_cast(bit_width | (type << 2)); } inline uint8_t NullPackedType() { return PackedType(BIT_WIDTH_8, FBT_NULL); } // Vector accessors. // Note: if you try to access outside of bounds, you get a Null value back // instead. Normally this would be an assert, but since this is "dynamically // typed" data, you may not want that (someone sends you a 2d vector and you // wanted 3d). // The Null converts seamlessly into a default value for any other type. // TODO(wvo): Could introduce an #ifdef that makes this into an assert? inline Reference Vector::operator[](size_t i) const { auto len = size(); if (i >= len) return Reference(nullptr, 1, NullPackedType()); auto packed_type = (data_ + len * byte_width_)[i]; auto elem = data_ + i * byte_width_; return Reference(elem, byte_width_, packed_type); } inline Reference TypedVector::operator[](size_t i) const { auto len = size(); if (i >= len) return Reference(nullptr, 1, NullPackedType()); auto elem = data_ + i * byte_width_; return Reference(elem, byte_width_, 1, type_); } inline Reference FixedTypedVector::operator[](size_t i) const { if (i >= len_) return Reference(nullptr, 1, NullPackedType()); auto elem = data_ + i * byte_width_; return Reference(elem, byte_width_, 1, type_); } template int KeyCompare(const void *key, const void *elem) { auto str_elem = reinterpret_cast( Indirect(reinterpret_cast(elem))); auto skey = reinterpret_cast(key); return strcmp(skey, str_elem); } inline Reference Map::operator[](const char *key) const { auto keys = Keys(); // We can't pass keys.byte_width_ to the comparison function, so we have // to pick the right one ahead of time. int (*comp)(const void *, const void *) = nullptr; switch (keys.byte_width_) { case 1: comp = KeyCompare; break; case 2: comp = KeyCompare; break; case 4: comp = KeyCompare; break; case 8: comp = KeyCompare; break; default: FLATBUFFERS_ASSERT(false); return Reference(); } auto res = std::bsearch(key, keys.data_, keys.size(), keys.byte_width_, comp); if (!res) return Reference(nullptr, 1, NullPackedType()); auto i = (reinterpret_cast(res) - keys.data_) / keys.byte_width_; return (*static_cast(this))[i]; } inline Reference Map::operator[](const std::string &key) const { return (*this)[key.c_str()]; } inline Reference GetRoot(const uint8_t *buffer, size_t size) { // See Finish() below for the serialization counterpart of this. // The root starts at the end of the buffer, so we parse backwards from there. auto end = buffer + size; auto byte_width = *--end; auto packed_type = *--end; end -= byte_width; // The root data item. return Reference(end, byte_width, packed_type); } inline Reference GetRoot(const std::vector &buffer) { return GetRoot(buffer.data(), buffer.size()); } // Flags that configure how the Builder behaves. // The "Share" flags determine if the Builder automatically tries to pool // this type. Pooling can reduce the size of serialized data if there are // multiple maps of the same kind, at the expense of slightly slower // serialization (the cost of lookups) and more memory use (std::set). // By default this is on for keys, but off for strings. // Turn keys off if you have e.g. only one map. // Turn strings on if you expect many non-unique string values. // Additionally, sharing key vectors can save space if you have maps with // identical field populations. enum BuilderFlag { BUILDER_FLAG_NONE = 0, BUILDER_FLAG_SHARE_KEYS = 1, BUILDER_FLAG_SHARE_STRINGS = 2, BUILDER_FLAG_SHARE_KEYS_AND_STRINGS = 3, BUILDER_FLAG_SHARE_KEY_VECTORS = 4, BUILDER_FLAG_SHARE_ALL = 7, }; class Builder FLATBUFFERS_FINAL_CLASS { public: Builder(size_t initial_size = 256, BuilderFlag flags = BUILDER_FLAG_SHARE_KEYS) : buf_(initial_size), finished_(false), has_duplicate_keys_(false), flags_(flags), force_min_bit_width_(BIT_WIDTH_8), key_pool(KeyOffsetCompare(buf_)), string_pool(StringOffsetCompare(buf_)) { buf_.clear(); } #ifdef FLATBUFFERS_DEFAULT_DECLARATION Builder(Builder &&) = default; Builder &operator=(Builder &&) = default; #endif /// @brief Get the serialized buffer (after you call `Finish()`). /// @return Returns a vector owned by this class. const std::vector &GetBuffer() const { Finished(); return buf_; } // Size of the buffer. Does not include unfinished values. size_t GetSize() const { return buf_.size(); } // Reset all state so we can re-use the buffer. void Clear() { buf_.clear(); stack_.clear(); finished_ = false; // flags_ remains as-is; force_min_bit_width_ = BIT_WIDTH_8; key_pool.clear(); string_pool.clear(); } // All value constructing functions below have two versions: one that // takes a key (for placement inside a map) and one that doesn't (for inside // vectors and elsewhere). void Null() { stack_.push_back(Value()); } void Null(const char *key) { Key(key); Null(); } void Int(int64_t i) { stack_.push_back(Value(i, FBT_INT, WidthI(i))); } void Int(const char *key, int64_t i) { Key(key); Int(i); } void UInt(uint64_t u) { stack_.push_back(Value(u, FBT_UINT, WidthU(u))); } void UInt(const char *key, uint64_t u) { Key(key); UInt(u); } void Float(float f) { stack_.push_back(Value(f)); } void Float(const char *key, float f) { Key(key); Float(f); } void Double(double f) { stack_.push_back(Value(f)); } void Double(const char *key, double d) { Key(key); Double(d); } void Bool(bool b) { stack_.push_back(Value(b)); } void Bool(const char *key, bool b) { Key(key); Bool(b); } void IndirectInt(int64_t i) { PushIndirect(i, FBT_INDIRECT_INT, WidthI(i)); } void IndirectInt(const char *key, int64_t i) { Key(key); IndirectInt(i); } void IndirectUInt(uint64_t u) { PushIndirect(u, FBT_INDIRECT_UINT, WidthU(u)); } void IndirectUInt(const char *key, uint64_t u) { Key(key); IndirectUInt(u); } void IndirectFloat(float f) { PushIndirect(f, FBT_INDIRECT_FLOAT, BIT_WIDTH_32); } void IndirectFloat(const char *key, float f) { Key(key); IndirectFloat(f); } void IndirectDouble(double f) { PushIndirect(f, FBT_INDIRECT_FLOAT, WidthF(f)); } void IndirectDouble(const char *key, double d) { Key(key); IndirectDouble(d); } size_t Key(const char *str, size_t len) { auto sloc = buf_.size(); WriteBytes(str, len + 1); if (flags_ & BUILDER_FLAG_SHARE_KEYS) { auto it = key_pool.find(sloc); if (it != key_pool.end()) { // Already in the buffer. Remove key we just serialized, and use // existing offset instead. buf_.resize(sloc); sloc = *it; } else { key_pool.insert(sloc); } } stack_.push_back(Value(static_cast(sloc), FBT_KEY, BIT_WIDTH_8)); return sloc; } size_t Key(const char *str) { return Key(str, strlen(str)); } size_t Key(const std::string &str) { return Key(str.c_str(), str.size()); } size_t String(const char *str, size_t len) { auto reset_to = buf_.size(); auto sloc = CreateBlob(str, len, 1, FBT_STRING); if (flags_ & BUILDER_FLAG_SHARE_STRINGS) { StringOffset so(sloc, len); auto it = string_pool.find(so); if (it != string_pool.end()) { // Already in the buffer. Remove string we just serialized, and use // existing offset instead. buf_.resize(reset_to); sloc = it->first; stack_.back().u_ = sloc; } else { string_pool.insert(so); } } return sloc; } size_t String(const char *str) { return String(str, strlen(str)); } size_t String(const std::string &str) { return String(str.c_str(), str.size()); } void String(const flexbuffers::String &str) { String(str.c_str(), str.length()); } void String(const char *key, const char *str) { Key(key); String(str); } void String(const char *key, const std::string &str) { Key(key); String(str); } void String(const char *key, const flexbuffers::String &str) { Key(key); String(str); } size_t Blob(const void *data, size_t len) { return CreateBlob(data, len, 0, FBT_BLOB); } size_t Blob(const std::vector &v) { return CreateBlob(v.data(), v.size(), 0, FBT_BLOB); } void Blob(const char *key, const void *data, size_t len) { Key(key); Blob(data, len); } void Blob(const char *key, const std::vector &v) { Key(key); Blob(v); } // TODO(wvo): support all the FlexBuffer types (like flexbuffers::String), // e.g. Vector etc. Also in overloaded versions. // Also some FlatBuffers types? size_t StartVector() { return stack_.size(); } size_t StartVector(const char *key) { Key(key); return stack_.size(); } size_t StartMap() { return stack_.size(); } size_t StartMap(const char *key) { Key(key); return stack_.size(); } // TODO(wvo): allow this to specify an alignment greater than the natural // alignment. size_t EndVector(size_t start, bool typed, bool fixed) { auto vec = CreateVector(start, stack_.size() - start, 1, typed, fixed); // Remove temp elements and return vector. stack_.resize(start); stack_.push_back(vec); return static_cast(vec.u_); } size_t EndMap(size_t start) { // We should have interleaved keys and values on the stack. // Make sure it is an even number: auto len = stack_.size() - start; FLATBUFFERS_ASSERT(!(len & 1)); len /= 2; // Make sure keys are all strings: for (auto key = start; key < stack_.size(); key += 2) { FLATBUFFERS_ASSERT(stack_[key].type_ == FBT_KEY); } // Now sort values, so later we can do a binary search lookup. // We want to sort 2 array elements at a time. struct TwoValue { Value key; Value val; }; // TODO(wvo): strict aliasing? // TODO(wvo): allow the caller to indicate the data is already sorted // for maximum efficiency? With an assert to check sortedness to make sure // we're not breaking binary search. // Or, we can track if the map is sorted as keys are added which would be // be quite cheap (cheaper than checking it here), so we can skip this // step automatically when appliccable, and encourage people to write in // sorted fashion. // std::sort is typically already a lot faster on sorted data though. auto dict = reinterpret_cast(stack_.data() + start); std::sort( dict, dict + len, [&](const TwoValue &a, const TwoValue &b) -> bool { auto as = reinterpret_cast(buf_.data() + a.key.u_); auto bs = reinterpret_cast(buf_.data() + b.key.u_); auto comp = strcmp(as, bs); // We want to disallow duplicate keys, since this results in a // map where values cannot be found. // But we can't assert here (since we don't want to fail on // random JSON input) or have an error mechanism. // Instead, we set has_duplicate_keys_ in the builder to // signal this. // TODO: Have to check for pointer equality, as some sort // implementation apparently call this function with the same // element?? Why? if (!comp && &a != &b) has_duplicate_keys_ = true; return comp < 0; }); // First create a vector out of all keys. // TODO(wvo): if kBuilderFlagShareKeyVectors is true, see if we can share // the first vector. auto keys = CreateVector(start, len, 2, true, false); auto vec = CreateVector(start + 1, len, 2, false, false, &keys); // Remove temp elements and return map. stack_.resize(start); stack_.push_back(vec); return static_cast(vec.u_); } // Call this after EndMap to see if the map had any duplicate keys. // Any map with such keys won't be able to retrieve all values. bool HasDuplicateKeys() const { return has_duplicate_keys_; } template size_t Vector(F f) { auto start = StartVector(); f(); return EndVector(start, false, false); } template size_t Vector(F f, T &state) { auto start = StartVector(); f(state); return EndVector(start, false, false); } template size_t Vector(const char *key, F f) { auto start = StartVector(key); f(); return EndVector(start, false, false); } template size_t Vector(const char *key, F f, T &state) { auto start = StartVector(key); f(state); return EndVector(start, false, false); } template void Vector(const T *elems, size_t len) { if (flatbuffers::is_scalar::value) { // This path should be a lot quicker and use less space. ScalarVector(elems, len, false); } else { auto start = StartVector(); for (size_t i = 0; i < len; i++) Add(elems[i]); EndVector(start, false, false); } } template void Vector(const char *key, const T *elems, size_t len) { Key(key); Vector(elems, len); } template void Vector(const std::vector &vec) { Vector(vec.data(), vec.size()); } template size_t TypedVector(F f) { auto start = StartVector(); f(); return EndVector(start, true, false); } template size_t TypedVector(F f, T &state) { auto start = StartVector(); f(state); return EndVector(start, true, false); } template size_t TypedVector(const char *key, F f) { auto start = StartVector(key); f(); return EndVector(start, true, false); } template size_t TypedVector(const char *key, F f, T &state) { auto start = StartVector(key); f(state); return EndVector(start, true, false); } template size_t FixedTypedVector(const T *elems, size_t len) { // We only support a few fixed vector lengths. Anything bigger use a // regular typed vector. FLATBUFFERS_ASSERT(len >= 2 && len <= 4); // And only scalar values. static_assert(flatbuffers::is_scalar::value, "Unrelated types"); return ScalarVector(elems, len, true); } template size_t FixedTypedVector(const char *key, const T *elems, size_t len) { Key(key); return FixedTypedVector(elems, len); } template size_t Map(F f) { auto start = StartMap(); f(); return EndMap(start); } template size_t Map(F f, T &state) { auto start = StartMap(); f(state); return EndMap(start); } template size_t Map(const char *key, F f) { auto start = StartMap(key); f(); return EndMap(start); } template size_t Map(const char *key, F f, T &state) { auto start = StartMap(key); f(state); return EndMap(start); } template void Map(const std::map &map) { auto start = StartMap(); for (auto it = map.begin(); it != map.end(); ++it) Add(it->first.c_str(), it->second); EndMap(start); } // If you wish to share a value explicitly (a value not shared automatically // through one of the BUILDER_FLAG_SHARE_* flags) you can do so with these // functions. Or if you wish to turn those flags off for performance reasons // and still do some explicit sharing. For example: // builder.IndirectDouble(M_PI); // auto id = builder.LastValue(); // Remember where we stored it. // .. more code goes here .. // builder.ReuseValue(id); // Refers to same double by offset. // LastValue works regardless of whether the value has a key or not. // Works on any data type. struct Value; Value LastValue() { return stack_.back(); } void ReuseValue(Value v) { stack_.push_back(v); } void ReuseValue(const char *key, Value v) { Key(key); ReuseValue(v); } // Overloaded Add that tries to call the correct function above. void Add(int8_t i) { Int(i); } void Add(int16_t i) { Int(i); } void Add(int32_t i) { Int(i); } void Add(int64_t i) { Int(i); } void Add(uint8_t u) { UInt(u); } void Add(uint16_t u) { UInt(u); } void Add(uint32_t u) { UInt(u); } void Add(uint64_t u) { UInt(u); } void Add(float f) { Float(f); } void Add(double d) { Double(d); } void Add(bool b) { Bool(b); } void Add(const char *str) { String(str); } void Add(const std::string &str) { String(str); } void Add(const flexbuffers::String &str) { String(str); } template void Add(const std::vector &vec) { Vector(vec); } template void Add(const char *key, const T &t) { Key(key); Add(t); } template void Add(const std::map &map) { Map(map); } template void operator+=(const T &t) { Add(t); } // This function is useful in combination with the Mutate* functions above. // It forces elements of vectors and maps to have a minimum size, such that // they can later be updated without failing. // Call with no arguments to reset. void ForceMinimumBitWidth(BitWidth bw = BIT_WIDTH_8) { force_min_bit_width_ = bw; } void Finish() { // If you hit this assert, you likely have objects that were never included // in a parent. You need to have exactly one root to finish a buffer. // Check your Start/End calls are matched, and all objects are inside // some other object. FLATBUFFERS_ASSERT(stack_.size() == 1); // Write root value. auto byte_width = Align(stack_[0].ElemWidth(buf_.size(), 0)); WriteAny(stack_[0], byte_width); // Write root type. Write(stack_[0].StoredPackedType(), 1); // Write root size. Normally determined by parent, but root has no parent :) Write(byte_width, 1); finished_ = true; } private: void Finished() const { // If you get this assert, you're attempting to get access a buffer // which hasn't been finished yet. Be sure to call // Builder::Finish with your root object. FLATBUFFERS_ASSERT(finished_); } // Align to prepare for writing a scalar with a certain size. uint8_t Align(BitWidth alignment) { auto byte_width = 1U << alignment; buf_.insert(buf_.end(), flatbuffers::PaddingBytes(buf_.size(), byte_width), 0); return static_cast(byte_width); } void WriteBytes(const void *val, size_t size) { buf_.insert(buf_.end(), reinterpret_cast(val), reinterpret_cast(val) + size); } template void Write(T val, size_t byte_width) { FLATBUFFERS_ASSERT(sizeof(T) >= byte_width); val = flatbuffers::EndianScalar(val); WriteBytes(&val, byte_width); } void WriteDouble(double f, uint8_t byte_width) { switch (byte_width) { case 8: Write(f, byte_width); break; case 4: Write(static_cast(f), byte_width); break; // case 2: Write(static_cast(f), byte_width); break; // case 1: Write(static_cast(f), byte_width); break; default: FLATBUFFERS_ASSERT(0); } } void WriteOffset(uint64_t o, uint8_t byte_width) { auto reloff = buf_.size() - o; FLATBUFFERS_ASSERT(byte_width == 8 || reloff < 1ULL << (byte_width * 8)); Write(reloff, byte_width); } template void PushIndirect(T val, Type type, BitWidth bit_width) { auto byte_width = Align(bit_width); auto iloc = buf_.size(); Write(val, byte_width); stack_.push_back(Value(static_cast(iloc), type, bit_width)); } static BitWidth WidthB(size_t byte_width) { switch (byte_width) { case 1: return BIT_WIDTH_8; case 2: return BIT_WIDTH_16; case 4: return BIT_WIDTH_32; case 8: return BIT_WIDTH_64; default: FLATBUFFERS_ASSERT(false); return BIT_WIDTH_64; } } template static Type GetScalarType() { static_assert(flatbuffers::is_scalar::value, "Unrelated types"); return flatbuffers::is_floating_point::value ? FBT_FLOAT : flatbuffers::is_same::value ? FBT_BOOL : (flatbuffers::is_unsigned::value ? FBT_UINT : FBT_INT); } public: // This was really intended to be private, except for LastValue/ReuseValue. struct Value { union { int64_t i_; uint64_t u_; double f_; }; Type type_; // For scalars: of itself, for vector: of its elements, for string: length. BitWidth min_bit_width_; Value() : i_(0), type_(FBT_NULL), min_bit_width_(BIT_WIDTH_8) {} Value(bool b) : u_(static_cast(b)), type_(FBT_BOOL), min_bit_width_(BIT_WIDTH_8) {} Value(int64_t i, Type t, BitWidth bw) : i_(i), type_(t), min_bit_width_(bw) {} Value(uint64_t u, Type t, BitWidth bw) : u_(u), type_(t), min_bit_width_(bw) {} Value(float f) : f_(static_cast(f)), type_(FBT_FLOAT), min_bit_width_(BIT_WIDTH_32) {} Value(double f) : f_(f), type_(FBT_FLOAT), min_bit_width_(WidthF(f)) {} uint8_t StoredPackedType(BitWidth parent_bit_width_ = BIT_WIDTH_8) const { return PackedType(StoredWidth(parent_bit_width_), type_); } BitWidth ElemWidth(size_t buf_size, size_t elem_index) const { if (IsInline(type_)) { return min_bit_width_; } else { // We have an absolute offset, but want to store a relative offset // elem_index elements beyond the current buffer end. Since whether // the relative offset fits in a certain byte_width depends on // the size of the elements before it (and their alignment), we have // to test for each size in turn. for (size_t byte_width = 1; byte_width <= sizeof(flatbuffers::largest_scalar_t); byte_width *= 2) { // Where are we going to write this offset? auto offset_loc = buf_size + flatbuffers::PaddingBytes(buf_size, byte_width) + elem_index * byte_width; // Compute relative offset. auto offset = offset_loc - u_; // Does it fit? auto bit_width = WidthU(offset); if (static_cast(static_cast(1U) << bit_width) == byte_width) return bit_width; } FLATBUFFERS_ASSERT(false); // Must match one of the sizes above. return BIT_WIDTH_64; } } BitWidth StoredWidth(BitWidth parent_bit_width_ = BIT_WIDTH_8) const { if (IsInline(type_)) { return (std::max)(min_bit_width_, parent_bit_width_); } else { return min_bit_width_; } } }; private: void WriteAny(const Value &val, uint8_t byte_width) { switch (val.type_) { case FBT_NULL: case FBT_INT: Write(val.i_, byte_width); break; case FBT_BOOL: case FBT_UINT: Write(val.u_, byte_width); break; case FBT_FLOAT: WriteDouble(val.f_, byte_width); break; default: WriteOffset(val.u_, byte_width); break; } } size_t CreateBlob(const void *data, size_t len, size_t trailing, Type type) { auto bit_width = WidthU(len); auto byte_width = Align(bit_width); Write(len, byte_width); auto sloc = buf_.size(); WriteBytes(data, len + trailing); stack_.push_back(Value(static_cast(sloc), type, bit_width)); return sloc; } template size_t ScalarVector(const T *elems, size_t len, bool fixed) { auto vector_type = GetScalarType(); auto byte_width = sizeof(T); auto bit_width = WidthB(byte_width); // If you get this assert, you're trying to write a vector with a size // field that is bigger than the scalars you're trying to write (e.g. a // byte vector > 255 elements). For such types, write a "blob" instead. // TODO: instead of asserting, could write vector with larger elements // instead, though that would be wasteful. FLATBUFFERS_ASSERT(WidthU(len) <= bit_width); Align(bit_width); if (!fixed) Write(len, byte_width); auto vloc = buf_.size(); for (size_t i = 0; i < len; i++) Write(elems[i], byte_width); stack_.push_back(Value(static_cast(vloc), ToTypedVector(vector_type, fixed ? len : 0), bit_width)); return vloc; } Value CreateVector(size_t start, size_t vec_len, size_t step, bool typed, bool fixed, const Value *keys = nullptr) { FLATBUFFERS_ASSERT( !fixed || typed); // typed=false, fixed=true combination is not supported. // Figure out smallest bit width we can store this vector with. auto bit_width = (std::max)(force_min_bit_width_, WidthU(vec_len)); auto prefix_elems = 1; if (keys) { // If this vector is part of a map, we will pre-fix an offset to the keys // to this vector. bit_width = (std::max)(bit_width, keys->ElemWidth(buf_.size(), 0)); prefix_elems += 2; } Type vector_type = FBT_KEY; // Check bit widths and types for all elements. for (size_t i = start; i < stack_.size(); i += step) { auto elem_width = stack_[i].ElemWidth(buf_.size(), i - start + prefix_elems); bit_width = (std::max)(bit_width, elem_width); if (typed) { if (i == start) { vector_type = stack_[i].type_; } else { // If you get this assert, you are writing a typed vector with // elements that are not all the same type. FLATBUFFERS_ASSERT(vector_type == stack_[i].type_); } } } // If you get this assert, your typed types are not one of: // Int / UInt / Float / Key. FLATBUFFERS_ASSERT(!typed || IsTypedVectorElementType(vector_type)); auto byte_width = Align(bit_width); // Write vector. First the keys width/offset if available, and size. if (keys) { WriteOffset(keys->u_, byte_width); Write(1ULL << keys->min_bit_width_, byte_width); } if (!fixed) Write(vec_len, byte_width); // Then the actual data. auto vloc = buf_.size(); for (size_t i = start; i < stack_.size(); i += step) { WriteAny(stack_[i], byte_width); } // Then the types. if (!typed) { for (size_t i = start; i < stack_.size(); i += step) { buf_.push_back(stack_[i].StoredPackedType(bit_width)); } } return Value(static_cast(vloc), keys ? FBT_MAP : (typed ? ToTypedVector(vector_type, fixed ? vec_len : 0) : FBT_VECTOR), bit_width); } // You shouldn't really be copying instances of this class. Builder(const Builder &); Builder &operator=(const Builder &); std::vector buf_; std::vector stack_; bool finished_; bool has_duplicate_keys_; BuilderFlag flags_; BitWidth force_min_bit_width_; struct KeyOffsetCompare { explicit KeyOffsetCompare(const std::vector &buf) : buf_(&buf) {} bool operator()(size_t a, size_t b) const { auto stra = reinterpret_cast(buf_->data() + a); auto strb = reinterpret_cast(buf_->data() + b); return strcmp(stra, strb) < 0; } const std::vector *buf_; }; typedef std::pair StringOffset; struct StringOffsetCompare { explicit StringOffsetCompare(const std::vector &buf) : buf_(&buf) {} bool operator()(const StringOffset &a, const StringOffset &b) const { auto stra = buf_->data() + a.first; auto strb = buf_->data() + b.first; auto cr = memcmp(stra, strb, (std::min)(a.second, b.second) + 1); return cr < 0 || (cr == 0 && a.second < b.second); } const std::vector *buf_; }; typedef std::set KeyOffsetMap; typedef std::set StringOffsetMap; KeyOffsetMap key_pool; StringOffsetMap string_pool; friend class Verifier; }; // Helper class to verify the integrity of a FlexBuffer class Verifier FLATBUFFERS_FINAL_CLASS { public: Verifier(const uint8_t *buf, size_t buf_len, // Supplying this vector likely results in faster verification // of larger buffers with many shared keys/strings, but // comes at the cost of using additional memory the same size of // the buffer being verified, so it is by default off. std::vector *reuse_tracker = nullptr, bool _check_alignment = true, size_t max_depth = 64) : buf_(buf), size_(buf_len), depth_(0), max_depth_(max_depth), num_vectors_(0), max_vectors_(buf_len), check_alignment_(_check_alignment), reuse_tracker_(reuse_tracker) { FLATBUFFERS_ASSERT(size_ < FLATBUFFERS_MAX_BUFFER_SIZE); if (reuse_tracker_) { reuse_tracker_->clear(); reuse_tracker_->resize(size_, PackedType(BIT_WIDTH_8, FBT_NULL)); } } private: // Central location where any verification failures register. bool Check(bool ok) const { // clang-format off #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE FLATBUFFERS_ASSERT(ok); #endif // clang-format on return ok; } // Verify any range within the buffer. bool VerifyFrom(size_t elem, size_t elem_len) const { return Check(elem_len < size_ && elem <= size_ - elem_len); } bool VerifyBefore(size_t elem, size_t elem_len) const { return Check(elem_len <= elem); } bool VerifyFromPointer(const uint8_t *p, size_t len) { auto o = static_cast(p - buf_); return VerifyFrom(o, len); } bool VerifyBeforePointer(const uint8_t *p, size_t len) { auto o = static_cast(p - buf_); return VerifyBefore(o, len); } bool VerifyByteWidth(size_t width) { return Check(width == 1 || width == 2 || width == 4 || width == 8); } bool VerifyType(int type) { return Check(type >= 0 && type < FBT_MAX_TYPE); } bool VerifyOffset(uint64_t off, const uint8_t *p) { return Check(off <= static_cast(size_)) && off <= static_cast(p - buf_); } bool VerifyAlignment(const uint8_t *p, size_t size) const { auto o = static_cast(p - buf_); return Check((o & (size - 1)) == 0 || !check_alignment_); } // Macro, since we want to escape from parent function & use lazy args. #define FLEX_CHECK_VERIFIED(P, PACKED_TYPE) \ if (reuse_tracker_) { \ auto packed_type = PACKED_TYPE; \ auto existing = (*reuse_tracker_)[P - buf_]; \ if (existing == packed_type) return true; \ /* Fail verification if already set with different type! */ \ if (!Check(existing == 0)) return false; \ (*reuse_tracker_)[P - buf_] = packed_type; \ } bool VerifyVector(Reference r, const uint8_t *p, Type elem_type) { // Any kind of nesting goes thru this function, so guard against that // here, both with simple nesting checks, and the reuse tracker if on. depth_++; num_vectors_++; if (!Check(depth_ <= max_depth_ && num_vectors_ <= max_vectors_)) return false; auto size_byte_width = r.byte_width_; FLEX_CHECK_VERIFIED(p, PackedType(Builder::WidthB(size_byte_width), r.type_)); if (!VerifyBeforePointer(p, size_byte_width)) return false; auto sized = Sized(p, size_byte_width); auto num_elems = sized.size(); auto elem_byte_width = r.type_ == FBT_STRING || r.type_ == FBT_BLOB ? uint8_t(1) : r.byte_width_; auto max_elems = SIZE_MAX / elem_byte_width; if (!Check(num_elems < max_elems)) return false; // Protect against byte_size overflowing. auto byte_size = num_elems * elem_byte_width; if (!VerifyFromPointer(p, byte_size)) return false; if (elem_type == FBT_NULL) { // Verify type bytes after the vector. if (!VerifyFromPointer(p + byte_size, num_elems)) return false; auto v = Vector(p, size_byte_width); for (size_t i = 0; i < num_elems; i++) if (!VerifyRef(v[i])) return false; } else if (elem_type == FBT_KEY) { auto v = TypedVector(p, elem_byte_width, FBT_KEY); for (size_t i = 0; i < num_elems; i++) if (!VerifyRef(v[i])) return false; } else { FLATBUFFERS_ASSERT(IsInline(elem_type)); } depth_--; return true; } bool VerifyKeys(const uint8_t *p, uint8_t byte_width) { // The vector part of the map has already been verified. const size_t num_prefixed_fields = 3; if (!VerifyBeforePointer(p, byte_width * num_prefixed_fields)) return false; p -= byte_width * num_prefixed_fields; auto off = ReadUInt64(p, byte_width); if (!VerifyOffset(off, p)) return false; auto key_byte_with = static_cast(ReadUInt64(p + byte_width, byte_width)); if (!VerifyByteWidth(key_byte_with)) return false; return VerifyVector(Reference(p, byte_width, key_byte_with, FBT_VECTOR_KEY), p - off, FBT_KEY); } bool VerifyKey(const uint8_t *p) { FLEX_CHECK_VERIFIED(p, PackedType(BIT_WIDTH_8, FBT_KEY)); while (p < buf_ + size_) if (*p++) return true; return false; } #undef FLEX_CHECK_VERIFIED bool VerifyTerminator(const String &s) { return VerifyFromPointer(reinterpret_cast(s.c_str()), s.size() + 1); } bool VerifyRef(Reference r) { // r.parent_width_ and r.data_ already verified. if (!VerifyByteWidth(r.byte_width_) || !VerifyType(r.type_)) { return false; } if (IsInline(r.type_)) { // Inline scalars, don't require further verification. return true; } // All remaining types are an offset. auto off = ReadUInt64(r.data_, r.parent_width_); if (!VerifyOffset(off, r.data_)) return false; auto p = r.Indirect(); if (!VerifyAlignment(p, r.byte_width_)) return false; switch (r.type_) { case FBT_INDIRECT_INT: case FBT_INDIRECT_UINT: case FBT_INDIRECT_FLOAT: return VerifyFromPointer(p, r.byte_width_); case FBT_KEY: return VerifyKey(p); case FBT_MAP: return VerifyVector(r, p, FBT_NULL) && VerifyKeys(p, r.byte_width_); case FBT_VECTOR: return VerifyVector(r, p, FBT_NULL); case FBT_VECTOR_INT: return VerifyVector(r, p, FBT_INT); case FBT_VECTOR_BOOL: case FBT_VECTOR_UINT: return VerifyVector(r, p, FBT_UINT); case FBT_VECTOR_FLOAT: return VerifyVector(r, p, FBT_FLOAT); case FBT_VECTOR_KEY: return VerifyVector(r, p, FBT_KEY); case FBT_VECTOR_STRING_DEPRECATED: // Use of FBT_KEY here intentional, see elsewhere. return VerifyVector(r, p, FBT_KEY); case FBT_BLOB: return VerifyVector(r, p, FBT_UINT); case FBT_STRING: return VerifyVector(r, p, FBT_UINT) && VerifyTerminator(String(p, r.byte_width_)); case FBT_VECTOR_INT2: case FBT_VECTOR_UINT2: case FBT_VECTOR_FLOAT2: case FBT_VECTOR_INT3: case FBT_VECTOR_UINT3: case FBT_VECTOR_FLOAT3: case FBT_VECTOR_INT4: case FBT_VECTOR_UINT4: case FBT_VECTOR_FLOAT4: { uint8_t len = 0; auto vtype = ToFixedTypedVectorElementType(r.type_, &len); if (!VerifyType(vtype)) return false; return VerifyFromPointer(p, r.byte_width_ * len); } default: return false; } } public: bool VerifyBuffer() { if (!Check(size_ >= 3)) return false; auto end = buf_ + size_; auto byte_width = *--end; auto packed_type = *--end; return VerifyByteWidth(byte_width) && Check(end - buf_ >= byte_width) && VerifyRef(Reference(end - byte_width, byte_width, packed_type)); } private: const uint8_t *buf_; size_t size_; size_t depth_; const size_t max_depth_; size_t num_vectors_; const size_t max_vectors_; bool check_alignment_; std::vector *reuse_tracker_; }; // Utility function that constructs the Verifier for you, see above for // parameters. inline bool VerifyBuffer(const uint8_t *buf, size_t buf_len, std::vector *reuse_tracker = nullptr) { Verifier verifier(buf, buf_len, reuse_tracker); return verifier.VerifyBuffer(); } } // namespace flexbuffers #if defined(_MSC_VER) # pragma warning(pop) #endif #endif // FLATBUFFERS_FLEXBUFFERS_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/grpc.h000066400000000000000000000234411474174441300235030ustar00rootroot00000000000000/* * Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_GRPC_H_ #define FLATBUFFERS_GRPC_H_ // Helper functionality to glue FlatBuffers and GRPC. #include "flatbuffers/flatbuffers.h" #include "grpc/byte_buffer_reader.h" #include "grpcpp/support/byte_buffer.h" #include "grpcpp/support/slice.h" namespace mapserver { namespace flatbuffers { namespace grpc { // Message is a typed wrapper around a buffer that manages the underlying // `grpc_slice` and also provides flatbuffers-specific helpers such as `Verify` // and `GetRoot`. Since it is backed by a `grpc_slice`, the underlying buffer // is refcounted and ownership is be managed automatically. template class Message { public: Message() {} Message(::grpc::Slice slice) : slice_(slice) {} Message &operator=(const Message &other) = delete; Message(Message &&other) = default; Message(const Message &other) = delete; Message &operator=(Message &&other) = default; const uint8_t *mutable_data() const { return slice_.begin(); } const uint8_t *data() const { return slice_.begin(); } size_t size() const { return slice_.size(); } bool Verify() const { Verifier verifier(data(), size()); return verifier.VerifyBuffer(nullptr); } T *GetMutableRoot() { return flatbuffers::GetMutableRoot(mutable_data()); } const T *GetRoot() const { return flatbuffers::GetRoot(data()); } // This is only intended for serializer use, or if you know what you're doing const ::grpc::Slice &BorrowSlice() const { return slice_; } private: ::grpc::Slice slice_; }; class MessageBuilder; // SliceAllocator is a gRPC-specific allocator that uses the `grpc_slice` // refcounted slices to manage memory ownership. This makes it easy and // efficient to transfer buffers to gRPC. class SliceAllocator : public Allocator { public: SliceAllocator() {} SliceAllocator(const SliceAllocator &other) = delete; SliceAllocator &operator=(const SliceAllocator &other) = delete; SliceAllocator(SliceAllocator &&other) { // default-construct and swap idiom swap(other); } SliceAllocator &operator=(SliceAllocator &&other) { // move-construct and swap idiom SliceAllocator temp(std::move(other)); swap(temp); return *this; } void swap(SliceAllocator &other) { using std::swap; swap(slice_, other.slice_); } virtual ~SliceAllocator() {} virtual uint8_t *allocate(size_t size) override { FLATBUFFERS_ASSERT(slice_.size() == 0); slice_ = ::grpc::Slice(size); return const_cast(slice_.begin()); } virtual void deallocate(uint8_t *p, size_t size) override { FLATBUFFERS_ASSERT(p == slice_.begin()); FLATBUFFERS_ASSERT(size == slice_.size()); slice_ = ::grpc::Slice(); } virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front) override { FLATBUFFERS_ASSERT(old_p == slice_.begin()); FLATBUFFERS_ASSERT(old_size == slice_.size()); FLATBUFFERS_ASSERT(new_size > old_size); ::grpc::Slice old_slice = slice_; ::grpc::Slice new_slice = ::grpc::Slice(new_size); uint8_t *new_p = const_cast(new_slice.begin()); memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, in_use_front); slice_ = new_slice; return new_p; } private: ::grpc::Slice &get_slice(uint8_t *p, size_t size) { FLATBUFFERS_ASSERT(p == slice_.begin()); FLATBUFFERS_ASSERT(size == slice_.size()); return slice_; } ::grpc::Slice slice_; friend class MessageBuilder; }; // SliceAllocatorMember is a hack to ensure that the MessageBuilder's // slice_allocator_ member is constructed before the FlatBufferBuilder, since // the allocator is used in the FlatBufferBuilder ctor. namespace detail { struct SliceAllocatorMember { SliceAllocator slice_allocator_; }; } // namespace detail // MessageBuilder is a gRPC-specific FlatBufferBuilder that uses SliceAllocator // to allocate gRPC buffers. class MessageBuilder : private detail::SliceAllocatorMember, public FlatBufferBuilder { public: explicit MessageBuilder(uoffset_t initial_size = 1024) : FlatBufferBuilder(initial_size, &slice_allocator_, false) {} MessageBuilder(const MessageBuilder &other) = delete; MessageBuilder &operator=(const MessageBuilder &other) = delete; MessageBuilder(MessageBuilder &&other) : FlatBufferBuilder(1024, &slice_allocator_, false) { // Default construct and swap idiom. Swap(other); } /// Create a MessageBuilder from a FlatBufferBuilder. explicit MessageBuilder(FlatBufferBuilder &&src, void (*dealloc)(void *, size_t) = &DefaultAllocator::dealloc) : FlatBufferBuilder(1024, &slice_allocator_, false) { src.Swap(*this); src.SwapBufAllocator(*this); if (buf_.capacity()) { uint8_t *buf = buf_.scratch_data(); // pointer to memory size_t capacity = buf_.capacity(); // size of memory slice_allocator_.slice_ = ::grpc::Slice(buf, capacity, dealloc); } else { slice_allocator_.slice_ = ::grpc::Slice(); } } /// Move-assign a FlatBufferBuilder to a MessageBuilder. /// Only FlatBufferBuilder with default allocator (basically, nullptr) is /// supported. MessageBuilder &operator=(FlatBufferBuilder &&src) { // Move construct a temporary and swap MessageBuilder temp(std::move(src)); Swap(temp); return *this; } MessageBuilder &operator=(MessageBuilder &&other) { // Move construct a temporary and swap MessageBuilder temp(std::move(other)); Swap(temp); return *this; } void Swap(MessageBuilder &other) { slice_allocator_.swap(other.slice_allocator_); FlatBufferBuilder::Swap(other); // After swapping the FlatBufferBuilder, we swap back the allocator, which // restores the original allocator back in place. This is necessary because // MessageBuilder's allocator is its own member (SliceAllocatorMember). The // allocator passed to FlatBufferBuilder::vector_downward must point to this // member. buf_.swap_allocator(other.buf_); } // Releases the ownership of the buffer pointer. // Returns the size, offset, and the original grpc_slice that // allocated the buffer. Also see grpc_slice_unref(). uint8_t *ReleaseRaw(size_t &size, size_t &offset, ::grpc::Slice &slice) { uint8_t *buf = FlatBufferBuilder::ReleaseRaw(size, offset); slice = slice_allocator_.slice_; slice_allocator_.slice_ = ::grpc::Slice(); return buf; } ~MessageBuilder() {} // GetMessage extracts the subslice of the buffer corresponding to the // flatbuffers-encoded region and wraps it in a `Message` to handle buffer // ownership. template Message GetMessage() { auto buf_data = buf_.scratch_data(); // pointer to memory auto buf_size = buf_.capacity(); // size of memory auto msg_data = buf_.data(); // pointer to msg auto msg_size = buf_.size(); // size of msg // Do some sanity checks on data/size FLATBUFFERS_ASSERT(msg_data); FLATBUFFERS_ASSERT(msg_size); FLATBUFFERS_ASSERT(msg_data >= buf_data); FLATBUFFERS_ASSERT(msg_data + msg_size <= buf_data + buf_size); // Calculate offsets from the buffer start auto begin = msg_data - buf_data; auto end = begin + msg_size; // Get the slice we are working with (no refcount change) ::grpc::Slice slice = slice_allocator_.get_slice(buf_data, buf_size); // Extract a subslice of the existing slice (increment refcount) ::grpc::Slice subslice = slice.sub(begin, end); // Wrap the subslice in a `Message`, but don't increment refcount Message msg(subslice); return msg; } template Message ReleaseMessage() { Message msg = GetMessage(); Reset(); return msg; } private: // SliceAllocator slice_allocator_; // part of SliceAllocatorMember }; } // namespace grpc } // namespace flatbuffers } // namespace mapserver namespace grpc { template class SerializationTraits> { public: static grpc::Status Serialize(const flatbuffers::grpc::Message &msg, ByteBuffer *buffer, bool *own_buffer) { // Package the single slice into a `ByteBuffer`, // incrementing the refcount in the process. *buffer = ByteBuffer(&msg.BorrowSlice(), 1); *own_buffer = true; return grpc::Status::OK; } // Deserialize by pulling the static grpc::Status Deserialize(ByteBuffer *buf, flatbuffers::grpc::Message *msg) { Slice slice; if (!buf->TrySingleSlice(&slice).ok()) { if (!buf->DumpToSingleSlice(&slice).ok()) { buf->Clear(); return ::grpc::Status(::grpc::StatusCode::INTERNAL, "No payload"); } } *msg = flatbuffers::grpc::Message(slice); buf->Clear(); #if FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION return ::grpc::Status::OK; #else if (msg->Verify()) { return ::grpc::Status::OK; } else { return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Message verification failed"); } #endif } }; } // namespace grpc #endif // FLATBUFFERS_GRPC_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/hash.h000066400000000000000000000071331474174441300234730ustar00rootroot00000000000000/* * Copyright 2015 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_HASH_H_ #define FLATBUFFERS_HASH_H_ #include #include #include "flatbuffers/flatbuffers.h" namespace mapserver { namespace flatbuffers { template struct FnvTraits { static const T kFnvPrime; static const T kOffsetBasis; }; template<> struct FnvTraits { static const uint32_t kFnvPrime = 0x01000193; static const uint32_t kOffsetBasis = 0x811C9DC5; }; template<> struct FnvTraits { static const uint64_t kFnvPrime = 0x00000100000001b3ULL; static const uint64_t kOffsetBasis = 0xcbf29ce484222645ULL; }; template T HashFnv1(const char *input) { T hash = FnvTraits::kOffsetBasis; for (const char *c = input; *c; ++c) { hash *= FnvTraits::kFnvPrime; hash ^= static_cast(*c); } return hash; } template T HashFnv1a(const char *input) { T hash = FnvTraits::kOffsetBasis; for (const char *c = input; *c; ++c) { hash ^= static_cast(*c); hash *= FnvTraits::kFnvPrime; } return hash; } template<> inline uint16_t HashFnv1(const char *input) { uint32_t hash = HashFnv1(input); return (hash >> 16) ^ (hash & 0xffff); } template<> inline uint16_t HashFnv1a(const char *input) { uint32_t hash = HashFnv1a(input); return (hash >> 16) ^ (hash & 0xffff); } template struct NamedHashFunction { const char *name; typedef T (*HashFunction)(const char *); HashFunction function; }; const NamedHashFunction kHashFunctions16[] = { { "fnv1_16", HashFnv1 }, { "fnv1a_16", HashFnv1a }, }; const NamedHashFunction kHashFunctions32[] = { { "fnv1_32", HashFnv1 }, { "fnv1a_32", HashFnv1a }, }; const NamedHashFunction kHashFunctions64[] = { { "fnv1_64", HashFnv1 }, { "fnv1a_64", HashFnv1a }, }; inline NamedHashFunction::HashFunction FindHashFunction16( const char *name) { std::size_t size = sizeof(kHashFunctions16) / sizeof(kHashFunctions16[0]); for (std::size_t i = 0; i < size; ++i) { if (std::strcmp(name, kHashFunctions16[i].name) == 0) { return kHashFunctions16[i].function; } } return nullptr; } inline NamedHashFunction::HashFunction FindHashFunction32( const char *name) { std::size_t size = sizeof(kHashFunctions32) / sizeof(kHashFunctions32[0]); for (std::size_t i = 0; i < size; ++i) { if (std::strcmp(name, kHashFunctions32[i].name) == 0) { return kHashFunctions32[i].function; } } return nullptr; } inline NamedHashFunction::HashFunction FindHashFunction64( const char *name) { std::size_t size = sizeof(kHashFunctions64) / sizeof(kHashFunctions64[0]); for (std::size_t i = 0; i < size; ++i) { if (std::strcmp(name, kHashFunctions64[i].name) == 0) { return kHashFunctions64[i].function; } } return nullptr; } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_HASH_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/idl.h000066400000000000000000001306471474174441300233270ustar00rootroot00000000000000/* * Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_IDL_H_ #define FLATBUFFERS_IDL_H_ #include #include #include #include #include "flatbuffers/base.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/flexbuffers.h" #include "flatbuffers/hash.h" #include "flatbuffers/reflection.h" // This file defines the data types representing a parsed IDL (Interface // Definition Language) / schema file. // Limits maximum depth of nested objects. // Prevents stack overflow while parse scheme, or json, or flexbuffer. #if !defined(FLATBUFFERS_MAX_PARSING_DEPTH) # define FLATBUFFERS_MAX_PARSING_DEPTH 64 #endif namespace mapserver { namespace flatbuffers { // The order of these matters for Is*() functions below. // Additionally, Parser::ParseType assumes bool..string is a contiguous range // of type tokens. // clang-format off #define FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ TD(NONE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) \ TD(UTYPE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) /* begin scalar/int */ \ TD(BOOL, "bool", uint8_t, boolean,bool, bool, bool, bool, Boolean, Bool) \ TD(CHAR, "byte", int8_t, byte, int8, sbyte, int8, i8, Byte, Int8) \ TD(UCHAR, "ubyte", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) \ TD(SHORT, "short", int16_t, short, int16, short, int16, i16, Short, Int16) \ TD(USHORT, "ushort", uint16_t, short, uint16, ushort, uint16, u16, UShort, UInt16) \ TD(INT, "int", int32_t, int, int32, int, int32, i32, Int, Int32) \ TD(UINT, "uint", uint32_t, int, uint32, uint, uint32, u32, UInt, UInt32) \ TD(LONG, "long", int64_t, long, int64, long, int64, i64, Long, Int64) \ TD(ULONG, "ulong", uint64_t, long, uint64, ulong, uint64, u64, ULong, UInt64) /* end int */ \ TD(FLOAT, "float", float, float, float32, float, float32, f32, Float, Float32) /* begin float */ \ TD(DOUBLE, "double", double, double, float64, double, float64, f64, Double, Double) /* end float/scalar */ #define FLATBUFFERS_GEN_TYPES_POINTER(TD) \ TD(STRING, "string", Offset, int, int, StringOffset, int, unused, Int, Offset) \ TD(VECTOR, "", Offset, int, int, VectorOffset, int, unused, Int, Offset) \ TD(STRUCT, "", Offset, int, int, int, int, unused, Int, Offset) \ TD(UNION, "", Offset, int, int, int, int, unused, Int, Offset) #define FLATBUFFERS_GEN_TYPE_ARRAY(TD) \ TD(ARRAY, "", int, int, int, int, int, unused, Int, Offset) // The fields are: // - enum // - FlatBuffers schema type. // - C++ type. // - Java type. // - Go type. // - C# / .Net type. // - Python type. // - Kotlin type. // - Rust type. // using these macros, we can now write code dealing with types just once, e.g. /* switch (type) { #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \ RTYPE, KTYPE) \ case BASE_TYPE_ ## ENUM: \ // do something specific to CTYPE here FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD } */ // If not all FLATBUFFERS_GEN_() arguments are necessary for implementation // of FLATBUFFERS_TD, you can use a variadic macro (with __VA_ARGS__ if needed). // In the above example, only CTYPE is used to generate the code, it can be rewritten: /* switch (type) { #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \ case BASE_TYPE_ ## ENUM: \ // do something specific to CTYPE here FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD } */ #define FLATBUFFERS_GEN_TYPES(TD) \ FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ FLATBUFFERS_GEN_TYPES_POINTER(TD) \ FLATBUFFERS_GEN_TYPE_ARRAY(TD) // Create an enum for all the types above. #ifdef __GNUC__ __extension__ // Stop GCC complaining about trailing comma with -Wpendantic. #endif enum BaseType { #define FLATBUFFERS_TD(ENUM, ...) \ BASE_TYPE_ ## ENUM, FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD }; #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \ static_assert(sizeof(CTYPE) <= sizeof(largest_scalar_t), \ "define largest_scalar_t as " #CTYPE); FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD inline bool IsScalar (BaseType t) { return t >= BASE_TYPE_UTYPE && t <= BASE_TYPE_DOUBLE; } inline bool IsInteger(BaseType t) { return t >= BASE_TYPE_UTYPE && t <= BASE_TYPE_ULONG; } inline bool IsFloat (BaseType t) { return t == BASE_TYPE_FLOAT || t == BASE_TYPE_DOUBLE; } inline bool IsLong (BaseType t) { return t == BASE_TYPE_LONG || t == BASE_TYPE_ULONG; } inline bool IsBool (BaseType t) { return t == BASE_TYPE_BOOL; } inline bool IsOneByte(BaseType t) { return t >= BASE_TYPE_UTYPE && t <= BASE_TYPE_UCHAR; } inline bool IsUnsigned(BaseType t) { return (t == BASE_TYPE_UTYPE) || (t == BASE_TYPE_UCHAR) || (t == BASE_TYPE_USHORT) || (t == BASE_TYPE_UINT) || (t == BASE_TYPE_ULONG); } // clang-format on extern const char *const kTypeNames[]; extern const char kTypeSizes[]; inline size_t SizeOf(BaseType t) { return kTypeSizes[t]; } struct StructDef; struct EnumDef; class Parser; // Represents any type in the IDL, which is a combination of the BaseType // and additional information for vectors/structs_. struct Type { explicit Type(BaseType _base_type = BASE_TYPE_NONE, StructDef *_sd = nullptr, EnumDef *_ed = nullptr, uint16_t _fixed_length = 0) : base_type(_base_type), element(BASE_TYPE_NONE), struct_def(_sd), enum_def(_ed), fixed_length(_fixed_length) {} bool operator==(const Type &o) { return base_type == o.base_type && element == o.element && struct_def == o.struct_def && enum_def == o.enum_def; } Type VectorType() const { return Type(element, struct_def, enum_def, fixed_length); } Offset Serialize(FlatBufferBuilder *builder) const; bool Deserialize(const Parser &parser, const reflection::Type *type); BaseType base_type; BaseType element; // only set if t == BASE_TYPE_VECTOR StructDef *struct_def; // only set if t or element == BASE_TYPE_STRUCT EnumDef *enum_def; // set if t == BASE_TYPE_UNION / BASE_TYPE_UTYPE, // or for an integral type derived from an enum. uint16_t fixed_length; // only set if t == BASE_TYPE_ARRAY }; // Represents a parsed scalar value, it's type, and field offset. struct Value { Value() : constant("0"), offset(static_cast(~(static_cast(0U)))) {} Type type; std::string constant; voffset_t offset; }; // Helper class that retains the original order of a set of identifiers and // also provides quick lookup. template class SymbolTable { public: ~SymbolTable() { for (auto it = vec.begin(); it != vec.end(); ++it) { delete *it; } } bool Add(const std::string &name, T *e) { vec.emplace_back(e); auto it = dict.find(name); if (it != dict.end()) return true; dict[name] = e; return false; } void Move(const std::string &oldname, const std::string &newname) { auto it = dict.find(oldname); if (it != dict.end()) { auto obj = it->second; dict.erase(it); dict[newname] = obj; } else { FLATBUFFERS_ASSERT(false); } } T *Lookup(const std::string &name) const { auto it = dict.find(name); return it == dict.end() ? nullptr : it->second; } public: std::map dict; // quick lookup std::vector vec; // Used to iterate in order of insertion }; // A name space, as set in the schema. struct Namespace { Namespace() : from_table(0) {} // Given a (potentially unqualified) name, return the "fully qualified" name // which has a full namespaced descriptor. // With max_components you can request less than the number of components // the current namespace has. std::string GetFullyQualifiedName(const std::string &name, size_t max_components = 1000) const; std::vector components; size_t from_table; // Part of the namespace corresponds to a message/table. }; inline bool operator<(const Namespace &a, const Namespace &b) { size_t min_size = std::min(a.components.size(), b.components.size()); for (size_t i = 0; i < min_size; ++i) { if (a.components[i] != b.components[i]) return a.components[i] < b.components[i]; } return a.components.size() < b.components.size(); } // Base class for all definition types (fields, structs_, enums_). struct Definition { Definition() : generated(false), defined_namespace(nullptr), serialized_location(0), index(-1), refcount(1), declaration_file(nullptr) {} flatbuffers::Offset< flatbuffers::Vector>> SerializeAttributes(FlatBufferBuilder *builder, const Parser &parser) const; bool DeserializeAttributes(Parser &parser, const Vector> *attrs); std::string name; std::string file; std::vector doc_comment; SymbolTable attributes; bool generated; // did we already output code for this definition? Namespace *defined_namespace; // Where it was defined. // For use with Serialize() uoffset_t serialized_location; int index; // Inside the vector it is stored. int refcount; const std::string *declaration_file; }; struct FieldDef : public Definition { FieldDef() : deprecated(false), key(false), shared(false), native_inline(false), flexbuffer(false), presence(kDefault), nested_flatbuffer(NULL), padding(0) {} Offset Serialize(FlatBufferBuilder *builder, uint16_t id, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::Field *field); bool IsScalarOptional() const { return IsScalar(value.type.base_type) && IsOptional(); } bool IsOptional() const { return presence == kOptional; } bool IsRequired() const { return presence == kRequired; } bool IsDefault() const { return presence == kDefault; } Value value; bool deprecated; // Field is allowed to be present in old data, but can't be. // written in new data nor accessed in new code. bool key; // Field functions as a key for creating sorted vectors. bool shared; // Field will be using string pooling (i.e. CreateSharedString) // as default serialization behavior if field is a string. bool native_inline; // Field will be defined inline (instead of as a pointer) // for native tables if field is a struct. bool flexbuffer; // This field contains FlexBuffer data. enum Presence { // Field must always be present. kRequired, // Non-presence should be signalled to and controlled by users. kOptional, // Non-presence is hidden from users. // Implementations may omit writing default values. kDefault, }; Presence static MakeFieldPresence(bool optional, bool required) { FLATBUFFERS_ASSERT(!(required && optional)); // clang-format off return required ? FieldDef::kRequired : optional ? FieldDef::kOptional : FieldDef::kDefault; // clang-format on } Presence presence; StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data. size_t padding; // Bytes to always pad after this field. }; struct StructDef : public Definition { StructDef() : fixed(false), predecl(true), sortbysize(true), has_key(false), minalign(1), bytesize(0) {} void PadLastField(size_t min_align) { auto padding = PaddingBytes(bytesize, min_align); bytesize += padding; if (fields.vec.size()) fields.vec.back()->padding = padding; } Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::Object *object); SymbolTable fields; bool fixed; // If it's struct, not a table. bool predecl; // If it's used before it was defined. bool sortbysize; // Whether fields come in the declaration or size order. bool has_key; // It has a key field. size_t minalign; // What the whole object needs to be aligned to. size_t bytesize; // Size if fixed. flatbuffers::unique_ptr original_location; }; struct EnumDef; struct EnumValBuilder; struct EnumVal { Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(const Parser &parser, const reflection::EnumVal *val); uint64_t GetAsUInt64() const { return static_cast(value); } int64_t GetAsInt64() const { return value; } bool IsZero() const { return 0 == value; } bool IsNonZero() const { return !IsZero(); } std::string name; std::vector doc_comment; Type union_type; private: friend EnumDef; friend EnumValBuilder; friend bool operator==(const EnumVal &lhs, const EnumVal &rhs); EnumVal(const std::string &_name, int64_t _val) : name(_name), value(_val) {} EnumVal() : value(0) {} int64_t value; }; struct EnumDef : public Definition { EnumDef() : is_union(false), uses_multiple_type_instances(false) {} Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::Enum *values); template void ChangeEnumValue(EnumVal *ev, T new_val); void SortByValue(); void RemoveDuplicates(); std::string AllFlags() const; const EnumVal *MinValue() const; const EnumVal *MaxValue() const; // Returns the number of integer steps from v1 to v2. uint64_t Distance(const EnumVal *v1, const EnumVal *v2) const; // Returns the number of integer steps from Min to Max. uint64_t Distance() const { return Distance(MinValue(), MaxValue()); } EnumVal *ReverseLookup(int64_t enum_idx, bool skip_union_default = false) const; EnumVal *FindByValue(const std::string &constant) const; std::string ToString(const EnumVal &ev) const { return IsUInt64() ? NumToString(ev.GetAsUInt64()) : NumToString(ev.GetAsInt64()); } size_t size() const { return vals.vec.size(); } const std::vector &Vals() const { return vals.vec; } const EnumVal *Lookup(const std::string &enum_name) const { return vals.Lookup(enum_name); } bool is_union; // Type is a union which uses type aliases where at least one type is // available under two different names. bool uses_multiple_type_instances; Type underlying_type; private: bool IsUInt64() const { return (BASE_TYPE_ULONG == underlying_type.base_type); } friend EnumValBuilder; SymbolTable vals; }; inline bool IsString(const Type &type) { return type.base_type == BASE_TYPE_STRING; } inline bool IsStruct(const Type &type) { return type.base_type == BASE_TYPE_STRUCT && type.struct_def->fixed; } inline bool IsUnion(const Type &type) { return type.enum_def != nullptr && type.enum_def->is_union; } inline bool IsUnionType(const Type &type) { return IsUnion(type) && IsInteger(type.base_type); } inline bool IsVector(const Type &type) { return type.base_type == BASE_TYPE_VECTOR; } inline bool IsArray(const Type &type) { return type.base_type == BASE_TYPE_ARRAY; } inline bool IsSeries(const Type &type) { return IsVector(type) || IsArray(type); } inline bool IsEnum(const Type &type) { return type.enum_def != nullptr && IsInteger(type.base_type); } inline size_t InlineSize(const Type &type) { return IsStruct(type) ? type.struct_def->bytesize : (IsArray(type) ? InlineSize(type.VectorType()) * type.fixed_length : SizeOf(type.base_type)); } inline size_t InlineAlignment(const Type &type) { if (IsStruct(type)) { return type.struct_def->minalign; } else if (IsArray(type)) { return IsStruct(type.VectorType()) ? type.struct_def->minalign : SizeOf(type.element); } else { return SizeOf(type.base_type); } } inline bool operator==(const EnumVal &lhs, const EnumVal &rhs) { return lhs.value == rhs.value; } inline bool operator!=(const EnumVal &lhs, const EnumVal &rhs) { return !(lhs == rhs); } inline bool EqualByName(const Type &a, const Type &b) { return a.base_type == b.base_type && a.element == b.element && (a.struct_def == b.struct_def || a.struct_def->name == b.struct_def->name) && (a.enum_def == b.enum_def || a.enum_def->name == b.enum_def->name); } struct RPCCall : public Definition { Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::RPCCall *call); StructDef *request, *response; }; struct ServiceDef : public Definition { Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::Service *service); SymbolTable calls; }; // Container of options that may apply to any of the source/text generators. struct IDLOptions { // field case style options for C++ enum CaseStyle { CaseStyle_Unchanged = 0, CaseStyle_Upper, CaseStyle_Lower }; bool gen_jvmstatic; // Use flexbuffers instead for binary and text generation bool use_flexbuffers; bool strict_json; bool output_default_scalars_in_json; int indent_step; bool output_enum_identifiers; bool prefixed_enums; bool scoped_enums; bool swift_implementation_only; bool include_dependence_headers; bool mutable_buffer; bool one_file; bool proto_mode; bool proto_oneof_union; bool generate_all; bool skip_unexpected_fields_in_json; bool generate_name_strings; bool generate_object_based_api; bool gen_compare; std::string cpp_object_api_pointer_type; std::string cpp_object_api_string_type; bool cpp_object_api_string_flexible_constructor; CaseStyle cpp_object_api_field_case_style; bool cpp_direct_copy; bool gen_nullable; bool java_checkerframework; bool gen_generated; bool gen_json_coders; std::string object_prefix; std::string object_suffix; bool union_value_namespacing; bool allow_non_utf8; bool natural_utf8; std::string include_prefix; bool keep_include_path; bool binary_schema_comments; bool binary_schema_builtins; bool binary_schema_gen_embed; std::string go_import; std::string go_namespace; bool protobuf_ascii_alike; bool size_prefixed; std::string root_type; bool force_defaults; bool java_primitive_has_method; bool cs_gen_json_serializer; std::vector cpp_includes; std::string cpp_std; bool cpp_static_reflection; std::string proto_namespace_suffix; std::string filename_suffix; std::string filename_extension; bool no_warnings; bool warnings_as_errors; std::string project_root; bool cs_global_alias; bool json_nested_flatbuffers; bool json_nested_flexbuffers; bool json_nested_legacy_flatbuffers; bool ts_flat_file; // Possible options for the more general generator below. enum Language { kJava = 1 << 0, kCSharp = 1 << 1, kGo = 1 << 2, kCpp = 1 << 3, kPython = 1 << 5, kPhp = 1 << 6, kJson = 1 << 7, kBinary = 1 << 8, kTs = 1 << 9, kJsonSchema = 1 << 10, kDart = 1 << 11, kLua = 1 << 12, kLobster = 1 << 13, kRust = 1 << 14, kKotlin = 1 << 15, kSwift = 1 << 16, kMAX }; enum MiniReflect { kNone, kTypes, kTypesAndNames }; MiniReflect mini_reflect; // If set, require all fields in a table to be explicitly numbered. bool require_explicit_ids; // If set, implement serde::Serialize for generated Rust types bool rust_serialize; // If set, generate rust types in individual files with a root module file. bool rust_module_root_file; // The corresponding language bit will be set if a language is included // for code generation. unsigned long lang_to_generate; // If set (default behavior), empty string fields will be set to nullptr to // make the flatbuffer more compact. bool set_empty_strings_to_null; // If set (default behavior), empty vector fields will be set to nullptr to // make the flatbuffer more compact. bool set_empty_vectors_to_null; IDLOptions() : gen_jvmstatic(false), use_flexbuffers(false), strict_json(false), output_default_scalars_in_json(false), indent_step(2), output_enum_identifiers(true), prefixed_enums(true), scoped_enums(false), swift_implementation_only(false), include_dependence_headers(true), mutable_buffer(false), one_file(false), proto_mode(false), proto_oneof_union(false), generate_all(false), skip_unexpected_fields_in_json(false), generate_name_strings(false), generate_object_based_api(false), gen_compare(false), cpp_object_api_pointer_type("std::unique_ptr"), cpp_object_api_string_flexible_constructor(false), cpp_object_api_field_case_style(CaseStyle_Unchanged), cpp_direct_copy(true), gen_nullable(false), java_checkerframework(false), gen_generated(false), gen_json_coders(false), object_suffix("T"), union_value_namespacing(true), allow_non_utf8(false), natural_utf8(false), keep_include_path(false), binary_schema_comments(false), binary_schema_builtins(false), binary_schema_gen_embed(false), protobuf_ascii_alike(false), size_prefixed(false), force_defaults(false), java_primitive_has_method(false), cs_gen_json_serializer(false), cpp_static_reflection(false), filename_suffix("_generated"), filename_extension(), no_warnings(false), warnings_as_errors(false), project_root(""), cs_global_alias(false), json_nested_flatbuffers(true), json_nested_flexbuffers(true), json_nested_legacy_flatbuffers(false), ts_flat_file(false), mini_reflect(IDLOptions::kNone), require_explicit_ids(false), rust_serialize(false), rust_module_root_file(false), lang_to_generate(0), set_empty_strings_to_null(true), set_empty_vectors_to_null(true) {} }; // This encapsulates where the parser is in the current source file. struct ParserState { ParserState() : cursor_(nullptr), line_start_(nullptr), line_(0), token_(-1), attr_is_trivial_ascii_string_(true) {} protected: void ResetState(const char *source) { cursor_ = source; line_ = 0; MarkNewLine(); } void MarkNewLine() { line_start_ = cursor_; line_ += 1; } int64_t CursorPosition() const { FLATBUFFERS_ASSERT(cursor_ && line_start_ && cursor_ >= line_start_); return static_cast(cursor_ - line_start_); } const char *cursor_; const char *line_start_; int line_; // the current line being parsed int token_; // Flag: text in attribute_ is true ASCII string without escape // sequences. Only printable ASCII (without [\t\r\n]). // Used for number-in-string (and base64 string in future). bool attr_is_trivial_ascii_string_; std::string attribute_; std::vector doc_comment_; }; // A way to make error propagation less error prone by requiring values to be // checked. // Once you create a value of this type you must either: // - Call Check() on it. // - Copy or assign it to another value. // Failure to do so leads to an assert. // This guarantees that this as return value cannot be ignored. class CheckedError { public: explicit CheckedError(bool error) : is_error_(error), has_been_checked_(false) {} CheckedError &operator=(const CheckedError &other) { is_error_ = other.is_error_; has_been_checked_ = false; other.has_been_checked_ = true; return *this; } CheckedError(const CheckedError &other) { *this = other; // Use assignment operator. } ~CheckedError() { FLATBUFFERS_ASSERT(has_been_checked_); } bool Check() { has_been_checked_ = true; return is_error_; } private: bool is_error_; mutable bool has_been_checked_; }; // Additionally, in GCC we can get these errors statically, for additional // assurance: // clang-format off #ifdef __GNUC__ #define FLATBUFFERS_CHECKED_ERROR CheckedError \ __attribute__((warn_unused_result)) #else #define FLATBUFFERS_CHECKED_ERROR CheckedError #endif // clang-format on class Parser : public ParserState { public: explicit Parser(const IDLOptions &options = IDLOptions()) : current_namespace_(nullptr), empty_namespace_(nullptr), flex_builder_(256, flexbuffers::BUILDER_FLAG_SHARE_ALL), root_struct_def_(nullptr), opts(options), uses_flexbuffers_(false), has_warning_(false), advanced_features_(0), source_(nullptr), anonymous_counter_(0), parse_depth_counter_(0) { if (opts.force_defaults) { builder_.ForceDefaults(true); } // Start out with the empty namespace being current. empty_namespace_ = new Namespace(); namespaces_.push_back(empty_namespace_); current_namespace_ = empty_namespace_; known_attributes_["deprecated"] = true; known_attributes_["required"] = true; known_attributes_["key"] = true; known_attributes_["shared"] = true; known_attributes_["hash"] = true; known_attributes_["id"] = true; known_attributes_["force_align"] = true; known_attributes_["bit_flags"] = true; known_attributes_["original_order"] = true; known_attributes_["nested_flatbuffer"] = true; known_attributes_["csharp_partial"] = true; known_attributes_["streaming"] = true; known_attributes_["idempotent"] = true; known_attributes_["cpp_type"] = true; known_attributes_["cpp_ptr_type"] = true; known_attributes_["cpp_ptr_type_get"] = true; known_attributes_["cpp_str_type"] = true; known_attributes_["cpp_str_flex_ctor"] = true; known_attributes_["native_inline"] = true; known_attributes_["native_custom_alloc"] = true; known_attributes_["native_type"] = true; known_attributes_["native_type_pack_name"] = true; known_attributes_["native_default"] = true; known_attributes_["flexbuffer"] = true; known_attributes_["private"] = true; } ~Parser() { for (auto it = namespaces_.begin(); it != namespaces_.end(); ++it) { delete *it; } } // Parse the string containing either schema or JSON data, which will // populate the SymbolTable's or the FlatBufferBuilder above. // include_paths is used to resolve any include statements, and typically // should at least include the project path (where you loaded source_ from). // include_paths must be nullptr terminated if specified. // If include_paths is nullptr, it will attempt to load from the current // directory. // If the source was loaded from a file and isn't an include file, // supply its name in source_filename. // All paths specified in this call must be in posix format, if you accept // paths from user input, please call PosixPath on them first. bool Parse(const char *_source, const char **include_paths = nullptr, const char *source_filename = nullptr); bool ParseJson(const char *json, const char *json_filename = nullptr); // Set the root type. May override the one set in the schema. bool SetRootType(const char *name); // Mark all definitions as already having code generated. void MarkGenerated(); // Get the files recursively included by the given file. The returned // container will have at least the given file. std::set GetIncludedFilesRecursive( const std::string &file_name) const; // Fills builder_ with a binary version of the schema parsed. // See reflection/reflection.fbs void Serialize(); // Deserialize a schema buffer bool Deserialize(const uint8_t *buf, const size_t size); // Fills internal structure as if the schema passed had been loaded by parsing // with Parse except that included filenames will not be populated. bool Deserialize(const reflection::Schema *schema); Type *DeserializeType(const reflection::Type *type); // Checks that the schema represented by this parser is a safe evolution // of the schema provided. Returns non-empty error on any problems. std::string ConformTo(const Parser &base); // Similar to Parse(), but now only accepts JSON to be parsed into a // FlexBuffer. bool ParseFlexBuffer(const char *source, const char *source_filename, flexbuffers::Builder *builder); StructDef *LookupStruct(const std::string &id) const; StructDef *LookupStructThruParentNamespaces(const std::string &id) const; std::string UnqualifiedName(const std::string &fullQualifiedName); FLATBUFFERS_CHECKED_ERROR Error(const std::string &msg); // @brief Verify that any of 'opts.lang_to_generate' supports Optional scalars // in a schema. // @param opts Options used to parce a schema and generate code. static bool SupportsOptionalScalars(const flatbuffers::IDLOptions &opts); private: class ParseDepthGuard; void Message(const std::string &msg); void Warning(const std::string &msg); FLATBUFFERS_CHECKED_ERROR ParseHexNum(int nibbles, uint64_t *val); FLATBUFFERS_CHECKED_ERROR Next(); FLATBUFFERS_CHECKED_ERROR SkipByteOrderMark(); bool Is(int t) const; bool IsIdent(const char *id) const; FLATBUFFERS_CHECKED_ERROR Expect(int t); std::string TokenToStringId(int t) const; EnumDef *LookupEnum(const std::string &id); FLATBUFFERS_CHECKED_ERROR ParseNamespacing(std::string *id, std::string *last); FLATBUFFERS_CHECKED_ERROR ParseTypeIdent(Type &type); FLATBUFFERS_CHECKED_ERROR ParseType(Type &type); FLATBUFFERS_CHECKED_ERROR AddField(StructDef &struct_def, const std::string &name, const Type &type, FieldDef **dest); FLATBUFFERS_CHECKED_ERROR ParseField(StructDef &struct_def); FLATBUFFERS_CHECKED_ERROR ParseString(Value &val, bool use_string_pooling); FLATBUFFERS_CHECKED_ERROR ParseComma(); FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field, size_t parent_fieldn, const StructDef *parent_struct_def, uoffset_t count, bool inside_vector = false); template FLATBUFFERS_CHECKED_ERROR ParseTableDelimiters(size_t &fieldn, const StructDef *struct_def, F body); FLATBUFFERS_CHECKED_ERROR ParseTable(const StructDef &struct_def, std::string *value, uoffset_t *ovalue); void SerializeStruct(const StructDef &struct_def, const Value &val); void SerializeStruct(FlatBufferBuilder &builder, const StructDef &struct_def, const Value &val); template FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters(uoffset_t &count, F body); FLATBUFFERS_CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue, FieldDef *field, size_t fieldn); FLATBUFFERS_CHECKED_ERROR ParseArray(Value &array); FLATBUFFERS_CHECKED_ERROR ParseNestedFlatbuffer( Value &val, FieldDef *field, size_t fieldn, const StructDef *parent_struct_def); FLATBUFFERS_CHECKED_ERROR ParseMetaData(SymbolTable *attributes); FLATBUFFERS_CHECKED_ERROR TryTypedValue(const std::string *name, int dtoken, bool check, Value &e, BaseType req, bool *destmatch); FLATBUFFERS_CHECKED_ERROR ParseHash(Value &e, FieldDef *field); FLATBUFFERS_CHECKED_ERROR TokenError(); FLATBUFFERS_CHECKED_ERROR ParseSingleValue(const std::string *name, Value &e, bool check_now); FLATBUFFERS_CHECKED_ERROR ParseFunction(const std::string *name, Value &e); FLATBUFFERS_CHECKED_ERROR ParseEnumFromString(const Type &type, std::string *result); StructDef *LookupCreateStruct(const std::string &name, bool create_if_new = true, bool definition = false); FLATBUFFERS_CHECKED_ERROR ParseEnum(bool is_union, EnumDef **dest, const char *filename); FLATBUFFERS_CHECKED_ERROR ParseNamespace(); FLATBUFFERS_CHECKED_ERROR StartStruct(const std::string &name, StructDef **dest); FLATBUFFERS_CHECKED_ERROR StartEnum(const std::string &name, bool is_union, EnumDef **dest); FLATBUFFERS_CHECKED_ERROR ParseDecl(const char *filename); FLATBUFFERS_CHECKED_ERROR ParseService(const char *filename); FLATBUFFERS_CHECKED_ERROR ParseProtoFields(StructDef *struct_def, bool isextend, bool inside_oneof); FLATBUFFERS_CHECKED_ERROR ParseProtoOption(); FLATBUFFERS_CHECKED_ERROR ParseProtoKey(); FLATBUFFERS_CHECKED_ERROR ParseProtoDecl(); FLATBUFFERS_CHECKED_ERROR ParseProtoCurliesOrIdent(); FLATBUFFERS_CHECKED_ERROR ParseTypeFromProtoType(Type *type); FLATBUFFERS_CHECKED_ERROR SkipAnyJsonValue(); FLATBUFFERS_CHECKED_ERROR ParseFlexBufferNumericConstant( flexbuffers::Builder *builder); FLATBUFFERS_CHECKED_ERROR ParseFlexBufferValue(flexbuffers::Builder *builder); FLATBUFFERS_CHECKED_ERROR StartParseFile(const char *source, const char *source_filename); FLATBUFFERS_CHECKED_ERROR ParseRoot(const char *_source, const char **include_paths, const char *source_filename); FLATBUFFERS_CHECKED_ERROR DoParse(const char *_source, const char **include_paths, const char *source_filename, const char *include_filename); FLATBUFFERS_CHECKED_ERROR DoParseJson(); FLATBUFFERS_CHECKED_ERROR CheckClash(std::vector &fields, StructDef *struct_def, const char *suffix, BaseType baseType); FLATBUFFERS_CHECKED_ERROR ParseAlignAttribute( const std::string &align_constant, size_t min_align, size_t *align); bool SupportsAdvancedUnionFeatures() const; bool SupportsAdvancedArrayFeatures() const; bool SupportsOptionalScalars() const; bool SupportsDefaultVectorsAndStrings() const; Namespace *UniqueNamespace(Namespace *ns); FLATBUFFERS_CHECKED_ERROR RecurseError(); template CheckedError Recurse(F f); const std::string &GetPooledString(const std::string &s) const; public: SymbolTable types_; SymbolTable structs_; SymbolTable enums_; SymbolTable services_; std::vector namespaces_; Namespace *current_namespace_; Namespace *empty_namespace_; std::string error_; // User readable error_ if Parse() == false FlatBufferBuilder builder_; // any data contained in the file flexbuffers::Builder flex_builder_; flexbuffers::Reference flex_root_; StructDef *root_struct_def_; std::string file_identifier_; std::string file_extension_; std::map included_files_; std::map> files_included_per_file_; std::vector native_included_files_; std::map known_attributes_; IDLOptions opts; bool uses_flexbuffers_; bool has_warning_; uint64_t advanced_features_; private: const char *source_; std::string file_being_parsed_; std::vector> field_stack_; // TODO(cneo): Refactor parser to use string_cache more often to save // on memory usage. mutable std::set string_cache_; int anonymous_counter_; int parse_depth_counter_; // stack-overflow guard }; // Utility functions for multiple generators: // Generate text (JSON) from a given FlatBuffer, and a given Parser // object that has been populated with the corresponding schema. // If ident_step is 0, no indentation will be generated. Additionally, // if it is less than 0, no linefeeds will be generated either. // See idl_gen_text.cpp. // strict_json adds "quotes" around field names if true. // If the flatbuffer cannot be encoded in JSON (e.g., it contains non-UTF-8 // byte arrays in String values), returns false. extern bool GenerateTextFromTable(const Parser &parser, const void *table, const std::string &tablename, std::string *text); extern bool GenerateText(const Parser &parser, const void *flatbuffer, std::string *text); extern bool GenerateTextFile(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Json schema to string // See idl_gen_json_schema.cpp. extern bool GenerateJsonSchema(const Parser &parser, std::string *json); // Generate binary files from a given FlatBuffer, and a given Parser // object that has been populated with the corresponding schema. // See code_generators.cpp. extern bool GenerateBinary(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a C++ header from the definitions in the Parser object. // See idl_gen_cpp. extern bool GenerateCPP(const Parser &parser, const std::string &path, const std::string &file_name); // Generate C# files from the definitions in the Parser object. // See idl_gen_csharp.cpp. extern bool GenerateCSharp(const Parser &parser, const std::string &path, const std::string &file_name); extern bool GenerateDart(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Java files from the definitions in the Parser object. // See idl_gen_java.cpp. extern bool GenerateJava(const Parser &parser, const std::string &path, const std::string &file_name); // Generate JavaScript or TypeScript code from the definitions in the Parser // object. See idl_gen_js. extern bool GenerateTS(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Go files from the definitions in the Parser object. // See idl_gen_go.cpp. extern bool GenerateGo(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Php code from the definitions in the Parser object. // See idl_gen_php. extern bool GeneratePhp(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Python files from the definitions in the Parser object. // See idl_gen_python.cpp. extern bool GeneratePython(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Lobster files from the definitions in the Parser object. // See idl_gen_lobster.cpp. extern bool GenerateLobster(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Lua files from the definitions in the Parser object. // See idl_gen_lua.cpp. extern bool GenerateLua(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Rust files from the definitions in the Parser object. // See idl_gen_rust.cpp. extern bool GenerateRust(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Json schema file // See idl_gen_json_schema.cpp. extern bool GenerateJsonSchema(const Parser &parser, const std::string &path, const std::string &file_name); extern bool GenerateKotlin(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Swift classes. // See idl_gen_swift.cpp extern bool GenerateSwift(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a schema file from the internal representation, useful after // parsing a .proto schema. extern std::string GenerateFBS(const Parser &parser, const std::string &file_name); extern bool GenerateFBS(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated TypeScript code. // See idl_gen_ts.cpp. extern std::string TSMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated C++ header. // See idl_gen_cpp.cpp. extern std::string CPPMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated Dart code // see idl_gen_dart.cpp extern std::string DartMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated Rust code. // See idl_gen_rust.cpp. extern std::string RustMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for generated Java or C# files. // See code_generators.cpp. extern std::string CSharpMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); extern std::string JavaMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated text (JSON) files. // See idl_gen_text.cpp. extern std::string TextMakeRule(const Parser &parser, const std::string &path, const std::string &file_names); // Generate a make rule for the generated binary files. // See code_generators.cpp. extern std::string BinaryMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Cpp interfaces. // See idl_gen_grpc.cpp. bool GenerateCppGRPC(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Go interfaces. // See idl_gen_grpc.cpp. bool GenerateGoGRPC(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Java classes. // See idl_gen_grpc.cpp bool GenerateJavaGRPC(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Python interfaces. // See idl_gen_grpc.cpp. bool GeneratePythonGRPC(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Swift interfaces. // See idl_gen_grpc.cpp. extern bool GenerateSwiftGRPC(const Parser &parser, const std::string &path, const std::string &file_name); extern bool GenerateTSGRPC(const Parser &parser, const std::string &path, const std::string &file_name); extern bool GenerateRustModuleRootFile(const Parser &parser, const std::string &path); } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_IDL_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/minireflect.h000066400000000000000000000324031474174441300250470ustar00rootroot00000000000000/* * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_MINIREFLECT_H_ #define FLATBUFFERS_MINIREFLECT_H_ #include "flatbuffers/flatbuffers.h" #include "flatbuffers/util.h" namespace mapserver { namespace flatbuffers { // Utilities that can be used with the "mini reflection" tables present // in generated code with --reflect-types (only types) or --reflect-names // (also names). // This allows basic reflection functionality such as pretty-printing // that does not require the use of the schema parser or loading of binary // schema files at runtime (reflection.h). // For any of the functions below that take `const TypeTable *`, you pass // `FooTypeTable()` if the type of the root is `Foo`. // First, a generic iterator that can be used by multiple algorithms. struct IterationVisitor { // These mark the scope of a table or struct. virtual void StartSequence() {} virtual void EndSequence() {} // Called for each field regardless of whether it is present or not. // If not present, val == nullptr. set_idx is the index of all set fields. virtual void Field(size_t /*field_idx*/, size_t /*set_idx*/, ElementaryType /*type*/, bool /*is_vector*/, const TypeTable * /*type_table*/, const char * /*name*/, const uint8_t * /*val*/) {} // Called for a value that is actually present, after a field, or as part // of a vector. virtual void UType(uint8_t, const char *) {} virtual void Bool(bool) {} virtual void Char(int8_t, const char *) {} virtual void UChar(uint8_t, const char *) {} virtual void Short(int16_t, const char *) {} virtual void UShort(uint16_t, const char *) {} virtual void Int(int32_t, const char *) {} virtual void UInt(uint32_t, const char *) {} virtual void Long(int64_t) {} virtual void ULong(uint64_t) {} virtual void Float(float) {} virtual void Double(double) {} virtual void String(const String *) {} virtual void Unknown(const uint8_t *) {} // From a future version. // These mark the scope of a vector. virtual void StartVector() {} virtual void EndVector() {} virtual void Element(size_t /*i*/, ElementaryType /*type*/, const TypeTable * /*type_table*/, const uint8_t * /*val*/) {} virtual ~IterationVisitor() {} }; inline size_t InlineSize(ElementaryType type, const TypeTable *type_table) { switch (type) { case ET_UTYPE: case ET_BOOL: case ET_CHAR: case ET_UCHAR: return 1; case ET_SHORT: case ET_USHORT: return 2; case ET_INT: case ET_UINT: case ET_FLOAT: case ET_STRING: return 4; case ET_LONG: case ET_ULONG: case ET_DOUBLE: return 8; case ET_SEQUENCE: switch (type_table->st) { case ST_TABLE: case ST_UNION: return 4; case ST_STRUCT: return static_cast(type_table->values[type_table->num_elems]); default: FLATBUFFERS_ASSERT(false); return 1; } default: FLATBUFFERS_ASSERT(false); return 1; } } inline int64_t LookupEnum(int64_t enum_val, const int64_t *values, size_t num_values) { if (!values) return enum_val; for (size_t i = 0; i < num_values; i++) { if (enum_val == values[i]) return static_cast(i); } return -1; // Unknown enum value. } template const char *EnumName(T tval, const TypeTable *type_table) { if (!type_table || !type_table->names) return nullptr; auto i = LookupEnum(static_cast(tval), type_table->values, type_table->num_elems); if (i >= 0 && i < static_cast(type_table->num_elems)) { return type_table->names[i]; } return nullptr; } void IterateObject(const uint8_t *obj, const TypeTable *type_table, IterationVisitor *visitor); inline void IterateValue(ElementaryType type, const uint8_t *val, const TypeTable *type_table, const uint8_t *prev_val, soffset_t vector_index, IterationVisitor *visitor) { switch (type) { case ET_UTYPE: { auto tval = ReadScalar(val); visitor->UType(tval, EnumName(tval, type_table)); break; } case ET_BOOL: { visitor->Bool(ReadScalar(val) != 0); break; } case ET_CHAR: { auto tval = ReadScalar(val); visitor->Char(tval, EnumName(tval, type_table)); break; } case ET_UCHAR: { auto tval = ReadScalar(val); visitor->UChar(tval, EnumName(tval, type_table)); break; } case ET_SHORT: { auto tval = ReadScalar(val); visitor->Short(tval, EnumName(tval, type_table)); break; } case ET_USHORT: { auto tval = ReadScalar(val); visitor->UShort(tval, EnumName(tval, type_table)); break; } case ET_INT: { auto tval = ReadScalar(val); visitor->Int(tval, EnumName(tval, type_table)); break; } case ET_UINT: { auto tval = ReadScalar(val); visitor->UInt(tval, EnumName(tval, type_table)); break; } case ET_LONG: { visitor->Long(ReadScalar(val)); break; } case ET_ULONG: { visitor->ULong(ReadScalar(val)); break; } case ET_FLOAT: { visitor->Float(ReadScalar(val)); break; } case ET_DOUBLE: { visitor->Double(ReadScalar(val)); break; } case ET_STRING: { val += ReadScalar(val); visitor->String(reinterpret_cast(val)); break; } case ET_SEQUENCE: { switch (type_table->st) { case ST_TABLE: val += ReadScalar(val); IterateObject(val, type_table, visitor); break; case ST_STRUCT: IterateObject(val, type_table, visitor); break; case ST_UNION: { val += ReadScalar(val); FLATBUFFERS_ASSERT(prev_val); auto union_type = *prev_val; // Always a uint8_t. if (vector_index >= 0) { auto type_vec = reinterpret_cast *>(prev_val); union_type = type_vec->Get(static_cast(vector_index)); } auto type_code_idx = LookupEnum(union_type, type_table->values, type_table->num_elems); if (type_code_idx >= 0 && type_code_idx < static_cast(type_table->num_elems)) { auto type_code = type_table->type_codes[type_code_idx]; switch (type_code.base_type) { case ET_SEQUENCE: { auto ref = type_table->type_refs[type_code.sequence_ref](); IterateObject(val, ref, visitor); break; } case ET_STRING: visitor->String(reinterpret_cast(val)); break; default: visitor->Unknown(val); } } else { visitor->Unknown(val); } break; } case ST_ENUM: FLATBUFFERS_ASSERT(false); break; } break; } default: { visitor->Unknown(val); break; } } } inline void IterateObject(const uint8_t *obj, const TypeTable *type_table, IterationVisitor *visitor) { visitor->StartSequence(); const uint8_t *prev_val = nullptr; size_t set_idx = 0; size_t array_idx = 0; for (size_t i = 0; i < type_table->num_elems; i++) { auto type_code = type_table->type_codes[i]; auto type = static_cast(type_code.base_type); auto is_repeating = type_code.is_repeating != 0; auto ref_idx = type_code.sequence_ref; const TypeTable *ref = nullptr; if (ref_idx >= 0) { ref = type_table->type_refs[ref_idx](); } auto name = type_table->names ? type_table->names[i] : nullptr; const uint8_t *val = nullptr; if (type_table->st == ST_TABLE) { val = reinterpret_cast(obj)->GetAddressOf( FieldIndexToOffset(static_cast(i))); } else { val = obj + type_table->values[i]; } visitor->Field(i, set_idx, type, is_repeating, ref, name, val); if (val) { set_idx++; if (is_repeating) { auto elem_ptr = val; size_t size = 0; if (type_table->st == ST_TABLE) { // variable length vector val += ReadScalar(val); auto vec = reinterpret_cast *>(val); elem_ptr = vec->Data(); size = vec->size(); } else { // otherwise fixed size array size = type_table->array_sizes[array_idx]; ++array_idx; } visitor->StartVector(); for (size_t j = 0; j < size; j++) { visitor->Element(j, type, ref, elem_ptr); IterateValue(type, elem_ptr, ref, prev_val, static_cast(j), visitor); elem_ptr += InlineSize(type, ref); } visitor->EndVector(); } else { IterateValue(type, val, ref, prev_val, -1, visitor); } } prev_val = val; } visitor->EndSequence(); } inline void IterateFlatBuffer(const uint8_t *buffer, const TypeTable *type_table, IterationVisitor *callback) { IterateObject(GetRoot(buffer), type_table, callback); } // Outputting a Flatbuffer to a string. Tries to conform as close to JSON / // the output generated by idl_gen_text.cpp. struct ToStringVisitor : public IterationVisitor { std::string s; std::string d; bool q; std::string in; size_t indent_level; bool vector_delimited; ToStringVisitor(std::string delimiter, bool quotes, std::string indent, bool vdelimited = true) : d(delimiter), q(quotes), in(indent), indent_level(0), vector_delimited(vdelimited) {} ToStringVisitor(std::string delimiter) : d(delimiter), q(false), in(""), indent_level(0), vector_delimited(true) {} void append_indent() { for (size_t i = 0; i < indent_level; i++) { s += in; } } void StartSequence() { s += "{"; s += d; indent_level++; } void EndSequence() { s += d; indent_level--; append_indent(); s += "}"; } void Field(size_t /*field_idx*/, size_t set_idx, ElementaryType /*type*/, bool /*is_vector*/, const TypeTable * /*type_table*/, const char *name, const uint8_t *val) { if (!val) return; if (set_idx) { s += ","; s += d; } append_indent(); if (name) { if (q) s += "\""; s += name; if (q) s += "\""; s += ": "; } } template void Named(T x, const char *name) { if (name) { if (q) s += "\""; s += name; if (q) s += "\""; } else { s += NumToString(x); } } void UType(uint8_t x, const char *name) { Named(x, name); } void Bool(bool x) { s += x ? "true" : "false"; } void Char(int8_t x, const char *name) { Named(x, name); } void UChar(uint8_t x, const char *name) { Named(x, name); } void Short(int16_t x, const char *name) { Named(x, name); } void UShort(uint16_t x, const char *name) { Named(x, name); } void Int(int32_t x, const char *name) { Named(x, name); } void UInt(uint32_t x, const char *name) { Named(x, name); } void Long(int64_t x) { s += NumToString(x); } void ULong(uint64_t x) { s += NumToString(x); } void Float(float x) { s += NumToString(x); } void Double(double x) { s += NumToString(x); } void String(const struct String *str) { EscapeString(str->c_str(), str->size(), &s, true, false); } void Unknown(const uint8_t *) { s += "(?)"; } void StartVector() { s += "["; if (vector_delimited) { s += d; indent_level++; append_indent(); } else { s += " "; } } void EndVector() { if (vector_delimited) { s += d; indent_level--; append_indent(); } else { s += " "; } s += "]"; } void Element(size_t i, ElementaryType /*type*/, const TypeTable * /*type_table*/, const uint8_t * /*val*/) { if (i) { s += ","; if (vector_delimited) { s += d; append_indent(); } else { s += " "; } } } }; inline std::string FlatBufferToString(const uint8_t *buffer, const TypeTable *type_table, bool multi_line = false, bool vector_delimited = true) { ToStringVisitor tostring_visitor(multi_line ? "\n" : " ", false, "", vector_delimited); IterateFlatBuffer(buffer, type_table, &tostring_visitor); return tostring_visitor.s; } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_MINIREFLECT_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/pch/000077500000000000000000000000001474174441300231455ustar00rootroot00000000000000mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/pch/flatc_pch.h000066400000000000000000000021371474174441300252440ustar00rootroot00000000000000/* * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_FLATC_PCH_H_ #define FLATBUFFERS_FLATC_PCH_H_ // stl #include #include #include #include #include #include #include #include #include #include // flatbuffers #include "flatbuffers/pch/pch.h" #include "flatbuffers/code_generators.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/flexbuffers.h" #include "flatbuffers/idl.h" #endif // FLATBUFFERS_FLATC_PCH_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/pch/pch.h000066400000000000000000000017431474174441300240750ustar00rootroot00000000000000/* * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_PCH_H_ #define FLATBUFFERS_PCH_H_ // stl #include #include #include #include #include #include #include #include #include #include #include #include #include // flatbuffers #include "flatbuffers/util.h" #endif // FLATBUFFERS_PCH_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/reflection.h000066400000000000000000000531421474174441300247030ustar00rootroot00000000000000/* * Copyright 2015 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_REFLECTION_H_ #define FLATBUFFERS_REFLECTION_H_ // This is somewhat of a circular dependency because flatc (and thus this // file) is needed to generate this header in the first place. // Should normally not be a problem since it can be generated by the // previous version of flatc whenever this code needs to change. // See scripts/generate_code.py for generation. #include "flatbuffers/reflection_generated.h" // Helper functionality for reflection. namespace mapserver { namespace flatbuffers { // ------------------------- GETTERS ------------------------- inline bool IsScalar(reflection::BaseType t) { return t >= reflection::UType && t <= reflection::Double; } inline bool IsInteger(reflection::BaseType t) { return t >= reflection::UType && t <= reflection::ULong; } inline bool IsFloat(reflection::BaseType t) { return t == reflection::Float || t == reflection::Double; } inline bool IsLong(reflection::BaseType t) { return t == reflection::Long || t == reflection::ULong; } // Size of a basic type, don't use with structs. inline size_t GetTypeSize(reflection::BaseType base_type) { // This needs to correspond to the BaseType enum. static size_t sizes[] = { 0, // None 1, // UType 1, // Bool 1, // Byte 1, // UByte 2, // Short 2, // UShort 4, // Int 4, // UInt 8, // Long 8, // ULong 4, // Float 8, // Double 4, // String 4, // Vector 4, // Obj 4, // Union 0, // Array. Only used in structs. 0 was chosen to prevent out-of-bounds // errors. 0 // MaxBaseType. This must be kept the last entry in this array. }; static_assert(sizeof(sizes) / sizeof(size_t) == reflection::MaxBaseType + 1, "Size of sizes[] array does not match the count of BaseType " "enum values."); return sizes[base_type]; } // Same as above, but now correctly returns the size of a struct if // the field (or vector element) is a struct. inline size_t GetTypeSizeInline(reflection::BaseType base_type, int type_index, const reflection::Schema &schema) { if (base_type == reflection::Obj && schema.objects()->Get(type_index)->is_struct()) { return schema.objects()->Get(type_index)->bytesize(); } else { return GetTypeSize(base_type); } } // Get the root, regardless of what type it is. inline Table *GetAnyRoot(uint8_t *const flatbuf) { return GetMutableRoot(flatbuf); } inline const Table *GetAnyRoot(const uint8_t *const flatbuf) { return GetRoot
(flatbuf); } inline Table *GetAnySizePrefixedRoot(uint8_t *const flatbuf) { return GetMutableSizePrefixedRoot
(flatbuf); } inline const Table *GetAnySizePrefixedRoot(const uint8_t *const flatbuf) { return GetSizePrefixedRoot
(flatbuf); } // Get a field's default, if you know it's an integer, and its exact type. template T GetFieldDefaultI(const reflection::Field &field) { FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); return static_cast(field.default_integer()); } // Get a field's default, if you know it's floating point and its exact type. template T GetFieldDefaultF(const reflection::Field &field) { FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); return static_cast(field.default_real()); } // Get a field, if you know it's an integer, and its exact type. template T GetFieldI(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); return table.GetField(field.offset(), static_cast(field.default_integer())); } // Get a field, if you know it's floating point and its exact type. template T GetFieldF(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); return table.GetField(field.offset(), static_cast(field.default_real())); } // Get a field, if you know it's a string. inline const String *GetFieldS(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::String); return table.GetPointer(field.offset()); } // Get a field, if you know it's a vector. template Vector *GetFieldV(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Vector && sizeof(T) == GetTypeSize(field.type()->element())); return table.GetPointer *>(field.offset()); } // Get a field, if you know it's a vector, generically. // To actually access elements, use the return value together with // field.type()->element() in any of GetAnyVectorElemI below etc. inline VectorOfAny *GetFieldAnyV(const Table &table, const reflection::Field &field) { return table.GetPointer(field.offset()); } // Get a field, if you know it's a table. inline Table *GetFieldT(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj || field.type()->base_type() == reflection::Union); return table.GetPointer
(field.offset()); } // Get a field, if you know it's a struct. inline const Struct *GetFieldStruct(const Table &table, const reflection::Field &field) { // TODO: This does NOT check if the field is a table or struct, but we'd need // access to the schema to check the is_struct flag. FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj); return table.GetStruct(field.offset()); } // Get a structure's field, if you know it's a struct. inline const Struct *GetFieldStruct(const Struct &structure, const reflection::Field &field) { FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj); return structure.GetStruct(field.offset()); } // Raw helper functions used below: get any value in memory as a 64bit int, a // double or a string. // All scalars get static_cast to an int64_t, strings use strtoull, every other // data type returns 0. int64_t GetAnyValueI(reflection::BaseType type, const uint8_t *data); // All scalars static cast to double, strings use strtod, every other data // type is 0.0. double GetAnyValueF(reflection::BaseType type, const uint8_t *data); // All scalars converted using stringstream, strings as-is, and all other // data types provide some level of debug-pretty-printing. std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data, const reflection::Schema *schema, int type_index); // Get any table field as a 64bit int, regardless of what type it is. inline int64_t GetAnyFieldI(const Table &table, const reflection::Field &field) { auto field_ptr = table.GetAddressOf(field.offset()); return field_ptr ? GetAnyValueI(field.type()->base_type(), field_ptr) : field.default_integer(); } // Get any table field as a double, regardless of what type it is. inline double GetAnyFieldF(const Table &table, const reflection::Field &field) { auto field_ptr = table.GetAddressOf(field.offset()); return field_ptr ? GetAnyValueF(field.type()->base_type(), field_ptr) : field.default_real(); } // Get any table field as a string, regardless of what type it is. // You may pass nullptr for the schema if you don't care to have fields that // are of table type pretty-printed. inline std::string GetAnyFieldS(const Table &table, const reflection::Field &field, const reflection::Schema *schema) { auto field_ptr = table.GetAddressOf(field.offset()); return field_ptr ? GetAnyValueS(field.type()->base_type(), field_ptr, schema, field.type()->index()) : ""; } // Get any struct field as a 64bit int, regardless of what type it is. inline int64_t GetAnyFieldI(const Struct &st, const reflection::Field &field) { return GetAnyValueI(field.type()->base_type(), st.GetAddressOf(field.offset())); } // Get any struct field as a double, regardless of what type it is. inline double GetAnyFieldF(const Struct &st, const reflection::Field &field) { return GetAnyValueF(field.type()->base_type(), st.GetAddressOf(field.offset())); } // Get any struct field as a string, regardless of what type it is. inline std::string GetAnyFieldS(const Struct &st, const reflection::Field &field) { return GetAnyValueS(field.type()->base_type(), st.GetAddressOf(field.offset()), nullptr, -1); } // Get any vector element as a 64bit int, regardless of what type it is. inline int64_t GetAnyVectorElemI(const VectorOfAny *vec, reflection::BaseType elem_type, size_t i) { return GetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i); } // Get any vector element as a double, regardless of what type it is. inline double GetAnyVectorElemF(const VectorOfAny *vec, reflection::BaseType elem_type, size_t i) { return GetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i); } // Get any vector element as a string, regardless of what type it is. inline std::string GetAnyVectorElemS(const VectorOfAny *vec, reflection::BaseType elem_type, size_t i) { return GetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, nullptr, -1); } // Get a vector element that's a table/string/vector from a generic vector. // Pass Table/String/VectorOfAny as template parameter. // Warning: does no typechecking. template T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) { auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i; return reinterpret_cast(elem_ptr + ReadScalar(elem_ptr)); } // Get the inline-address of a vector element. Useful for Structs (pass Struct // as template arg), or being able to address a range of scalars in-line. // Get elem_size from GetTypeSizeInline(). // Note: little-endian data on all platforms, use EndianScalar() instead of // raw pointer access with scalars). template T *GetAnyVectorElemAddressOf(const VectorOfAny *vec, size_t i, size_t elem_size) { return reinterpret_cast(vec->Data() + elem_size * i); } // Similarly, for elements of tables. template T *GetAnyFieldAddressOf(const Table &table, const reflection::Field &field) { return reinterpret_cast(table.GetAddressOf(field.offset())); } // Similarly, for elements of structs. template T *GetAnyFieldAddressOf(const Struct &st, const reflection::Field &field) { return reinterpret_cast(st.GetAddressOf(field.offset())); } // Loop over all the fields of the provided `object` and call `func` on each one // in increasing order by their field->id(). If `reverse` is true, `func` is // called in descending order void ForAllFields(const reflection::Object *object, bool reverse, std::function func); // ------------------------- SETTERS ------------------------- // Set any scalar field, if you know its exact type. template bool SetField(Table *table, const reflection::Field &field, T val) { reflection::BaseType type = field.type()->base_type(); if (!IsScalar(type)) { return false; } FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(type)); T def; if (IsInteger(type)) { def = GetFieldDefaultI(field); } else { FLATBUFFERS_ASSERT(IsFloat(type)); def = GetFieldDefaultF(field); } return table->SetField(field.offset(), val, def); } // Raw helper functions used below: set any value in memory as a 64bit int, a // double or a string. // These work for all scalar values, but do nothing for other data types. // To set a string, see SetString below. void SetAnyValueI(reflection::BaseType type, uint8_t *data, int64_t val); void SetAnyValueF(reflection::BaseType type, uint8_t *data, double val); void SetAnyValueS(reflection::BaseType type, uint8_t *data, const char *val); // Set any table field as a 64bit int, regardless of type what it is. inline bool SetAnyFieldI(Table *table, const reflection::Field &field, int64_t val) { auto field_ptr = table->GetAddressOf(field.offset()); if (!field_ptr) return val == GetFieldDefaultI(field); SetAnyValueI(field.type()->base_type(), field_ptr, val); return true; } // Set any table field as a double, regardless of what type it is. inline bool SetAnyFieldF(Table *table, const reflection::Field &field, double val) { auto field_ptr = table->GetAddressOf(field.offset()); if (!field_ptr) return val == GetFieldDefaultF(field); SetAnyValueF(field.type()->base_type(), field_ptr, val); return true; } // Set any table field as a string, regardless of what type it is. inline bool SetAnyFieldS(Table *table, const reflection::Field &field, const char *val) { auto field_ptr = table->GetAddressOf(field.offset()); if (!field_ptr) return false; SetAnyValueS(field.type()->base_type(), field_ptr, val); return true; } // Set any struct field as a 64bit int, regardless of type what it is. inline void SetAnyFieldI(Struct *st, const reflection::Field &field, int64_t val) { SetAnyValueI(field.type()->base_type(), st->GetAddressOf(field.offset()), val); } // Set any struct field as a double, regardless of type what it is. inline void SetAnyFieldF(Struct *st, const reflection::Field &field, double val) { SetAnyValueF(field.type()->base_type(), st->GetAddressOf(field.offset()), val); } // Set any struct field as a string, regardless of type what it is. inline void SetAnyFieldS(Struct *st, const reflection::Field &field, const char *val) { SetAnyValueS(field.type()->base_type(), st->GetAddressOf(field.offset()), val); } // Set any vector element as a 64bit int, regardless of type what it is. inline void SetAnyVectorElemI(VectorOfAny *vec, reflection::BaseType elem_type, size_t i, int64_t val) { SetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); } // Set any vector element as a double, regardless of type what it is. inline void SetAnyVectorElemF(VectorOfAny *vec, reflection::BaseType elem_type, size_t i, double val) { SetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); } // Set any vector element as a string, regardless of type what it is. inline void SetAnyVectorElemS(VectorOfAny *vec, reflection::BaseType elem_type, size_t i, const char *val) { SetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); } // ------------------------- RESIZING SETTERS ------------------------- // "smart" pointer for use with resizing vectors: turns a pointer inside // a vector into a relative offset, such that it is not affected by resizes. template class pointer_inside_vector { public: pointer_inside_vector(T *ptr, std::vector &vec) : offset_(reinterpret_cast(ptr) - reinterpret_cast(vec.data())), vec_(vec) {} T *operator*() const { return reinterpret_cast(reinterpret_cast(vec_.data()) + offset_); } T *operator->() const { return operator*(); } private: size_t offset_; std::vector &vec_; }; // Helper to create the above easily without specifying template args. template pointer_inside_vector piv(T *ptr, std::vector &vec) { return pointer_inside_vector(ptr, vec); } inline const char *UnionTypeFieldSuffix() { return "_type"; } // Helper to figure out the actual table type a union refers to. inline const reflection::Object &GetUnionType( const reflection::Schema &schema, const reflection::Object &parent, const reflection::Field &unionfield, const Table &table) { auto enumdef = schema.enums()->Get(unionfield.type()->index()); // TODO: this is clumsy and slow, but no other way to find it? auto type_field = parent.fields()->LookupByKey( (unionfield.name()->str() + UnionTypeFieldSuffix()).c_str()); FLATBUFFERS_ASSERT(type_field); auto union_type = GetFieldI(table, *type_field); auto enumval = enumdef->values()->LookupByKey(union_type); return *schema.objects()->Get(enumval->union_type()->index()); } // Changes the contents of a string inside a FlatBuffer. FlatBuffer must // live inside a std::vector so we can resize the buffer if needed. // "str" must live inside "flatbuf" and may be invalidated after this call. // If your FlatBuffer's root table is not the schema's root table, you should // pass in your root_table type as well. void SetString(const reflection::Schema &schema, const std::string &val, const String *str, std::vector *flatbuf, const reflection::Object *root_table = nullptr); // Resizes a flatbuffers::Vector inside a FlatBuffer. FlatBuffer must // live inside a std::vector so we can resize the buffer if needed. // "vec" must live inside "flatbuf" and may be invalidated after this call. // If your FlatBuffer's root table is not the schema's root table, you should // pass in your root_table type as well. uint8_t *ResizeAnyVector(const reflection::Schema &schema, uoffset_t newsize, const VectorOfAny *vec, uoffset_t num_elems, uoffset_t elem_size, std::vector *flatbuf, const reflection::Object *root_table = nullptr); template void ResizeVector(const reflection::Schema &schema, uoffset_t newsize, T val, const Vector *vec, std::vector *flatbuf, const reflection::Object *root_table = nullptr) { auto delta_elem = static_cast(newsize) - static_cast(vec->size()); auto newelems = ResizeAnyVector( schema, newsize, reinterpret_cast(vec), vec->size(), static_cast(sizeof(T)), flatbuf, root_table); // Set new elements to "val". for (int i = 0; i < delta_elem; i++) { auto loc = newelems + i * sizeof(T); auto is_scalar = flatbuffers::is_scalar::value; if (is_scalar) { WriteScalar(loc, val); } else { // struct *reinterpret_cast(loc) = val; } } } // Adds any new data (in the form of a new FlatBuffer) to an existing // FlatBuffer. This can be used when any of the above methods are not // sufficient, in particular for adding new tables and new fields. // This is potentially slightly less efficient than a FlatBuffer constructed // in one piece, since the new FlatBuffer doesn't share any vtables with the // existing one. // The return value can now be set using Vector::MutateOffset or SetFieldT // below. const uint8_t *AddFlatBuffer(std::vector &flatbuf, const uint8_t *newbuf, size_t newlen); inline bool SetFieldT(Table *table, const reflection::Field &field, const uint8_t *val) { FLATBUFFERS_ASSERT(sizeof(uoffset_t) == GetTypeSize(field.type()->base_type())); return table->SetPointer(field.offset(), val); } // ------------------------- COPYING ------------------------- // Generic copying of tables from a FlatBuffer into a FlatBuffer builder. // Can be used to do any kind of merging/selecting you may want to do out // of existing buffers. Also useful to reconstruct a whole buffer if the // above resizing functionality has introduced garbage in a buffer you want // to remove. // Note: this does not deal with DAGs correctly. If the table passed forms a // DAG, the copy will be a tree instead (with duplicates). Strings can be // shared however, by passing true for use_string_pooling. Offset CopyTable(FlatBufferBuilder &fbb, const reflection::Schema &schema, const reflection::Object &objectdef, const Table &table, bool use_string_pooling = false); // Verifies the provided flatbuffer using reflection. // root should point to the root type for this flatbuffer. // buf should point to the start of flatbuffer data. // length specifies the size of the flatbuffer data. bool Verify(const reflection::Schema &schema, const reflection::Object &root, const uint8_t *buf, size_t length, uoffset_t max_depth = 64, uoffset_t max_tables = 1000000); bool VerifySizePrefixed(const reflection::Schema &schema, const reflection::Object &root, const uint8_t *buf, size_t length, uoffset_t max_depth = 64, uoffset_t max_tables = 1000000); } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_REFLECTION_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/reflection_generated.h000066400000000000000000001527221474174441300267250ustar00rootroot00000000000000// automatically generated by the FlatBuffers compiler, do not modify #ifndef FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ #define FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ #include "flatbuffers/flatbuffers.h" // Ensure the included flatbuffers.h is the same version as when this file was // generated, otherwise it may not be compatible. static_assert(FLATBUFFERS_VERSION_MAJOR == 2 && FLATBUFFERS_VERSION_MINOR == 0 && FLATBUFFERS_VERSION_REVISION == 6, "Non-compatible flatbuffers version included"); namespace reflection { struct Type; struct TypeBuilder; struct KeyValue; struct KeyValueBuilder; struct EnumVal; struct EnumValBuilder; struct Enum; struct EnumBuilder; struct Field; struct FieldBuilder; struct Object; struct ObjectBuilder; struct RPCCall; struct RPCCallBuilder; struct Service; struct ServiceBuilder; struct SchemaFile; struct SchemaFileBuilder; struct Schema; struct SchemaBuilder; enum BaseType { None = 0, UType = 1, Bool = 2, Byte = 3, UByte = 4, Short = 5, UShort = 6, Int = 7, UInt = 8, Long = 9, ULong = 10, Float = 11, Double = 12, String = 13, Vector = 14, Obj = 15, Union = 16, Array = 17, MaxBaseType = 18 }; inline const BaseType (&EnumValuesBaseType())[19] { static const BaseType values[] = { None, UType, Bool, Byte, UByte, Short, UShort, Int, UInt, Long, ULong, Float, Double, String, Vector, Obj, Union, Array, MaxBaseType }; return values; } inline const char * const *EnumNamesBaseType() { static const char * const names[20] = { "None", "UType", "Bool", "Byte", "UByte", "Short", "UShort", "Int", "UInt", "Long", "ULong", "Float", "Double", "String", "Vector", "Obj", "Union", "Array", "MaxBaseType", nullptr }; return names; } inline const char *EnumNameBaseType(BaseType e) { if (flatbuffers::IsOutRange(e, None, MaxBaseType)) return ""; const size_t index = static_cast(e); return EnumNamesBaseType()[index]; } /// New schema language features that are not supported by old code generators. enum AdvancedFeatures { AdvancedArrayFeatures = 1ULL, AdvancedUnionFeatures = 2ULL, OptionalScalars = 4ULL, DefaultVectorsAndStrings = 8ULL }; inline const AdvancedFeatures (&EnumValuesAdvancedFeatures())[4] { static const AdvancedFeatures values[] = { AdvancedArrayFeatures, AdvancedUnionFeatures, OptionalScalars, DefaultVectorsAndStrings }; return values; } inline const char * const *EnumNamesAdvancedFeatures() { static const char * const names[9] = { "AdvancedArrayFeatures", "AdvancedUnionFeatures", "", "OptionalScalars", "", "", "", "DefaultVectorsAndStrings", nullptr }; return names; } inline const char *EnumNameAdvancedFeatures(AdvancedFeatures e) { if (flatbuffers::IsOutRange(e, AdvancedArrayFeatures, DefaultVectorsAndStrings)) return ""; const size_t index = static_cast(e) - static_cast(AdvancedArrayFeatures); return EnumNamesAdvancedFeatures()[index]; } struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef TypeBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_BASE_TYPE = 4, VT_ELEMENT = 6, VT_INDEX = 8, VT_FIXED_LENGTH = 10, VT_BASE_SIZE = 12, VT_ELEMENT_SIZE = 14 }; reflection::BaseType base_type() const { return static_cast(GetField(VT_BASE_TYPE, 0)); } reflection::BaseType element() const { return static_cast(GetField(VT_ELEMENT, 0)); } int32_t index() const { return GetField(VT_INDEX, -1); } uint16_t fixed_length() const { return GetField(VT_FIXED_LENGTH, 0); } /// The size (octets) of the `base_type` field. uint32_t base_size() const { return GetField(VT_BASE_SIZE, 4); } /// The size (octets) of the `element` field, if present. uint32_t element_size() const { return GetField(VT_ELEMENT_SIZE, 0); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_BASE_TYPE, 1) && VerifyField(verifier, VT_ELEMENT, 1) && VerifyField(verifier, VT_INDEX, 4) && VerifyField(verifier, VT_FIXED_LENGTH, 2) && VerifyField(verifier, VT_BASE_SIZE, 4) && VerifyField(verifier, VT_ELEMENT_SIZE, 4) && verifier.EndTable(); } }; struct TypeBuilder { typedef Type Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_base_type(reflection::BaseType base_type) { fbb_.AddElement(Type::VT_BASE_TYPE, static_cast(base_type), 0); } void add_element(reflection::BaseType element) { fbb_.AddElement(Type::VT_ELEMENT, static_cast(element), 0); } void add_index(int32_t index) { fbb_.AddElement(Type::VT_INDEX, index, -1); } void add_fixed_length(uint16_t fixed_length) { fbb_.AddElement(Type::VT_FIXED_LENGTH, fixed_length, 0); } void add_base_size(uint32_t base_size) { fbb_.AddElement(Type::VT_BASE_SIZE, base_size, 4); } void add_element_size(uint32_t element_size) { fbb_.AddElement(Type::VT_ELEMENT_SIZE, element_size, 0); } explicit TypeBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); return o; } }; inline flatbuffers::Offset CreateType( flatbuffers::FlatBufferBuilder &_fbb, reflection::BaseType base_type = reflection::None, reflection::BaseType element = reflection::None, int32_t index = -1, uint16_t fixed_length = 0, uint32_t base_size = 4, uint32_t element_size = 0) { TypeBuilder builder_(_fbb); builder_.add_element_size(element_size); builder_.add_base_size(base_size); builder_.add_index(index); builder_.add_fixed_length(fixed_length); builder_.add_element(element); builder_.add_base_type(base_type); return builder_.Finish(); } struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef KeyValueBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_KEY = 4, VT_VALUE = 6 }; const flatbuffers::String *key() const { return GetPointer(VT_KEY); } bool KeyCompareLessThan(const KeyValue *o) const { return *key() < *o->key(); } int KeyCompareWithValue(const char *_key) const { return strcmp(key()->c_str(), _key); } const flatbuffers::String *value() const { return GetPointer(VT_VALUE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_KEY) && verifier.VerifyString(key()) && VerifyOffset(verifier, VT_VALUE) && verifier.VerifyString(value()) && verifier.EndTable(); } }; struct KeyValueBuilder { typedef KeyValue Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_key(flatbuffers::Offset key) { fbb_.AddOffset(KeyValue::VT_KEY, key); } void add_value(flatbuffers::Offset value) { fbb_.AddOffset(KeyValue::VT_VALUE, value); } explicit KeyValueBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, KeyValue::VT_KEY); return o; } }; inline flatbuffers::Offset CreateKeyValue( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset key = 0, flatbuffers::Offset value = 0) { KeyValueBuilder builder_(_fbb); builder_.add_value(value); builder_.add_key(key); return builder_.Finish(); } inline flatbuffers::Offset CreateKeyValueDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *key = nullptr, const char *value = nullptr) { auto key__ = key ? _fbb.CreateString(key) : 0; auto value__ = value ? _fbb.CreateString(value) : 0; return reflection::CreateKeyValue( _fbb, key__, value__); } struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef EnumValBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_VALUE = 6, VT_UNION_TYPE = 10, VT_DOCUMENTATION = 12 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } int64_t value() const { return GetField(VT_VALUE, 0); } bool KeyCompareLessThan(const EnumVal *o) const { return value() < o->value(); } int KeyCompareWithValue(int64_t _value) const { return static_cast(value() > _value) - static_cast(value() < _value); } const reflection::Type *union_type() const { return GetPointer(VT_UNION_TYPE); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyField(verifier, VT_VALUE, 8) && VerifyOffset(verifier, VT_UNION_TYPE) && verifier.VerifyTable(union_type()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && verifier.EndTable(); } }; struct EnumValBuilder { typedef EnumVal Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(EnumVal::VT_NAME, name); } void add_value(int64_t value) { fbb_.AddElement(EnumVal::VT_VALUE, value, 0); } void add_union_type(flatbuffers::Offset union_type) { fbb_.AddOffset(EnumVal::VT_UNION_TYPE, union_type); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(EnumVal::VT_DOCUMENTATION, documentation); } explicit EnumValBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, EnumVal::VT_NAME); return o; } }; inline flatbuffers::Offset CreateEnumVal( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, int64_t value = 0, flatbuffers::Offset union_type = 0, flatbuffers::Offset>> documentation = 0) { EnumValBuilder builder_(_fbb); builder_.add_value(value); builder_.add_documentation(documentation); builder_.add_union_type(union_type); builder_.add_name(name); return builder_.Finish(); } inline flatbuffers::Offset CreateEnumValDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, int64_t value = 0, flatbuffers::Offset union_type = 0, const std::vector> *documentation = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; return reflection::CreateEnumVal( _fbb, name__, value, union_type, documentation__); } struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef EnumBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_VALUES = 6, VT_IS_UNION = 8, VT_UNDERLYING_TYPE = 10, VT_ATTRIBUTES = 12, VT_DOCUMENTATION = 14, VT_DECLARATION_FILE = 16 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const Enum *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const flatbuffers::Vector> *values() const { return GetPointer> *>(VT_VALUES); } bool is_union() const { return GetField(VT_IS_UNION, 0) != 0; } const reflection::Type *underlying_type() const { return GetPointer(VT_UNDERLYING_TYPE); } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } /// File that this Enum is declared in. const flatbuffers::String *declaration_file() const { return GetPointer(VT_DECLARATION_FILE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffsetRequired(verifier, VT_VALUES) && verifier.VerifyVector(values()) && verifier.VerifyVectorOfTables(values()) && VerifyField(verifier, VT_IS_UNION, 1) && VerifyOffsetRequired(verifier, VT_UNDERLYING_TYPE) && verifier.VerifyTable(underlying_type()) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && VerifyOffset(verifier, VT_DECLARATION_FILE) && verifier.VerifyString(declaration_file()) && verifier.EndTable(); } }; struct EnumBuilder { typedef Enum Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Enum::VT_NAME, name); } void add_values(flatbuffers::Offset>> values) { fbb_.AddOffset(Enum::VT_VALUES, values); } void add_is_union(bool is_union) { fbb_.AddElement(Enum::VT_IS_UNION, static_cast(is_union), 0); } void add_underlying_type(flatbuffers::Offset underlying_type) { fbb_.AddOffset(Enum::VT_UNDERLYING_TYPE, underlying_type); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(Enum::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(Enum::VT_DOCUMENTATION, documentation); } void add_declaration_file(flatbuffers::Offset declaration_file) { fbb_.AddOffset(Enum::VT_DECLARATION_FILE, declaration_file); } explicit EnumBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Enum::VT_NAME); fbb_.Required(o, Enum::VT_VALUES); fbb_.Required(o, Enum::VT_UNDERLYING_TYPE); return o; } }; inline flatbuffers::Offset CreateEnum( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset>> values = 0, bool is_union = false, flatbuffers::Offset underlying_type = 0, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0, flatbuffers::Offset declaration_file = 0) { EnumBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_underlying_type(underlying_type); builder_.add_values(values); builder_.add_name(name); builder_.add_is_union(is_union); return builder_.Finish(); } inline flatbuffers::Offset CreateEnumDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, std::vector> *values = nullptr, bool is_union = false, flatbuffers::Offset underlying_type = 0, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto values__ = values ? _fbb.CreateVectorOfSortedTables(values) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateEnum( _fbb, name__, values__, is_union, underlying_type, attributes__, documentation__, declaration_file__); } struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef FieldBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_TYPE = 6, VT_ID = 8, VT_OFFSET = 10, VT_DEFAULT_INTEGER = 12, VT_DEFAULT_REAL = 14, VT_DEPRECATED = 16, VT_REQUIRED = 18, VT_KEY = 20, VT_ATTRIBUTES = 22, VT_DOCUMENTATION = 24, VT_OPTIONAL = 26, VT_PADDING = 28 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const Field *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const reflection::Type *type() const { return GetPointer(VT_TYPE); } uint16_t id() const { return GetField(VT_ID, 0); } uint16_t offset() const { return GetField(VT_OFFSET, 0); } int64_t default_integer() const { return GetField(VT_DEFAULT_INTEGER, 0); } double default_real() const { return GetField(VT_DEFAULT_REAL, 0.0); } bool deprecated() const { return GetField(VT_DEPRECATED, 0) != 0; } bool required() const { return GetField(VT_REQUIRED, 0) != 0; } bool key() const { return GetField(VT_KEY, 0) != 0; } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } bool optional() const { return GetField(VT_OPTIONAL, 0) != 0; } /// Number of padding octets to always add after this field. Structs only. uint16_t padding() const { return GetField(VT_PADDING, 0); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffsetRequired(verifier, VT_TYPE) && verifier.VerifyTable(type()) && VerifyField(verifier, VT_ID, 2) && VerifyField(verifier, VT_OFFSET, 2) && VerifyField(verifier, VT_DEFAULT_INTEGER, 8) && VerifyField(verifier, VT_DEFAULT_REAL, 8) && VerifyField(verifier, VT_DEPRECATED, 1) && VerifyField(verifier, VT_REQUIRED, 1) && VerifyField(verifier, VT_KEY, 1) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && VerifyField(verifier, VT_OPTIONAL, 1) && VerifyField(verifier, VT_PADDING, 2) && verifier.EndTable(); } }; struct FieldBuilder { typedef Field Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Field::VT_NAME, name); } void add_type(flatbuffers::Offset type) { fbb_.AddOffset(Field::VT_TYPE, type); } void add_id(uint16_t id) { fbb_.AddElement(Field::VT_ID, id, 0); } void add_offset(uint16_t offset) { fbb_.AddElement(Field::VT_OFFSET, offset, 0); } void add_default_integer(int64_t default_integer) { fbb_.AddElement(Field::VT_DEFAULT_INTEGER, default_integer, 0); } void add_default_real(double default_real) { fbb_.AddElement(Field::VT_DEFAULT_REAL, default_real, 0.0); } void add_deprecated(bool deprecated) { fbb_.AddElement(Field::VT_DEPRECATED, static_cast(deprecated), 0); } void add_required(bool required) { fbb_.AddElement(Field::VT_REQUIRED, static_cast(required), 0); } void add_key(bool key) { fbb_.AddElement(Field::VT_KEY, static_cast(key), 0); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(Field::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(Field::VT_DOCUMENTATION, documentation); } void add_optional(bool optional) { fbb_.AddElement(Field::VT_OPTIONAL, static_cast(optional), 0); } void add_padding(uint16_t padding) { fbb_.AddElement(Field::VT_PADDING, padding, 0); } explicit FieldBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Field::VT_NAME); fbb_.Required(o, Field::VT_TYPE); return o; } }; inline flatbuffers::Offset CreateField( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset type = 0, uint16_t id = 0, uint16_t offset = 0, int64_t default_integer = 0, double default_real = 0.0, bool deprecated = false, bool required = false, bool key = false, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0, bool optional = false, uint16_t padding = 0) { FieldBuilder builder_(_fbb); builder_.add_default_real(default_real); builder_.add_default_integer(default_integer); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_type(type); builder_.add_name(name); builder_.add_padding(padding); builder_.add_offset(offset); builder_.add_id(id); builder_.add_optional(optional); builder_.add_key(key); builder_.add_required(required); builder_.add_deprecated(deprecated); return builder_.Finish(); } inline flatbuffers::Offset CreateFieldDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, flatbuffers::Offset type = 0, uint16_t id = 0, uint16_t offset = 0, int64_t default_integer = 0, double default_real = 0.0, bool deprecated = false, bool required = false, bool key = false, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr, bool optional = false, uint16_t padding = 0) { auto name__ = name ? _fbb.CreateString(name) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; return reflection::CreateField( _fbb, name__, type, id, offset, default_integer, default_real, deprecated, required, key, attributes__, documentation__, optional, padding); } struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ObjectBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_FIELDS = 6, VT_IS_STRUCT = 8, VT_MINALIGN = 10, VT_BYTESIZE = 12, VT_ATTRIBUTES = 14, VT_DOCUMENTATION = 16, VT_DECLARATION_FILE = 18 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const Object *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const flatbuffers::Vector> *fields() const { return GetPointer> *>(VT_FIELDS); } bool is_struct() const { return GetField(VT_IS_STRUCT, 0) != 0; } int32_t minalign() const { return GetField(VT_MINALIGN, 0); } int32_t bytesize() const { return GetField(VT_BYTESIZE, 0); } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } /// File that this Object is declared in. const flatbuffers::String *declaration_file() const { return GetPointer(VT_DECLARATION_FILE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffsetRequired(verifier, VT_FIELDS) && verifier.VerifyVector(fields()) && verifier.VerifyVectorOfTables(fields()) && VerifyField(verifier, VT_IS_STRUCT, 1) && VerifyField(verifier, VT_MINALIGN, 4) && VerifyField(verifier, VT_BYTESIZE, 4) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && VerifyOffset(verifier, VT_DECLARATION_FILE) && verifier.VerifyString(declaration_file()) && verifier.EndTable(); } }; struct ObjectBuilder { typedef Object Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Object::VT_NAME, name); } void add_fields(flatbuffers::Offset>> fields) { fbb_.AddOffset(Object::VT_FIELDS, fields); } void add_is_struct(bool is_struct) { fbb_.AddElement(Object::VT_IS_STRUCT, static_cast(is_struct), 0); } void add_minalign(int32_t minalign) { fbb_.AddElement(Object::VT_MINALIGN, minalign, 0); } void add_bytesize(int32_t bytesize) { fbb_.AddElement(Object::VT_BYTESIZE, bytesize, 0); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(Object::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(Object::VT_DOCUMENTATION, documentation); } void add_declaration_file(flatbuffers::Offset declaration_file) { fbb_.AddOffset(Object::VT_DECLARATION_FILE, declaration_file); } explicit ObjectBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Object::VT_NAME); fbb_.Required(o, Object::VT_FIELDS); return o; } }; inline flatbuffers::Offset CreateObject( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset>> fields = 0, bool is_struct = false, int32_t minalign = 0, int32_t bytesize = 0, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0, flatbuffers::Offset declaration_file = 0) { ObjectBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_bytesize(bytesize); builder_.add_minalign(minalign); builder_.add_fields(fields); builder_.add_name(name); builder_.add_is_struct(is_struct); return builder_.Finish(); } inline flatbuffers::Offset CreateObjectDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, std::vector> *fields = nullptr, bool is_struct = false, int32_t minalign = 0, int32_t bytesize = 0, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto fields__ = fields ? _fbb.CreateVectorOfSortedTables(fields) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateObject( _fbb, name__, fields__, is_struct, minalign, bytesize, attributes__, documentation__, declaration_file__); } struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef RPCCallBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_REQUEST = 6, VT_RESPONSE = 8, VT_ATTRIBUTES = 10, VT_DOCUMENTATION = 12 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const RPCCall *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const reflection::Object *request() const { return GetPointer(VT_REQUEST); } const reflection::Object *response() const { return GetPointer(VT_RESPONSE); } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffsetRequired(verifier, VT_REQUEST) && verifier.VerifyTable(request()) && VerifyOffsetRequired(verifier, VT_RESPONSE) && verifier.VerifyTable(response()) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && verifier.EndTable(); } }; struct RPCCallBuilder { typedef RPCCall Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(RPCCall::VT_NAME, name); } void add_request(flatbuffers::Offset request) { fbb_.AddOffset(RPCCall::VT_REQUEST, request); } void add_response(flatbuffers::Offset response) { fbb_.AddOffset(RPCCall::VT_RESPONSE, response); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(RPCCall::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(RPCCall::VT_DOCUMENTATION, documentation); } explicit RPCCallBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, RPCCall::VT_NAME); fbb_.Required(o, RPCCall::VT_REQUEST); fbb_.Required(o, RPCCall::VT_RESPONSE); return o; } }; inline flatbuffers::Offset CreateRPCCall( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset request = 0, flatbuffers::Offset response = 0, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0) { RPCCallBuilder builder_(_fbb); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_response(response); builder_.add_request(request); builder_.add_name(name); return builder_.Finish(); } inline flatbuffers::Offset CreateRPCCallDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, flatbuffers::Offset request = 0, flatbuffers::Offset response = 0, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; return reflection::CreateRPCCall( _fbb, name__, request, response, attributes__, documentation__); } struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ServiceBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_CALLS = 6, VT_ATTRIBUTES = 8, VT_DOCUMENTATION = 10, VT_DECLARATION_FILE = 12 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const Service *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const flatbuffers::Vector> *calls() const { return GetPointer> *>(VT_CALLS); } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } /// File that this Service is declared in. const flatbuffers::String *declaration_file() const { return GetPointer(VT_DECLARATION_FILE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffset(verifier, VT_CALLS) && verifier.VerifyVector(calls()) && verifier.VerifyVectorOfTables(calls()) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && VerifyOffset(verifier, VT_DECLARATION_FILE) && verifier.VerifyString(declaration_file()) && verifier.EndTable(); } }; struct ServiceBuilder { typedef Service Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Service::VT_NAME, name); } void add_calls(flatbuffers::Offset>> calls) { fbb_.AddOffset(Service::VT_CALLS, calls); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(Service::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(Service::VT_DOCUMENTATION, documentation); } void add_declaration_file(flatbuffers::Offset declaration_file) { fbb_.AddOffset(Service::VT_DECLARATION_FILE, declaration_file); } explicit ServiceBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Service::VT_NAME); return o; } }; inline flatbuffers::Offset CreateService( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset>> calls = 0, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0, flatbuffers::Offset declaration_file = 0) { ServiceBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_calls(calls); builder_.add_name(name); return builder_.Finish(); } inline flatbuffers::Offset CreateServiceDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, std::vector> *calls = nullptr, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto calls__ = calls ? _fbb.CreateVectorOfSortedTables(calls) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateService( _fbb, name__, calls__, attributes__, documentation__, declaration_file__); } /// File specific information. /// Symbols declared within a file may be recovered by iterating over all /// symbols and examining the `declaration_file` field. struct SchemaFile FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef SchemaFileBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_FILENAME = 4, VT_INCLUDED_FILENAMES = 6 }; /// Filename, relative to project root. const flatbuffers::String *filename() const { return GetPointer(VT_FILENAME); } bool KeyCompareLessThan(const SchemaFile *o) const { return *filename() < *o->filename(); } int KeyCompareWithValue(const char *_filename) const { return strcmp(filename()->c_str(), _filename); } /// Names of included files, relative to project root. const flatbuffers::Vector> *included_filenames() const { return GetPointer> *>(VT_INCLUDED_FILENAMES); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_FILENAME) && verifier.VerifyString(filename()) && VerifyOffset(verifier, VT_INCLUDED_FILENAMES) && verifier.VerifyVector(included_filenames()) && verifier.VerifyVectorOfStrings(included_filenames()) && verifier.EndTable(); } }; struct SchemaFileBuilder { typedef SchemaFile Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_filename(flatbuffers::Offset filename) { fbb_.AddOffset(SchemaFile::VT_FILENAME, filename); } void add_included_filenames(flatbuffers::Offset>> included_filenames) { fbb_.AddOffset(SchemaFile::VT_INCLUDED_FILENAMES, included_filenames); } explicit SchemaFileBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, SchemaFile::VT_FILENAME); return o; } }; inline flatbuffers::Offset CreateSchemaFile( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset filename = 0, flatbuffers::Offset>> included_filenames = 0) { SchemaFileBuilder builder_(_fbb); builder_.add_included_filenames(included_filenames); builder_.add_filename(filename); return builder_.Finish(); } inline flatbuffers::Offset CreateSchemaFileDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *filename = nullptr, const std::vector> *included_filenames = nullptr) { auto filename__ = filename ? _fbb.CreateString(filename) : 0; auto included_filenames__ = included_filenames ? _fbb.CreateVector>(*included_filenames) : 0; return reflection::CreateSchemaFile( _fbb, filename__, included_filenames__); } struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef SchemaBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_OBJECTS = 4, VT_ENUMS = 6, VT_FILE_IDENT = 8, VT_FILE_EXT = 10, VT_ROOT_TABLE = 12, VT_SERVICES = 14, VT_ADVANCED_FEATURES = 16, VT_FBS_FILES = 18 }; const flatbuffers::Vector> *objects() const { return GetPointer> *>(VT_OBJECTS); } const flatbuffers::Vector> *enums() const { return GetPointer> *>(VT_ENUMS); } const flatbuffers::String *file_ident() const { return GetPointer(VT_FILE_IDENT); } const flatbuffers::String *file_ext() const { return GetPointer(VT_FILE_EXT); } const reflection::Object *root_table() const { return GetPointer(VT_ROOT_TABLE); } const flatbuffers::Vector> *services() const { return GetPointer> *>(VT_SERVICES); } reflection::AdvancedFeatures advanced_features() const { return static_cast(GetField(VT_ADVANCED_FEATURES, 0)); } /// All the files used in this compilation. Files are relative to where /// flatc was invoked. const flatbuffers::Vector> *fbs_files() const { return GetPointer> *>(VT_FBS_FILES); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_OBJECTS) && verifier.VerifyVector(objects()) && verifier.VerifyVectorOfTables(objects()) && VerifyOffsetRequired(verifier, VT_ENUMS) && verifier.VerifyVector(enums()) && verifier.VerifyVectorOfTables(enums()) && VerifyOffset(verifier, VT_FILE_IDENT) && verifier.VerifyString(file_ident()) && VerifyOffset(verifier, VT_FILE_EXT) && verifier.VerifyString(file_ext()) && VerifyOffset(verifier, VT_ROOT_TABLE) && verifier.VerifyTable(root_table()) && VerifyOffset(verifier, VT_SERVICES) && verifier.VerifyVector(services()) && verifier.VerifyVectorOfTables(services()) && VerifyField(verifier, VT_ADVANCED_FEATURES, 8) && VerifyOffset(verifier, VT_FBS_FILES) && verifier.VerifyVector(fbs_files()) && verifier.VerifyVectorOfTables(fbs_files()) && verifier.EndTable(); } }; struct SchemaBuilder { typedef Schema Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_objects(flatbuffers::Offset>> objects) { fbb_.AddOffset(Schema::VT_OBJECTS, objects); } void add_enums(flatbuffers::Offset>> enums) { fbb_.AddOffset(Schema::VT_ENUMS, enums); } void add_file_ident(flatbuffers::Offset file_ident) { fbb_.AddOffset(Schema::VT_FILE_IDENT, file_ident); } void add_file_ext(flatbuffers::Offset file_ext) { fbb_.AddOffset(Schema::VT_FILE_EXT, file_ext); } void add_root_table(flatbuffers::Offset root_table) { fbb_.AddOffset(Schema::VT_ROOT_TABLE, root_table); } void add_services(flatbuffers::Offset>> services) { fbb_.AddOffset(Schema::VT_SERVICES, services); } void add_advanced_features(reflection::AdvancedFeatures advanced_features) { fbb_.AddElement(Schema::VT_ADVANCED_FEATURES, static_cast(advanced_features), 0); } void add_fbs_files(flatbuffers::Offset>> fbs_files) { fbb_.AddOffset(Schema::VT_FBS_FILES, fbs_files); } explicit SchemaBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Schema::VT_OBJECTS); fbb_.Required(o, Schema::VT_ENUMS); return o; } }; inline flatbuffers::Offset CreateSchema( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset>> objects = 0, flatbuffers::Offset>> enums = 0, flatbuffers::Offset file_ident = 0, flatbuffers::Offset file_ext = 0, flatbuffers::Offset root_table = 0, flatbuffers::Offset>> services = 0, reflection::AdvancedFeatures advanced_features = static_cast(0), flatbuffers::Offset>> fbs_files = 0) { SchemaBuilder builder_(_fbb); builder_.add_advanced_features(advanced_features); builder_.add_fbs_files(fbs_files); builder_.add_services(services); builder_.add_root_table(root_table); builder_.add_file_ext(file_ext); builder_.add_file_ident(file_ident); builder_.add_enums(enums); builder_.add_objects(objects); return builder_.Finish(); } inline flatbuffers::Offset CreateSchemaDirect( flatbuffers::FlatBufferBuilder &_fbb, std::vector> *objects = nullptr, std::vector> *enums = nullptr, const char *file_ident = nullptr, const char *file_ext = nullptr, flatbuffers::Offset root_table = 0, std::vector> *services = nullptr, reflection::AdvancedFeatures advanced_features = static_cast(0), std::vector> *fbs_files = nullptr) { auto objects__ = objects ? _fbb.CreateVectorOfSortedTables(objects) : 0; auto enums__ = enums ? _fbb.CreateVectorOfSortedTables(enums) : 0; auto file_ident__ = file_ident ? _fbb.CreateString(file_ident) : 0; auto file_ext__ = file_ext ? _fbb.CreateString(file_ext) : 0; auto services__ = services ? _fbb.CreateVectorOfSortedTables(services) : 0; auto fbs_files__ = fbs_files ? _fbb.CreateVectorOfSortedTables(fbs_files) : 0; return reflection::CreateSchema( _fbb, objects__, enums__, file_ident__, file_ext__, root_table, services__, advanced_features, fbs_files__); } inline const reflection::Schema *GetSchema(const void *buf) { return flatbuffers::GetRoot(buf); } inline const reflection::Schema *GetSizePrefixedSchema(const void *buf) { return flatbuffers::GetSizePrefixedRoot(buf); } inline const char *SchemaIdentifier() { return "BFBS"; } inline bool SchemaBufferHasIdentifier(const void *buf) { return flatbuffers::BufferHasIdentifier( buf, SchemaIdentifier()); } inline bool SizePrefixedSchemaBufferHasIdentifier(const void *buf) { return flatbuffers::BufferHasIdentifier( buf, SchemaIdentifier(), true); } inline bool VerifySchemaBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer(SchemaIdentifier()); } inline bool VerifySizePrefixedSchemaBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifySizePrefixedBuffer(SchemaIdentifier()); } inline const char *SchemaExtension() { return "bfbs"; } inline void FinishSchemaBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.Finish(root, SchemaIdentifier()); } inline void FinishSizePrefixedSchemaBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.FinishSizePrefixed(root, SchemaIdentifier()); } } // namespace reflection #endif // FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/registry.h000066400000000000000000000106531474174441300244210ustar00rootroot00000000000000/* * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_REGISTRY_H_ #define FLATBUFFERS_REGISTRY_H_ #include "flatbuffers/base.h" #include "flatbuffers/idl.h" namespace mapserver { namespace flatbuffers { // Convenience class to easily parse or generate text for arbitrary FlatBuffers. // Simply pre-populate it with all schema filenames that may be in use, and // This class will look them up using the file_identifier declared in the // schema. class Registry { public: // Call this for all schemas that may be in use. The identifier has // a function in the generated code, e.g. MonsterIdentifier(). void Register(const char *file_identifier, const char *schema_path) { Schema schema; schema.path_ = schema_path; schemas_[file_identifier] = schema; } // Generate text from an arbitrary FlatBuffer by looking up its // file_identifier in the registry. bool FlatBufferToText(const uint8_t *flatbuf, size_t len, std::string *dest) { // Get the identifier out of the buffer. // If the buffer is truncated, exit. if (len < sizeof(uoffset_t) + kFileIdentifierLength) { lasterror_ = "buffer truncated"; return false; } std::string ident( reinterpret_cast(flatbuf) + sizeof(uoffset_t), kFileIdentifierLength); // Load and parse the schema. Parser parser; if (!LoadSchema(ident, &parser)) return false; // Now we're ready to generate text. if (!GenerateText(parser, flatbuf, dest)) { lasterror_ = "unable to generate text for FlatBuffer binary"; return false; } return true; } // Converts a binary buffer to text using one of the schemas in the registry, // use the file_identifier to indicate which. // If DetachedBuffer::data() is null then parsing failed. DetachedBuffer TextToFlatBuffer(const char *text, const char *file_identifier) { // Load and parse the schema. Parser parser; if (!LoadSchema(file_identifier, &parser)) return DetachedBuffer(); // Parse the text. if (!parser.Parse(text)) { lasterror_ = parser.error_; return DetachedBuffer(); } // We have a valid FlatBuffer. Detach it from the builder and return. return parser.builder_.Release(); } // Modify any parsing / output options used by the other functions. void SetOptions(const IDLOptions &opts) { opts_ = opts; } // If schemas used contain include statements, call this function for every // directory the parser should search them for. void AddIncludeDirectory(const char *path) { include_paths_.push_back(path); } // Returns a human readable error if any of the above functions fail. const std::string &GetLastError() { return lasterror_; } private: bool LoadSchema(const std::string &ident, Parser *parser) { // Find the schema, if not, exit. auto it = schemas_.find(ident); if (it == schemas_.end()) { // Don't attach the identifier, since it may not be human readable. lasterror_ = "identifier for this buffer not in the registry"; return false; } auto &schema = it->second; // Load the schema from disk. If not, exit. std::string schematext; if (!LoadFile(schema.path_.c_str(), false, &schematext)) { lasterror_ = "could not load schema: " + schema.path_; return false; } // Parse schema. parser->opts = opts_; if (!parser->Parse(schematext.c_str(), include_paths_.data(), schema.path_.c_str())) { lasterror_ = parser->error_; return false; } return true; } struct Schema { std::string path_; // TODO(wvo) optionally cache schema file or parsed schema here. }; std::string lasterror_; IDLOptions opts_; std::vector include_paths_; std::map schemas_; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_REGISTRY_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/stl_emulation.h000066400000000000000000000445461474174441300254400ustar00rootroot00000000000000/* * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_STL_EMULATION_H_ #define FLATBUFFERS_STL_EMULATION_H_ // clang-format off #include "flatbuffers/base.h" #include #include #include #include #include #ifndef FLATBUFFERS_USE_STD_OPTIONAL // Detect C++17 compatible compiler. // __cplusplus >= 201703L - a compiler has support of 'static inline' variables. #if (defined(__cplusplus) && __cplusplus >= 201703L) \ || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) #define FLATBUFFERS_USE_STD_OPTIONAL 1 #else #define FLATBUFFERS_USE_STD_OPTIONAL 0 #endif // (defined(__cplusplus) && __cplusplus >= 201703L) ... #endif // FLATBUFFERS_USE_STD_OPTIONAL #if FLATBUFFERS_USE_STD_OPTIONAL #include #endif // The __cpp_lib_span is the predefined feature macro. #if defined(FLATBUFFERS_USE_STD_SPAN) #include #elif defined(__cpp_lib_span) && defined(__has_include) #if __has_include() #include #define FLATBUFFERS_USE_STD_SPAN #endif #else // Disable non-trivial ctors if FLATBUFFERS_SPAN_MINIMAL defined. #if !defined(FLATBUFFERS_TEMPLATES_ALIASES) #define FLATBUFFERS_SPAN_MINIMAL #else // Enable implicit construction of a span from a std::array. #include #endif #endif // defined(FLATBUFFERS_USE_STD_SPAN) // This header provides backwards compatibility for older versions of the STL. namespace mapserver { namespace flatbuffers { #if defined(FLATBUFFERS_TEMPLATES_ALIASES) template using numeric_limits = std::numeric_limits; #else template class numeric_limits : public std::numeric_limits {}; #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #if defined(FLATBUFFERS_TEMPLATES_ALIASES) template using is_scalar = std::is_scalar; template using is_same = std::is_same; template using is_floating_point = std::is_floating_point; template using is_unsigned = std::is_unsigned; template using is_enum = std::is_enum; template using make_unsigned = std::make_unsigned; template using conditional = std::conditional; template using integral_constant = std::integral_constant; template using bool_constant = integral_constant; using true_type = std::true_type; using false_type = std::false_type; #else // MSVC 2010 doesn't support C++11 aliases. template struct is_scalar : public std::is_scalar {}; template struct is_same : public std::is_same {}; template struct is_floating_point : public std::is_floating_point {}; template struct is_unsigned : public std::is_unsigned {}; template struct is_enum : public std::is_enum {}; template struct make_unsigned : public std::make_unsigned {}; template struct conditional : public std::conditional {}; template struct integral_constant : public std::integral_constant {}; template struct bool_constant : public integral_constant {}; typedef bool_constant true_type; typedef bool_constant false_type; #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #if defined(FLATBUFFERS_TEMPLATES_ALIASES) template using unique_ptr = std::unique_ptr; #else // MSVC 2010 doesn't support C++11 aliases. // We're manually "aliasing" the class here as we want to bring unique_ptr // into the flatbuffers namespace. We have unique_ptr in the flatbuffers // namespace we have a completely independent implementation (see below) // for C++98 STL implementations. template class unique_ptr : public std::unique_ptr { public: unique_ptr() {} explicit unique_ptr(T* p) : std::unique_ptr(p) {} unique_ptr(std::unique_ptr&& u) { *this = std::move(u); } unique_ptr(unique_ptr&& u) { *this = std::move(u); } unique_ptr& operator=(std::unique_ptr&& u) { std::unique_ptr::reset(u.release()); return *this; } unique_ptr& operator=(unique_ptr&& u) { std::unique_ptr::reset(u.release()); return *this; } unique_ptr& operator=(T* p) { return std::unique_ptr::operator=(p); } }; #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #if FLATBUFFERS_USE_STD_OPTIONAL template using Optional = std::optional; using nullopt_t = std::nullopt_t; inline constexpr nullopt_t nullopt = std::nullopt; #else // Limited implementation of Optional type for a scalar T. // This implementation limited by trivial types compatible with // std::is_arithmetic or std::is_enum type traits. // A tag to indicate an empty flatbuffers::optional. struct nullopt_t { explicit FLATBUFFERS_CONSTEXPR_CPP11 nullopt_t(int) {} }; #if defined(FLATBUFFERS_CONSTEXPR_DEFINED) namespace internal { template struct nullopt_holder { static constexpr nullopt_t instance_ = nullopt_t(0); }; template constexpr nullopt_t nullopt_holder::instance_; } static constexpr const nullopt_t &nullopt = internal::nullopt_holder::instance_; #else namespace internal { template struct nullopt_holder { static const nullopt_t instance_; }; template const nullopt_t nullopt_holder::instance_ = nullopt_t(0); } static const nullopt_t &nullopt = internal::nullopt_holder::instance_; #endif template class Optional FLATBUFFERS_FINAL_CLASS { // Non-scalar 'T' would extremely complicated Optional. // Use is_scalar checking because flatbuffers flatbuffers::is_arithmetic // isn't implemented. static_assert(flatbuffers::is_scalar::value, "unexpected type T"); public: ~Optional() {} FLATBUFFERS_CONSTEXPR_CPP11 Optional() FLATBUFFERS_NOEXCEPT : value_(), has_value_(false) {} FLATBUFFERS_CONSTEXPR_CPP11 Optional(nullopt_t) FLATBUFFERS_NOEXCEPT : value_(), has_value_(false) {} FLATBUFFERS_CONSTEXPR_CPP11 Optional(T val) FLATBUFFERS_NOEXCEPT : value_(val), has_value_(true) {} FLATBUFFERS_CONSTEXPR_CPP11 Optional(const Optional &other) FLATBUFFERS_NOEXCEPT : value_(other.value_), has_value_(other.has_value_) {} FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(const Optional &other) FLATBUFFERS_NOEXCEPT { value_ = other.value_; has_value_ = other.has_value_; return *this; } FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(nullopt_t) FLATBUFFERS_NOEXCEPT { value_ = T(); has_value_ = false; return *this; } FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(T val) FLATBUFFERS_NOEXCEPT { value_ = val; has_value_ = true; return *this; } void reset() FLATBUFFERS_NOEXCEPT { *this = nullopt; } void swap(Optional &other) FLATBUFFERS_NOEXCEPT { std::swap(value_, other.value_); std::swap(has_value_, other.has_value_); } FLATBUFFERS_CONSTEXPR_CPP11 FLATBUFFERS_EXPLICIT_CPP11 operator bool() const FLATBUFFERS_NOEXCEPT { return has_value_; } FLATBUFFERS_CONSTEXPR_CPP11 bool has_value() const FLATBUFFERS_NOEXCEPT { return has_value_; } FLATBUFFERS_CONSTEXPR_CPP11 const T& operator*() const FLATBUFFERS_NOEXCEPT { return value_; } const T& value() const { FLATBUFFERS_ASSERT(has_value()); return value_; } T value_or(T default_value) const FLATBUFFERS_NOEXCEPT { return has_value() ? value_ : default_value; } private: T value_; bool has_value_; }; template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& opt, nullopt_t) FLATBUFFERS_NOEXCEPT { return !opt; } template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(nullopt_t, const Optional& opt) FLATBUFFERS_NOEXCEPT { return !opt; } template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& lhs, const U& rhs) FLATBUFFERS_NOEXCEPT { return static_cast(lhs) && (*lhs == rhs); } template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const T& lhs, const Optional& rhs) FLATBUFFERS_NOEXCEPT { return static_cast(rhs) && (lhs == *rhs); } template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& lhs, const Optional& rhs) FLATBUFFERS_NOEXCEPT { return static_cast(lhs) != static_cast(rhs) ? false : !static_cast(lhs) ? false : (*lhs == *rhs); } #endif // FLATBUFFERS_USE_STD_OPTIONAL // Very limited and naive partial implementation of C++20 std::span. #if defined(FLATBUFFERS_USE_STD_SPAN) inline constexpr std::size_t dynamic_extent = std::dynamic_extent; template using span = std::span; #else // !defined(FLATBUFFERS_USE_STD_SPAN) FLATBUFFERS_CONSTEXPR std::size_t dynamic_extent = static_cast(-1); // Exclude this code if MSVC2010 or non-STL Android is active. // The non-STL Android doesn't have `std::is_convertible` required for SFINAE. #if !defined(FLATBUFFERS_SPAN_MINIMAL) namespace internal { // This is SFINAE helper class for checking of a common condition: // > This overload only participates in overload resolution // > Check whether a pointer to an array of U can be converted // > to a pointer to an array of E. // This helper is used for checking of 'U -> const U'. template struct is_span_convertable { using type = typename std::conditional::value && (Extent == dynamic_extent || N == Extent), int, void>::type; }; template struct SpanIterator { // TODO: upgrade to std::random_access_iterator_tag. using iterator_category = std::forward_iterator_tag; using difference_type = std::ptrdiff_t; using value_type = typename std::remove_cv::type; using reference = T&; using pointer = T*; // Convince MSVC compiler that this iterator is trusted (it is verified). #ifdef _MSC_VER using _Unchecked_type = pointer; #endif // _MSC_VER SpanIterator(pointer ptr) : ptr_(ptr) {} reference operator*() const { return *ptr_; } pointer operator->() { return ptr_; } SpanIterator& operator++() { ptr_++; return *this; } SpanIterator operator++(int) { auto tmp = *this; ++(*this); return tmp; } friend bool operator== (const SpanIterator& lhs, const SpanIterator& rhs) { return lhs.ptr_ == rhs.ptr_; } friend bool operator!= (const SpanIterator& lhs, const SpanIterator& rhs) { return lhs.ptr_ != rhs.ptr_; } private: pointer ptr_; }; } // namespace internal #endif // !defined(FLATBUFFERS_SPAN_MINIMAL) // T - element type; must be a complete type that is not an abstract // class type. // Extent - the number of elements in the sequence, or dynamic. template class span FLATBUFFERS_FINAL_CLASS { public: typedef T element_type; typedef T& reference; typedef const T& const_reference; typedef T* pointer; typedef const T* const_pointer; typedef std::size_t size_type; static FLATBUFFERS_CONSTEXPR size_type extent = Extent; // Returns the number of elements in the span. FLATBUFFERS_CONSTEXPR_CPP11 size_type size() const FLATBUFFERS_NOEXCEPT { return count_; } // Returns the size of the sequence in bytes. FLATBUFFERS_CONSTEXPR_CPP11 size_type size_bytes() const FLATBUFFERS_NOEXCEPT { return size() * sizeof(element_type); } // Checks if the span is empty. FLATBUFFERS_CONSTEXPR_CPP11 bool empty() const FLATBUFFERS_NOEXCEPT { return size() == 0; } // Returns a pointer to the beginning of the sequence. FLATBUFFERS_CONSTEXPR_CPP11 pointer data() const FLATBUFFERS_NOEXCEPT { return data_; } #if !defined(FLATBUFFERS_SPAN_MINIMAL) using Iterator = internal::SpanIterator; using ConstIterator = internal::SpanIterator; Iterator begin() const { return Iterator(data()); } Iterator end() const { return Iterator(data() + size()); } ConstIterator cbegin() const { return ConstIterator(data()); } ConstIterator cend() const { return ConstIterator(data() + size()); } #endif // Returns a reference to the idx-th element of the sequence. // The behavior is undefined if the idx is greater than or equal to size(). FLATBUFFERS_CONSTEXPR_CPP11 reference operator[](size_type idx) const { return data()[idx]; } FLATBUFFERS_CONSTEXPR_CPP11 span(const span &other) FLATBUFFERS_NOEXCEPT : data_(other.data_), count_(other.count_) {} FLATBUFFERS_CONSTEXPR_CPP14 span &operator=(const span &other) FLATBUFFERS_NOEXCEPT { data_ = other.data_; count_ = other.count_; } // Limited implementation of // `template constexpr std::span(It first, size_type count);`. // // Constructs a span that is a view over the range [first, first + count); // the resulting span has: data() == first and size() == count. // The behavior is undefined if [first, first + count) is not a valid range, // or if (extent != flatbuffers::dynamic_extent && count != extent). FLATBUFFERS_CONSTEXPR_CPP11 explicit span(pointer first, size_type count) FLATBUFFERS_NOEXCEPT : data_ (Extent == dynamic_extent ? first : (Extent == count ? first : nullptr)), count_(Extent == dynamic_extent ? count : (Extent == count ? Extent : 0)) { // Make span empty if the count argument is incompatible with span. } // Exclude this code if MSVC2010 is active. The MSVC2010 isn't C++11 // compliant, it doesn't support default template arguments for functions. #if defined(FLATBUFFERS_SPAN_MINIMAL) FLATBUFFERS_CONSTEXPR_CPP11 span() FLATBUFFERS_NOEXCEPT : data_(nullptr), count_(0) { static_assert(extent == 0 || extent == dynamic_extent, "invalid span"); } #else // Constructs an empty span whose data() == nullptr and size() == 0. // This overload only participates in overload resolution if // extent == 0 || extent == flatbuffers::dynamic_extent. // A dummy template argument N is need dependency for SFINAE. template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span() FLATBUFFERS_NOEXCEPT : data_(nullptr), count_(0) { static_assert(extent == 0 || extent == dynamic_extent, "invalid span"); } // Constructs a span that is a view over the array arr; the resulting span // has size() == N and data() == std::data(arr). These overloads only // participate in overload resolution if // extent == std::dynamic_extent || N == extent is true and // std::remove_pointer_t(*)[] // is convertible to element_type (*)[]. template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span(element_type (&arr)[N]) FLATBUFFERS_NOEXCEPT : data_(arr), count_(N) {} template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span(std::array &arr) FLATBUFFERS_NOEXCEPT : data_(arr.data()), count_(N) {} //template //FLATBUFFERS_CONSTEXPR_CPP11 span(std::array &arr) FLATBUFFERS_NOEXCEPT // : data_(arr.data()), count_(N) {} template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span(const std::array &arr) FLATBUFFERS_NOEXCEPT : data_(arr.data()), count_(N) {} // Converting constructor from another span s; // the resulting span has size() == s.size() and data() == s.data(). // This overload only participates in overload resolution // if extent == std::dynamic_extent || N == extent is true and U (*)[] // is convertible to element_type (*)[]. template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span(const flatbuffers::span &s) FLATBUFFERS_NOEXCEPT : span(s.data(), s.size()) { } #endif // !defined(FLATBUFFERS_SPAN_MINIMAL) private: // This is a naive implementation with 'count_' member even if (Extent != dynamic_extent). pointer const data_; size_type count_; }; #endif // defined(FLATBUFFERS_USE_STD_SPAN) #if !defined(FLATBUFFERS_SPAN_MINIMAL) template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(U(&arr)[N]) FLATBUFFERS_NOEXCEPT { return span(arr); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(const U(&arr)[N]) FLATBUFFERS_NOEXCEPT { return span(arr); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(std::array &arr) FLATBUFFERS_NOEXCEPT { return span(arr); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(const std::array &arr) FLATBUFFERS_NOEXCEPT { return span(arr); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(U *first, std::size_t count) FLATBUFFERS_NOEXCEPT { return span(first, count); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(const U *first, std::size_t count) FLATBUFFERS_NOEXCEPT { return span(first, count); } #endif // !defined(FLATBUFFERS_SPAN_MINIMAL) } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_STL_EMULATION_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/string.h000066400000000000000000000041131474174441300240510ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_STRING_H_ #define FLATBUFFERS_STRING_H_ #include "flatbuffers/base.h" #include "flatbuffers/vector.h" namespace mapserver { namespace flatbuffers { struct String : public Vector { const char *c_str() const { return reinterpret_cast(Data()); } std::string str() const { return std::string(c_str(), size()); } // clang-format off #ifdef FLATBUFFERS_HAS_STRING_VIEW flatbuffers::string_view string_view() const { return flatbuffers::string_view(c_str(), size()); } #endif // FLATBUFFERS_HAS_STRING_VIEW // clang-format on bool operator<(const String &o) const { return StringLessThan(this->data(), this->size(), o.data(), o.size()); } }; // Convenience function to get std::string from a String returning an empty // string on null pointer. static inline std::string GetString(const String *str) { return str ? str->str() : ""; } // Convenience function to get char* from a String returning an empty string on // null pointer. static inline const char *GetCstring(const String *str) { return str ? str->c_str() : ""; } #ifdef FLATBUFFERS_HAS_STRING_VIEW // Convenience function to get string_view from a String returning an empty // string_view on null pointer. static inline flatbuffers::string_view GetStringView(const String *str) { return str ? str->string_view() : flatbuffers::string_view(); } #endif // FLATBUFFERS_HAS_STRING_VIEW } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_STRING_H_mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/struct.h000066400000000000000000000031301474174441300240650ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_STRUCT_H_ #define FLATBUFFERS_STRUCT_H_ #include "flatbuffers/base.h" namespace mapserver { namespace flatbuffers { // "structs" are flat structures that do not have an offset table, thus // always have all members present and do not support forwards/backwards // compatible extensions. class Struct FLATBUFFERS_FINAL_CLASS { public: template T GetField(uoffset_t o) const { return ReadScalar(&data_[o]); } template T GetStruct(uoffset_t o) const { return reinterpret_cast(&data_[o]); } const uint8_t *GetAddressOf(uoffset_t o) const { return &data_[o]; } uint8_t *GetAddressOf(uoffset_t o) { return &data_[o]; } private: // private constructor & copy constructor: you obtain instances of this // class by pointing to existing data only Struct(); Struct(const Struct &); Struct &operator=(const Struct &); uint8_t data_[1]; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_STRUCT_H_mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/table.h000066400000000000000000000137451474174441300236450ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_TABLE_H_ #define FLATBUFFERS_TABLE_H_ #include "flatbuffers/base.h" #include "flatbuffers/verifier.h" namespace mapserver { namespace flatbuffers { // "tables" use an offset table (possibly shared) that allows fields to be // omitted and added at will, but uses an extra indirection to read. class Table { public: const uint8_t *GetVTable() const { return data_ - ReadScalar(data_); } // This gets the field offset for any of the functions below it, or 0 // if the field was not present. voffset_t GetOptionalFieldOffset(voffset_t field) const { // The vtable offset is always at the start. auto vtable = GetVTable(); // The first element is the size of the vtable (fields + type id + itself). auto vtsize = ReadScalar(vtable); // If the field we're accessing is outside the vtable, we're reading older // data, so it's the same as if the offset was 0 (not present). return field < vtsize ? ReadScalar(vtable + field) : 0; } template T GetField(voffset_t field, T defaultval) const { auto field_offset = GetOptionalFieldOffset(field); return field_offset ? ReadScalar(data_ + field_offset) : defaultval; } template P GetPointer(voffset_t field) { auto field_offset = GetOptionalFieldOffset(field); auto p = data_ + field_offset; return field_offset ? reinterpret_cast

(p + ReadScalar(p)) : nullptr; } template P GetPointer(voffset_t field) const { return const_cast

(this)->GetPointer

(field); } template P GetStruct(voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); auto p = const_cast(data_ + field_offset); return field_offset ? reinterpret_cast

(p) : nullptr; } template flatbuffers::Optional GetOptional(voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); auto p = data_ + field_offset; return field_offset ? Optional(static_cast(ReadScalar(p))) : Optional(); } template bool SetField(voffset_t field, T val, T def) { auto field_offset = GetOptionalFieldOffset(field); if (!field_offset) return IsTheSameAs(val, def); WriteScalar(data_ + field_offset, val); return true; } template bool SetField(voffset_t field, T val) { auto field_offset = GetOptionalFieldOffset(field); if (!field_offset) return false; WriteScalar(data_ + field_offset, val); return true; } bool SetPointer(voffset_t field, const uint8_t *val) { auto field_offset = GetOptionalFieldOffset(field); if (!field_offset) return false; WriteScalar(data_ + field_offset, static_cast(val - (data_ + field_offset))); return true; } uint8_t *GetAddressOf(voffset_t field) { auto field_offset = GetOptionalFieldOffset(field); return field_offset ? data_ + field_offset : nullptr; } const uint8_t *GetAddressOf(voffset_t field) const { return const_cast

(this)->GetAddressOf(field); } bool CheckField(voffset_t field) const { return GetOptionalFieldOffset(field) != 0; } // Verify the vtable of this table. // Call this once per table, followed by VerifyField once per field. bool VerifyTableStart(Verifier &verifier) const { return verifier.VerifyTableStart(data_); } // Verify a particular field. template bool VerifyField(const Verifier &verifier, voffset_t field, size_t align) const { // Calling GetOptionalFieldOffset should be safe now thanks to // VerifyTable(). auto field_offset = GetOptionalFieldOffset(field); // Check the actual field. return !field_offset || verifier.VerifyField(data_, field_offset, align); } // VerifyField for required fields. template bool VerifyFieldRequired(const Verifier &verifier, voffset_t field, size_t align) const { auto field_offset = GetOptionalFieldOffset(field); return verifier.Check(field_offset != 0) && verifier.VerifyField(data_, field_offset, align); } // Versions for offsets. bool VerifyOffset(const Verifier &verifier, voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); return !field_offset || verifier.VerifyOffset(data_, field_offset); } bool VerifyOffsetRequired(const Verifier &verifier, voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); return verifier.Check(field_offset != 0) && verifier.VerifyOffset(data_, field_offset); } private: // private constructor & copy constructor: you obtain instances of this // class by pointing to existing data only Table(); Table(const Table &other); Table &operator=(const Table &); uint8_t data_[1]; }; // This specialization allows avoiding warnings like: // MSVC C4800: type: forcing value to bool 'true' or 'false'. template<> inline flatbuffers::Optional Table::GetOptional( voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); auto p = data_ + field_offset; return field_offset ? Optional(ReadScalar(p) != 0) : Optional(); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_TABLE_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/util.h000066400000000000000000000625361474174441300235350ustar00rootroot00000000000000/* * Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_UTIL_H_ #define FLATBUFFERS_UTIL_H_ #include #include #include "flatbuffers/base.h" #include "flatbuffers/stl_emulation.h" #ifndef FLATBUFFERS_PREFER_PRINTF # include # include #else // FLATBUFFERS_PREFER_PRINTF # include # include #endif // FLATBUFFERS_PREFER_PRINTF #include namespace mapserver { namespace flatbuffers { // @locale-independent functions for ASCII characters set. // Fast checking that character lies in closed range: [a <= x <= b] // using one compare (conditional branch) operator. inline bool check_ascii_range(char x, char a, char b) { FLATBUFFERS_ASSERT(a <= b); // (Hacker's Delight): `a <= x <= b` <=> `(x-a) <={u} (b-a)`. // The x, a, b will be promoted to int and subtracted without overflow. return static_cast(x - a) <= static_cast(b - a); } // Case-insensitive isalpha inline bool is_alpha(char c) { // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF). return check_ascii_range(c & 0xDF, 'a' & 0xDF, 'z' & 0xDF); } // Check for uppercase alpha inline bool is_alpha_upper(char c) { return check_ascii_range(c, 'A', 'Z'); } // Check (case-insensitive) that `c` is equal to alpha. inline bool is_alpha_char(char c, char alpha) { FLATBUFFERS_ASSERT(is_alpha(alpha)); // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF). return ((c & 0xDF) == (alpha & 0xDF)); } // https://en.cppreference.com/w/cpp/string/byte/isxdigit // isdigit and isxdigit are the only standard narrow character classification // functions that are not affected by the currently installed C locale. although // some implementations (e.g. Microsoft in 1252 codepage) may classify // additional single-byte characters as digits. inline bool is_digit(char c) { return check_ascii_range(c, '0', '9'); } inline bool is_xdigit(char c) { // Replace by look-up table. return is_digit(c) || check_ascii_range(c & 0xDF, 'a' & 0xDF, 'f' & 0xDF); } // Case-insensitive isalnum inline bool is_alnum(char c) { return is_alpha(c) || is_digit(c); } inline char CharToUpper(char c) { return static_cast(::toupper(static_cast(c))); } inline char CharToLower(char c) { return static_cast(::tolower(static_cast(c))); } // @end-locale-independent functions for ASCII character set #ifdef FLATBUFFERS_PREFER_PRINTF template size_t IntToDigitCount(T t) { size_t digit_count = 0; // Count the sign for negative numbers if (t < 0) digit_count++; // Count a single 0 left of the dot for fractional numbers if (-1 < t && t < 1) digit_count++; // Count digits until fractional part T eps = std::numeric_limits::epsilon(); while (t <= (-1 + eps) || (1 - eps) <= t) { t /= 10; digit_count++; } return digit_count; } template size_t NumToStringWidth(T t, int precision = 0) { size_t string_width = IntToDigitCount(t); // Count the dot for floating point numbers if (precision) string_width += (precision + 1); return string_width; } template std::string NumToStringImplWrapper(T t, const char *fmt, int precision = 0) { size_t string_width = NumToStringWidth(t, precision); std::string s(string_width, 0x00); // Allow snprintf to use std::string trailing null to detect buffer overflow snprintf(const_cast(s.data()), (s.size() + 1), fmt, string_width, t); return s; } #endif // FLATBUFFERS_PREFER_PRINTF // Convert an integer or floating point value to a string. // In contrast to std::stringstream, "char" values are // converted to a string of digits, and we don't use scientific notation. template std::string NumToString(T t) { // clang-format off #ifndef FLATBUFFERS_PREFER_PRINTF std::stringstream ss; ss << t; return ss.str(); #else // FLATBUFFERS_PREFER_PRINTF auto v = static_cast(t); return NumToStringImplWrapper(v, "%.*lld"); #endif // FLATBUFFERS_PREFER_PRINTF // clang-format on } // Avoid char types used as character data. template<> inline std::string NumToString(signed char t) { return NumToString(static_cast(t)); } template<> inline std::string NumToString(unsigned char t) { return NumToString(static_cast(t)); } template<> inline std::string NumToString(char t) { return NumToString(static_cast(t)); } // Special versions for floats/doubles. template std::string FloatToString(T t, int precision) { // clang-format off #ifndef FLATBUFFERS_PREFER_PRINTF // to_string() prints different numbers of digits for floats depending on // platform and isn't available on Android, so we use stringstream std::stringstream ss; // Use std::fixed to suppress scientific notation. ss << std::fixed; // Default precision is 6, we want that to be higher for doubles. ss << std::setprecision(precision); ss << t; auto s = ss.str(); #else // FLATBUFFERS_PREFER_PRINTF auto v = static_cast(t); auto s = NumToStringImplWrapper(v, "%0.*f", precision); #endif // FLATBUFFERS_PREFER_PRINTF // clang-format on // Sadly, std::fixed turns "1" into "1.00000", so here we undo that. auto p = s.find_last_not_of('0'); if (p != std::string::npos) { // Strip trailing zeroes. If it is a whole number, keep one zero. s.resize(p + (s[p] == '.' ? 2 : 1)); } return s; } template<> inline std::string NumToString(double t) { return FloatToString(t, 12); } template<> inline std::string NumToString(float t) { return FloatToString(t, 6); } // Convert an integer value to a hexadecimal string. // The returned string length is always xdigits long, prefixed by 0 digits. // For example, IntToStringHex(0x23, 8) returns the string "00000023". inline std::string IntToStringHex(int i, int xdigits) { FLATBUFFERS_ASSERT(i >= 0); // clang-format off #ifndef FLATBUFFERS_PREFER_PRINTF std::stringstream ss; ss << std::setw(xdigits) << std::setfill('0') << std::hex << std::uppercase << i; return ss.str(); #else // FLATBUFFERS_PREFER_PRINTF return NumToStringImplWrapper(i, "%.*X", xdigits); #endif // FLATBUFFERS_PREFER_PRINTF // clang-format on } // clang-format off // Use locale independent functions {strtod_l, strtof_l, strtoll_l, strtoull_l}. #if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && (FLATBUFFERS_LOCALE_INDEPENDENT > 0) class ClassicLocale { #ifdef _MSC_VER typedef _locale_t locale_type; #else typedef locale_t locale_type; // POSIX.1-2008 locale_t type #endif ClassicLocale(); ~ClassicLocale(); locale_type locale_; static ClassicLocale instance_; public: static locale_type Get() { return instance_.locale_; } }; #ifdef _MSC_VER #define __strtoull_impl(s, pe, b) _strtoui64_l(s, pe, b, ClassicLocale::Get()) #define __strtoll_impl(s, pe, b) _strtoi64_l(s, pe, b, ClassicLocale::Get()) #define __strtod_impl(s, pe) _strtod_l(s, pe, ClassicLocale::Get()) #define __strtof_impl(s, pe) _strtof_l(s, pe, ClassicLocale::Get()) #else #define __strtoull_impl(s, pe, b) strtoull_l(s, pe, b, ClassicLocale::Get()) #define __strtoll_impl(s, pe, b) strtoll_l(s, pe, b, ClassicLocale::Get()) #define __strtod_impl(s, pe) strtod_l(s, pe, ClassicLocale::Get()) #define __strtof_impl(s, pe) strtof_l(s, pe, ClassicLocale::Get()) #endif #else #define __strtod_impl(s, pe) strtod(s, pe) #define __strtof_impl(s, pe) static_cast(strtod(s, pe)) #ifdef _MSC_VER #define __strtoull_impl(s, pe, b) _strtoui64(s, pe, b) #define __strtoll_impl(s, pe, b) _strtoi64(s, pe, b) #else #define __strtoull_impl(s, pe, b) strtoull(s, pe, b) #define __strtoll_impl(s, pe, b) strtoll(s, pe, b) #endif #endif inline void strtoval_impl(int64_t *val, const char *str, char **endptr, int base) { *val = __strtoll_impl(str, endptr, base); } inline void strtoval_impl(uint64_t *val, const char *str, char **endptr, int base) { *val = __strtoull_impl(str, endptr, base); } inline void strtoval_impl(double *val, const char *str, char **endptr) { *val = __strtod_impl(str, endptr); } // UBSAN: double to float is safe if numeric_limits::is_iec559 is true. __supress_ubsan__("float-cast-overflow") inline void strtoval_impl(float *val, const char *str, char **endptr) { *val = __strtof_impl(str, endptr); } #undef __strtoull_impl #undef __strtoll_impl #undef __strtod_impl #undef __strtof_impl // clang-format on // Adaptor for strtoull()/strtoll(). // Flatbuffers accepts numbers with any count of leading zeros (-009 is -9), // while strtoll with base=0 interprets first leading zero as octal prefix. // In future, it is possible to add prefixed 0b0101. // 1) Checks errno code for overflow condition (out of range). // 2) If base <= 0, function try to detect base of number by prefix. // // Return value (like strtoull and strtoll, but reject partial result): // - If successful, an integer value corresponding to the str is returned. // - If full string conversion can't be performed, 0 is returned. // - If the converted value falls out of range of corresponding return type, a // range error occurs. In this case value MAX(T)/MIN(T) is returned. template inline bool StringToIntegerImpl(T *val, const char *const str, const int base = 0, const bool check_errno = true) { // T is int64_t or uint64_T FLATBUFFERS_ASSERT(str); if (base <= 0) { auto s = str; while (*s && !is_digit(*s)) s++; if (s[0] == '0' && is_alpha_char(s[1], 'X')) return StringToIntegerImpl(val, str, 16, check_errno); // if a prefix not match, try base=10 return StringToIntegerImpl(val, str, 10, check_errno); } else { if (check_errno) errno = 0; // clear thread-local errno auto endptr = str; strtoval_impl(val, str, const_cast(&endptr), base); if ((*endptr != '\0') || (endptr == str)) { *val = 0; // erase partial result return false; // invalid string } // errno is out-of-range, return MAX/MIN if (check_errno && errno) return false; return true; } } template inline bool StringToFloatImpl(T *val, const char *const str) { // Type T must be either float or double. FLATBUFFERS_ASSERT(str && val); auto end = str; strtoval_impl(val, str, const_cast(&end)); auto done = (end != str) && (*end == '\0'); if (!done) *val = 0; // erase partial result return done; } // Convert a string to an instance of T. // Return value (matched with StringToInteger64Impl and strtod): // - If successful, a numeric value corresponding to the str is returned. // - If full string conversion can't be performed, 0 is returned. // - If the converted value falls out of range of corresponding return type, a // range error occurs. In this case value MAX(T)/MIN(T) is returned. template inline bool StringToNumber(const char *s, T *val) { // Assert on `unsigned long` and `signed long` on LP64. // If it is necessary, it could be solved with flatbuffers::enable_if. static_assert(sizeof(T) < sizeof(int64_t), "unexpected type T"); FLATBUFFERS_ASSERT(s && val); int64_t i64; // The errno check isn't needed, will return MAX/MIN on overflow. if (StringToIntegerImpl(&i64, s, 0, false)) { const int64_t max = (flatbuffers::numeric_limits::max)(); const int64_t min = flatbuffers::numeric_limits::lowest(); if (i64 > max) { *val = static_cast(max); return false; } if (i64 < min) { // For unsigned types return max to distinguish from // "no conversion can be performed" when 0 is returned. *val = static_cast(flatbuffers::is_unsigned::value ? max : min); return false; } *val = static_cast(i64); return true; } *val = 0; return false; } template<> inline bool StringToNumber(const char *str, int64_t *val) { return StringToIntegerImpl(val, str); } template<> inline bool StringToNumber(const char *str, uint64_t *val) { if (!StringToIntegerImpl(val, str)) return false; // The strtoull accepts negative numbers: // If the minus sign was part of the input sequence, the numeric value // calculated from the sequence of digits is negated as if by unary minus // in the result type, which applies unsigned integer wraparound rules. // Fix this behavior (except -0). if (*val) { auto s = str; while (*s && !is_digit(*s)) s++; s = (s > str) ? (s - 1) : s; // step back to one symbol if (*s == '-') { // For unsigned types return the max to distinguish from // "no conversion can be performed". *val = (flatbuffers::numeric_limits::max)(); return false; } } return true; } template<> inline bool StringToNumber(const char *s, float *val) { return StringToFloatImpl(val, s); } template<> inline bool StringToNumber(const char *s, double *val) { return StringToFloatImpl(val, s); } inline int64_t StringToInt(const char *s, int base = 10) { int64_t val; return StringToIntegerImpl(&val, s, base) ? val : 0; } inline uint64_t StringToUInt(const char *s, int base = 10) { uint64_t val; return StringToIntegerImpl(&val, s, base) ? val : 0; } typedef bool (*LoadFileFunction)(const char *filename, bool binary, std::string *dest); typedef bool (*FileExistsFunction)(const char *filename); LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function); FileExistsFunction SetFileExistsFunction( FileExistsFunction file_exists_function); // Check if file "name" exists. bool FileExists(const char *name); // Check if "name" exists and it is also a directory. bool DirExists(const char *name); // Load file "name" into "buf" returning true if successful // false otherwise. If "binary" is false data is read // using ifstream's text mode, otherwise data is read with // no transcoding. bool LoadFile(const char *name, bool binary, std::string *buf); // Save data "buf" of length "len" bytes into a file // "name" returning true if successful, false otherwise. // If "binary" is false data is written using ifstream's // text mode, otherwise data is written with no // transcoding. bool SaveFile(const char *name, const char *buf, size_t len, bool binary); // Save data "buf" into file "name" returning true if // successful, false otherwise. If "binary" is false // data is written using ifstream's text mode, otherwise // data is written with no transcoding. inline bool SaveFile(const char *name, const std::string &buf, bool binary) { return SaveFile(name, buf.c_str(), buf.size(), binary); } // Functionality for minimalistic portable path handling. // The functions below behave correctly regardless of whether posix ('/') or // Windows ('/' or '\\') separators are used. // Any new separators inserted are always posix. FLATBUFFERS_CONSTEXPR char kPathSeparator = '/'; // Returns the path with the extension, if any, removed. std::string StripExtension(const std::string &filepath); // Returns the extension, if any. std::string GetExtension(const std::string &filepath); // Return the last component of the path, after the last separator. std::string StripPath(const std::string &filepath); // Strip the last component of the path + separator. std::string StripFileName(const std::string &filepath); // Concatenates a path with a filename, regardless of whether the path // ends in a separator or not. std::string ConCatPathFileName(const std::string &path, const std::string &filename); // Replaces any '\\' separators with '/' std::string PosixPath(const char *path); std::string PosixPath(const std::string &path); // This function ensure a directory exists, by recursively // creating dirs for any parts of the path that don't exist yet. void EnsureDirExists(const std::string &filepath); // Obtains the absolute path from any other path. // Returns the input path if the absolute path couldn't be resolved. std::string AbsolutePath(const std::string &filepath); // Returns files relative to the --project_root path, prefixed with `//`. std::string RelativeToRootPath(const std::string &project, const std::string &filepath); // To and from UTF-8 unicode conversion functions // Convert a unicode code point into a UTF-8 representation by appending it // to a string. Returns the number of bytes generated. inline int ToUTF8(uint32_t ucc, std::string *out) { FLATBUFFERS_ASSERT(!(ucc & 0x80000000)); // Top bit can't be set. // 6 possible encodings: http://en.wikipedia.org/wiki/UTF-8 for (int i = 0; i < 6; i++) { // Max bits this encoding can represent. uint32_t max_bits = 6 + i * 5 + static_cast(!i); if (ucc < (1u << max_bits)) { // does it fit? // Remaining bits not encoded in the first byte, store 6 bits each uint32_t remain_bits = i * 6; // Store first byte: (*out) += static_cast((0xFE << (max_bits - remain_bits)) | (ucc >> remain_bits)); // Store remaining bytes: for (int j = i - 1; j >= 0; j--) { (*out) += static_cast(((ucc >> (j * 6)) & 0x3F) | 0x80); } return i + 1; // Return the number of bytes added. } } FLATBUFFERS_ASSERT(0); // Impossible to arrive here. return -1; } // Converts whatever prefix of the incoming string corresponds to a valid // UTF-8 sequence into a unicode code. The incoming pointer will have been // advanced past all bytes parsed. // returns -1 upon corrupt UTF-8 encoding (ignore the incoming pointer in // this case). inline int FromUTF8(const char **in) { int len = 0; // Count leading 1 bits. for (int mask = 0x80; mask >= 0x04; mask >>= 1) { if (**in & mask) { len++; } else { break; } } if ((static_cast(**in) << len) & 0x80) return -1; // Bit after leading 1's must be 0. if (!len) return *(*in)++; // UTF-8 encoded values with a length are between 2 and 4 bytes. if (len < 2 || len > 4) { return -1; } // Grab initial bits of the code. int ucc = *(*in)++ & ((1 << (7 - len)) - 1); for (int i = 0; i < len - 1; i++) { if ((**in & 0xC0) != 0x80) return -1; // Upper bits must 1 0. ucc <<= 6; ucc |= *(*in)++ & 0x3F; // Grab 6 more bits of the code. } // UTF-8 cannot encode values between 0xD800 and 0xDFFF (reserved for // UTF-16 surrogate pairs). if (ucc >= 0xD800 && ucc <= 0xDFFF) { return -1; } // UTF-8 must represent code points in their shortest possible encoding. switch (len) { case 2: // Two bytes of UTF-8 can represent code points from U+0080 to U+07FF. if (ucc < 0x0080 || ucc > 0x07FF) { return -1; } break; case 3: // Three bytes of UTF-8 can represent code points from U+0800 to U+FFFF. if (ucc < 0x0800 || ucc > 0xFFFF) { return -1; } break; case 4: // Four bytes of UTF-8 can represent code points from U+10000 to U+10FFFF. if (ucc < 0x10000 || ucc > 0x10FFFF) { return -1; } break; } return ucc; } #ifndef FLATBUFFERS_PREFER_PRINTF // Wraps a string to a maximum length, inserting new lines where necessary. Any // existing whitespace will be collapsed down to a single space. A prefix or // suffix can be provided, which will be inserted before or after a wrapped // line, respectively. inline std::string WordWrap(const std::string in, size_t max_length, const std::string wrapped_line_prefix, const std::string wrapped_line_suffix) { std::istringstream in_stream(in); std::string wrapped, line, word; in_stream >> word; line = word; while (in_stream >> word) { if ((line.length() + 1 + word.length() + wrapped_line_suffix.length()) < max_length) { line += " " + word; } else { wrapped += line + wrapped_line_suffix + "\n"; line = wrapped_line_prefix + word; } } wrapped += line; return wrapped; } #endif // !FLATBUFFERS_PREFER_PRINTF inline bool EscapeString(const char *s, size_t length, std::string *_text, bool allow_non_utf8, bool natural_utf8) { std::string &text = *_text; text += "\""; for (uoffset_t i = 0; i < length; i++) { char c = s[i]; switch (c) { case '\n': text += "\\n"; break; case '\t': text += "\\t"; break; case '\r': text += "\\r"; break; case '\b': text += "\\b"; break; case '\f': text += "\\f"; break; case '\"': text += "\\\""; break; case '\\': text += "\\\\"; break; default: if (c >= ' ' && c <= '~') { text += c; } else { // Not printable ASCII data. Let's see if it's valid UTF-8 first: const char *utf8 = s + i; int ucc = FromUTF8(&utf8); if (ucc < 0) { if (allow_non_utf8) { text += "\\x"; text += IntToStringHex(static_cast(c), 2); } else { // There are two cases here: // // 1) We reached here by parsing an IDL file. In that case, // we previously checked for non-UTF-8, so we shouldn't reach // here. // // 2) We reached here by someone calling GenerateText() // on a previously-serialized flatbuffer. The data might have // non-UTF-8 Strings, or might be corrupt. // // In both cases, we have to give up and inform the caller // they have no JSON. return false; } } else { if (natural_utf8) { // utf8 points to past all utf-8 bytes parsed text.append(s + i, static_cast(utf8 - s - i)); } else if (ucc <= 0xFFFF) { // Parses as Unicode within JSON's \uXXXX range, so use that. text += "\\u"; text += IntToStringHex(ucc, 4); } else if (ucc <= 0x10FFFF) { // Encode Unicode SMP values to a surrogate pair using two \u // escapes. uint32_t base = ucc - 0x10000; auto high_surrogate = (base >> 10) + 0xD800; auto low_surrogate = (base & 0x03FF) + 0xDC00; text += "\\u"; text += IntToStringHex(high_surrogate, 4); text += "\\u"; text += IntToStringHex(low_surrogate, 4); } // Skip past characters recognized. i = static_cast(utf8 - s - 1); } } break; } } text += "\""; return true; } inline std::string BufferToHexText(const void *buffer, size_t buffer_size, size_t max_length, const std::string &wrapped_line_prefix, const std::string &wrapped_line_suffix) { std::string text = wrapped_line_prefix; size_t start_offset = 0; const char *s = reinterpret_cast(buffer); for (size_t i = 0; s && i < buffer_size; i++) { // Last iteration or do we have more? bool have_more = i + 1 < buffer_size; text += "0x"; text += IntToStringHex(static_cast(s[i]), 2); if (have_more) { text += ','; } // If we have more to process and we reached max_length if (have_more && text.size() + wrapped_line_suffix.size() >= start_offset + max_length) { text += wrapped_line_suffix; text += '\n'; start_offset = text.size(); text += wrapped_line_prefix; } } text += wrapped_line_suffix; return text; } // Remove paired quotes in a string: "text"|'text' -> text. std::string RemoveStringQuotes(const std::string &s); // Change th global C-locale to locale with name . // Returns an actual locale name in <_value>, useful if locale_name is "" or // null. bool SetGlobalTestLocale(const char *locale_name, std::string *_value = nullptr); // Read (or test) a value of environment variable. bool ReadEnvironmentVariable(const char *var_name, std::string *_value = nullptr); // MSVC specific: Send all assert reports to STDOUT to prevent CI hangs. void SetupDefaultCRTReportMode(); enum class Case { kUnknown = 0, // TheQuickBrownFox kUpperCamel = 1, // theQuickBrownFox kLowerCamel = 2, // the_quick_brown_fox kSnake = 3, // THE_QUICK_BROWN_FOX kScreamingSnake = 4, // THEQUICKBROWNFOX kAllUpper = 5, // thequickbrownfox kAllLower = 6, // the-quick-brown-fox kDasher = 7, // THEQuiCKBr_ownFox (or whatever you want, we won't change it) kKeep = 8, // the_quick_brown_fox123 (as opposed to the_quick_brown_fox_123) kSnake2 = 9, }; // Convert the `input` string of case `input_case` to the specified `output_case`. std::string ConvertCase(const std::string &input, Case output_case, Case input_case = Case::kSnake); } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_UTIL_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/vector.h000066400000000000000000000277351474174441300240640ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_VECTOR_H_ #define FLATBUFFERS_VECTOR_H_ #include "flatbuffers/base.h" #include "flatbuffers/buffer.h" #include "flatbuffers/stl_emulation.h" namespace mapserver { namespace flatbuffers { struct String; // An STL compatible iterator implementation for Vector below, effectively // calling Get() for every element. template struct VectorIterator { typedef std::random_access_iterator_tag iterator_category; typedef IT value_type; typedef ptrdiff_t difference_type; typedef IT *pointer; typedef IT &reference; VectorIterator(const uint8_t *data, uoffset_t i) : data_(data + IndirectHelper::element_stride * i) {} VectorIterator(const VectorIterator &other) : data_(other.data_) {} VectorIterator() : data_(nullptr) {} VectorIterator &operator=(const VectorIterator &other) { data_ = other.data_; return *this; } VectorIterator &operator=(VectorIterator &&other) { data_ = other.data_; return *this; } bool operator==(const VectorIterator &other) const { return data_ == other.data_; } bool operator<(const VectorIterator &other) const { return data_ < other.data_; } bool operator!=(const VectorIterator &other) const { return data_ != other.data_; } difference_type operator-(const VectorIterator &other) const { return (data_ - other.data_) / IndirectHelper::element_stride; } // Note: return type is incompatible with the standard // `reference operator*()`. IT operator*() const { return IndirectHelper::Read(data_, 0); } // Note: return type is incompatible with the standard // `pointer operator->()`. IT operator->() const { return IndirectHelper::Read(data_, 0); } VectorIterator &operator++() { data_ += IndirectHelper::element_stride; return *this; } VectorIterator operator++(int) { VectorIterator temp(data_, 0); data_ += IndirectHelper::element_stride; return temp; } VectorIterator operator+(const uoffset_t &offset) const { return VectorIterator(data_ + offset * IndirectHelper::element_stride, 0); } VectorIterator &operator+=(const uoffset_t &offset) { data_ += offset * IndirectHelper::element_stride; return *this; } VectorIterator &operator--() { data_ -= IndirectHelper::element_stride; return *this; } VectorIterator operator--(int) { VectorIterator temp(data_, 0); data_ -= IndirectHelper::element_stride; return temp; } VectorIterator operator-(const uoffset_t &offset) const { return VectorIterator(data_ - offset * IndirectHelper::element_stride, 0); } VectorIterator &operator-=(const uoffset_t &offset) { data_ -= offset * IndirectHelper::element_stride; return *this; } private: const uint8_t *data_; }; template struct VectorReverseIterator : public std::reverse_iterator { explicit VectorReverseIterator(Iterator iter) : std::reverse_iterator(iter) {} // Note: return type is incompatible with the standard // `reference operator*()`. typename Iterator::value_type operator*() const { auto tmp = std::reverse_iterator::current; return *--tmp; } // Note: return type is incompatible with the standard // `pointer operator->()`. typename Iterator::value_type operator->() const { auto tmp = std::reverse_iterator::current; return *--tmp; } }; // This is used as a helper type for accessing vectors. // Vector::data() assumes the vector elements start after the length field. template class Vector { public: typedef VectorIterator::mutable_return_type> iterator; typedef VectorIterator::return_type> const_iterator; typedef VectorReverseIterator reverse_iterator; typedef VectorReverseIterator const_reverse_iterator; typedef typename flatbuffers::bool_constant::value> scalar_tag; static FLATBUFFERS_CONSTEXPR bool is_span_observable = scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1); uoffset_t size() const { return EndianScalar(length_); } // Deprecated: use size(). Here for backwards compatibility. FLATBUFFERS_ATTRIBUTE([[deprecated("use size() instead")]]) uoffset_t Length() const { return size(); } typedef typename IndirectHelper::return_type return_type; typedef typename IndirectHelper::mutable_return_type mutable_return_type; typedef return_type value_type; return_type Get(uoffset_t i) const { FLATBUFFERS_ASSERT(i < size()); return IndirectHelper::Read(Data(), i); } return_type operator[](uoffset_t i) const { return Get(i); } // If this is a Vector of enums, T will be its storage type, not the enum // type. This function makes it convenient to retrieve value with enum // type E. template E GetEnum(uoffset_t i) const { return static_cast(Get(i)); } // If this a vector of unions, this does the cast for you. There's no check // to make sure this is the right type! template const U *GetAs(uoffset_t i) const { return reinterpret_cast(Get(i)); } // If this a vector of unions, this does the cast for you. There's no check // to make sure this is actually a string! const String *GetAsString(uoffset_t i) const { return reinterpret_cast(Get(i)); } const void *GetStructFromOffset(size_t o) const { return reinterpret_cast(Data() + o); } iterator begin() { return iterator(Data(), 0); } const_iterator begin() const { return const_iterator(Data(), 0); } iterator end() { return iterator(Data(), size()); } const_iterator end() const { return const_iterator(Data(), size()); } reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } const_iterator cbegin() const { return begin(); } const_iterator cend() const { return end(); } const_reverse_iterator crbegin() const { return rbegin(); } const_reverse_iterator crend() const { return rend(); } // Change elements if you have a non-const pointer to this object. // Scalars only. See reflection.h, and the documentation. void Mutate(uoffset_t i, const T &val) { FLATBUFFERS_ASSERT(i < size()); WriteScalar(data() + i, val); } // Change an element of a vector of tables (or strings). // "val" points to the new table/string, as you can obtain from // e.g. reflection::AddFlatBuffer(). void MutateOffset(uoffset_t i, const uint8_t *val) { FLATBUFFERS_ASSERT(i < size()); static_assert(sizeof(T) == sizeof(uoffset_t), "Unrelated types"); WriteScalar(data() + i, static_cast(val - (Data() + i * sizeof(uoffset_t)))); } // Get a mutable pointer to tables/strings inside this vector. mutable_return_type GetMutableObject(uoffset_t i) const { FLATBUFFERS_ASSERT(i < size()); return const_cast(IndirectHelper::Read(Data(), i)); } // The raw data in little endian format. Use with care. const uint8_t *Data() const { return reinterpret_cast(&length_ + 1); } uint8_t *Data() { return reinterpret_cast(&length_ + 1); } // Similarly, but typed, much like std::vector::data const T *data() const { return reinterpret_cast(Data()); } T *data() { return reinterpret_cast(Data()); } template return_type LookupByKey(K key) const { void *search_result = std::bsearch( &key, Data(), size(), IndirectHelper::element_stride, KeyCompare); if (!search_result) { return nullptr; // Key not found. } const uint8_t *element = reinterpret_cast(search_result); return IndirectHelper::Read(element, 0); } template mutable_return_type MutableLookupByKey(K key) { return const_cast(LookupByKey(key)); } protected: // This class is only used to access pre-existing data. Don't ever // try to construct these manually. Vector(); uoffset_t length_; private: // This class is a pointer. Copying will therefore create an invalid object. // Private and unimplemented copy constructor. Vector(const Vector &); Vector &operator=(const Vector &); template static int KeyCompare(const void *ap, const void *bp) { const K *key = reinterpret_cast(ap); const uint8_t *data = reinterpret_cast(bp); auto table = IndirectHelper::Read(data, 0); // std::bsearch compares with the operands transposed, so we negate the // result here. return -table->KeyCompareWithValue(*key); } }; template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(Vector &vec) FLATBUFFERS_NOEXCEPT { static_assert(Vector::is_span_observable, "wrong type U, only LE-scalar, or byte types are allowed"); return span(vec.data(), vec.size()); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span( const Vector &vec) FLATBUFFERS_NOEXCEPT { static_assert(Vector::is_span_observable, "wrong type U, only LE-scalar, or byte types are allowed"); return span(vec.data(), vec.size()); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_bytes_span( Vector &vec) FLATBUFFERS_NOEXCEPT { static_assert(Vector::scalar_tag::value, "wrong type U, only LE-scalar, or byte types are allowed"); return span(vec.Data(), vec.size() * sizeof(U)); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_bytes_span( const Vector &vec) FLATBUFFERS_NOEXCEPT { static_assert(Vector::scalar_tag::value, "wrong type U, only LE-scalar, or byte types are allowed"); return span(vec.Data(), vec.size() * sizeof(U)); } // Represent a vector much like the template above, but in this case we // don't know what the element types are (used with reflection.h). class VectorOfAny { public: uoffset_t size() const { return EndianScalar(length_); } const uint8_t *Data() const { return reinterpret_cast(&length_ + 1); } uint8_t *Data() { return reinterpret_cast(&length_ + 1); } protected: VectorOfAny(); uoffset_t length_; private: VectorOfAny(const VectorOfAny &); VectorOfAny &operator=(const VectorOfAny &); }; template Vector> *VectorCast(Vector> *ptr) { static_assert(std::is_base_of::value, "Unrelated types"); return reinterpret_cast> *>(ptr); } template const Vector> *VectorCast(const Vector> *ptr) { static_assert(std::is_base_of::value, "Unrelated types"); return reinterpret_cast> *>(ptr); } // Convenient helper function to get the length of any vector, regardless // of whether it is null or not (the field is not set). template static inline size_t VectorLength(const Vector *v) { return v ? v->size() : 0; } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_VERIFIER_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/vector_downward.h000066400000000000000000000176251474174441300257660ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_VECTOR_DOWNWARD_H_ #define FLATBUFFERS_VECTOR_DOWNWARD_H_ #include "flatbuffers/base.h" #include "flatbuffers/default_allocator.h" #include "flatbuffers/detached_buffer.h" namespace mapserver { namespace flatbuffers { // This is a minimal replication of std::vector functionality, // except growing from higher to lower addresses. i.e push_back() inserts data // in the lowest address in the vector. // Since this vector leaves the lower part unused, we support a "scratch-pad" // that can be stored there for temporary data, to share the allocated space. // Essentially, this supports 2 std::vectors in a single buffer. class vector_downward { public: explicit vector_downward(size_t initial_size, Allocator *allocator, bool own_allocator, size_t buffer_minalign) : allocator_(allocator), own_allocator_(own_allocator), initial_size_(initial_size), buffer_minalign_(buffer_minalign), reserved_(0), size_(0), buf_(nullptr), cur_(nullptr), scratch_(nullptr) {} vector_downward(vector_downward &&other) // clang-format on : allocator_(other.allocator_), own_allocator_(other.own_allocator_), initial_size_(other.initial_size_), buffer_minalign_(other.buffer_minalign_), reserved_(other.reserved_), size_(other.size_), buf_(other.buf_), cur_(other.cur_), scratch_(other.scratch_) { // No change in other.allocator_ // No change in other.initial_size_ // No change in other.buffer_minalign_ other.own_allocator_ = false; other.reserved_ = 0; other.buf_ = nullptr; other.cur_ = nullptr; other.scratch_ = nullptr; } vector_downward &operator=(vector_downward &&other) { // Move construct a temporary and swap idiom vector_downward temp(std::move(other)); swap(temp); return *this; } ~vector_downward() { clear_buffer(); clear_allocator(); } void reset() { clear_buffer(); clear(); } void clear() { if (buf_) { cur_ = buf_ + reserved_; } else { reserved_ = 0; cur_ = nullptr; } size_ = 0; clear_scratch(); } void clear_scratch() { scratch_ = buf_; } void clear_allocator() { if (own_allocator_ && allocator_) { delete allocator_; } allocator_ = nullptr; own_allocator_ = false; } void clear_buffer() { if (buf_) Deallocate(allocator_, buf_, reserved_); buf_ = nullptr; } // Relinquish the pointer to the caller. uint8_t *release_raw(size_t &allocated_bytes, size_t &offset) { auto *buf = buf_; allocated_bytes = reserved_; offset = static_cast(cur_ - buf_); // release_raw only relinquishes the buffer ownership. // Does not deallocate or reset the allocator. Destructor will do that. buf_ = nullptr; clear(); return buf; } // Relinquish the pointer to the caller. DetachedBuffer release() { // allocator ownership (if any) is transferred to DetachedBuffer. DetachedBuffer fb(allocator_, own_allocator_, buf_, reserved_, cur_, size()); if (own_allocator_) { allocator_ = nullptr; own_allocator_ = false; } buf_ = nullptr; clear(); return fb; } size_t ensure_space(size_t len) { FLATBUFFERS_ASSERT(cur_ >= scratch_ && scratch_ >= buf_); if (len > static_cast(cur_ - scratch_)) { reallocate(len); } // Beyond this, signed offsets may not have enough range: // (FlatBuffers > 2GB not supported). FLATBUFFERS_ASSERT(size() < FLATBUFFERS_MAX_BUFFER_SIZE); return len; } inline uint8_t *make_space(size_t len) { if (len) { ensure_space(len); cur_ -= len; size_ += static_cast(len); } return cur_; } // Returns nullptr if using the DefaultAllocator. Allocator *get_custom_allocator() { return allocator_; } inline uoffset_t size() const { return size_; } uoffset_t scratch_size() const { return static_cast(scratch_ - buf_); } size_t capacity() const { return reserved_; } uint8_t *data() const { FLATBUFFERS_ASSERT(cur_); return cur_; } uint8_t *scratch_data() const { FLATBUFFERS_ASSERT(buf_); return buf_; } uint8_t *scratch_end() const { FLATBUFFERS_ASSERT(scratch_); return scratch_; } uint8_t *data_at(size_t offset) const { return buf_ + reserved_ - offset; } void push(const uint8_t *bytes, size_t num) { if (num > 0) { memcpy(make_space(num), bytes, num); } } // Specialized version of push() that avoids memcpy call for small data. template void push_small(const T &little_endian_t) { make_space(sizeof(T)); *reinterpret_cast(cur_) = little_endian_t; } template void scratch_push_small(const T &t) { ensure_space(sizeof(T)); *reinterpret_cast(scratch_) = t; scratch_ += sizeof(T); } // fill() is most frequently called with small byte counts (<= 4), // which is why we're using loops rather than calling memset. void fill(size_t zero_pad_bytes) { make_space(zero_pad_bytes); for (size_t i = 0; i < zero_pad_bytes; i++) cur_[i] = 0; } // Version for when we know the size is larger. // Precondition: zero_pad_bytes > 0 void fill_big(size_t zero_pad_bytes) { memset(make_space(zero_pad_bytes), 0, zero_pad_bytes); } void pop(size_t bytes_to_remove) { cur_ += bytes_to_remove; size_ -= static_cast(bytes_to_remove); } void scratch_pop(size_t bytes_to_remove) { scratch_ -= bytes_to_remove; } void swap(vector_downward &other) { using std::swap; swap(allocator_, other.allocator_); swap(own_allocator_, other.own_allocator_); swap(initial_size_, other.initial_size_); swap(buffer_minalign_, other.buffer_minalign_); swap(reserved_, other.reserved_); swap(size_, other.size_); swap(buf_, other.buf_); swap(cur_, other.cur_); swap(scratch_, other.scratch_); } void swap_allocator(vector_downward &other) { using std::swap; swap(allocator_, other.allocator_); swap(own_allocator_, other.own_allocator_); } private: // You shouldn't really be copying instances of this class. FLATBUFFERS_DELETE_FUNC(vector_downward(const vector_downward &)); FLATBUFFERS_DELETE_FUNC(vector_downward &operator=(const vector_downward &)); Allocator *allocator_; bool own_allocator_; size_t initial_size_; size_t buffer_minalign_; size_t reserved_; uoffset_t size_; uint8_t *buf_; uint8_t *cur_; // Points at location between empty (below) and used (above). uint8_t *scratch_; // Points to the end of the scratchpad in use. void reallocate(size_t len) { auto old_reserved = reserved_; auto old_size = size(); auto old_scratch_size = scratch_size(); reserved_ += (std::max)(len, old_reserved ? old_reserved / 2 : initial_size_); reserved_ = (reserved_ + buffer_minalign_ - 1) & ~(buffer_minalign_ - 1); if (buf_) { buf_ = ReallocateDownward(allocator_, buf_, old_reserved, reserved_, old_size, old_scratch_size); } else { buf_ = Allocate(allocator_, reserved_); } cur_ = buf_ + reserved_ - old_size; scratch_ = buf_ + old_scratch_size; } }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_VECTOR_DOWNWARD_H_ mapserver-8.4.0/src/flatgeobuf/include/flatbuffers/verifier.h000066400000000000000000000231161474174441300243620ustar00rootroot00000000000000/* * Copyright 2021 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FLATBUFFERS_VERIFIER_H_ #define FLATBUFFERS_VERIFIER_H_ #include "flatbuffers/base.h" #include "flatbuffers/vector.h" namespace mapserver { namespace flatbuffers { // Helper class to verify the integrity of a FlatBuffer class Verifier FLATBUFFERS_FINAL_CLASS { public: Verifier(const uint8_t *buf, size_t buf_len, uoffset_t _max_depth = 64, uoffset_t _max_tables = 1000000, bool _check_alignment = true) : buf_(buf), size_(buf_len), depth_(0), max_depth_(_max_depth), num_tables_(0), max_tables_(_max_tables), upper_bound_(0), check_alignment_(_check_alignment), flex_reuse_tracker_(nullptr) { FLATBUFFERS_ASSERT(size_ < FLATBUFFERS_MAX_BUFFER_SIZE); } // Central location where any verification failures register. bool Check(bool ok) const { // clang-format off #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE FLATBUFFERS_ASSERT(ok); #endif #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE if (!ok) upper_bound_ = 0; #endif // clang-format on return ok; } // Verify any range within the buffer. bool Verify(size_t elem, size_t elem_len) const { // clang-format off #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE auto upper_bound = elem + elem_len; if (upper_bound_ < upper_bound) upper_bound_ = upper_bound; #endif // clang-format on return Check(elem_len < size_ && elem <= size_ - elem_len); } bool VerifyAlignment(size_t elem, size_t align) const { return Check((elem & (align - 1)) == 0 || !check_alignment_); } // Verify a range indicated by sizeof(T). template bool Verify(size_t elem) const { return VerifyAlignment(elem, sizeof(T)) && Verify(elem, sizeof(T)); } bool VerifyFromPointer(const uint8_t *p, size_t len) { auto o = static_cast(p - buf_); return Verify(o, len); } // Verify relative to a known-good base pointer. bool VerifyFieldStruct(const uint8_t *base, voffset_t elem_off, size_t elem_len, size_t align) const { auto f = static_cast(base - buf_) + elem_off; return VerifyAlignment(f, align) && Verify(f, elem_len); } template bool VerifyField(const uint8_t *base, voffset_t elem_off, size_t align) const { auto f = static_cast(base - buf_) + elem_off; return VerifyAlignment(f, align) && Verify(f, sizeof(T)); } // Verify a pointer (may be NULL) of a table type. template bool VerifyTable(const T *table) { return !table || table->Verify(*this); } // Verify a pointer (may be NULL) of any vector type. template bool VerifyVector(const Vector *vec) const { return !vec || VerifyVectorOrString(reinterpret_cast(vec), sizeof(T)); } // Verify a pointer (may be NULL) of a vector to struct. template bool VerifyVector(const Vector *vec) const { return VerifyVector(reinterpret_cast *>(vec)); } // Verify a pointer (may be NULL) to string. bool VerifyString(const String *str) const { size_t end; return !str || (VerifyVectorOrString(reinterpret_cast(str), 1, &end) && Verify(end, 1) && // Must have terminator Check(buf_[end] == '\0')); // Terminating byte must be 0. } // Common code between vectors and strings. bool VerifyVectorOrString(const uint8_t *vec, size_t elem_size, size_t *end = nullptr) const { auto veco = static_cast(vec - buf_); // Check we can read the size field. if (!Verify(veco)) return false; // Check the whole array. If this is a string, the byte past the array // must be 0. auto size = ReadScalar(vec); auto max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size; if (!Check(size < max_elems)) return false; // Protect against byte_size overflowing. auto byte_size = sizeof(size) + elem_size * size; if (end) *end = veco + byte_size; return Verify(veco, byte_size); } // Special case for string contents, after the above has been called. bool VerifyVectorOfStrings(const Vector> *vec) const { if (vec) { for (uoffset_t i = 0; i < vec->size(); i++) { if (!VerifyString(vec->Get(i))) return false; } } return true; } // Special case for table contents, after the above has been called. template bool VerifyVectorOfTables(const Vector> *vec) { if (vec) { for (uoffset_t i = 0; i < vec->size(); i++) { if (!vec->Get(i)->Verify(*this)) return false; } } return true; } __supress_ubsan__("unsigned-integer-overflow") bool VerifyTableStart( const uint8_t *table) { // Check the vtable offset. auto tableo = static_cast(table - buf_); if (!Verify(tableo)) return false; // This offset may be signed, but doing the subtraction unsigned always // gives the result we want. auto vtableo = tableo - static_cast(ReadScalar(table)); // Check the vtable size field, then check vtable fits in its entirety. return VerifyComplexity() && Verify(vtableo) && VerifyAlignment(ReadScalar(buf_ + vtableo), sizeof(voffset_t)) && Verify(vtableo, ReadScalar(buf_ + vtableo)); } template bool VerifyBufferFromStart(const char *identifier, size_t start) { if (identifier && !Check((size_ >= 2 * sizeof(flatbuffers::uoffset_t) && BufferHasIdentifier(buf_ + start, identifier)))) { return false; } // Call T::Verify, which must be in the generated code for this type. auto o = VerifyOffset(start); return o && reinterpret_cast(buf_ + start + o)->Verify(*this) // clang-format off #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE && GetComputedSize() #endif ; // clang-format on } template bool VerifyNestedFlatBuffer(const Vector *buf, const char *identifier) { if (!buf) return true; Verifier nested_verifier(buf->data(), buf->size()); return nested_verifier.VerifyBuffer(identifier); } // Verify this whole buffer, starting with root type T. template bool VerifyBuffer() { return VerifyBuffer(nullptr); } template bool VerifyBuffer(const char *identifier) { return VerifyBufferFromStart(identifier, 0); } template bool VerifySizePrefixedBuffer(const char *identifier) { return Verify(0U) && ReadScalar(buf_) == size_ - sizeof(uoffset_t) && VerifyBufferFromStart(identifier, sizeof(uoffset_t)); } uoffset_t VerifyOffset(size_t start) const { if (!Verify(start)) return 0; auto o = ReadScalar(buf_ + start); // May not point to itself. if (!Check(o != 0)) return 0; // Can't wrap around / buffers are max 2GB. if (!Check(static_cast(o) >= 0)) return 0; // Must be inside the buffer to create a pointer from it (pointer outside // buffer is UB). if (!Verify(start + o, 1)) return 0; return o; } uoffset_t VerifyOffset(const uint8_t *base, voffset_t start) const { return VerifyOffset(static_cast(base - buf_) + start); } // Called at the start of a table to increase counters measuring data // structure depth and amount, and possibly bails out with false if // limits set by the constructor have been hit. Needs to be balanced // with EndTable(). bool VerifyComplexity() { depth_++; num_tables_++; return Check(depth_ <= max_depth_ && num_tables_ <= max_tables_); } // Called at the end of a table to pop the depth count. bool EndTable() { depth_--; return true; } // Returns the message size in bytes size_t GetComputedSize() const { // clang-format off #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE uintptr_t size = upper_bound_; // Align the size to uoffset_t size = (size - 1 + sizeof(uoffset_t)) & ~(sizeof(uoffset_t) - 1); return (size > size_) ? 0 : size; #else // Must turn on FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE for this to work. (void)upper_bound_; FLATBUFFERS_ASSERT(false); return 0; #endif // clang-format on } std::vector *GetFlexReuseTracker() { return flex_reuse_tracker_; } void SetFlexReuseTracker(std::vector *rt) { flex_reuse_tracker_ = rt; } private: const uint8_t *buf_; size_t size_; uoffset_t depth_; uoffset_t max_depth_; uoffset_t num_tables_; uoffset_t max_tables_; mutable size_t upper_bound_; bool check_alignment_; std::vector *flex_reuse_tracker_; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_VERIFIER_H_ mapserver-8.4.0/src/flatgeobuf/packedrtree.cpp000066400000000000000000000352551474174441300214540ustar00rootroot00000000000000/****************************************************************************** * * Project: FlatGeobuf * Purpose: Packed RTree management * Author: Björn Harrtell * ****************************************************************************** * Copyright (c) 2018-2020, Björn Harrtell * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ // NOTE: The upstream of this file is in https://github.com/bjornharrtell/flatgeobuf/tree/master/src/cpp #ifdef GDAL_COMPILATION #include "cpl_port.h" #else #define CPL_IS_LSB 1 #endif #include "packedrtree.h" #include #include #include namespace mapserver { namespace FlatGeobuf { const NodeItem &NodeItem::expand(const NodeItem &r) { if (r.minX < minX) minX = r.minX; if (r.minY < minY) minY = r.minY; if (r.maxX > maxX) maxX = r.maxX; if (r.maxY > maxY) maxY = r.maxY; return *this; } NodeItem NodeItem::create(uint64_t offset) { return { std::numeric_limits::infinity(), std::numeric_limits::infinity(), -1 * std::numeric_limits::infinity(), -1 * std::numeric_limits::infinity(), offset }; } bool NodeItem::intersects(const NodeItem &r) const { if (maxX < r.minX) return false; if (maxY < r.minY) return false; if (minX > r.maxX) return false; if (minY > r.maxY) return false; return true; } std::vector NodeItem::toVector() { return std::vector { minX, minY, maxX, maxY }; } // Based on public domain code at https://github.com/rawrunprotected/hilbert_curves uint32_t hilbert(uint32_t x, uint32_t y) { uint32_t a = x ^ y; uint32_t b = 0xFFFF ^ a; uint32_t c = 0xFFFF ^ (x | y); uint32_t d = x & (y ^ 0xFFFF); uint32_t A = a | (b >> 1); uint32_t B = (a >> 1) ^ a; uint32_t C = ((c >> 1) ^ (b & (d >> 1))) ^ c; uint32_t D = ((a & (c >> 1)) ^ (d >> 1)) ^ d; a = A; b = B; c = C; d = D; A = ((a & (a >> 2)) ^ (b & (b >> 2))); B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2))); C ^= ((a & (c >> 2)) ^ (b & (d >> 2))); D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2))); a = A; b = B; c = C; d = D; A = ((a & (a >> 4)) ^ (b & (b >> 4))); B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4))); C ^= ((a & (c >> 4)) ^ (b & (d >> 4))); D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4))); a = A; b = B; c = C; d = D; C ^= ((a & (c >> 8)) ^ (b & (d >> 8))); D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8))); a = C ^ (C >> 1); b = D ^ (D >> 1); uint32_t i0 = x ^ y; uint32_t i1 = b | (0xFFFF ^ (i0 | a)); i0 = (i0 | (i0 << 8)) & 0x00FF00FF; i0 = (i0 | (i0 << 4)) & 0x0F0F0F0F; i0 = (i0 | (i0 << 2)) & 0x33333333; i0 = (i0 | (i0 << 1)) & 0x55555555; i1 = (i1 | (i1 << 8)) & 0x00FF00FF; i1 = (i1 | (i1 << 4)) & 0x0F0F0F0F; i1 = (i1 | (i1 << 2)) & 0x33333333; i1 = (i1 | (i1 << 1)) & 0x55555555; uint32_t value = ((i1 << 1) | i0); return value; } uint32_t hilbert(const NodeItem &r, uint32_t hilbertMax, const double minX, const double minY, const double width, const double height) { uint32_t x = 0; uint32_t y = 0; uint32_t v; if (width != 0.0) x = static_cast(floor(hilbertMax * ((r.minX + r.maxX) / 2 - minX) / width)); if (height != 0.0) y = static_cast(floor(hilbertMax * ((r.minY + r.maxY) / 2 - minY) / height)); v = hilbert(x, y); return v; } const uint32_t hilbertMax = (1 << 16) - 1; void hilbertSort(std::vector> &items) { NodeItem extent = calcExtent(items); const double minX = extent.minX; const double minY = extent.minY; const double width = extent.width(); const double height = extent.height(); std::sort(items.begin(), items.end(), [minX, minY, width, height] (std::shared_ptr a, std::shared_ptr b) { uint32_t ha = hilbert(a->nodeItem, hilbertMax, minX, minY, width, height); uint32_t hb = hilbert(b->nodeItem, hilbertMax, minX, minY, width, height); return ha > hb; }); } void hilbertSort(std::vector &items) { NodeItem extent = calcExtent(items); const double minX = extent.minX; const double minY = extent.minY; const double width = extent.width(); const double height = extent.height(); std::sort(items.begin(), items.end(), [minX, minY, width, height] (const NodeItem &a, const NodeItem &b) { uint32_t ha = hilbert(a, hilbertMax, minX, minY, width, height); uint32_t hb = hilbert(b, hilbertMax, minX, minY, width, height); return ha > hb; }); } NodeItem calcExtent(const std::vector> &items) { return std::accumulate(items.begin(), items.end(), NodeItem::create(0), [] (NodeItem a, const std::shared_ptr& b) { return a.expand(b->nodeItem); }); } NodeItem calcExtent(const std::vector &nodes) { return std::accumulate(nodes.begin(), nodes.end(), NodeItem::create(0), [] (NodeItem a, const NodeItem &b) { return a.expand(b); }); } void PackedRTree::init(const uint16_t nodeSize) { if (nodeSize < 2) throw std::invalid_argument("Node size must be at least 2"); if (_numItems == 0) throw std::invalid_argument("Cannot create empty tree"); _nodeSize = std::min(std::max(nodeSize, static_cast(2)), static_cast(65535)); _levelBounds = generateLevelBounds(_numItems, _nodeSize); _numNodes = _levelBounds.front().second; _nodeItems = new NodeItem[static_cast(_numNodes)]; } std::vector> PackedRTree::generateLevelBounds(const uint64_t numItems, const uint16_t nodeSize) { if (nodeSize < 2) throw std::invalid_argument("Node size must be at least 2"); if (numItems == 0) throw std::invalid_argument("Number of items must be greater than 0"); if (numItems > std::numeric_limits::max() - ((numItems / nodeSize) * 2)) throw std::overflow_error("Number of items too large"); // number of nodes per level in bottom-up order std::vector levelNumNodes; uint64_t n = numItems; uint64_t numNodes = n; levelNumNodes.push_back(n); do { n = (n + nodeSize - 1) / nodeSize; numNodes += n; levelNumNodes.push_back(n); } while (n != 1); // bounds per level in reversed storage order (top-down) std::vector levelOffsets; n = numNodes; for (auto size : levelNumNodes) levelOffsets.push_back(n -= size); std::reverse(levelOffsets.begin(), levelOffsets.end()); std::reverse(levelNumNodes.begin(), levelNumNodes.end()); std::vector> levelBounds; for (size_t i = 0; i < levelNumNodes.size(); i++) levelBounds.push_back(std::pair(levelOffsets[i], levelOffsets[i] + levelNumNodes[i])); std::reverse(levelBounds.begin(), levelBounds.end()); return levelBounds; } void PackedRTree::generateNodes() { for (uint32_t i = 0; i < _levelBounds.size() - 1; i++) { auto pos = _levelBounds[i].first; auto end = _levelBounds[i].second; auto newpos = _levelBounds[i + 1].first; while (pos < end) { NodeItem node = NodeItem::create(pos); for (uint32_t j = 0; j < _nodeSize && pos < end; j++) node.expand(_nodeItems[pos++]); _nodeItems[newpos++] = node; } } } void PackedRTree::fromData(const void *data) { auto buf = reinterpret_cast(data); const NodeItem *pn = reinterpret_cast(buf); for (uint64_t i = 0; i < _numNodes; i++) { NodeItem n = *pn++; _nodeItems[i] = n; _extent.expand(n); } } PackedRTree::PackedRTree(const std::vector> &items, const NodeItem &extent, const uint16_t nodeSize) : _extent(extent), _numItems(items.size()) { init(nodeSize); for (size_t i = 0; i < _numItems; i++) _nodeItems[_numNodes - _numItems + i] = items[i]->nodeItem; generateNodes(); } PackedRTree::PackedRTree(const std::vector &nodes, const NodeItem &extent, const uint16_t nodeSize) : _extent(extent), _numItems(nodes.size()) { init(nodeSize); for (size_t i = 0; i < _numItems; i++) _nodeItems[_numNodes - _numItems + i] = nodes[i]; generateNodes(); } PackedRTree::PackedRTree(const void *data, const uint64_t numItems, const uint16_t nodeSize) : _extent(NodeItem::create(0)), _numItems(numItems) { init(nodeSize); fromData(data); } std::vector PackedRTree::search(double minX, double minY, double maxX, double maxY) const { uint64_t leafNodesOffset = _levelBounds.front().first; NodeItem n { minX, minY, maxX, maxY, 0 }; std::vector results; std::unordered_map queue; queue.insert(std::pair(0, _levelBounds.size() - 1)); while(queue.size() != 0) { auto next = queue.begin(); uint64_t nodeIndex = next->first; uint64_t level = next->second; queue.erase(next); bool isLeafNode = nodeIndex >= _numNodes - _numItems; // find the end index of the node uint64_t end = std::min(static_cast(nodeIndex + _nodeSize), _levelBounds[static_cast(level)].second); // search through child nodes for (uint64_t pos = nodeIndex; pos < end; pos++) { auto nodeItem = _nodeItems[static_cast(pos)]; if (!n.intersects(nodeItem)) continue; if (isLeafNode) results.push_back({ nodeItem.offset, pos - leafNodesOffset }); else queue.insert(std::pair(nodeItem.offset, level - 1)); } } return results; } std::vector PackedRTree::streamSearch( const uint64_t numItems, const uint16_t nodeSize, const NodeItem &item, const std::function &readNode) { auto levelBounds = generateLevelBounds(numItems, nodeSize); uint64_t leafNodesOffset = levelBounds.front().first; uint64_t numNodes = levelBounds.front().second; auto nodeItems = std::vector(nodeSize); uint8_t *nodesBuf = reinterpret_cast(nodeItems.data()); // use ordered search queue to make index traversal in sequential order std::map queue; std::vector results; queue.insert(std::pair(0, levelBounds.size() - 1)); while(queue.size() != 0) { auto next = queue.begin(); uint64_t nodeIndex = next->first; uint64_t level = next->second; queue.erase(next); bool isLeafNode = nodeIndex >= numNodes - numItems; // find the end index of the node uint64_t end = std::min(static_cast(nodeIndex + nodeSize), levelBounds[static_cast(level)].second); uint64_t length = end - nodeIndex; readNode(nodesBuf, static_cast(nodeIndex * sizeof(NodeItem)), static_cast(length * sizeof(NodeItem))); #if !CPL_IS_LSB for( size_t i = 0; i < static_cast(length); i++ ) { CPL_LSBPTR64(&nodeItems[i].minX); CPL_LSBPTR64(&nodeItems[i].minY); CPL_LSBPTR64(&nodeItems[i].maxX); CPL_LSBPTR64(&nodeItems[i].maxY); CPL_LSBPTR64(&nodeItems[i].offset); } #endif // search through child nodes for (uint64_t pos = nodeIndex; pos < end; pos++) { uint64_t nodePos = pos - nodeIndex; auto nodeItem = nodeItems[static_cast(nodePos)]; if (!item.intersects(nodeItem)) continue; if (isLeafNode) results.push_back({ nodeItem.offset, pos - leafNodesOffset }); else queue.insert(std::pair(nodeItem.offset, level - 1)); } } return results; } uint64_t PackedRTree::size() const { return _numNodes * sizeof(NodeItem); } uint64_t PackedRTree::size(const uint64_t numItems, const uint16_t nodeSize) { if (nodeSize < 2) throw std::invalid_argument("Node size must be at least 2"); if (numItems == 0) throw std::invalid_argument("Number of items must be greater than 0"); const uint16_t nodeSizeMin = std::min(std::max(nodeSize, static_cast(2)), static_cast(65535)); // limit so that resulting size in bytes can be represented by uint64_t if (numItems > static_cast(1) << 56) throw std::overflow_error("Number of items must be less than 2^56"); uint64_t n = numItems; uint64_t numNodes = n; do { n = (n + nodeSizeMin - 1) / nodeSizeMin; numNodes += n; } while (n != 1); return numNodes * sizeof(NodeItem); } void PackedRTree::streamWrite(const std::function &writeData) { #if !CPL_IS_LSB for( size_t i = 0; i < static_cast(_numNodes); i++ ) { CPL_LSBPTR64(&_nodeItems[i].minX); CPL_LSBPTR64(&_nodeItems[i].minY); CPL_LSBPTR64(&_nodeItems[i].maxX); CPL_LSBPTR64(&_nodeItems[i].maxY); CPL_LSBPTR64(&_nodeItems[i].offset); } #endif writeData(reinterpret_cast(_nodeItems), static_cast(_numNodes * sizeof(NodeItem))); #if !CPL_IS_LSB for( size_t i = 0; i < static_cast(_numNodes); i++ ) { CPL_LSBPTR64(&_nodeItems[i].minX); CPL_LSBPTR64(&_nodeItems[i].minY); CPL_LSBPTR64(&_nodeItems[i].maxX); CPL_LSBPTR64(&_nodeItems[i].maxY); CPL_LSBPTR64(&_nodeItems[i].offset); } #endif } NodeItem PackedRTree::getExtent() const { return _extent; } } }mapserver-8.4.0/src/flatgeobuf/packedrtree.h000066400000000000000000000104161474174441300211110ustar00rootroot00000000000000/****************************************************************************** * * Project: FlatGeobuf * Purpose: Packed RTree management * Author: Björn Harrtell * ****************************************************************************** * Copyright (c) 2018-2020, Björn Harrtell * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ // NOTE: The upstream of this file is in https://github.com/bjornharrtell/flatgeobuf/tree/master/src/cpp #ifndef FLATGEOBUF_PACKEDRTREE_H_ #define FLATGEOBUF_PACKEDRTREE_H_ #include #include #include "flatbuffers/flatbuffers.h" namespace mapserver { namespace FlatGeobuf { struct NodeItem { double minX; double minY; double maxX; double maxY; uint64_t offset; double width() const { return maxX - minX; } double height() const { return maxY - minY; } static NodeItem sum(NodeItem a, const NodeItem &b) { a.expand(b); return a; } static NodeItem create(uint64_t offset = 0); const NodeItem &expand(const NodeItem &r); bool intersects(const NodeItem &r) const; std::vector toVector(); }; struct Item { NodeItem nodeItem; }; struct SearchResultItem { uint64_t offset; uint64_t index; }; std::ostream& operator << (std::ostream& os, NodeItem const& value); uint32_t hilbert(uint32_t x, uint32_t y); uint32_t hilbert(const NodeItem &n, uint32_t hilbertMax, const double minX, const double minY, const double width, const double height); void hilbertSort(std::vector> &items); void hilbertSort(std::vector &items); NodeItem calcExtent(const std::vector> &items); NodeItem calcExtent(const std::vector &rects); /** * Packed R-Tree * Based on https://github.com/mourner/flatbush */ class PackedRTree { NodeItem _extent; NodeItem *_nodeItems = nullptr; uint64_t _numItems; uint64_t _numNodes; uint16_t _nodeSize; std::vector> _levelBounds; void init(const uint16_t nodeSize); void generateNodes(); void fromData(const void *data); public: ~PackedRTree() { if (_nodeItems != nullptr) delete[] _nodeItems; } PackedRTree(const std::vector> &items, const NodeItem &extent, const uint16_t nodeSize = 16); PackedRTree(const std::vector &nodes, const NodeItem &extent, const uint16_t nodeSize = 16); PackedRTree(const void *data, const uint64_t numItems, const uint16_t nodeSize = 16); std::vector search(double minX, double minY, double maxX, double maxY) const; static std::vector streamSearch( const uint64_t numItems, const uint16_t nodeSize, const NodeItem &item, const std::function &readNode); static std::vector> generateLevelBounds(const uint64_t numItems, const uint16_t nodeSize); uint64_t size() const; static uint64_t size(const uint64_t numItems, const uint16_t nodeSize = 16); NodeItem getExtent() const; void streamWrite(const std::function &writeData); }; } } #endif mapserver-8.4.0/src/fontcache.c000066400000000000000000000321151474174441300164270ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Freetype Font helper functions * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2013 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "mapthread.h" #include "fontcache.h" #include "dejavu-sans-condensed.h" #include "cpl_conv.h" typedef struct { FT_Library library; face_element *face_cache; glyph_element *bitmap_glyph_cache; } ft_cache; #ifdef USE_THREAD typedef struct ft_thread_cache ft_thread_cache; struct ft_thread_cache { void *thread_id; ft_thread_cache *next; ft_cache cache; }; ft_thread_cache *ft_caches; int use_global_ft_cache; #else ft_cache global_ft_cache; #endif void msInitFontCache(ft_cache *c) { memset(c, 0, sizeof(ft_cache)); FT_Init_FreeType(&c->library); } void msFreeFontCache(ft_cache *c) { /* ... TODO ... */ face_element *cur_face, *tmp_face; glyph_element *cur_bitmap, *tmp_bitmap; UT_HASH_ITER(hh, c->face_cache, cur_face, tmp_face) { index_element *cur_index, *tmp_index; outline_element *cur_outline, *tmp_outline; glyph_element *cur_glyph, *tmp_glyph; UT_HASH_ITER(hh, cur_face->index_cache, cur_index, tmp_index) { UT_HASH_DEL(cur_face->index_cache, cur_index); free(cur_index); } UT_HASH_ITER(hh, cur_face->outline_cache, cur_outline, tmp_outline) { UT_HASH_DEL(cur_face->outline_cache, cur_outline); FT_Outline_Done(c->library, &cur_outline->outline); free(cur_outline); } UT_HASH_ITER(hh, cur_face->glyph_cache, cur_glyph, tmp_glyph) { UT_HASH_DEL(cur_face->glyph_cache, cur_glyph); free(cur_glyph); } #ifdef USE_HARFBUZZ if (cur_face->hbfont) { hb_font_destroy(cur_face->hbfont->hbfont); hb_font_destroy(cur_face->hbfont->hbparentfont); hb_font_funcs_destroy(cur_face->hbfont->funcs); free(cur_face->hbfont); } #endif FT_Done_Face(cur_face->face); free(cur_face->font); UT_HASH_DEL(c->face_cache, cur_face); free(cur_face); } FT_Done_FreeType(c->library); UT_HASH_ITER(hh, c->bitmap_glyph_cache, cur_bitmap, tmp_bitmap) { UT_HASH_DEL(c->bitmap_glyph_cache, cur_bitmap); free(cur_bitmap); } memset(c, 0, sizeof(ft_cache)); } ft_cache *msGetFontCache() { #ifndef USE_THREAD return &global_ft_cache; #else void *nThreadId = 0; ft_thread_cache *prev = NULL, *cur = ft_caches; if (!use_global_ft_cache) nThreadId = msGetThreadId(); if (cur != NULL && cur->thread_id == nThreadId) return &cur->cache; /* -------------------------------------------------------------------- */ /* Search for cache for this thread */ /* -------------------------------------------------------------------- */ msAcquireLock(TLOCK_TTF); cur = ft_caches; while (cur != NULL && cur->thread_id != nThreadId) { prev = cur; cur = cur->next; } /* -------------------------------------------------------------------- */ /* If we found it, make sure it is pushed to the front of the */ /* link for faster finding next time, and return it. */ /* -------------------------------------------------------------------- */ if (cur != NULL) { if (prev != NULL) { prev->next = cur->next; cur->next = ft_caches; ft_caches = cur; } msReleaseLock(TLOCK_TTF); return &cur->cache; } /* -------------------------------------------------------------------- */ /* Create a new context group for this thread. */ /* -------------------------------------------------------------------- */ cur = msSmallMalloc(sizeof(ft_thread_cache)); cur->next = NULL; cur->thread_id = nThreadId; msInitFontCache(&cur->cache); cur->next = ft_caches; ft_caches = cur; msReleaseLock(TLOCK_TTF); return &cur->cache; #endif } void msFontCacheSetup() { #ifndef USE_THREAD ft_cache *c = msGetFontCache(); msInitFontCache(c); #else const char *use_global_cache = CPLGetConfigOption("MS_USE_GLOBAL_FT_CACHE", NULL); if (use_global_cache) use_global_ft_cache = atoi(use_global_cache); else use_global_ft_cache = 0; ft_caches = NULL; #endif } void msFontCacheCleanup() { #ifndef USE_THREAD ft_cache *c = msGetFontCache(); msFreeFontCache(c); #else ft_thread_cache *cur, *next; msAcquireLock(TLOCK_TTF); cur = ft_caches; while (cur != NULL) { msFreeFontCache(&cur->cache); next = cur->next; free(cur); cur = next; } ft_caches = NULL; msReleaseLock(TLOCK_TTF); #endif } unsigned int msGetGlyphIndex(face_element *face, unsigned int unicode) { index_element *ic; if (face->face->charmap && face->face->charmap->encoding == FT_ENCODING_MS_SYMBOL) { unicode |= 0xf000; /* why? */ } #ifdef USE_THREAD if (use_global_ft_cache) msAcquireLock(TLOCK_TTF); #endif UT_HASH_FIND_INT(face->index_cache, &unicode, ic); if (!ic) { ic = msSmallMalloc(sizeof(index_element)); ic->codepoint = FT_Get_Char_Index(face->face, unicode); ic->unicode = unicode; UT_HASH_ADD_INT(face->index_cache, unicode, ic); } #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return ic->codepoint; } #define MS_DEFAULT_FONT_KEY "_ms_default_" face_element *msGetFontFace(const char *key, fontSetObj *fontset) { face_element *fc; int error; ft_cache *cache = msGetFontCache(); if (!key) { key = MS_DEFAULT_FONT_KEY; } #ifdef USE_THREAD if (use_global_ft_cache) msAcquireLock(TLOCK_TTF); #endif UT_HASH_FIND_STR(cache->face_cache, key, fc); if (!fc) { const char *fontfile = NULL; fc = msSmallCalloc(1, sizeof(face_element)); if (fontset && strcmp(key, MS_DEFAULT_FONT_KEY)) { fontfile = msLookupHashTable(&(fontset->fonts), key); if (!fontfile) { msSetError(MS_MISCERR, "Could not find font with key \"%s\" in fontset", "msGetFontFace()", key); free(fc); #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return NULL; } error = FT_New_Face(cache->library, fontfile, 0, &(fc->face)); } else { error = FT_New_Memory_Face(cache->library, dejavu_sans_condensed_ttf, dejavu_sans_condensed_ttf_len, 0, &(fc->face)); } if (error) { msSetError(MS_MISCERR, "Freetype was unable to load font file \"%s\" for key \"%s\"", "msGetFontFace()", fontfile, key); free(fc); #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return NULL; } if (!fc->face->charmap) { /* The font file has no unicode charmap, select an alternate one */ if (FT_Select_Charmap(fc->face, FT_ENCODING_MS_SYMBOL)) FT_Select_Charmap(fc->face, FT_ENCODING_APPLE_ROMAN); /* the previous calls may have failed, we ignore as there's nothing much * left to do */ } fc->font = msStrdup(key); UT_HASH_ADD_KEYPTR(hh, cache->face_cache, fc->font, strlen(key), fc); } #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return fc; } glyph_element *msGetGlyphByIndex(face_element *face, unsigned int size, unsigned int codepoint) { glyph_element *gc; glyph_element_key key; memset(&key, 0, sizeof(glyph_element_key)); key.codepoint = codepoint; key.size = size; #ifdef USE_THREAD if (use_global_ft_cache) msAcquireLock(TLOCK_TTF); #endif UT_HASH_FIND(hh, face->glyph_cache, &key, sizeof(glyph_element_key), gc); if (!gc) { FT_Error error; gc = msSmallMalloc(sizeof(glyph_element)); if (MS_NINT(size * 96.0 / 72.0) != face->face->size->metrics.x_ppem) { FT_Set_Pixel_Sizes(face->face, 0, MS_NINT(size * 96 / 72.0)); } error = FT_Load_Glyph(face->face, key.codepoint, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); if (error) { msDebug("Unable to load glyph %u for font \"%s\". Using ? as fallback.\n", key.codepoint, face->font); // If we can't find a glyph then try to fallback to a question mark. unsigned int fallbackCodepoint = msGetGlyphIndex(face, 0x3F); error = FT_Load_Glyph(face->face, fallbackCodepoint, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); } if (error) { msSetError(MS_MISCERR, "unable to load glyph %u for font \"%s\"", "msGetGlyphByIndex()", key.codepoint, face->font); free(gc); #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return NULL; } gc->metrics.minx = face->face->glyph->metrics.horiBearingX / 64.0; gc->metrics.maxx = gc->metrics.minx + face->face->glyph->metrics.width / 64.0; gc->metrics.maxy = face->face->glyph->metrics.horiBearingY / 64.0; gc->metrics.miny = gc->metrics.maxy - face->face->glyph->metrics.height / 64.0; gc->metrics.advance = face->face->glyph->metrics.horiAdvance / 64.0; gc->key = key; UT_HASH_ADD(hh, face->glyph_cache, key, sizeof(glyph_element_key), gc); } #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return gc; } outline_element *msGetGlyphOutline(face_element *face, glyph_element *glyph) { outline_element *oc; outline_element_key key; ft_cache *cache = msGetFontCache(); memset(&key, 0, sizeof(outline_element_key)); key.glyph = glyph; #ifdef USE_THREAD if (use_global_ft_cache) msAcquireLock(TLOCK_TTF); #endif UT_HASH_FIND(hh, face->outline_cache, &key, sizeof(outline_element_key), oc); if (!oc) { FT_Matrix matrix; FT_Vector pen; FT_Error error; oc = msSmallMalloc(sizeof(outline_element)); if (MS_NINT(glyph->key.size * 96.0 / 72.0) != face->face->size->metrics.x_ppem) { FT_Set_Pixel_Sizes(face->face, 0, MS_NINT(glyph->key.size * 96 / 72.0)); } matrix.xx = matrix.yy = 0x10000L; matrix.xy = matrix.yx = 0x00000L; pen.x = pen.y = 0; FT_Set_Transform(face->face, &matrix, &pen); error = FT_Load_Glyph( face->face, glyph->key.codepoint, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP /*|FT_LOAD_IGNORE_TRANSFORM*/ | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); if (error) { msDebug("Unable to load glyph %u for font \"%s\". Using ? as fallback.\n", glyph->key.codepoint, face->font); // If we can't find a glyph then try to fallback to a question mark. unsigned int fallbackCodepoint = msGetGlyphIndex(face, 0x3F); error = FT_Load_Glyph( face->face, fallbackCodepoint, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP /*|FT_LOAD_IGNORE_TRANSFORM*/ | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); } if (error) { msSetError(MS_MISCERR, "unable to load glyph %u for font \"%s\"", "msGetGlyphOutline()", glyph->key.codepoint, face->font); #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return NULL; } error = FT_Outline_New(cache->library, face->face->glyph->outline.n_points, face->face->glyph->outline.n_contours, &oc->outline); (void)error; FT_Outline_Copy(&face->face->glyph->outline, &oc->outline); oc->key = key; UT_HASH_ADD(hh, face->outline_cache, key, sizeof(outline_element_key), oc); } #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return oc; } int msIsGlyphASpace(glyphObj *glyph) { /* space or tab, for now */ unsigned int space, tab; space = msGetGlyphIndex(glyph->face, 0x20); tab = msGetGlyphIndex(glyph->face, 0x9); return glyph->glyph->key.codepoint == space || glyph->glyph->key.codepoint == tab; } mapserver-8.4.0/src/fontcache.h000066400000000000000000000035101474174441300164310ustar00rootroot00000000000000#include "mapserver.h" #include "uthash.h" #include #include FT_FREETYPE_H #include FT_GLYPH_H #include FT_OUTLINE_H #ifdef USE_FRIBIDI #if (defined(_WIN32) && !defined(__CYGWIN__)) || defined(HAVE_FRIBIDI2) #include "fribidi.h" #else #include #endif #include #endif #ifdef __cplusplus extern "C" { #endif typedef struct { /* this one can remain private */ unsigned int unicode; unsigned int codepoint; UT_hash_handle hh; } index_element; typedef struct { void *hbparentfont; void *hbfont; void *funcs; int cursize; } hb_font_element; typedef struct { unsigned int codepoint; unsigned int size; } glyph_element_key; struct glyph_element { glyph_element_key key; glyph_metrics metrics; UT_hash_handle hh; }; typedef struct { glyph_element *glyph; } outline_element_key; typedef struct { outline_element_key key; FT_Outline outline; UT_hash_handle hh; } outline_element; typedef struct { glyph_element *glyph; } bitmap_element_key; typedef struct { bitmap_element_key key; void *bitmap; UT_hash_handle hh; } bitmap_element; struct face_element { char *font; FT_Face face; index_element *index_cache; glyph_element *glyph_cache; outline_element *outline_cache; hb_font_element *hbfont; UT_hash_handle hh; }; face_element *msGetFontFace(const char *key, fontSetObj *fontset); outline_element *msGetGlyphOutline(face_element *face, glyph_element *glyph); glyph_element *msGetBitmapGlyph(rendererVTableObj *renderer, unsigned int size, unsigned int unicode); unsigned int msGetGlyphIndex(face_element *face, unsigned int unicode); glyph_element *msGetGlyphByIndex(face_element *face, unsigned int size, unsigned int codepoint); int msIsGlyphASpace(glyphObj *glyph); #ifdef __cplusplus } #endif mapserver-8.4.0/src/hittest.c000066400000000000000000000234221474174441300161620ustar00rootroot00000000000000/***************************************************************************** * * Project: MapServer * Purpose: Content Dependent Legend rendering support * Author: Thomas Bonfort (tbonfort@terriscope.fr) * ****************************************************************************** * Copyright (c) 1996-2013 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" void initStyleHitTests(styleObj *s, style_hittest *sh, int default_status) { (void)s; sh->status = default_status; } void initLabelHitTests(labelObj *l, label_hittest *lh, int default_status) { int i; lh->stylehits = msSmallCalloc(l->numstyles, sizeof(style_hittest)); lh->status = default_status; for (i = 0; i < l->numstyles; i++) { initStyleHitTests(l->styles[i], &lh->stylehits[i], default_status); } } void initClassHitTests(classObj *c, class_hittest *ch, int default_status) { int i; ch->stylehits = msSmallCalloc(c->numstyles, sizeof(style_hittest)); ch->labelhits = msSmallCalloc(c->numlabels, sizeof(label_hittest)); ch->status = default_status; for (i = 0; i < c->numstyles; i++) { initStyleHitTests(c->styles[i], &ch->stylehits[i], default_status); } for (i = 0; i < c->numlabels; i++) { initLabelHitTests(c->labels[i], &ch->labelhits[i], default_status); } } void initLayerHitTests(layerObj *l, layer_hittest *lh) { int i, default_status; lh->classhits = msSmallCalloc(l->numclasses, sizeof(class_hittest)); switch (l->type) { case MS_LAYER_POLYGON: case MS_LAYER_POINT: case MS_LAYER_LINE: case MS_LAYER_ANNOTATION: default_status = 0; /* needs testing */ break; default: default_status = 1; /* no hittesting needed, use traditional mode */ break; } lh->status = default_status; for (i = 0; i < l->numclasses; i++) { initClassHitTests(l->class[i], &lh -> classhits[i], default_status); } } void initMapHitTests(mapObj *map, map_hittest *mh) { int i; mh->layerhits = msSmallCalloc(map->numlayers, sizeof(layer_hittest)); for (i = 0; i < map->numlayers; i++) { initLayerHitTests(GET_LAYER(map, i), &mh->layerhits[i]); } } void freeLabelHitTests(labelObj *l, label_hittest *lh) { (void)l; free(lh->stylehits); } void freeClassHitTests(classObj *c, class_hittest *ch) { int i; for (i = 0; i < c->numlabels; i++) { freeLabelHitTests(c->labels[i], &ch->labelhits[i]); } free(ch->stylehits); free(ch->labelhits); } void freeLayerHitTests(layerObj *l, layer_hittest *lh) { int i; for (i = 0; i < l->numclasses; i++) { freeClassHitTests(l->class[i], &lh -> classhits[i]); } free(lh->classhits); } void freeMapHitTests(mapObj *map, map_hittest *mh) { int i; for (i = 0; i < map->numlayers; i++) { freeLayerHitTests(GET_LAYER(map, i), &mh->layerhits[i]); } free(mh->layerhits); } int msHitTestShape(mapObj *map, layerObj *layer, shapeObj *shape, int drawmode, class_hittest *hittest) { int i; classObj *cp = layer->class[shape->classindex]; if (MS_DRAW_FEATURES(drawmode)) { for (i = 0; i < cp->numstyles; i++) { styleObj *sp = cp->styles[i]; if (msScaleInBounds(map->scaledenom, sp->minscaledenom, sp->maxscaledenom)) { hittest->stylehits[i].status = 1; } } } if (MS_DRAW_LABELS(drawmode)) { for (i = 0; i < cp->numlabels; i++) { labelObj *l = cp->labels[i]; if (msGetLabelStatus(map, layer, shape, l) == MS_ON) { int s; hittest->labelhits[i].status = 1; for (s = 0; s < l->numstyles; s++) { hittest->labelhits[i].stylehits[s].status = 1; } } } } return MS_SUCCESS; } int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest) { int status; #ifdef USE_GEOS shapeObj searchpoly; #endif if (!msLayerIsVisible(map, layer)) { hittest->status = 0; return MS_SUCCESS; } if (layer->type == MS_LAYER_LINE || layer->type == MS_LAYER_POLYGON || layer->type == MS_LAYER_POINT || layer->type == MS_LAYER_ANNOTATION) { int maxfeatures = msLayerGetMaxFeaturesToDraw(layer, NULL); int annotate = msEvalContext(map, layer, layer->labelrequires); shapeObj shape; int nclasses, featuresdrawn = 0; int *classgroup; rectObj searchrect; int minfeaturesize = -1; if (map->scaledenom > 0) { if ((layer->labelmaxscaledenom != -1) && (map->scaledenom >= layer->labelmaxscaledenom)) annotate = MS_FALSE; if ((layer->labelminscaledenom != -1) && (map->scaledenom < layer->labelminscaledenom)) annotate = MS_FALSE; } status = msLayerOpen(layer); if (status != MS_SUCCESS) return MS_FAILURE; /* build item list */ status = msLayerWhichItems(layer, MS_FALSE, NULL); if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } /* identify target shapes */ if (layer->transform == MS_TRUE) { searchrect = map->extent; if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) msProjectRect( &map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ } else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } #ifdef USE_GEOS msInitShape(&searchpoly); msRectToPolygon(searchrect, &searchpoly); #endif status = msLayerWhichShapes(layer, searchrect, MS_FALSE); if (status == MS_DONE) { /* no overlap */ #ifdef USE_GEOS msFreeShape(&searchpoly); #endif msLayerClose(layer); hittest->status = 0; return MS_SUCCESS; } else if (status != MS_SUCCESS) { #ifdef USE_GEOS msFreeShape(&searchpoly); #endif msLayerClose(layer); return MS_FAILURE; } /* step through the target shapes */ msInitShape(&shape); nclasses = 0; classgroup = NULL; if (layer->classgroup && layer->numclasses > 0) classgroup = msAllocateValidClassGroups(layer, &nclasses); if (layer->minfeaturesize > 0) minfeaturesize = Pix2LayerGeoref(map, layer, layer->minfeaturesize); while ((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) { int drawmode = MS_DRAWMODE_FEATURES; #ifdef USE_GEOS if (!msGEOSIntersects(&shape, &searchpoly)) { msFreeShape(&shape); continue; } #else if (shape.type == MS_SHAPE_POLYGON) { msClipPolygonRect(&shape, map->extent); } else { msClipPolylineRect(&shape, map->extent); } if (shape.numlines == 0) { msFreeShape(&shape); continue; } #endif /* Check if the shape size is ok to be drawn, we need to clip */ if ((shape.type == MS_SHAPE_LINE || shape.type == MS_SHAPE_POLYGON) && (minfeaturesize > 0)) { msTransformShape(&shape, map->extent, map->cellsize, NULL); msComputeBounds(&shape); if (msShapeCheckSize(&shape, minfeaturesize) == MS_FALSE) { msFreeShape(&shape); continue; } } shape.classindex = msShapeGetClass(layer, map, &shape, classgroup, nclasses); if ((shape.classindex == -1) || (layer->class[shape.classindex] -> status == MS_OFF)) { msFreeShape(&shape); continue; } hittest->classhits[shape.classindex].status = 1; hittest->status = 1; if (maxfeatures >= 0 && featuresdrawn >= maxfeatures) { msFreeShape(&shape); status = MS_DONE; break; } featuresdrawn++; if (annotate && layer->class[shape.classindex] -> numlabels > 0) { drawmode |= MS_DRAWMODE_LABELS; } status = msHitTestShape( map, layer, &shape, drawmode, &hittest->classhits[shape.classindex]); /* all styles */ msFreeShape(&shape); } #ifdef USE_GEOS msFreeShape(&searchpoly); #endif if (classgroup) msFree(classgroup); if (status != MS_DONE) { msLayerClose(layer); return MS_FAILURE; } msLayerClose(layer); return MS_SUCCESS; } else { /* we don't hittest these layers, skip as they already have been initialized */ return MS_SUCCESS; } } int msHitTestMap(mapObj *map, map_hittest *hittest) { int i, status; map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); status = msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scaledenom); if (status != MS_SUCCESS) { return MS_FAILURE; } for (i = 0; i < map->numlayers; i++) { layerObj *lp = map->layers[i]; status = msHitTestLayer(map, lp, &hittest->layerhits[i]); if (status != MS_SUCCESS) { return MS_FAILURE; } } return MS_SUCCESS; } mapserver-8.4.0/src/hittest.h000066400000000000000000000051211474174441300161630ustar00rootroot00000000000000/***************************************************************************** * * Project: MapServer * Purpose: Content Dependent Legend rendering support * Author: Thomas Bonfort (tbonfort@terriscope.fr) * ****************************************************************************** * Copyright (c) 1996-2013 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef HITTEST_H #define HITTEST_H typedef struct { int status; } style_hittest; typedef struct { style_hittest *stylehits; int status; } label_hittest; typedef struct { style_hittest *stylehits; label_hittest *labelhits; int status; } class_hittest; typedef struct { class_hittest *classhits; int status; } layer_hittest; typedef struct map_hittest { layer_hittest *layerhits; } map_hittest; int msHitTestMap(mapObj *map, map_hittest *hittest); int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest); void initStyleHitTests(styleObj *s, style_hittest *sh, int default_status); void initLabelHitTests(labelObj *l, label_hittest *lh, int default_status); void initClassHitTests(classObj *c, class_hittest *ch, int default_status); void initLayerHitTests(layerObj *l, layer_hittest *lh); void initMapHitTests(mapObj *map, map_hittest *mh); void freeLabelHitTests(labelObj *l, label_hittest *lh); void freeClassHitTests(classObj *c, class_hittest *ch); void freeLayerHitTests(layerObj *l, layer_hittest *lh); void freeMapHitTests(mapObj *map, map_hittest *mh); #endif mapserver-8.4.0/src/idw.c000066400000000000000000000062631474174441300152650ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Inverse Distance Weighted layer interpolation. * Author: Hermes L. Herrera Martinez and the MapServer team. * Thanks: Thomas Bonfort * ****************************************************************************** * Copyright (c) 2014 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include #define EPSILON 0.000000001 #include void msIdw(float *xyz, int width, int height, int npoints, interpolationProcessingParams *interpParams, unsigned char *iValues) { int i, j, index; int radius = interpParams->radius; float power = interpParams->power; for (j = 0; j < height; j++) { for (i = 0; i < width; i++) { double den = EPSILON, num = 0; for (index = 0; index < npoints * 3; index += 3) { double d = (xyz[index] - i) * (xyz[index] - i) + (xyz[index + 1] - j) * (xyz[index + 1] - j); if (radius * radius > d) { double w = 1.0 / (pow(d, power) + EPSILON); num += w * xyz[index + 2]; den += w; } } iValues[j * width + i] = num / den; } } } void msIdwProcessing(layerObj *layer, interpolationProcessingParams *interpParams) { const char *interpParamsProcessing = msLayerGetProcessingKey(layer, "IDW_POWER"); if (interpParamsProcessing) { interpParams->power = atof(interpParamsProcessing); } else { interpParams->power = 1.0; } interpParamsProcessing = msLayerGetProcessingKey(layer, "IDW_RADIUS"); if (interpParamsProcessing) { interpParams->radius = atof(interpParamsProcessing); } else { interpParams->radius = MAX(layer->map->width, layer->map->height); } interpParamsProcessing = msLayerGetProcessingKey(layer, "IDW_COMPUTE_BORDERS"); if (interpParamsProcessing && strcasecmp(interpParamsProcessing, "OFF")) { interpParams->expand_searchrect = 1; } else { interpParams->expand_searchrect = 0; } } mapserver-8.4.0/src/interpolation.c000066400000000000000000000266631474174441300173770ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: KernelDensity layer implementation and related functions. * Author: Hermes L. Herrera and the MapServer team. * ****************************************************************************** * Copyright (c) 2014 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include #include "gdal.h" #include "cpl_string.h" /****************************************************************************** * kernel density. ******************************************************************************/ void msKernelDensity(imageObj *image, float *values, int width, int height, int npoints, interpolationProcessingParams *interpParams, unsigned char *iValues); void msKernelDensityProcessing(layerObj *layer, interpolationProcessingParams *interpParams); /****************************************************************************** * kernel density. ******************************************************************************/ void msIdw(float *xyz, int width, int height, int npoints, interpolationProcessingParams *interpParams, unsigned char *iValues); void msIdwProcessing(layerObj *layer, interpolationProcessingParams *interpParams); //---------------------------------------------------------------------------// int msInterpolationDataset(mapObj *map, imageObj *image, layerObj *interpolation_layer, void **hDSvoid, void **cleanup_ptr) { int status, layer_idx, i, npoints = 0, length = 0; rectObj searchrect; shapeObj shape; layerObj *layer = NULL; float *values = NULL, *xyz_values = NULL; int im_width = image->width, im_height = image->height; double invcellsize = 1.0 / map->cellsize, georadius = 0; unsigned char *iValues; GDALDatasetH hDS; interpolationProcessingParams interpParams; memset(&interpParams, 0, sizeof(interpParams)); assert(interpolation_layer->connectiontype == MS_KERNELDENSITY || interpolation_layer->connectiontype == MS_IDW); *cleanup_ptr = NULL; if (!interpolation_layer->connection || !*interpolation_layer->connection) { msSetError(MS_MISCERR, "msInterpolationDataset()", "Interpolation layer has no CONNECTION defined"); return MS_FAILURE; } if (interpolation_layer->connectiontype == MS_KERNELDENSITY) { msKernelDensityProcessing(interpolation_layer, &interpParams); } else if (interpolation_layer->connectiontype == MS_IDW) { msIdwProcessing(interpolation_layer, &interpParams); } layer_idx = msGetLayerIndex(map, interpolation_layer->connection); if (layer_idx == -1) { int nLayers, *aLayers; aLayers = msGetLayersIndexByGroup(map, interpolation_layer->connection, &nLayers); if (!aLayers || !nLayers) { msSetError(MS_MISCERR, "Interpolation layer (%s) references unknown layer (%s)", "msInterpolationDataset()", interpolation_layer->name, interpolation_layer->connection); return (MS_FAILURE); } for (i = 0; i < nLayers; i++) { layer_idx = aLayers[i]; layer = GET_LAYER(map, layer_idx); if (msScaleInBounds(map->scaledenom, layer->minscaledenom, layer->maxscaledenom)) break; } free(aLayers); if (i == nLayers) { msSetError( MS_MISCERR, "Interpolation layer (%s) references no layer for current scale", "msInterpolationDataset()", interpolation_layer->name); return (MS_FAILURE); } } else { layer = GET_LAYER(map, layer_idx); } /* open the linked layer */ status = msLayerOpen(layer); if (status != MS_SUCCESS) return MS_FAILURE; status = msLayerWhichItems(layer, MS_FALSE, NULL); if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } /* identify target shapes */ if (layer->transform == MS_TRUE) { searchrect = map->extent; if (interpParams.expand_searchrect) { georadius = interpParams.radius * map->cellsize; searchrect.minx -= georadius; searchrect.miny -= georadius; searchrect.maxx += georadius; searchrect.maxy += georadius; im_width += 2 * interpParams.radius; im_height += 2 * interpParams.radius; } } else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); if (layer->project) msProjectRect(&map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ status = msLayerWhichShapes(layer, searchrect, MS_FALSE); /* nothing to do */ if (status == MS_SUCCESS) { /* at least one sample may have overlapped */ int nclasses = 0; int *classgroup = NULL; if (layer->classgroup && layer->numclasses > 0) classgroup = msAllocateValidClassGroups(layer, &nclasses); msInitShape(&shape); while ((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) { int l, p, s, c; double weight = 1.0; if (!values) { /* defer allocation until we effectively have a feature */ values = (float *)msSmallCalloc(((size_t)im_width) * im_height, sizeof(float)); xyz_values = (float *)msSmallCalloc(((size_t)im_width) * im_height, sizeof(float)); } if (layer->project) msProjectShape(&layer->projection, &map->projection, &shape); /* the weight for the sample is set to 1.0 by default. If the * layer has some classes defined, we will read the weight from * the class->style->size (which can be binded to an attribute) */ if (layer->numclasses > 0) { c = msShapeGetClass(layer, map, &shape, classgroup, nclasses); if ((c == -1) || (layer->class[c] -> status == MS_OFF)) { goto nextshape; /* no class matched, skip */ } for (s = 0; s < layer->class[c] -> numstyles; s++) { if (msScaleInBounds( map->scaledenom, layer->class[c] -> styles[s] -> minscaledenom, layer -> class[c] -> styles[s] -> maxscaledenom)) { if (layer->class[c] -> styles[s] -> bindings[MS_STYLE_BINDING_SIZE].index != -1) { weight = atof(shape.values[layer->class[c] -> styles[s] -> bindings[MS_STYLE_BINDING_SIZE].index]); } else { weight = layer->class[c]->styles[s]->size; } break; } } if (s == layer->class[c] -> numstyles) { /* no style in scale bounds */ goto nextshape; } } for (l = 0; l < shape.numlines; l++) { for (p = 0; p < shape.line[l].numpoints; p++) { int x = MS_MAP2IMAGE_XCELL_IC(shape.line[l].point[p].x, map->extent.minx - georadius, invcellsize); int y = MS_MAP2IMAGE_YCELL_IC(shape.line[l].point[p].y, map->extent.maxy + georadius, invcellsize); if (x >= 0 && y >= 0 && x < im_width && y < im_height) { float *value = values + y * im_width + x; (*value) += weight; xyz_values[length++] = x; xyz_values[length++] = y; xyz_values[length++] = (*value); } } } nextshape: msFreeShape(&shape); } msFree(classgroup); // number of layer points. npoints = length / 3; } else if (status != MS_DONE) { msLayerClose(layer); return MS_FAILURE; } /* status == MS_DONE */ msLayerClose(layer); status = MS_SUCCESS; if (npoints > 0 && interpParams.expand_searchrect) { iValues = msSmallMalloc(sizeof(unsigned char) * image->width * image->height); } else { iValues = msSmallCalloc(1, sizeof(unsigned char) * image->width * image->height); } if (npoints > 0) { /* no use applying the filtering kernel if we have no samples */ if (interpolation_layer->connectiontype == MS_KERNELDENSITY) { msKernelDensity(image, values, im_width, im_height, npoints, &interpParams, iValues); } else if (interpolation_layer->connectiontype == MS_IDW) { msIdw(xyz_values, image->width, image->height, npoints, &interpParams, iValues); } } free(values); free(xyz_values); GDALDriverH hMemDRV = GDALGetDriverByName("MEM"); if (!hMemDRV) { msSetError(MS_IOERR, "GDAL MEM driver not available", "msInterpolationDataset()"); free(iValues); return MS_FAILURE; } hDS = GDALCreate(hMemDRV, "", image->width, image->height, 0, 0, NULL); if (hDS == NULL) { msSetError(MS_IMGERR, "Unable to create GDAL Memory dataset.", "msInterpolationDataset()"); free(iValues); return MS_FAILURE; } char pointer[64]; memset(pointer, 0, sizeof(pointer)); CPLPrintPointer(pointer, iValues, sizeof(pointer)); char **papszOptions = CSLSetNameValue(NULL, "DATAPOINTER", pointer); CPLErr eErr = GDALAddBand(hDS, GDT_Byte, papszOptions); CSLDestroy(papszOptions); if (eErr != CE_None) { msSetError(MS_IMGERR, "Unable to add band to GDAL Memory dataset.", "msInterpolationDataset()"); free(iValues); GDALClose(hDS); return MS_FAILURE; } double adfGeoTransform[6]; adfGeoTransform[0] = map->extent.minx - map->cellsize * 0.5; /* top left x */ adfGeoTransform[1] = map->cellsize; /* w-e pixel resolution */ adfGeoTransform[2] = 0; /* 0 */ adfGeoTransform[3] = map->extent.maxy + map->cellsize * 0.5; /* top left y */ adfGeoTransform[4] = 0; /* 0 */ adfGeoTransform[5] = -map->cellsize; /* n-s pixel resolution (negative value) */ GDALSetGeoTransform(hDS, adfGeoTransform); *hDSvoid = hDS; *cleanup_ptr = (void *)iValues; return status; } int msCleanupInterpolationDataset(mapObj *map, imageObj *image, layerObj *layer, void *cleanup_ptr) { (void)map; (void)image; (void)layer; free(cleanup_ptr); return MS_SUCCESS; } mapserver-8.4.0/src/kerneldensity.c000066400000000000000000000130431474174441300173540ustar00rootroot00000000000000 /****************************************************************************** * * Project: MapServer * Purpose: KernelDensity layer implementation and related functions. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 2014 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include #include "gdal.h" static void gaussian_blur(float *values, int width, int height, int radius) { float *tmp = (float *)msSmallMalloc(sizeof(float) * width * height); int length = radius * 2 + 1; float *kernel = (float *)msSmallMalloc(length * sizeof(float)); float sigma = radius / 3.0; float a = 1.0 / sqrt(2.0 * M_PI * sigma * sigma); float den = 2.0 * sigma * sigma; int i, x, y; for (i = 0; i < length; i++) { float x = i - radius; float v = a * exp(-(x * x) / den); kernel[i] = v; } memset(tmp, 0, sizeof(float) * width * height); for (y = 0; y < height; y++) { float *src_row = values + width * y; float *dst_row = tmp + width * y; for (x = radius; x < width - radius; x++) { float accum = 0; for (i = 0; i < length; i++) { accum += src_row[x + i - radius] * kernel[i]; } dst_row[x] = accum; } } for (x = 0; x < width; x++) { float *src_col = tmp + x; float *dst_col = values + x; for (y = radius; y < height - radius; y++) { float accum = 0; for (i = 0; i < length; i++) { accum += src_col[width * (y + i - radius)] * kernel[i]; } dst_col[y * width] = accum; } } free(tmp); free(kernel); } void msKernelDensityProcessing(layerObj *layer, interpolationProcessingParams *interpParams) { const char *interpParamsProcessing = msLayerGetProcessingKey(layer, "KERNELDENSITY_RADIUS"); if (interpParamsProcessing) { interpParams->radius = atoi(interpParamsProcessing); } else { interpParams->radius = 10; } interpParamsProcessing = msLayerGetProcessingKey(layer, "KERNELDENSITY_COMPUTE_BORDERS"); if (interpParamsProcessing && strcasecmp(interpParamsProcessing, "OFF")) { interpParams->expand_searchrect = 1; } else { interpParams->expand_searchrect = 0; } interpParamsProcessing = msLayerGetProcessingKey(layer, "KERNELDENSITY_NORMALIZATION"); if (!interpParamsProcessing || !strcasecmp(interpParamsProcessing, "AUTO")) { interpParams->normalization_scale = 0.0; } else { interpParams->normalization_scale = atof(interpParamsProcessing); if (interpParams->normalization_scale != 0) { interpParams->normalization_scale = 1.0 / interpParams->normalization_scale; } else { interpParams->normalization_scale = 1.0; } } } void msKernelDensity(imageObj *image, float *values, int width, int height, int npoints, interpolationProcessingParams *interpParams, unsigned char *iValues) { int i, j; float valmax = FLT_MIN, valmin = FLT_MAX; int radius = interpParams->radius; float normalization_scale = interpParams->normalization_scale; int expand_searchrect = interpParams->expand_searchrect; gaussian_blur(values, width, height, radius); if (normalization_scale == 0.0) { /* auto normalization */ for (j = radius; j < height - radius; j++) { for (i = radius; i < width - radius; i++) { float val = values[j * width + i]; if (val > 0 && val > valmax) { valmax = val; } if (val > 0 && val < valmin) { valmin = val; } } } } else { valmin = 0; valmax = normalization_scale; } if (expand_searchrect) { for (j = 0; j < image->height; j++) { for (i = 0; i < image->width; i++) { float norm = (values[(j + radius) * width + i + radius] - valmin) / valmax; int v = 255 * norm; if (v < 0) v = 0; else if (v > 255) v = 255; iValues[j * image->width + i] = v; } } } else { if (npoints > 0) { for (j = radius; j < image->height - radius; j++) { for (i = radius; i < image->width - radius; i++) { float norm = (values[j * width + i] - valmin) / valmax; int v = 255 * norm; if (v < 0) v = 0; else if (v > 255) v = 255; iValues[j * image->width + i] = v; } } } } } mapserver-8.4.0/src/layerobject.c000066400000000000000000000141711474174441300170020ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions for operating on a layerObj that don't belong in a * more specific file such as mapfile.c. * Adapted from mapobject.c. * Author: Sean Gillies, sgillies@frii.com * ****************************************************************************** * Copyright (c) 2004, Sean Gillies * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" /* =========================================================================== msInsertClass Returns the index at which the class was inserted. ======================================================================== */ int msInsertClass(layerObj *layer, classObj *classobj, int nIndex) { int i; if (!classobj) { msSetError(MS_CHILDERR, "Cannot insert NULL class", "msInsertClass()"); return -1; } /* Ensure there is room for a new class */ if (msGrowLayerClasses(layer) == NULL) { return -1; } /* Catch attempt to insert past end of styles array */ else if (nIndex >= layer->numclasses) { msSetError(MS_CHILDERR, "Cannot insert class beyond index %d", "msInsertClass()", layer->numclasses - 1); return -1; } else if (nIndex < 0) { /* Insert at the end by default */ #ifndef __cplusplus layer->class[layer->numclasses] = classobj; #else layer->_class[layer->numclasses] = classobj; #endif /* set parent pointer */ classobj->layer = layer; MS_REFCNT_INCR(classobj); layer->numclasses++; return layer->numclasses - 1; } else { /* Copy classes existing at the specified nIndex or greater */ /* to an index one higher */ #ifndef __cplusplus for (i = layer->numclasses - 1; i >= nIndex; i--) layer->class[i + 1] = layer->class[i]; layer->class[nIndex] = classobj; #else for (i = layer->numclasses - 1; i >= nIndex; i--) layer->_class[i + 1] = layer->_class[i]; layer->_class[nIndex] = classobj; #endif /* set parent pointer */ classobj->layer = layer; MS_REFCNT_INCR(classobj); /* increment number of classes and return */ layer->numclasses++; return nIndex; } } /* =========================================================================== msRemoveClass remove the class at an index from a layer, returning a copy ======================================================================== */ classObj *msRemoveClass(layerObj *layer, int nIndex) { int i; classObj *classobj; if (nIndex < 0 || nIndex >= layer->numclasses) { msSetError(MS_CHILDERR, "Cannot remove class, invalid index %d", "removeClass()", nIndex); return NULL; } else { #ifndef __cplusplus classobj = layer->class[nIndex]; #else classobj = layer->_class[nIndex]; #endif classobj->layer = NULL; MS_REFCNT_DECR(classobj); /* Iteratively copy the higher index classes down one index */ for (i = nIndex; i < layer->numclasses - 1; i++) { #ifndef __cplusplus layer->class[i] = layer->class[i + 1]; #else layer->_class[i] = layer->_class[i + 1]; #endif } #ifndef __cplusplus layer->class[i] = NULL; #else layer->_class[i] = NULL; #endif /* decrement number of layers and return copy of removed layer */ layer->numclasses--; return classobj; } } /** * Move the class up inside the array of classes. */ int msMoveClassUp(layerObj *layer, int nClassIndex) { classObj *psTmpClass = NULL; if (layer && nClassIndex < layer->numclasses && nClassIndex > 0) { psTmpClass = layer->class[nClassIndex]; layer->class[nClassIndex] = layer->class[nClassIndex - 1]; layer->class[nClassIndex - 1] = psTmpClass; return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveClassUp()", nClassIndex); return (MS_FAILURE); } /** * Move the class down inside the array of classes. */ int msMoveClassDown(layerObj *layer, int nClassIndex) { classObj *psTmpClass = NULL; if (layer && nClassIndex < layer->numclasses - 1 && nClassIndex >= 0) { psTmpClass = layer->class[nClassIndex]; layer->class[nClassIndex] = layer->class[nClassIndex + 1]; layer->class[nClassIndex + 1] = psTmpClass; return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveClassDown()", nClassIndex); return (MS_FAILURE); } /** * Set the extent of a layer. */ int msLayerSetExtent(layerObj *layer, double minx, double miny, double maxx, double maxy) { layer->extent.minx = minx; layer->extent.miny = miny; layer->extent.maxx = maxx; layer->extent.maxy = maxy; if (minx == -1.0 && miny == -1.0 && maxx == -1.0 && maxy == -1.0) return (MS_SUCCESS); if (!MS_VALID_EXTENT(layer->extent)) { msSetError(MS_MISCERR, "Given layer extent is invalid. minx=%lf, miny=%lf, maxx=%lf, " "maxy=%lf.", "msLayerSetExtent()", layer->extent.minx, layer->extent.miny, layer->extent.maxx, layer->extent.maxy); return (MS_FAILURE); } return (MS_SUCCESS); } mapserver-8.4.0/src/mapagg.cpp000066400000000000000000001414771474174441300163050ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: AGG rendering and other AGG related functions. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2007 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "fontcache.h" #include "mapagg.h" #include #include "renderers/agg/include/agg_color_rgba.h" #include "renderers/agg/include/agg_pixfmt_rgba.h" #include "renderers/agg/include/agg_renderer_base.h" #include "renderers/agg/include/agg_renderer_scanline.h" #include "renderers/agg/include/agg_math_stroke.h" #include "renderers/agg/include/agg_scanline_p.h" #include "renderers/agg/include/agg_scanline_u.h" #include "renderers/agg/include/agg_rasterizer_scanline_aa.h" #include "renderers/agg/include/agg_span_pattern_rgba.h" #include "renderers/agg/include/agg_span_allocator.h" #include "renderers/agg/include/agg_span_interpolator_linear.h" #include "renderers/agg/include/agg_pattern_filters_rgba.h" #include "renderers/agg/include/agg_image_accessors.h" #include "renderers/agg/include/agg_conv_stroke.h" #include "renderers/agg/include/agg_conv_dash.h" #include "renderers/agg/include/agg_font_freetype.h" #include "renderers/agg/include/agg_conv_contour.h" #include "renderers/agg/include/agg_ellipse.h" #include "renderers/agg/include/agg_gamma_functions.h" #include "renderers/agg/include/agg_blur.h" #include "renderers/agg/include/agg_rasterizer_outline_aa.h" #include "renderers/agg/include/agg_renderer_outline_aa.h" #include "renderers/agg/include/agg_renderer_outline_image.h" #include "renderers/agg/include/agg_span_pattern_rgba.h" #include "renderers/agg/include/agg_span_image_filter_rgba.h" #include "renderers/agg/include/agg_glyph_raster_bin.h" #include "renderers/agg/include/agg_renderer_raster_text.h" #include "renderers/agg/include/agg_path_storage_integer.h" #include "renderers/agg/include/agg_conv_clipper.h" #include "cpl_conv.h" // CPLGetConfigOption #include "cpl_string.h" // CPLTestBool #ifdef USE_PIXMAN #include #endif #include #include #include #include typedef mapserver::order_bgra band_order; #define AGG_LINESPACE 1.33 typedef mapserver::int8u band_type; typedef mapserver::rgba8 color_type; typedef mapserver::pixel32_type pixel_type; typedef mapserver::blender_rgba_pre blender_pre; typedef mapserver::comp_op_adaptor_rgba_pre compop_blender_pre; typedef mapserver::pixfmt_alpha_blend_rgba< blender_pre, mapserver::rendering_buffer, pixel_type> pixel_format; typedef mapserver::pixfmt_custom_blend_rgba compop_pixel_format; typedef mapserver::rendering_buffer rendering_buffer; typedef mapserver::renderer_base renderer_base; typedef mapserver::renderer_base compop_renderer_base; typedef mapserver::renderer_scanline_aa_solid renderer_scanline; typedef mapserver::renderer_scanline_bin_solid renderer_scanline_aliased; typedef mapserver::rasterizer_scanline_aa<> rasterizer_scanline; typedef mapserver::font_engine_freetype_int16 font_engine_type; typedef mapserver::font_cache_manager font_manager_type; typedef mapserver::conv_curve font_curve_type; typedef mapserver::glyph_raster_bin glyph_gen; static const color_type AGG_NO_COLOR = color_type(0, 0, 0, 0); #define aggColor(c) \ mapserver::rgba8_pre((c)->red, (c)->green, (c)->blue, (c)->alpha) class aggRendererCache { public: font_engine_type m_feng; font_manager_type m_fman; aggRendererCache() : m_fman(m_feng) {} }; class AGG2Renderer { public: std::vector buffer{}; rendering_buffer m_rendering_buffer; pixel_format m_pixel_format; compop_pixel_format m_compop_pixel_format; renderer_base m_renderer_base; compop_renderer_base m_compop_renderer_base; renderer_scanline m_renderer_scanline; renderer_scanline_aliased m_renderer_scanline_aliased; rasterizer_scanline m_rasterizer_aa; rasterizer_scanline m_rasterizer_aa_gamma; mapserver::scanline_p8 sl_poly; /*packed scanlines, works faster when the area is larger than the perimeter, in number of pixels*/ mapserver::scanline_u8 sl_line; /*unpacked scanlines, works faster if the area is roughly equal to the perimeter, in number of pixels*/ bool use_alpha = false; std::unique_ptr> stroke{}; std::unique_ptr> dash{}; std::unique_ptr>> stroke_dash{}; double default_gamma = 0.0; mapserver::gamma_linear gamma_function; }; #define AGG_RENDERER(image) ((AGG2Renderer *)(image)->img.plugin) template static void applyCJC(VertexSource &stroke, int caps, int joins) { switch (joins) { case MS_CJC_ROUND: stroke.line_join(mapserver::round_join); break; case MS_CJC_MITER: stroke.line_join(mapserver::miter_join); break; case MS_CJC_BEVEL: case MS_CJC_NONE: stroke.line_join(mapserver::bevel_join); break; } switch (caps) { case MS_CJC_BUTT: case MS_CJC_NONE: stroke.line_cap(mapserver::butt_cap); break; case MS_CJC_ROUND: stroke.line_cap(mapserver::round_cap); break; case MS_CJC_SQUARE: stroke.line_cap(mapserver::square_cap); break; } } int agg2RenderLine(imageObj *img, shapeObj *p, strokeStyleObj *style) { AGG2Renderer *r = AGG_RENDERER(img); line_adaptor lines = line_adaptor(p); r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); if (style->antialiased == MS_FALSE) { r->m_renderer_scanline_aliased.color(aggColor(style->color)); } else { r->m_renderer_scanline.color(aggColor(style->color)); } if (style->patternlength <= 0) { if (!r->stroke) { r->stroke.reset(new mapserver::conv_stroke(lines)); } else { r->stroke->attach(lines); } r->stroke->width(style->width); if (style->width > 1) { applyCJC(*r->stroke, style->linecap, style->linejoin); } else { r->stroke->inner_join(mapserver::inner_bevel); r->stroke->line_join(mapserver::bevel_join); } r->m_rasterizer_aa.add_path(*r->stroke); } else { if (!r->dash) { r->dash.reset(new mapserver::conv_dash(lines)); } else { r->dash->remove_all_dashes(); r->dash->dash_start(0.0); r->dash->attach(lines); } if (!r->stroke_dash) { r->stroke_dash.reset( new mapserver::conv_stroke>( *r->dash)); } else { r->stroke_dash->attach(*r->dash); } int patt_length = 0; for (int i = 0; i < style->patternlength; i += 2) { if (i < style->patternlength - 1) { r->dash->add_dash(MS_MAX(1, MS_NINT(style->pattern[i])), MS_MAX(1, MS_NINT(style->pattern[i + 1]))); if (style->patternoffset) { patt_length += MS_MAX(1, MS_NINT(style->pattern[i])) + MS_MAX(1, MS_NINT(style->pattern[i + 1])); } } } if (style->patternoffset > 0) { r->dash->dash_start(patt_length - style->patternoffset); } r->stroke_dash->width(style->width); if (style->width > 1) { applyCJC(*r->stroke_dash, style->linecap, style->linejoin); } else { r->stroke_dash->inner_join(mapserver::inner_bevel); r->stroke_dash->line_join(mapserver::bevel_join); } r->m_rasterizer_aa.add_path(*r->stroke_dash); } if (style->antialiased == MS_FALSE) mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline_aliased); else mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline); return MS_SUCCESS; } int agg2RenderLineTiled(imageObj *img, shapeObj *p, imageObj *tile) { mapserver::pattern_filter_bilinear_rgba8 fltr; typedef mapserver::line_image_pattern< mapserver::pattern_filter_bilinear_rgba8> pattern_type; typedef mapserver::renderer_outline_image renderer_img_type; typedef mapserver::rasterizer_outline_aa rasterizer_img_type; pattern_type patt(fltr); AGG2Renderer *r = AGG_RENDERER(img); AGG2Renderer *tileRenderer = AGG_RENDERER(tile); line_adaptor lines(p); patt.create(tileRenderer->m_pixel_format); renderer_img_type ren_img(r->m_renderer_base, patt); rasterizer_img_type ras_img(ren_img); ras_img.add_path(lines); return MS_SUCCESS; } int agg2RenderPolygon(imageObj *img, shapeObj *p, colorObj *color) { AGG2Renderer *r = AGG_RENDERER(img); polygon_adaptor polygons(p); r->m_rasterizer_aa_gamma.reset(); r->m_rasterizer_aa_gamma.filling_rule(mapserver::fill_even_odd); r->m_rasterizer_aa_gamma.add_path(polygons); r->m_renderer_scanline.color(aggColor(color)); mapserver::render_scanlines(r->m_rasterizer_aa_gamma, r->sl_poly, r->m_renderer_scanline); return MS_SUCCESS; } static inline double int26p6_to_dbl(int p) { return double(p) / 64.0; } template bool decompose_ft_outline(const FT_Outline &outline, bool flip_y, const mapserver::trans_affine &mtx, PathStorage &path) { double x1, y1, x2, y2, x3, y3; FT_Vector *point; FT_Vector *limit; unsigned n; // index of contour in outline unsigned first; // index of first point in contour char tag; // current point's state first = 0; for (n = 0; n < (unsigned)outline.n_contours; n++) { int last; // index of last point in contour last = outline.contours[n]; limit = outline.points + last; FT_Vector v_start = outline.points[first]; FT_Vector v_control = v_start; point = outline.points + first; auto tags = outline.tags + first; tag = FT_CURVE_TAG(tags[0]); // A contour cannot start with a cubic control point! if (tag == FT_CURVE_TAG_CUBIC) return false; // check first point to determine origin if (tag == FT_CURVE_TAG_CONIC) { const FT_Vector v_last = outline.points[last]; // first point is conic control. Yes, this happens. if (FT_CURVE_TAG(outline.tags[last]) == FT_CURVE_TAG_ON) { // start at last point if it is on the curve v_start = v_last; limit--; } else { // if both first and last points are conic, // start at their middle and record its position // for closure v_start.x = (v_start.x + v_last.x) / 2; v_start.y = (v_start.y + v_last.y) / 2; } point--; tags--; } x1 = int26p6_to_dbl(v_start.x); y1 = int26p6_to_dbl(v_start.y); if (flip_y) y1 = -y1; mtx.transform(&x1, &y1); path.move_to(x1, y1); while (point < limit) { point++; tags++; tag = FT_CURVE_TAG(tags[0]); switch (tag) { case FT_CURVE_TAG_ON: // emit a single line_to { x1 = int26p6_to_dbl(point->x); y1 = int26p6_to_dbl(point->y); if (flip_y) y1 = -y1; mtx.transform(&x1, &y1); path.line_to(x1, y1); // path.line_to(conv(point->x), flip_y ? -conv(point->y) : // conv(point->y)); continue; } case FT_CURVE_TAG_CONIC: // consume conic arcs { v_control.x = point->x; v_control.y = point->y; Do_Conic: if (point < limit) { FT_Vector vec; FT_Vector v_middle; point++; tags++; tag = FT_CURVE_TAG(tags[0]); vec.x = point->x; vec.y = point->y; if (tag == FT_CURVE_TAG_ON) { x1 = int26p6_to_dbl(v_control.x); y1 = int26p6_to_dbl(v_control.y); x2 = int26p6_to_dbl(vec.x); y2 = int26p6_to_dbl(vec.y); if (flip_y) { y1 = -y1; y2 = -y2; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); path.curve3(x1, y1, x2, y2); continue; } if (tag != FT_CURVE_TAG_CONIC) return false; v_middle.x = (v_control.x + vec.x) / 2; v_middle.y = (v_control.y + vec.y) / 2; x1 = int26p6_to_dbl(v_control.x); y1 = int26p6_to_dbl(v_control.y); x2 = int26p6_to_dbl(v_middle.x); y2 = int26p6_to_dbl(v_middle.y); if (flip_y) { y1 = -y1; y2 = -y2; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); path.curve3(x1, y1, x2, y2); // path.curve3(conv(v_control.x), // flip_y ? -conv(v_control.y) : conv(v_control.y), // conv(v_middle.x), // flip_y ? -conv(v_middle.y) : conv(v_middle.y)); v_control = vec; goto Do_Conic; } x1 = int26p6_to_dbl(v_control.x); y1 = int26p6_to_dbl(v_control.y); x2 = int26p6_to_dbl(v_start.x); y2 = int26p6_to_dbl(v_start.y); if (flip_y) { y1 = -y1; y2 = -y2; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); path.curve3(x1, y1, x2, y2); // path.curve3(conv(v_control.x), // flip_y ? -conv(v_control.y) : conv(v_control.y), // conv(v_start.x), // flip_y ? -conv(v_start.y) : conv(v_start.y)); goto Close; } default: // FT_CURVE_TAG_CUBIC { FT_Vector vec1, vec2; if (point + 1 > limit || FT_CURVE_TAG(tags[1]) != FT_CURVE_TAG_CUBIC) { return false; } vec1.x = point[0].x; vec1.y = point[0].y; vec2.x = point[1].x; vec2.y = point[1].y; point += 2; tags += 2; if (point <= limit) { FT_Vector vec; vec.x = point->x; vec.y = point->y; x1 = int26p6_to_dbl(vec1.x); y1 = int26p6_to_dbl(vec1.y); x2 = int26p6_to_dbl(vec2.x); y2 = int26p6_to_dbl(vec2.y); x3 = int26p6_to_dbl(vec.x); y3 = int26p6_to_dbl(vec.y); if (flip_y) { y1 = -y1; y2 = -y2; y3 = -y3; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); mtx.transform(&x3, &y3); path.curve4(x1, y1, x2, y2, x3, y3); // path.curve4(conv(vec1.x), // flip_y ? -conv(vec1.y) : conv(vec1.y), // conv(vec2.x), // flip_y ? -conv(vec2.y) : conv(vec2.y), // conv(vec.x), // flip_y ? -conv(vec.y) : conv(vec.y)); continue; } x1 = int26p6_to_dbl(vec1.x); y1 = int26p6_to_dbl(vec1.y); x2 = int26p6_to_dbl(vec2.x); y2 = int26p6_to_dbl(vec2.y); x3 = int26p6_to_dbl(v_start.x); y3 = int26p6_to_dbl(v_start.y); if (flip_y) { y1 = -y1; y2 = -y2; y3 = -y3; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); mtx.transform(&x3, &y3); path.curve4(x1, y1, x2, y2, x3, y3); // path.curve4(conv(vec1.x), // flip_y ? -conv(vec1.y) : conv(vec1.y), // conv(vec2.x), // flip_y ? -conv(vec2.y) : conv(vec2.y), // conv(v_start.x), // flip_y ? -conv(v_start.y) : conv(v_start.y)); goto Close; } } } path.close_polygon(); Close: first = last + 1; } return true; } int agg2RenderPolygonTiled(imageObj *img, shapeObj *p, imageObj *tile) { assert(img->format->renderer == tile->format->renderer); AGG2Renderer *r = AGG_RENDERER(img); AGG2Renderer *tileRenderer = AGG_RENDERER(tile); polygon_adaptor polygons(p); typedef mapserver::wrap_mode_repeat wrap_type; typedef mapserver::image_accessor_wrap img_source_type; typedef mapserver::span_pattern_rgba span_gen_type; mapserver::span_allocator sa; r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_even_odd); img_source_type img_src(tileRenderer->m_pixel_format); span_gen_type sg(img_src, 0, 0); r->m_rasterizer_aa.add_path(polygons); mapserver::render_scanlines_aa(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_base, sa, sg); return MS_SUCCESS; } int agg2RenderGlyphsPath(imageObj *img, const textSymbolObj *ts, colorObj *c, colorObj *oc, int ow, int /*isMarker*/) { const textPathObj *tp = ts->textpath; mapserver::path_storage glyphs; mapserver::trans_affine trans; AGG2Renderer *r = AGG_RENDERER(img); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); for (int i = 0; i < tp->numglyphs; i++) { glyphObj *gl = tp->glyphs + i; trans.reset(); trans.rotate(-gl->rot); trans.translate(gl->pnt.x, gl->pnt.y); outline_element *ol = msGetGlyphOutline(gl->face, gl->glyph); if (!ol) { return MS_FAILURE; } decompose_ft_outline(ol->outline, true, trans, glyphs); } mapserver::conv_curve m_curves(glyphs); if (oc) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); mapserver::conv_contour> cc( m_curves); cc.width(ow + 1); r->m_rasterizer_aa.add_path(cc); r->m_renderer_scanline.color(aggColor(oc)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline); } if (c) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); r->m_rasterizer_aa.add_path(m_curves); r->m_renderer_scanline.color(aggColor(c)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline); } return MS_SUCCESS; } mapserver::path_storage imageVectorSymbol(symbolObj *symbol) { mapserver::path_storage path; int is_new = 1; for (int i = 0; i < symbol->numpoints; i++) { if ((symbol->points[i].x == -99) && (symbol->points[i].y == -99)) is_new = 1; else { if (is_new) { path.move_to(symbol->points[i].x, symbol->points[i].y); is_new = 0; } else { path.line_to(symbol->points[i].x, symbol->points[i].y); } } } return path; } int agg2RenderVectorSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { AGG2Renderer *r = AGG_RENDERER(img); double ox = symbol->sizex * 0.5; double oy = symbol->sizey * 0.5; mapserver::path_storage path = imageVectorSymbol(symbol); mapserver::trans_affine mtx; mtx *= mapserver::trans_affine_translation(-ox, -oy); mtx *= mapserver::trans_affine_scaling(style->scale); mtx *= mapserver::trans_affine_rotation(-style->rotation); mtx *= mapserver::trans_affine_translation(x, y); path.transform(mtx); if (style->color) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_even_odd); r->m_rasterizer_aa.add_path(path); r->m_renderer_scanline.color(aggColor(style->color)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_scanline); } if (style->outlinecolor) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); r->m_renderer_scanline.color(aggColor(style->outlinecolor)); mapserver::conv_stroke stroke(path); stroke.width(style->outlinewidth); r->m_rasterizer_aa.add_path(stroke); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_scanline); } return MS_SUCCESS; } int agg2RenderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { AGG2Renderer *r = AGG_RENDERER(img); rasterBufferObj *pixmap = symbol->pixmap_buffer; assert(pixmap->type == MS_BUFFER_BYTE_RGBA); rendering_buffer b(pixmap->data.rgba.pixels, pixmap->width, pixmap->height, pixmap->data.rgba.row_step); pixel_format pf(b); r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); if ((style->rotation != 0 && style->rotation != MS_PI * 2.) || style->scale != 1) { mapserver::trans_affine image_mtx; image_mtx *= mapserver::trans_affine_translation(-(pf.width() / 2.), -(pf.height() / 2.)); /*agg angles are antitrigonometric*/ image_mtx *= mapserver::trans_affine_rotation(-style->rotation); image_mtx *= mapserver::trans_affine_scaling(style->scale); image_mtx *= mapserver::trans_affine_translation(x, y); image_mtx.invert(); typedef mapserver::span_interpolator_linear<> interpolator_type; interpolator_type interpolator(image_mtx); mapserver::span_allocator sa; // "hardcoded" bilinear filter //------------------------------------------ typedef mapserver::span_image_filter_rgba_bilinear_clip span_gen_type; span_gen_type sg(pf, mapserver::rgba(0, 0, 0, 0), interpolator); mapserver::path_storage pixmap_bbox; int ims_2 = MS_NINT(MS_MAX(pixmap->width, pixmap->height) * style->scale * 1.415) / 2 + 1; pixmap_bbox.move_to(x - ims_2, y - ims_2); pixmap_bbox.line_to(x + ims_2, y - ims_2); pixmap_bbox.line_to(x + ims_2, y + ims_2); pixmap_bbox.line_to(x - ims_2, y + ims_2); r->m_rasterizer_aa.add_path(pixmap_bbox); mapserver::render_scanlines_aa(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_base, sa, sg); } else { // just copy the image at the correct location (we place the pixmap on // the nearest integer pixel to avoid blurring) r->m_renderer_base.blend_from(pf, 0, MS_NINT(x - pixmap->width / 2.), MS_NINT(y - pixmap->height / 2.)); } return MS_SUCCESS; } int agg2RenderEllipseSymbol(imageObj *image, double x, double y, symbolObj *symbol, symbolStyleObj *style) { AGG2Renderer *r = AGG_RENDERER(image); mapserver::path_storage path; mapserver::ellipse ellipse(x, y, symbol->sizex * style->scale / 2, symbol->sizey * style->scale / 2); path.concat_path(ellipse); if (style->rotation != 0) { mapserver::trans_affine mtx; mtx *= mapserver::trans_affine_translation(-x, -y); /*agg angles are antitrigonometric*/ mtx *= mapserver::trans_affine_rotation(-style->rotation); mtx *= mapserver::trans_affine_translation(x, y); path.transform(mtx); } if (style->color) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_even_odd); r->m_rasterizer_aa.add_path(path); r->m_renderer_scanline.color(aggColor(style->color)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline); } if (style->outlinewidth) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); mapserver::conv_stroke stroke(path); stroke.width(style->outlinewidth); r->m_rasterizer_aa.add_path(stroke); r->m_renderer_scanline.color(aggColor(style->outlinecolor)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_scanline); } return MS_SUCCESS; } int agg2RenderTile(imageObj * /*img*/, imageObj * /*tile*/, double /*x*/, double /*y*/) { /* AGG2Renderer *imgRenderer = agg2GetRenderer(img); AGG2Renderer *tileRenderer = agg2GetRenderer(tile); */ return MS_FAILURE; } int aggInitializeRasterBuffer(rasterBufferObj *rb, int width, int height, int mode) { rb->type = MS_BUFFER_BYTE_RGBA; rb->data.rgba.pixel_step = 4; rb->data.rgba.row_step = rb->data.rgba.pixel_step * width; rb->width = width; rb->height = height; int nBytes = rb->data.rgba.row_step * height; rb->data.rgba.pixels = (band_type *)msSmallCalloc(nBytes, sizeof(band_type)); rb->data.rgba.r = &(rb->data.rgba.pixels[band_order::R]); rb->data.rgba.g = &(rb->data.rgba.pixels[band_order::G]); rb->data.rgba.b = &(rb->data.rgba.pixels[band_order::B]); if (mode == MS_IMAGEMODE_RGBA) { rb->data.rgba.a = &(rb->data.rgba.pixels[band_order::A]); } return MS_SUCCESS; } int aggGetRasterBufferHandle(imageObj *img, rasterBufferObj *rb) { AGG2Renderer *r = AGG_RENDERER(img); rb->type = MS_BUFFER_BYTE_RGBA; rb->data.rgba.pixels = r->buffer.data(); rb->data.rgba.row_step = r->m_rendering_buffer.stride(); rb->data.rgba.pixel_step = 4; rb->width = r->m_rendering_buffer.width(); rb->height = r->m_rendering_buffer.height(); rb->data.rgba.r = &(r->buffer[band_order::R]); rb->data.rgba.g = &(r->buffer[band_order::G]); rb->data.rgba.b = &(r->buffer[band_order::B]); if (r->use_alpha) rb->data.rgba.a = &(r->buffer[band_order::A]); else rb->data.rgba.a = NULL; return MS_SUCCESS; } int aggGetRasterBufferCopy(imageObj *img, rasterBufferObj *rb) { AGG2Renderer *r = AGG_RENDERER(img); aggInitializeRasterBuffer(rb, img->width, img->height, MS_IMAGEMODE_RGBA); int nBytes = r->m_rendering_buffer.stride() * r->m_rendering_buffer.height(); memcpy(rb->data.rgba.pixels, r->buffer.data(), nBytes); return MS_SUCCESS; } int agg2MergeRasterBuffer(imageObj *dest, rasterBufferObj *overlay, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height) { assert(overlay->type == MS_BUFFER_BYTE_RGBA); rendering_buffer b(overlay->data.rgba.pixels, overlay->width, overlay->height, overlay->data.rgba.row_step); pixel_format pf(b); AGG2Renderer *r = AGG_RENDERER(dest); mapserver::rect_base src_rect(srcX, srcY, srcX + width, srcY + height); r->m_renderer_base.blend_from(pf, &src_rect, dstX - srcX, dstY - srcY, unsigned(opacity * 255)); return MS_SUCCESS; } /* image i/o */ imageObj *agg2CreateImage(int width, int height, outputFormatObj *format, colorObj *bg) { imageObj *image = NULL; if (format->imagemode != MS_IMAGEMODE_RGB && format->imagemode != MS_IMAGEMODE_RGBA) { msSetError(MS_MISCERR, "AGG2 driver only supports RGB or RGBA pixel models.", "agg2CreateImage()"); return image; } if (width > 0 && height > 0) { image = (imageObj *)calloc(1, sizeof(imageObj)); MS_CHECK_ALLOC(image, sizeof(imageObj), NULL); AGG2Renderer *r = new AGG2Renderer(); /* Compute size on 64bit and check that it is compatible of the platform * size_t */ const AGG_INT64U bufSize64 = (AGG_INT64U)width * height * 4 * sizeof(band_type); if (bufSize64 > std::numeric_limits::max() / 2) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating " AGG_INT64U_FRMT " bytes.\n", "agg2CreateImage()", __FILE__, __LINE__, bufSize64); free(image); delete r; return NULL; } const size_t bufSize = (size_t)bufSize64; try { r->buffer.resize(bufSize / sizeof(band_type)); } catch (const std::bad_alloc &) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating " AGG_INT64U_FRMT " bytes.\n", "agg2CreateImage()", __FILE__, __LINE__, bufSize64); free(image); delete r; return NULL; } r->m_rendering_buffer.attach(r->buffer.data(), width, height, width * 4); r->m_pixel_format.attach(r->m_rendering_buffer); r->m_compop_pixel_format.attach(r->m_rendering_buffer); r->m_renderer_base.attach(r->m_pixel_format); r->m_compop_renderer_base.attach(r->m_compop_pixel_format); r->m_renderer_scanline.attach(r->m_renderer_base); r->m_renderer_scanline_aliased.attach(r->m_renderer_base); r->default_gamma = atof(msGetOutputFormatOption(format, "GAMMA", "0.75")); if (r->default_gamma <= 0.0 || r->default_gamma >= 1.0) { r->default_gamma = 0.75; } r->gamma_function.set(0, r->default_gamma); r->m_rasterizer_aa_gamma.gamma(r->gamma_function); if (bg && !format->transparent) r->m_renderer_base.clear(aggColor(bg)); else r->m_renderer_base.clear(AGG_NO_COLOR); if (!bg || format->transparent || format->imagemode == MS_IMAGEMODE_RGBA) { r->use_alpha = true; } else { r->use_alpha = false; } image->img.plugin = (void *)r; } else { msSetError(MS_RENDERERERR, "Cannot create cairo image of size %dx%d.", "msImageCreateCairo()", width, height); } return image; } int agg2SaveImage(imageObj * /*img*/, mapObj * /*map*/, FILE * /*fp*/, outputFormatObj * /*format*/) { return MS_FAILURE; } int agg2StartNewLayer(imageObj *img, mapObj * /*map*/, layerObj *layer) { AGG2Renderer *r = AGG_RENDERER(img); const char *sgamma = msLayerGetProcessingKey(layer, "GAMMA"); double gamma; if (sgamma) { gamma = atof(sgamma); if (gamma <= 0 || gamma >= 1) gamma = 0.75; } else { gamma = r->default_gamma; } if (r->gamma_function.end() != gamma) { r->gamma_function.end(gamma); r->m_rasterizer_aa_gamma.gamma(r->gamma_function); } return MS_SUCCESS; } int agg2CloseNewLayer(imageObj * /*img*/, mapObj * /*map*/, layerObj * /*layer*/) { return MS_SUCCESS; } int agg2FreeImage(imageObj *image) { AGG2Renderer *r = AGG_RENDERER(image); delete r; image->img.plugin = NULL; return MS_SUCCESS; } int agg2FreeSymbol(symbolObj * /*symbol*/) { return MS_SUCCESS; } int agg2InitCache(void **vcache) { aggRendererCache *cache = new aggRendererCache(); *vcache = (void *)cache; return MS_SUCCESS; } int agg2Cleanup(void *vcache) { aggRendererCache *cache = (aggRendererCache *)vcache; delete cache; return MS_SUCCESS; } // ------------------------------------------------------------------------ // Function to create a custom hatch symbol based on an arbitrary angle. // ------------------------------------------------------------------------ static mapserver::path_storage createHatch(double ox, double oy, double rx, double ry, int sx, int sy, double angle, double step) { mapserver::path_storage path; // restrict the angle to [0 180[, i.e ]-pi/2,pi/2] in radians angle = fmod(angle, 360.0); if (angle < 0) angle += 360; if (angle >= 180) angle -= 180; // treat 2 easy cases which would cause divide by 0 in generic case if (angle == 0) { double y0 = step - fmod(oy - ry, step); if ((oy - ry) < 0) { y0 -= step; } for (double y = y0; y < sy; y += step) { path.move_to(0, y); path.line_to(sx, y); } return path; } if (angle == 90) { double x0 = step - fmod(ox - rx, step); if ((ox - rx) < 0) { x0 -= step; } for (double x = x0; x < sx; x += step) { path.move_to(x, 0); path.line_to(x, sy); } return path; } double theta = (90 - angle) * MS_DEG_TO_RAD; /* theta in ]-pi/2 , pi/2] */ double ct = cos(theta); double st = sin(theta); double invct = 1.0 / ct; double invst = 1.0 / st; double r0; /* distance from first hatch line to the top-left (if angle in 0,pi/2) or bottom-left (if angle in -pi/2,0) corner of the hatch bbox */ double rmax = sqrt(( double)(sx * sx + sy * sy)); /* distance to the furthest hatch we will have to create TODO: this could be optimized for bounding boxes where width is very different than height for certain hatch angles */ double rref = rx * ct + ry * st; /* distance to the line passing through the refpoint, origin is (0,0) of the imageObj */ double rcorner; /* distance to the line passing through the topleft or bottomleft corner of the hatch bbox (origin is (0,0) of imageObj) */ /* calculate the distance from the refpoint to the top right of the path */ if (angle < 90) { rcorner = ox * ct + oy * st; r0 = step - fmod(rcorner - rref, step); if (rcorner - rref < 0) r0 -= step; } else { rcorner = ox * ct + (oy + sy) * st; r0 = step - fmod(rcorner - rref, step); if (rcorner - rref < 0) r0 -= step; st = -st; invst = -invst; } // parametrize each line as r = x.cos(theta) + y.sin(theta) for (double r = r0; r < rmax; r += step) { int inter = 0; double x, y; double pt[4]; // array to store the coordinates of intersection of the line // with the sides // in the general case there will only be two intersections // so pt[4] should be sufficient to store the coordinates of the // intersection, but we allocate pt[8] to treat the special and // rare/unfortunate case when the line is a perfect diagonal (and therefore // intersects all four sides) note that the order for testing is important // in this case so that the first two intersection points actually // correspond to the diagonal and not a degenerate line // test for intersection with each side y = r * invst; x = 0; // test for intersection with left of image if (y >= 0 && y <= sy) { pt[2 * inter] = x; pt[2 * inter + 1] = y; inter++; } x = sx; y = (r - sx * ct) * invst; // test for intersection with right of image if (y >= 0 && y <= sy) { pt[2 * inter] = x; pt[2 * inter + 1] = y; inter++; } if (inter < 2) { y = 0; x = r * invct; // test for intersection with top of image if (x >= 0 && x <= sx) { pt[2 * inter] = x; pt[2 * inter + 1] = y; inter++; } } if (inter < 2) { y = sy; x = (r - sy * st) * invct; // test for intersection with bottom of image if (x >= 0 && x <= sx) { pt[2 * inter] = x; pt[2 * inter + 1] = y; inter++; } } if (inter == 2 && (pt[0] != pt[2] || pt[1] != pt[3])) { // the line intersects with two sides of the image, it should therefore be // drawn if (angle < 90) { path.move_to(pt[0], pt[1]); path.line_to(pt[2], pt[3]); } else { path.move_to(pt[0], sy - pt[1]); path.line_to(pt[2], sy - pt[3]); } } } return path; } template int renderPolygonHatches(imageObj *img, VertexSource &clipper, colorObj *color) { if (img->format->renderer == MS_RENDER_WITH_AGG) { AGG2Renderer *r = AGG_RENDERER(img); r->m_rasterizer_aa_gamma.reset(); r->m_rasterizer_aa_gamma.filling_rule(mapserver::fill_non_zero); r->m_rasterizer_aa_gamma.add_path(clipper); r->m_renderer_scanline.color(aggColor(color)); mapserver::render_scanlines(r->m_rasterizer_aa_gamma, r->sl_poly, r->m_renderer_scanline); } else { shapeObj shape; msInitShape(&shape); int allocated = 20; lineObj line; shape.line = &line; shape.numlines = 1; shape.line[0].point = (pointObj *)msSmallCalloc(allocated, sizeof(pointObj)); shape.line[0].numpoints = 0; double x = 0, y = 0; unsigned int cmd; clipper.rewind(0); while ((cmd = clipper.vertex(&x, &y)) != mapserver::path_cmd_stop) { switch (cmd) { case mapserver::path_cmd_line_to: if (shape.line[0].numpoints == allocated) { allocated *= 2; shape.line[0].point = (pointObj *)msSmallRealloc( shape.line[0].point, allocated * sizeof(pointObj)); } shape.line[0].point[shape.line[0].numpoints].x = x; shape.line[0].point[shape.line[0].numpoints].y = y; shape.line[0].numpoints++; break; case mapserver::path_cmd_move_to: shape.line[0].point[0].x = x; shape.line[0].point[0].y = y; shape.line[0].numpoints = 1; break; case mapserver::path_cmd_end_poly | mapserver::path_flags_close: if (shape.line[0].numpoints > 2) { if (MS_UNLIKELY(MS_FAILURE == MS_IMAGE_RENDERER(img)->renderPolygon( img, &shape, color))) { free(shape.line[0].point); return MS_FAILURE; } } break; default: assert(0); // WTF? } } free(shape.line[0].point); } return MS_SUCCESS; } int msHatchPolygon(imageObj *img, shapeObj *poly, double spacing, double width, double *pattern, int patternlength, double angle, colorObj *color) { assert(MS_RENDERER_PLUGIN(img->format)); msComputeBounds(poly); /* amount we should expand the bounding box by */ double exp = width * 0.7072; /* width and height of the bounding box we will be creating the hatch in */ int pw = (int)(poly->bounds.maxx - poly->bounds.minx + exp * 2) + 1; int ph = (int)(poly->bounds.maxy - poly->bounds.miny + exp * 2) + 1; /* position of the top-left corner of the bounding box */ double ox = poly->bounds.minx - exp; double oy = poly->bounds.miny - exp; // create a rectangular hatch of size pw,ph starting at 0,0 // the created hatch is of the size of the shape's bounding box mapserver::path_storage hatch = createHatch(ox, oy, img->refpt.x, img->refpt.y, pw, ph, angle, spacing); if (hatch.total_vertices() <= 0) return MS_SUCCESS; // translate the hatch so it overlaps the current shape hatch.transform(mapserver::trans_affine_translation(ox, oy)); polygon_adaptor polygons(poly); if (patternlength > 1) { // dash the color-hatch and render it clipped by the shape mapserver::conv_dash dash(hatch); mapserver::conv_stroke> stroke(dash); for (int i = 0; i < patternlength; i += 2) { if (i < patternlength - 1) { dash.add_dash(pattern[i], pattern[i + 1]); } } stroke.width(width); stroke.line_cap(mapserver::butt_cap); mapserver::conv_clipper< polygon_adaptor, mapserver::conv_stroke>> clipper(polygons, stroke, mapserver::clipper_and); renderPolygonHatches(img, clipper, color); } else { // render the hatch clipped by the shape mapserver::conv_stroke stroke(hatch); stroke.width(width); stroke.line_cap(mapserver::butt_cap); mapserver::conv_clipper> clipper(polygons, stroke, mapserver::clipper_and); renderPolygonHatches(img, clipper, color); } // assert(prevCmd == mapserver::path_cmd_line_to); // delete lines; return MS_SUCCESS; } #ifdef USE_PIXMAN static pixman_op_t ms2pixman_compop(CompositingOperation c) { switch (c) { case MS_COMPOP_CLEAR: return PIXMAN_OP_CLEAR; case MS_COMPOP_SRC: return PIXMAN_OP_SRC; case MS_COMPOP_DST: return PIXMAN_OP_DST; case MS_COMPOP_SRC_OVER: return PIXMAN_OP_OVER; case MS_COMPOP_DST_OVER: return PIXMAN_OP_OVER_REVERSE; case MS_COMPOP_SRC_IN: return PIXMAN_OP_IN; case MS_COMPOP_DST_IN: return PIXMAN_OP_IN_REVERSE; case MS_COMPOP_SRC_OUT: return PIXMAN_OP_OUT; case MS_COMPOP_DST_OUT: return PIXMAN_OP_OUT_REVERSE; case MS_COMPOP_SRC_ATOP: return PIXMAN_OP_ATOP; case MS_COMPOP_DST_ATOP: return PIXMAN_OP_ATOP_REVERSE; case MS_COMPOP_XOR: return PIXMAN_OP_XOR; case MS_COMPOP_PLUS: return PIXMAN_OP_ADD; case MS_COMPOP_MULTIPLY: return PIXMAN_OP_MULTIPLY; case MS_COMPOP_SCREEN: return PIXMAN_OP_SCREEN; case MS_COMPOP_OVERLAY: return PIXMAN_OP_OVERLAY; case MS_COMPOP_DARKEN: return PIXMAN_OP_DARKEN; case MS_COMPOP_LIGHTEN: return PIXMAN_OP_LIGHTEN; case MS_COMPOP_COLOR_DODGE: return PIXMAN_OP_COLOR_DODGE; case MS_COMPOP_COLOR_BURN: return PIXMAN_OP_COLOR_DODGE; case MS_COMPOP_HARD_LIGHT: return PIXMAN_OP_HARD_LIGHT; case MS_COMPOP_SOFT_LIGHT: return PIXMAN_OP_SOFT_LIGHT; case MS_COMPOP_DIFFERENCE: return PIXMAN_OP_DIFFERENCE; case MS_COMPOP_EXCLUSION: return PIXMAN_OP_EXCLUSION; case MS_COMPOP_HSL_HUE: return PIXMAN_OP_HSL_HUE; case MS_COMPOP_HSL_LUMINOSITY: return PIXMAN_OP_HSL_LUMINOSITY; case MS_COMPOP_HSL_SATURATION: return PIXMAN_OP_HSL_SATURATION; case MS_COMPOP_HSL_COLOR: return PIXMAN_OP_HSL_COLOR; case MS_COMPOP_INVERT: case MS_COMPOP_INVERT_RGB: case MS_COMPOP_MINUS: case MS_COMPOP_CONTRAST: default: return PIXMAN_OP_OVER; } } #endif static mapserver::comp_op_e ms2agg_compop(CompositingOperation c) { switch (c) { case MS_COMPOP_CLEAR: return mapserver::comp_op_clear; case MS_COMPOP_SRC: return mapserver::comp_op_src; case MS_COMPOP_DST: return mapserver::comp_op_dst; case MS_COMPOP_SRC_OVER: return mapserver::comp_op_src_over; case MS_COMPOP_DST_OVER: return mapserver::comp_op_dst_over; case MS_COMPOP_SRC_IN: return mapserver::comp_op_src_in; case MS_COMPOP_DST_IN: return mapserver::comp_op_dst_in; case MS_COMPOP_SRC_OUT: return mapserver::comp_op_src_out; case MS_COMPOP_DST_OUT: return mapserver::comp_op_dst_out; case MS_COMPOP_SRC_ATOP: return mapserver::comp_op_src_atop; case MS_COMPOP_DST_ATOP: return mapserver::comp_op_dst_atop; case MS_COMPOP_XOR: return mapserver::comp_op_xor; case MS_COMPOP_PLUS: return mapserver::comp_op_plus; case MS_COMPOP_MINUS: return mapserver::comp_op_minus; case MS_COMPOP_MULTIPLY: return mapserver::comp_op_multiply; case MS_COMPOP_SCREEN: return mapserver::comp_op_screen; case MS_COMPOP_OVERLAY: return mapserver::comp_op_overlay; case MS_COMPOP_DARKEN: return mapserver::comp_op_darken; case MS_COMPOP_LIGHTEN: return mapserver::comp_op_lighten; case MS_COMPOP_COLOR_DODGE: return mapserver::comp_op_color_dodge; case MS_COMPOP_COLOR_BURN: return mapserver::comp_op_color_burn; case MS_COMPOP_HARD_LIGHT: return mapserver::comp_op_hard_light; case MS_COMPOP_SOFT_LIGHT: return mapserver::comp_op_soft_light; case MS_COMPOP_DIFFERENCE: return mapserver::comp_op_difference; case MS_COMPOP_EXCLUSION: return mapserver::comp_op_exclusion; case MS_COMPOP_CONTRAST: return mapserver::comp_op_contrast; case MS_COMPOP_INVERT: return mapserver::comp_op_invert; case MS_COMPOP_INVERT_RGB: return mapserver::comp_op_invert_rgb; case MS_COMPOP_HSL_HUE: return mapserver::comp_op_hsl_hue; case MS_COMPOP_HSL_LUMINOSITY: return mapserver::comp_op_hsl_luminosity; case MS_COMPOP_HSL_SATURATION: return mapserver::comp_op_hsl_saturation; case MS_COMPOP_HSL_COLOR: return mapserver::comp_op_hsl_color; default: return mapserver::comp_op_src_over; } } #ifdef USE_PIXMAN static int aggCompositeRasterBufferPixman(imageObj *dest, rasterBufferObj *overlay, CompositingOperation comp, int opacity) { assert(overlay->type == MS_BUFFER_BYTE_RGBA); AGG2Renderer *r = AGG_RENDERER(dest); pixman_image_t *si = pixman_image_create_bits( PIXMAN_a8r8g8b8, overlay->width, overlay->height, (uint32_t *)overlay->data.rgba.pixels, overlay->data.rgba.row_step); pixman_image_t *bi = pixman_image_create_bits( PIXMAN_a8r8g8b8, dest->width, dest->height, reinterpret_cast(&(r->buffer[0])), dest->width * 4); pixman_image_t *alpha_mask_i = NULL, *alpha_mask_i_ptr; pixman_image_set_filter(si, PIXMAN_FILTER_NEAREST, NULL, 0); unsigned char *alpha_mask = NULL; if (opacity > 0) { if (opacity == 100) { alpha_mask_i_ptr = NULL; } else { unsigned char alpha = (unsigned char)(MS_NINT(opacity * 2.55)); if (!alpha_mask_i) { alpha_mask = (unsigned char *)msSmallMalloc(dest->width * dest->height); alpha_mask_i = pixman_image_create_bits(PIXMAN_a8, dest->width, dest->height, (uint32_t *)alpha_mask, dest->width); } memset(alpha_mask, alpha, dest->width * dest->height); alpha_mask_i_ptr = alpha_mask_i; } pixman_image_composite(ms2pixman_compop(comp), si, alpha_mask_i_ptr, bi, 0, 0, 0, 0, 0, 0, dest->width, dest->height); } pixman_image_unref(si); pixman_image_unref(bi); if (alpha_mask_i) { pixman_image_unref(alpha_mask_i); msFree(alpha_mask); } return MS_SUCCESS; } #endif static int aggCompositeRasterBufferNoPixman(imageObj *dest, rasterBufferObj *overlay, CompositingOperation comp, int opacity) { assert(overlay->type == MS_BUFFER_BYTE_RGBA); AGG2Renderer *r = AGG_RENDERER(dest); rendering_buffer b(overlay->data.rgba.pixels, overlay->width, overlay->height, overlay->data.rgba.row_step); pixel_format pf(b); mapserver::comp_op_e comp_op = ms2agg_compop(comp); if (comp_op == mapserver::comp_op_src_over) { r->m_renderer_base.blend_from(pf, 0, 0, 0, unsigned(MS_NINT(opacity * 2.55))); } else { compop_pixel_format pixf(r->m_rendering_buffer); compop_renderer_base ren(pixf); pixf.comp_op(comp_op); ren.blend_from(pf, 0, 0, 0, unsigned(MS_NINT(opacity * 2.55))); } return MS_SUCCESS; } void msApplyBlurringCompositingFilter(rasterBufferObj *rb, unsigned int radius) { rendering_buffer b(rb->data.rgba.pixels, rb->width, rb->height, rb->data.rgba.row_step); pixel_format pf(b); mapserver::stack_blur_rgba32(pf, radius, radius); } int msPopulateRendererVTableAGG(rendererVTableObj *renderer) { renderer->compositeRasterBuffer = &aggCompositeRasterBufferNoPixman; #ifdef USE_PIXMAN const char *pszUsePixman = CPLGetConfigOption("MS_USE_PIXMAN", "YES"); if (CPLTestBool(pszUsePixman)) { renderer->compositeRasterBuffer = &aggCompositeRasterBufferPixman; } #endif renderer->supports_pixel_buffer = 1; renderer->use_imagecache = 0; renderer->supports_clipping = 0; renderer->supports_svg = 0; renderer->default_transform_mode = MS_TRANSFORM_SIMPLIFY; agg2InitCache(&(MS_RENDERER_CACHE(renderer))); renderer->cleanup = agg2Cleanup; renderer->renderLine = &agg2RenderLine; renderer->renderPolygon = &agg2RenderPolygon; renderer->renderPolygonTiled = &agg2RenderPolygonTiled; renderer->renderLineTiled = &agg2RenderLineTiled; renderer->renderGlyphs = &agg2RenderGlyphsPath; renderer->renderVectorSymbol = &agg2RenderVectorSymbol; renderer->renderPixmapSymbol = &agg2RenderPixmapSymbol; renderer->renderEllipseSymbol = &agg2RenderEllipseSymbol; renderer->renderTile = &agg2RenderTile; renderer->getRasterBufferHandle = &aggGetRasterBufferHandle; renderer->getRasterBufferCopy = aggGetRasterBufferCopy; renderer->initializeRasterBuffer = aggInitializeRasterBuffer; renderer->mergeRasterBuffer = &agg2MergeRasterBuffer; renderer->loadImageFromFile = msLoadMSRasterBufferFromFile; renderer->createImage = &agg2CreateImage; renderer->saveImage = &agg2SaveImage; renderer->startLayer = &agg2StartNewLayer; renderer->endLayer = &agg2CloseNewLayer; renderer->freeImage = &agg2FreeImage; renderer->freeSymbol = &agg2FreeSymbol; return MS_SUCCESS; } mapserver-8.4.0/src/mapagg.h000066400000000000000000000150101474174441300157310ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: AGG template library types. * Author: John Novak (jnovak@novacell.com) * Author: Thomas Bonfort (tbonfort@terriscope.fr) * ****************************************************************************** * Copyright (c) 1996-2007 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ******************************************************************************/ #include "renderers/agg/include/agg_path_storage.h" /* * interface to a shapeObj representing lines, providing the functions * needed by the agg rasterizer. treats shapeObjs with multiple linestrings. */ class line_adaptor { public: explicit line_adaptor(shapeObj *shape) : s(shape) { m_line = s->line; /*first line*/ m_point = m_line->point; /*current vertex is first vertex of first line*/ m_lend = &(s->line[s->numlines]); /*pointer to after last line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last vertex of first line*/ } /* a class with virtual functions should also provide a virtual destructor */ virtual ~line_adaptor() {} void rewind(unsigned) { m_line = s->line; /*first line*/ m_point = m_line->point; /*current vertex is first vertex of first line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last vertex of first line*/ } virtual unsigned vertex(double *x, double *y) { if (m_point < m_pend) { /*here we treat the case where a real vertex is returned*/ bool first = m_point == m_line->point; /*is this the first vertex of a line*/ *x = m_point->x; *y = m_point->y; m_point++; return first ? mapserver::path_cmd_move_to : mapserver::path_cmd_line_to; } /*if here, we're at the end of a line*/ m_line++; *x = *y = 0.0; if (m_line >= m_lend) /*is this the last line of the shapObj. normally, (m_line==m_lend) should be a sufficient test, as the caller should not call this function if a previous call returned path_cmd_stop.*/ return mapserver::path_cmd_stop; /*no more points to process*/ /*if here, there are more lines in the shapeObj, continue with next one*/ m_point = m_line->point; /*pointer to first point of next line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last point of next line*/ return vertex(x, y); /*this will return the first point of the next line*/ } protected: shapeObj *s; lineObj *m_line, /*current line pointer*/ *m_lend; /*points to after the last line*/ pointObj *m_point, /*current point*/ *m_pend; /*points to after last point of current line*/ }; class polygon_adaptor { public: explicit polygon_adaptor(shapeObj *shape) : s(shape) { m_line = s->line; /*first lines*/ m_point = m_line->point; /*first vertex of first line*/ m_lend = &(s->line[s->numlines]); /*pointer to after last line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last vertex of first line*/ } /* a class with virtual functions should also provide a virtual destructor */ virtual ~polygon_adaptor() {} void rewind(unsigned) { /*reset pointers*/ m_stop = false; m_line = s->line; m_point = m_line->point; m_pend = &(m_line->point[m_line->numpoints]); } virtual unsigned vertex(double *x, double *y) { if (m_point < m_pend) { /*if here, we have a real vertex*/ bool first = m_point == m_line->point; *x = m_point->x; *y = m_point->y; m_point++; return first ? mapserver::path_cmd_move_to : mapserver::path_cmd_line_to; } *x = *y = 0.0; if (!m_stop) { /*if here, we're after the last vertex of the current line * we return the command to close the current polygon*/ m_line++; if (m_line >= m_lend) { /*if here, we've finished all the vertices of the shape. * we still return the command to close the current polygon, * but set m_stop so the subsequent call to vertex() will return * the stop command*/ m_stop = true; return mapserver::path_cmd_end_poly; } /*if here, there's another line in the shape, so we set the pointers * accordingly and return the command to close the current polygon*/ m_point = m_line->point; /*first vertex of next line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last vertex of next line*/ return mapserver::path_cmd_end_poly; } /*if here, a previous call to vertex informed us that we'd consumed all the * vertices of the shape. return the command to stop processing this shape*/ return mapserver::path_cmd_stop; } protected: shapeObj *s; double ox = 0.0; double oy = 0.0; lineObj *m_line, /*pointer to current line*/ *m_lend; /*pointer to after last line of the shape*/ pointObj *m_point, /*pointer to current vertex*/ *m_pend; /*pointer to after last vertex of current line*/ bool m_stop = false; /*should next call return stop command*/ }; mapserver::path_storage imageVectorSymbol(symbolObj *); mapserver-8.4.0/src/mapaxisorder.h000066400000000000000000011332361474174441300172070ustar00rootroot00000000000000/****************************************************************************** * $Id: $ * * Project: MapServer * Purpose: Axis lookup table * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* * Generated file * * This file was generated from by means of a script. Do not edit manually. */ #ifdef __cplusplus extern "C" { #endif static const unsigned char axisOrientationEpsgCodes[] = { 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0}; #ifdef __cplusplus } #endif mapserver-8.4.0/src/mapbits.c000066400000000000000000000072431474174441300161400ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of bit array functions. * Author: Steve Lime and the MapServer team. * * Notes: Derived from code placed in the public domain by Bob Stout, for more * information see http://c.snippets.org/snip_lister.php?fname=bitarray.c. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include /* * Hardcoded size of our bit array. * See function msGetNextBit for another hardcoded value. */ /* #define msGetBit(array, index) (*((array) + (index)/MS_ARRAY_BIT) & ( 1 << * ((index) % MS_ARRAY_BIT))) */ size_t msGetBitArraySize(int numbits) { return ((numbits + MS_ARRAY_BIT - 1) / MS_ARRAY_BIT); } ms_bitarray msAllocBitArray(int numbits) { ms_bitarray array = calloc((numbits + MS_ARRAY_BIT - 1) / MS_ARRAY_BIT, MS_ARRAY_BIT); return (array); } int msGetBit(ms_const_bitarray array, int index) { array += index / MS_ARRAY_BIT; return (*array & (1U << (index % MS_ARRAY_BIT))) != 0; /* 0 or 1 */ } /* ** msGetNextBit( status, start, size) ** ** Quickly find the next bit set. If start == 0 and 0 is set, will return 0. ** If hits end of bitmap without finding set bit, will return -1. ** */ int msGetNextBit(ms_const_bitarray array, int i, int size) { register ms_uint32 b; while (i < size) { b = *(array + (i / MS_ARRAY_BIT)); if (b && (b >> (i % MS_ARRAY_BIT))) { /* There is something in this byte */ /* And it is not to the right of us */ if (b & (1U << (i % MS_ARRAY_BIT))) { /* There is something at this bit! */ return i; } else { i++; } } else { /* Nothing in this byte, move to start of next byte */ i += MS_ARRAY_BIT - (i % MS_ARRAY_BIT); } } /* Got to the last byte with no hits! */ return -1; } void msSetBit(ms_bitarray array, int index, int value) { array += index / MS_ARRAY_BIT; if (value) *array |= 1U << (index % MS_ARRAY_BIT); /* set bit */ else *array &= ~(1U << (index % MS_ARRAY_BIT)); /* clear bit */ } void msSetAllBits(ms_bitarray array, int numbits, int value) { if (value) memset(array, 0xff, ((numbits + 7) / 8)); /* set bit */ else memset(array, 0x0, ((numbits + 7) / 8)); /* clear bit */ } void msFlipBit(ms_bitarray array, int index) { array += index / MS_ARRAY_BIT; *array ^= 1U << (index % MS_ARRAY_BIT); /* flip bit */ } mapserver-8.4.0/src/mapcairo.c000066400000000000000000001165651474174441300163040ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Cairo Rendering functions * Author: Thomas Bonfort * ****************************************************************************** * Copyright (c) 1996-2009 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #ifdef USE_CAIRO #include #if defined(_WIN32) && !defined(__CYGWIN__) #include #include #include #else #include #include #endif #ifdef USE_SVG_CAIRO #include #else #ifdef USE_RSVG #include #ifndef LIBRSVG_CHECK_VERSION #include #endif #ifndef RSVG_CAIRO_H #include #endif #include #endif #endif #include #include "cpl_conv.h" #include #include "fontcache.h" #include /* #include #include */ #include /* #include #include FT_FREETYPE_H */ typedef struct cairoFaceCache cairoFaceCache; struct cairoFaceCache { cairo_font_face_t *face; FT_Face ftface; cairo_font_options_t *options; cairoFaceCache *next; }; void freeCairoFaceCache(cairoFaceCache *fc) { cairo_font_face_destroy(fc->face); cairo_font_options_destroy(fc->options); } typedef struct { cairoFaceCache *cairofacecache; /* dummy surface and context */ unsigned char dummydata[4]; cairo_surface_t *dummysurface; cairo_t *dummycr; } cairoCacheData; void initializeCache(void **vcache) { cairoCacheData *cache = (cairoCacheData *)malloc(sizeof(cairoCacheData)); *vcache = cache; cache->cairofacecache = NULL; /* dummy surface and context */ cache->dummysurface = cairo_image_surface_create_for_data( cache->dummydata, CAIRO_FORMAT_ARGB32, 1, 1, 4); cache->dummycr = cairo_create(cache->dummysurface); } int cleanupCairo(void *cache) { cairoCacheData *ccache = (cairoCacheData *)cache; if (ccache->dummycr) { cairo_destroy(ccache->dummycr); } if (ccache->dummysurface) { cairo_surface_destroy(ccache->dummysurface); } if (ccache->cairofacecache) { cairoFaceCache *next, *cur; cur = ccache->cairofacecache; do { next = cur->next; freeCairoFaceCache(cur); free(cur); cur = next; } while (cur); } free(ccache); return MS_SUCCESS; } typedef struct { cairo_surface_t *surface; cairo_t *cr; bufferObj *outputStream; int use_alpha; } cairo_renderer; #define CAIRO_RENDERER(im) ((cairo_renderer *)(im->img.plugin)) int freeImageCairo(imageObj *img) { cairo_renderer *r = CAIRO_RENDERER(img); if (r) { cairo_destroy(r->cr); cairo_surface_finish(r->surface); cairo_surface_destroy(r->surface); if (r->outputStream) { msBufferFree(r->outputStream); free(r->outputStream); } free(r); } return MS_SUCCESS; } static cairoFaceCache *getCairoFontFace(cairoCacheData *cache, FT_Face ftface) { cairoFaceCache *cur = cache->cairofacecache; while (cur) { if (cur->ftface == ftface) return cur; cur = cur->next; } cur = msSmallMalloc(sizeof(cairoFaceCache)); cur->next = cache->cairofacecache; cache->cairofacecache = cur; cur->ftface = ftface; cur->face = cairo_ft_font_face_create_for_ft_face(ftface, 0); cur->options = cairo_font_options_create(); cairo_font_options_set_hint_style(cur->options, CAIRO_HINT_STYLE_NONE); return cur; } #define msCairoSetSourceColor(cr, c) \ cairo_set_source_rgba((cr), (c)->red / 255.0, (c)->green / 255.0, \ (c)->blue / 255.0, (c)->alpha / 255.0); int renderLineCairo(imageObj *img, shapeObj *p, strokeStyleObj *stroke) { int i, j; cairo_renderer *r = CAIRO_RENDERER(img); assert(stroke->color); cairo_new_path(r->cr); msCairoSetSourceColor(r->cr, stroke->color); for (i = 0; i < p->numlines; i++) { lineObj *l = &(p->line[i]); if (l->numpoints == 0) continue; cairo_move_to(r->cr, l->point[0].x, l->point[0].y); for (j = 1; j < l->numpoints; j++) { cairo_line_to(r->cr, l->point[j].x, l->point[j].y); } } if (stroke->patternlength > 0) { cairo_set_dash(r->cr, stroke->pattern, stroke->patternlength, -stroke->patternoffset); } switch (stroke->linecap) { case MS_CJC_BUTT: cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_BUTT); break; case MS_CJC_SQUARE: cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_SQUARE); break; case MS_CJC_ROUND: case MS_CJC_NONE: default: cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_ROUND); } cairo_set_line_width(r->cr, stroke->width); cairo_stroke(r->cr); if (stroke->patternlength > 0) { cairo_set_dash(r->cr, stroke->pattern, 0, 0); } return MS_SUCCESS; } int renderPolygonCairo(imageObj *img, shapeObj *p, colorObj *c) { cairo_renderer *r = CAIRO_RENDERER(img); int i, j; cairo_new_path(r->cr); cairo_set_fill_rule(r->cr, CAIRO_FILL_RULE_EVEN_ODD); msCairoSetSourceColor(r->cr, c); for (i = 0; i < p->numlines; i++) { lineObj *l = &(p->line[i]); cairo_move_to(r->cr, l->point[0].x, l->point[0].y); for (j = 1; j < l->numpoints; j++) { cairo_line_to(r->cr, l->point[j].x, l->point[j].y); } cairo_close_path(r->cr); } cairo_fill(r->cr); return MS_SUCCESS; } int renderPolygonTiledCairo(imageObj *img, shapeObj *p, imageObj *tile) { int i, j; cairo_renderer *r = CAIRO_RENDERER(img); cairo_renderer *tileRenderer = CAIRO_RENDERER(tile); cairo_pattern_t *pattern = cairo_pattern_create_for_surface(tileRenderer->surface); cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); cairo_set_source(r->cr, pattern); for (i = 0; i < p->numlines; i++) { lineObj *l = &(p->line[i]); cairo_move_to(r->cr, l->point[0].x, l->point[0].y); for (j = 1; j < l->numpoints; j++) { cairo_line_to(r->cr, l->point[j].x, l->point[j].y); } /* cairo_close_path(r->cr); */ } cairo_fill(r->cr); cairo_pattern_destroy(pattern); return MS_SUCCESS; } cairo_surface_t *createSurfaceFromBuffer(rasterBufferObj *b) { assert(b->type == MS_BUFFER_BYTE_RGBA); return cairo_image_surface_create_for_data(b->data.rgba.pixels, CAIRO_FORMAT_ARGB32, b->width, b->height, b->data.rgba.row_step); } int renderPixmapSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_surface_t *im; rasterBufferObj *b = symbol->pixmap_buffer; assert(b); if (!symbol->renderer_cache) { symbol->renderer_cache = (void *)createSurfaceFromBuffer(b); } assert(symbol->renderer_cache); im = (cairo_surface_t *)symbol->renderer_cache; cairo_save(r->cr); if (style->rotation != 0 || style->scale != 1) { cairo_translate(r->cr, x, y); cairo_rotate(r->cr, -style->rotation); cairo_scale(r->cr, style->scale, style->scale); cairo_translate(r->cr, -0.5 * b->width, -0.5 * b->height); } else { cairo_translate(r->cr, MS_NINT(x - 0.5 * b->width), MS_NINT(y - 0.5 * b->height)); } cairo_set_source_surface(r->cr, im, 0, 0); cairo_paint(r->cr); cairo_restore(r->cr); return MS_SUCCESS; } int renderVectorSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { cairo_renderer *r = CAIRO_RENDERER(img); double ox = symbol->sizex * 0.5, oy = symbol->sizey * 0.5; int is_new = 1, i; cairo_new_path(r->cr); cairo_save(r->cr); cairo_translate(r->cr, x, y); cairo_scale(r->cr, style->scale, style->scale); cairo_rotate(r->cr, -style->rotation); cairo_translate(r->cr, -ox, -oy); for (i = 0; i < symbol->numpoints; i++) { if ((symbol->points[i].x == -99) && (symbol->points[i].y == -99)) { /* (PENUP) */ is_new = 1; } else { if (is_new) { cairo_move_to(r->cr, symbol->points[i].x, symbol->points[i].y); is_new = 0; } else { cairo_line_to(r->cr, symbol->points[i].x, symbol->points[i].y); } } } cairo_restore(r->cr); if (style->color) { msCairoSetSourceColor(r->cr, style->color); cairo_fill_preserve(r->cr); } if (style->outlinewidth > 0) { msCairoSetSourceColor(r->cr, style->outlinecolor); cairo_set_line_width(r->cr, style->outlinewidth); cairo_stroke_preserve(r->cr); } cairo_new_path(r->cr); return MS_SUCCESS; } #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache { rasterBufferObj *pixmap_buffer; #ifdef USE_RSVG RsvgHandle *svgc; #else svg_cairo_t *svgc; #endif double scale, rotation; }; #endif int renderSVGSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *cache; cairo_renderer *r = CAIRO_RENDERER(img); msPreloadSVGSymbol(symbol); assert(symbol->renderer_cache); cache = symbol->renderer_cache; cairo_save(r->cr); cairo_translate(r->cr, x, y); cairo_scale(r->cr, style->scale, style->scale); if (style->rotation != 0) { cairo_rotate(r->cr, -style->rotation); cairo_translate(r->cr, -(int)(symbol->sizex / 2), -(int)(symbol->sizey / 2)); } else cairo_translate(r->cr, -(int)(symbol->sizex / 2), -(int)(symbol->sizey / 2)); #ifdef USE_SVG_CAIRO { svg_cairo_status_t status; status = svg_cairo_render(cache->svgc, r->cr); if (status != SVG_CAIRO_STATUS_SUCCESS) { cairo_restore(r->cr); return MS_FAILURE; } } #else rsvg_handle_render_cairo(cache->svgc, r->cr); #endif cairo_restore(r->cr); return MS_SUCCESS; #else (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_MISCERR, "SVG Symbols requested but is not built with libsvgcairo", "renderSVGSymbolCairo()"); return MS_FAILURE; #endif } int renderTileCairo(imageObj *img, imageObj *tile, double x, double y) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_surface_t *im = CAIRO_RENDERER(tile)->surface; int w = cairo_image_surface_get_width(im); int h = cairo_image_surface_get_height(im); cairo_save(r->cr); cairo_translate(r->cr, MS_NINT(x - 0.5 * w), MS_NINT(y - 0.5 * h)); cairo_set_source_surface(r->cr, im, 0, 0); cairo_pattern_set_filter(cairo_get_source(r->cr), CAIRO_FILTER_NEAREST); cairo_paint(r->cr); cairo_restore(r->cr); return MS_SUCCESS; } int renderGlyphs2Cairo(imageObj *img, const textSymbolObj *ts, colorObj *c, colorObj *oc, int ow, int isMarker) { const textPathObj *tp = ts->textpath; cairo_renderer *r = CAIRO_RENDERER(img); cairoCacheData *cache = MS_IMAGE_RENDERER_CACHE(img); cairoFaceCache *cairo_face = NULL; FT_Face prevface = NULL; int g; (void)isMarker; cairo_set_font_size(r->cr, MS_NINT(tp->glyph_size * 96.0 / 72.0)); for (g = 0; g < tp->numglyphs; g++) { glyphObj *gl = &tp->glyphs[g]; cairo_glyph_t glyph; /* load the glyph's face into cairo, if not already present */ if (gl->face->face != prevface) { cairo_face = getCairoFontFace(cache, gl->face->face); cairo_set_font_face(r->cr, cairo_face->face); cairo_set_font_options(r->cr, cairo_face->options); prevface = gl->face->face; cairo_set_font_size(r->cr, MS_NINT(tp->glyph_size * 96.0 / 72.0)); } cairo_save(r->cr); cairo_translate(r->cr, gl->pnt.x, gl->pnt.y); if (gl->rot != 0.0) cairo_rotate(r->cr, -gl->rot); glyph.x = glyph.y = 0; glyph.index = gl->glyph->key.codepoint; cairo_glyph_path(r->cr, &glyph, 1); cairo_restore(r->cr); } if (oc) { cairo_save(r->cr); msCairoSetSourceColor(r->cr, oc); cairo_set_line_width(r->cr, ow + 1); cairo_stroke_preserve(r->cr); cairo_restore(r->cr); } if (c) { msCairoSetSourceColor(r->cr, c); cairo_fill(r->cr); } cairo_new_path(r->cr); return MS_SUCCESS; } cairo_status_t _stream_write_fn(void *b, const unsigned char *data, unsigned int length) { msBufferAppend((bufferObj *)b, (void *)data, length); return CAIRO_STATUS_SUCCESS; } imageObj *createImageCairo(int width, int height, outputFormatObj *format, colorObj *bg) { imageObj *image = NULL; cairo_renderer *r = NULL; if (format->imagemode != MS_IMAGEMODE_RGB && format->imagemode != MS_IMAGEMODE_RGBA) { msSetError(MS_MISCERR, "Cairo driver only supports RGB or RGBA pixel models.", "msImageCreateCairo()"); return image; } if (width > 0 && height > 0) { image = (imageObj *)calloc(1, sizeof(imageObj)); r = (cairo_renderer *)calloc(1, sizeof(cairo_renderer)); if (!strcasecmp(format->driver, "cairo/pdf")) { r->outputStream = (bufferObj *)malloc(sizeof(bufferObj)); msBufferInit(r->outputStream); r->surface = cairo_pdf_surface_create_for_stream( _stream_write_fn, r->outputStream, width, height); #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 15, 10) { const char *msPDFCreationDate = CPLGetConfigOption("MS_PDF_CREATION_DATE", NULL); if (msPDFCreationDate) { cairo_pdf_surface_set_metadata( r->surface, CAIRO_PDF_METADATA_CREATE_DATE, msPDFCreationDate); } } #endif } else if (!strcasecmp(format->driver, "cairo/svg")) { r->outputStream = (bufferObj *)malloc(sizeof(bufferObj)); msBufferInit(r->outputStream); r->surface = cairo_svg_surface_create_for_stream( _stream_write_fn, r->outputStream, width, height); } else if (!strcasecmp(format->driver, "cairo/winGDI") && format->device) { #if CAIRO_HAS_WIN32_SURFACE r->outputStream = NULL; r->surface = cairo_win32_surface_create(format->device); #else msSetError(MS_RENDERERERR, "Cannot create cairo image. Cairo was not compiled with " "support for the win32 backend.", "msImageCreateCairo()"); #endif } else if (!strcasecmp(format->driver, "cairo/winGDIPrint") && format->device) { #if CAIRO_HAS_WIN32_SURFACE r->outputStream = NULL; r->surface = cairo_win32_printing_surface_create(format->device); #else msSetError(MS_RENDERERERR, "Cannot create cairo image. Cairo was not compiled with " "support for the win32 backend.", "msImageCreateCairo()"); #endif } else { r->outputStream = NULL; r->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); } r->cr = cairo_create(r->surface); if (format->transparent || !bg || !MS_VALID_COLOR(*bg)) { r->use_alpha = 1; cairo_set_source_rgba(r->cr, 0, 0, 0, 0); } else { r->use_alpha = 0; msCairoSetSourceColor(r->cr, bg); } cairo_save(r->cr); cairo_set_operator(r->cr, CAIRO_OPERATOR_SOURCE); cairo_paint(r->cr); cairo_restore(r->cr); cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_ROUND); cairo_set_line_join(r->cr, CAIRO_LINE_JOIN_ROUND); image->img.plugin = (void *)r; } else { msSetError(MS_RENDERERERR, "Cannot create cairo image of size %dx%d.", "msImageCreateCairo()", width, height); } return image; } /* msSaveImagePostPDFProcessing() will call the GDAL PDF driver to add * geospatial */ /* information to the regular PDF generated by cairo. This is only triggered if * the */ /* GEO_ENCODING outputformat option is set (to ISO32000 or OGC_BP). Additional */ /* options can be provided by specifying outputformat options starting with */ /* METADATA_ITEM: prefix. For example METADATA_ITEM:PRODUCER=MapServer */ /* Those options are AUTHOR, CREATOR, CREATION_DATE, KEYWORDS, PRODUCER, * SUBJECT, TITLE */ /* See http://gdal.org/frmt_pdf.html documentation. */ static void msTransformToGeospatialPDF(imageObj *img, mapObj *map, cairo_renderer *r) { GDALDatasetH hDS = NULL; const char *pszGEO_ENCODING = NULL; GDALDriverH hPDFDriver = NULL; const char *pszVirtualIO = NULL; int bVirtualIO = FALSE; char *pszTmpFilename = NULL; VSILFILE *fp = NULL; if (map == NULL) return; pszGEO_ENCODING = msGetOutputFormatOption(img->format, "GEO_ENCODING", NULL); if (pszGEO_ENCODING == NULL) return; msGDALInitialize(); hPDFDriver = GDALGetDriverByName("PDF"); if (hPDFDriver == NULL) return; /* When compiled against libpoppler, the PDF driver is VirtualIO capable */ /* but not, when it is compiled against libpodofo. */ pszVirtualIO = GDALGetMetadataItem(hPDFDriver, GDAL_DCAP_VIRTUALIO, NULL); if (pszVirtualIO) bVirtualIO = CSLTestBoolean(pszVirtualIO); if (bVirtualIO) pszTmpFilename = msTmpFile(map, NULL, "/vsimem/mscairopdf/", "pdf"); else pszTmpFilename = msTmpFile(map, map->mappath, NULL, "pdf"); /* Copy content of outputStream buffer into file */ fp = VSIFOpenL(pszTmpFilename, "wb"); if (fp == NULL) { msFree(pszTmpFilename); return; } VSIFWriteL(r->outputStream->data, 1, r->outputStream->size, fp); VSIFCloseL(fp); fp = NULL; hDS = GDALOpen(pszTmpFilename, GA_Update); if (hDS != NULL) { char *pszWKT = msProjectionObj2OGCWKT(&(map->projection)); if (pszWKT != NULL) { double adfGeoTransform[6]; int i; /* Add user-specified options */ for (i = 0; i < img->format->numformatoptions; i++) { const char *pszOption = img->format->formatoptions[i]; if (strncasecmp(pszOption, "METADATA_ITEM:", 14) == 0) { char *pszKey = NULL; const char *pszValue = CPLParseNameValue(pszOption + 14, &pszKey); if (pszKey != NULL) { GDALSetMetadataItem(hDS, pszKey, pszValue, NULL); CPLFree(pszKey); } } } /* We need to rescale the geotransform because GDAL will not necessary */ /* open the PDF with the DPI that was used to generate it */ memcpy(adfGeoTransform, map->gt.geotransform, 6 * sizeof(double)); adfGeoTransform[1] = adfGeoTransform[1] * map->width / GDALGetRasterXSize(hDS); adfGeoTransform[5] = adfGeoTransform[5] * map->height / GDALGetRasterYSize(hDS); GDALSetGeoTransform(hDS, adfGeoTransform); GDALSetProjection(hDS, pszWKT); msFree(pszWKT); pszWKT = NULL; CPLSetThreadLocalConfigOption("GDAL_PDF_GEO_ENCODING", pszGEO_ENCODING); GDALClose(hDS); hDS = NULL; CPLSetThreadLocalConfigOption("GDAL_PDF_GEO_ENCODING", NULL); /* We need to replace the buffer with the content of the GDAL file */ fp = VSIFOpenL(pszTmpFilename, "rb"); if (fp != NULL) { int nFileSize; VSIFSeekL(fp, 0, SEEK_END); nFileSize = (int)VSIFTellL(fp); msBufferResize(r->outputStream, nFileSize); VSIFSeekL(fp, 0, SEEK_SET); r->outputStream->size = VSIFReadL(r->outputStream->data, 1, nFileSize, fp); VSIFCloseL(fp); fp = NULL; } } } if (hDS != NULL) GDALClose(hDS); VSIUnlink(pszTmpFilename); msFree(pszTmpFilename); } int saveImageCairo(imageObj *img, mapObj *map, FILE *fp, outputFormatObj *format_unused) { (void)format_unused; cairo_renderer *r = CAIRO_RENDERER(img); if (!strcasecmp(img->format->driver, "cairo/pdf") || !strcasecmp(img->format->driver, "cairo/svg")) { cairo_surface_finish(r->surface); if (map != NULL && !strcasecmp(img->format->driver, "cairo/pdf")) msTransformToGeospatialPDF(img, map, r); msIO_fwrite(r->outputStream->data, r->outputStream->size, 1, fp); } else { /* not supported */ } return MS_SUCCESS; } unsigned char *saveImageBufferCairo(imageObj *img, int *size_ptr, outputFormatObj *format_unused) { (void)format_unused; cairo_renderer *r = CAIRO_RENDERER(img); unsigned char *data; assert(!strcasecmp(img->format->driver, "cairo/pdf") || !strcasecmp(img->format->driver, "cairo/svg")); cairo_surface_finish(r->surface); data = msSmallMalloc(r->outputStream->size); memcpy(data, r->outputStream->data, r->outputStream->size); *size_ptr = (int)r->outputStream->size; return data; } int renderEllipseSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_save(r->cr); cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_BUTT); cairo_set_line_join(r->cr, CAIRO_LINE_JOIN_MITER); cairo_translate(r->cr, x, y); cairo_rotate(r->cr, -style->rotation); cairo_scale(r->cr, symbol->sizex * style->scale / 2, symbol->sizey * style->scale / 2); cairo_arc(r->cr, 0, 0, 1, 0, 2 * MS_PI); cairo_restore(r->cr); if (style->color) { msCairoSetSourceColor(r->cr, style->color); cairo_fill_preserve(r->cr); } if (style->outlinewidth > 0) { cairo_set_line_width(r->cr, style->outlinewidth); msCairoSetSourceColor(r->cr, style->outlinecolor); cairo_stroke_preserve(r->cr); } cairo_new_path(r->cr); return MS_SUCCESS; } int startLayerVectorCairo(imageObj *img, mapObj *map, layerObj *layer) { (void)map; if (layer->compositer && layer->compositer->opacity < 100) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_push_group(r->cr); } return MS_SUCCESS; } int closeLayerVectorCairo(imageObj *img, mapObj *map, layerObj *layer) { (void)map; if (layer->compositer && layer->compositer->opacity < 100) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_pop_group_to_source(r->cr); cairo_paint_with_alpha(r->cr, layer->compositer->opacity * 0.01); } return MS_SUCCESS; } int startLayerRasterCairo(imageObj *img, mapObj *map, layerObj *layer) { (void)img; (void)map; (void)layer; return MS_SUCCESS; } int closeLayerRasterCairo(imageObj *img, mapObj *map, layerObj *layer) { (void)img; (void)map; (void)layer; return MS_SUCCESS; } int getRasterBufferHandleCairo(imageObj *img, rasterBufferObj *rb) { unsigned char *pb; cairo_renderer *r = CAIRO_RENDERER(img); rb->type = MS_BUFFER_BYTE_RGBA; pb = cairo_image_surface_get_data(r->surface); rb->data.rgba.pixels = pb; rb->data.rgba.row_step = cairo_image_surface_get_stride(r->surface); rb->data.rgba.pixel_step = 4; rb->width = cairo_image_surface_get_width(r->surface); rb->height = cairo_image_surface_get_height(r->surface); rb->data.rgba.r = &(pb[2]); rb->data.rgba.g = &(pb[1]); rb->data.rgba.b = &(pb[0]); if (r->use_alpha) rb->data.rgba.a = &(pb[3]); else rb->data.rgba.a = NULL; return MS_SUCCESS; } int getRasterBufferCopyCairo(imageObj *img, rasterBufferObj *rb) { cairo_renderer *r = CAIRO_RENDERER(img); unsigned char *pb; rb->type = MS_BUFFER_BYTE_RGBA; rb->data.rgba.row_step = cairo_image_surface_get_stride(r->surface); rb->data.rgba.pixel_step = 4; rb->width = cairo_image_surface_get_width(r->surface); rb->height = cairo_image_surface_get_height(r->surface); pb = (unsigned char *)malloc(sizeof(unsigned char) * rb->height * rb->data.rgba.row_step); memcpy(pb, cairo_image_surface_get_data(r->surface), ((size_t)rb->height) * rb->data.rgba.row_step); rb->data.rgba.pixels = pb; rb->data.rgba.r = &(pb[2]); rb->data.rgba.g = &(pb[1]); rb->data.rgba.b = &(pb[0]); if (r->use_alpha) rb->data.rgba.a = &(pb[3]); else rb->data.rgba.a = NULL; return MS_SUCCESS; } static cairo_operator_t ms2cairo_compop(CompositingOperation op) { switch (op) { case MS_COMPOP_CLEAR: return CAIRO_OPERATOR_CLEAR; case MS_COMPOP_SRC: return CAIRO_OPERATOR_SOURCE; case MS_COMPOP_DST: return CAIRO_OPERATOR_DEST; case MS_COMPOP_SRC_OVER: return CAIRO_OPERATOR_OVER; case MS_COMPOP_DST_OVER: return CAIRO_OPERATOR_DEST_OVER; case MS_COMPOP_SRC_IN: return CAIRO_OPERATOR_IN; case MS_COMPOP_DST_IN: return CAIRO_OPERATOR_DEST_IN; case MS_COMPOP_SRC_OUT: return CAIRO_OPERATOR_OUT; case MS_COMPOP_DST_OUT: return CAIRO_OPERATOR_DEST_OUT; case MS_COMPOP_SRC_ATOP: return CAIRO_OPERATOR_ATOP; case MS_COMPOP_DST_ATOP: return CAIRO_OPERATOR_DEST_ATOP; case MS_COMPOP_XOR: return CAIRO_OPERATOR_XOR; case MS_COMPOP_PLUS: return CAIRO_OPERATOR_ADD; case MS_COMPOP_MULTIPLY: return CAIRO_OPERATOR_MULTIPLY; case MS_COMPOP_SCREEN: return CAIRO_OPERATOR_SCREEN; case MS_COMPOP_OVERLAY: return CAIRO_OPERATOR_OVERLAY; case MS_COMPOP_DARKEN: return CAIRO_OPERATOR_DARKEN; case MS_COMPOP_LIGHTEN: return CAIRO_OPERATOR_LIGHTEN; case MS_COMPOP_COLOR_DODGE: return CAIRO_OPERATOR_COLOR_DODGE; case MS_COMPOP_COLOR_BURN: return CAIRO_OPERATOR_COLOR_BURN; case MS_COMPOP_HARD_LIGHT: return CAIRO_OPERATOR_HARD_LIGHT; case MS_COMPOP_SOFT_LIGHT: return CAIRO_OPERATOR_SOFT_LIGHT; case MS_COMPOP_DIFFERENCE: return CAIRO_OPERATOR_DIFFERENCE; case MS_COMPOP_EXCLUSION: return CAIRO_OPERATOR_EXCLUSION; case MS_COMPOP_HSL_HUE: return CAIRO_OPERATOR_HSL_HUE; case MS_COMPOP_HSL_LUMINOSITY: return CAIRO_OPERATOR_HSL_LUMINOSITY; case MS_COMPOP_HSL_SATURATION: return CAIRO_OPERATOR_HSL_SATURATION; case MS_COMPOP_HSL_COLOR: return CAIRO_OPERATOR_HSL_COLOR; case MS_COMPOP_INVERT: case MS_COMPOP_INVERT_RGB: case MS_COMPOP_MINUS: case MS_COMPOP_CONTRAST: default: return CAIRO_OPERATOR_OVER; } } int cairoCompositeRasterBuffer(imageObj *img, rasterBufferObj *rb, CompositingOperation comp, int opacity) { cairo_surface_t *src; cairo_renderer *r; if (rb->type != MS_BUFFER_BYTE_RGBA) { return MS_FAILURE; } r = CAIRO_RENDERER(img); src = cairo_image_surface_create_for_data(rb->data.rgba.pixels, CAIRO_FORMAT_ARGB32, rb->width, rb->height, rb->data.rgba.row_step); cairo_set_source_surface(r->cr, src, 0, 0); cairo_set_operator(r->cr, ms2cairo_compop(comp)); cairo_paint_with_alpha(r->cr, opacity / 100.0); cairo_surface_finish(src); cairo_surface_destroy(src); cairo_set_operator(r->cr, CAIRO_OPERATOR_OVER); return MS_SUCCESS; } int mergeRasterBufferCairo(imageObj *img, rasterBufferObj *rb, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height) { cairo_surface_t *src; cairo_renderer *r; /* not implemented for src,dst,width and height */ if (rb->type != MS_BUFFER_BYTE_RGBA) { return MS_FAILURE; } r = CAIRO_RENDERER(img); src = cairo_image_surface_create_for_data(rb->data.rgba.pixels, CAIRO_FORMAT_ARGB32, rb->width, rb->height, rb->data.rgba.row_step); if (dstX || dstY || srcX || srcY || width != img->width || height != img->height) { cairo_set_source_surface(r->cr, src, dstX - srcX, dstY - srcY); cairo_rectangle(r->cr, dstX, dstY, width, height); cairo_fill(r->cr); } else { cairo_set_source_surface(r->cr, src, 0, 0); cairo_paint_with_alpha(r->cr, opacity); } cairo_surface_finish(src); cairo_surface_destroy(src); return MS_SUCCESS; } void freeSVGCache(symbolObj *s) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *cache = s->renderer_cache; if (!cache) return; assert(cache->svgc); #ifdef USE_SVG_CAIRO svg_cairo_destroy(cache->svgc); #else #if LIBRSVG_CHECK_VERSION(2, 35, 0) g_object_unref(cache->svgc); #else rsvg_handle_free(cache->svgc); #endif #endif if (cache->pixmap_buffer) { msFreeRasterBuffer(cache->pixmap_buffer); free(cache->pixmap_buffer); } msFree(s->renderer_cache); s->renderer_cache = NULL; #else (void)s; #endif } int freeSymbolCairo(symbolObj *s) { if (!s->renderer_cache) return MS_SUCCESS; switch (s->type) { case MS_SYMBOL_VECTOR: cairo_path_destroy(s->renderer_cache); break; case MS_SYMBOL_PIXMAP: cairo_surface_destroy(s->renderer_cache); break; case MS_SYMBOL_SVG: freeSVGCache(s); break; } s->renderer_cache = NULL; return MS_SUCCESS; } int initializeRasterBufferCairo(rasterBufferObj *rb, int width, int height, int mode) { (void)mode; rb->type = MS_BUFFER_BYTE_RGBA; rb->width = width; rb->height = height; rb->data.rgba.pixel_step = 4; rb->data.rgba.row_step = width * 4; rb->data.rgba.pixels = (unsigned char *)calloc(((size_t)width) * height * 4, sizeof(unsigned char)); rb->data.rgba.r = &(rb->data.rgba.pixels[2]); rb->data.rgba.g = &(rb->data.rgba.pixels[1]); rb->data.rgba.b = &(rb->data.rgba.pixels[0]); rb->data.rgba.a = &(rb->data.rgba.pixels[3]); return MS_SUCCESS; } int msPreloadSVGSymbol(symbolObj *symbol) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *cache; if (!symbol->renderer_cache) { cache = msSmallCalloc(1, sizeof(struct svg_symbol_cache)); symbol->renderer_free_func = &freeSVGCache; } else { cache = symbol->renderer_cache; } if (cache->svgc) return MS_SUCCESS; #ifdef USE_SVG_CAIRO { unsigned int svg_width, svg_height; int status; status = svg_cairo_create(&cache->svgc); if (status) { msSetError(MS_RENDERERERR, "problem creating cairo svg", "msPreloadSVGSymbol()"); return MS_FAILURE; } status = svg_cairo_parse(cache->svgc, symbol->full_pixmap_path); if (status) { msSetError(MS_RENDERERERR, "problem parsing svg symbol", "msPreloadSVGSymbol()"); return MS_FAILURE; } svg_cairo_get_size(cache->svgc, &svg_width, &svg_height); if (svg_width == 0 || svg_height == 0) { msSetError(MS_RENDERERERR, "problem parsing svg symbol", "msPreloadSVGSymbol()"); return MS_FAILURE; } symbol->sizex = svg_width; symbol->sizey = svg_height; } #else { cache->svgc = rsvg_handle_new_from_file(symbol->full_pixmap_path, NULL); if (!cache->svgc) { msSetError(MS_RENDERERERR, "failed to load svg file %s", "msPreloadSVGSymbol()", symbol->full_pixmap_path); return MS_FAILURE; } #if LIBRSVG_CHECK_VERSION(2, 46, 0) /* rsvg_handle_get_dimensions_sub() is deprecated since librsvg 2.46 */ /* It seems rsvg_handle_get_intrinsic_dimensions() is the best equivalent */ /* when the root node includes a width and height attributes in pixels */ gboolean has_width = FALSE; RsvgLength width = {0, RSVG_UNIT_PX}; gboolean has_height = FALSE; RsvgLength height = {0, RSVG_UNIT_PX}; gboolean has_viewbox = FALSE; RsvgRectangle viewbox; rsvg_handle_get_intrinsic_dimensions(cache->svgc, &has_width, &width, &has_height, &height, &has_viewbox, &viewbox); if (has_width && width.unit == RSVG_UNIT_PX && has_height && height.unit == RSVG_UNIT_PX) { symbol->sizex = width.length; symbol->sizey = height.length; } else if (!has_viewbox) { RsvgRectangle ink_rect = {0, 0, 0, 0}; rsvg_handle_get_geometry_for_element(cache->svgc, NULL, &ink_rect, NULL, NULL); symbol->sizex = ink_rect.width; symbol->sizey = ink_rect.height; } else { symbol->sizex = viewbox.width; symbol->sizey = viewbox.height; } #else RsvgDimensionData dim; rsvg_handle_get_dimensions_sub(cache->svgc, &dim, NULL); symbol->sizex = dim.width; symbol->sizey = dim.height; #endif } #endif symbol->renderer_cache = cache; return MS_SUCCESS; #else (void)symbol; msSetError(MS_MISCERR, "SVG Symbols requested but is not built with libsvgcairo", "msPreloadSVGSymbol()"); return MS_FAILURE; #endif } int msRenderRasterizedSVGSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *svg_cache; symbolStyleObj pixstyle; symbolObj pixsymbol; int status; if (MS_SUCCESS != msPreloadSVGSymbol(symbol)) return MS_FAILURE; svg_cache = (struct svg_symbol_cache *)symbol->renderer_cache; // already rendered at the right size and scale? return if (svg_cache->scale != style->scale || svg_cache->rotation != style->rotation) { cairo_t *cr; cairo_surface_t *surface; unsigned char *pb; int width, height, surface_w, surface_h; /* need to recompute the pixmap */ if (svg_cache->pixmap_buffer) { msFreeRasterBuffer(svg_cache->pixmap_buffer); } else { svg_cache->pixmap_buffer = msSmallCalloc(1, sizeof(rasterBufferObj)); } // increase pixmap size to accommodate scaling/rotation if (style->scale != 1.0) { width = surface_w = (symbol->sizex * style->scale + 0.5); height = surface_h = (symbol->sizey * style->scale + 0.5); } else { width = surface_w = symbol->sizex; height = surface_h = symbol->sizey; } if (style->rotation != 0) { surface_w = surface_h = MS_NINT(MS_MAX(height, width) * 1.415); } surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, surface_w, surface_h); cr = cairo_create(surface); if (style->rotation != 0) { cairo_translate(cr, surface_w / 2, surface_h / 2); cairo_rotate(cr, -style->rotation); cairo_translate(cr, -width / 2, -height / 2); } if (style->scale != 1.0) { cairo_scale(cr, style->scale, style->scale); } #ifdef USE_SVG_CAIRO if (svg_cairo_render(svg_cache->svgc, cr) != SVG_CAIRO_STATUS_SUCCESS) { return MS_FAILURE; } #else rsvg_handle_render_cairo(svg_cache->svgc, cr); #endif pb = cairo_image_surface_get_data(surface); // set up raster initializeRasterBufferCairo(svg_cache->pixmap_buffer, surface_w, surface_h, 0); memcpy(svg_cache->pixmap_buffer->data.rgba.pixels, pb, sizeof(unsigned char) * surface_w * surface_h * 4); svg_cache->scale = style->scale; svg_cache->rotation = style->rotation; cairo_destroy(cr); cairo_surface_destroy(surface); } pixstyle = *style; pixstyle.rotation = 0.0; pixstyle.scale = 1.0; pixsymbol.pixmap_buffer = svg_cache->pixmap_buffer; pixsymbol.type = MS_SYMBOL_PIXMAP; if (svg_cache->pixmap_buffer->height && svg_cache->pixmap_buffer->width) status = MS_IMAGE_RENDERER(img)->renderPixmapSymbol(img, x, y, &pixsymbol, &pixstyle); else { msDebug("SVG symbol with too small size to be rendered"); status = MS_SUCCESS; } MS_IMAGE_RENDERER(img)->freeSymbol(&pixsymbol); return status; #else (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError( MS_MISCERR, "SVG Symbols requested but MapServer is not built with libsvgcairo", "renderSVGSymbolCairo()"); return MS_FAILURE; #endif } void msCairoCleanup() { cairo_debug_reset_static_data(); } #endif /*USE_CAIRO*/ int msPopulateRendererVTableCairoRaster(rendererVTableObj *renderer) { #ifdef USE_CAIRO renderer->supports_pixel_buffer = 1; renderer->compositeRasterBuffer = cairoCompositeRasterBuffer; renderer->supports_svg = 1; renderer->default_transform_mode = MS_TRANSFORM_SIMPLIFY; initializeCache(&MS_RENDERER_CACHE(renderer)); renderer->startLayer = startLayerRasterCairo; renderer->endLayer = closeLayerRasterCairo; renderer->renderLineTiled = NULL; renderer->renderLine = &renderLineCairo; renderer->createImage = &createImageCairo; renderer->saveImage = &saveImageCairo; renderer->getRasterBufferHandle = &getRasterBufferHandleCairo; renderer->getRasterBufferCopy = &getRasterBufferCopyCairo; renderer->renderPolygon = &renderPolygonCairo; renderer->renderGlyphs = &renderGlyphs2Cairo; renderer->freeImage = &freeImageCairo; renderer->renderEllipseSymbol = &renderEllipseSymbolCairo; renderer->renderVectorSymbol = &renderVectorSymbolCairo; renderer->renderSVGSymbol = &renderSVGSymbolCairo; renderer->renderPixmapSymbol = &renderPixmapSymbolCairo; renderer->mergeRasterBuffer = &mergeRasterBufferCairo; renderer->renderTile = &renderTileCairo; renderer->loadImageFromFile = &msLoadMSRasterBufferFromFile; renderer->renderPolygonTiled = &renderPolygonTiledCairo; renderer->freeSymbol = &freeSymbolCairo; renderer->cleanup = &cleanupCairo; return MS_SUCCESS; #else (void)renderer; msSetError(MS_MISCERR, "Cairo Driver requested but MapServer is not built in", "msPopulateRendererVTableCairoRaster()"); return MS_FAILURE; #endif } int populateRendererVTableCairoVector(rendererVTableObj *renderer) { #ifdef USE_CAIRO renderer->use_imagecache = 0; renderer->supports_pixel_buffer = 0; renderer->compositeRasterBuffer = NULL; renderer->supports_svg = 1; renderer->default_transform_mode = MS_TRANSFORM_SIMPLIFY; initializeCache(&MS_RENDERER_CACHE(renderer)); renderer->startLayer = startLayerVectorCairo; renderer->endLayer = closeLayerVectorCairo; renderer->renderLine = &renderLineCairo; renderer->renderLineTiled = NULL; renderer->createImage = &createImageCairo; renderer->saveImage = &saveImageCairo; renderer->saveImageBuffer = &saveImageBufferCairo; renderer->getRasterBufferHandle = &getRasterBufferHandleCairo; renderer->renderPolygon = &renderPolygonCairo; renderer->renderGlyphs = &renderGlyphs2Cairo; renderer->freeImage = &freeImageCairo; renderer->renderEllipseSymbol = &renderEllipseSymbolCairo; renderer->renderVectorSymbol = &renderVectorSymbolCairo; renderer->renderSVGSymbol = &renderSVGSymbolCairo; renderer->renderPixmapSymbol = &renderPixmapSymbolCairo; renderer->loadImageFromFile = &msLoadMSRasterBufferFromFile; renderer->mergeRasterBuffer = &mergeRasterBufferCairo; renderer->initializeRasterBuffer = initializeRasterBufferCairo; renderer->renderTile = &renderTileCairo; renderer->renderPolygonTiled = &renderPolygonTiledCairo; renderer->freeSymbol = &freeSymbolCairo; renderer->cleanup = &cleanupCairo; return MS_SUCCESS; #else (void)renderer; msSetError(MS_MISCERR, "Cairo Driver requested but MapServer is not built in", "msPopulateRendererVTableCairoRaster()"); return MS_FAILURE; #endif } int msPopulateRendererVTableCairoSVG(rendererVTableObj *renderer) { return populateRendererVTableCairoVector(renderer); } int msPopulateRendererVTableCairoPDF(rendererVTableObj *renderer) { return populateRendererVTableCairoVector(renderer); } �������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.4.0/src/mapchart.c����������������������������������������������������������������������0000664�0000000�0000000�00000061133�14741744413�0016276�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of dynamic charting (MS-RFC-29) * Author: Thomas Bonfort ( thomas.bonfort[at]gmail.com ) * ****************************************************************************** * Copyright (c) 1996-2007 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #define MS_CHART_TYPE_PIE 1 #define MS_CHART_TYPE_BAR 2 #define MS_CHART_TYPE_VBAR 3 /* ** check if an object of width w and height h placed at point x,y can fit in an *image of width mw and height mh */ #define MS_CHART_FITS(x, y, w, h, mw, mh) \ (((x) - (w) / 2. > 0.) && ((x) + (w) / 2. < (mw)) && \ ((y) - (h) / 2. > 0.) && ((y) + (h) / 2.) < (mh)) /* ** find a point on a shape. check if it fits in image ** returns ** MS_SUCCESS and point coordinates in 'p' if chart fits in image ** MS_FAILURE if no point could be found */ int findChartPoint(mapObj *map, shapeObj *shape, int width, int height, pointObj *center) { int middle, numpoints; double invcellsize = 1.0 / map->cellsize; /*speed up MAP2IMAGE_X/Y_IC_DBL*/ switch (shape->type) { case MS_SHAPE_POINT: center->x = MS_MAP2IMAGE_X_IC_DBL(shape->line[0].point[0].x, map->extent.minx, invcellsize); center->y = MS_MAP2IMAGE_Y_IC_DBL(shape->line[0].point[0].y, map->extent.maxy, invcellsize); if (MS_CHART_FITS(center->x, center->y, width, height, map->width, map->height)) return MS_SUCCESS; else return MS_FAILURE; break; case MS_SHAPE_LINE: /*loop through line segments starting from middle (alternate between before *and after middle point) *first segment that fits is chosen */ middle = shape->line[0].numpoints / 2; /*start with middle segment of line*/ numpoints = shape->line[0].numpoints; if (1 <= middle) { int idx = middle + 1; if (idx < numpoints) { center->x = (shape->line[0].point[idx - 1].x + shape->line[0].point[idx].x) / 2.; center->y = (shape->line[0].point[idx - 1].y + shape->line[0].point[idx].y) / 2.; center->x = MS_MAP2IMAGE_X_IC_DBL(center->x, map->extent.minx, invcellsize); center->y = MS_MAP2IMAGE_Y_IC_DBL(center->y, map->extent.maxy, invcellsize); if (MS_CHART_FITS(center->x, center->y, width, height, map->width, map->height)) return MS_SUCCESS; return MS_FAILURE; } idx = middle - 1; center->x = (shape->line[0].point[idx].x + shape->line[0].point[idx + 1].x) / 2; center->y = (shape->line[0].point[idx].y + shape->line[0].point[idx + 1].y) / 2; center->x = MS_MAP2IMAGE_X_IC_DBL(center->x, map->extent.minx, invcellsize); center->y = MS_MAP2IMAGE_Y_IC_DBL(center->y, map->extent.maxy, invcellsize); if (MS_CHART_FITS(center->x, center->y, width, height, map->width, map->height)) return MS_SUCCESS; return MS_FAILURE; } return MS_FAILURE; break; case MS_SHAPE_POLYGON: msPolygonLabelPoint(shape, center, -1); center->x = MS_MAP2IMAGE_X_IC_DBL(center->x, map->extent.minx, invcellsize); center->y = MS_MAP2IMAGE_Y_IC_DBL(center->y, map->extent.maxy, invcellsize); if (MS_CHART_FITS(center->x, center->y, width, height, map->width, map->height)) return MS_SUCCESS; else return MS_FAILURE; break; default: return MS_FAILURE; } } int WARN_UNUSED drawRectangle(mapObj *map, imageObj *image, double mx, double my, double Mx, double My, styleObj *style) { shapeObj shape; lineObj line; pointObj point[5]; line.point = point; line.numpoints = 5; shape.line = &line; shape.numlines = 1; point[0].x = point[4].x = point[3].x = mx; point[0].y = point[4].y = point[1].y = my; /* cppcheck-suppress unreadVariable */ point[1].x = point[2].x = Mx; /* cppcheck-suppress unreadVariable */ point[2].y = point[3].y = My; return msDrawShadeSymbol(map, image, &shape, style, 1.0); } int WARN_UNUSED msDrawVBarChart(mapObj *map, imageObj *image, pointObj *center, double *values, styleObj **styles, int numvalues, double barWidth) { int c; double left, cur; /*shortcut to pixel boundaries of the chart*/ double height = 0; for (c = 0; c < numvalues; c++) { height += values[c]; } cur = center->y + height / 2.; left = center->x - barWidth / 2.; for (c = 0; c < numvalues; c++) { if (MS_UNLIKELY(MS_FAILURE == drawRectangle(map, image, left, cur, left + barWidth, cur - values[c], styles[c]))) return MS_FAILURE; cur -= values[c]; } return MS_SUCCESS; } int msDrawBarChart(mapObj *map, imageObj *image, pointObj *center, double *values, styleObj **styles, int numvalues, double width, double height, double *maxVal, double *minVal, double barWidth) { double upperLimit, lowerLimit; double shapeMaxVal, shapeMinVal, pixperval; int c; double vertOrigin, vertOriginClipped, horizStart, y; double left, top, bottom; /*shortcut to pixel boundaries of the chart*/ top = center->y - height / 2.; bottom = center->y + height / 2.; left = center->x - width / 2.; shapeMaxVal = shapeMinVal = values[0]; for (c = 1; c < numvalues; c++) { if (maxVal == NULL || minVal == NULL) { /*compute bounds if not specified*/ if (values[c] > shapeMaxVal) shapeMaxVal = values[c]; if (values[c] < shapeMinVal) shapeMinVal = values[c]; } } /* * use specified bounds if wanted * if not, always show the origin */ upperLimit = (maxVal != NULL) ? *maxVal : MS_MAX(shapeMaxVal, 0); lowerLimit = (minVal != NULL) ? *minVal : MS_MIN(shapeMinVal, 0); if (upperLimit == lowerLimit) { /* treat the case where we would have an unspecified behavior */ upperLimit += 0.5; lowerLimit -= 0.5; } pixperval = height / (upperLimit - lowerLimit); vertOrigin = bottom + lowerLimit * pixperval; vertOriginClipped = (vertOrigin < top) ? top : (vertOrigin > bottom) ? bottom : vertOrigin; horizStart = left; for (c = 0; c < numvalues; c++) { double barHeight = values[c] * pixperval; /*clip bars*/ y = ((vertOrigin - barHeight) < top) ? top : (vertOrigin - barHeight > bottom) ? bottom : vertOrigin - barHeight; if (y != vertOriginClipped) { /*don't draw bars of height == 0 (i.e. either values==0, or clipped)*/ if (values[c] > 0) { if (MS_UNLIKELY(MS_FAILURE == drawRectangle(map, image, horizStart, y, horizStart + barWidth - 1, vertOriginClipped, styles[c]))) return MS_FAILURE; } else { if (MS_UNLIKELY(MS_FAILURE == drawRectangle(map, image, horizStart, vertOriginClipped, horizStart + barWidth - 1, y, styles[c]))) return MS_FAILURE; } } horizStart += barWidth; } return MS_SUCCESS; } int WARN_UNUSED msDrawPieChart(mapObj *map, imageObj *image, pointObj *center, double diameter, double *values, styleObj **styles, int numvalues) { int i; double dTotal = 0., start = 0; for (i = 0; i < numvalues; i++) { if (values[i] < 0.) { msSetError(MS_MISCERR, "cannot draw pie charts for negative values", "msDrawPieChart()"); return MS_FAILURE; } dTotal += values[i]; } for (i = 0; i < numvalues; i++) { double angle = values[i]; if (angle == 0) continue; /*no need to draw. causes artifacts with outlines*/ angle *= 360.0 / dTotal; if (MS_UNLIKELY(MS_FAILURE == msDrawPieSlice(map, image, center, styles[i], diameter / 2., start, start + angle))) return MS_FAILURE; start += angle; } return MS_SUCCESS; } int getNextShape(mapObj *map, layerObj *layer, double *values, int *nvalues, styleObj **styles, shapeObj *shape) { int status; int c; status = msLayerNextShape(layer, shape); if (status == MS_SUCCESS) { if (layer->project) { if (layer->reprojectorLayerToMap == NULL) { layer->reprojectorLayerToMap = msProjectCreateReprojector(&layer->projection, &map->projection); if (layer->reprojectorLayerToMap == NULL) { return MS_FAILURE; } } msProjectShapeEx(layer->reprojectorLayerToMap, shape); } if (msBindLayerToShape(layer, shape, MS_DRAWMODE_FEATURES | MS_DRAWMODE_LABELS) != MS_SUCCESS) return MS_FAILURE; /* error message is set in msBindLayerToShape() */ *nvalues = 0; for (c = 0; c < layer->numclasses; c++) { if (msEvalExpression(layer, shape, &(layer->class[c] -> expression), layer->classitemindex) == MS_TRUE) { values[*nvalues] = (layer->class[c] -> styles[0] -> size); styles[*nvalues] = layer->class[c]->styles[0]; (*nvalues)++; } } } return status; } /* eventually add a class to the layer to get the diameter from an attribute */ int pieLayerProcessDynamicDiameter(layerObj *layer) { const char *chartRangeProcessingKey = NULL; char *attrib; double mindiameter = -1, maxdiameter, minvalue, maxvalue; classObj *newclass; styleObj *newstyle; const char *chartSizeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE"); if (chartSizeProcessingKey != NULL) return MS_FALSE; chartRangeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE_RANGE"); if (chartRangeProcessingKey == NULL) return MS_FALSE; attrib = msStrdup(chartRangeProcessingKey); char *space = strchr(attrib, ' '); if (space) { *space = '\0'; if (sscanf(space + 1, "%lf %lf %lf %lf", &mindiameter, &maxdiameter, &minvalue, &maxvalue) != 4) { /*we don't have the attribute and the four range values*/ free(attrib); msSetError(MS_MISCERR, "Chart Layer format error for processing key \"CHART_RANGE\"", "msDrawChartLayer()"); return MS_FAILURE; } } /*create a new class in the layer containing the wanted attribute * as the SIZE of its first STYLE*/ newclass = msGrowLayerClasses(layer); if (newclass == NULL) { free(attrib); return MS_FAILURE; } initClass(newclass); layer->numclasses++; /*create and attach a new styleObj to our temp class * and bind the wanted attribute to its SIZE */ newstyle = msGrowClassStyles(newclass); if (newstyle == NULL) { free(attrib); return MS_FAILURE; } initStyle(newstyle); newclass->numstyles++; newclass->name = (char *)msStrdup("__MS_SIZE_ATTRIBUTE_"); newstyle->bindings[MS_STYLE_BINDING_SIZE].item = msStrdup(attrib); newstyle->numbindings++; free(attrib); return MS_TRUE; } /* clean up the class added temporarily */ static void pieLayerCleanupDynamicDiameter(layerObj *layer) { if (layer->numclasses > 0 && EQUALN(layer->class[layer->numclasses - 1] -> name, "__MS_SIZE_ATTRIBUTE_", 20)) { classObj *c = msRemoveClass(layer, layer->numclasses - 1); freeClass(c); msFree(c); } } int msDrawPieChartLayer(mapObj *map, layerObj *layer, imageObj *image) { shapeObj shape; int status = MS_SUCCESS; const char *chartRangeProcessingKey = NULL; const char *chartSizeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE"); double diameter = 0, mindiameter = -1, maxdiameter = 0, minvalue = 0, maxvalue = 0, exponent = 0; double *values; styleObj **styles; pointObj center; int numvalues = layer->numclasses; /* the number of classes to represent in the graph */ int numvalues_for_shape = 0; if (chartSizeProcessingKey == NULL) { chartRangeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE_RANGE"); if (chartRangeProcessingKey == NULL) diameter = 20; else { const int nvalues = sscanf(chartRangeProcessingKey, "%*s %lf %lf %lf %lf %lf", &mindiameter, &maxdiameter, &minvalue, &maxvalue, &exponent); if (nvalues != 4 && nvalues != 5) { msSetError( MS_MISCERR, "msDrawChart format error for processing key \"CHART_SIZE_RANGE\": " "itemname minsize maxsize minval maxval [exponent] is expected", "msDrawPieChartLayer()"); return MS_FAILURE; } } } else { if (sscanf(chartSizeProcessingKey, "%lf", &diameter) != 1) { msSetError(MS_MISCERR, "msDrawChart format error for processing key \"CHART_SIZE\"", "msDrawPieChartLayer()"); return MS_FAILURE; } } layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); /* step through the target shapes */ msInitShape(&shape); values = (double *)calloc(numvalues, sizeof(double)); MS_CHECK_ALLOC(values, numvalues * sizeof(double), MS_FAILURE); styles = (styleObj **)malloc((numvalues) * sizeof(styleObj *)); if (styles == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msDrawPieChartLayer()", __FILE__, __LINE__, (unsigned int)(numvalues * sizeof(styleObj *))); free(values); return MS_FAILURE; } while (MS_SUCCESS == getNextShape(map, layer, values, &numvalues_for_shape, styles, &shape)) { if (chartRangeProcessingKey != NULL) numvalues_for_shape--; if (numvalues_for_shape == 0) { msFreeShape(&shape); continue; } msDrawStartShape(map, layer, image, &shape); if (chartRangeProcessingKey != NULL) { diameter = values[numvalues_for_shape]; if (mindiameter >= 0) { if (diameter <= minvalue) diameter = mindiameter; else if (diameter >= maxvalue) diameter = maxdiameter; else { if (exponent <= 0) diameter = MS_NINT(mindiameter + ((diameter - minvalue) / (maxvalue - minvalue)) * (maxdiameter - mindiameter)); else diameter = MS_NINT( mindiameter + pow((diameter - minvalue) / (maxvalue - minvalue), 1.0 / exponent) * (maxdiameter - mindiameter)); } } } if (findChartPoint(map, &shape, diameter, diameter, ¢er) == MS_SUCCESS) { status = msDrawPieChart(map, image, ¢er, diameter, values, styles, numvalues_for_shape); } msDrawEndShape(map, layer, image, &shape); msFreeShape(&shape); } free(values); free(styles); return status; } int msDrawVBarChartLayer(mapObj *map, layerObj *layer, imageObj *image) { shapeObj shape; int status = MS_SUCCESS; const char *chartSizeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE"); const char *chartScaleProcessingKey = msLayerGetProcessingKey(layer, "CHART_SCALE"); double barWidth, scale = 1.0; double *values; styleObj **styles; pointObj center; int numvalues = layer->numclasses; int numvalues_for_shape; if (chartSizeProcessingKey == NULL) { barWidth = 20; } else { if (sscanf(chartSizeProcessingKey, "%lf", &barWidth) != 1) { msSetError(MS_MISCERR, "msDrawChart format error for processing key \"CHART_SIZE\"", "msDrawVBarChartLayer()"); return MS_FAILURE; } } if (chartScaleProcessingKey) { if (sscanf(chartScaleProcessingKey, "%lf", &scale) != 1) { msSetError(MS_MISCERR, "Error reading value for processing key \"CHART_SCALE\"", "msDrawVBarChartLayer()"); return MS_FAILURE; } } msInitShape(&shape); values = (double *)calloc(numvalues, sizeof(double)); MS_CHECK_ALLOC(values, numvalues * sizeof(double), MS_FAILURE); styles = (styleObj **)malloc(numvalues * sizeof(styleObj *)); if (styles == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msDrawVBarChartLayer()", __FILE__, __LINE__, (unsigned int)(numvalues * sizeof(styleObj *))); free(values); return MS_FAILURE; } while (MS_SUCCESS == getNextShape(map, layer, values, &numvalues_for_shape, styles, &shape)) { int i; double h = 0; if (numvalues_for_shape == 0) { continue; } for (i = 0; i < numvalues_for_shape; i++) { values[i] *= scale; h += values[i]; } msDrawStartShape(map, layer, image, &shape); if (findChartPoint(map, &shape, barWidth, h, ¢er) == MS_SUCCESS) { status = msDrawVBarChart(map, image, ¢er, values, styles, numvalues_for_shape, barWidth); } msDrawEndShape(map, layer, image, &shape); msFreeShape(&shape); } free(values); free(styles); return status; } int msDrawBarChartLayer(mapObj *map, layerObj *layer, imageObj *image) { shapeObj shape; int status = MS_SUCCESS; const char *chartSizeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE"); const char *barMax = msLayerGetProcessingKey(layer, "CHART_BAR_MAXVAL"); const char *barMin = msLayerGetProcessingKey(layer, "CHART_BAR_MINVAL"); double width, height; double barWidth; double *values; styleObj **styles; pointObj center; double barMaxVal = 0.0, barMinVal = 0.0; int numvalues = layer->numclasses; int numvalues_for_shape; if (chartSizeProcessingKey == NULL) { width = height = 20; } else { const int ret = sscanf(chartSizeProcessingKey, "%lf %lf", &width, &height); if (ret == 1) { height = width; } else if (ret != 2) { msSetError(MS_MISCERR, "msDrawChart format error for processing key \"CHART_SIZE\"", "msDrawBarChartLayer()"); return MS_FAILURE; } } if (barMax) { if (sscanf(barMax, "%lf", &barMaxVal) != 1) { msSetError(MS_MISCERR, "Error reading value for processing key \"CHART_BAR_MAXVAL\"", "msDrawBarChartLayer()"); return MS_FAILURE; } } if (barMin) { if (sscanf(barMin, "%lf", &barMinVal) != 1) { msSetError(MS_MISCERR, "Error reading value for processing key \"CHART_BAR_MINVAL\"", "msDrawBarChartLayer()"); return MS_FAILURE; } } if (barMin && barMax && barMinVal >= barMaxVal) { msSetError(MS_MISCERR, "\"CHART_BAR_MINVAL\" must be less than \"CHART_BAR_MAXVAL\"", "msDrawBarChartLayer()"); return MS_FAILURE; } barWidth = (double)width / (double)layer->numclasses; if (!barWidth) { msSetError( MS_MISCERR, "Specified width of chart too small to fit given number of classes", "msDrawBarChartLayer()"); return MS_FAILURE; } msInitShape(&shape); values = (double *)calloc(numvalues, sizeof(double)); MS_CHECK_ALLOC(values, numvalues * sizeof(double), MS_FAILURE); styles = (styleObj **)malloc(numvalues * sizeof(styleObj *)); if (styles == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msDrawBarChartLayer()", __FILE__, __LINE__, (unsigned int)(numvalues * sizeof(styleObj *))); free(values); return MS_FAILURE; } while (MS_SUCCESS == getNextShape(map, layer, values, &numvalues_for_shape, styles, &shape)) { if (numvalues_for_shape == 0) continue; msDrawStartShape(map, layer, image, &shape); if (findChartPoint(map, &shape, width, height, ¢er) == MS_SUCCESS) { status = msDrawBarChart(map, image, ¢er, values, styles, numvalues_for_shape, width, height, (barMax != NULL) ? &barMaxVal : NULL, (barMin != NULL) ? &barMinVal : NULL, barWidth); } msDrawEndShape(map, layer, image, &shape); msFreeShape(&shape); } free(values); free(styles); return status; } /** * Generic function to render chart layers. */ int msDrawChartLayer(mapObj *map, layerObj *layer, imageObj *image) { rectObj searchrect; const char *chartTypeProcessingKey = msLayerGetProcessingKey(layer, "CHART_TYPE"); int chartType = MS_CHART_TYPE_PIE; int status = MS_FAILURE; if (image && map) { if (!(MS_RENDERER_PLUGIN(image->format))) { msSetError(MS_MISCERR, "chart drawing currently only supports GD and AGG renderers", "msDrawChartLayer()"); return MS_FAILURE; } if (chartTypeProcessingKey != NULL) { if (strcasecmp(chartTypeProcessingKey, "PIE") == 0) { chartType = MS_CHART_TYPE_PIE; } else if (strcasecmp(chartTypeProcessingKey, "BAR") == 0) { chartType = MS_CHART_TYPE_BAR; } else if (strcasecmp(chartTypeProcessingKey, "VBAR") == 0) { chartType = MS_CHART_TYPE_VBAR; } else { msSetError(MS_MISCERR, "unknown chart type for processing key \"CHART_TYPE\", must " "be one of \"PIE\" or \"BAR\"", "msDrawChartLayer()"); return MS_FAILURE; } } if (chartType == MS_CHART_TYPE_PIE) { pieLayerProcessDynamicDiameter(layer); } /* open this layer */ status = msLayerOpen(layer); if (status != MS_SUCCESS) return MS_FAILURE; status = msLayerWhichItems(layer, MS_FALSE, NULL); if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } /* identify target shapes */ if (layer->transform == MS_TRUE) searchrect = map->extent; else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) msProjectRect(&map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ status = msLayerWhichShapes(layer, searchrect, MS_FALSE); if (status == MS_DONE) { /* no overlap */ msLayerClose(layer); if (chartType == MS_CHART_TYPE_PIE) pieLayerCleanupDynamicDiameter(layer); return MS_SUCCESS; } else if (status != MS_SUCCESS) { msLayerClose(layer); if (chartType == MS_CHART_TYPE_PIE) pieLayerCleanupDynamicDiameter(layer); return MS_FAILURE; } switch (chartType) { case MS_CHART_TYPE_PIE: status = msDrawPieChartLayer(map, layer, image); break; case MS_CHART_TYPE_BAR: status = msDrawBarChartLayer(map, layer, image); break; case MS_CHART_TYPE_VBAR: status = msDrawVBarChartLayer(map, layer, image); break; default: return MS_FAILURE; /*shouldn't be here anyways*/ } msLayerClose(layer); if (chartType == MS_CHART_TYPE_PIE) pieLayerCleanupDynamicDiameter(layer); } return status; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.4.0/src/mapcluster.c��������������������������������������������������������������������0000664�0000000�0000000�00000165037�14741744413�0016666�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of the cluster layer data provider (RFC-69). * Author: Tamas Szekeres (szekerest@gmail.com). * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #define _CRT_SECURE_NO_WARNINGS 1 /* $Id$ */ #include #include "mapserver.h" #ifdef USE_CLUSTER_PLUGIN #define USE_CLUSTER_EXTERNAL #endif /* custom attributes provided by this layer data source */ #define MSCLUSTER_NUMITEMS 3 #define MSCLUSTER_FEATURECOUNT "Cluster_FeatureCount" #define MSCLUSTER_FEATURECOUNTINDEX -100 #define MSCLUSTER_GROUP "Cluster_Group" #define MSCLUSTER_GROUPINDEX -101 #define MSCLUSTER_BASEFID "Cluster_BaseFID" #define MSCLUSTER_BASEFIDINDEX -102 typedef struct cluster_tree_node clusterTreeNode; typedef struct cluster_info clusterInfo; typedef struct cluster_layer_info msClusterLayerInfo; /* forward declarations */ void msClusterLayerCopyVirtualTable(layerVTableObj *vtable); static void clusterTreeNodeDestroy(msClusterLayerInfo *layerinfo, clusterTreeNode *node); /* cluster compare func */ typedef int (*clusterCompareRegionFunc)(clusterInfo *current, clusterInfo *other); /* quadtree constants */ #define SPLITRATIO 0.55 #define TREE_MAX_DEPTH 10 /* cluster algorithm */ #define MSCLUSTER_ALGORITHM_FULL 0 #define MSCLUSTER_ALGORITHM_SIMPLE 1 /* cluster data */ struct cluster_info { double x; /* x position of the current point */ double y; /* y position of the current point */ double avgx; /* average x positions of this cluster */ double avgy; /* average y positions of this cluster */ double varx; /* variance of the x positions of this cluster */ double vary; /* variance of the y positions of this cluster */ shapeObj shape; /* current shape */ rectObj bounds; /* clustering region */ /* number of the neighbouring shapes */ int numsiblings; /* diagnostics */ int numcollected; int numremoved; int index; clusterTreeNode *node; /* collection of the siblings */ clusterInfo *siblings; /* next shape in the linked list */ clusterInfo *next; /* current group */ char *group; int filter; }; /* quadtree node */ struct cluster_tree_node { /* area covered by this node */ rectObj rect; /* linked list of the shapes stored at this node. */ int numshapes; int index; int position; clusterInfo *shapes; /* quad tree subnodes */ clusterTreeNode *subnode[4]; }; /* layerinfo */ struct cluster_layer_info { /* array of features (finalized clusters) */ clusterInfo *finalized; clusterInfo *finalizedSiblings; clusterInfo *filtered; int numFeatures; int numFinalized; int numFinalizedSiblings; int numFiltered; /* variables for collecting the best cluster and iterating with NextShape */ clusterInfo *current; /* check whether all shapes should be returned behind a cluster */ int get_all_shapes; /* check whether the location of the shapes should be preserved (no averaging) */ int keep_locations; /* the maxdistance and the buffer parameters are specified in map units (scale * independent clustering) */ int use_map_units; double rank; /* root node of the quad tree */ clusterTreeNode *root; int numNodes; clusterTreeNode *finalizedNodes; int numFinalizedNodes; /* map extent used for building cluster data */ rectObj searchRect; /* source layer parameters */ layerObj srcLayer; /* distance comparator function */ clusterCompareRegionFunc fnCompare; /* diagnostics */ int depth; /* processing algorithm */ int algorithm; }; extern int yyparse(parseObj *p); /* evaluate the filter expression */ int msClusterEvaluateFilter(expressionObj *expression, shapeObj *shape) { if (expression->type == MS_EXPRESSION) { int status; parseObj p; p.shape = shape; p.expr = expression; p.expr->curtoken = p.expr->tokens; /* reset */ p.type = MS_PARSE_TYPE_BOOLEAN; status = yyparse(&p); if (status != 0) { msSetError(MS_PARSEERR, "Failed to parse expression: %s", "msClusterEvaluateFilter", expression->string); return 0; } return p.result.intval; } return 0; } /* get the group text when creating the clusters */ char *msClusterGetGroupText(expressionObj *expression, shapeObj *shape) { char *tmpstr = NULL; if (expression->string) { switch (expression->type) { case (MS_STRING): tmpstr = msStrdup(expression->string); break; case (MS_EXPRESSION): { int status; parseObj p; p.shape = shape; p.expr = expression; p.expr->curtoken = p.expr->tokens; /* reset */ p.type = MS_PARSE_TYPE_STRING; status = yyparse(&p); if (status != 0) { msSetError(MS_PARSEERR, "Failed to process text expression: %s", "msClusterGetGroupText", expression->string); return NULL; } tmpstr = p.result.strval; break; } default: break; } } return (tmpstr); } int CompareEllipseRegion(clusterInfo *current, clusterInfo *other) { if (current->group && other->group && !EQUAL(current->group, other->group)) return MS_FALSE; if ((other->x - current->x) * (other->x - current->x) / ((current->bounds.maxx - current->x) * (current->bounds.maxx - current->x)) + (other->y - current->y) * (other->y - current->y) / ((current->bounds.maxy - current->y) * (current->bounds.maxy - current->y)) > 1) return MS_FALSE; return MS_TRUE; } int CompareRectangleRegion(clusterInfo *current, clusterInfo *other) { if (current->group && other->group && !EQUAL(current->group, other->group)) return MS_FALSE; if (other->x < current->bounds.minx) return MS_FALSE; if (other->x > current->bounds.maxx) return MS_FALSE; if (other->y < current->bounds.miny) return MS_FALSE; if (other->y > current->bounds.maxy) return MS_FALSE; return MS_TRUE; } static void treeSplitBounds(rectObj *in, rectObj *out1, rectObj *out2) { double range; /* -------------------------------------------------------------------- */ /* The output bounds will be very similar to the input bounds, */ /* so just copy over to start. */ /* -------------------------------------------------------------------- */ memcpy(out1, in, sizeof(rectObj)); memcpy(out2, in, sizeof(rectObj)); /* -------------------------------------------------------------------- */ /* Split in X direction. */ /* -------------------------------------------------------------------- */ if ((in->maxx - in->minx) > (in->maxy - in->miny)) { range = in->maxx - in->minx; out1->maxx = in->minx + range * SPLITRATIO; out2->minx = in->maxx - range * SPLITRATIO; } /* -------------------------------------------------------------------- */ /* Otherwise split in Y direction. */ /* -------------------------------------------------------------------- */ else { range = in->maxy - in->miny; out1->maxy = in->miny + range * SPLITRATIO; out2->miny = in->maxy - range * SPLITRATIO; } } /* alloc memory for a new tentative cluster */ static clusterInfo *clusterInfoCreate(msClusterLayerInfo *layerinfo) { clusterInfo *feature = (clusterInfo *)msSmallMalloc(sizeof(clusterInfo)); msInitShape(&feature->shape); feature->numsiblings = 0; feature->numcollected = 0; feature->numremoved = 0; feature->next = NULL; feature->group = NULL; feature->node = NULL; feature->siblings = NULL; feature->index = layerinfo->numFeatures; feature->filter = -1; /* not yet calculated */ ++layerinfo->numFeatures; return feature; } /* destroy memory of the cluster list */ static void clusterInfoDestroyList(msClusterLayerInfo *layerinfo, clusterInfo *feature) { clusterInfo *s = feature; clusterInfo *next; /* destroy the shapes added to this node */ while (s) { next = s->next; if (s->siblings) { clusterInfoDestroyList(layerinfo, s->siblings); } msFreeShape(&s->shape); msFree(s->group); msFree(s); --layerinfo->numFeatures; s = next; } } /* alloc memory for a new treenode */ static clusterTreeNode *clusterTreeNodeCreate(msClusterLayerInfo *layerinfo, rectObj rect) { clusterTreeNode *node = (clusterTreeNode *)msSmallMalloc(sizeof(clusterTreeNode)); node->rect = rect; node->numshapes = 0; node->shapes = NULL; node->subnode[0] = node->subnode[1] = node->subnode[2] = node->subnode[3] = NULL; node->index = layerinfo->numNodes; node->position = 0; ++layerinfo->numNodes; return node; } /* traverse the quadtree and destroy all sub elements */ static void clusterTreeNodeDestroy(msClusterLayerInfo *layerinfo, clusterTreeNode *node) { int i; /* destroy the shapes added to this node */ clusterInfoDestroyList(layerinfo, node->shapes); /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) clusterTreeNodeDestroy(layerinfo, node->subnode[i]); } msFree(node); --layerinfo->numNodes; } /* destroy memory of the cluster finalized list (without recursion) */ static void clusterTreeNodeDestroyList(msClusterLayerInfo *layerinfo, clusterTreeNode *node) { clusterTreeNode *n = node; clusterTreeNode *next; /* destroy the list of nodes */ while (n) { next = n->subnode[0]; n->subnode[0] = NULL; clusterTreeNodeDestroy(layerinfo, n); --layerinfo->numFinalizedNodes; n = next; } } void clusterDestroyData(msClusterLayerInfo *layerinfo) { if (layerinfo->finalized) { clusterInfoDestroyList(layerinfo, layerinfo->finalized); layerinfo->finalized = NULL; } layerinfo->numFinalized = 0; if (layerinfo->finalizedSiblings) { clusterInfoDestroyList(layerinfo, layerinfo->finalizedSiblings); layerinfo->finalizedSiblings = NULL; } layerinfo->numFinalizedSiblings = 0; if (layerinfo->filtered) { clusterInfoDestroyList(layerinfo, layerinfo->filtered); layerinfo->filtered = NULL; } layerinfo->numFiltered = 0; if (layerinfo->finalizedNodes) { clusterTreeNodeDestroyList(layerinfo, layerinfo->finalizedNodes); layerinfo->finalizedNodes = NULL; } layerinfo->numFinalizedNodes = 0; if (layerinfo->root) { clusterTreeNodeDestroy(layerinfo, layerinfo->root); layerinfo->root = NULL; } layerinfo->numNodes = 0; } /* traverse the quadtree to find the neighbouring shapes and update some data on the related shapes (when adding a new feature)*/ static void findRelatedShapes(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *current) { int i; clusterInfo *s; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if (!msRectOverlap(&node->rect, ¤t->bounds)) return; /* Modify the feature count of the related shapes */ s = node->shapes; while (s) { if (layerinfo->fnCompare(current, s)) { ++current->numsiblings; /* calculating the average positions */ current->avgx = (current->avgx * current->numsiblings + s->x) / (current->numsiblings + 1); current->avgy = (current->avgy * current->numsiblings + s->y) / (current->numsiblings + 1); /* calculating the variance */ current->varx = current->varx * current->numsiblings / (current->numsiblings + 1) + (s->x - current->avgx) * (s->x - current->avgx) / (current->numsiblings + 1); current->vary = current->vary * current->numsiblings / (current->numsiblings + 1) + (s->y - current->avgy) * (s->y - current->avgy) / (current->numsiblings + 1); if (layerinfo->fnCompare(s, current)) { /* this feature falls into the region of the other as well */ ++s->numsiblings; /* calculating the average positions */ s->avgx = (s->avgx * s->numsiblings + current->x) / (s->numsiblings + 1); s->avgy = (s->avgy * s->numsiblings + current->y) / (s->numsiblings + 1); /* calculating the variance */ s->varx = s->varx * s->numsiblings / (s->numsiblings + 1) + (current->x - s->avgx) * (current->x - s->avgx) / (s->numsiblings + 1); s->vary = s->vary * s->numsiblings / (s->numsiblings + 1) + (current->y - s->avgy) * (current->y - s->avgy) / (s->numsiblings + 1); } } s = s->next; } if (node->subnode[0] == NULL) return; /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) findRelatedShapes(layerinfo, node->subnode[i], current); } } /* traverse the quadtree to find the neighbouring clusters and update data on * the cluster*/ static void findRelatedShapes2(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *current) { int i; clusterInfo *s; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if (!msRectOverlap(&node->rect, ¤t->bounds)) return; /* Modify the feature count of the related shapes */ s = node->shapes; while (s) { if (layerinfo->fnCompare(s, current)) { if (layerinfo->rank > 0) { double r = (current->x - s->x) * (current->x - s->x) + (current->y - s->y) * (current->y - s->y); if (r < layerinfo->rank) { layerinfo->current = s; layerinfo->rank = r; } } else { /* no rank was specified, return immediately */ layerinfo->current = s; return; } } s = s->next; } if (node->subnode[0] == NULL) return; /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) findRelatedShapes2(layerinfo, node->subnode[i], current); } } /* traverse the quadtree to find the neighbouring shapes and update some data on the related shapes (when removing a feature) */ static void findRelatedShapesRemove(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *current) { int i; clusterInfo *s; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if (!msRectOverlap(&node->rect, ¤t->bounds)) return; /* Modify the feature count of the related shapes */ s = node->shapes; while (s) { if (layerinfo->fnCompare(current, s)) { if (s->numsiblings > 0) { /* calculating the average positions */ s->avgx = (s->avgx * (s->numsiblings + 1) - current->x) / s->numsiblings; s->avgy = (s->avgy * (s->numsiblings + 1) - current->y) / s->numsiblings; /* calculating the variance */ s->varx = (s->varx - (current->x - s->avgx) * (current->x - s->avgx) / s->numsiblings) * (s->numsiblings + 1) / s->numsiblings; s->vary = (s->vary - (current->y - s->avgy) * (current->y - s->avgy) / s->numsiblings) * (s->numsiblings + 1) / s->numsiblings; --s->numsiblings; ++s->numremoved; } } s = s->next; } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) findRelatedShapesRemove(layerinfo, node->subnode[i], current); } } /* setting the aggregated attributes */ static void InitShapeAttributes(layerObj *layer, clusterInfo *base) { int i; int *itemindexes = layer->iteminfo; for (i = 0; i < layer->numitems; i++) { if (base->shape.numvalues <= i) break; if (itemindexes[i] == MSCLUSTER_FEATURECOUNTINDEX) { if (base->shape.values[i]) msFree(base->shape.values[i]); base->shape.values[i] = msIntToString(base->numsiblings + 1); } else if (itemindexes[i] == MSCLUSTER_GROUPINDEX) { if (base->shape.values[i]) msFree(base->shape.values[i]); if (base->group) base->shape.values[i] = msStrdup(base->group); else base->shape.values[i] = msStrdup(""); } else if (itemindexes[i] == MSCLUSTER_BASEFIDINDEX) { if (base->shape.values[i]) msFree(base->shape.values[i]); base->shape.values[i] = msIntToString(base->shape.index); } else if (EQUALN(layer->items[i], "Count:", 6)) { if (base->shape.values[i]) msFree(base->shape.values[i]); base->shape.values[i] = msStrdup("1"); /* initial count */ } } } /* update the shape attributes (aggregate) */ static void UpdateShapeAttributes(layerObj *layer, clusterInfo *base, clusterInfo *current) { int i; int *itemindexes = layer->iteminfo; for (i = 0; i < layer->numitems; i++) { if (base->shape.numvalues <= i) break; if (itemindexes[i] == MSCLUSTER_FEATURECOUNTINDEX || itemindexes[i] == MSCLUSTER_GROUPINDEX) continue; if (current->shape.numvalues <= i) break; /* setting the base feature index for each cluster member */ if (itemindexes[i] == MSCLUSTER_BASEFIDINDEX) { msFree(current->shape.values[i]); current->shape.values[i] = msIntToString(base->shape.index); } if (current->shape.values[i]) { if (EQUALN(layer->items[i], "Min:", 4)) { if (strcasecmp(base->shape.values[i], current->shape.values[i]) > 0) { msFree(base->shape.values[i]); base->shape.values[i] = msStrdup(current->shape.values[i]); } } else if (EQUALN(layer->items[i], "Max:", 4)) { if (strcasecmp(base->shape.values[i], current->shape.values[i]) < 0) { msFree(base->shape.values[i]); base->shape.values[i] = msStrdup(current->shape.values[i]); } } else if (EQUALN(layer->items[i], "Sum:", 4)) { double sum = atof(base->shape.values[i]) + atof(current->shape.values[i]); msFree(base->shape.values[i]); base->shape.values[i] = msDoubleToString(sum, MS_FALSE); } else if (EQUALN(layer->items[i], "Count:", 6)) { int count = atoi(base->shape.values[i]) + 1; msFree(base->shape.values[i]); base->shape.values[i] = msIntToString(count); } } } } static int BuildFeatureAttributes(layerObj *layer, msClusterLayerInfo *layerinfo, shapeObj *shape) { char **values; int i; int *itemindexes = layer->iteminfo; if (layer->numitems == layerinfo->srcLayer.numitems) return MS_SUCCESS; /* we don't have custom attributes, no need to reconstruct the array */ values = msSmallMalloc(sizeof(char *) * (layer->numitems)); for (i = 0; i < layer->numitems; i++) { if (itemindexes[i] == MSCLUSTER_FEATURECOUNTINDEX) { values[i] = NULL; /* not yet assigned */ } else if (itemindexes[i] == MSCLUSTER_GROUPINDEX) { values[i] = NULL; /* not yet assigned */ } else if (itemindexes[i] == MSCLUSTER_BASEFIDINDEX) { values[i] = NULL; /* not yet assigned */ } else if (shape->values[itemindexes[i]]) values[i] = msStrdup(shape->values[itemindexes[i]]); else values[i] = msStrdup(""); } if (shape->values) msFreeCharArray(shape->values, shape->numvalues); shape->values = values; shape->numvalues = layer->numitems; return MS_SUCCESS; } /* traverse the quadtree to find the best renking cluster */ static void findBestCluster(layerObj *layer, msClusterLayerInfo *layerinfo, clusterTreeNode *node) { int i; double rank; clusterInfo *s = node->shapes; while (s) { if (s->filter < 0 && layer->cluster.filter.string != NULL) { InitShapeAttributes(layer, s); s->filter = msClusterEvaluateFilter(&layer->cluster.filter, &s->shape); } if (s->numsiblings == 0 || s->filter == 0) { /* individual or filtered shapes must be removed for sure */ layerinfo->current = s; return; } /* calculating the rank */ rank = (s->x - s->avgx) * (s->x - s->avgx) + (s->y - s->avgy) * (s->y - s->avgy) /*+ s->varx + s->vary*/ + (double)1 / (1 + s->numsiblings); if (rank < layerinfo->rank) { layerinfo->current = s; layerinfo->rank = rank; } s = s->next; } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) findBestCluster(layer, layerinfo, node->subnode[i]); } } /* adding the shape based on the shape bounds (point) */ static int treeNodeAddShape(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *shape, int depth) { int i; /* -------------------------------------------------------------------- */ /* If there are subnodes, then consider whether this object */ /* will fit in them. */ /* -------------------------------------------------------------------- */ if (depth > 1 && node->subnode[0] != NULL) { for (i = 0; i < 4; i++) { if (msRectContained(&shape->shape.bounds, &node->subnode[i]->rect)) { return treeNodeAddShape(layerinfo, node->subnode[i], shape, depth - 1); } } } /* -------------------------------------------------------------------- */ /* Otherwise, consider creating four subnodes if could fit into */ /* them, and adding to the appropriate subnode. */ /* -------------------------------------------------------------------- */ else if (depth > 1 && node->subnode[0] == NULL) { rectObj half1, half2, quad1, quad2, quad3, quad4; int subnode = -1; treeSplitBounds(&node->rect, &half1, &half2); treeSplitBounds(&half1, &quad1, &quad2); treeSplitBounds(&half2, &quad3, &quad4); if (msRectContained(&shape->shape.bounds, &quad1)) subnode = 0; else if (msRectContained(&shape->shape.bounds, &quad2)) subnode = 1; else if (msRectContained(&shape->shape.bounds, &quad3)) subnode = 2; else if (msRectContained(&shape->shape.bounds, &quad4)) subnode = 3; if (subnode >= 0) { if ((node->subnode[0] = clusterTreeNodeCreate(layerinfo, quad1)) == NULL) return MS_FAILURE; node->subnode[0]->position = node->position * 4; if ((node->subnode[1] = clusterTreeNodeCreate(layerinfo, quad2)) == NULL) return MS_FAILURE; node->subnode[1]->position = node->position * 4 + 1; if ((node->subnode[2] = clusterTreeNodeCreate(layerinfo, quad3)) == NULL) return MS_FAILURE; node->subnode[2]->position = node->position * 4 + 2; if ((node->subnode[3] = clusterTreeNodeCreate(layerinfo, quad4)) == NULL) return MS_FAILURE; node->subnode[3]->position = node->position * 4 + 3; /* add to subnode */ return treeNodeAddShape(layerinfo, node->subnode[subnode], shape, depth - 1); } } /* found the right place, add this shape to the node */ node->numshapes++; shape->next = node->shapes; node->shapes = shape; shape->node = node; return MS_SUCCESS; } /* collecting the cluster shapes, returns true if this subnode must be removed */ static int collectClusterShapes(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *current) { int i; clusterInfo *prev = NULL; clusterInfo *s = node->shapes; if (!msRectOverlap(&node->rect, ¤t->bounds)) return (!node->shapes && !node->subnode[0] && !node->subnode[1] && !node->subnode[2] && !node->subnode[3]); /* removing the shapes from this node if overlap with the cluster */ while (s) { if (s == current || layerinfo->fnCompare(current, s)) { if (s != current && current->filter == 0) { /* skip siblings of the filtered shapes */ prev = s; s = prev->next; continue; } /* removing from the list */ if (!prev) node->shapes = s->next; else prev->next = s->next; ++current->numcollected; /* adding the shape to the finalization list */ if (s == current) { if (s->filter) { s->next = layerinfo->finalized; layerinfo->finalized = s; ++layerinfo->numFinalized; } else { /* this shape is filtered */ s->next = layerinfo->filtered; layerinfo->filtered = s; ++layerinfo->numFiltered; } } else { s->next = layerinfo->finalizedSiblings; layerinfo->finalizedSiblings = s; ++layerinfo->numFinalizedSiblings; } if (!prev) s = node->shapes; else s = prev->next; } else { prev = s; s = prev->next; } } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i] && collectClusterShapes(layerinfo, node->subnode[i], current)) { /* placing this empty node to the finalization queue */ node->subnode[i]->subnode[0] = layerinfo->finalizedNodes; layerinfo->finalizedNodes = node->subnode[i]; node->subnode[i] = NULL; ++layerinfo->numFinalizedNodes; } } /* returns true is this subnode must be removed */ return (!node->shapes && !node->subnode[0] && !node->subnode[1] && !node->subnode[2] && !node->subnode[3]); } /* collecting the cluster shapes, returns true if this subnode must be removed */ static int collectClusterShapes2(layerObj *layer, msClusterLayerInfo *layerinfo, clusterTreeNode *node) { int i; clusterInfo *current = NULL; clusterInfo *s; while (node->shapes) { s = node->shapes; /* removing from the list */ node->shapes = s->next; InitShapeAttributes(layer, s); if (s->filter) { s->next = layerinfo->finalized; layerinfo->finalized = s; ++layerinfo->numFinalized; } else { /* this shape is filtered */ s->next = layerinfo->filtered; layerinfo->filtered = s; ++layerinfo->numFiltered; } /* update the parameters of the related shapes if any */ if (s->siblings) { current = s->siblings; while (current) { UpdateShapeAttributes(layer, s, current); /* setting the average position to the cluster position */ current->avgx = s->x; current->avgy = s->y; if (current->next == NULL) { if (layerinfo->get_all_shapes == MS_TRUE) { /* insert the siblings into the finalization list */ current->next = layerinfo->finalized; layerinfo->finalized = s->siblings; s->siblings = NULL; } break; } current = current->next; } } } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i] && collectClusterShapes2(layer, layerinfo, node->subnode[i])) { /* placing this empty node to the finalization queue */ node->subnode[i]->subnode[0] = layerinfo->finalizedNodes; layerinfo->finalizedNodes = node->subnode[i]; node->subnode[i] = NULL; ++layerinfo->numFinalizedNodes; } } /* returns true is this subnode must be removed */ return (!node->shapes && !node->subnode[0] && !node->subnode[1] && !node->subnode[2] && !node->subnode[3]); } int selectClusterShape(layerObj *layer, long shapeindex) { int i; clusterInfo *current; msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer not open: %s", "selectClusterShape()", layer->name); return MS_FAILURE; } i = 0; current = layerinfo->finalized; while (current && i < shapeindex) { ++i; current = current->next; } assert(current); current->next = current->siblings; layerinfo->current = current; if (layerinfo->keep_locations == MS_FALSE) { current->shape.line[0].point[0].x = current->shape.bounds.minx = current->shape.bounds.maxx = current->avgx; current->shape.line[0].point[0].y = current->shape.bounds.miny = current->shape.bounds.maxy = current->avgy; } return MS_SUCCESS; } /* update the parameters from the related shapes */ #ifdef ms_notused static void UpdateClusterParameters(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *shape) { int i; clusterInfo *s = node->shapes; while (s) { if (layerinfo->fnCompare(shape, s)) { shape->avgx += s->x; shape->avgy += s->y; ++shape->numsiblings; } s = s->next; } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) UpdateClusterParameters(layerinfo, node->subnode[i], shape); } } /* check for the validity of the clusters added to the tree (for debug purposes) */ static int ValidateTree(msClusterLayerInfo *layerinfo, clusterTreeNode *node) { int i; int isValid = MS_TRUE; clusterInfo *s = node->shapes; while (s) { double avgx = s->avgx; double avgy = s->avgy; int numsiblings = s->numsiblings; s->avgx = 0; s->avgy = 0; s->numsiblings = 0; UpdateClusterParameters(layerinfo, layerinfo->root, s); if (numsiblings + 1 != s->numsiblings) isValid = MS_FALSE; else if ((avgx * s->numsiblings - s->avgx) / s->avgx > 0.000001) isValid = MS_FALSE; else if ((avgy * s->numsiblings - s->avgy) / s->avgy > 0.000001) isValid = MS_FALSE; s->avgx = avgx; s->avgy = avgy; s->numsiblings = numsiblings; if (isValid == MS_FALSE) return MS_FALSE; s = s->next; } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i] && ValidateTree(layerinfo, node->subnode[i]) == MS_FALSE) return MS_FALSE; } /* returns true if this node contains only valid clusters */ return MS_TRUE; } #endif /* rebuild the clusters according to the current extent */ int RebuildClusters(layerObj *layer, int isQuery) { mapObj *map; layerObj *srcLayer; double distance, maxDistanceX, maxDistanceY, cellSizeX, cellSizeY; rectObj searchrect; int status; clusterInfo *current; int depth; const char *pszProcessing; #ifdef USE_CLUSTER_EXTERNAL int layerIndex; #endif reprojectionObj *reprojector = NULL; msClusterLayerInfo *layerinfo = layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer is not open: %s", "RebuildClusters()", layer->name); return MS_FAILURE; } if (!layer->map) { msSetError(MS_MISCERR, "No map associated with this layer: %s", "RebuildClusters()", layer->name); return MS_FAILURE; } if (layer->debug >= MS_DEBUGLEVEL_VVV) msDebug("Clustering started.\n"); map = layer->map; layerinfo->current = layerinfo->finalized; /* restart */ /* check whether the simplified algorithm was selected */ pszProcessing = msLayerGetProcessingKey(layer, "CLUSTER_ALGORITHM"); if (pszProcessing && !strncasecmp(pszProcessing, "SIMPLE", 6)) layerinfo->algorithm = MSCLUSTER_ALGORITHM_SIMPLE; else layerinfo->algorithm = MSCLUSTER_ALGORITHM_FULL; /* check whether all shapes should be returned from a query */ if (msLayerGetProcessingKey(layer, "CLUSTER_GET_ALL_SHAPES") != NULL) layerinfo->get_all_shapes = MS_TRUE; else layerinfo->get_all_shapes = MS_FALSE; /* check whether the location of the shapes should be preserved */ if (msLayerGetProcessingKey(layer, "CLUSTER_KEEP_LOCATIONS") != NULL) layerinfo->keep_locations = MS_TRUE; else layerinfo->keep_locations = MS_FALSE; /* check whether the maxdistance and the buffer parameters are specified in map units (scale independent clustering) */ if (msLayerGetProcessingKey(layer, "CLUSTER_USE_MAP_UNITS") != NULL) layerinfo->use_map_units = MS_TRUE; else layerinfo->use_map_units = MS_FALSE; /* identify the current extent */ if (layer->transform == MS_TRUE) searchrect = map->extent; else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } if (searchrect.minx == layerinfo->searchRect.minx && searchrect.miny == layerinfo->searchRect.miny && searchrect.maxx == layerinfo->searchRect.maxx && searchrect.maxy == layerinfo->searchRect.maxy) { /* already built */ return MS_SUCCESS; } /* destroy previous data*/ clusterDestroyData(layerinfo); layerinfo->searchRect = searchrect; /* reproject the rectangle to layer coordinates */ if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) msProjectRect(&map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ /* determine the compare method */ layerinfo->fnCompare = CompareRectangleRegion; if (layer->cluster.region) { if (EQUAL(layer->cluster.region, "ellipse")) layerinfo->fnCompare = CompareEllipseRegion; } /* trying to find a reasonable quadtree depth */ depth = 0; distance = layer->cluster.maxdistance; if (layerinfo->use_map_units == MS_TRUE) { while ((distance < (searchrect.maxx - searchrect.minx) || distance < (searchrect.maxy - searchrect.miny)) && depth <= TREE_MAX_DEPTH) { distance *= 2; ++depth; } cellSizeX = 1; cellSizeY = 1; } else { while ((distance < map->width || distance < map->height) && depth <= TREE_MAX_DEPTH) { distance *= 2; ++depth; } cellSizeX = MS_CELLSIZE(searchrect.minx, searchrect.maxx, map->width); cellSizeY = MS_CELLSIZE(searchrect.miny, searchrect.maxy, map->height); } layerinfo->depth = depth; maxDistanceX = layer->cluster.maxdistance * cellSizeX; maxDistanceY = layer->cluster.maxdistance * cellSizeY; /* increase the search rectangle so that the neighbouring shapes are also * retrieved */ searchrect.minx -= layer->cluster.buffer * cellSizeX; searchrect.maxx += layer->cluster.buffer * cellSizeX; searchrect.miny -= layer->cluster.buffer * cellSizeY; searchrect.maxy += layer->cluster.buffer * cellSizeY; /* create the root node */ if (layerinfo->root) clusterTreeNodeDestroy(layerinfo, layerinfo->root); layerinfo->root = clusterTreeNodeCreate(layerinfo, searchrect); srcLayer = &layerinfo->srcLayer; /* start retrieving the shapes */ status = msLayerWhichShapes(srcLayer, searchrect, isQuery); if (status == MS_DONE) { /* no overlap */ return MS_SUCCESS; } else if (status != MS_SUCCESS) { return MS_FAILURE; } /* step through the source shapes and populate the quadtree with the tentative * clusters */ if ((current = clusterInfoCreate(layerinfo)) == NULL) return MS_FAILURE; #if defined(USE_CLUSTER_EXTERNAL) if (srcLayer->transform == MS_TRUE && srcLayer->project && layer->transform == MS_TRUE && layer->project && msProjectionsDiffer(&(srcLayer->projection), &(layer->projection))) { reprojector = msProjectCreateReprojector(&srcLayer->projection, &layer->projection); } #endif while ((status = msLayerNextShape(srcLayer, ¤t->shape)) == MS_SUCCESS) { #if defined(USE_CLUSTER_EXTERNAL) /* transform the shape to the projection of this layer */ if (reprojector) msProjectShapeEx(reprojector, ¤t->shape); #endif /* set up positions and variance */ current->avgx = current->x = current->shape.bounds.minx; current->avgy = current->y = current->shape.bounds.miny; current->varx = current->vary = 0; /* set up the area of interest when searching for the neighboring shapes */ current->bounds.minx = current->x - maxDistanceX; current->bounds.miny = current->y - maxDistanceY; current->bounds.maxx = current->x + maxDistanceX; current->bounds.maxy = current->y + maxDistanceY; /* if the shape doesn't overlap we must skip it to avoid further issues */ if (!msRectOverlap(&searchrect, ¤t->bounds)) { msFreeShape(¤t->shape); msInitShape(¤t->shape); msDebug( "Skipping an invalid shape falling outside of the given extent\n"); continue; } /* construct the item array */ if (layer->iteminfo) BuildFeatureAttributes(layer, layerinfo, ¤t->shape); /* evaluate the group expression */ if (layer->cluster.group.string) current->group = msClusterGetGroupText(&layer->cluster.group, ¤t->shape); if (layerinfo->algorithm == MSCLUSTER_ALGORITHM_FULL) { /*start a query for the related shapes */ findRelatedShapes(layerinfo, layerinfo->root, current); /* add this shape to the tree */ if (treeNodeAddShape(layerinfo, layerinfo->root, current, depth) != MS_SUCCESS) { clusterInfoDestroyList(layerinfo, current); msProjectDestroyReprojector(reprojector); return MS_FAILURE; } } else if (layerinfo->algorithm == MSCLUSTER_ALGORITHM_SIMPLE) { /* find a related cluster and try to assign */ layerinfo->rank = 0; layerinfo->current = NULL; findRelatedShapes2(layerinfo, layerinfo->root, current); if (layerinfo->current) { /* store these points until all clusters are created */ current->next = layerinfo->finalizedSiblings; layerinfo->finalizedSiblings = current; } else { /* if not found add this shape as a new cluster */ if (treeNodeAddShape(layerinfo, layerinfo->root, current, depth) != MS_SUCCESS) { clusterInfoDestroyList(layerinfo, current); msProjectDestroyReprojector(reprojector); return MS_FAILURE; } } } if ((current = clusterInfoCreate(layerinfo)) == NULL) { clusterInfoDestroyList(layerinfo, current); msProjectDestroyReprojector(reprojector); return MS_FAILURE; } } msProjectDestroyReprojector(reprojector); clusterInfoDestroyList(layerinfo, current); if (layerinfo->algorithm == MSCLUSTER_ALGORITHM_FULL) { while (layerinfo->root) { #ifdef TESTCOUNT int n; double avgx, avgy; #endif /* pick up the best cluster from the tree and do the finalization */ /* the initial rank must be big enough */ layerinfo->rank = (searchrect.maxx - searchrect.minx) * (searchrect.maxx - searchrect.minx) + (searchrect.maxy - searchrect.miny) * (searchrect.maxy - searchrect.miny) + 1; layerinfo->current = NULL; findBestCluster(layer, layerinfo, layerinfo->root); if (layerinfo->current == NULL) { if (layer->debug >= MS_DEBUGLEVEL_VVV) msDebug("Clustering terminated.\n"); break; /* completed */ } /* Update the feature count of the shape */ InitShapeAttributes(layer, layerinfo->current); /* collecting the shapes of the cluster */ collectClusterShapes(layerinfo, layerinfo->root, layerinfo->current); if (layer->debug >= MS_DEBUGLEVEL_VVV) { msDebug( "processing cluster %p: rank=%lf fcount=%d ncoll=%d nfin=%d " "nfins=%d nflt=%d bounds={%lf %lf %lf %lf}\n", layerinfo->current, layerinfo->rank, layerinfo->current->numsiblings + 1, layerinfo->current->numcollected, layerinfo->numFinalized, layerinfo->numFinalizedSiblings, layerinfo->numFiltered, layerinfo->current->bounds.minx, layerinfo->current->bounds.miny, layerinfo->current->bounds.maxx, layerinfo->current->bounds.maxy); if (layerinfo->current->node) { char pszBuffer[TREE_MAX_DEPTH + 1]; clusterTreeNode *node = layerinfo->current->node; int position = node->position; int i = 1; while (position > 0 && i <= TREE_MAX_DEPTH) { pszBuffer[TREE_MAX_DEPTH - i] = '0' + (position % 4); position = position >> 2; ++i; } pszBuffer[TREE_MAX_DEPTH] = 0; msDebug(" ->node %p: count=%d index=%d pos=%s subn={%p %p %p %p} " "rect={%lf %lf %lf %lf}\n", node, node->numshapes, node->index, pszBuffer + TREE_MAX_DEPTH - i + 1, node->subnode[0], node->subnode[1], node->subnode[2], node->subnode[3], node->rect.minx, node->rect.miny, node->rect.maxx, node->rect.maxy); } } #ifdef TESTCOUNT avgx = layerinfo->current->x; avgy = layerinfo->current->y; n = 0; #endif if (layerinfo->current->numsiblings > 0) { /* update the parameters due to the shape removal */ findRelatedShapesRemove(layerinfo, layerinfo->root, layerinfo->current); if (layerinfo->current->filter == 0) { /* filtered shapes has no siblings */ layerinfo->current->numsiblings = 0; layerinfo->current->avgx = layerinfo->current->x; layerinfo->current->avgy = layerinfo->current->y; } /* update the parameters of the related shapes if any */ if (layerinfo->finalizedSiblings) { current = layerinfo->finalizedSiblings; while (current) { /* update the parameters due to the shape removal */ findRelatedShapesRemove(layerinfo, layerinfo->root, current); UpdateShapeAttributes(layer, layerinfo->current, current); #ifdef TESTCOUNT avgx += current->x; avgy += current->y; ++n; #endif /* setting the average position to the same value */ current->avgx = layerinfo->current->avgx; current->avgy = layerinfo->current->avgy; if (current->next == NULL) { if (layerinfo->get_all_shapes == MS_TRUE) { /* insert the siblings into the finalization list */ current->next = layerinfo->finalized; layerinfo->finalized = layerinfo->finalizedSiblings; } else { /* preserve the clustered siblings for later use */ layerinfo->current->siblings = layerinfo->finalizedSiblings; } break; } current = current->next; } layerinfo->finalizedSiblings = NULL; } } #ifdef TESTCOUNT avgx /= (n + 1); avgy /= (n + 1); if (layerinfo->current->numsiblings != n) layerinfo->current->numsiblings = n; if (fabs(layerinfo->current->avgx - avgx) / avgx > 0.000000001 || fabs(layerinfo->current->avgy - avgy) / avgy > 0.000000001) { layerinfo->current->avgx = avgx; layerinfo->current->avgy = avgy; } #endif } } else if (layerinfo->algorithm == MSCLUSTER_ALGORITHM_SIMPLE) { /* assingn stired points to clusters */ while (layerinfo->finalizedSiblings) { current = layerinfo->finalizedSiblings; layerinfo->rank = maxDistanceX * maxDistanceX + maxDistanceY * maxDistanceY; layerinfo->current = NULL; findRelatedShapes2(layerinfo, layerinfo->root, current); if (layerinfo->current) { clusterInfo *s = layerinfo->current; /* found a matching cluster */ ++s->numsiblings; /* assign to cluster */ layerinfo->finalizedSiblings = current->next; current->next = s->siblings; s->siblings = current; } else { /* this appears to be a bug */ layerinfo->finalizedSiblings = current->next; current->next = layerinfo->filtered; layerinfo->filtered = current; ++layerinfo->numFiltered; } } /* collecting the shapes of the cluster */ collectClusterShapes2(layer, layerinfo, layerinfo->root); } /* set the pointer to the first shape */ layerinfo->current = layerinfo->finalized; return MS_SUCCESS; } /* Close the combined layer */ int msClusterLayerClose(layerObj *layer) { msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) return MS_SUCCESS; clusterDestroyData(layerinfo); msLayerClose(&layerinfo->srcLayer); freeLayer(&layerinfo->srcLayer); msFree(layerinfo); layer->layerinfo = NULL; #ifndef USE_CLUSTER_EXTERNAL /* switch back to the source layer vtable */ if (msInitializeVirtualTable(layer) != MS_SUCCESS) return MS_FAILURE; #endif return MS_SUCCESS; } /* Return MS_TRUE if layer is open, MS_FALSE otherwise. */ int msClusterLayerIsOpen(layerObj *layer) { if (layer->layerinfo) return (MS_TRUE); else return (MS_FALSE); } /* Free the itemindexes array in a layer. */ void msClusterLayerFreeItemInfo(layerObj *layer) { msFree(layer->iteminfo); layer->iteminfo = NULL; } /* allocate the iteminfo index array - same order as the item list */ int msClusterLayerInitItemInfo(layerObj *layer) { int i, numitems; int *itemindexes; msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (layer->numitems == 0) { return MS_SUCCESS; } if (!layerinfo) return MS_FAILURE; /* Cleanup any previous item selection */ msClusterLayerFreeItemInfo(layer); layer->iteminfo = (int *)msSmallMalloc(sizeof(int) * layer->numitems); itemindexes = layer->iteminfo; /* check whether we require attributes from the source layers also */ numitems = 0; for (i = 0; i < layer->numitems; i++) { if (EQUAL(layer->items[i], MSCLUSTER_FEATURECOUNT)) itemindexes[i] = MSCLUSTER_FEATURECOUNTINDEX; else if (EQUAL(layer->items[i], MSCLUSTER_GROUP)) itemindexes[i] = MSCLUSTER_GROUPINDEX; else if (EQUAL(layer->items[i], MSCLUSTER_BASEFID)) itemindexes[i] = MSCLUSTER_BASEFIDINDEX; else itemindexes[i] = numitems++; } msLayerFreeItemInfo(&layerinfo->srcLayer); if (layerinfo->srcLayer.items) { msFreeCharArray(layerinfo->srcLayer.items, layerinfo->srcLayer.numitems); layerinfo->srcLayer.items = NULL; layerinfo->srcLayer.numitems = 0; } if (numitems > 0) { /* now allocate and set the layer item parameters */ layerinfo->srcLayer.items = (char **)msSmallMalloc(sizeof(char *) * numitems); layerinfo->srcLayer.numitems = numitems; for (i = 0; i < layer->numitems; i++) { if (itemindexes[i] >= 0) { if (EQUALN(layer->items[i], "Min:", 4)) layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i] + 4); else if (EQUALN(layer->items[i], "Max:", 4)) layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i] + 4); else if (EQUALN(layer->items[i], "Sum:", 4)) layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i] + 4); else if (EQUALN(layer->items[i], "Count:", 6)) layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i] + 6); else layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i]); } } if (msLayerInitItemInfo(&layerinfo->srcLayer) != MS_SUCCESS) return MS_FAILURE; } return MS_SUCCESS; } /* Execute a query for this layer */ int msClusterLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)rect; /* rebuild the cluster database */ return RebuildClusters(layer, isQuery); } static int prepareShape(layerObj *layer, msClusterLayerInfo *layerinfo, clusterInfo *current, shapeObj *shape) { (void)layer; if (msCopyShape(&(current->shape), shape) != MS_SUCCESS) { msSetError( MS_SHPERR, "Cannot retrieve inline shape. There some problem with the shape", "msClusterLayerNextShape()"); return MS_FAILURE; } /* update the positions of the cluster shape */ if (layerinfo->keep_locations == MS_FALSE) { shape->line[0].point[0].x = shape->bounds.minx = shape->bounds.maxx = current->avgx; shape->line[0].point[0].y = shape->bounds.miny = shape->bounds.maxy = current->avgy; } return MS_SUCCESS; } /* Execute a query on the DB based on fid. */ int msClusterLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { clusterInfo *current; msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer not open: %s", "msClusterLayerGetShape()", layer->name); return MS_FAILURE; } current = layerinfo->finalized; while (current) { if (record->shapeindex == current->shape.index && record->tileindex == current->shape.tileindex) break; current = current->next; } if (current == NULL) { msSetError(MS_SHPERR, "No feature with this index.", "msClusterLayerGetShape()"); return MS_FAILURE; } return prepareShape(layer, layerinfo, current, shape); } int msClusterLayerGetExtent(layerObj *layer, rectObj *extent) { msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer not open: %s", "msClusterLayerGetExtent()", layer->name); return MS_FAILURE; } int status = layerinfo->srcLayer.vtable->LayerGetExtent(&layerinfo->srcLayer, extent); return status; } /* find the next shape with the appropriate shape type */ /* also, load in the attribute data */ /* MS_DONE => no more data */ int msClusterLayerNextShape(layerObj *layer, shapeObj *shape) { int rv; msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer not open: %s", "msClusterLayerNextShape()", layer->name); return MS_FAILURE; } if (!layerinfo->current) return MS_DONE; rv = prepareShape(layer, layerinfo, layerinfo->current, shape); layerinfo->current = layerinfo->current->next; return rv; } /* Query for the items collection */ int msClusterLayerGetItems(layerObj *layer) { /* we support certain built in attributes */ layer->numitems = MSCLUSTER_NUMITEMS; layer->items = msSmallMalloc(sizeof(char *) * (layer->numitems)); layer->items[0] = msStrdup(MSCLUSTER_FEATURECOUNT); layer->items[1] = msStrdup(MSCLUSTER_GROUP); layer->items[2] = msStrdup(MSCLUSTER_BASEFID); return msClusterLayerInitItemInfo(layer); } int msClusterLayerGetNumFeatures(layerObj *layer) { msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) return -1; return layerinfo->numFinalized; } static int msClusterLayerGetAutoStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { (void)map; (void)layer; (void)c; (void)shape; /* TODO */ return MS_SUCCESS; } msClusterLayerInfo *msClusterInitialize(layerObj *layer) { msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)msSmallMalloc(sizeof(msClusterLayerInfo)); layer->layerinfo = layerinfo; layerinfo->searchRect.minx = -1; layerinfo->searchRect.miny = -1; layerinfo->searchRect.maxx = -1; layerinfo->searchRect.maxy = -1; layerinfo->root = NULL; layerinfo->get_all_shapes = MS_FALSE; layerinfo->numFeatures = 0; layerinfo->numNodes = 0; layerinfo->finalized = NULL; layerinfo->numFinalized = 0; layerinfo->finalizedSiblings = NULL; layerinfo->numFinalizedSiblings = 0; layerinfo->filtered = NULL; layerinfo->numFiltered = 0; layerinfo->finalizedNodes = NULL; layerinfo->numFinalizedNodes = 0; return layerinfo; } int msClusterLayerOpen(layerObj *layer) { msClusterLayerInfo *layerinfo; if (layer->type != MS_LAYER_POINT) { msSetError(MS_MISCERR, "Only point layers are supported for clustering: %s", "msClusterLayerOpen()", layer->name); return MS_FAILURE; } if (!layer->map) return MS_FAILURE; if (layer->layerinfo) { if (layer->vtable->LayerOpen != msClusterLayerOpen) msLayerClose(layer); else return MS_SUCCESS; /* already open */ } layerinfo = msClusterInitialize(layer); if (!layer->layerinfo) return MS_FAILURE; /* prepare the source layer */ if (initLayer(&layerinfo->srcLayer, layer->map) == -1) return MS_FAILURE; #ifdef USE_CLUSTER_EXTERNAL if (!layer->map) return MS_FAILURE; layerIndex = msGetLayerIndex(layer->map, layer->connection); if (layerIndex < 0 && layerIndex >= layer->map->numlayers) { msSetError(MS_MISCERR, "No source layers specified in layer: %s", "msClusterLayerOpen()", layer->name); return MS_FAILURE; } if (layer->map->layers[layerIndex]->type != MS_LAYER_POINT) { msSetError(MS_MISCERR, "Only point layers are supported for cluster data source: %s", "msClusterLayerOpen()", layer->name); return MS_FAILURE; } if (msCopyLayer(&layerinfo->srcLayer, layer->map->layers[layerIndex]) != MS_SUCCESS) return (MS_FAILURE); #else /* hook the vtable to this driver, will be restored in LayerClose*/ if (!layer->vtable) { if (msInitializeVirtualTable(layer) != MS_SUCCESS) return MS_FAILURE; } assert(layer->vtable); msClusterLayerCopyVirtualTable(layer->vtable); if (msCopyLayer(&layerinfo->srcLayer, layer) != MS_SUCCESS) return (MS_FAILURE); #endif /* disable the connection pool for this layer */ msLayerSetProcessingKey(&layerinfo->srcLayer, "CLOSE_CONNECTION", "ALWAYS"); /* open the source layer */ if (!layerinfo->srcLayer.vtable) { if (msInitializeVirtualTable(&layerinfo->srcLayer) != MS_SUCCESS) return MS_FAILURE; } if (layerinfo->srcLayer.vtable->LayerOpen(&layerinfo->srcLayer) != MS_SUCCESS) { return MS_FAILURE; } return MS_SUCCESS; } int msClusterLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { (void)filter; msClusterLayerInfo *layerinfo = layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer is not open: %s", "msClusterLayerTranslateFilter()", layer->name); return MS_FAILURE; } if (layerinfo->srcLayer.filter.type == MS_EXPRESSION && layerinfo->srcLayer.filter.tokens == NULL) msTokenizeExpression(&(layerinfo->srcLayer.filter), layer->items, &(layer->numitems)); return layerinfo->srcLayer.vtable->LayerTranslateFilter( &layerinfo->srcLayer, &layerinfo->srcLayer.filter, filteritem); } char *msClusterLayerEscapeSQLParam(layerObj *layer, const char *pszString) { msClusterLayerInfo *layerinfo = layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer is not open: %s", "msClusterLayerEscapeSQLParam()", layer->name); return msStrdup(""); } return layerinfo->srcLayer.vtable->LayerEscapeSQLParam(&layerinfo->srcLayer, pszString); } int msClusterLayerGetAutoProjection(layerObj *layer, projectionObj *projection) { msClusterLayerInfo *layerinfo = layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer is not open: %s", "msClusterLayerGetAutoProjection()", layer->name); return MS_FAILURE; } return layerinfo->srcLayer.vtable->LayerGetAutoProjection( &layerinfo->srcLayer, projection); } int msClusterLayerGetPaging(layerObj *layer) { (void)layer; return MS_FALSE; } void msClusterLayerEnablePaging(layerObj *layer, int value) { (void)layer; (void)value; } void msClusterLayerCopyVirtualTable(layerVTableObj *vtable) { vtable->LayerInitItemInfo = msClusterLayerInitItemInfo; vtable->LayerFreeItemInfo = msClusterLayerFreeItemInfo; vtable->LayerOpen = msClusterLayerOpen; vtable->LayerIsOpen = msClusterLayerIsOpen; vtable->LayerWhichShapes = msClusterLayerWhichShapes; vtable->LayerNextShape = msClusterLayerNextShape; vtable->LayerGetShape = msClusterLayerGetShape; vtable->LayerGetExtent = msClusterLayerGetExtent; /* layer->vtable->LayerGetShapeCount, use default */ vtable->LayerClose = msClusterLayerClose; vtable->LayerGetItems = msClusterLayerGetItems; vtable->LayerCloseConnection = msClusterLayerClose; vtable->LayerGetNumFeatures = msClusterLayerGetNumFeatures; vtable->LayerGetAutoStyle = msClusterLayerGetAutoStyle; vtable->LayerTranslateFilter = msClusterLayerTranslateFilter; /* vtable->LayerSupportsCommonFilters, use driver implementation */ vtable->LayerEscapeSQLParam = msClusterLayerEscapeSQLParam; /* vtable->LayerEscapePropertyName, use driver implementation */ vtable->LayerEnablePaging = msClusterLayerEnablePaging; vtable->LayerGetPaging = msClusterLayerGetPaging; vtable->LayerGetAutoProjection = msClusterLayerGetAutoProjection; } #ifdef USE_CLUSTER_PLUGIN MS_DLL_EXPORT int PluginInitializeVirtualTable(layerVTableObj *vtable, layerObj *layer) { assert(layer != NULL); assert(vtable != NULL); msClusterLayerCopyVirtualTable(vtable); return MS_SUCCESS; } #endif int msClusterLayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); msClusterLayerCopyVirtualTable(layer->vtable); return MS_SUCCESS; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.4.0/src/mapcompositingfilter.c����������������������������������������������������������0000664�0000000�0000000�00000021277�14741744413�0020743�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * * Project: MapServer * Purpose: RFC 113 Layer compositing * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2015 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #ifdef USE_PCRE2 #include #else #include #endif #define pixmove(rb, srcx, srcy, dstx, dsty) \ memcpy(rb->data.rgba.pixels + dsty * rb->data.rgba.row_step + dstx * 4, \ rb->data.rgba.pixels + srcy * rb->data.rgba.row_step + srcx * 4, 4) #define pixerase(rb, x, y) \ memset(rb->data.rgba.pixels + y * rb->data.rgba.row_step + x * 4, 0, 4) void msApplyTranslationCompositingFilter(rasterBufferObj *rb, int xtrans, int ytrans) { int src_sx, src_sy, dst_sx, dst_sy; if ((unsigned)abs(xtrans) >= rb->width || (unsigned)abs(ytrans) >= rb->height) { for (unsigned y = 0; y < rb->height; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); } if (xtrans == 0 && ytrans == 0) return; if (xtrans >= 0) { if (ytrans >= 0) { src_sx = rb->width - xtrans - 1; src_sy = rb->height - ytrans - 1; dst_sx = rb->width - 1; dst_sy = rb->height - 1; for (int y = src_sy, dst_y = dst_sy; y >= 0; y--, dst_y--) { for (int x = src_sx, dst_x = dst_sx; x >= 0; x--, dst_x--) { pixmove(rb, x, y, dst_x, dst_y); } } for (int y = 0; y < ytrans; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); for (unsigned y = ytrans; y < rb->height; y++) for (int x = 0; x < xtrans; x++) pixerase(rb, x, y); } else { src_sx = rb->width - xtrans - 1; src_sy = -ytrans; dst_sx = rb->width - 1; dst_sy = 0; for (unsigned y = src_sy, dst_y = dst_sy; y < rb->height; y++, dst_y++) { for (int x = src_sx, dst_x = dst_sx; x >= 0; x--, dst_x--) { pixmove(rb, x, y, dst_x, dst_y); } } for (unsigned y = 0; y < rb->height + ytrans; y++) for (int x = 0; x < xtrans; x++) pixerase(rb, x, y); for (unsigned y = rb->height + ytrans; y < rb->height; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); } } else { if (ytrans >= 0) { src_sx = -xtrans; src_sy = rb->height - ytrans - 1; dst_sx = 0; dst_sy = rb->height - 1; for (int y = src_sy, dst_y = dst_sy; y >= 0; y--, dst_y--) { for (unsigned x = src_sx, dst_x = dst_sx; x < rb->width; x++, dst_x++) { pixmove(rb, x, y, dst_x, dst_y); } } for (int y = 0; y < ytrans; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); for (unsigned y = ytrans; y < rb->height; y++) for (unsigned x = rb->width + xtrans; x < rb->width; x++) pixerase(rb, x, y); } else { src_sx = -xtrans; src_sy = -ytrans; dst_sx = 0; dst_sy = 0; for (unsigned y = src_sy, dst_y = dst_sy; y < rb->height; y++, dst_y++) { for (unsigned x = src_sx, dst_x = dst_sx; x < rb->width; x++, dst_x++) { pixmove(rb, x, y, dst_x, dst_y); } } for (unsigned y = 0; y < rb->height + ytrans; y++) for (unsigned x = rb->width + xtrans; x < rb->width; x++) pixerase(rb, x, y); for (unsigned y = rb->height + ytrans; y < rb->height; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); } } } void msApplyBlackeningCompositingFilter(rasterBufferObj *rb) { unsigned char *r, *g, *b; for (unsigned row = 0; row < rb->height; row++) { r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { *r = *g = *b = 0; r += 4; g += 4; b += 4; } } } void msApplyWhiteningCompositingFilter(rasterBufferObj *rb) { unsigned char *r, *g, *b, *a; for (unsigned row = 0; row < rb->height; row++) { r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; a = rb->data.rgba.a + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { *r = *g = *b = *a; r += 4; g += 4; b += 4; a += 4; } } } void msApplyGrayscaleCompositingFilter(rasterBufferObj *rb) { unsigned char *r, *g, *b; for (unsigned row = 0; row < rb->height; row++) { r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { unsigned int mix = (unsigned int)*r + (unsigned int)*g + (unsigned int)*b; mix /= 3; *r = *g = *b = (unsigned char)mix; r += 4; g += 4; b += 4; } } } int msApplyCompositingFilter(mapObj *map, rasterBufferObj *rb, CompositingFilter *filter) { int rstatus; regex_t regex; regmatch_t pmatch[3]; /* test for blurring filter */ regcomp(®ex, "blur\\(([0-9]+)\\)", REG_EXTENDED); rstatus = regexec(®ex, filter->filter, 2, pmatch, 0); regfree(®ex); if (!rstatus) { char *rad = malloc(pmatch[1].rm_eo - pmatch[1].rm_so + 1); unsigned int irad; strncpy(rad, filter->filter + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); rad[pmatch[1].rm_eo - pmatch[1].rm_so] = 0; // msDebug("got blur filter with radius %s\n",rad); irad = atoi(rad); free(rad); irad = MS_NINT(irad * map->resolution / map->defresolution); msApplyBlurringCompositingFilter(rb, irad); return MS_SUCCESS; } /* test for translation filter */ regcomp(®ex, "translate\\((-?[0-9]+),(-?[0-9]+)\\)", REG_EXTENDED); rstatus = regexec(®ex, filter->filter, 3, pmatch, 0); regfree(®ex); if (!rstatus) { char *num; int xtrans, ytrans; num = malloc(pmatch[1].rm_eo - pmatch[1].rm_so + 1); strncpy(num, filter->filter + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); num[pmatch[1].rm_eo - pmatch[1].rm_so] = 0; xtrans = atoi(num); free(num); num = malloc(pmatch[2].rm_eo - pmatch[2].rm_so + 1); strncpy(num, filter->filter + pmatch[2].rm_so, pmatch[2].rm_eo - pmatch[2].rm_so); num[pmatch[2].rm_eo - pmatch[2].rm_so] = 0; ytrans = atoi(num); free(num); // msDebug("got translation filter of radius %d,%d\n",xtrans,ytrans); xtrans = MS_NINT(xtrans * map->resolution / map->defresolution); ytrans = MS_NINT(ytrans * map->resolution / map->defresolution); msApplyTranslationCompositingFilter(rb, xtrans, ytrans); return MS_SUCCESS; } /* test for grayscale filter */ if (!strncmp(filter->filter, "grayscale()", strlen("grayscale()"))) { msApplyGrayscaleCompositingFilter(rb); return MS_SUCCESS; } if (!strncmp(filter->filter, "blacken()", strlen("blacken()"))) { msApplyBlackeningCompositingFilter(rb); return MS_SUCCESS; } if (!strncmp(filter->filter, "whiten()", strlen("whiten()"))) { msApplyWhiteningCompositingFilter(rb); return MS_SUCCESS; } msSetError(MS_MISCERR, "unknown compositing filter (%s)", "msApplyCompositingFilter()", filter->filter); return MS_FAILURE; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.4.0/src/mapcontext.c��������������������������������������������������������������������0000664�0000000�0000000�00000206430�14741744413�0016662�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC Web Map Context implementation * Author: Julien-Samuel Lacroix, DM Solutions Group (lacroix@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2002-2003, Julien-Samuel Lacroix, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver.h" #include "mapows.h" #include "cpl_vsi.h" #include "cpl_conv.h" #if defined(USE_WMS_LYR) /* There is a dependency to GDAL/OGR for the GML driver and MiniXML parser */ #include "cpl_minixml.h" #endif /* msGetMapContextFileText() ** ** Read a file and return is content ** ** Take the filename in argument ** Return value must be freed by caller */ static char *msGetMapContextFileText(const char *filename) { char *pszBuffer; VSILFILE *stream; vsi_l_offset nLength; /* open file */ if (filename != NULL && strlen(filename) > 0) { stream = VSIFOpenL(filename, "rb"); if (!stream) { msSetError(MS_IOERR, "(%s)", "msGetMapContextFileText()", filename); return NULL; } } else { msSetError(MS_IOERR, "(%s)", "msGetMapContextFileText()", filename); return NULL; } VSIFSeekL(stream, 0, SEEK_END); nLength = VSIFTellL(stream); VSIFSeekL(stream, 0, SEEK_SET); if (nLength > 100 * 1024 * 1024U) { msSetError(MS_MEMERR, "(%s): too big file", "msGetMapContextFileText()", filename); VSIFCloseL(stream); return NULL; } pszBuffer = (char *)malloc((size_t)nLength + 1); if (pszBuffer == NULL) { msSetError(MS_MEMERR, "(%s)", "msGetMapContextFileText()", filename); VSIFCloseL(stream); return NULL; } if (VSIFReadL(pszBuffer, nLength, 1, stream) == 0) { free(pszBuffer); VSIFCloseL(stream); msSetError(MS_IOERR, "(%s)", "msGetMapContextFileText()", filename); return NULL; } pszBuffer[nLength] = '\0'; VSIFCloseL(stream); return pszBuffer; } #if defined(USE_WMS_LYR) /* **msGetMapContextXMLHashValue() ** **Get the xml value and put it in the hash table ** */ int msGetMapContextXMLHashValue(CPLXMLNode *psRoot, const char *pszXMLPath, hashTableObj *metadata, char *pszMetadata) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (metadata != NULL) { msInsertHashTable(metadata, pszMetadata, pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* **msGetMapContextXMLHashValue() ** **Get the xml value and put it in the hash table ** */ int msGetMapContextXMLHashValueDecode(CPLXMLNode *psRoot, const char *pszXMLPath, hashTableObj *metadata, char *pszMetadata) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (metadata != NULL) { msDecodeHTMLEntities(pszValue); msInsertHashTable(metadata, pszMetadata, pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* **msGetMapContextXMLStringValue() ** **Get the xml value and put it in the string field ** */ int msGetMapContextXMLStringValue(CPLXMLNode *psRoot, char *pszXMLPath, char **pszField) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (pszField != NULL) { *pszField = msStrdup(pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* **msGetMapContextXMLStringValue() ** **Get the xml value and put it in the string field ** */ int msGetMapContextXMLStringValueDecode(CPLXMLNode *psRoot, char *pszXMLPath, char **pszField) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (pszField != NULL) { msDecodeHTMLEntities(pszValue); *pszField = msStrdup(pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* **msGetMapContextXMLFloatValue() ** **Get the xml value and put it in the string field ** */ int msGetMapContextXMLFloatValue(CPLXMLNode *psRoot, char *pszXMLPath, double *pszField) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (pszField != NULL) { *pszField = atof(pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* ** msLoadMapContextURLELements ** ** Take a Node and get the width, height, format and href from it. ** Then put this info in metadatas. */ int msLoadMapContextURLELements(CPLXMLNode *psRoot, hashTableObj *metadata, const char *pszMetadataRoot) { char *pszMetadataName; if (psRoot == NULL || metadata == NULL || pszMetadataRoot == NULL) return MS_FAILURE; pszMetadataName = (char *)malloc(strlen(pszMetadataRoot) + 10); sprintf(pszMetadataName, "%s_width", pszMetadataRoot); msGetMapContextXMLHashValue(psRoot, "width", metadata, pszMetadataName); sprintf(pszMetadataName, "%s_height", pszMetadataRoot); msGetMapContextXMLHashValue(psRoot, "height", metadata, pszMetadataName); sprintf(pszMetadataName, "%s_format", pszMetadataRoot); msGetMapContextXMLHashValue(psRoot, "format", metadata, pszMetadataName); sprintf(pszMetadataName, "%s_href", pszMetadataRoot); msGetMapContextXMLHashValue(psRoot, "OnlineResource.xlink:href", metadata, pszMetadataName); free(pszMetadataName); return MS_SUCCESS; } /* msLoadMapContextKeyword ** ** Put the keywords from a XML node and put them in a metadata. ** psRoot should be set to keywordlist */ int msLoadMapContextListInMetadata(CPLXMLNode *psRoot, hashTableObj *metadata, char *pszXMLName, char *pszMetadataName, char *pszHashDelimiter) { const char *pszHash, *pszXMLValue; char *pszMetadata; if (psRoot == NULL || psRoot->psChild == NULL || metadata == NULL || pszMetadataName == NULL || pszXMLName == NULL) return MS_FAILURE; /* Pass from KeywordList to Keyword level */ psRoot = psRoot->psChild; /* Loop on all elements and append keywords to the hash table */ while (psRoot) { if (psRoot->psChild && strcasecmp(psRoot->pszValue, pszXMLName) == 0) { pszXMLValue = psRoot->psChild->pszValue; pszHash = msLookupHashTable(metadata, pszMetadataName); if (pszHash != NULL) { pszMetadata = (char *)malloc(strlen(pszHash) + strlen(pszXMLValue) + 2); if (pszHashDelimiter == NULL) sprintf(pszMetadata, "%s%s", pszHash, pszXMLValue); else sprintf(pszMetadata, "%s%s%s", pszHash, pszHashDelimiter, pszXMLValue); msInsertHashTable(metadata, pszMetadataName, pszMetadata); free(pszMetadata); } else msInsertHashTable(metadata, pszMetadataName, pszXMLValue); } psRoot = psRoot->psNext; } return MS_SUCCESS; } /* msLoadMapContextContactInfo ** ** Put the Contact information from a XML node and put them in a metadata. ** */ int msLoadMapContextContactInfo(CPLXMLNode *psRoot, hashTableObj *metadata) { if (psRoot == NULL || metadata == NULL) return MS_FAILURE; /* Contact Person primary */ msGetMapContextXMLHashValue(psRoot, "ContactPersonPrimary.ContactPerson", metadata, "wms_contactperson"); msGetMapContextXMLHashValue(psRoot, "ContactPersonPrimary.ContactOrganization", metadata, "wms_contactorganization"); /* Contact Position */ msGetMapContextXMLHashValue(psRoot, "ContactPosition", metadata, "wms_contactposition"); /* Contact Address */ msGetMapContextXMLHashValue(psRoot, "ContactAddress.AddressType", metadata, "wms_addresstype"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.Address", metadata, "wms_address"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.City", metadata, "wms_city"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.StateOrProvince", metadata, "wms_stateorprovince"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.PostCode", metadata, "wms_postcode"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.Country", metadata, "wms_country"); /* Others */ msGetMapContextXMLHashValue(psRoot, "ContactVoiceTelephone", metadata, "wms_contactvoicetelephone"); msGetMapContextXMLHashValue(psRoot, "ContactFacsimileTelephone", metadata, "wms_contactfacsimiletelephone"); msGetMapContextXMLHashValue(psRoot, "ContactElectronicMailAddress", metadata, "wms_contactelectronicmailaddress"); return MS_SUCCESS; } /* ** msLoadMapContextLayerFormat ** ** */ int msLoadMapContextLayerFormat(CPLXMLNode *psFormat, layerObj *layer) { const char *pszValue; char *pszValue1; const char *pszHash; if (psFormat->psChild != NULL && strcasecmp(psFormat->pszValue, "Format") == 0) { if (psFormat->psChild->psNext == NULL) pszValue = psFormat->psChild->pszValue; else pszValue = psFormat->psChild->psNext->pszValue; } else pszValue = NULL; if (pszValue != NULL && strcasecmp(pszValue, "") != 0) { /* wms_format */ pszValue1 = (char *)CPLGetXMLValue(psFormat, "current", NULL); if (pszValue1 != NULL && (strcasecmp(pszValue1, "1") == 0 || strcasecmp(pszValue1, "true") == 0)) msInsertHashTable(&(layer->metadata), "wms_format", pszValue); /* wms_formatlist */ pszHash = msLookupHashTable(&(layer->metadata), "wms_formatlist"); if (pszHash != NULL) { pszValue1 = (char *)malloc(strlen(pszHash) + strlen(pszValue) + 2); sprintf(pszValue1, "%s,%s", pszHash, pszValue); msInsertHashTable(&(layer->metadata), "wms_formatlist", pszValue1); free(pszValue1); } else msInsertHashTable(&(layer->metadata), "wms_formatlist", pszValue); } /* Make sure selected format is supported or select another * supported format. Note that we can efficiently do this * only for GIF/PNG/JPEG, can't try to handle all GDAL * formats. */ pszValue = msLookupHashTable(&(layer->metadata), "wms_format"); if (pszValue && ( #if !(defined USE_PNG) strcasecmp(pszValue, "image/png") == 0 || strcasecmp(pszValue, "PNG") == 0 || #endif #if !(defined USE_JPEG) strcasecmp(pszValue, "image/jpeg") == 0 || strcasecmp(pszValue, "JPEG") == 0 || #endif 0)) { char **papszList = NULL; int i, numformats = 0; pszValue = msLookupHashTable(&(layer->metadata), "wms_formatlist"); papszList = msStringSplit(pszValue, ',', &numformats); for (i = 0; i < numformats; i++) { if ( #if (defined USE_PNG) strcasecmp(papszList[i], "image/png") == 0 || strcasecmp(papszList[i], "PNG") == 0 || #endif #if (defined USE_JPEG) strcasecmp(papszList[i], "image/jpeg") == 0 || strcasecmp(papszList[i], "JPEG") == 0 || #endif #ifdef USE_GD_GIF strcasecmp(papszList[i], "image/gif") == 0 || strcasecmp(papszList[i], "GIF") == 0 || #endif 0) { /* Found a match */ msInsertHashTable(&(layer->metadata), "wms_format", papszList[i]); break; } } if (papszList) msFreeCharArray(papszList, numformats); } /* end if unsupported format */ return MS_SUCCESS; } int msLoadMapContextLayerStyle(CPLXMLNode *psStyle, layerObj *layer, int nStyle) { char *pszValue, *pszValue1, *pszValue2; const char *pszHash; char *pszStyle = NULL; char *pszStyleName; CPLXMLNode *psStyleSLDBody; pszStyleName = (char *)CPLGetXMLValue(psStyle, "Name", NULL); if (pszStyleName == NULL) { pszStyleName = (char *)malloc(20); sprintf(pszStyleName, "Style{%d}", nStyle); } else pszStyleName = msStrdup(pszStyleName); /* wms_style */ pszValue = (char *)CPLGetXMLValue(psStyle, "current", NULL); if (pszValue != NULL && (strcasecmp(pszValue, "1") == 0 || strcasecmp(pszValue, "true") == 0)) msInsertHashTable(&(layer->metadata), "wms_style", pszStyleName); /* wms_stylelist */ pszHash = msLookupHashTable(&(layer->metadata), "wms_stylelist"); if (pszHash != NULL) { pszValue1 = (char *)malloc(strlen(pszHash) + strlen(pszStyleName) + 2); sprintf(pszValue1, "%s,%s", pszHash, pszStyleName); msInsertHashTable(&(layer->metadata), "wms_stylelist", pszValue1); free(pszValue1); } else msInsertHashTable(&(layer->metadata), "wms_stylelist", pszStyleName); /* Title */ pszStyle = (char *)malloc(strlen(pszStyleName) + 20); sprintf(pszStyle, "wms_style_%s_title", pszStyleName); if (msGetMapContextXMLHashValue(psStyle, "Title", &(layer->metadata), pszStyle) == MS_FAILURE) msInsertHashTable(&(layer->metadata), pszStyle, layer->name); free(pszStyle); /* SLD */ pszStyle = (char *)malloc(strlen(pszStyleName) + 15); sprintf(pszStyle, "wms_style_%s_sld", pszStyleName); msGetMapContextXMLHashValueDecode(psStyle, "SLD.OnlineResource.xlink:href", &(layer->metadata), pszStyle); free(pszStyle); /* SLDBODY */ pszStyle = (char *)malloc(strlen(pszStyleName) + 20); sprintf(pszStyle, "wms_style_%s_sld_body", pszStyleName); psStyleSLDBody = CPLGetXMLNode(psStyle, "SLD.StyledLayerDescriptor"); /*some clients such as OpenLayers add a name space, which I believe is wrong but added this additional test for compatibility #3115*/ if (psStyleSLDBody == NULL) psStyleSLDBody = CPLGetXMLNode(psStyle, "SLD.sld:StyledLayerDescriptor"); if (psStyleSLDBody != NULL) { pszValue = CPLSerializeXMLTree(psStyleSLDBody); if (pszValue != NULL) { /* Before including SLDBody in the mapfile, we must replace the */ /* double quote for single quote. This is to prevent having this: */ /* "metadata" "" */ char *c; for (c = pszValue; *c != '\0'; c++) if (*c == '"') *c = '\''; msInsertHashTable(&(layer->metadata), pszStyle, pszValue); msFree(pszValue); } } free(pszStyle); /* LegendURL */ pszStyle = (char *)malloc(strlen(pszStyleName) + 25); sprintf(pszStyle, "wms_style_%s_legendurl", pszStyleName); msLoadMapContextURLELements(CPLGetXMLNode(psStyle, "LegendURL"), &(layer->metadata), pszStyle); free(pszStyle); free(pszStyleName); /* */ /* Add the stylelist to the layer connection */ /* */ if (msLookupHashTable(&(layer->metadata), "wms_stylelist") == NULL) { if (layer->connection) pszValue = msStrdup(layer->connection); else pszValue = msStrdup(""); pszValue1 = strstr(pszValue, "STYLELIST="); if (pszValue1 != NULL) { pszValue1 += 10; pszValue2 = strchr(pszValue, '&'); if (pszValue2 != NULL) pszValue1[pszValue2 - pszValue1] = '\0'; msInsertHashTable(&(layer->metadata), "wms_stylelist", pszValue1); } free(pszValue); } /* */ /* Add the style to the layer connection */ /* */ if (msLookupHashTable(&(layer->metadata), "wms_style") == NULL) { if (layer->connection) pszValue = msStrdup(layer->connection); else pszValue = msStrdup(""); pszValue1 = strstr(pszValue, "STYLE="); if (pszValue1 != NULL) { pszValue1 += 6; pszValue2 = strchr(pszValue, '&'); if (pszValue2 != NULL) pszValue1[pszValue2 - pszValue1] = '\0'; msInsertHashTable(&(layer->metadata), "wms_style", pszValue1); } free(pszValue); } return MS_SUCCESS; } int msLoadMapContextLayerDimension(CPLXMLNode *psDimension, layerObj *layer) { char *pszValue; const char *pszHash; char *pszDimension = NULL, *pszDimensionName = NULL; pszDimensionName = (char *)CPLGetXMLValue(psDimension, "name", NULL); if (pszDimensionName == NULL) { return MS_FALSE; } else pszDimensionName = msStrdup(pszDimensionName); pszDimension = (char *)malloc(strlen(pszDimensionName) + 50); /* wms_dimension: This is the current dimension */ pszValue = (char *)CPLGetXMLValue(psDimension, "current", NULL); if (pszValue != NULL && (strcasecmp(pszValue, "1") == 0 || strcasecmp(pszValue, "true") == 0)) msInsertHashTable(&(layer->metadata), "wms_dimension", pszDimensionName); /* wms_dimensionlist */ pszHash = msLookupHashTable(&(layer->metadata), "wms_dimensionlist"); if (pszHash != NULL) { pszValue = (char *)malloc(strlen(pszHash) + strlen(pszDimensionName) + 2); sprintf(pszValue, "%s,%s", pszHash, pszDimensionName); msInsertHashTable(&(layer->metadata), "wms_dimensionlist", pszValue); free(pszValue); } else msInsertHashTable(&(layer->metadata), "wms_dimensionlist", pszDimensionName); /* Units */ sprintf(pszDimension, "wms_dimension_%s_units", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "units", &(layer->metadata), pszDimension); /* UnitSymbol */ sprintf(pszDimension, "wms_dimension_%s_unitsymbol", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "unitSymbol", &(layer->metadata), pszDimension); /* userValue */ sprintf(pszDimension, "wms_dimension_%s_uservalue", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "userValue", &(layer->metadata), pszDimension); if (strcasecmp(pszDimensionName, "time") == 0) msGetMapContextXMLHashValue(psDimension, "userValue", &(layer->metadata), "wms_time"); /* default */ sprintf(pszDimension, "wms_dimension_%s_default", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "default", &(layer->metadata), pszDimension); /* multipleValues */ sprintf(pszDimension, "wms_dimension_%s_multiplevalues", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "multipleValues", &(layer->metadata), pszDimension); /* nearestValue */ sprintf(pszDimension, "wms_dimension_%s_nearestvalue", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "nearestValue", &(layer->metadata), pszDimension); free(pszDimension); free(pszDimensionName); return MS_SUCCESS; } /* ** msLoadMapContextGeneral ** ** Load the General block of the mapcontext document */ int msLoadMapContextGeneral(mapObj *map, CPLXMLNode *psGeneral, CPLXMLNode *psMapContext, int nVersion, const char *filename) { char *pszProj = NULL; char *pszValue, *pszValue1, *pszValue2; int nTmp; /* Projection */ pszValue = (char *)CPLGetXMLValue(psGeneral, "BoundingBox.SRS", NULL); if (pszValue != NULL && !EQUAL(pszValue, "(null)")) { if (strncasecmp(pszValue, "AUTO:", 5) == 0) { pszProj = msStrdup(pszValue); } else { pszProj = (char *)malloc(sizeof(char) * (strlen(pszValue) + 10)); sprintf(pszProj, "init=epsg:%s", pszValue + 5); } msFreeProjection(&map->projection); msInitProjection(&map->projection); map->projection.args[map->projection.numargs] = msStrdup(pszProj); map->projection.numargs++; msProcessProjection(&map->projection); if ((nTmp = GetMapserverUnitUsingProj(&(map->projection))) == -1) { msSetError(MS_MAPCONTEXTERR, "Unable to set units for projection '%s'", "msLoadMapContext()", pszProj); free(pszProj); return MS_FAILURE; } else { map->units = nTmp; } free(pszProj); } else { msDebug("Mandatory data General.BoundingBox.SRS missing in %s.", filename); } /* Extent */ if (msGetMapContextXMLFloatValue(psGeneral, "BoundingBox.minx", &(map->extent.minx)) == MS_FAILURE) { msDebug("Mandatory data General.BoundingBox.minx missing in %s.", filename); } if (msGetMapContextXMLFloatValue(psGeneral, "BoundingBox.miny", &(map->extent.miny)) == MS_FAILURE) { msDebug("Mandatory data General.BoundingBox.miny missing in %s.", filename); } if (msGetMapContextXMLFloatValue(psGeneral, "BoundingBox.maxx", &(map->extent.maxx)) == MS_FAILURE) { msDebug("Mandatory data General.BoundingBox.maxx missing in %s.", filename); } if (msGetMapContextXMLFloatValue(psGeneral, "BoundingBox.maxy", &(map->extent.maxy)) == MS_FAILURE) { msDebug("Mandatory data General.BoundingBox.maxy missing in %s.", filename); } /* Title */ if (msGetMapContextXMLHashValue(psGeneral, "Title", &(map->web.metadata), "wms_title") == MS_FAILURE) { if (nVersion >= OWS_1_0_0) msDebug("Mandatory data General.Title missing in %s.", filename); else { if (msGetMapContextXMLHashValue(psGeneral, "gml:name", &(map->web.metadata), "wms_title") == MS_FAILURE) { if (nVersion < OWS_0_1_7) msDebug("Mandatory data General.Title missing in %s.", filename); else msDebug("Mandatory data General.gml:name missing in %s.", filename); } } } /* Name */ if (nVersion >= OWS_1_0_0) { pszValue = (char *)CPLGetXMLValue(psMapContext, "id", NULL); if (pszValue) { msFree(map->name); map->name = msStrdup(pszValue); } } else { char *pszMapName = NULL; if (msGetMapContextXMLStringValue(psGeneral, "Name", &pszMapName) == MS_FAILURE) { msGetMapContextXMLStringValue(psGeneral, "gml:name", &pszMapName); } if (pszMapName) { msFree(map->name); map->name = pszMapName; } } /* Keyword */ if (nVersion >= OWS_1_0_0) { msLoadMapContextListInMetadata(CPLGetXMLNode(psGeneral, "KeywordList"), &(map->web.metadata), "KEYWORD", "wms_keywordlist", ","); } else msGetMapContextXMLHashValue(psGeneral, "Keywords", &(map->web.metadata), "wms_keywordlist"); /* Window */ pszValue1 = (char *)CPLGetXMLValue(psGeneral, "Window.width", NULL); pszValue2 = (char *)CPLGetXMLValue(psGeneral, "Window.height", NULL); if (pszValue1 != NULL && pszValue2 != NULL) { map->width = atoi(pszValue1); map->height = atoi(pszValue2); } /* Abstract */ if (msGetMapContextXMLHashValue(psGeneral, "Abstract", &(map->web.metadata), "wms_abstract") == MS_FAILURE) { msGetMapContextXMLHashValue(psGeneral, "gml:description", &(map->web.metadata), "wms_abstract"); } /* DataURL */ msGetMapContextXMLHashValueDecode(psGeneral, "DataURL.OnlineResource.xlink:href", &(map->web.metadata), "wms_dataurl"); /* LogoURL */ /* The logourl have a width, height, format and an URL */ msLoadMapContextURLELements(CPLGetXMLNode(psGeneral, "LogoURL"), &(map->web.metadata), "wms_logourl"); /* DescriptionURL */ /* The descriptionurl have a width, height, format and an URL */ msLoadMapContextURLELements(CPLGetXMLNode(psGeneral, "DescriptionURL"), &(map->web.metadata), "wms_descriptionurl"); /* Contact Info */ msLoadMapContextContactInfo(CPLGetXMLNode(psGeneral, "ContactInformation"), &(map->web.metadata)); return MS_SUCCESS; } /* ** msLoadMapContextLayer ** ** Load a Layer block from a MapContext document */ int msLoadMapContextLayer(mapObj *map, CPLXMLNode *psLayer, int nVersion, const char *filename, int unique_layer_names) { char *pszValue; const char *pszHash; char *pszName = NULL; CPLXMLNode *psFormatList, *psFormat, *psStyleList, *psStyle, *psExtension; CPLXMLNode *psDimensionList, *psDimension; int nStyle; layerObj *layer; /* Init new layer */ if (msGrowMapLayers(map) == NULL) return MS_FAILURE; layer = (GET_LAYER(map, map->numlayers)); initLayer(layer, map); layer->map = (mapObj *)map; layer->type = MS_LAYER_RASTER; /* save the index */ GET_LAYER(map, map->numlayers)->index = map->numlayers; map->layerorder[map->numlayers] = map->numlayers; map->numlayers++; /* Status */ pszValue = (char *)CPLGetXMLValue(psLayer, "hidden", "1"); if ((pszValue != NULL) && (atoi(pszValue) == 0 && strcasecmp(pszValue, "true") != 0)) layer->status = MS_ON; else layer->status = MS_OFF; /* Queryable */ pszValue = (char *)CPLGetXMLValue(psLayer, "queryable", "0"); if (pszValue != NULL && (atoi(pszValue) == 1 || strcasecmp(pszValue, "true") == 0)) layer->template = msStrdup("ttt"); /* Name and Title */ pszValue = (char *)CPLGetXMLValue(psLayer, "Name", NULL); if (pszValue != NULL) { msInsertHashTable(&(layer->metadata), "wms_name", pszValue); if (unique_layer_names) { pszName = (char *)malloc(sizeof(char) * (strlen(pszValue) + 15)); sprintf(pszName, "l%d:%s", layer->index, pszValue); layer->name = msStrdup(pszName); free(pszName); } else layer->name = msStrdup(pszValue); } else { pszName = (char *)malloc(sizeof(char) * 15); sprintf(pszName, "l%d:", layer->index); layer->name = msStrdup(pszName); free(pszName); } if (msGetMapContextXMLHashValue(psLayer, "Title", &(layer->metadata), "wms_title") == MS_FAILURE) { if (msGetMapContextXMLHashValue(psLayer, "Server.title", &(layer->metadata), "wms_title") == MS_FAILURE) { msDebug("Mandatory data Layer.Title missing in %s.", filename); } } /* Server Title */ msGetMapContextXMLHashValue(psLayer, "Server.title", &(layer->metadata), "wms_server_title"); /* Abstract */ msGetMapContextXMLHashValue(psLayer, "Abstract", &(layer->metadata), "wms_abstract"); /* DataURL */ if (nVersion <= OWS_0_1_4) { msGetMapContextXMLHashValueDecode(psLayer, "DataURL.OnlineResource.xlink:href", &(layer->metadata), "wms_dataurl"); } else { /* The DataURL have a width, height, format and an URL */ /* Width and height are not used, but they are included to */ /* be consistent with the spec. */ msLoadMapContextURLELements(CPLGetXMLNode(psLayer, "DataURL"), &(layer->metadata), "wms_dataurl"); } /* The MetadataURL have a width, height, format and an URL */ /* Width and height are not used, but they are included to */ /* be consistent with the spec. */ msLoadMapContextURLELements(CPLGetXMLNode(psLayer, "MetadataURL"), &(layer->metadata), "wms_metadataurl"); /* MinScale && MaxScale */ pszValue = (char *)CPLGetXMLValue(psLayer, "sld:MinScaleDenominator", NULL); if (pszValue != NULL) { layer->minscaledenom = atof(pszValue); } pszValue = (char *)CPLGetXMLValue(psLayer, "sld:MaxScaleDenominator", NULL); if (pszValue != NULL) { layer->maxscaledenom = atof(pszValue); } /* */ /* Server */ /* */ if (nVersion >= OWS_0_1_4) { if (msGetMapContextXMLStringValueDecode( psLayer, "Server.OnlineResource.xlink:href", &(layer->connection)) == MS_FAILURE) { msSetError( MS_MAPCONTEXTERR, "Mandatory data Server.OnlineResource.xlink:href missing in %s.", "msLoadMapContext()", filename); return MS_FAILURE; } else { msGetMapContextXMLHashValueDecode( psLayer, "Server.OnlineResource.xlink:href", &(layer->metadata), "wms_onlineresource"); layer->connectiontype = MS_WMS; } } else { if (msGetMapContextXMLStringValueDecode(psLayer, "Server.onlineResource", &(layer->connection)) == MS_FAILURE) { msSetError(MS_MAPCONTEXTERR, "Mandatory data Server.onlineResource missing in %s.", "msLoadMapContext()", filename); return MS_FAILURE; } else { msGetMapContextXMLHashValueDecode(psLayer, "Server.onlineResource", &(layer->metadata), "wms_onlineresource"); layer->connectiontype = MS_WMS; } } if (nVersion >= OWS_0_1_4) { if (msGetMapContextXMLHashValue(psLayer, "Server.version", &(layer->metadata), "wms_server_version") == MS_FAILURE) { msSetError(MS_MAPCONTEXTERR, "Mandatory data Server.version missing in %s.", "msLoadMapContext()", filename); return MS_FAILURE; } } else { if (msGetMapContextXMLHashValue(psLayer, "Server.wmtver", &(layer->metadata), "wms_server_version") == MS_FAILURE) { msSetError(MS_MAPCONTEXTERR, "Mandatory data Server.wmtver missing in %s.", "msLoadMapContext()", filename); return MS_FAILURE; } } /* Projection */ msLoadMapContextListInMetadata(psLayer, &(layer->metadata), "SRS", "wms_srs", " "); pszHash = msLookupHashTable(&(layer->metadata), "wms_srs"); if (((pszHash == NULL) || (strcasecmp(pszHash, "") == 0)) && map->projection.numargs != 0) { const char *pszLastProjArg = map->projection.args[map->projection.numargs - 1]; if (pszLastProjArg != NULL) { if (strncasecmp(pszLastProjArg, "AUTO:", 5) == 0) { msInsertHashTable(&(layer->metadata), "wms_srs", pszLastProjArg); } else { if (strncasecmp(pszLastProjArg, "+init=epsg:", strlen("+init=epsg:")) == 0) { const size_t nSRSSize = strlen("EPSG:") + strlen(pszLastProjArg + strlen("+init=epsg:")) + 1; char *pszSRS = (char *)malloc(nSRSSize); snprintf(pszSRS, nSRSSize, "EPSG:%s", pszLastProjArg + strlen("+init=epsg:")); msInsertHashTable(&(layer->metadata), "wms_srs", pszSRS); msFree(pszSRS); } else { msDebug("Unable to set data for layer wms_srs from this" " value %s.", pszLastProjArg); } } } } /* */ /* Format */ /* */ if (nVersion >= OWS_0_1_4) { psFormatList = CPLGetXMLNode(psLayer, "FormatList"); } else { psFormatList = psLayer; } if (psFormatList != NULL) { for (psFormat = psFormatList->psChild; psFormat != NULL; psFormat = psFormat->psNext) { msLoadMapContextLayerFormat(psFormat, layer); } } /* end FormatList parsing */ /* Style */ if (nVersion >= OWS_0_1_4) { psStyleList = CPLGetXMLNode(psLayer, "StyleList"); } else { psStyleList = psLayer; } if (psStyleList != NULL) { nStyle = 0; for (psStyle = psStyleList->psChild; psStyle != NULL; psStyle = psStyle->psNext) { if (strcasecmp(psStyle->pszValue, "Style") == 0) { nStyle++; msLoadMapContextLayerStyle(psStyle, layer, nStyle); } } } /* Dimension */ psDimensionList = CPLGetXMLNode(psLayer, "DimensionList"); if (psDimensionList != NULL) { for (psDimension = psDimensionList->psChild; psDimension != NULL; psDimension = psDimension->psNext) { if (strcasecmp(psDimension->pszValue, "Dimension") == 0) { msLoadMapContextLayerDimension(psDimension, layer); } } } /* Extension */ psExtension = CPLGetXMLNode(psLayer, "Extension"); if (psExtension != NULL) { pszValue = (char *)CPLGetXMLValue(psExtension, "ol:opacity", NULL); if (pszValue != NULL) { if (!layer->compositer) { layer->compositer = msSmallMalloc(sizeof(LayerCompositer)); initLayerCompositer(layer->compositer); } layer->compositer->opacity = atof(pszValue) * 100; } } return MS_SUCCESS; } #endif /* msLoadMapContextURL() ** ** load an OGC Web Map Context format from an URL ** ** Take a map object and a URL to a connect file in arguments */ int msLoadMapContextURL(mapObj *map, char *urlfilename, int unique_layer_names) { #if defined(USE_WMS_LYR) char *pszTmpFile = NULL; int status = 0; if (!map || !urlfilename) { msSetError(MS_MAPCONTEXTERR, "Invalid map or url given.", "msGetMapContextURL()"); return MS_FAILURE; } pszTmpFile = msTmpFile(map, map->mappath, NULL, "context.xml"); if (msHTTPGetFile(urlfilename, pszTmpFile, &status, -1, 0, 0, 0) == MS_SUCCESS) { return msLoadMapContext(map, pszTmpFile, unique_layer_names); } else { msSetError(MS_MAPCONTEXTERR, "Could not open context file %s.", "msGetMapContextURL()", urlfilename); return MS_FAILURE; } #else msSetError(MS_MAPCONTEXTERR, "Not implemented since Map Context is not enabled.", "msGetMapContextURL()"); return MS_FAILURE; #endif } /* msLoadMapContext() ** ** Get a mapfile from a OGC Web Map Context format ** ** Take as first map object and a file in arguments ** If The 2nd aregument unique_layer_names is set to MS_TRUE, the layer ** name created would be unique and be prefixed with an l plus the layers's *index ** (eg l:1:park. l:2:road ...). If It is set to MS_FALSE, the layer name ** would be the same name as the layer name in the context */ int msLoadMapContext(mapObj *map, const char *filename, int unique_layer_names) { #if defined(USE_WMS_LYR) char *pszWholeText, *pszValue; CPLXMLNode *psRoot, *psMapContext, *psLayer, *psLayerList, *psChild; char szPath[MS_MAXPATHLEN]; int nVersion = -1; char szVersionBuf[OWS_VERSION_MAXLEN]; const char *ms_contextfile_pattern = CPLGetConfigOption( "MS_CONTEXTFILE_PATTERN", MS_DEFAULT_CONTEXTFILE_PATTERN); if (msEvalRegex(ms_contextfile_pattern, filename) != MS_TRUE) { msSetError(MS_REGEXERR, "Filename validation failed.", "msLoadMapContext()"); return MS_FAILURE; } /* */ /* Load the raw XML file */ /* */ pszWholeText = msGetMapContextFileText(msBuildPath(szPath, map->mappath, filename)); if (pszWholeText == NULL) { msSetError(MS_MAPCONTEXTERR, "Unable to read %s", "msLoadMapContext()", filename); return MS_FAILURE; } if ((strstr(pszWholeText, "eType == CXT_Element && (EQUAL(psChild->pszValue, "WMS_Viewer_Context") || EQUAL(psChild->pszValue, "View_Context") || EQUAL(psChild->pszValue, "ViewContext"))) { psMapContext = psChild; break; } else { psChild = psChild->psNext; } } if (psMapContext == NULL) { CPLDestroyXMLNode(psRoot); msSetError(MS_MAPCONTEXTERR, "Invalid Map Context File (%s)", "msLoadMapContext()", filename); return MS_FAILURE; } /* Fetch document version number */ pszValue = (char *)CPLGetXMLValue(psMapContext, "version", NULL); if (!pszValue) { msDebug("msLoadMapContext(): Mandatory data version missing in %s, " "assuming 0.1.4.", filename); pszValue = "0.1.4"; } nVersion = msOWSParseVersionString(pszValue); /* Make sure this is a supported version */ switch (nVersion) { case OWS_0_1_2: case OWS_0_1_4: case OWS_0_1_7: case OWS_1_0_0: case OWS_1_1_0: /* All is good, this is a supported version. */ break; default: /* Not a supported version */ msSetError(MS_MAPCONTEXTERR, "This version of Map Context is not supported (%s).", "msLoadMapContext()", pszValue); CPLDestroyXMLNode(psRoot); return MS_FAILURE; } /* Reformat and save Version in metadata */ msInsertHashTable(&(map->web.metadata), "wms_context_version", msOWSGetVersionString(nVersion, szVersionBuf)); if (nVersion >= OWS_0_1_7 && nVersion < OWS_1_0_0) { if (msGetMapContextXMLHashValue(psMapContext, "fid", &(map->web.metadata), "wms_context_fid") == MS_FAILURE) { msDebug("Mandatory data fid missing in %s.", filename); } } /* */ /* Load the General bloc */ /* */ psChild = CPLGetXMLNode(psMapContext, "General"); if (psChild == NULL) { CPLDestroyXMLNode(psRoot); msSetError(MS_MAPCONTEXTERR, "The Map Context document provided (%s) does not contain any " "General elements.", "msLoadMapContext()", filename); return MS_FAILURE; } if (msLoadMapContextGeneral(map, psChild, psMapContext, nVersion, filename) == MS_FAILURE) { CPLDestroyXMLNode(psRoot); return MS_FAILURE; } /* */ /* Load the bloc LayerList */ /* */ psLayerList = CPLGetXMLNode(psMapContext, "LayerList"); if (psLayerList != NULL) { for (psLayer = psLayerList->psChild; psLayer != NULL; psLayer = psLayer->psNext) { if (EQUAL(psLayer->pszValue, "Layer")) { if (msLoadMapContextLayer(map, psLayer, nVersion, filename, unique_layer_names) == MS_FAILURE) { CPLDestroyXMLNode(psRoot); return MS_FAILURE; } } /* end Layer parsing */ } /* for */ } CPLDestroyXMLNode(psRoot); return MS_SUCCESS; #else msSetError(MS_MAPCONTEXTERR, "Not implemented since Map Context is not enabled.", "msGetMapContext()"); return MS_FAILURE; #endif } /* msSaveMapContext() ** ** Save a mapfile into the OGC Web Map Context format ** ** Take a map object and a file in arguments */ int msSaveMapContext(mapObj *map, char *filename) { #if defined(USE_WMS_LYR) FILE *stream; char szPath[MS_MAXPATHLEN]; int nStatus; /* open file */ if (filename != NULL && strlen(filename) > 0) { stream = fopen(msBuildPath(szPath, map->mappath, filename), "wb"); if (!stream) { msSetError(MS_IOERR, "(%s)", "msSaveMapContext()", filename); return (MS_FAILURE); } } else { msSetError(MS_IOERR, "Filename is undefined.", "msSaveMapContext()"); return MS_FAILURE; } nStatus = msWriteMapContext(map, stream); fclose(stream); return nStatus; #else msSetError(MS_MAPCONTEXTERR, "Not implemented since Map Context is not enabled.", "msSaveMapContext()"); return MS_FAILURE; #endif } int msWriteMapContext(mapObj *map, FILE *stream) { #if defined(USE_WMS_LYR) const char *version; char *pszEPSG; char *tabspace = NULL, *pszChar, *pszSLD = NULL, *pszSLD2 = NULL; char *pszStyleItem, *pszSLDBody; char *pszEncodedVal; int i, nValue, nVersion = OWS_VERSION_NOTSET; /* Dimension element */ char *pszDimension; const char *pszDimUserValue = NULL, *pszDimUnits = NULL, *pszDimDefault = NULL; const char *pszDimNearValue = NULL, *pszDimUnitSymbol = NULL; const char *pszDimMultiValue = NULL; int bDimensionList = 0; /* Decide which version we're going to return... */ version = msLookupHashTable(&(map->web.metadata), "wms_context_version"); if (version == NULL) version = "1.1.0"; nVersion = msOWSParseVersionString(version); if (nVersion == OWS_VERSION_BADFORMAT) return MS_FAILURE; /* msSetError() already called. */ /* Make sure this is a supported version */ /* Note that we don't write 0.1.2 even if we read it. */ switch (nVersion) { case OWS_0_1_4: case OWS_0_1_7: case OWS_1_0_0: case OWS_1_1_0: /* All is good, this is a supported version. */ break; default: /* Not a supported version */ msSetError(MS_MAPCONTEXTERR, "This version of Map Context is not supported (%s).", "msSaveMapContext()", version); return MS_FAILURE; } /* file header */ msIO_fprintf(stream, "\n"); /* set the WMS_Viewer_Context information */ pszEncodedVal = msEncodeHTMLEntities(version); if (nVersion >= OWS_1_0_0) { msIO_fprintf(stream, "= OWS_0_1_7) { msIO_fprintf(stream, "= OWS_0_1_7 && nVersion < OWS_1_0_0) { msOWSPrintEncodeMetadata(stream, &(map->web.metadata), NULL, "wms_context_fid", OWS_NOERR, " fid=\"%s\"", "0"); } if (nVersion >= OWS_1_0_0) msOWSPrintEncodeParam(stream, "MAP.NAME", map->name, OWS_NOERR, " id=\"%s\"", NULL); msIO_fprintf(stream, " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""); msIO_fprintf(stream, " xmlns:ogc=\"http://www.opengis.net/ogc\""); if (nVersion >= OWS_0_1_7 && nVersion < OWS_1_0_0) { msIO_fprintf(stream, " xmlns:gml=\"http://www.opengis.net/gml\""); } if (nVersion >= OWS_1_0_0) { msIO_fprintf(stream, " xmlns:xlink=\"http://www.w3.org/1999/xlink\""); msIO_fprintf(stream, " xmlns=\"http://www.opengis.net/context\""); msIO_fprintf(stream, " xmlns:sld=\"http://www.opengis.net/sld\""); pszEncodedVal = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); if (nVersion >= OWS_1_1_0) msIO_fprintf(stream, " xsi:schemaLocation=\"http://www.opengis.net/context " "%s/context/1.1.0/context.xsd\">\n", pszEncodedVal); else msIO_fprintf(stream, " xsi:schemaLocation=\"http://www.opengis.net/context " "%s/context/1.0.0/context.xsd\">\n", pszEncodedVal); msFree(pszEncodedVal); } else { msIO_fprintf(stream, " xmlns:xlink=\"http://www.w3.org/TR/xlink\""); pszEncodedVal = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); msIO_fprintf(stream, " xsi:noNamespaceSchemaLocation=\"%s/contexts/", pszEncodedVal); msFree(pszEncodedVal); pszEncodedVal = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); msIO_fprintf(stream, "%s/context.xsd\">\n", pszEncodedVal); msFree(pszEncodedVal); } /* set the General information */ msIO_fprintf(stream, " \n"); /* Window */ if (map->width != -1 || map->height != -1) msIO_fprintf(stream, " \n", map->width, map->height); /* Bounding box corners and spatial reference system */ if (tabspace) free(tabspace); tabspace = msStrdup(" "); msOWSGetEPSGProj(&(map->projection), &(map->web.metadata), "MO", MS_TRUE, &pszEPSG); msIO_fprintf(stream, "%s\n", tabspace); if (!pszEPSG || (strcasecmp(pszEPSG, "(null)") == 0)) msIO_fprintf(stream, "\n"); pszEncodedVal = msEncodeHTMLEntities(pszEPSG); msIO_fprintf(stream, "%s\n", tabspace, pszEncodedVal, map->extent.minx, map->extent.miny, map->extent.maxx, map->extent.maxy); msFree(pszEncodedVal); msFree(pszEPSG); /* Title, name */ if (nVersion >= OWS_0_1_7 && nVersion < OWS_1_0_0) { msOWSPrintEncodeParam(stream, "MAP.NAME", map->name, OWS_NOERR, " %s\n", NULL); } else { if (nVersion < OWS_0_1_7) msOWSPrintEncodeParam(stream, "MAP.NAME", map->name, OWS_NOERR, " %s\n", NULL); msIO_fprintf(stream, "%s\n", tabspace); msOWSPrintEncodeMetadata(stream, &(map->web.metadata), NULL, "wms_title", OWS_WARN, " %s\n", map->name); } /* keyword */ if (nVersion >= OWS_1_0_0) { if (msLookupHashTable(&(map->web.metadata), "wms_keywordlist") != NULL) { char **papszKeywords; int nKeywords, iKey; const char *pszValue = msLookupHashTable(&(map->web.metadata), "wms_keywordlist"); papszKeywords = msStringSplit(pszValue, ',', &nKeywords); if (nKeywords > 0 && papszKeywords) { msIO_fprintf(stream, " \n"); for (iKey = 0; iKey < nKeywords; iKey++) { pszEncodedVal = msEncodeHTMLEntities(papszKeywords[iKey]); msIO_fprintf(stream, " %s\n", pszEncodedVal); msFree(pszEncodedVal); } msIO_fprintf(stream, " \n"); } } } else msOWSPrintEncodeMetadataList(stream, &(map->web.metadata), NULL, "wms_keywordlist", " \n", " \n", " %s\n", NULL); /* abstract */ if (nVersion >= OWS_0_1_7 && nVersion < OWS_1_0_0) { msOWSPrintEncodeMetadata( stream, &(map->web.metadata), NULL, "wms_abstract", OWS_NOERR, " %s\n", NULL); } else { msOWSPrintEncodeMetadata(stream, &(map->web.metadata), NULL, "wms_abstract", OWS_NOERR, " %s\n", NULL); } /* LogoURL */ /* The LogoURL have a width, height, format and an URL */ msOWSPrintURLType( stream, &(map->web.metadata), "MO", "logourl", OWS_NOERR, NULL, "LogoURL", NULL, " width=\"%s\"", " height=\"%s\"", " format=\"%s\"", " \n", MS_FALSE, MS_FALSE, MS_FALSE, MS_FALSE, MS_TRUE, NULL, NULL, NULL, NULL, NULL, " "); /* DataURL */ msOWSPrintEncodeMetadata( stream, &(map->web.metadata), NULL, "wms_dataurl", OWS_NOERR, " \n \n \n", NULL); /* DescriptionURL */ /* The DescriptionURL have a width, height, format and an URL */ /* The metadata is structured like this: "width height format url" */ msOWSPrintURLType( stream, &(map->web.metadata), "MO", "descriptionurl", OWS_NOERR, NULL, "DescriptionURL", NULL, " width=\"%s\"", " height=\"%s\"", " format=\"%s\"", " \n", MS_FALSE, MS_FALSE, MS_FALSE, MS_FALSE, MS_TRUE, NULL, NULL, NULL, NULL, NULL, " "); /* Contact Info */ msOWSPrintContactInfo(stream, tabspace, OWS_1_1_0, &(map->web.metadata), "MO"); /* Close General */ msIO_fprintf(stream, " \n"); free(tabspace); /* Set the layer list */ msIO_fprintf(stream, " \n"); /* Loop on all layer */ for (i = 0; i < map->numlayers; i++) { if (GET_LAYER(map, i)->status != MS_DELETE && GET_LAYER(map, i)->connectiontype == MS_WMS) { const char *pszValue; char *pszValueMod; const char *pszCurrent; if (GET_LAYER(map, i)->status == MS_OFF) nValue = 1; else nValue = 0; msIO_fprintf(stream, " \n"); } } /* Close layer list */ msIO_fprintf(stream, " \n"); /* Close Map Context */ if (nVersion >= OWS_1_0_0) { msIO_fprintf(stream, "\n"); } else if (nVersion >= OWS_0_1_7) { msIO_fprintf(stream, "\n"); } else { /* 0.1.4 */ msIO_fprintf(stream, "\n"); } return MS_SUCCESS; #else msSetError(MS_MAPCONTEXTERR, "Not implemented since Map Context is not enabled.", "msWriteMapContext()"); return MS_FAILURE; #endif } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.4.0/src/mapcontour.c��������������������������������������������������������������������0000664�0000000�0000000�00000106321�14741744413�0016665�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/********************************************************************** * $Id: mapcontour.c 12629 2011-10-06 18:06:34Z aboudreault $ * * Project: MapServer * Purpose: Contour Layer * Author: Alan Boudreault (aboudreault@mapgears.com) * Author: Daniel Morissette (dmorissette@mapgears.com) * ********************************************************************** * Copyright (c) 2011, Alan Boudreault, MapGears * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. **********************************************************************/ #include "mapserver.h" #include "mapcopy.h" #include "mapresample.h" #include "ogr_api.h" #include "ogr_srs_api.h" #include "gdal.h" #include "gdal_alg.h" #include "mapows.h" #include "mapthread.h" #include "mapraster.h" #include "cpl_string.h" #define GEO_TRANS(tr, x, y) ((tr)[0] + (tr)[1] * (x) + (tr)[2] * (y)) extern int InvGeoTransform(double *gt_in, double *gt_out); typedef struct { /* OGR DataSource */ layerObj ogrLayer; /* internal use */ GDALDatasetH hOrigDS; GDALDatasetH hDS; double *buffer; /* memory dataset buffer */ rectObj extent; /* original dataset extent */ OGRDataSourceH hOGRDS; double cellsize; } contourLayerInfo; static int msContourLayerInitItemInfo(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerInitItemInfo()"); return MS_FAILURE; } return msLayerInitItemInfo(&clinfo->ogrLayer); } static void msContourLayerFreeItemInfo(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerFreeItemInfo()"); return; } msLayerFreeItemInfo(&clinfo->ogrLayer); } static void msContourLayerInfoInitialize(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo != NULL) return; clinfo = (contourLayerInfo *)msSmallCalloc(1, sizeof(contourLayerInfo)); layer->layerinfo = clinfo; clinfo->hOrigDS = NULL; clinfo->hDS = NULL; clinfo->extent.minx = -1.0; clinfo->extent.miny = -1.0; clinfo->extent.maxx = -1.0; clinfo->extent.maxy = -1.0; initLayer(&clinfo->ogrLayer, layer->map); clinfo->ogrLayer.type = layer->type; clinfo->ogrLayer.debug = layer->debug; clinfo->ogrLayer.connectiontype = MS_OGR; clinfo->ogrLayer.name = msStrdup(layer->name); clinfo->ogrLayer.connection = (char *)msSmallMalloc(strlen(clinfo->ogrLayer.name) + 13); sprintf(clinfo->ogrLayer.connection, "__%s_CONTOUR__", clinfo->ogrLayer.name); clinfo->ogrLayer.units = layer->units; if (msOWSLookupMetadata(&(layer->metadata), "OFG", "ID_type") == NULL) { msInsertHashTable(&(layer->metadata), "gml_ID_type", "Integer"); } { const char *elevItem = CSLFetchNameValue(layer->processing, "CONTOUR_ITEM"); if (elevItem && strlen(elevItem) > 0) { char szTmp[100]; snprintf(szTmp, sizeof(szTmp), "%s_type", elevItem); if (msOWSLookupMetadata(&(layer->metadata), "OFG", szTmp) == NULL) { snprintf(szTmp, sizeof(szTmp), "gml_%s_type", elevItem); msInsertHashTable(&(layer->metadata), szTmp, "Real"); } } } } static void msContourLayerInfoFree(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo == NULL) return; freeLayer(&clinfo->ogrLayer); free(clinfo); layer->layerinfo = NULL; } static int msContourLayerReadRaster(layerObj *layer, rectObj rect) { mapObj *map = layer->map; char **bands; int band = 1; double adfGeoTransform[6], adfInvGeoTransform[6]; double llx, lly, urx, ury; rectObj copyRect, mapRect; int dst_xsize, dst_ysize; int virtual_grid_step_x, virtual_grid_step_y; int src_xoff, src_yoff, src_xsize, src_ysize; double map_cellsize_x, map_cellsize_y, dst_cellsize_x, dst_cellsize_y; GDALRasterBandH hBand = NULL; CPLErr eErr; contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerReadRaster().\n"); if (clinfo == NULL || clinfo->hOrigDS == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerReadRaster()"); return MS_FAILURE; } bands = CSLTokenizeStringComplex( CSLFetchNameValue(layer->processing, "BANDS"), " ,", FALSE, FALSE); if (CSLCount(bands) > 0) { band = atoi(bands[0]); if (band < 1 || band > GDALGetRasterCount(clinfo->hOrigDS)) { msSetError(MS_IMGERR, "BANDS PROCESSING directive includes illegal band '%d', " "should be from 1 to %d.", "msContourLayerReadRaster()", band, GDALGetRasterCount(clinfo->hOrigDS)); CSLDestroy(bands); return MS_FAILURE; } } CSLDestroy(bands); hBand = GDALGetRasterBand(clinfo->hOrigDS, band); if (hBand == NULL) { msSetError(MS_IMGERR, "Band %d does not exist on dataset.", "msContourLayerReadRaster()", band); return MS_FAILURE; } if (layer->projection.numargs > 0 && EQUAL(layer->projection.args[0], "auto")) { const char *wkt; wkt = GDALGetProjectionRef(clinfo->hOrigDS); if (wkt != NULL && strlen(wkt) > 0) { if (msOGCWKT2ProjectionObj(wkt, &(layer->projection), layer->debug) != MS_SUCCESS) { char msg[MESSAGELENGTH * 2]; errorObj *ms_error = msGetErrorObj(); snprintf(msg, sizeof(msg), "%s\n" "PROJECTION AUTO cannot be used for this " "GDAL raster (`%s').", ms_error->message, layer->data); msg[MESSAGELENGTH - 1] = '\0'; msSetError(MS_OGRERR, "%s", "msDrawRasterLayer()", msg); return MS_FAILURE; } } } /* * Compute the georeferenced window of overlap, and read the source data * downsampled to match output resolution, or at full resolution if * output resolution is lower than the source resolution. * * A large portion of this overlap calculation code was borrowed from * msDrawRasterLayerGDAL(). * Would be possible to move some of this to a reusable function? * * Note: This code works only if no reprojection is involved. It would * need rework to support cases where output projection differs from source * data file projection. */ src_xsize = GDALGetRasterXSize(clinfo->hOrigDS); src_ysize = GDALGetRasterYSize(clinfo->hOrigDS); /* set the Dataset extent */ msGetGDALGeoTransform(clinfo->hOrigDS, map, layer, adfGeoTransform); clinfo->extent.minx = adfGeoTransform[0]; clinfo->extent.maxy = adfGeoTransform[3]; clinfo->extent.maxx = adfGeoTransform[0] + src_xsize * adfGeoTransform[1]; clinfo->extent.miny = adfGeoTransform[3] + src_ysize * adfGeoTransform[5]; if (layer->transform) { if (layer->debug) msDebug("msContourLayerReadRaster(): Entering transform.\n"); InvGeoTransform(adfGeoTransform, adfInvGeoTransform); mapRect = rect; if (map->cellsize == 0) { map->cellsize = msAdjustExtent(&mapRect, map->width, map->height); } map_cellsize_x = map_cellsize_y = map->cellsize; /* if necessary, project the searchrect to source coords */ if (msProjectionsDiffer(&(map->projection), &(layer->projection))) { if (msProjectRect(&map->projection, &layer->projection, &mapRect) != MS_SUCCESS) { msDebug("msContourLayerReadRaster(%s): unable to reproject map request " "rectangle into layer projection, canceling.\n", layer->name); return MS_FAILURE; } map_cellsize_x = MS_CELLSIZE(mapRect.minx, mapRect.maxx, map->width); map_cellsize_y = MS_CELLSIZE(mapRect.miny, mapRect.maxy, map->height); /* if the projection failed to project the extent requested, we need to calculate the cellsize to preserve the initial map cellsize ratio */ if ((mapRect.minx < GEO_TRANS(adfGeoTransform, 0, src_ysize)) || (mapRect.maxx > GEO_TRANS(adfGeoTransform, src_xsize, 0)) || (mapRect.miny < GEO_TRANS(adfGeoTransform + 3, 0, src_ysize)) || (mapRect.maxy > GEO_TRANS(adfGeoTransform + 3, src_xsize, 0))) { int src_unit, dst_unit; src_unit = GetMapserverUnitUsingProj(&map->projection); dst_unit = GetMapserverUnitUsingProj(&layer->projection); if (src_unit == -1 || dst_unit == -1) { msDebug("msContourLayerReadRaster(%s): unable to reproject map " "request rectangle into layer projection, canceling.\n", layer->name); return MS_FAILURE; } map_cellsize_x = MS_CONVERT_UNIT( src_unit, dst_unit, MS_CELLSIZE(rect.minx, rect.maxx, map->width)); map_cellsize_y = MS_CONVERT_UNIT( src_unit, dst_unit, MS_CELLSIZE(rect.miny, rect.maxy, map->height)); } } if (map_cellsize_x == 0 || map_cellsize_y == 0) { if (layer->debug) msDebug("msContourLayerReadRaster(): Cellsize can't be 0.\n"); return MS_FAILURE; } /* Adjust MapServer pixel model to GDAL pixel model */ mapRect.minx -= map_cellsize_x * 0.5; mapRect.maxx += map_cellsize_x * 0.5; mapRect.miny -= map_cellsize_y * 0.5; mapRect.maxy += map_cellsize_y * 0.5; /* * If raw data cellsize (from geotransform) is larger than output * map_cellsize then we want to extract only enough data to match the output * map resolution which means that GDAL will automatically sample the data * on read. * * To prevent bad contour effects on tile edges, we adjust the target * cellsize to align the extracted window with a virtual grid based on the * origin of the raw data and a virtual grid step size corresponding to an * integer sampling step. * * If source data has a greater cellsize (i.e. lower res) that requested * output map then we use the raw data cellsize as target cellsize since * there is no point in interpolating the data for contours in this case. */ virtual_grid_step_x = (int)floor(map_cellsize_x / ABS(adfGeoTransform[1])); if (virtual_grid_step_x < 1) virtual_grid_step_x = 1; /* Do not interpolate data if grid sampling step < 1 */ virtual_grid_step_y = (int)floor(map_cellsize_y / ABS(adfGeoTransform[5])); if (virtual_grid_step_y < 1) virtual_grid_step_y = 1; /* Do not interpolate data if grid sampling step < 1 */ /* target cellsize is a multiple of raw data cellsize based on grid step*/ dst_cellsize_x = ABS(adfGeoTransform[1]) * virtual_grid_step_x; dst_cellsize_y = ABS(adfGeoTransform[5]) * virtual_grid_step_y; /* Compute overlap between source and target views */ copyRect = mapRect; if (copyRect.minx < GEO_TRANS(adfGeoTransform, 0, src_ysize)) copyRect.minx = GEO_TRANS(adfGeoTransform, 0, src_ysize); if (copyRect.maxx > GEO_TRANS(adfGeoTransform, src_xsize, 0)) copyRect.maxx = GEO_TRANS(adfGeoTransform, src_xsize, 0); if (copyRect.miny < GEO_TRANS(adfGeoTransform + 3, 0, src_ysize)) copyRect.miny = GEO_TRANS(adfGeoTransform + 3, 0, src_ysize); if (copyRect.maxy > GEO_TRANS(adfGeoTransform + 3, src_xsize, 0)) copyRect.maxy = GEO_TRANS(adfGeoTransform + 3, src_xsize, 0); if (copyRect.minx >= copyRect.maxx || copyRect.miny >= copyRect.maxy) { if (layer->debug) msDebug("msContourLayerReadRaster(): No overlap.\n"); return MS_SUCCESS; } /* * Convert extraction window to raster coordinates */ llx = GEO_TRANS(adfInvGeoTransform + 0, copyRect.minx, copyRect.miny); lly = GEO_TRANS(adfInvGeoTransform + 3, copyRect.minx, copyRect.miny); urx = GEO_TRANS(adfInvGeoTransform + 0, copyRect.maxx, copyRect.maxy); ury = GEO_TRANS(adfInvGeoTransform + 3, copyRect.maxx, copyRect.maxy); /* * Align extraction window with virtual grid * (keep in mind raster coordinates origin is at upper-left) * We also add an extra buffer to fix tile boundarie issues when zoomed */ llx = floor(llx / virtual_grid_step_x) * virtual_grid_step_x - (virtual_grid_step_x * 5); urx = ceil(urx / virtual_grid_step_x) * virtual_grid_step_x + (virtual_grid_step_x * 5); ury = floor(ury / virtual_grid_step_y) * virtual_grid_step_y - (virtual_grid_step_x * 5); lly = ceil(lly / virtual_grid_step_y) * virtual_grid_step_y + (virtual_grid_step_x * 5); src_xoff = MS_MAX(0, (int)floor(llx + 0.5)); src_yoff = MS_MAX(0, (int)floor(ury + 0.5)); src_xsize = MS_MIN(MS_MAX(0, (int)(urx - llx + 0.5)), GDALGetRasterXSize(clinfo->hOrigDS) - src_xoff); src_ysize = MS_MIN(MS_MAX(0, (int)(lly - ury + 0.5)), GDALGetRasterYSize(clinfo->hOrigDS) - src_yoff); /* Update the geographic extent (buffer added) */ /* TODO: a better way to go the geo_trans */ copyRect.minx = GEO_TRANS(adfGeoTransform + 0, src_xoff, 0); copyRect.maxx = GEO_TRANS(adfGeoTransform + 0, src_xoff + src_xsize, 0); copyRect.miny = GEO_TRANS(adfGeoTransform + 3, 0, src_yoff + src_ysize); copyRect.maxy = GEO_TRANS(adfGeoTransform + 3, 0, src_yoff); /* * If input window is to small then stop here */ if (src_xsize < 2 || src_ysize < 2) { if (layer->debug) msDebug("msContourLayerReadRaster(): input window too small, or no " "apparent overlap between map view and this window(1).\n"); return MS_SUCCESS; } /* Target buffer size */ dst_xsize = (int)ceil((copyRect.maxx - copyRect.minx) / dst_cellsize_x); dst_ysize = (int)ceil((copyRect.maxy - copyRect.miny) / dst_cellsize_y); if (dst_xsize == 0 || dst_ysize == 0) { if (layer->debug) msDebug("msContourLayerReadRaster(): no apparent overlap between map " "view and this window(2).\n"); return MS_SUCCESS; } if (layer->debug) msDebug("msContourLayerReadRaster(): src=%d,%d,%d,%d, dst=%d,%d,%d,%d\n", src_xoff, src_yoff, src_xsize, src_ysize, 0, 0, dst_xsize, dst_ysize); } else { src_xoff = 0; src_yoff = 0; dst_xsize = src_xsize = MS_MIN(map->width, src_xsize); dst_ysize = src_ysize = MS_MIN(map->height, src_ysize); copyRect.minx = 0; copyRect.miny = 0; (void)copyRect.miny; copyRect.maxx = map->width; copyRect.maxy = map->height; (void)copyRect.maxx; dst_cellsize_y = dst_cellsize_x = 1; } /* -------------------------------------------------------------------- */ /* Allocate buffer, and read data into it. */ /* -------------------------------------------------------------------- */ clinfo->buffer = (double *)malloc(sizeof(double) * dst_xsize * dst_ysize); if (clinfo->buffer == NULL) { msSetError(MS_MEMERR, "Malloc(): Out of memory.", "msContourLayerReadRaster()"); return MS_FAILURE; } eErr = GDALRasterIO(hBand, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, clinfo->buffer, dst_xsize, dst_ysize, GDT_Float64, 0, 0); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALRasterIO() failed: %s", "msContourLayerReadRaster()", CPLGetLastErrorMsg()); free(clinfo->buffer); clinfo->buffer = NULL; return MS_FAILURE; } GDALDriverH hMemDRV = GDALGetDriverByName("MEM"); if (!hMemDRV) { msSetError(MS_IOERR, "GDAL MEM driver not available", "msContourLayerReadRaster()"); free(clinfo->buffer); clinfo->buffer = NULL; return MS_FAILURE; } char pointer[64]; memset(pointer, 0, sizeof(pointer)); CPLPrintPointer(pointer, clinfo->buffer, sizeof(pointer)); clinfo->hDS = GDALCreate(hMemDRV, "", dst_xsize, dst_ysize, 0, 0, NULL); if (clinfo->hDS == NULL) { msSetError(MS_IMGERR, "Unable to create GDAL Memory dataset.", "msContourLayerReadRaster()"); free(clinfo->buffer); clinfo->buffer = NULL; return MS_FAILURE; } char **papszOptions = CSLSetNameValue(NULL, "DATAPOINTER", pointer); eErr = GDALAddBand(clinfo->hDS, GDT_Float64, papszOptions); CSLDestroy(papszOptions); if (eErr != CE_None) { msSetError(MS_IMGERR, "Unable to add band to GDAL Memory dataset.", "msContourLayerReadRaster()"); free(clinfo->buffer); clinfo->buffer = NULL; return MS_FAILURE; } { // Copy nodata value from source dataset to memory dataset int bHasNoData = FALSE; double dfNoDataValue = GDALGetRasterNoDataValue(hBand, &bHasNoData); if (bHasNoData) { GDALSetRasterNoDataValue(GDALGetRasterBand(clinfo->hDS, 1), dfNoDataValue); } } adfGeoTransform[0] = copyRect.minx; adfGeoTransform[1] = dst_cellsize_x; adfGeoTransform[2] = 0; adfGeoTransform[3] = copyRect.maxy; adfGeoTransform[4] = 0; adfGeoTransform[5] = -dst_cellsize_y; clinfo->cellsize = MS_MAX(dst_cellsize_x, dst_cellsize_y); { char buf[64]; sprintf(buf, "%lf", clinfo->cellsize); msInsertHashTable(&layer->metadata, "__data_cellsize__", buf); } GDALSetGeoTransform(clinfo->hDS, adfGeoTransform); return MS_SUCCESS; } static void msContourOGRCloseConnection(void *conn_handle) { OGRDataSourceH hDS = (OGRDataSourceH)conn_handle; msAcquireLock(TLOCK_OGR); OGR_DS_Destroy(hDS); msReleaseLock(TLOCK_OGR); } /* Function that parses multiple options in the a list. It also supports min/maxscaledenom checks. ie. "CONTOUR_INTERVAL=0,3842942:10" */ static char *msContourGetOption(layerObj *layer, const char *name) { int c, i, found = MS_FALSE; char **values, **tmp, **options; double maxscaledenom, minscaledenom; char *value = NULL; options = CSLFetchNameValueMultiple(layer->processing, name); c = CSLCount(options); /* First pass to find the value among options that have min/maxscaledenom */ /* specified */ for (i = 0; i < c && found == MS_FALSE; ++i) { values = CSLTokenizeStringComplex(options[i], ":", FALSE, FALSE); if (CSLCount(values) == 2) { tmp = CSLTokenizeStringComplex(values[0], ",", FALSE, FALSE); if (CSLCount(tmp) == 2) { minscaledenom = atof(tmp[0]); maxscaledenom = atof(tmp[1]); if (layer->map->scaledenom <= 0 || (((maxscaledenom <= 0) || (layer->map->scaledenom <= maxscaledenom)) && ((minscaledenom <= 0) || (layer->map->scaledenom > minscaledenom)))) { value = msStrdup(values[1]); found = MS_TRUE; } } CSLDestroy(tmp); } CSLDestroy(values); } /* Second pass to find the value among options that do NOT have */ /* min/maxscaledenom specified */ for (i = 0; i < c && found == MS_FALSE; ++i) { values = CSLTokenizeStringComplex(options[i], ":", FALSE, FALSE); if (CSLCount(values) == 1) { value = msStrdup(values[0]); found = MS_TRUE; } CSLDestroy(values); } CSLDestroy(options); return value; } static int msContourLayerGenerateContour(layerObj *layer) { OGRSFDriverH hDriver; OGRFieldDefnH hFld; OGRLayerH hLayer; const char *elevItem; char *option; double interval = 1.0, levels[1000]; int levelCount = 0; GDALRasterBandH hBand = NULL; CPLErr eErr; int bHasNoData = FALSE; double dfNoDataValue; contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; OGRRegisterAll(); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerCreateOGRDataSource()"); return MS_FAILURE; } if (!clinfo->hDS) { /* no overlap */ return MS_SUCCESS; } hBand = GDALGetRasterBand(clinfo->hDS, 1); if (hBand == NULL) { msSetError(MS_IMGERR, "Band %d does not exist on dataset.", "msContourLayerGenerateContour()", 1); return MS_FAILURE; } /* Create the OGR DataSource */ hDriver = OGRGetDriverByName("Memory"); if (hDriver == NULL) { msSetError(MS_OGRERR, "Unable to get OGR driver 'Memory'.", "msContourLayerCreateOGRDataSource()"); return MS_FAILURE; } clinfo->hOGRDS = OGR_Dr_CreateDataSource(hDriver, "", NULL); if (clinfo->hOGRDS == NULL) { msSetError(MS_OGRERR, "Unable to create OGR DataSource.", "msContourLayerCreateOGRDataSource()"); return MS_FAILURE; } hLayer = OGR_DS_CreateLayer(clinfo->hOGRDS, clinfo->ogrLayer.name, NULL, wkbLineString, NULL); hFld = OGR_Fld_Create("ID", OFTInteger); OGR_Fld_SetWidth(hFld, 8); OGR_L_CreateField(hLayer, hFld, FALSE); OGR_Fld_Destroy(hFld); /* Check if we have a coutour item specified */ elevItem = CSLFetchNameValue(layer->processing, "CONTOUR_ITEM"); if (elevItem && strlen(elevItem) > 0) { hFld = OGR_Fld_Create(elevItem, OFTReal); OGR_Fld_SetWidth(hFld, 12); OGR_Fld_SetPrecision(hFld, 3); OGR_L_CreateField(hLayer, hFld, FALSE); OGR_Fld_Destroy(hFld); } else { elevItem = NULL; } option = msContourGetOption(layer, "CONTOUR_INTERVAL"); if (option) { interval = atof(option); free(option); } option = msContourGetOption(layer, "CONTOUR_LEVELS"); if (option) { int i, c; char **levelsTmp; levelsTmp = CSLTokenizeStringComplex(option, ",", FALSE, FALSE); c = CSLCount(levelsTmp); for (i = 0; i < c && i < (int)(sizeof(levels) / sizeof(double)); ++i) levels[levelCount++] = atof(levelsTmp[i]); CSLDestroy(levelsTmp); free(option); } dfNoDataValue = GDALGetRasterNoDataValue(hBand, &bHasNoData); eErr = GDALContourGenerate( hBand, interval, 0.0, levelCount, levels, bHasNoData, dfNoDataValue, hLayer, OGR_FD_GetFieldIndex(OGR_L_GetLayerDefn(hLayer), "ID"), (elevItem == NULL) ? -1 : OGR_FD_GetFieldIndex(OGR_L_GetLayerDefn(hLayer), elevItem), NULL, NULL); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALContourGenerate() failed: %s", "msContourLayerGenerateContour()", CPLGetLastErrorMsg()); return MS_FAILURE; } msConnPoolRegister(&clinfo->ogrLayer, clinfo->hOGRDS, msContourOGRCloseConnection); return MS_SUCCESS; } int msContourLayerOpen(layerObj *layer) { char *decrypted_path; char szPath[MS_MAXPATHLEN]; contourLayerInfo *clinfo; if (layer->debug) msDebug("Entering msContourLayerOpen().\n"); /* If we don't have info, initialize an empty one now */ if (layer->layerinfo == NULL) msContourLayerInfoInitialize(layer); clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->data == NULL && layer->tileindex == NULL) { msSetError(MS_MISCERR, "Layer %s has neither DATA nor TILEINDEX defined.", "msContourLayerOpen()", layer->name); return MS_FAILURE; } if (layer->tileindex != NULL) { char szTilename[MS_MAXPATHLEN]; int status; int tilelayerindex, tileitemindex, tilesrsindex; rectObj searchrect; layerObj *tlp; shapeObj tshp; char tilesrsname[1]; msInitShape(&tshp); searchrect = layer->map->extent; status = msDrawRasterSetupTileLayer(layer->map, layer, &searchrect, MS_FALSE, &tilelayerindex, &tileitemindex, &tilesrsindex, &tlp); if (status == MS_FAILURE) { return MS_FAILURE; } status = msDrawRasterIterateTileIndex(layer, tlp, &tshp, tileitemindex, -1, szTilename, sizeof(szTilename), tilesrsname, sizeof(tilesrsname)); if (status == MS_FAILURE || status == MS_DONE) { if (status == MS_DONE) { if (layer->debug) msDebug("No raster matching filter.\n"); } msDrawRasterCleanupTileLayer(tlp, tilelayerindex); return MS_FAILURE; } msDrawRasterCleanupTileLayer(tlp, tilelayerindex); msDrawRasterBuildRasterPath(layer->map, layer, szTilename, szPath); decrypted_path = msStrdup(szPath); /* Cancel the time filter that might have been set on ours in case of */ /* a inline tileindex */ msFreeExpression(&layer->filter); msInitExpression(&layer->filter); } else { msTryBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, layer->data); decrypted_path = msDecryptStringTokens(layer->map, szPath); } GDALAllRegister(); /* Open the original Dataset */ msAcquireLock(TLOCK_GDAL); if (decrypted_path) { clinfo->hOrigDS = GDALOpen(decrypted_path, GA_ReadOnly); msFree(decrypted_path); } else clinfo->hOrigDS = NULL; msReleaseLock(TLOCK_GDAL); if (clinfo->hOrigDS == NULL) { msSetError(MS_IMGERR, "Unable to open GDAL dataset.", "msContourLayerOpen()"); return MS_FAILURE; } /* Open the raster source */ if (msContourLayerReadRaster(layer, layer->map->extent) != MS_SUCCESS) return MS_FAILURE; /* Generate Contour Dataset */ if (msContourLayerGenerateContour(layer) != MS_SUCCESS) return MS_FAILURE; if (clinfo->hDS) { GDALClose(clinfo->hDS); clinfo->hDS = NULL; free(clinfo->buffer); } /* Open our virtual ogr layer */ if (clinfo->hOGRDS && (msLayerOpen(&clinfo->ogrLayer) != MS_SUCCESS)) return MS_FAILURE; return MS_SUCCESS; } int msContourLayerIsOpen(layerObj *layer) { if (layer->layerinfo) return MS_TRUE; return MS_FALSE; } int msContourLayerClose(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerClose().\n"); if (clinfo) { if (clinfo->hOGRDS) msConnPoolRelease(&clinfo->ogrLayer, clinfo->hOGRDS); msLayerClose(&clinfo->ogrLayer); if (clinfo->hDS) { GDALClose(clinfo->hDS); clinfo->hDS = NULL; free(clinfo->buffer); } if (clinfo->hOrigDS) { GDALClose(clinfo->hOrigDS); clinfo->hOrigDS = NULL; } msContourLayerInfoFree(layer); } return MS_SUCCESS; } int msContourLayerGetItems(layerObj *layer) { const char *elevItem; contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerGetItems()"); return MS_FAILURE; } layer->numitems = 0; layer->items = (char **)msSmallCalloc(sizeof(char *), 2); layer->items[layer->numitems++] = msStrdup("ID"); elevItem = CSLFetchNameValue(layer->processing, "CONTOUR_ITEM"); if (elevItem && strlen(elevItem) > 0) { layer->items[layer->numitems++] = msStrdup(elevItem); } return msLayerGetItems(&clinfo->ogrLayer); } int msContourLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { int i; rectObj newRect; contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerWhichShapes().\n"); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerWhichShapes()"); return MS_FAILURE; } if (isQuery) { newRect = layer->map->extent; } else { newRect = rect; /* if necessary, project the searchrect to source coords */ if (msProjectionsDiffer(&(layer->map->projection), &(layer->projection))) { if (msProjectRect(&layer->projection, &layer->map->projection, &newRect) != MS_SUCCESS) { msDebug("msContourLayerWhichShapes(%s): unable to reproject map " "request rectangle into layer projection, canceling.\n", layer->name); return MS_FAILURE; } } } /* regenerate the raster io */ if (clinfo->hOGRDS) msConnPoolRelease(&clinfo->ogrLayer, clinfo->hOGRDS); msLayerClose(&clinfo->ogrLayer); /* Open the raster source */ if (msContourLayerReadRaster(layer, newRect) != MS_SUCCESS) return MS_FAILURE; /* Generate Contour Dataset */ if (msContourLayerGenerateContour(layer) != MS_SUCCESS) return MS_FAILURE; if (clinfo->hDS) { GDALClose(clinfo->hDS); clinfo->hDS = NULL; free(clinfo->buffer); } if (!clinfo->hOGRDS) /* no overlap */ return MS_DONE; /* Open our virtual ogr layer */ if (msLayerOpen(&clinfo->ogrLayer) != MS_SUCCESS) return MS_FAILURE; clinfo->ogrLayer.numitems = layer->numitems; clinfo->ogrLayer.items = (char **)msSmallMalloc(sizeof(char *) * layer->numitems); for (i = 0; i < layer->numitems; ++i) { clinfo->ogrLayer.items[i] = msStrdup(layer->items[i]); } return msLayerWhichShapes(&clinfo->ogrLayer, rect, isQuery); } int msContourLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerGetShape().\n"); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerGetShape()"); return MS_FAILURE; } return msLayerGetShape(&clinfo->ogrLayer, shape, record); } int msContourLayerNextShape(layerObj *layer, shapeObj *shape) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerNextShape().\n"); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerNextShape()"); return MS_FAILURE; } return msLayerNextShape(&clinfo->ogrLayer, shape); } /************************************************************************/ /* msContourLayerGetExtent() */ /* Simple copy of the maprasterquery.c file. might change in the future */ /************************************************************************/ int msContourLayerGetExtent(layerObj *layer, rectObj *extent) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerGetExtent().\n"); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerGetExtent()"); return MS_FAILURE; } MS_COPYRECT(extent, &clinfo->extent); return MS_SUCCESS; } /************************************************************************/ /* msContourLayerSetTimeFilter() */ /* */ /* This function is actually just used in the context of */ /* setting a filter on the tileindex for time based queries. */ /* For instance via WMS requests. */ /* */ /* If a local shapefile tileindex is in use, we will set a */ /* backtics filter (shapefile compatible). If another layer is */ /* being used as the tileindex then we will forward the */ /* SetTimeFilter call to it. If there is no tileindex in */ /* place, we do nothing. */ /************************************************************************/ int msContourLayerSetTimeFilter(layerObj *layer, const char *timestring, const char *timefield) { int tilelayerindex; if (layer->debug) msDebug("msContourLayerSetTimeFilter(%s,%s).\n", timestring, timefield); /* -------------------------------------------------------------------- */ /* If we don't have a tileindex the time filter has no effect. */ /* -------------------------------------------------------------------- */ if (layer->tileindex == NULL) { if (layer->debug) msDebug("msContourLayerSetTimeFilter(): time filter without effect on " "layers without tileindex.\n"); return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Find the tileindex layer. */ /* -------------------------------------------------------------------- */ tilelayerindex = msGetLayerIndex(layer->map, layer->tileindex); /* -------------------------------------------------------------------- */ /* If we are using a local shapefile as our tileindex (that is */ /* to say, the tileindex name is not of another layer), then we */ /* just install a backtics style filter on the current layer. */ /* -------------------------------------------------------------------- */ if (tilelayerindex == -1) return msLayerMakeBackticsTimeFilter(layer, timestring, timefield); /* -------------------------------------------------------------------- */ /* Otherwise we invoke the tileindex layers SetTimeFilter */ /* method. */ /* -------------------------------------------------------------------- */ if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; return msLayerSetTimeFilter(layer->GET_LAYER(map, tilelayerindex), timestring, timefield); } /************************************************************************/ /* msRASTERLayerInitializeVirtualTable() */ /************************************************************************/ int msContourLayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); layer->vtable->LayerInitItemInfo = msContourLayerInitItemInfo; layer->vtable->LayerFreeItemInfo = msContourLayerFreeItemInfo; layer->vtable->LayerOpen = msContourLayerOpen; layer->vtable->LayerIsOpen = msContourLayerIsOpen; layer->vtable->LayerWhichShapes = msContourLayerWhichShapes; layer->vtable->LayerNextShape = msContourLayerNextShape; layer->vtable->LayerGetShape = msContourLayerGetShape; /* layer->vtable->LayerGetShapeCount, use default */ layer->vtable->LayerClose = msContourLayerClose; layer->vtable->LayerGetItems = msContourLayerGetItems; layer->vtable->LayerGetExtent = msContourLayerGetExtent; /* layer->vtable->LayerGetAutoStyle, use default */ /* layer->vtable->LayerApplyFilterToLayer, use default */ /*layer->vtable->LayerCloseConnection = msContourLayerClose;*/ /* we use backtics for proper tileindex shapefile functioning */ layer->vtable->LayerSetTimeFilter = msContourLayerSetTimeFilter; /* layer->vtable->LayerCreateItems, use default */ /* layer->vtable->LayerGetNumFeatures, use default */ return MS_SUCCESS; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.4.0/src/mapcopy.c�����������������������������������������������������������������������0000664�0000000�0000000�00000122565�14741744413�0016156�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions to allow copying/cloning of maps * Author: Sean Gillies, sgillies@frii.com * * Notes: * These functions are not in mapfile.c because that file is * cumbersome enough as it is. There is agreement that this code and * that in mapfile.c should eventually be split up by object into * mapobj.c, layerobj.c, etc. Or something like that. * * Unit tests are written in Python using PyUnit and are in * mapscript/python/tests/testCopyMap.py. The tests can be * executed from the python directory as * * python2 tests/testCopyMap.py * * I just find Python to be very handy for unit testing, that's all. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "mapserver.h" #include "mapsymbol.h" #include "mapcopy.h" #include "cpl_string.h" /*********************************************************************** * msCopyProjectionExtended() * * * * Copy a projectionObj while adding additional arguments * **********************************************************************/ int msCopyProjectionExtended(projectionObj *dst, const projectionObj *src, char **args, int num_args) { MS_COPYSTELEM(numargs); MS_COPYSTELEM(gt); for (int i = 0; i < dst->numargs; i++) { /* Our destination consists of unallocated pointers */ dst->args[i] = msStrdup(src->args[i]); } if (args) { for (int i = 0; i < num_args; i++) { dst->args[dst->numargs++] = msStrdup(args[i]); } } msProjectionInheritContextFrom(dst, src); if (dst->numargs != 0) { if (msProcessProjection(dst) != MS_SUCCESS) return MS_FAILURE; } MS_COPYSTELEM(wellknownprojection); return MS_SUCCESS; } /*********************************************************************** * msCopyProjection() * * * * Copy a projectionObj * **********************************************************************/ int msCopyProjection(projectionObj *dst, const projectionObj *src) { return msCopyProjectionExtended(dst, src, NULL, 0); } /*********************************************************************** * msCopyLine() * * * * Copy a lineObj, using msCopyPoint() * **********************************************************************/ int msCopyLine(lineObj *dst, const lineObj *src) { int i; dst->numpoints = src->numpoints; for (i = 0; i < dst->numpoints; i++) { MS_COPYPOINT(&(dst->point[i]), &(src->point[i])); } return MS_SUCCESS; } /*********************************************************************** * msCopyShape() * * * * Copy a shapeObj, using msCopyLine(), msCopyRect() * * Not completely implemented or tested. * **********************************************************************/ /* int msCopyShapeObj(shapeObj *dst, shapeObj *src) { int i; copyProperty(&(dst->numlines), &(src->numlines), sizeof(int)); for (i = 0; i < dst->numlines; i++) { msCopyLine(&(dst->line[i]), &(src->line[i])); } msCopyRect(&(dst->bounds), &(src->bounds)); copyProperty(&(dst->type), &(src->type), sizeof(int)); copyProperty(&(dst->index), &(src->index), sizeof(long)); copyProperty(&(dst->tileindex), &(src->tileindex), sizeof(int)); copyProperty(&(dst->classindex), &(src->classindex), sizeof(int)); copyStringPropertyRealloc(&(dst->text), src->text); copyProperty(&(dst->numvalues), &(src->numvalues), sizeof(int)); for (i = 0; i < dst->numvalues; i++) { copyStringPropertyRealloc(&(dst->values[i]), src->values[i]); } return(0); } */ /********************************************************************** * msCopyItem() * * * * Copy an itemObj * **********************************************************************/ int msCopyItem(itemObj *dst, const itemObj *src) { MS_COPYSTRING(dst->name, src->name); MS_COPYSTELEM(type); MS_COPYSTELEM(index); MS_COPYSTELEM(size); MS_COPYSTELEM(numdecimals); return MS_SUCCESS; } /*********************************************************************** * msCopyHashTable() * * * * Copy a hashTableObj, using msInsertHashTable() * **********************************************************************/ int msCopyHashTable(hashTableObj *dst, const hashTableObj *src) { const char *key = NULL; while (1) { key = msNextKeyFromHashTable(src, key); if (!key) break; else msInsertHashTable(dst, key, msLookupHashTable(src, key)); } return MS_SUCCESS; } /*********************************************************************** * msCopyFontSet() * * * * Copy a fontSetObj, using msCreateHashTable() and msCopyHashTable() * **********************************************************************/ int msCopyFontSet(fontSetObj *dst, const fontSetObj *src, mapObj *map) { MS_COPYSTRING(dst->filename, src->filename); MS_COPYSTELEM(numfonts); if (msCopyHashTable(&(dst->fonts), &(src->fonts)) != MS_SUCCESS) return MS_FAILURE; dst->map = map; return MS_SUCCESS; } /*********************************************************************** * msCopyExpression() * * * * Copy an expressionObj, but only its string, type and flags * **********************************************************************/ int msCopyExpression(expressionObj *dst, const expressionObj *src) { if ((dst->type == MS_REGEX) && dst->compiled) ms_regfree(&(dst->regex)); dst->compiled = MS_FALSE; MS_COPYSTRING(dst->string, src->string); MS_COPYSTELEM(type); MS_COPYSTELEM(flags); return MS_SUCCESS; } /*********************************************************************** * msCopyJoin() * * * * Copy a joinObj * **********************************************************************/ int msCopyJoin(joinObj *dst, const joinObj *src) { MS_COPYSTRING(dst->name, src->name); /* makes no sense to copy the items or values since they are runtime additions to the mapfile */ MS_COPYSTRING(dst->table, src->table); MS_COPYSTRING(dst->from, src->from); MS_COPYSTRING(dst->to, src->to); MS_COPYSTRING(dst->header, src->header); #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif MS_COPYSTRING(dst->footer, src->footer); dst->type = src->type; MS_COPYSTRING(dst->connection, src->connection); MS_COPYSTELEM(connectiontype); /* TODO: need to handle joininfo (probably should be just set to NULL) */ dst->joininfo = NULL; return MS_SUCCESS; } /*********************************************************************** * msCopyQueryMap() * * * * Copy a queryMapObj, using msCopyColor() * **********************************************************************/ int msCopyQueryMap(queryMapObj *dst, const queryMapObj *src) { MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYSTELEM(status); MS_COPYSTELEM(style); MS_COPYCOLOR(&(dst->color), &(src->color)); return MS_SUCCESS; } /*********************************************************************** * msCopyLeader() * * * * Copy a labelLeaderObj, using msCopyStyle() * **********************************************************************/ int msCopyLabelLeader(labelLeaderObj *dst, const labelLeaderObj *src) { int i; assert(dst && src); MS_COPYSTELEM(gridstep); MS_COPYSTELEM(maxdistance); /* ** now the styles */ /* free any previous styles on the dst label */ for (i = 0; i < dst->numstyles; i++) { /* each style */ if (dst->styles[i] != NULL) { if (freeStyle(dst->styles[i]) == MS_SUCCESS) msFree(dst->styles[i]); } } dst->numstyles = 0; for (i = 0; i < src->numstyles; i++) { if (msGrowLeaderStyles(dst) == NULL) return MS_FAILURE; if (initStyle(dst->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to init style.", "msCopyLabel()"); return MS_FAILURE; } if (msCopyStyle(dst->styles[i], src->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy style.", "msCopyLabel()"); return MS_FAILURE; } dst->numstyles++; } return MS_SUCCESS; } /*********************************************************************** * msCopyLabel() * * * * Copy a labelObj, using msCopyColor() and msCopyStyle() * **********************************************************************/ int msCopyLabel(labelObj *dst, const labelObj *src) { int i; for (i = 0; i < MS_LABEL_BINDING_LENGTH; i++) { MS_COPYSTRING(dst->bindings[i].item, src->bindings[i].item); dst->bindings[i].index = src->bindings[i].index; /* no way to use the macros */ MS_COPYSTRING(dst->exprBindings[i].string, src->exprBindings[i].string); dst->exprBindings[i].type = src->exprBindings[i].type; } MS_COPYSTELEM(numbindings); MS_COPYSTELEM(nexprbindings); MS_COPYSTRING(dst->font, src->font); MS_COPYCOLOR(&(dst->color), &(src->color)); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYCOLOR(&(dst->shadowcolor), &(src->shadowcolor)); MS_COPYSTELEM(shadowsizex); MS_COPYSTELEM(shadowsizey); MS_COPYSTELEM(size); MS_COPYSTELEM(minsize); MS_COPYSTELEM(maxsize); MS_COPYSTELEM(position); MS_COPYSTELEM(offsetx); MS_COPYSTELEM(offsety); MS_COPYSTELEM(angle); MS_COPYSTELEM(anglemode); MS_COPYSTELEM(buffer); MS_COPYSTELEM(wrap); MS_COPYSTELEM(align); MS_COPYSTELEM(maxlength); MS_COPYSTELEM(minfeaturesize); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); MS_COPYSTELEM(autominfeaturesize); MS_COPYSTELEM(mindistance); MS_COPYSTELEM(partials); MS_COPYSTELEM(force); MS_COPYSTELEM(priority); MS_COPYSTELEM(repeatdistance); MS_COPYSTELEM(maxoverlapangle); MS_COPYSTRING(dst->encoding, src->encoding); MS_COPYSTELEM(outlinewidth); MS_COPYSTELEM(space_size_10); if (msCopyExpression(&(dst->expression), &(src->expression)) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy expression.", "msCopyLabel()"); return MS_FAILURE; } if (msCopyExpression(&(dst->text), &(src->text)) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy text.", "msCopyLabel()"); return MS_FAILURE; } /* ** now the styles */ /* free any previous styles on the dst label */ for (i = 0; i < dst->numstyles; i++) { /* each style */ if (dst->styles[i] != NULL) { if (freeStyle(dst->styles[i]) == MS_SUCCESS) msFree(dst->styles[i]); } } dst->numstyles = 0; for (i = 0; i < src->numstyles; i++) { if (msGrowLabelStyles(dst) == NULL) return MS_FAILURE; if (initStyle(dst->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to init style.", "msCopyLabel()"); return MS_FAILURE; } if (msCopyStyle(dst->styles[i], src->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy style.", "msCopyLabel()"); return MS_FAILURE; } dst->numstyles++; } if (src->leader) { dst->leader = msSmallMalloc(sizeof(labelLeaderObj)); initLeader(dst->leader); msCopyLabelLeader(dst->leader, src->leader); } else { if (dst->leader) { freeLabelLeader(dst->leader); msFree(dst->leader); } dst->leader = NULL; } MS_COPYSTELEM(sizeunits); MS_COPYSTELEM(scalefactor); return MS_SUCCESS; } /*********************************************************************** * msCopyWeb() * * * * Copy webObj, using msCopyRect(), msCreateHashTable(), and * * msCopyHashTable() * **********************************************************************/ int msCopyWeb(webObj *dst, const webObj *src, mapObj *map) { MS_COPYSTRING(dst->imagepath, src->imagepath); MS_COPYSTRING(dst->imageurl, src->imageurl); dst->map = map; #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif MS_COPYSTRING(dst->header, src->header); MS_COPYSTRING(dst->footer, src->footer); MS_COPYSTRING(dst->empty, src->empty); MS_COPYSTRING(dst->error, src->error); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); MS_COPYSTRING(dst->mintemplate, src->mintemplate); MS_COPYSTRING(dst->maxtemplate, src->maxtemplate); if (msCopyHashTable(&(dst->metadata), &(src->metadata)) != MS_SUCCESS) return MS_FAILURE; msCopyHashTable(&dst->validation, &src->validation); MS_COPYSTRING(dst->queryformat, src->queryformat); MS_COPYSTRING(dst->legendformat, src->legendformat); MS_COPYSTRING(dst->browseformat, src->browseformat); return MS_SUCCESS; } /*********************************************************************** * msCopyStyle() * * * * Copy a styleObj, using msCopyColor() * **********************************************************************/ int msCopyStyle(styleObj *dst, const styleObj *src) { int i; for (i = 0; i < MS_STYLE_BINDING_LENGTH; i++) { MS_COPYSTRING(dst->bindings[i].item, src->bindings[i].item); dst->bindings[i].index = src->bindings[i].index; /* no way to use the macros */ MS_COPYSTRING(dst->exprBindings[i].string, src->exprBindings[i].string); dst->exprBindings[i].type = src->exprBindings[i].type; } MS_COPYSTELEM(numbindings); MS_COPYSTELEM(nexprbindings); MS_COPYCOLOR(&(dst->color), &(src->color)); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYCOLOR(&(dst->mincolor), &(src->mincolor)); MS_COPYCOLOR(&(dst->maxcolor), &(src->maxcolor)); MS_COPYSTRING(dst->symbolname, src->symbolname); MS_COPYSTELEM(patternlength); for (i = 0; i < src->patternlength; i++) dst->pattern[i] = src->pattern[i]; MS_COPYSTELEM(initialgap); MS_COPYSTELEM(gap); MS_COPYSTELEM(linejoin); MS_COPYSTELEM(linejoinmaxsize); MS_COPYSTELEM(antialiased); MS_COPYSTELEM(linecap); MS_COPYSTELEM(symbol); MS_COPYSTELEM(size); MS_COPYSTELEM(minsize); MS_COPYSTELEM(maxsize); MS_COPYSTELEM(width); MS_COPYSTELEM(minwidth); MS_COPYSTELEM(maxwidth); MS_COPYSTELEM(offsetx); MS_COPYSTELEM(offsety); MS_COPYSTELEM(angle); MS_COPYSTELEM(autoangle); MS_COPYSTELEM(minvalue); MS_COPYSTELEM(maxvalue); MS_COPYSTELEM(opacity); MS_COPYSTRING(dst->_geomtransform.string, src->_geomtransform.string); MS_COPYSTELEM(_geomtransform.type); MS_COPYSTRING(dst->rangeitem, src->rangeitem); MS_COPYSTELEM(rangeitemindex); MS_COPYSTELEM(outlinewidth); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); /* TODO: add copy for bindings */ MS_COPYSTELEM(sizeunits); MS_COPYSTELEM(scalefactor); return MS_SUCCESS; } /*********************************************************************** * msCopyClass() * * * * Copy a classObj, using msCopyExpression(), msCopyStyle(), * * msCopyLabel(), msCreateHashTable(), msCopyHashTable() * **********************************************************************/ int msCopyClass(classObj *dst, const classObj *src, layerObj *layer_unused) { int i, return_value; (void)layer_unused; return_value = msCopyExpression(&(dst->expression), &(src->expression)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy expression.", "msCopyClass()"); return MS_FAILURE; } MS_COPYSTELEM(status); MS_COPYSTELEM(isfallback); /* free any previous styles on the dst layer */ for (i = 0; i < dst->numstyles; i++) { /* each style */ if (dst->styles[i] != NULL) { if (freeStyle(dst->styles[i]) == MS_SUCCESS) { msFree(dst->styles[i]); } } } dst->numstyles = 0; for (i = 0; i < src->numstyles; i++) { if (msGrowClassStyles(dst) == NULL) return MS_FAILURE; if (initStyle(dst->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to init style.", "msCopyClass()"); return MS_FAILURE; } if (msCopyStyle(dst->styles[i], src->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy style.", "msCopyClass()"); return MS_FAILURE; } dst->numstyles++; } for (i = 0; i < src->numlabels; i++) { if (msGrowClassLabels(dst) == NULL) return MS_FAILURE; initLabel(dst->labels[i]); if (msCopyLabel(dst->labels[i], src->labels[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy label.", "msCopyClass()"); return MS_FAILURE; } dst->numlabels++; } MS_COPYSTELEM(numlabels); if (src->leader) { if (dst->leader) { freeLabelLeader(dst->leader); } if (!dst->leader) { dst->leader = msSmallMalloc(sizeof(labelLeaderObj)); initLeader(dst->leader); } msCopyLabelLeader(dst->leader, src->leader); } MS_COPYSTRING(dst->keyimage, src->keyimage); MS_COPYSTRING(dst->name, src->name); MS_COPYSTRING(dst->title, src->title); MS_COPYSTRING(dst->group, src->group); if (msCopyExpression(&(dst->text), &(src->text)) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy text.", "msCopyClass()"); return MS_FAILURE; } #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif msCopyHashTable(&(dst->metadata), &(src->metadata)); msCopyHashTable(&dst->validation, &src->validation); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); MS_COPYSTELEM(layer); MS_COPYSTELEM(debug); MS_COPYSTELEM(sizeunits); MS_COPYSTELEM(scalefactor); return MS_SUCCESS; } int msCopyCluster(clusterObj *dst, const clusterObj *src) { int return_value; MS_COPYSTELEM(maxdistance); MS_COPYSTELEM(buffer); MS_COPYSTRING(dst->region, src->region); return_value = msCopyExpression(&(dst->group), &(src->group)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy cluster group.", "msCopyCluster()"); return MS_FAILURE; } return_value = msCopyExpression(&(dst->filter), &(src->filter)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy cluster filter.", "msCopyCluster()"); return MS_FAILURE; } return MS_SUCCESS; } /*********************************************************************** * msCopyGrid() * **********************************************************************/ int msCopyGrid(graticuleObj *dst, const graticuleObj *src) { MS_COPYSTELEM(dwhichlatitude); MS_COPYSTELEM(dwhichlongitude); MS_COPYSTELEM(dstartlatitude); MS_COPYSTELEM(dstartlongitude); MS_COPYSTELEM(dendlatitude); MS_COPYSTELEM(dendlongitude); MS_COPYSTELEM(dincrementlatitude); MS_COPYSTELEM(dincrementlongitude); MS_COPYSTELEM(minarcs); MS_COPYSTELEM(maxarcs); MS_COPYSTELEM(minincrement); MS_COPYSTELEM(maxincrement); MS_COPYSTELEM(minsubdivides); MS_COPYSTELEM(maxsubdivides); MS_COPYSTELEM(bvertical); MS_COPYSTELEM(blabelaxes); MS_COPYSTELEM(ilabelstate); MS_COPYSTELEM(ilabeltype); MS_COPYRECT(&(dst->extent), &(src->extent)); MS_COPYSTRING(dst->labelformat, src->labelformat); return MS_SUCCESS; } #ifdef why_on_earth_would_you_copy_a_labelcache /*********************************************************************** * msCopyLabelCacheMember() * * * * Copy a labelCacheMemberObj using msCopyStyle(), msCopyPoint() * * * * Note: since it seems most users will want to clone maps rather than * * make exact copies, this method might not get much use. * **********************************************************************/ int msCopyLabelCacheMember(labelCacheMemberObj *dst, const labelCacheMemberObj *src) { int i; MS_COPYSTELEM(featuresize); MS_COPYSTELEM(numstyles); for (i = 0; i < dst->numstyles; i++) { msCopyStyle(&(dst->styles[i]), &(src->styles[i])); } MS_COPYSTELEM(numlabels); dst->labels = (labelObj *)msSmallMalloc(sizeof(labelObj) * dst->numlabels); for (i = 0; i < dst->numlabels; i++) { msCopyLabel(&(dst->labels[i]), &(src->labels[i])); } MS_COPYSTELEM(layerindex); MS_COPYSTELEM(classindex); MS_COPYSTELEM(tileindex); MS_COPYSTELEM(shapeindex); MS_COPYPOINT(&(dst->point), &(src->point)); /* msCopyShape(&(dst->poly), &(src->poly)); */ MS_COPYSTELEM(status); return MS_SUCCESS; } /*********************************************************************** * msCopyMarkerCacheMember() * * * * Copy a markerCacheMemberObj * **********************************************************************/ int msCopyMarkerCacheMember(markerCacheMemberObj *dst, const markerCacheMemberObj *src) { MS_COPYSTELEM(id); /* msCopyShape(&(dst->poly), &(src->poly)); */ return MS_SUCCESS; } /*********************************************************************** * msCopyLabelCacheSlot() * **********************************************************************/ int msCopyLabelCacheSlot(labelCacheSlotObj *dst, const labelCacheSlotObj *src) { int i; for (i = 0; i < dst->numlabels; i++) { msCopyLabelCacheMember(&(dst->labels[i]), &(src->labels[i])); } MS_COPYSTELEM(cachesize); MS_COPYSTELEM(nummarkers); for (i = 0; i < dst->nummarkers; i++) { msCopyMarkerCacheMember(&(dst->markers[i]), &(src->markers[i])); } MS_COPYSTELEM(markercachesize); return MS_SUCCESS; } /*********************************************************************** * msCopyLabelCache() * **********************************************************************/ int msCopyLabelCache(labelCacheObj *dst, const labelCacheObj *src) { int p; MS_COPYSTELEM(numlabels); for (p = 0; p < MS_MAX_LABEL_PRIORITY; p++) { msCopyLabelCacheSlot(&(dst->slots[p]), &(src->slots[p])); } return MS_SUCCESS; } #endif /*********************************************************************** * msCopyResult() * **********************************************************************/ int msCopyResult(resultObj *dst, const resultObj *src) { MS_COPYSTELEM(shapeindex); MS_COPYSTELEM(tileindex); MS_COPYSTELEM(classindex); MS_COPYSTELEM(resultindex); return MS_SUCCESS; } /*********************************************************************** * msCopyResultCache() * **********************************************************************/ int msCopyResultCache(resultCacheObj *dst, const resultCacheObj *src) { int i; MS_COPYSTELEM(cachesize); MS_COPYSTELEM(numresults); for (i = 0; i < dst->numresults; i++) { msCopyResult(&(dst->results[i]), &(src->results[i])); } MS_COPYRECT(&(dst->bounds), &(src->bounds)); return MS_SUCCESS; } /*********************************************************************** * msCopyReferenceMap() * * * * Copy a referenceMapObj using mapfile.c:initReferenceMap(), * * msCopyRect(), msCopyColor() * **********************************************************************/ int msCopyReferenceMap(referenceMapObj *dst, const referenceMapObj *src, mapObj *map) { initReferenceMap(dst); MS_COPYRECT(&(dst->extent), &(src->extent)); MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYCOLOR(&(dst->color), &(src->color)); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYSTRING(dst->image, src->image); MS_COPYSTELEM(status); MS_COPYSTELEM(marker); MS_COPYSTRING(dst->markername, src->markername); MS_COPYSTELEM(markersize); MS_COPYSTELEM(minboxsize); MS_COPYSTELEM(maxboxsize); dst->map = map; return MS_SUCCESS; } /*********************************************************************** * msCopyScalebar() * * * * Copy a scalebarObj, using initScalebar(), msCopyColor(), * * and msCopyLabel() * **********************************************************************/ int msCopyScalebar(scalebarObj *dst, const scalebarObj *src) { initScalebar(dst); MS_COPYCOLOR(&(dst->imagecolor), &(src->imagecolor)); MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYSTELEM(style); MS_COPYSTELEM(intervals); if (msCopyLabel(&(dst->label), &(src->label)) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy label.", "msCopyScalebar()"); return MS_FAILURE; } MS_COPYCOLOR(&(dst->color), &(src->color)); MS_COPYCOLOR(&(dst->backgroundcolor), &(src->backgroundcolor)); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYSTELEM(units); MS_COPYSTELEM(status); MS_COPYSTELEM(position); MS_COPYSTELEM(transparent); MS_COPYSTELEM(postlabelcache); MS_COPYSTELEM(align); return MS_SUCCESS; } /*********************************************************************** * msCopyLegend() * * * * Copy a legendObj, using msCopyColor() * **********************************************************************/ int msCopyLegend(legendObj *dst, const legendObj *src, mapObj *map) { int return_value; MS_COPYCOLOR(&(dst->imagecolor), &(src->imagecolor)); return_value = msCopyLabel(&(dst->label), &(src->label)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy label.", "msCopyLegend()"); return MS_FAILURE; } MS_COPYSTELEM(keysizex); MS_COPYSTELEM(keysizey); MS_COPYSTELEM(keyspacingx); MS_COPYSTELEM(keyspacingy); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYSTELEM(status); MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYSTELEM(position); MS_COPYSTELEM(transparent); MS_COPYSTELEM(postlabelcache); #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif dst->map = map; return MS_SUCCESS; } int msCopyScaleTokenEntry(const scaleTokenEntryObj *src, scaleTokenEntryObj *dst) { MS_COPYSTRING(dst->value, src->value); MS_COPYSTELEM(minscale); MS_COPYSTELEM(maxscale); return MS_SUCCESS; } int msCopyScaleToken(const scaleTokenObj *src, scaleTokenObj *dst) { int i; MS_COPYSTRING(dst->name, src->name); MS_COPYSTELEM(n_entries); dst->tokens = (scaleTokenEntryObj *)msSmallCalloc(src->n_entries, sizeof(scaleTokenEntryObj)); for (i = 0; i < src->n_entries; i++) { msCopyScaleTokenEntry(&src->tokens[i], &dst->tokens[i]); } return MS_SUCCESS; } int msCopyCompositingFilter(CompositingFilter **pdst, const CompositingFilter *src) { CompositingFilter *dst = NULL; if (!src) { *pdst = NULL; return MS_SUCCESS; } while (src) { if (!dst) { dst = *pdst = msSmallMalloc(sizeof(CompositingFilter)); } else { dst->next = msSmallMalloc(sizeof(CompositingFilter)); dst = dst->next; } dst->filter = msStrdup(src->filter); dst->next = NULL; src = src->next; } return MS_SUCCESS; } int msCopyCompositer(LayerCompositer **ldst, const LayerCompositer *src) { LayerCompositer *dst = NULL; if (!src) { *ldst = NULL; return MS_SUCCESS; } while (src) { if (!dst) { dst = *ldst = msSmallMalloc(sizeof(LayerCompositer)); } else { dst->next = msSmallMalloc(sizeof(LayerCompositer)); dst = dst->next; } dst->comp_op = src->comp_op; dst->opacity = src->opacity; dst->next = NULL; msCopyCompositingFilter(&dst->filter, src->filter); src = src->next; } return MS_SUCCESS; } /*********************************************************************** * msCopyLayer() * * * * Copy a layerObj, using mapfile.c:initClass(), msCopyClass(), * * msCopyColor(), msCopyProjection(), msShapefileOpen(), * * msCreateHashTable(), msCopyHashTable(), msCopyExpression() * * * * As it stands, we are not copying a layer's resultcache * **********************************************************************/ int msCopyLayer(layerObj *dst, const layerObj *src) { int i, return_value; featureListNodeObjPtr current; MS_COPYSTELEM(index); MS_COPYSTRING(dst->classitem, src->classitem); MS_COPYSTELEM(classitemindex); for (i = 0; i < src->numscaletokens; i++) { if (msGrowLayerScaletokens(dst) == NULL) return MS_FAILURE; initScaleToken(&dst->scaletokens[i]); msCopyScaleToken(&src->scaletokens[i], &dst->scaletokens[i]); dst->numscaletokens++; } for (i = 0; i < src->numclasses; i++) { if (msGrowLayerClasses(dst) == NULL) return MS_FAILURE; #ifndef __cplusplus initClass(dst->class[i]); return_value = msCopyClass(dst->class[i], src -> class[i], dst); #else initClass(dst->_class[i]); return_value = msCopyClass(dst->_class[i], src->_class[i], dst); #endif if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy class.", "msCopyLayer()"); return MS_FAILURE; } dst->numclasses++; } MS_COPYSTRING(dst->header, src->header); MS_COPYSTRING(dst->footer, src->footer); #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif MS_COPYSTRING(dst->name, src->name); MS_COPYSTRING(dst->group, src->group); MS_COPYSTRING(dst->data, src->data); MS_COPYSTRING(dst->encoding, src->encoding); MS_COPYSTELEM(rendermode); MS_COPYSTELEM(status); MS_COPYSTELEM(type); MS_COPYSTELEM(tolerance); MS_COPYSTELEM(toleranceunits); MS_COPYSTELEM(symbolscaledenom); MS_COPYSTELEM(scalefactor); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); MS_COPYSTELEM(labelminscaledenom); MS_COPYSTELEM(labelmaxscaledenom); MS_COPYSTELEM(mingeowidth); MS_COPYSTELEM(maxgeowidth); MS_COPYSTELEM(sizeunits); MS_COPYSTELEM(maxfeatures); MS_COPYCOLOR(&(dst->offsite), &(src->offsite)); MS_COPYSTELEM(transform); MS_COPYSTELEM(labelcache); MS_COPYSTELEM(postlabelcache); MS_COPYSTRING(dst->labelitem, src->labelitem); MS_COPYSTELEM(labelitemindex); MS_COPYSTRING(dst->tileitem, src->tileitem); MS_COPYSTELEM(tileitemindex); MS_COPYSTRING(dst->tilesrs, src->tilesrs); MS_COPYSTRING(dst->tileindex, src->tileindex); return_value = msCopyProjection(&(dst->projection), &(src->projection)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy projection.", "msCopyLayer()"); return MS_FAILURE; } return_value = msCopyCluster(&(dst->cluster), &(src->cluster)); if (return_value != MS_SUCCESS) { return MS_FAILURE; } MS_COPYSTELEM(project); MS_COPYSTELEM(units); current = src->features; while (current != NULL) { insertFeatureList(&(dst->features), &(current->shape)); current = current->next; } MS_COPYSTRING(dst->connection, src->connection); MS_COPYSTELEM(connectiontype); MS_COPYSTRING(dst->plugin_library, src->plugin_library); MS_COPYSTRING(dst->plugin_library_original, src->plugin_library_original); /* Do not copy *layerinfo, items, or iteminfo. these are all initialized when the copied layer is opened */ return_value = msCopyExpression(&(dst->filter), &(src->filter)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy filter.", "msCopyLayer()"); return MS_FAILURE; } MS_COPYSTRING(dst->filteritem, src->filteritem); MS_COPYSTELEM(filteritemindex); MS_COPYSTRING(dst->styleitem, src->styleitem); MS_COPYSTELEM(styleitemindex); MS_COPYSTRING(dst->requires, src->requires); MS_COPYSTRING(dst->labelrequires, src->labelrequires); msCopyHashTable(&(dst->metadata), &(src->metadata)); msCopyHashTable(&dst->validation, &src->validation); msCopyHashTable(&dst->connectionoptions, &src->connectionoptions); MS_COPYSTELEM(debug); dst->processing = CSLDuplicate(src->processing); MS_COPYSTELEM(numjoins); for (i = 0; i < dst->numjoins; i++) { initJoin(&(dst->joins[i])); return_value = msCopyJoin(&(dst->joins[i]), &(src->joins[i])); if (return_value != MS_SUCCESS) return MS_FAILURE; } MS_COPYRECT(&(dst->extent), &(src->extent)); MS_COPYSTRING(dst->classgroup, src->classgroup); MS_COPYSTRING(dst->mask, src->mask); if (src->grid) { if (dst->grid) { freeGrid(dst->grid); msFree(dst->grid); } dst->grid = (void *)malloc(sizeof(graticuleObj)); MS_CHECK_ALLOC(dst->grid, sizeof(graticuleObj), -1); initGrid(dst->grid); msCopyGrid(dst->grid, src->grid); } if (src->compositer) { msCopyCompositer(&dst->compositer, src->compositer); } return MS_SUCCESS; } /*********************************************************************** * msCopyMap() * * * * Copy a mapObj, using mapfile.c:initLayer(), msCopyLayer(), * * msCopyLegend(), msCopyScalebar(), msCopyProjection() * * msCopyOutputFormat(), msCopyWeb(), msCopyReferenceMap() * **********************************************************************/ int msCopyMap(mapObj *dst, const mapObj *src) { int i, return_value; outputFormatObj *format; MS_COPYSTRING(dst->name, src->name); MS_COPYSTELEM(status); MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYSTELEM(maxsize); for (i = 0; i < src->numlayers; i++) { if (msGrowMapLayers(dst) == NULL) return MS_FAILURE; initLayer((GET_LAYER(dst, i)), dst); return_value = msCopyLayer((GET_LAYER(dst, i)), (GET_LAYER(src, i))); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy layer.", "msCopyMap()"); return MS_FAILURE; } dst->numlayers++; } return_value = msCopyFontSet(&(dst->fontset), &(src->fontset), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy fontset.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopySymbolSet(&(dst->symbolset), &(src->symbolset), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy symbolset.", "msCopyMap()"); return MS_FAILURE; } /* msCopyLabelCache(&(dst->labelcache), &(src->labelcache)); */ MS_COPYRECT(&(dst->extent), &(src->extent)); MS_COPYSTELEM(cellsize); MS_COPYSTELEM(units); MS_COPYSTELEM(scaledenom); MS_COPYSTELEM(defresolution); MS_COPYSTELEM(resolution); MS_COPYSTRING(dst->shapepath, src->shapepath); MS_COPYSTRING(dst->mappath, src->mappath); MS_COPYSTELEM(sldurl); MS_COPYCOLOR(&(dst->imagecolor), &(src->imagecolor)); /* clear existing destination format list */ if (dst->outputformat && --dst->outputformat->refcount < 1) { msFreeOutputFormat(dst->outputformat); dst->outputformat = NULL; } for (i = 0; i < dst->numoutputformats; i++) { if (--dst->outputformatlist[i]->refcount < 1) msFreeOutputFormat(dst->outputformatlist[i]); } if (dst->outputformatlist != NULL) msFree(dst->outputformatlist); dst->outputformatlist = NULL; dst->outputformat = NULL; dst->numoutputformats = 0; for (i = 0; i < src->numoutputformats; i++) msAppendOutputFormat(dst, msCloneOutputFormat(src->outputformatlist[i])); /* set the active output format */ MS_COPYSTRING(dst->imagetype, src->imagetype); format = msSelectOutputFormat(dst, dst->imagetype); msApplyOutputFormat(&(dst->outputformat), format, MS_NOOVERRIDE); return_value = msCopyProjection(&(dst->projection), &(src->projection)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy projection.", "msCopyMap()"); return MS_FAILURE; } /* No need to copy latlon projection */ return_value = msCopyReferenceMap(&(dst->reference), &(src->reference), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy reference.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopyScalebar(&(dst->scalebar), &(src->scalebar)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy scalebar.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopyLegend(&(dst->legend), &(src->legend), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy legend.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopyQueryMap(&(dst->querymap), &(src->querymap)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy querymap.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopyWeb(&(dst->web), &(src->web), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy web.", "msCopyMap()"); return MS_FAILURE; } if (src->layerorder) { for (i = 0; i < dst->numlayers; i++) { MS_COPYSTELEM(layerorder[i]); } } MS_COPYSTELEM(debug); MS_COPYSTRING(dst->datapattern, src->datapattern); MS_COPYSTRING(dst->templatepattern, src->templatepattern); if (msCopyHashTable(&(dst->configoptions), &(src->configoptions)) != MS_SUCCESS) return MS_FAILURE; return MS_SUCCESS; } int msCopyRasterBuffer(rasterBufferObj *dst, const rasterBufferObj *src) { *dst = *src; if (src->type == MS_BUFFER_BYTE_RGBA) { dst->data.rgba = src->data.rgba; dst->data.rgba.pixels = msSmallMalloc(((size_t)src->height) * src->data.rgba.row_step); memcpy(dst->data.rgba.pixels, src->data.rgba.pixels, ((size_t)src->data.rgba.row_step) * src->height); dst->data.rgba.r = dst->data.rgba.pixels + (src->data.rgba.r - src->data.rgba.pixels); dst->data.rgba.g = dst->data.rgba.pixels + (src->data.rgba.g - src->data.rgba.pixels); dst->data.rgba.b = dst->data.rgba.pixels + (src->data.rgba.b - src->data.rgba.pixels); if (src->data.rgba.a) { dst->data.rgba.a = dst->data.rgba.pixels + (src->data.rgba.a - src->data.rgba.pixels); } else { dst->data.rgba.a = NULL; } } return MS_SUCCESS; } �������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.4.0/src/mapcopy.h�����������������������������������������������������������������������0000664�0000000�0000000�00000007451�14741744413�0016157�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations related to copyng mapObjs. Provided by Mladen Turk * for resolution of bug 701 * http://mapserver.gis.umn.edu/bugs/show_bug.cgi?id=701. * Author: Mladen Turk (and Sean Gilles?) * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* Following works for GCC and MSVC. That's ~98% of our users, if Tyler * Mitchell's survey is correct */ #define MS_COPYSTELEM(_name) (dst)->/**/ _name = (src)->/**/ _name #define MS_MACROBEGIN do { #define MS_MACROEND \ } \ while (0) #define MS_COPYRECT(_dst, _src) \ MS_MACROBEGIN(_dst)->minx = (_src)->minx; \ (_dst)->miny = (_src)->miny; \ (_dst)->maxx = (_src)->maxx; \ (_dst)->maxy = (_src)->maxy; \ MS_MACROEND #define MS_COPYPOINT(_dst, _src) \ MS_MACROBEGIN(_dst)->x = (_src)->x; \ (_dst)->y = (_src)->y; \ (_dst)->m = (_src)->m; \ MS_MACROEND #define MS_COPYCOLOR(_dst, _src) \ MS_MACROBEGIN(_dst)->red = (_src)->red; \ (_dst)->green = (_src)->green; \ (_dst)->blue = (_src)->blue; \ (_dst)->alpha = (_src)->alpha; \ MS_MACROEND #define MS_COPYSTRING(_dst, _src) \ MS_MACROBEGIN \ if ((_dst) != NULL) \ msFree((_dst)); \ if ((_src)) \ (_dst) = msStrdup((_src)); \ else \ (_dst) = NULL; \ MS_MACROEND �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.4.0/src/mapcpl.c������������������������������������������������������������������������0000664�0000000�0000000�00000021752�14741744413�0015756�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions copied from GDAL's CPL. This file contain utility * functions that come from the GDAL/OGR cpl library. The idea * behind it is to have access in mapserver to all these * utilities, without being constrained to link with GDAL/OGR. * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * * * Note: * Names of functions used here are the same as those in the cpl * library with the exception the the CPL prefix is changed to ms * (eg : CPLGetBasename() would become msGetBasename()) * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* $Id$ */ #include #include "mapserver.h" /* should be size of largest possible filename */ #define MS_PATH_BUF_SIZE 2048 static char szStaticResult[MS_PATH_BUF_SIZE]; /************************************************************************/ /* msFindFilenameStart() */ /************************************************************************/ static int msFindFilenameStart(const char *pszFilename) { int iFileStart; for (iFileStart = strlen(pszFilename); iFileStart > 0 && pszFilename[iFileStart - 1] != '/' && pszFilename[iFileStart - 1] != '\\'; iFileStart--) { } return iFileStart; } /************************************************************************/ /* msGetBasename() */ /************************************************************************/ /** * Extract basename (non-directory, non-extension) portion of filename. * * Returns a string containing the file basename portion of the passed * name. If there is no basename (passed value ends in trailing directory * separator, or filename starts with a dot) an empty string is returned. * *
 * msGetBasename( "abc/def.xyz" ) == "def"
 * msGetBasename( "abc/def" ) == "def"
 * msGetBasename( "abc/def/" ) == ""
 * 
* * @param pszFullFilename the full filename potentially including a path. * * @return just the non-directory, non-extension portion of the path in * an internal string which must not be freed. The string * may be destroyed by the next ms filename handling call. */ const char *msGetBasename(const char *pszFullFilename) { int iFileStart = msFindFilenameStart(pszFullFilename); int iExtStart, nLength; for (iExtStart = strlen(pszFullFilename); iExtStart > iFileStart && pszFullFilename[iExtStart] != '.'; iExtStart--) { } if (iExtStart == iFileStart) iExtStart = strlen(pszFullFilename); nLength = iExtStart - iFileStart; assert(nLength < MS_PATH_BUF_SIZE); strlcpy(szStaticResult, pszFullFilename + iFileStart, nLength + 1); return szStaticResult; } /* Id: GDAL/port/cplgetsymbol.cpp,v 1.14 2004/11/11 20:40:38 fwarmerdam Exp */ /* ==================================================================== */ /* Unix Implementation */ /* ==================================================================== */ #if defined(HAVE_DLFCN_H) #define GOT_GETSYMBOL #include /************************************************************************/ /* msGetSymbol() */ /************************************************************************/ /** * Fetch a function pointer from a shared library / DLL. * * This function is meant to abstract access to shared libraries and * DLLs and performs functions similar to dlopen()/dlsym() on Unix and * LoadLibrary() / GetProcAddress() on Windows. * * If no support for loading entry points from a shared library is available * this function will always return NULL. Rules on when this function * issues a msError() or not are not currently well defined, and will have * to be resolved in the future. * * Currently msGetSymbol() doesn't try to: *
    *
  • prevent the reference count on the library from going up * for every request, or given any opportunity to unload * the library. *
  • Attempt to look for the library in non-standard * locations. *
  • Attempt to try variations on the symbol name, like * pre-prending or post-pending an underscore. *
* * Some of these issues may be worked on in the future. * * @param pszLibrary the name of the shared library or DLL containing * the function. May contain path to file. If not system supplies search * paths will be used. * @param pszSymbolName the name of the function to fetch a pointer to. * @return A pointer to the function if found, or NULL if the function isn't * found, or the shared library can't be loaded. */ void *msGetSymbol(const char *pszLibrary, const char *pszSymbolName) { void *pLibrary; void *pSymbol; pLibrary = dlopen(pszLibrary, RTLD_LAZY); if (pLibrary == NULL) { msSetError(MS_MISCERR, "Dynamic loading failed: %s", "msGetSymbol()", dlerror()); return NULL; } pSymbol = dlsym(pLibrary, pszSymbolName); #if (defined(__APPLE__) && defined(__MACH__)) /* On mach-o systems, C symbols have a leading underscore and depending * on how dlcompat is configured it may or may not add the leading * underscore. So if dlsym() fails add an underscore and try again. */ if (pSymbol == NULL) { char withUnder[strlen(pszSymbolName) + 2]; withUnder[0] = '_'; withUnder[1] = 0; strcat(withUnder, pszSymbolName); pSymbol = dlsym(pLibrary, withUnder); } #endif if (pSymbol == NULL) { msSetError(MS_MISCERR, "Dynamic loading failed: %s", "msGetSymbol()", dlerror()); return NULL; } /* We accept leakage of pLibrary */ /* coverity[leaked_storage] */ return (pSymbol); } #endif /* def __unix__ && defined(HAVE_DLFCN_H) */ /* ==================================================================== */ /* Windows Implementation */ /* ==================================================================== */ #ifdef WIN32 #define GOT_GETSYMBOL #include /************************************************************************/ /* msGetSymbol() */ /************************************************************************/ void *msGetSymbol(const char *pszLibrary, const char *pszSymbolName) { void *pLibrary; void *pSymbol; pLibrary = LoadLibrary(pszLibrary); if (pLibrary == NULL) { msSetError(MS_MISCERR, "Can't load requested dynamic library: %s", "msGetSymbol()", pszLibrary); return NULL; } pSymbol = (void *)GetProcAddress((HINSTANCE)pLibrary, pszSymbolName); if (pSymbol == NULL) { msSetError(MS_MISCERR, "Can't find requested entry point: %s in lib %s", "msGetSymbol()", pszSymbolName, pLibrary); return NULL; } return (pSymbol); } #endif /* def _WIN32 */ /* ==================================================================== */ /* Dummy implementation. */ /* ==================================================================== */ #ifndef GOT_GETSYMBOL /************************************************************************/ /* msGetSymbol() */ /* */ /* Dummy implementation. */ /************************************************************************/ void *msGetSymbol(const char *pszLibrary, const char *pszEntryPoint) { msSetError( MS_MISCERR, "msGetSymbol(%s,%s) called. Failed as this is stub implementation.", "msGetSymbol()", pszLibrary, pszEntryPoint); return NULL; } #endif mapserver-8.4.0/src/mapcrypto.c000066400000000000000000000462231474174441300165200ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Encryption functions (see MS-RFC-18) * Author: Daniel Morissette * ****************************************************************************** * Copyright (c) 1996-2006 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include /* isxdigit() */ #include /* rand() */ #include /* time() */ #include "mapserver.h" #include "cpl_conv.h" /********************************************************************** * encipher() and decipher() from the Tiny Encryption Algorithm (TEA) * website at: * http://www.simonshepherd.supanet.com/tea.htm * * TEA was developed and placed in the public domain by David Wheeler * and Roger Needham at the Computer Laboratory of Cambridge University. * * The source below came with the following public domain notice: * * "Please feel free to use any of this code in your applications. * The TEA algorithm (including new-variant TEA) has been placed * in the public domain, as have my assembly language implementations." * * ... and the following usage notes: * * All the routines have the general form * * void encipher(const unsigned long *const v,unsigned long *const w, * const unsigned long * const k); * * void decipher(const unsigned long *const v,unsigned long *const w, * const unsigned long * const k); * * TEA takes 64 bits of data in v[0] and v[1], and 128 bits of key in * k[0] - k[3]. The result is returned in w[0] and w[1]. Returning the * result separately makes implementation of cipher modes other than * Electronic Code Book a little bit easier. * * TEA can be operated in any of the modes of DES. * * n is the number of iterations. 32 is ample, 16 is sufficient, as few * as eight should be OK for most applications, especially ones where * the data age quickly (real-time video, for example). The algorithm * achieves good dispersion after six iterations. The iteration count * can be made variable if required. * * Note this algorithm is optimised for 32-bit CPUs with fast shift * capabilities. It can very easily be ported to assembly language * on most CPUs. * * delta is chosen to be the Golden ratio ((5/4)1/2 - 1/2 ~ 0.618034) * multiplied by 232. On entry to decipher(), sum is set to be delta * n. * Which way round you call the functions is arbitrary: DK(EK(P)) = EK(DK(P)) * where EK and DK are encryption and decryption under key K respectively. * **********************************************************************/ static void encipher(const ms_uint32 *const v, ms_uint32 *const w, const ms_uint32 *const k) { register ms_uint32 y = v[0], z = v[1], sum = 0, delta = 0x9E3779B9, n = 32; while (n-- > 0) { y += ((z << 4 ^ z >> 5) + z) ^ (sum + k[sum & 3]); sum += delta; z += ((y << 4 ^ y >> 5) + y) ^ (sum + k[sum >> 11 & 3]); } w[0] = y; w[1] = z; } static void decipher(const ms_uint32 *const v, ms_uint32 *const w, const ms_uint32 *const k) { register ms_uint32 y = v[0], z = v[1], sum = 0xC6EF3720, delta = 0x9E3779B9, n = 32; /* sum = delta<<5, in general sum = delta * n */ while (n-- > 0) { z -= ((y << 4 ^ y >> 5) + y) ^ (sum + k[sum >> 11 & 3]); sum -= delta; y -= ((z << 4 ^ z >> 5) + z) ^ (sum + k[sum & 3]); } w[0] = y; w[1] = z; } /********************************************************************** * msHexEncode() * * Hex-encode numbytes from in[] and return the result in out[]. * * out[] should be preallocated by the caller to be at least 2*numbytes+1 * (+1 for the terminating '\0') **********************************************************************/ void msHexEncode(const unsigned char *in, char *out, int numbytes) { char *hex = "0123456789ABCDEF"; while (numbytes-- > 0) { *out++ = hex[*in / 16]; *out++ = hex[*in % 16]; in++; } *out = '\0'; } /********************************************************************** * msHexDecode() * * Hex-decode numchars from in[] and return the result in out[]. * * If numchars > 0 then only up to this number of chars from in[] are * processed, otherwise the full in[] string up to the '\0' is processed. * * out[] should be preallocated by the caller to be large enough to hold * the resulting bytes. * * Returns the number of bytes written to out[] which may be different from * numchars/2 if an error or a '\0' is encountered. **********************************************************************/ int msHexDecode(const char *in, unsigned char *out, int numchars) { int numbytes_out = 0; /* Make sure numchars is even */ numchars = (numchars / 2) * 2; if (numchars < 2) numchars = -1; /* Will result in this value being ignored in the loop*/ while (*in != '\0' && *(in + 1) != '\0' && numchars != 0) { *out = 0x10 * (*in >= 'A' ? ((*in & 0xdf) - 'A') + 10 : (*in - '0')); in++; *out += (*in >= 'A' ? ((*in & 0xdf) - 'A') + 10 : (*in - '0')); in++; out++; numbytes_out++; numchars -= 2; } return numbytes_out; } /********************************************************************** * msGenerateEncryptionKey() * * Create a new encryption key. * * The output buffer should be at least MS_ENCRYPTION_KEY_SIZE bytes. **********************************************************************/ int msGenerateEncryptionKey(unsigned char *k) { int i; /* Use current time as seed for rand() */ srand((unsigned int)time(NULL)); for (i = 0; i < MS_ENCRYPTION_KEY_SIZE; i++) { /* coverity[dont_call] */ k[i] = (unsigned char)rand(); } return MS_SUCCESS; } /********************************************************************** * msReadEncryptionKeyFromFile() * * Read and decode hex-encoded encryption key from file and returns the * key in the 'unsigned char k[MS_ENCRYPTION_KEY_SIZE]' buffer that is * provided by the caller. * * Returns MS_SUCCESS/MS_FAILURE. **********************************************************************/ int msReadEncryptionKeyFromFile(const char *keyfile, unsigned char *k, const char *pszRelToPath) { FILE *fp; char extended_path[MS_MAXPATHLEN]; char szBuf[100]; int numchars; /* Try to make the path relative */ if (msBuildPath(extended_path, pszRelToPath, keyfile) == NULL) return MS_FAILURE; keyfile = extended_path; if ((fp = fopen(keyfile, "rt")) == NULL) { msSetError(MS_MISCERR, "Cannot open key file.", "msReadEncryptionKeyFromFile()"); return MS_FAILURE; } numchars = fread(szBuf, sizeof(unsigned char), MS_ENCRYPTION_KEY_SIZE * 2, fp); fclose(fp); szBuf[MS_ENCRYPTION_KEY_SIZE * 2] = '\0'; if (numchars != MS_ENCRYPTION_KEY_SIZE * 2) { msSetError(MS_MISCERR, "Invalid key file, got %d chars, expected %d.", "msReadEncryptionKeyFromFile()", numchars, MS_ENCRYPTION_KEY_SIZE * 2); return MS_FAILURE; } msHexDecode(szBuf, k, MS_ENCRYPTION_KEY_SIZE * 2); return MS_SUCCESS; } /********************************************************************** * msLoadEncryptionKey() * * Load and decode hex-encoded encryption key from file and returns the * key in the 'unsigned char k[MS_ENCRYPTION_KEY_SIZE]' buffer that is * provided by the caller. * * The first time that msLoadEncryptionKey() is called for a given mapObj * it will load the encryption key and cache it in mapObj->encryption_key. * If the key is already set in the mapObj then it does nothing and returns. * * The location of the encryption key can be specified in two ways, * either by setting the environment variable MS_ENCRYPTION_KEY or using * a CONFIG directive: * CONFIG MS_ENCRYPTION_KEY "/path/to/mykey.txt" * Returns MS_SUCCESS/MS_FAILURE. **********************************************************************/ static int msLoadEncryptionKey(mapObj *map) { const char *keyfile; if (map == NULL) { msSetError(MS_MISCERR, "NULL MapObj.", "msLoadEncryptionKey()"); return MS_FAILURE; } if (map->encryption_key_loaded) return MS_SUCCESS; /* Already loaded */ keyfile = msGetConfigOption(map, "MS_ENCRYPTION_KEY"); if (!keyfile) keyfile = CPLGetConfigOption("MS_ENCRYPTION_KEY", NULL); if (keyfile && msReadEncryptionKeyFromFile(keyfile, map->encryption_key, map->mappath) == MS_SUCCESS) { map->encryption_key_loaded = MS_TRUE; } else { msSetError(MS_MISCERR, "Failed reading encryption key. Make sure " "MS_ENCRYPTION_KEY is set and points to a valid key file.", "msLoadEncryptionKey()"); return MS_FAILURE; } return MS_SUCCESS; } /********************************************************************** * msEncryptStringWithKey() * * Encrypts and hex-encodes the contents of string in[] and returns the * result in out[] which should have been pre-allocated by the caller * to be at least twice the size of in[] + 16+1 bytes (for padding + '\0'). * **********************************************************************/ void msEncryptStringWithKey(const unsigned char *key, const char *in, char *out) { ms_uint32 v[4], w[4]; const ms_uint32 *k; int last_block = MS_FALSE; /* Casting the key this way is safe only as long as longs are 4 bytes * on this platform */ assert(sizeof(ms_uint32) == 4); k = (const ms_uint32 *)key; while (!last_block) { int i, j; /* encipher() takes v[2] (64 bits) as input. * Copy bytes from in[] to the v[2] input array (pair of 4 bytes) * v[] is padded with zeros if string doesn't align with 8 bytes */ v[0] = 0; v[1] = 0; for (i = 0; !last_block && i < 2; i++) { for (j = 0; j < 4; j++) { if (*in == '\0') { last_block = MS_TRUE; break; } v[i] |= *in << (j * 8); in++; } } if (*in == '\0') last_block = MS_TRUE; /* Do the actual encryption */ encipher(v, w, k); /* Append hex-encoded bytes to output, 4 bytes at a time */ msHexEncode((unsigned char *)w, out, 4); out += 8; msHexEncode((unsigned char *)(w + 1), out, 4); out += 8; } /* Make sure output is 0-terminated */ *out = '\0'; } /********************************************************************** * msDecryptStringWithKey() * * Hex-decodes and then decrypts the contents of string in[] and returns the * result in out[] which should have been pre-allocated by the caller * to be at least half the size of in[]. * **********************************************************************/ void msDecryptStringWithKey(const unsigned char *key, const char *in, char *out) { ms_uint32 v[4], w[4]; const ms_uint32 *k; int last_block = MS_FALSE; /* Casting the key this way is safe only as long as longs are 4 bytes * on this platform */ assert(sizeof(ms_uint32) == 4); k = (const ms_uint32 *)key; while (!last_block) { int i; /* decipher() takes v[2] (64 bits) as input. * Copy bytes from in[] to the v[2] input array (pair of 4 bytes) * v[] is padded with zeros if string doesn't align with 8 bytes */ v[0] = 0; v[1] = 0; if (msHexDecode(in, (unsigned char *)v, 8) != 4) last_block = MS_TRUE; else { in += 8; if (msHexDecode(in, (unsigned char *)(v + 1), 8) != 4) last_block = MS_TRUE; else in += 8; } /* Do the actual decryption */ decipher(v, w, k); /* Copy the results to out[] */ for (i = 0; i < 2; i++) { *out++ = (w[i] & 0x000000ff); *out++ = (w[i] & 0x0000ff00) >> 8; *out++ = (w[i] & 0x00ff0000) >> 16; *out++ = (w[i] & 0xff000000) >> 24; } if (*in == '\0') last_block = MS_TRUE; } /* Make sure output is 0-terminated */ *out = '\0'; } /********************************************************************** * msDecryptStringTokens() * * Returns a newly allocated string (to be msFree'd by the caller) in * which all occurrences of encrypted strings delimited by {...} have * been decrypted. * **********************************************************************/ char *msDecryptStringTokens(mapObj *map, const char *in) { char *outbuf, *out; if (map == NULL) { msSetError(MS_MISCERR, "NULL MapObj.", "msLoadEncryptionKey()"); return NULL; } /* Start with a copy of the string. Decryption can only result in * a string with the same or shorter length */ if ((outbuf = (char *)malloc((strlen(in) + 1) * sizeof(char))) == NULL) { msSetError(MS_MEMERR, NULL, "msDecryptStringTokens()"); return NULL; } out = outbuf; while (*in != '\0') { if (*in == '{') { /* Possibly beginning of a token, look for closing bracket ** and make sure all chars in between are valid hex encoding chars */ const char *pszStart, *pszEnd; int valid_token = MS_FALSE; pszStart = in + 1; if ((pszEnd = strchr(pszStart, '}')) != NULL && pszEnd - pszStart > 1) { const char *pszTmp; valid_token = MS_TRUE; for (pszTmp = pszStart; pszTmp < pszEnd; pszTmp++) { if (!isxdigit(*pszTmp)) { valid_token = MS_FALSE; break; } } } if (valid_token) { /* Go ahead and decrypt the token */ char *pszTmp; /* Make sure encryption key is loaded. We do this here instead * of at the beginning of the function to avoid loading the * key unless ready necessary. This is a very cheap call if * the key is already loaded */ if (msLoadEncryptionKey(map) != MS_SUCCESS) return NULL; pszTmp = (char *)malloc((pszEnd - pszStart + 1) * sizeof(char)); strlcpy(pszTmp, pszStart, (pszEnd - pszStart) + 1); msDecryptStringWithKey(map->encryption_key, pszTmp, out); out += strlen(out); in = pszEnd + 1; free(pszTmp); } else { /* Not a valid token, just copy the '{' and keep going */ *out++ = *in++; } } else { /* Just copy any other chars */ *out++ = *in++; } } *out = '\0'; return outbuf; } #ifdef TEST_MAPCRYPTO /* Test for mapcrypto.c functions. To run these tests, use the following ** Makefile directive: test_mapcrypto: $(LIBMAP_STATIC) mapcrypto.c $(CC) $(CFLAGS) mapcrypto.c -DTEST_MAPCRYPTO $(EXE_LDFLAGS) -o test_mapcrypto ** */ int main(int argc, char *argv[]) { const unsigned char bytes_in[] = {0x12, 0x34, 0xff, 0x00, 0x44, 0x22}; unsigned char bytes_out[8], encryption_key[MS_ENCRYPTION_KEY_SIZE * 2 + 1]; char string_buf[256], string_buf2[256]; int numbytes = 0; /* ** Test msHexEncode() */ msHexEncode(bytes_in, string_buf, 6); printf("msHexEncode returned '%s'\n", string_buf); /* ** Test msHexDecode() */ memset(bytes_out, 0, 8); numbytes = msHexDecode(string_buf, bytes_out, -1); printf( "msHexDecode(%s, -1) = %d, bytes_out = %x, %x, %x, %x, %x, %x, %x, %x\n", string_buf, numbytes, bytes_out[0], bytes_out[1], bytes_out[2], bytes_out[3], bytes_out[4], bytes_out[5], bytes_out[6], bytes_out[7]); memset(bytes_out, 0, 8); numbytes = msHexDecode(string_buf, bytes_out, 4); printf( "msHexDecode(%s, 4) = %d, bytes_out = %x, %x, %x, %x, %x, %x, %x, %x\n", string_buf, numbytes, bytes_out[0], bytes_out[1], bytes_out[2], bytes_out[3], bytes_out[4], bytes_out[5], bytes_out[6], bytes_out[7]); memset(bytes_out, 0, 8); numbytes = msHexDecode(string_buf, bytes_out, 20); printf( "msHexDecode(%s, 20) = %d, bytes_out = %x, %x, %x, %x, %x, %x, %x, %x\n", string_buf, numbytes, bytes_out[0], bytes_out[1], bytes_out[2], bytes_out[3], bytes_out[4], bytes_out[5], bytes_out[6], bytes_out[7]); /* ** Test loading encryption key */ if (msReadEncryptionKeyFromFile("/tmp/test.key", encryption_key, NULL) != MS_SUCCESS) { printf("msReadEncryptionKeyFromFile() = MS_FAILURE\n"); printf("Aborting tests!\n"); msWriteError(stderr); return -1; } else { msHexEncode(encryption_key, string_buf, MS_ENCRYPTION_KEY_SIZE); printf("msReadEncryptionKeyFromFile() returned '%s'\n", string_buf); } /* ** Test Encryption/Decryption */ /* First with an 8 bytes input string (test boundaries) */ msEncryptStringWithKey(encryption_key, "test1234", string_buf); printf("msEncryptStringWithKey('test1234') returned '%s'\n", string_buf); msDecryptStringWithKey(encryption_key, string_buf, string_buf2); printf("msDecryptStringWithKey('%s') returned '%s'\n", string_buf, string_buf2); /* Next with an 1 byte input string */ msEncryptStringWithKey(encryption_key, "t", string_buf); printf("msEncryptStringWithKey('t') returned '%s'\n", string_buf); msDecryptStringWithKey(encryption_key, string_buf, string_buf2); printf("msDecryptStringWithKey('%s') returned '%s'\n", string_buf, string_buf2); /* Next with an 12 bytes input string */ msEncryptStringWithKey(encryption_key, "test123456", string_buf); printf("msEncryptStringWithKey('test123456') returned '%s'\n", string_buf); msDecryptStringWithKey(encryption_key, string_buf, string_buf2); printf("msDecryptStringWithKey('%s') returned '%s'\n", string_buf, string_buf2); /* ** Test decryption with tokens */ { char *pszBuf; mapObj *map; /* map = msNewMapObj(); */ map = msLoadMap("/tmp/test.map", NULL); sprintf(string_buf2, "string with a {%s} encrypted token", string_buf); pszBuf = msDecryptStringTokens(map, string_buf2); if (pszBuf == NULL) { printf("msDecryptStringTokens() failed.\n"); printf("Aborting tests!\n"); msWriteError(stderr); return -1; } else { printf("msDecryptStringTokens('%s') returned '%s'\n", string_buf2, pszBuf); } msFree(pszBuf); msFreeMap(map); } return 0; } #endif /* TEST_MAPCRYPTO */ mapserver-8.4.0/src/mapdebug.c000066400000000000000000000234331474174441300162640ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of debug/logging, msDebug() and related functions. * Author: Daniel Morissette * ****************************************************************************** * Copyright (c) 1996-2007 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "maperror.h" #include "mapthread.h" #include "maptime.h" #include "cpl_conv.h" #include #ifndef _WIN32 #include #include #endif #include #ifdef NEED_NONBLOCKING_STDERR #include #endif #ifdef _WIN32 #include /* OutputDebugStringA() */ #endif #ifndef USE_THREAD debugInfoObj *msGetDebugInfoObj() { static debugInfoObj debuginfo = { MS_DEBUGLEVEL_ERRORSONLY, MS_DEBUGMODE_OFF, NULL, NULL, 0, NULL}; return &debuginfo; } #else static debugInfoObj *debuginfo_list = NULL; debugInfoObj *msGetDebugInfoObj() { debugInfoObj *link; void *thread_id; debugInfoObj *ret_obj; msAcquireLock(TLOCK_DEBUGOBJ); thread_id = msGetThreadId(); /* find link for this thread */ for (link = debuginfo_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } /* If the target thread link is already at the head of the list were ok */ if (debuginfo_list != NULL && debuginfo_list->thread_id == thread_id) { } /* We don't have one ... initialize one. */ else if (link == NULL || link->next == NULL) { debugInfoObj *new_link; new_link = (debugInfoObj *)msSmallMalloc(sizeof(debugInfoObj)); new_link->next = debuginfo_list; new_link->thread_id = thread_id; new_link->global_debug_level = MS_DEBUGLEVEL_ERRORSONLY; new_link->debug_mode = MS_DEBUGMODE_OFF; new_link->errorfile = NULL; new_link->fp = NULL; debuginfo_list = new_link; } /* If the link is not already at the head of the list, promote it */ else { debugInfoObj *target = link->next; link->next = link->next->next; target->next = debuginfo_list; debuginfo_list = target; } ret_obj = debuginfo_list; msReleaseLock(TLOCK_DEBUGOBJ); return ret_obj; } #endif /* msSetErrorFile() ** ** Set output target, ready to write to it, open file if necessary ** ** If pszRelToPath != NULL then we will try to make the value relative to ** this path if it is not absolute already and it's not one of the special ** values (stderr, stdout, windowsdebug) ** ** Returns MS_SUCCESS/MS_FAILURE */ int msSetErrorFile(const char *pszErrorFile, const char *pszRelToPath) { char extended_path[MS_MAXPATHLEN]; debugInfoObj *debuginfo = msGetDebugInfoObj(); if (strcmp(pszErrorFile, "stderr") != 0 && strcmp(pszErrorFile, "stdout") != 0 && strcmp(pszErrorFile, "windowsdebug") != 0) { /* Try to make the path relative */ if (msBuildPath(extended_path, pszRelToPath, pszErrorFile) == NULL) return MS_FAILURE; pszErrorFile = extended_path; } if (debuginfo->errorfile && pszErrorFile && strcmp(debuginfo->errorfile, pszErrorFile) == 0) { /* Nothing to do, already writing to the right place */ return MS_SUCCESS; } /* Close current output file if any */ msCloseErrorFile(); /* NULL or empty target will just close current output and return */ if (pszErrorFile == NULL || *pszErrorFile == '\0') return MS_SUCCESS; if (strcmp(pszErrorFile, "stderr") == 0) { debuginfo->fp = stderr; debuginfo->errorfile = msStrdup(pszErrorFile); debuginfo->debug_mode = MS_DEBUGMODE_STDERR; } else if (strcmp(pszErrorFile, "stdout") == 0) { debuginfo->fp = stdout; debuginfo->errorfile = msStrdup(pszErrorFile); debuginfo->debug_mode = MS_DEBUGMODE_STDOUT; } else if (strcmp(pszErrorFile, "windowsdebug") == 0) { #ifdef _WIN32 debuginfo->errorfile = msStrdup(pszErrorFile); debuginfo->fp = NULL; debuginfo->debug_mode = MS_DEBUGMODE_WINDOWSDEBUG; #else msSetError( MS_MISCERR, "'MS_ERRORFILE windowsdebug' is available only on Windows platforms.", "msSetErrorFile()"); return MS_FAILURE; #endif } else { debuginfo->fp = fopen(pszErrorFile, "a"); if (debuginfo->fp == NULL) { msSetError(MS_MISCERR, "Failed to open MS_ERRORFILE %s", "msSetErrorFile()", pszErrorFile); return MS_FAILURE; } debuginfo->errorfile = msStrdup(pszErrorFile); debuginfo->debug_mode = MS_DEBUGMODE_FILE; } return MS_SUCCESS; } /* msCloseErrorFile() ** ** Close current output file (if one is open) and reset related members */ void msCloseErrorFile() { debugInfoObj *debuginfo = msGetDebugInfoObj(); if (debuginfo && debuginfo->debug_mode != MS_DEBUGMODE_OFF) { if (debuginfo->fp && debuginfo->debug_mode == MS_DEBUGMODE_FILE) fclose(debuginfo->fp); if (debuginfo->fp && (debuginfo->debug_mode == MS_DEBUGMODE_STDERR || debuginfo->debug_mode == MS_DEBUGMODE_STDOUT)) fflush(debuginfo->fp); /* just flush stderr or stdout */ debuginfo->fp = NULL; msFree(debuginfo->errorfile); debuginfo->errorfile = NULL; debuginfo->debug_mode = MS_DEBUGMODE_OFF; } } /* msGetErrorFile() ** ** Returns name of current error file ** ** Returns NULL if not set. */ const char *msGetErrorFile() { debugInfoObj *debuginfo = msGetDebugInfoObj(); if (debuginfo) return debuginfo->errorfile; return NULL; } /* Set/Get the current global debug level value, used as default value for ** new map and layer objects and to control msDebug() calls outside of ** the context of mapObj or layerObj. ** */ void msSetGlobalDebugLevel(int level) { debugInfoObj *debuginfo = msGetDebugInfoObj(); if (debuginfo) debuginfo->global_debug_level = (debugLevel)level; } debugLevel msGetGlobalDebugLevel() { debugInfoObj *debuginfo = msGetDebugInfoObj(); if (debuginfo) return debuginfo->global_debug_level; return MS_DEBUGLEVEL_ERRORSONLY; } /* msDebugInitFromEnv() ** ** Init debug state from MS_ERRORFILE and MS_DEBUGLEVEL env vars if set ** ** Returns MS_SUCCESS/MS_FAILURE */ int msDebugInitFromEnv() { const char *val; if ((val = CPLGetConfigOption("MS_ERRORFILE", NULL)) != NULL) { if (msSetErrorFile(val, NULL) != MS_SUCCESS) return MS_FAILURE; } if ((val = CPLGetConfigOption("MS_DEBUGLEVEL", NULL)) != NULL) msSetGlobalDebugLevel(atoi(val)); return MS_SUCCESS; } /* msDebugCleanup() ** ** Called by msCleanup to remove info related to this thread. */ void msDebugCleanup() { /* make sure file is closed */ msCloseErrorFile(); #ifdef USE_THREAD { void *thread_id = msGetThreadId(); debugInfoObj *link; msAcquireLock(TLOCK_DEBUGOBJ); /* find link for this thread */ for (link = debuginfo_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } if (link->thread_id == thread_id) { /* presumably link is at head of list. */ if (debuginfo_list == link) debuginfo_list = link->next; free(link); } else if (link->next != NULL && link->next->thread_id == thread_id) { debugInfoObj *next_link = link->next; link->next = link->next->next; free(next_link); } msReleaseLock(TLOCK_DEBUGOBJ); } #endif } /* msDebug() ** ** Outputs/logs messages to the MS_ERRORFILE if one is set ** (see msSetErrorFile()) ** */ void msDebug(const char *pszFormat, ...) { va_list args; debugInfoObj *debuginfo = msGetDebugInfoObj(); char szMessage[MESSAGELENGTH]; if (debuginfo == NULL || debuginfo->debug_mode == MS_DEBUGMODE_OFF) return; /* Don't waste time here! */ va_start(args, pszFormat); vsnprintf(szMessage, MESSAGELENGTH, pszFormat, args); va_end(args); szMessage[MESSAGELENGTH - 1] = '\0'; msRedactCredentials(szMessage); if (debuginfo->fp) { /* Writing to a stdio file handle */ #if defined(USE_FASTCGI) /* It seems the FastCGI stuff inserts a timestamp anyways, so */ /* we might as well skip this one if writing to stderr w/ FastCGI. */ if (debuginfo->debug_mode != MS_DEBUGMODE_STDERR) #endif { struct mstimeval tv; time_t t; msGettimeofday(&tv, NULL); t = tv.tv_sec; msIO_fprintf(debuginfo->fp, "[%s].%ld ", msStringChop(ctime(&t)), (long)tv.tv_usec); } msIO_fprintf(debuginfo->fp, "%s", szMessage); } #ifdef _WIN32 else if (debuginfo->debug_mode == MS_DEBUGMODE_WINDOWSDEBUG) { /* Writing to Windows Debug Console */ OutputDebugStringA(szMessage); } #endif } /* msDebug2() ** ** Variadic function with no operation ** */ void msDebug2(int level, ...) { (void)level; } mapserver-8.4.0/src/mapdraw.c000066400000000000000000005075261474174441300161450ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: High level msDrawMap() implementation and related functions. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include #include "mapserver.h" #include "maptime.h" #include "mapcopy.h" #include "mapfile.h" #include "mapows.h" #include "cpl_port.h" /* msGetGeoCellSize * * A helper function to get the first parameter for msUpdateClassScaleFactor() */ double msGetGeoCellSize(const mapObj *map) { double geo_cellsize; /* We will need a cellsize that represents a real georeferenced */ /* coordinate cellsize here, so compute it from saved extents. */ geo_cellsize = map->cellsize; if (map->gt.need_geotransform == MS_TRUE) { double cellsize_x = (map->saved_extent.maxx - map->saved_extent.minx) / map->width; double cellsize_y = (map->saved_extent.maxy - map->saved_extent.miny) / map->height; geo_cellsize = sqrt(cellsize_x * cellsize_x + cellsize_y * cellsize_y) / sqrt(2.0); } return geo_cellsize; } /* msUpdateClassScaleFactor * * Provides correct scale factor inheritance for Class and all of its * styles and labels. */ void msUpdateClassScaleFactor(double geo_cellsize, const mapObj *map, const layerObj *layer, classObj *c) { if (c->sizeunits == MS_INHERIT) c->scalefactor = layer->scalefactor; else if (c->sizeunits != MS_PIXELS) c->scalefactor = (msInchesPerUnit(c->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) c->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else c->scalefactor = map->resolution / map->defresolution; for (int sid = 0; sid < c->numstyles; sid++) { styleObj *style = c->styles[sid]; if (style->sizeunits == MS_INHERIT) style->scalefactor = c->scalefactor; else if (style->sizeunits != MS_PIXELS) style->scalefactor = (msInchesPerUnit(style->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) style->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else style->scalefactor = map->resolution / map->defresolution; } for (int sid = 0; sid < c->numlabels; sid++) { labelObj *label = c->labels[sid]; if (label->sizeunits == MS_INHERIT) label->scalefactor = c->scalefactor; else if (label->sizeunits != MS_PIXELS) label->scalefactor = (msInchesPerUnit(label->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) label->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else label->scalefactor = map->resolution / map->defresolution; for (int lsid = 0; lsid < label->numstyles; lsid++) { styleObj *lstyle = label->styles[lsid]; if (lstyle->sizeunits == MS_INHERIT) lstyle->scalefactor = label->scalefactor; else if (lstyle->sizeunits != MS_PIXELS) lstyle->scalefactor = (msInchesPerUnit(lstyle->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) lstyle->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else lstyle->scalefactor = map->resolution / map->defresolution; } } } /* msPrepareImage() * * Returns a new imageObj ready for rendering the current map. * * If allow_nonsquare is set to MS_TRUE then the caller should call * msMapRestoreRealExtent() once they are done with the image. * This should be set to MS_TRUE only when called from msDrawMap(), see bug 945. */ imageObj *msPrepareImage(mapObj *map, int allow_nonsquare) { int i, status; imageObj *image = NULL; double geo_cellsize; if (map->width == -1 || map->height == -1) { msSetError(MS_MISCERR, "Image dimensions not specified.", "msPrepareImage()"); return (NULL); } msFreeLabelCache(&(map->labelcache)); msInitLabelCache( &(map->labelcache)); /* this clears any previously allocated cache */ /* clear any previously created mask layer images */ for (i = 0; i < map->numlayers; i++) { if (GET_LAYER(map, i)->maskimage) { msFreeImage(GET_LAYER(map, i)->maskimage); GET_LAYER(map, i)->maskimage = NULL; } } status = msValidateContexts(map); /* make sure there are no recursive REQUIRES or LABELREQUIRES expressions */ if (status != MS_SUCCESS) return NULL; if (!map->outputformat) { msSetError(MS_IMGERR, "Map outputformat not set!", "msPrepareImage()"); return (NULL); } else if (MS_RENDERER_PLUGIN(map->outputformat)) { rendererVTableObj *renderer = map->outputformat->vtable; colorObj *bg = &map->imagecolor; map->imagecolor.alpha = 255; image = renderer->createImage(map->width, map->height, map->outputformat, bg); if (image == NULL) return (NULL); image->format = map->outputformat; image->format->refcount++; image->width = map->width; image->height = map->height; image->resolution = map->resolution; image->resolutionfactor = map->resolution / map->defresolution; if (map->web.imagepath) image->imagepath = msStrdup(map->web.imagepath); if (map->web.imageurl) image->imageurl = msStrdup(map->web.imageurl); } else if (MS_RENDERER_IMAGEMAP(map->outputformat)) { image = msImageCreateIM(map->width, map->height, map->outputformat, map->web.imagepath, map->web.imageurl, map->resolution, map->defresolution); } else if (MS_RENDERER_RAWDATA(map->outputformat)) { image = msImageCreate(map->width, map->height, map->outputformat, map->web.imagepath, map->web.imageurl, map->resolution, map->defresolution, &map->imagecolor); } else { image = NULL; } if (!image) { msSetError(MS_IMGERR, "Unable to initialize image.", "msPrepareImage()"); return (NULL); } image->map = map; /* * If we want to support nonsquare pixels, note that now, otherwise * adjust the extent size to have square pixels. * * If allow_nonsquare is set to MS_TRUE then the caller should call * msMapRestoreRealExtent() once they are done with the image. * This should be set to MS_TRUE only when called from msDrawMap(), see bug * 945. */ if (allow_nonsquare && msTestConfigOption(map, "MS_NONSQUARE", MS_FALSE)) { double cellsize_x = (map->extent.maxx - map->extent.minx) / map->width; double cellsize_y = (map->extent.maxy - map->extent.miny) / map->height; if (cellsize_y != 0.0 && (fabs(cellsize_x / cellsize_y) > 1.00001 || fabs(cellsize_x / cellsize_y) < 0.99999)) { map->gt.need_geotransform = MS_TRUE; if (map->debug) msDebug( "msDrawMap(): kicking into non-square pixel preserving mode.\n"); } map->cellsize = (cellsize_x * 0.5 + cellsize_y * 0.5); } else map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); status = msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scaledenom); if (status != MS_SUCCESS) { msFreeImage(image); return (NULL); } /* update geotransform based on adjusted extent. */ msMapComputeGeotransform(map); /* Do we need to fake out stuff for rotated support? */ if (map->gt.need_geotransform) msMapSetFakedExtent(map); geo_cellsize = msGetGeoCellSize(map); /* compute layer/class/style/label scale factors now */ for (int lid = 0; lid < map->numlayers; lid++) { layerObj *layer = GET_LAYER(map, lid); if (layer->sizeunits != MS_PIXELS) layer->scalefactor = (msInchesPerUnit(layer->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) layer->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else layer->scalefactor = map->resolution / map->defresolution; for (int cid = 0; cid < layer->numclasses; cid++) { classObj *class = GET_CLASS(map, lid, cid); msUpdateClassScaleFactor(geo_cellsize, map, layer, class); } } image->refpt.x = MS_MAP2IMAGE_X_IC_DBL(0, map->extent.minx, 1.0 / map->cellsize); image->refpt.y = MS_MAP2IMAGE_Y_IC_DBL(0, map->extent.maxy, 1.0 / map->cellsize); return image; } static int msCompositeRasterBuffer(mapObj *map, imageObj *img, rasterBufferObj *rb, LayerCompositer *comp) { int ret = MS_SUCCESS; if (MS_IMAGE_RENDERER(img)->compositeRasterBuffer) { while (comp && ret == MS_SUCCESS) { rasterBufferObj *rb_ptr = rb; CompositingFilter *filter = comp->filter; if (filter && comp->next) { /* if we have another compositor to apply, then we need to copy the * rasterBufferObj. Otherwise we can work on it directly */ rb_ptr = (rasterBufferObj *)msSmallCalloc(sizeof(rasterBufferObj), 1); msCopyRasterBuffer(rb_ptr, rb); } while (filter && ret == MS_SUCCESS) { ret = msApplyCompositingFilter(map, rb_ptr, filter); filter = filter->next; } if (ret == MS_SUCCESS) ret = MS_IMAGE_RENDERER(img)->compositeRasterBuffer( img, rb_ptr, comp->comp_op, comp->opacity); if (rb_ptr != rb) { msFreeRasterBuffer(rb_ptr); msFree(rb_ptr); } comp = comp->next; } } else { ret = MS_FAILURE; } return ret; } /* * Generic function to render the map file. * The type of the image created is based on the imagetype parameter in the map * file. * * mapObj *map - map object loaded in MapScript or via a mapfile to use * int querymap - is this map the result of a query operation, MS_TRUE|MS_FALSE */ imageObj *msDrawMap(mapObj *map, int querymap) { int i; layerObj *lp = NULL; int status = MS_FAILURE; imageObj *image = NULL; struct mstimeval mapstarttime = {0}, mapendtime = {0}; struct mstimeval starttime = {0}, endtime = {0}; #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) enum MS_CONNECTION_TYPE lastconnectiontype; httpRequestObj *pasOWSReqInfo = NULL; int numOWSLayers = 0; int numOWSRequests = 0; wmsParamsObj sLastWMSParams; #endif if (map->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&mapstarttime, NULL); if (querymap) { /* use queryMapObj image dimensions */ if (map->querymap.width > 0 && map->querymap.width <= map->maxsize) map->width = map->querymap.width; if (map->querymap.height > 0 && map->querymap.height <= map->maxsize) map->height = map->querymap.height; } msApplyMapConfigOptions(map); image = msPrepareImage(map, MS_TRUE); if (!image) { msSetError(MS_IMGERR, "Unable to initialize image.", "msDrawMap()"); return (NULL); } if (map->debug >= MS_DEBUGLEVEL_DEBUG) msDebug("msDrawMap(): rendering using outputformat named %s (%s).\n", map->outputformat->name, map->outputformat->driver); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Time the OWS query phase */ if (map->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&starttime, NULL); /* How many OWS (WMS/WFS) layers do we have to draw? * Note: numOWSLayers is the number of actual layers and numOWSRequests is * the number of HTTP requests which could be lower if multiple layers * are merged into the same request. */ numOWSLayers = 0; for (i = 0; i < map->numlayers; i++) { if (map->layerorder[i] == -1) continue; lp = GET_LAYER(map, map->layerorder[i]); if (lp->connectiontype != MS_WMS && lp->connectiontype != MS_WFS) { continue; } numOWSLayers++; } if (numOWSLayers > 0) { /* Alloc and init pasOWSReqInfo... */ pasOWSReqInfo = (httpRequestObj *)malloc(numOWSLayers * sizeof(httpRequestObj)); if (pasOWSReqInfo == NULL) { msSetError(MS_MEMERR, "Allocation of httpRequestObj failed.", "msDrawMap()"); return NULL; } msHTTPInitRequestObj(pasOWSReqInfo, numOWSLayers); msInitWmsParamsObj(&sLastWMSParams); /* Pre-download all WMS/WFS layers in parallel before starting to draw map */ lastconnectiontype = MS_SHAPEFILE; for (i = 0; i < map->numlayers; i++) { if (map->layerorder[i] == -1) continue; lp = GET_LAYER(map, map->layerorder[i]); if (lp->connectiontype != MS_WMS && lp->connectiontype != MS_WFS) { continue; } if (!msLayerIsVisible(map, lp)) continue; #ifdef USE_WMS_LYR if (lp->connectiontype == MS_WMS) { if (msPrepareWMSLayerRequest(map->layerorder[i], map, lp, 1, lastconnectiontype, &sLastWMSParams, 0, 0, 0, NULL, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) { msFreeWmsParamsObj(&sLastWMSParams); msFreeImage(image); msFree(pasOWSReqInfo); return NULL; } } #endif #ifdef USE_WFS_LYR if (lp->connectiontype == MS_WFS) { if (msPrepareWFSLayerRequest(map->layerorder[i], map, lp, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) { msFreeWmsParamsObj(&sLastWMSParams); msFreeImage(image); msFree(pasOWSReqInfo); return NULL; } } #endif lastconnectiontype = lp->connectiontype; } msFreeWmsParamsObj(&sLastWMSParams); } /* if numOWSLayers > 0 */ if (numOWSRequests && msOWSExecuteRequests(pasOWSReqInfo, numOWSRequests, map, MS_TRUE) == MS_FAILURE) { msFreeImage(image); msFree(pasOWSReqInfo); return NULL; } if (map->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug("msDrawMap(): WMS/WFS set-up and query, %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ /* OK, now we can start drawing */ for (i = 0; i < map->numlayers; i++) { if (map->layerorder[i] != -1) { const char *force_draw_label_cache = NULL; lp = (GET_LAYER(map, map->layerorder[i])); if (lp->postlabelcache) /* wait to draw */ continue; if (map->debug >= MS_DEBUGLEVEL_TUNING || lp->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&starttime, NULL); if (!msLayerIsVisible(map, lp)) continue; if (lp->connectiontype == MS_WMS) { #ifdef USE_WMS_LYR if (MS_RENDERER_PLUGIN(image->format) || MS_RENDERER_RAWDATA(image->format)) { assert(pasOWSReqInfo); status = msDrawWMSLayerLow(map->layerorder[i], pasOWSReqInfo, numOWSRequests, map, lp, image); } else { msSetError(MS_WMSCONNERR, "Output format '%s' doesn't support WMS layers.", "msDrawMap()", image->format->name); status = MS_FAILURE; } if (status == MS_FAILURE) { msSetError(MS_WMSCONNERR, "Failed to draw WMS layer named '%s'. This most likely " "happened because " "the remote WMS server returned an invalid image, and XML " "exception " "or another unexpected result in response to the GetMap " "request. Also check " "and make sure that the layer's connection URL is valid.", "msDrawMap()", lp->name); msFreeImage(image); msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); return (NULL); } #else /* ndef USE_WMS_LYR */ msSetError(MS_WMSCONNERR, "MapServer not built with WMS Client support, unable to " "render layer '%s'.", "msDrawMap()", lp->name); msFreeImage(image); return (NULL); #endif } else { /* Default case: anything but WMS layers */ if (querymap) status = msDrawQueryLayer(map, lp, image); else status = msDrawLayer(map, lp, image); if (status == MS_FAILURE) { msSetError(MS_IMGERR, "Failed to draw layer named '%s'.", "msDrawMap()", lp->name); msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ return (NULL); } } if (map->debug >= MS_DEBUGLEVEL_TUNING || lp->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug("msDrawMap(): Layer %d (%s), %.3fs\n", map->layerorder[i], lp->name ? lp->name : "(null)", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } /* Flush layer cache in-between layers if requested by PROCESSING * directive*/ force_draw_label_cache = msLayerGetProcessingKey(lp, "FORCE_DRAW_LABEL_CACHE"); if (force_draw_label_cache && strncasecmp(force_draw_label_cache, "FLUSH", 5) == 0) { if (map->debug >= MS_DEBUGLEVEL_V) msDebug( "msDrawMap(): PROCESSING FORCE_DRAW_LABEL_CACHE=FLUSH found.\n"); if (msDrawLabelCache(map, image) != MS_SUCCESS) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ return (NULL); } msFreeLabelCache(&(map->labelcache)); msInitLabelCache(&(map->labelcache)); } /* PROCESSING FORCE_DRAW_LABEL_CACHE */ } } if (map->scalebar.status == MS_EMBED && !map->scalebar.postlabelcache) { /* We need to temporarily restore the original extent for drawing */ /* the scalebar as it uses the extent to recompute cellsize. */ if (map->gt.need_geotransform) msMapRestoreRealExtent(map); if (MS_SUCCESS != msEmbedScalebar(map, image)) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif return NULL; } if (map->gt.need_geotransform) msMapSetFakedExtent(map); } if (map->legend.status == MS_EMBED && !map->legend.postlabelcache) { if (msEmbedLegend(map, image) != MS_SUCCESS) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif return NULL; } } if (msDrawLabelCache(map, image) != MS_SUCCESS) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ return (NULL); } for (i = 0; i < map->numlayers; i++) { /* for each layer, check for postlabelcache layers */ lp = (GET_LAYER(map, map->layerorder[i])); if (!lp->postlabelcache) continue; if (!msLayerIsVisible(map, lp)) continue; if (map->debug >= MS_DEBUGLEVEL_TUNING || lp->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&starttime, NULL); if (lp->connectiontype == MS_WMS) { #ifdef USE_WMS_LYR if (MS_RENDERER_PLUGIN(image->format) || MS_RENDERER_RAWDATA(image->format)) { assert(pasOWSReqInfo); status = msDrawWMSLayerLow(map->layerorder[i], pasOWSReqInfo, numOWSRequests, map, lp, image); } #else status = MS_FAILURE; #endif } else { if (querymap) status = msDrawQueryLayer(map, lp, image); else status = msDrawLayer(map, lp, image); } if (status == MS_FAILURE) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ return (NULL); } if (map->debug >= MS_DEBUGLEVEL_TUNING || lp->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug("msDrawMap(): Layer %d (%s), %.3fs\n", map->layerorder[i], lp->name ? lp->name : "(null)", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } } /* Do we need to fake out stuff for rotated support? */ /* This really needs to be done on every preceding exit point too... */ if (map->gt.need_geotransform) msMapRestoreRealExtent(map); if (map->legend.status == MS_EMBED && map->legend.postlabelcache) if (MS_UNLIKELY(MS_FAILURE == msEmbedLegend(map, image))) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif return NULL; } if (map->scalebar.status == MS_EMBED && map->scalebar.postlabelcache) { /* We need to temporarily restore the original extent for drawing */ /* the scalebar as it uses the extent to recompute cellsize. */ if (map->gt.need_geotransform) msMapRestoreRealExtent(map); if (MS_SUCCESS != msEmbedScalebar(map, image)) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif return NULL; } if (map->gt.need_geotransform) msMapSetFakedExtent(map); } #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif if (map->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&mapendtime, NULL); msDebug("msDrawMap() total time: %.3fs\n", (mapendtime.tv_sec + mapendtime.tv_usec / 1.0e6) - (mapstarttime.tv_sec + mapstarttime.tv_usec / 1.0e6)); } return (image); } /* * Test whether a layer should be drawn or not in the current map view and * at the current scale. * Returns TRUE if layer is visible, FALSE if not. */ int msLayerIsVisible(mapObj *map, layerObj *layer) { int i; if (!layer->data && !layer->tileindex && !layer->connection && !layer->features && !layer->grid) return (MS_FALSE); /* no data associated with this layer, not an error since layer may be used as a template from MapScript */ if (layer->type == MS_LAYER_QUERY || layer->type == MS_LAYER_TILEINDEX) return (MS_FALSE); if ((layer->status != MS_ON) && (layer->status != MS_DEFAULT)) return (MS_FALSE); /* Do comparisons of layer scale vs map scale now, since msExtentsOverlap() */ /* can be slow */ if (map->scaledenom > 0) { /* layer scale boundaries should be checked first */ if ((layer->maxscaledenom > 0) && (map->scaledenom > layer->maxscaledenom)) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because " "LAYER.MAXSCALE is too small for this MAP scale\n", layer->name); } return (MS_FALSE); } if (/*(layer->minscaledenom > 0) &&*/ (map->scaledenom <= layer->minscaledenom)) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because " "LAYER.MINSCALE is too large for this MAP scale\n", layer->name); } return (MS_FALSE); } } /* Only return MS_FALSE if it is definitely false. Sometimes it will return *MS_UNKNOWN, which we ** consider true, for this use case (it might be visible, try and draw it, *see what happens). */ if (msExtentsOverlap(map, layer) == MS_FALSE) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because LAYER.EXTENT " "does not intersect MAP.EXTENT\n", layer->name); } return (MS_FALSE); } if (msEvalContext(map, layer, layer->requires) == MS_FALSE) return (MS_FALSE); if (map->scaledenom > 0) { /* now check class scale boundaries (all layers *must* pass these tests) */ if (layer->numclasses > 0) { for (i = 0; i < layer->numclasses; i++) { if ((layer->class[i] -> maxscaledenom > 0) && (map->scaledenom > layer->class[i] -> maxscaledenom)) continue; /* can skip this one, next class */ if ((layer->class[i] -> minscaledenom > 0) && (map->scaledenom <= layer->class[i] -> minscaledenom)) continue; /* can skip this one, next class */ break; /* can't skip this class (or layer for that matter) */ } if (i == layer->numclasses) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because no CLASS in " "the layer is in-scale for this MAP scale\n", layer->name); } return (MS_FALSE); } } } if (layer->maxscaledenom <= 0 && layer->minscaledenom <= 0) { if ((layer->maxgeowidth > 0) && ((map->extent.maxx - map->extent.minx) > layer->maxgeowidth)) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because LAYER width " "is much smaller than map width\n", layer->name); } return (MS_FALSE); } if ((layer->mingeowidth > 0) && ((map->extent.maxx - map->extent.minx) < layer->mingeowidth)) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because LAYER width " "is much larger than map width\n", layer->name); } return (MS_FALSE); } } return MS_TRUE; /* All tests passed. Layer is visible. */ } #define LAYER_NEEDS_COMPOSITING(layer) \ (((layer)->compositer != NULL) && \ ((layer)->compositer->next || (layer)->compositor->opacity < 100 || \ (layer)->compositor->compop != MS_COMPOP_SRC_OVER || \ (layer)->compositer->filter)) /* * Generic function to render a layer object. */ int msDrawLayer(mapObj *map, layerObj *layer, imageObj *image) { imageObj *image_draw = image; outputFormatObj *altFormat = NULL; int retcode = MS_SUCCESS; const char *alternativeFormatString = NULL; layerObj *maskLayer = NULL; if (!msLayerIsVisible(map, layer)) return MS_SUCCESS; if (layer->compositer && !layer->compositer->next && layer->compositer->opacity == 0) return MS_SUCCESS; /* layer is completely transparent, skip it */ /* conditions may have changed since this layer last drawn, so retest layer->project (Bug #673) */ layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); /* make sure labelcache setting is set correctly if postlabelcache is set. This is done by the parser but may have been altered by a mapscript. see #5142 */ if (layer->postlabelcache) { layer->labelcache = MS_FALSE; } if (layer->mask) { int maskLayerIdx; /* render the mask layer in its own imageObj */ if (!MS_IMAGE_RENDERER(image)->supports_pixel_buffer) { msSetError(MS_MISCERR, "Layer (%s) references references a mask layer, but the " "selected renderer does not support them", "msDrawLayer()", layer->name); return (MS_FAILURE); } maskLayerIdx = msGetLayerIndex(map, layer->mask); if (maskLayerIdx == -1) { msSetError(MS_MISCERR, "Layer (%s) references unknown mask layer (%s)", "msDrawLayer()", layer->name, layer->mask); return (MS_FAILURE); } maskLayer = GET_LAYER(map, maskLayerIdx); if (!maskLayer->maskimage) { int i; int origstatus, origlabelcache; altFormat = msSelectOutputFormat(map, "png24"); msInitializeRendererVTable(altFormat); /* TODO: check the png24 format hasn't been tampered with, i.e. it's agg */ maskLayer->maskimage = msImageCreate( image->width, image->height, altFormat, image->imagepath, image->imageurl, map->resolution, map->defresolution, NULL); if (!maskLayer->maskimage) { msSetError(MS_MISCERR, "Unable to initialize mask image.", "msDrawLayer()"); return (MS_FAILURE); } /* * force the masked layer to status on, and turn off the labelcache so * that eventual labels are added to the temporary image instead of being * added to the labelcache */ origstatus = maskLayer->status; origlabelcache = maskLayer->labelcache; maskLayer->status = MS_ON; maskLayer->labelcache = MS_OFF; /* draw the mask layer in the temporary image */ retcode = msDrawLayer(map, maskLayer, maskLayer->maskimage); maskLayer->status = origstatus; maskLayer->labelcache = origlabelcache; if (retcode != MS_SUCCESS) { return MS_FAILURE; } /* * hack to work around bug #3834: if we have use an alternate renderer, * the symbolset may contain symbols that reference it. We want to remove * those references before the altFormat is destroyed to avoid a segfault * and/or a leak, and so the the main renderer doesn't pick the cache up * thinking it's for him. */ for (i = 0; i < map->symbolset.numsymbols; i++) { if (map->symbolset.symbol[i] != NULL) { symbolObj *s = map->symbolset.symbol[i]; if (s->renderer == MS_IMAGE_RENDERER(maskLayer->maskimage)) { MS_IMAGE_RENDERER(maskLayer->maskimage)->freeSymbol(s); s->renderer = NULL; } } } /* set the imagetype from the original outputformat back (it was removed * by msSelectOutputFormat() */ msFree(map->imagetype); map->imagetype = msStrdup(image->format->name); } } altFormat = NULL; /* inform the rendering device that layer draw is starting. */ msImageStartLayer(map, layer, image); /*check if an alternative renderer should be used for this layer*/ alternativeFormatString = msLayerGetProcessingKey(layer, "RENDERER"); if (MS_RENDERER_PLUGIN(image_draw->format) && alternativeFormatString != NULL && (altFormat = msSelectOutputFormat(map, alternativeFormatString))) { rendererVTableObj *renderer = NULL; msInitializeRendererVTable(altFormat); image_draw = msImageCreate( image->width, image->height, altFormat, image->imagepath, image->imageurl, map->resolution, map->defresolution, &map->imagecolor); renderer = MS_IMAGE_RENDERER(image_draw); renderer->startLayer(image_draw, map, layer); } else if (MS_RENDERER_PLUGIN(image_draw->format)) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw); if ((layer->mask && layer->connectiontype != MS_WMS && layer->type != MS_LAYER_RASTER) || layer->compositer) { /* masking occurs at the pixel/layer level for raster images, so we don't need to create a temporary image in these cases */ if (layer->mask || renderer->compositeRasterBuffer) { image_draw = msImageCreate(image->width, image->height, image->format, image->imagepath, image->imageurl, map->resolution, map->defresolution, NULL); if (!image_draw) { msSetError(MS_MISCERR, "Unable to initialize temporary transparent image.", "msDrawLayer()"); return (MS_FAILURE); } image_draw->map = map; renderer->startLayer(image_draw, map, layer); } } } /* ** redirect processing of some layer types. */ if (layer->connectiontype == MS_WMS) { #ifdef USE_WMS_LYR retcode = msDrawWMSLayer(map, layer, image_draw); #else retcode = MS_FAILURE; #endif } else if (layer->type == MS_LAYER_RASTER) { retcode = msDrawRasterLayer(map, layer, image_draw); } else if (layer->type == MS_LAYER_CHART) { retcode = msDrawChartLayer(map, layer, image_draw); } else { /* must be a Vector layer */ retcode = msDrawVectorLayer(map, layer, image_draw); } if (altFormat) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image); rendererVTableObj *altrenderer = MS_IMAGE_RENDERER(image_draw); rasterBufferObj rb; int i; memset(&rb, 0, sizeof(rasterBufferObj)); altrenderer->endLayer(image_draw, map, layer); retcode = altrenderer->getRasterBufferHandle(image_draw, &rb); if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto altformat_cleanup; } retcode = renderer->mergeRasterBuffer( image, &rb, ((layer->compositer) ? (layer->compositer->opacity * 0.01) : (1.0)), 0, 0, 0, 0, rb.width, rb.height); if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto altformat_cleanup; } altformat_cleanup: /* * hack to work around bug #3834: if we have use an alternate renderer, the * symbolset may contain symbols that reference it. We want to remove those * references before the altFormat is destroyed to avoid a segfault and/or a * leak, and so the main renderer doesn't pick the cache up thinking * it's for him. */ for (i = 0; i < map->symbolset.numsymbols; i++) { if (map->symbolset.symbol[i] != NULL) { symbolObj *s = map->symbolset.symbol[i]; if (s->renderer == altrenderer) { altrenderer->freeSymbol(s); s->renderer = NULL; } } } msFreeImage(image_draw); /* set the imagetype from the original outputformat back (it was removed by * msSelectOutputFormat() */ msFree(map->imagetype); map->imagetype = msStrdup(image->format->name); } else if (image != image_draw) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw); rasterBufferObj rb; memset(&rb, 0, sizeof(rasterBufferObj)); renderer->endLayer(image_draw, map, layer); retcode = renderer->getRasterBufferHandle(image_draw, &rb); if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto imagedraw_cleanup; } if (maskLayer && maskLayer->maskimage) { rasterBufferObj mask; unsigned int row, col; memset(&mask, 0, sizeof(rasterBufferObj)); retcode = MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, &mask); if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto imagedraw_cleanup; } /* modify the pixels of the overlay */ if (rb.type == MS_BUFFER_BYTE_RGBA) { for (row = 0; row < rb.height; row++) { unsigned char *ma, *a, *r, *g, *b; r = rb.data.rgba.r + row * rb.data.rgba.row_step; g = rb.data.rgba.g + row * rb.data.rgba.row_step; b = rb.data.rgba.b + row * rb.data.rgba.row_step; a = rb.data.rgba.a + row * rb.data.rgba.row_step; ma = mask.data.rgba.a + row * mask.data.rgba.row_step; for (col = 0; col < rb.width; col++) { if (*ma == 0) { *a = *r = *g = *b = 0; } a += rb.data.rgba.pixel_step; r += rb.data.rgba.pixel_step; g += rb.data.rgba.pixel_step; b += rb.data.rgba.pixel_step; ma += mask.data.rgba.pixel_step; } } } } if (!layer->compositer) { /*we have a mask layer with no composition configured, do a nomral blend */ retcode = renderer->mergeRasterBuffer(image, &rb, 1.0, 0, 0, 0, 0, rb.width, rb.height); } else { retcode = msCompositeRasterBuffer(map, image, &rb, layer->compositer); } if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto imagedraw_cleanup; } imagedraw_cleanup: msFreeImage(image_draw); } msImageEndLayer(map, layer, image); return (retcode); } int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image) { int status, retcode = MS_SUCCESS; int drawmode = MS_DRAWMODE_FEATURES; char annotate = MS_TRUE; shapeObj shape; shapeObj savedShape; rectObj searchrect; char cache = MS_FALSE; int maxnumstyles = 1; featureListNodeObjPtr shpcache = NULL, current = NULL; int nclasses = 0; int *classgroup = NULL; double minfeaturesize = -1; int maxfeatures = -1; int featuresdrawn = 0; if (image) maxfeatures = msLayerGetMaxFeaturesToDraw(layer, image->format); /* TODO TBT: draw as raster layer in vector renderers */ annotate = msEvalContext(map, layer, layer->labelrequires); if (map->scaledenom > 0) { if ((layer->labelmaxscaledenom != -1) && (map->scaledenom >= layer->labelmaxscaledenom)) annotate = MS_FALSE; if ((layer->labelminscaledenom != -1) && (map->scaledenom < layer->labelminscaledenom)) annotate = MS_FALSE; } /* open this layer */ status = msLayerOpen(layer); if (status != MS_SUCCESS) return MS_FAILURE; /* build item list. STYLEITEM javascript needs the shape attributes */ if (layer->styleitem && (STARTS_WITH_CI(layer->styleitem, "javascript://") || STARTS_WITH_CI(layer->styleitem, "sld://"))) { status = msLayerWhichItems(layer, MS_TRUE, NULL); } else { status = msLayerWhichItems(layer, MS_FALSE, NULL); } if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } /* identify target shapes */ if (layer->transform == MS_TRUE) { searchrect = map->extent; if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) { int bDone = MS_FALSE; if (layer->connectiontype == MS_UVRASTER) { /* Nasty hack to make msUVRASTERLayerWhichShapes() aware that the */ /* original area of interest is (map->extent, map->projection)... */ /* Useful when dealing with UVRASTER that extend beyond 180 deg */ msUVRASTERLayerUseMapExtentAndProjectionForNextWhichShapes(layer, map); searchrect = msUVRASTERGetSearchRect(layer, map); bDone = MS_TRUE; } else if (layer->connectiontype == MS_RASTER_LABEL) { /* Nasty hack to make msRasterLabelLayerWhichShapes() aware that the */ /* original area of interest is (map->extent, map->projection)... */ /* Useful when dealing with RasterLabel that extend beyond 180 deg */ msRasterLabelLayerUseMapExtentAndProjectionForNextWhichShapes(layer, map); searchrect = msUVRASTERGetSearchRect(layer, map); bDone = MS_TRUE; } if (!bDone) msProjectRect( &map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ } } else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } status = msLayerWhichShapes(layer, searchrect, MS_FALSE); if (layer->connectiontype == MS_UVRASTER) { msUVRASTERLayerUseMapExtentAndProjectionForNextWhichShapes(layer, NULL); } else if (layer->connectiontype == MS_RASTER_LABEL) { msRasterLabelLayerUseMapExtentAndProjectionForNextWhichShapes(layer, NULL); } if (status == MS_DONE) { /* no overlap */ msLayerClose(layer); return MS_SUCCESS; } else if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } nclasses = 0; classgroup = NULL; if (layer->classgroup && layer->numclasses > 0) classgroup = msAllocateValidClassGroups(layer, &nclasses); if (layer->minfeaturesize > 0) minfeaturesize = Pix2LayerGeoref(map, layer, layer->minfeaturesize); // Select how to render classes // MS_FIRST_MATCHING_CLASS: Default and historic MapServer behavior // MS_ALL_MATCHING_CLASSES: SLD behavior int ref_rendermode; const char *rendermodestr = msLayerGetProcessingKey(layer, "RENDERMODE"); if (layer->rendermode == MS_ALL_MATCHING_CLASSES) { // SLD takes precedence ref_rendermode = MS_ALL_MATCHING_CLASSES; } else if (!rendermodestr) { // Default Mapfile ref_rendermode = MS_FIRST_MATCHING_CLASS; } else if (!strcmp(rendermodestr, "FIRST_MATCHING_CLASS")) { // Explicit default Mapfile ref_rendermode = MS_FIRST_MATCHING_CLASS; } else if (!strcmp(rendermodestr, "ALL_MATCHING_CLASSES")) { // SLD-like Mapfile ref_rendermode = MS_ALL_MATCHING_CLASSES; } else { msLayerClose(layer); msSetError(MS_MISCERR, "Unknown RENDERMODE: %s, should be one of: " "FIRST_MATCHING_CLASS, ALL_MATCHING_CLASSES.", "msDrawVectorLayer()", rendermodestr); return MS_FAILURE; } /* step through the target shapes and their classes */ msInitShape(&shape); int classindex = -1; int classcount = 0; for (;;) { int rendermode; if (classindex == -1) { msFreeShape(&shape); status = msLayerNextShape(layer, &shape); if (status != MS_SUCCESS) { break; } /* Check if the shape size is ok to be drawn */ if ((shape.type == MS_SHAPE_LINE || shape.type == MS_SHAPE_POLYGON) && (minfeaturesize > 0) && (msShapeCheckSize(&shape, minfeaturesize) == MS_FALSE)) { if (layer->debug >= MS_DEBUGLEVEL_V) msDebug("msDrawVectorLayer(): Skipping shape (%ld) because " "LAYER::MINFEATURESIZE is bigger than shape size\n", shape.index); continue; } classcount = 0; } classindex = msShapeGetNextClass(classindex, layer, map, &shape, classgroup, nclasses); if ((classindex == -1) || (layer->class[classindex] -> status == MS_OFF)) { continue; } shape.classindex = classindex; // When only one class is applicable, rendering mode is forced to its // default, i.e. only the first applicable class is actually applied. As a // consequence, cache can be enabled when relevant. classcount++; rendermode = ref_rendermode; if ((classcount == 1) && (msShapeGetNextClass(classindex, layer, map, &shape, classgroup, nclasses) == -1)) { rendermode = MS_FIRST_MATCHING_CLASS; } if (rendermode == MS_FIRST_MATCHING_CLASS) { classindex = -1; } if (maxfeatures >= 0 && featuresdrawn >= maxfeatures) { status = MS_DONE; break; } featuresdrawn++; cache = MS_FALSE; if (layer->type == MS_LAYER_LINE && (layer->class[shape.classindex] -> numstyles > 1 || (layer->class[shape.classindex] -> numstyles == 1 && (layer->class[shape.classindex] -> styles[0] -> outlinewidth > 0 || layer -> class[shape.classindex] -> styles[0] -> bindings[MS_STYLE_BINDING_OUTLINEWIDTH].index != -1)))) { cache = MS_TRUE; /* only line layers with multiple styles need be cached (I don't think POLYLINE layers need caching - SDL) */ // we also cache line layers with outlinewidths } /* With 'STYLEITEM AUTO', we will have the datasource fill the class' */ /* style parameters for this shape. */ if (layer->styleitem) { if (strcasecmp(layer->styleitem, "AUTO") == 0) { if (msLayerGetAutoStyle(map, layer, layer->class[shape.classindex], &shape) != MS_SUCCESS) { retcode = MS_FAILURE; break; } } else { /* Generic feature style handling as per RFC-61 */ if (msLayerGetFeatureStyle(map, layer, layer->class[shape.classindex], &shape) != MS_SUCCESS) { retcode = MS_FAILURE; break; } } /* __TODO__ For now, we can't cache features with 'AUTO' style */ cache = MS_FALSE; } if (rendermode == MS_ALL_MATCHING_CLASSES) { // Cache is designed to handle only one class. Therefore it is // disabled when using SLD "painters model" rendering mode. cache = MS_FALSE; } /* RFC77 TODO: check return value, may need a more sophisticated if-then * test. */ if (annotate && layer->class[shape.classindex] -> numlabels > 0) { drawmode |= MS_DRAWMODE_LABELS; if (msLayerGetProcessingKey(layer, "LABEL_NO_CLIP")) { drawmode |= MS_DRAWMODE_UNCLIPPEDLABELS; } } if (layer->type == MS_LAYER_LINE && msLayerGetProcessingKey(layer, "POLYLINE_NO_CLIP")) { drawmode |= MS_DRAWMODE_UNCLIPPEDLINES; } if (rendermode == MS_ALL_MATCHING_CLASSES) { // In SLD "painters model" rendering mode, all applicable classes are // actually applied. Coordinates stored in the shape must keep their // original values for the shape to be drawn multiple times. Here the // original shape is saved. msInitShape(&savedShape); msCopyShape(&shape, &savedShape); } if (cache) { styleObj *pStyle = layer->class[shape.classindex]->styles[0]; // first ensure the style properties are bound to the shape // any outlinewidth bindings will then be set if (msBindLayerToShape(layer, &shape, drawmode) != MS_SUCCESS) { retcode = MS_FAILURE; break; } if (pStyle->outlinewidth > 0) { /* * RFC 49 implementation * if an outlinewidth is used: * - augment the style's width to account for the outline width * - swap the style color and outlinecolor * - draw the shape (the outline) in the first pass of the * caching mechanism */ msOutlineRenderingPrepareStyle(pStyle, map, layer, image); } /* draw a single style */ status = msDrawShape(map, layer, &shape, image, 0, drawmode | MS_DRAWMODE_SINGLESTYLE); if (pStyle->outlinewidth > 0) { /* * RFC 49 implementation: switch back the styleobj to its * original state, so the line fill will be drawn in the * second pass of the caching mechanism */ msOutlineRenderingRestoreStyle(pStyle, map, layer, image); } } else { status = msDrawShape(map, layer, &shape, image, -1, drawmode); /* all styles */ } if (rendermode == MS_ALL_MATCHING_CLASSES) { // In SLD "painters model" rendering mode, all applicable classes are // actually applied. Coordinates stored in the shape must keep their // original values for the shape to be drawn multiple times. Here the // original shape is restored. msFreeShape(&shape); msCopyShape(&savedShape, &shape); msFreeShape(&savedShape); } if (status != MS_SUCCESS) { retcode = MS_FAILURE; break; } if (shape.numlines == 0) { /* once clipped the shape didn't need to be drawn */ continue; } if (cache) { if (insertFeatureList(&shpcache, &shape) == NULL) { retcode = MS_FAILURE; /* problem adding to the cache */ break; } } maxnumstyles = MS_MAX(maxnumstyles, layer->class[shape.classindex] -> numstyles); } msFreeShape(&shape); if (classgroup) msFree(classgroup); if (status != MS_DONE || retcode == MS_FAILURE) { msLayerClose(layer); if (shpcache) { freeFeatureList(shpcache); shpcache = NULL; } return MS_FAILURE; } if (shpcache && MS_DRAW_FEATURES(drawmode)) { int s; for (s = 0; s < maxnumstyles; s++) { for (current = shpcache; current; current = current->next) { if (layer->class[current->shape.classindex] -> numstyles > s) { styleObj *pStyle = layer->class[current->shape.classindex]->styles[s]; if (pStyle->_geomtransform.type != MS_GEOMTRANSFORM_NONE) continue; /*skip this as it has already been rendered*/ if (map->scaledenom > 0) { if ((pStyle->maxscaledenom != -1) && (map->scaledenom >= pStyle->maxscaledenom)) continue; if ((pStyle->minscaledenom != -1) && (map->scaledenom < pStyle->minscaledenom)) continue; } if (s == 0 && (pStyle->outlinewidth > 0 || pStyle->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].index != -1) && MS_VALID_COLOR(pStyle->color)) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) { return MS_FAILURE; } } else if (s > 0) { if ((pStyle->outlinewidth > 0 || pStyle->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].index != -1) && MS_VALID_COLOR(pStyle->outlinecolor)) { /* * RFC 49 implementation * if an outlinewidth is used: * - augment the style's width to account for the outline width * - swap the style color and outlinecolor * - draw the shape (the outline) in the first pass of the * caching mechanism */ msOutlineRenderingPrepareStyle(pStyle, map, layer, image); if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) { return MS_FAILURE; } /* * RFC 49 implementation: switch back the styleobj to its * original state, so the line fill will be drawn in the * second pass of the caching mechanism */ msOutlineRenderingRestoreStyle(pStyle, map, layer, image); } /* draw a valid line, i.e. one with a color defined or of type * pixmap*/ if (MS_VALID_COLOR(pStyle->color) || (pStyle->symbol < map->symbolset.numsymbols && (map->symbolset.symbol[pStyle->symbol]->type == MS_SYMBOL_PIXMAP || map->symbolset.symbol[pStyle->symbol]->type == MS_SYMBOL_SVG))) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) return MS_FAILURE; } } } } } freeFeatureList(shpcache); shpcache = NULL; } msLayerClose(layer); return MS_SUCCESS; } /* ** Function to draw a layer IF it already has a result cache associated with it. *Called by msDrawMap and via MapScript. */ int msDrawQueryLayer(mapObj *map, layerObj *layer, imageObj *image) { int i, status; char annotate = MS_TRUE, cache = MS_FALSE; int drawmode = MS_DRAWMODE_FEATURES; shapeObj shape; int maxnumstyles = 1; featureListNodeObjPtr shpcache = NULL, current = NULL; colorObj *colorbuffer = NULL; int *mindistancebuffer = NULL; if (!layer->resultcache) return (msDrawLayer(map, layer, image)); if (!msLayerIsVisible(map, layer)) return (MS_SUCCESS); /* not an error, just nothing to do */ /* conditions may have changed since this layer last drawn, so reset layer->project to recheck projection needs (Bug #673) */ layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); /* set annotation status */ annotate = msEvalContext(map, layer, layer->labelrequires); if (map->scaledenom > 0) { if ((layer->labelmaxscaledenom != -1) && (map->scaledenom >= layer->labelmaxscaledenom)) annotate = MS_FALSE; if ((layer->labelminscaledenom != -1) && (map->scaledenom < layer->labelminscaledenom)) annotate = MS_FALSE; } /* ** Certain query map styles require us to render all features only (MS_NORMAL) *or first (MS_HILITE). With ** single-pass queries we have to make a copy of the layer and work from it *instead. */ if (map->querymap.style == MS_NORMAL || map->querymap.style == MS_HILITE) { layerObj tmp_layer; if (initLayer(&tmp_layer, map) == -1) return (MS_FAILURE); if (msCopyLayer(&tmp_layer, layer) != MS_SUCCESS) return (MS_FAILURE); /* disable the connection pool for this layer */ msLayerSetProcessingKey(&tmp_layer, "CLOSE_CONNECTION", "ALWAYS"); status = msDrawLayer(map, &tmp_layer, image); freeLayer(&tmp_layer); if (map->querymap.style == MS_NORMAL || status != MS_SUCCESS) return (status); } /* if MS_HILITE, alter the one style (always at least 1 style), and set a * MINDISTANCE for the labelObj to avoid duplicates */ if (map->querymap.style == MS_HILITE) { drawmode |= MS_DRAWMODE_QUERY; if (layer->numclasses > 0) { colorbuffer = (colorObj *)msSmallMalloc(layer->numclasses * sizeof(colorObj)); mindistancebuffer = (int *)msSmallMalloc(layer->numclasses * sizeof(int)); } for (i = 0; i < layer->numclasses; i++) { if (layer->type == MS_LAYER_POLYGON && layer->class[i] -> numstyles > 0) { /* alter BOTTOM style since that's almost always the fill */ if (layer->class[i] -> styles == NULL) { msSetError(MS_MISCERR, "Don't know how to draw class %s of layer %s without a " "style definition.", "msDrawQueryLayer()", layer->class[i] -> name, layer -> name); msFree(colorbuffer); msFree(mindistancebuffer); return (MS_FAILURE); } if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> color)) { colorbuffer[i] = layer->class[i] ->styles[0] ->color; /* save the color from the BOTTOM style */ layer->class[i]->styles[0]->color = map->querymap.color; } else if (MS_VALID_COLOR( layer->class[i] -> styles[0] -> outlinecolor)) { colorbuffer[i] = layer->class[i] ->styles[0] ->outlinecolor; /* if no color, save the outlinecolor from the BOTTOM style */ layer->class[i]->styles[0]->outlinecolor = map->querymap.color; } } else if (layer->type == MS_LAYER_LINE && layer->class[i] -> numstyles > 0 && layer -> class[i] -> styles[0] -> outlinewidth > 0) { /* alter BOTTOM style for lines with outlines */ if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> color)) { colorbuffer[i] = layer->class[i] ->styles[0] ->color; /* save the color from the BOTTOM style */ layer->class[i]->styles[0]->color = map->querymap.color; } /* else ??? */ } else if (layer->class[i] -> numstyles > 0) { if (MS_VALID_COLOR( layer->class[i] -> styles[layer->class[i] -> numstyles - 1] -> color)) { colorbuffer[i] = layer->class[i] ->styles[layer->class[i] -> numstyles - 1] ->color; /* save the color from the TOP style */ layer->class[i]->styles[layer->class[i] -> numstyles - 1]->color = map->querymap.color; } else if (MS_VALID_COLOR(layer->class[i] -> styles[layer->class[i] -> numstyles - 1] -> outlinecolor)) { colorbuffer[i] = layer->class[i] ->styles[layer->class[i] -> numstyles - 1] ->outlinecolor; /* if no color, save the outlinecolor from the TOP style */ layer->class[i] ->styles[layer->class[i] -> numstyles - 1] ->outlinecolor = map->querymap.color; } } else if (layer->class[i] -> numlabels > 0) { colorbuffer[i] = layer->class[i]->labels[0]->color; layer->class[i]->labels[0]->color = map->querymap.color; } /* else ??? */ mindistancebuffer[i] = -1; /* RFC77 TODO: only using the first label, is that cool? */ if (layer->class[i] -> numlabels > 0) { mindistancebuffer[i] = layer->class[i]->labels[0]->mindistance; layer->class[i]->labels[0]->mindistance = MS_MAX(0, layer->class[i] -> labels[0] -> mindistance); } } } /* ** Layer was opened as part of the query process, msLayerWhichItems() has also *been run, shapes have been classified - start processing! */ msInitShape(&shape); for (i = 0; i < layer->resultcache->numresults; i++) { status = msLayerGetShape(layer, &shape, &(layer->resultcache->results[i])); if (status != MS_SUCCESS) { msFree(colorbuffer); msFree(mindistancebuffer); return (MS_FAILURE); } shape.classindex = layer->resultcache->results[i].classindex; /* classindex may be -1 here if there was a template at the top level * in this layer and the current shape selected even if it didn't * match any class * * FrankW: classindex is also sometimes 0 even if there are no classes, so * we are careful not to use out of range class values as an index. */ if (shape.classindex == -1 || shape.classindex >= layer->numclasses || layer->class[shape.classindex] -> status == MS_OFF) { msFreeShape(&shape); continue; } cache = MS_FALSE; if (layer->type == MS_LAYER_LINE && (layer->class[shape.classindex] -> numstyles > 1 || (layer->class[shape.classindex] -> numstyles == 1 && (layer->class[shape.classindex] -> styles[0] -> outlinewidth > 0 || layer -> class[shape.classindex] -> styles[0] -> bindings[MS_STYLE_BINDING_OUTLINEWIDTH].index != -1)))) { cache = MS_TRUE; /* only line layers with multiple styles need be cached (I don't think POLYLINE layers need caching - SDL) */ } if (annotate && layer->class[shape.classindex] -> numlabels > 0) { drawmode |= MS_DRAWMODE_LABELS; } if (cache) { styleObj *pStyle = layer->class[shape.classindex]->styles[0]; if (msBindLayerToShape(layer, &shape, drawmode) == MS_SUCCESS) { if (pStyle->outlinewidth > 0) { msOutlineRenderingPrepareStyle(pStyle, map, layer, image); } /* draw only the first style */ status = msDrawShape(map, layer, &shape, image, 0, drawmode | MS_DRAWMODE_SINGLESTYLE); if (pStyle->outlinewidth > 0) { msOutlineRenderingRestoreStyle(pStyle, map, layer, image); } } } else { /* all styles */ status = msDrawShape(map, layer, &shape, image, -1, drawmode); } if (status != MS_SUCCESS) { msLayerClose(layer); msFree(colorbuffer); msFree(mindistancebuffer); return (MS_FAILURE); } if (shape.numlines == 0) { /* once clipped the shape didn't need to be drawn */ msFreeShape(&shape); continue; } if (cache) { if (insertFeatureList(&shpcache, &shape) == NULL) { msFree(colorbuffer); msFree(mindistancebuffer); return (MS_FAILURE); /* problem adding to the cache */ } } maxnumstyles = MS_MAX(maxnumstyles, layer->class[shape.classindex] -> numstyles); msFreeShape(&shape); } if (shpcache) { int s; for (s = 0; s < maxnumstyles; s++) { for (current = shpcache; current; current = current->next) { if (layer->class[current->shape.classindex] -> numstyles > s) { styleObj *pStyle = layer->class[current->shape.classindex]->styles[s]; if (pStyle->_geomtransform.type != MS_GEOMTRANSFORM_NONE) continue; /* skip this as it has already been rendered */ if (map->scaledenom > 0) { if ((pStyle->maxscaledenom != -1) && (map->scaledenom >= pStyle->maxscaledenom)) continue; if ((pStyle->minscaledenom != -1) && (map->scaledenom < pStyle->minscaledenom)) continue; } if (s == 0 && pStyle->outlinewidth > 0 && MS_VALID_COLOR(pStyle->color)) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) { return MS_FAILURE; } } else if (s > 0) { if (pStyle->outlinewidth > 0 && MS_VALID_COLOR(pStyle->outlinecolor)) { msOutlineRenderingPrepareStyle(pStyle, map, layer, image); if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) { return MS_FAILURE; } msOutlineRenderingRestoreStyle(pStyle, map, layer, image); } /* draw a valid line, i.e. one with a color defined or of type * pixmap */ if (MS_VALID_COLOR(pStyle->color) || (pStyle->symbol < map->symbolset.numsymbols && (map->symbolset.symbol[pStyle->symbol]->type == MS_SYMBOL_PIXMAP || map->symbolset.symbol[pStyle->symbol]->type == MS_SYMBOL_SVG))) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) return MS_FAILURE; } } } } } freeFeatureList(shpcache); shpcache = NULL; } /* if MS_HILITE, restore color and mindistance values */ if (map->querymap.style == MS_HILITE) { for (i = 0; i < layer->numclasses; i++) { if (layer->type == MS_LAYER_POLYGON && layer->class[i] -> numstyles > 0) { if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> color)) layer->class[i]->styles[0]->color = colorbuffer[i]; else if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> outlinecolor)) layer->class[i]->styles[0]->outlinecolor = colorbuffer[i]; /* if no color, restore outlinecolor for the BOTTOM style */ } else if (layer->type == MS_LAYER_LINE && layer->class[i] -> numstyles > 0 && layer -> class[i] -> styles[0] -> outlinewidth > 0) { if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> color)) layer->class[i]->styles[0]->color = colorbuffer[i]; } else if (layer->class[i] -> numstyles > 0) { if (MS_VALID_COLOR( layer->class[i] -> styles[layer->class[i] -> numstyles - 1] -> color)) layer->class[i]->styles[layer->class[i] -> numstyles - 1]->color = colorbuffer[i]; else if (MS_VALID_COLOR( layer->class[i] -> styles[layer->class[i] -> numstyles - 1] -> outlinecolor)) layer->class[i] ->styles[layer->class[i] -> numstyles - 1] ->outlinecolor = colorbuffer[i]; /* if no color, restore outlinecolor for the TOP style */ } else if (layer->class[i] -> numlabels > 0) { if (MS_VALID_COLOR(layer->class[i] -> labels[0] -> color)) layer->class[i]->labels[0]->color = colorbuffer[i]; } if (layer->class[i] -> numlabels > 0) layer->class[i]->labels[0]->mindistance = mindistancebuffer[i]; /* RFC77 TODO: again, only using the first label, is that cool? */ } msFree(colorbuffer); msFree(mindistancebuffer); } return (MS_SUCCESS); } /** * msDrawRasterLayerPlugin() */ static int msDrawRasterLayerPlugin(mapObj *map, layerObj *layer, imageObj *image) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image); rasterBufferObj *rb = msSmallCalloc(1, sizeof(rasterBufferObj)); int ret; if (renderer->supports_pixel_buffer) { if (MS_SUCCESS != renderer->getRasterBufferHandle(image, rb)) { msSetError(MS_MISCERR, "renderer failed to extract raster buffer", "msDrawRasterLayer()"); return MS_FAILURE; } ret = msDrawRasterLayerLow(map, layer, image, rb); } else { if (MS_SUCCESS != renderer->initializeRasterBuffer( rb, image->width, image->height, MS_IMAGEMODE_RGBA)) { msSetError(MS_MISCERR, "renderer failed to create raster buffer", "msDrawRasterLayer()"); return MS_FAILURE; } ret = msDrawRasterLayerLow(map, layer, image, rb); if (ret == 0) { ret = renderer->mergeRasterBuffer(image, rb, 1.0, 0, 0, 0, 0, rb->width, rb->height); } msFreeRasterBuffer(rb); } #define RB_GET_R(rb, x, y) \ *((rb)->data.rgba.r + (x) * (rb)->data.rgba.pixel_step + \ (y) * (rb)->data.rgba.row_step) #define RB_GET_G(rb, x, y) \ *((rb)->data.rgba.g + (x) * (rb)->data.rgba.pixel_step + \ (y) * (rb)->data.rgba.row_step) #define RB_GET_B(rb, x, y) \ *((rb)->data.rgba.b + (x) * (rb)->data.rgba.pixel_step + \ (y) * (rb)->data.rgba.row_step) #define RB_GET_A(rb, x, y) \ *((rb)->data.rgba.a + (x) * (rb)->data.rgba.pixel_step + \ (y) * (rb)->data.rgba.row_step) free(rb); return ret; } /** * Generic function to render raster layers. */ int msDrawRasterLayer(mapObj *map, layerObj *layer, imageObj *image) { int rv = MS_FAILURE; if (!image || !map || !layer) { return rv; } /* RFC-86 Scale dependent token replacements*/ rv = msLayerApplyScaletokens(layer, (layer->map) ? layer->map->scaledenom : -1); if (rv != MS_SUCCESS) return rv; if (MS_RENDERER_PLUGIN(image->format)) rv = msDrawRasterLayerPlugin(map, layer, image); else if (MS_RENDERER_RAWDATA(image->format)) rv = msDrawRasterLayerLow(map, layer, image, NULL); msLayerRestoreFromScaletokens(layer); return rv; } /** * msDrawWMSLayer() * * Draw a single WMS layer. * Multiple WMS layers in a map are preloaded and then drawn using * msDrawWMSLayerLow() */ #ifdef USE_WMS_LYR int msDrawWMSLayer(mapObj *map, layerObj *layer, imageObj *image) { int nStatus = MS_FAILURE; if (image && map && layer) { /* ------------------------------------------------------------------ * Start by downloading the layer * ------------------------------------------------------------------ */ httpRequestObj asReqInfo[2]; int numReq = 0; msHTTPInitRequestObj(asReqInfo, 2); if (msPrepareWMSLayerRequest(1, map, layer, 1, 0, NULL, 0, 0, 0, NULL, asReqInfo, &numReq) == MS_FAILURE || msOWSExecuteRequests(asReqInfo, numReq, map, MS_TRUE) == MS_FAILURE) { return MS_FAILURE; } /* ------------------------------------------------------------------ * Then draw layer based on output format * ------------------------------------------------------------------ */ if (MS_RENDERER_PLUGIN(image->format)) nStatus = msDrawWMSLayerLow(1, asReqInfo, numReq, map, layer, image); else if (MS_RENDERER_RAWDATA(image->format)) nStatus = msDrawWMSLayerLow(1, asReqInfo, numReq, map, layer, image); else { msSetError(MS_WMSCONNERR, "Output format '%s' doesn't support WMS layers.", "msDrawWMSLayer()", image->format->name); nStatus = MS_SUCCESS; /* Should we fail if output doesn't support WMS? */ } /* Cleanup */ msHTTPFreeRequestObj(asReqInfo, numReq); } return nStatus; } #endif int circleLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape) { pointObj center; double r; int s; int c = shape->classindex; if (shape->numlines != 1) return (MS_SUCCESS); /* invalid shape */ if (shape->line[0].numpoints != 2) return (MS_SUCCESS); /* invalid shape */ center.x = (shape->line[0].point[0].x + shape->line[0].point[1].x) / 2.0; center.y = (shape->line[0].point[0].y + shape->line[0].point[1].y) / 2.0; r = MS_ABS(center.x - shape->line[0].point[0].x); if (r == 0) r = MS_ABS(center.y - shape->line[0].point[0].y); if (r == 0) return (MS_SUCCESS); if (layer->transform == MS_TRUE) { if (layer->project) msProjectPoint(&layer->projection, &map->projection, ¢er); center.x = MS_MAP2IMAGE_X(center.x, map->extent.minx, map->cellsize); center.y = MS_MAP2IMAGE_Y(center.y, map->extent.maxy, map->cellsize); r /= map->cellsize; } else msOffsetPointRelativeTo(¢er, layer); for (s = 0; s < layer->class[c] -> numstyles; s++) { if (msScaleInBounds(map->scaledenom, layer->class[c] -> styles[s] -> minscaledenom, layer -> class[c] -> styles[s] -> maxscaledenom)) if (MS_UNLIKELY(MS_FAILURE == msCircleDrawShadeSymbol( map, image, ¢er, r, layer->class[c] -> styles[s], layer -> class[c] -> styles[s] -> scalefactor))) { return MS_FAILURE; } } return MS_SUCCESS; /* TODO: need to handle circle annotation */ } static int pointLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape, int drawmode) { int l, c = shape->classindex, j, i, s; pointObj *point; int ret = MS_FAILURE; if (layer->project && layer->transform == MS_TRUE) { reprojectionObj *reprojector = msLayerGetReprojectorToMap(layer, map); if (reprojector == NULL) { return MS_FAILURE; } msProjectShapeEx(reprojector, shape); } // Only take into account map rotation if the label and style angles are // non-zero. if (map->gt.rotation_angle) { for (l = 0; l < layer->class[c] -> numlabels; l++) { if (layer->class[c] -> labels[l] -> angle != 0) layer->class[c]->labels[l]->angle -= map->gt.rotation_angle; } for (s = 0; s < layer->class[c] -> numstyles; s++) { if (layer->class[c] -> styles[s] -> angle != 0) layer->class[c]->styles[s]->angle -= map->gt.rotation_angle; } } for (j = 0; j < shape->numlines; j++) { for (i = 0; i < shape->line[j].numpoints; i++) { point = &(shape->line[j].point[i]); if (layer->transform == MS_TRUE) { if (!msPointInRect(point, &map->extent)) continue; /* next point */ msTransformPoint(point, &map->extent, map->cellsize, image); } else msOffsetPointRelativeTo(point, layer); if (MS_DRAW_FEATURES(drawmode)) { for (s = 0; s < layer->class[c] -> numstyles; s++) { if (msScaleInBounds(map->scaledenom, layer->class[c] -> styles[s] -> minscaledenom, layer -> class[c] -> styles[s] -> maxscaledenom)) if (MS_UNLIKELY( MS_FAILURE == msDrawMarkerSymbol( map, image, point, layer->class[c] -> styles[s], layer -> class[c] -> styles[s] -> scalefactor))) { goto end; } } } if (MS_DRAW_LABELS(drawmode)) { if (layer->labelcache) { if (msAddLabelGroup(map, image, layer, c, shape, point, -1) != MS_SUCCESS) goto end; } else { for (l = 0; l < layer->class[c] -> numlabels; l++) if (msGetLabelStatus(map, layer, shape, layer->class[c] -> labels[l]) == MS_ON) { char *annotext = msShapeGetLabelAnnotation( layer, shape, layer->class[c] -> labels[l]); if (MS_UNLIKELY(MS_FAILURE == msDrawLabel(map, image, *point, annotext, layer->class[c] -> labels[l], layer -> class[c] -> labels[l] -> scalefactor))) { goto end; } } } } } } ret = MS_SUCCESS; end: if (map->gt.rotation_angle) { for (l = 0; l < layer->class[c] -> numlabels; l++) { if (layer->class[c] -> labels[l] -> angle != 0) layer->class[c]->labels[l]->angle += map->gt.rotation_angle; } for (s = 0; s < layer->class[c] -> numstyles; s++) { if (layer->class[c] -> styles[s] -> angle != 0) layer->class[c]->styles[s]->angle += map->gt.rotation_angle; } } return ret; } int lineLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape, shapeObj *anno_shape, shapeObj *unclipped_shape, int style, int drawmode) { int c = shape->classindex; int ret = MS_SUCCESS; /* RFC48: loop through the styles, and pass off to the type-specific function if the style has an appropriate type */ if (MS_DRAW_FEATURES(drawmode)) { for (int s = 0; s < layer->class[c] -> numstyles; s++) { if (msScaleInBounds(map->scaledenom, layer->class[c] -> styles[s] -> minscaledenom, layer -> class[c] -> styles[s] -> maxscaledenom)) { if (layer->class[c] -> styles[s] -> _geomtransform.type != MS_GEOMTRANSFORM_NONE) { if (MS_UNLIKELY(MS_FAILURE == msDrawTransformedShape( map, image, unclipped_shape, layer->class[c] -> styles[s], layer -> class[c] -> styles[s] -> scalefactor))) { return MS_FAILURE; } } else if (!MS_DRAW_SINGLESTYLE(drawmode) || s == style) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol( map, image, shape, layer->class[c] -> styles[s], layer -> class[c] -> styles[s] -> scalefactor))) { return MS_FAILURE; } } } } } if (MS_DRAW_LABELS(drawmode)) { for (int l = 0; l < layer->class[c] -> numlabels; l++) { labelObj *label = layer->class[c]->labels[l]; textSymbolObj ts; char *annotext; if (!msGetLabelStatus(map, layer, shape, label)) { continue; } annotext = msShapeGetLabelAnnotation(layer, anno_shape, label); if (!annotext) continue; initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString( &ts, label, annotext, label->scalefactor, image->resolutionfactor, layer->labelcache); if (label->anglemode == MS_FOLLOW) { /* bug #1620 implementation */ struct label_follow_result lfr; if (!layer->labelcache) { msSetError(MS_MISCERR, "Angle mode 'FOLLOW' is supported only with labelcache on", "msDrawShape()"); ret = MS_FAILURE; goto line_cleanup; } memset(&lfr, 0, sizeof(lfr)); msPolylineLabelPath(map, image, anno_shape, &ts, label, &lfr); for (int i = 0; i < lfr.num_follow_labels; i++) { if (msAddLabel(map, image, label, layer->index, c, anno_shape, NULL, -1, lfr.follow_labels[i]) != MS_SUCCESS) { ret = MS_FAILURE; goto line_cleanup; } } free(lfr.follow_labels); for (int i = 0; i < lfr.lar.num_label_points; i++) { textSymbolObj *ts_auto = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts_auto); msCopyTextSymbol(ts_auto, &ts); ts_auto->rotation = lfr.lar.angles[i]; { if (msAddLabel(map, image, label, layer->index, c, anno_shape, &lfr.lar.label_points[i], -1, ts_auto) != MS_SUCCESS) { ret = MS_FAILURE; free(lfr.lar.angles); free(lfr.lar.label_points); goto line_cleanup; } } } free(lfr.lar.angles); free(lfr.lar.label_points); } else { struct label_auto_result lar; memset(&lar, 0, sizeof(struct label_auto_result)); ret = msPolylineLabelPoint(map, anno_shape, &ts, label, &lar, image->resolutionfactor); if (MS_UNLIKELY(MS_FAILURE == ret)) goto line_cleanup; if (label->angle != 0) label->angle -= map->gt.rotation_angle; /* apply rotation angle */ for (int i = 0; i < lar.num_label_points; i++) { textSymbolObj *ts_auto = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts_auto); msCopyTextSymbol(ts_auto, &ts); ts_auto->rotation = lar.angles[i]; if (layer->labelcache) { if (msAddLabel(map, image, label, layer->index, c, anno_shape, &lar.label_points[i], -1, ts_auto) != MS_SUCCESS) { ret = MS_FAILURE; free(lar.angles); free(lar.label_points); freeTextSymbol(ts_auto); free(ts_auto); goto line_cleanup; } } else { if (!ts_auto->textpath) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts_auto))) { ret = MS_FAILURE; free(lar.angles); free(lar.label_points); freeTextSymbol(ts_auto); free(ts_auto); goto line_cleanup; } } ret = msDrawTextSymbol(map, image, lar.label_points[i], ts_auto); freeTextSymbol(ts_auto); free(ts_auto); /* TODO RFC98: could we not re-use the original ts * instead of duplicating into ts_auto ? we cannot * for now, as the rendering code will modify the * glyph positions to apply the labelpoint and * rotation offsets */ ts_auto = NULL; if (MS_UNLIKELY(MS_FAILURE == ret)) goto line_cleanup; } } free(lar.angles); free(lar.label_points); } line_cleanup: /* clean up and reset */ if (ret == MS_FAILURE) { break; /* from the label looping */ } freeTextSymbol(&ts); } /* next label */ } return ret; } int polygonLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape, shapeObj *anno_shape, shapeObj *unclipped_shape, int drawmode) { int c = shape->classindex; pointObj annopnt = {0}; // initialize int i; if (MS_DRAW_FEATURES(drawmode)) { for (i = 0; i < layer->class[c] -> numstyles; i++) { if (msScaleInBounds(map->scaledenom, layer->class[c] -> styles[i] -> minscaledenom, layer -> class[c] -> styles[i] -> maxscaledenom)) { if (layer->class[c] -> styles[i] -> _geomtransform.type == MS_GEOMTRANSFORM_NONE) { if (MS_UNLIKELY(MS_FAILURE == msDrawShadeSymbol( map, image, shape, layer->class[c] -> styles[i], layer -> class[c] -> styles[i] -> scalefactor))) { return MS_FAILURE; } } else { if (MS_UNLIKELY(MS_FAILURE == msDrawTransformedShape( map, image, unclipped_shape, layer->class[c] -> styles[i], layer -> class[c] -> styles[i] -> scalefactor))) { return MS_FAILURE; } } } } } if (MS_DRAW_LABELS(drawmode)) { if (layer->class[c] -> numlabels > 0) { double minfeaturesize = layer->class[c]->labels[0]->minfeaturesize * image->resolutionfactor; if (msPolygonLabelPoint(anno_shape, &annopnt, minfeaturesize) == MS_SUCCESS) { for (i = 0; i < layer->class[c] -> numlabels; i++) if (layer->class[c] -> labels[i] -> angle != 0) layer->class[c]->labels[i]->angle -= map->gt.rotation_angle; /* TODO: is this correct ??? */ if (layer->labelcache) { if (msAddLabelGroup(map, image, layer, c, anno_shape, &annopnt, MS_MIN(shape->bounds.maxx - shape->bounds.minx, shape->bounds.maxy - shape->bounds.miny)) != MS_SUCCESS) { return MS_FAILURE; } } else { for (i = 0; i < layer->class[c] -> numlabels; i++) if (msGetLabelStatus(map, layer, shape, layer->class[c] -> labels[i]) == MS_ON) { char *annotext = msShapeGetLabelAnnotation( layer, shape, layer->class[c] -> labels[i]); /*ownership taken by msDrawLabel, no need to free */ if (MS_UNLIKELY(MS_FAILURE == msDrawLabel(map, image, annopnt, annotext, layer->class[c] -> labels[i], layer -> class[c] -> labels[i] -> scalefactor))) { return MS_FAILURE; } } } } } } return MS_SUCCESS; } /* ** Function to render an individual shape, the style variable enables/disables *the drawing of a single style ** versus a single style. This is necessary when drawing entire layers as proper *overlay can only be achieved ** through caching. "querymapMode" parameter is used to tell msBindLayerToShape *to not override the ** QUERYMAP HILITE color. */ int msDrawShape(mapObj *map, layerObj *layer, shapeObj *shape, imageObj *image, int style, int drawmode) { int c, s, ret = MS_SUCCESS; shapeObj *anno_shape, *unclipped_shape = shape; int bNeedUnclippedShape = MS_FALSE; int bNeedUnclippedAnnoShape = MS_FALSE; int bShapeNeedsClipping = MS_TRUE; if (shape->numlines == 0 || shape->type == MS_SHAPE_NULL) return MS_SUCCESS; c = shape->classindex; /* Before we do anything else, we will check for a rangeitem. If its there, we need to change the style's color to map the range to the shape */ for (s = 0; s < layer->class[c] -> numstyles; s++) { styleObj *style = layer->class[c]->styles[s]; if (style->rangeitem != NULL) msShapeToRange((layer->class[c] -> styles[s]), shape); } /* circle and point layers go through their own treatment */ if (layer->type == MS_LAYER_CIRCLE) { if (msBindLayerToShape(layer, shape, drawmode) != MS_SUCCESS) return MS_FAILURE; msDrawStartShape(map, layer, image, shape); ret = circleLayerDrawShape(map, image, layer, shape); msDrawEndShape(map, layer, image, shape); return ret; } else if (layer->type == MS_LAYER_POINT || layer->type == MS_LAYER_RASTER) { if (msBindLayerToShape(layer, shape, drawmode) != MS_SUCCESS) return MS_FAILURE; msDrawStartShape(map, layer, image, shape); ret = pointLayerDrawShape(map, image, layer, shape, drawmode); msDrawEndShape(map, layer, image, shape); return ret; } if (layer->type == MS_LAYER_POLYGON && shape->type != MS_SHAPE_POLYGON) { msSetError( MS_MISCERR, "Only polygon shapes can be drawn using a polygon layer definition.", "polygonLayerDrawShape()"); return (MS_FAILURE); } if (layer->type == MS_LAYER_LINE && shape->type != MS_SHAPE_POLYGON && shape->type != MS_SHAPE_LINE) { msSetError(MS_MISCERR, "Only polygon or line shapes can be drawn using a line layer " "definition.", "msDrawShape()"); return (MS_FAILURE); } if (layer->project && layer->transform == MS_TRUE) { reprojectionObj *reprojector = msLayerGetReprojectorToMap(layer, map); if (reprojector == NULL) { return MS_FAILURE; } msProjectShapeEx(reprojector, shape); } /* check if we'll need the unclipped shape */ if (shape->type != MS_SHAPE_POINT) { if (MS_DRAW_FEATURES(drawmode)) { for (s = 0; s < layer->class[c] -> numstyles; s++) { styleObj *style = layer->class[c]->styles[s]; if (style->_geomtransform.type != MS_GEOMTRANSFORM_NONE) bNeedUnclippedShape = MS_TRUE; } } /* check if we need to clip the shape */ if (shape->bounds.minx < map->extent.minx || shape->bounds.miny < map->extent.miny || shape->bounds.maxx > map->extent.maxx || shape->bounds.maxy > map->extent.maxy) { bShapeNeedsClipping = MS_TRUE; } if (MS_DRAW_LABELS(drawmode) && MS_DRAW_UNCLIPPED_LABELS(drawmode)) { bNeedUnclippedAnnoShape = MS_TRUE; bNeedUnclippedShape = MS_TRUE; } if (MS_DRAW_UNCLIPPED_LINES(drawmode)) { bShapeNeedsClipping = MS_FALSE; } } else { bShapeNeedsClipping = MS_FALSE; } if (layer->transform == MS_TRUE && bShapeNeedsClipping) { /* compute the size of the clipping buffer, in pixels. This buffer must account for the size of symbols drawn to avoid artifacts around the image edges */ int clip_buf = 0; int s; rectObj cliprect; for (s = 0; s < layer->class[c] -> numstyles; s++) { double maxsize, maxunscaledsize; symbolObj *symbol; styleObj *style = layer->class[c]->styles[s]; if (!MS_IS_VALID_ARRAY_INDEX(style->symbol, map->symbolset.numsymbols)) { msSetError(MS_SYMERR, "Invalid symbol index: %d", "msDrawShape()", style->symbol); return MS_FAILURE; } symbol = map->symbolset.symbol[style->symbol]; if (symbol->type == MS_SYMBOL_PIXMAP) { if (MS_SUCCESS != msPreloadImageSymbol(MS_MAP_RENDERER(map), symbol)) return MS_FAILURE; } else if (symbol->type == MS_SYMBOL_SVG) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) if (MS_SUCCESS != msPreloadSVGSymbol(symbol)) return MS_FAILURE; #else msSetError(MS_SYMERR, "SVG symbol support is not enabled.", "msDrawShape()"); return MS_FAILURE; #endif } maxsize = MS_MAX(msSymbolGetDefaultSize(symbol), MS_MAX(style->size, style->width)); maxunscaledsize = MS_MAX(style->minsize * image->resolutionfactor, style->minwidth * image->resolutionfactor); if (shape->type == MS_SHAPE_POLYGON && !IS_PARALLEL_OFFSET(style->offsety)) { maxsize += MS_MAX(fabs(style->offsety), fabs(style->offsetx)); } clip_buf = MS_MAX( clip_buf, MS_NINT(MS_MAX(maxsize * style->scalefactor, maxunscaledsize) + 1)); } /* if we need a copy of the unclipped shape, transform first, then clip to * avoid transforming twice */ if (bNeedUnclippedShape) { msTransformShape(shape, map->extent, map->cellsize, image); if (shape->numlines == 0) return MS_SUCCESS; msComputeBounds(shape); /* TODO: there's an optimization here that can be implemented: - no need to allocate unclipped_shape for each call to this function - the calls to msClipXXXRect will discard the original lineObjs, whereas we have just copied them because they where needed. These two functions could be changed so they are instructed not to free the original lineObjs. */ unclipped_shape = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(unclipped_shape); msCopyShape(shape, unclipped_shape); if (shape->type == MS_SHAPE_POLYGON) { /* #179: additional buffer for polygons */ clip_buf += 2; } cliprect.minx = cliprect.miny = -clip_buf; cliprect.maxx = image->width + clip_buf; cliprect.maxy = image->height + clip_buf; if (shape->type == MS_SHAPE_POLYGON) { msClipPolygonRect(shape, cliprect); } else { assert(shape->type == MS_SHAPE_LINE); msClipPolylineRect(shape, cliprect); } if (bNeedUnclippedAnnoShape) { anno_shape = unclipped_shape; } else { anno_shape = shape; } } else { /* clip first, then transform. This means we are clipping in geographical * space */ double clip_buf_d; if (shape->type == MS_SHAPE_POLYGON) { /* * add a small buffer around the cliping rectangle to * avoid lines around the edges : #179 */ clip_buf += 2; } clip_buf_d = clip_buf * map->cellsize; cliprect.minx = map->extent.minx - clip_buf_d; cliprect.miny = map->extent.miny - clip_buf_d; cliprect.maxx = map->extent.maxx + clip_buf_d; cliprect.maxy = map->extent.maxy + clip_buf_d; if (shape->type == MS_SHAPE_POLYGON) { msClipPolygonRect(shape, cliprect); } else { assert(shape->type == MS_SHAPE_LINE); msClipPolylineRect(shape, cliprect); } msTransformShape(shape, map->extent, map->cellsize, image); msComputeBounds(shape); anno_shape = shape; } } else { /* the shape is fully in the map extent, * or is a point type layer where out of bounds points are treated * differently*/ if (layer->transform == MS_TRUE) { msTransformShape(shape, map->extent, map->cellsize, image); msComputeBounds(shape); } else { msOffsetShapeRelativeTo(shape, layer); } anno_shape = shape; } if (shape->numlines == 0) { ret = MS_SUCCESS; /* error message is set in msBindLayerToShape() */ goto draw_shape_cleanup; } // if we are only drawing a single style then it may have been modified // outside this function by msOutlineRenderingPrepareStyle and we don't want // to rebind the style to the layer if (style != 0) { if (msBindLayerToShape(layer, shape, drawmode) != MS_SUCCESS) { ret = MS_FAILURE; /* error message is set in msBindLayerToShape() */ goto draw_shape_cleanup; } } switch (layer->type) { case MS_LAYER_LINE: msDrawStartShape(map, layer, image, shape); ret = lineLayerDrawShape(map, image, layer, shape, anno_shape, unclipped_shape, style, drawmode); break; case MS_LAYER_POLYGON: msDrawStartShape(map, layer, image, shape); ret = polygonLayerDrawShape(map, image, layer, shape, anno_shape, unclipped_shape, drawmode); break; case MS_LAYER_POINT: case MS_LAYER_RASTER: assert(0); // bug ! default: msSetError(MS_MISCERR, "Unknown layer type.", "msDrawShape()"); ret = MS_FAILURE; } draw_shape_cleanup: msDrawEndShape(map, layer, image, shape); if (unclipped_shape != shape) { msFreeShape(unclipped_shape); msFree(unclipped_shape); } return ret; } /* ** Function to render an individual point, used as a helper function for *mapscript only. Since a point ** can't carry attributes you can't do attribute based font size or angle. */ int msDrawPoint(mapObj *map, layerObj *layer, pointObj *point, imageObj *image, int classindex, char *labeltext) { int s, ret; classObj *theclass = NULL; labelObj *label = NULL; if (layer->transform == MS_TRUE && layer->project && msProjectionsDiffer(&(layer->projection), &(map->projection))) { msProjectPoint(&(layer->projection), &(map->projection), point); } if (classindex > layer->numclasses) { msSetError(MS_MISCERR, "Invalid classindex (%d)", "msDrawPoint()", classindex); return MS_FAILURE; } theclass = layer->class[classindex]; if (labeltext && theclass->numlabels > 0) { label = theclass->labels[0]; } switch (layer->type) { case MS_LAYER_POINT: if (layer->transform == MS_TRUE) { if (!msPointInRect(point, &map->extent)) return (0); point->x = MS_MAP2IMAGE_X(point->x, map->extent.minx, map->cellsize); point->y = MS_MAP2IMAGE_Y(point->y, map->extent.maxy, map->cellsize); } else msOffsetPointRelativeTo(point, layer); for (s = 0; s < theclass->numstyles; s++) { if (msScaleInBounds(map->scaledenom, theclass->styles[s]->minscaledenom, theclass->styles[s]->maxscaledenom)) if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, image, point, theclass->styles[s], theclass->styles[s]->scalefactor))) { return MS_FAILURE; } } if (label && labeltext && *labeltext) { textSymbolObj *ts = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts); msPopulateTextSymbolForLabelAndString( ts, label, msStrdup(labeltext), label->scalefactor, image->resolutionfactor, layer->labelcache); if (layer->labelcache) { if (msAddLabel(map, image, label, layer->index, classindex, NULL, point, -1, ts) != MS_SUCCESS) { return (MS_FAILURE); } } else { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts))) { freeTextSymbol(ts); free(ts); return MS_FAILURE; } ret = msDrawTextSymbol(map, image, *point, ts); freeTextSymbol(ts); free(ts); if (MS_UNLIKELY(ret == MS_FAILURE)) return MS_FAILURE; } } break; default: break; /* don't do anything with layer of other types */ } return (MS_SUCCESS); /* all done, no cleanup */ } /* ** Draws a single label independently of the label cache. No collision avoidance *is performed. */ int msDrawLabel(mapObj *map, imageObj *image, pointObj labelPnt, char *string, labelObj *label, double scalefactor) { shapeObj labelPoly; label_bounds lbounds = {0}; lineObj labelPolyLine; pointObj labelPolyPoints[5]; textSymbolObj ts = {0}; int needLabelPoly = MS_TRUE; int needLabelPoint = MS_TRUE; int haveLabelText = MS_TRUE; if (!string || !*string) haveLabelText = MS_FALSE; if (haveLabelText) { initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString(&ts, label, string, scalefactor, image->resolutionfactor, 0); if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, &ts))) { freeTextSymbol(&ts); return MS_FAILURE; } } labelPoly.line = &labelPolyLine; /* setup the label polygon structure */ labelPoly.numlines = 1; lbounds.poly = &labelPolyLine; /* setup the label polygon structure */ labelPoly.line->point = labelPolyPoints; labelPoly.line->numpoints = 5; if (label->position != MS_XY) { pointObj p = {0}; if (label->numstyles > 0) { int i; for (i = 0; i < label->numstyles; i++) { if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT || label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_NONE) { if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, image, &labelPnt, label->styles[i], scalefactor))) { if (haveLabelText) freeTextSymbol(&ts); return MS_FAILURE; } } else if (haveLabelText && (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY || label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER)) { if (needLabelPoly) { p = get_metrics(&labelPnt, label->position, ts.textpath, label->offsetx * ts.scalefactor, label->offsety * ts.scalefactor, ts.rotation, 1, &lbounds); if (!lbounds.poly) { /* we need the full shape to draw the label background */ labelPolyPoints[0].x = labelPolyPoints[4].x = lbounds.bbox.minx; labelPolyPoints[0].y = labelPolyPoints[4].y = lbounds.bbox.miny; labelPolyPoints[1].x = lbounds.bbox.minx; labelPolyPoints[1].y = lbounds.bbox.maxy; labelPolyPoints[2].x = lbounds.bbox.maxx; labelPolyPoints[2].y = lbounds.bbox.maxy; labelPolyPoints[3].x = lbounds.bbox.maxx; labelPolyPoints[3].y = lbounds.bbox.miny; } needLabelPoint = MS_FALSE; /* don't re-compute */ needLabelPoly = MS_FALSE; } if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (MS_UNLIKELY(MS_FAILURE == msDrawShadeSymbol(map, image, &labelPoly, label->styles[i], ts.scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } else { pointObj labelCenter; labelCenter.x = (lbounds.bbox.maxx + lbounds.bbox.minx) / 2; labelCenter.y = (lbounds.bbox.maxy + lbounds.bbox.miny) / 2; if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol( map, image, &labelCenter, label->styles[i], scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } } else { msSetError(MS_MISCERR, "Unknown label geomtransform %s", "msDrawLabel()", label->styles[i]->_geomtransform.string); if (haveLabelText) freeTextSymbol(&ts); return MS_FAILURE; } } } if (haveLabelText) { if (needLabelPoint) p = get_metrics(&labelPnt, label->position, ts.textpath, label->offsetx * ts.scalefactor, label->offsety * ts.scalefactor, ts.rotation, 0, &lbounds); /* draw the label text */ if (MS_UNLIKELY(MS_FAILURE == msDrawTextSymbol(map, image, p, &ts))) { freeTextSymbol(&ts); return MS_FAILURE; } } } else { labelPnt.x += label->offsetx * ts.scalefactor; labelPnt.y += label->offsety * ts.scalefactor; if (label->numstyles > 0) { int i; for (i = 0; i < label->numstyles; i++) { if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT || label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_NONE) { if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, image, &labelPnt, label->styles[i], scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } else if (haveLabelText && (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY || label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER)) { if (needLabelPoly) { get_metrics(&labelPnt, label->position, ts.textpath, label->offsetx * ts.scalefactor, label->offsety * ts.scalefactor, ts.rotation, 1, &lbounds); needLabelPoly = MS_FALSE; /* don't re-compute */ if (!lbounds.poly) { /* we need the full shape to draw the label background */ labelPolyPoints[0].x = labelPolyPoints[4].x = lbounds.bbox.minx; labelPolyPoints[0].y = labelPolyPoints[4].y = lbounds.bbox.miny; labelPolyPoints[1].x = lbounds.bbox.minx; labelPolyPoints[1].y = lbounds.bbox.maxy; labelPolyPoints[2].x = lbounds.bbox.maxx; labelPolyPoints[2].y = lbounds.bbox.maxy; labelPolyPoints[3].x = lbounds.bbox.maxx; labelPolyPoints[3].y = lbounds.bbox.miny; } } if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (MS_UNLIKELY(MS_FAILURE == msDrawShadeSymbol(map, image, &labelPoly, label->styles[i], scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } else { pointObj labelCenter; labelCenter.x = (lbounds.bbox.maxx + lbounds.bbox.minx) / 2; labelCenter.y = (lbounds.bbox.maxy + lbounds.bbox.miny) / 2; if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol( map, image, &labelCenter, label->styles[i], scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } } else { msSetError(MS_MISCERR, "Unknown label geomtransform %s", "msDrawLabel()", label->styles[i]->_geomtransform.string); if (haveLabelText) freeTextSymbol(&ts); return MS_FAILURE; } } } if (haveLabelText) { /* draw the label text */ if (MS_UNLIKELY(MS_FAILURE == msDrawTextSymbol(map, image, labelPnt, &ts))) { freeTextSymbol(&ts); return MS_FAILURE; } } } if (haveLabelText) freeTextSymbol(&ts); return MS_SUCCESS; } static inline void offset_bbox(const rectObj *from, rectObj *to, double ox, double oy) { to->minx = from->minx + ox; to->miny = from->miny + oy; to->maxx = from->maxx + ox; to->maxy = from->maxy + oy; } static inline void offset_label_bounds(const label_bounds *from, label_bounds *to, double ox, double oy) { if (from->poly) { int i; for (i = 0; i < from->poly->numpoints; i++) { to->poly->point[i].x = from->poly->point[i].x + ox; to->poly->point[i].y = from->poly->point[i].y + oy; } to->poly->numpoints = from->poly->numpoints; } else { to->poly = NULL; } offset_bbox(&from->bbox, &to->bbox, ox, oy); } /* private shortcut function to try a leader offsetted label * the caller must ensure that scratch->poly->points has been sufficiently * allocated to hold the points from the cachePtr's label_bounds */ void offsetAndTest(mapObj *map, labelCacheMemberObj *cachePtr, double ox, double oy, int priority, int label_idx, label_bounds *scratch) { int i, j, status; pointObj leaderpt; lineObj *scratch_line = scratch->poly; for (i = 0; i < cachePtr->numtextsymbols; i++) { textSymbolObj *ts = cachePtr->textsymbols[i]; if (ts->textpath) { offset_label_bounds(&ts->textpath->bounds, scratch, ox, oy); status = msTestLabelCacheCollisions(map, cachePtr, scratch, priority, label_idx); if (!status) { return; } } for (j = 0; j < ts->label->numstyles; j++) { if (ts->label->styles[j]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { scratch->poly = scratch_line; offset_label_bounds(ts->style_bounds[j], scratch, ox, oy); status = msTestLabelCacheCollisions(map, cachePtr, scratch, priority, label_idx); if (!status) { return; } } } } leaderpt.x = cachePtr->point.x + ox; leaderpt.y = cachePtr->point.y + oy; leaderpt.z = 0; leaderpt.m = 0; status = msTestLabelCacheLeaderCollision(map, &cachePtr->point, &leaderpt); if (!status) { return; } /* the current offset is ok */ cachePtr->leaderbbox = msSmallMalloc(sizeof(rectObj)); cachePtr->leaderline = msSmallMalloc(sizeof(lineObj)); cachePtr->leaderline->point = msSmallMalloc(2 * sizeof(pointObj)); cachePtr->leaderline->numpoints = 2; cachePtr->leaderline->point[0] = cachePtr->point; cachePtr->leaderline->point[1] = leaderpt; cachePtr->leaderbbox->minx = MS_MIN(leaderpt.x, cachePtr->point.x); cachePtr->leaderbbox->maxx = MS_MAX(leaderpt.x, cachePtr->point.x); cachePtr->leaderbbox->miny = MS_MIN(leaderpt.y, cachePtr->point.y); cachePtr->leaderbbox->maxy = MS_MAX(leaderpt.y, cachePtr->point.y); cachePtr->status = MS_ON; offset_bbox(&cachePtr->bbox, &cachePtr->bbox, ox, oy); for (i = 0; i < cachePtr->numtextsymbols; i++) { textSymbolObj *ts = cachePtr->textsymbols[i]; if (ts->textpath) { offset_label_bounds(&ts->textpath->bounds, &ts->textpath->bounds, ox, oy); ts->annopoint.x += ox; ts->annopoint.y += oy; } if (ts->style_bounds) { for (j = 0; j < ts->label->numstyles; j++) { if (ts->label->styles[j]->_geomtransform.type != MS_GEOMTRANSFORM_NONE) offset_label_bounds(ts->style_bounds[j], ts->style_bounds[j], ox, oy); } } } } int msDrawOffsettedLabels(imageObj *image, mapObj *map, int priority) { int retval = MS_SUCCESS; int l; labelCacheObj *labelcache = &(map->labelcache); labelCacheSlotObj *cacheslot; labelCacheMemberObj *cachePtr; label_bounds scratch; lineObj scratch_line; pointObj *scratch_points = NULL; int num_allocated_scratch_points = 0; assert(MS_RENDERER_PLUGIN(image->format)); cacheslot = &(labelcache->slots[priority]); scratch.poly = &scratch_line; for (l = cacheslot->numlabels - 1; l >= 0; l--) { cachePtr = &(cacheslot->labels[l]); /* point to right spot in the label cache */ if (cachePtr->status == MS_OFF) { /* only test regular labels that have had their bounding box computed and that haven't been rendered */ classObj *classPtr = (GET_CLASS(map, cachePtr->layerindex, cachePtr->classindex)); layerObj *layerPtr = (GET_LAYER(map, cachePtr->layerindex)); int steps, i, num_scratch_points_to_allocate = 0; assert(classPtr->leader); /* cachePtrs that don't need to be tested have been marked as status on or delete */ if (cachePtr->point.x < labelcache->gutter || cachePtr->point.y < labelcache->gutter || cachePtr->point.x >= image->width - labelcache->gutter || cachePtr->point.y >= image->height - labelcache->gutter) { /* don't look for leaders if point is in edge buffer as the leader line * would end up chopped off */ continue; } for (i = 0; i < cachePtr->numtextsymbols; i++) { int j; textSymbolObj *ts = cachePtr->textsymbols[i]; if (ts->textpath && ts->textpath->bounds.poly) { num_scratch_points_to_allocate = MS_MAX(num_scratch_points_to_allocate, ts->textpath->bounds.poly->numpoints); } if (ts->style_bounds) { for (j = 0; j < ts->label->numstyles; j++) { if (ts->label->styles[j]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT && ts->style_bounds[j]->poly) { num_scratch_points_to_allocate = MS_MAX(num_scratch_points_to_allocate, ts->style_bounds[j]->poly->numpoints); } } } } if (num_scratch_points_to_allocate > num_allocated_scratch_points) { scratch_points = msSmallRealloc( scratch_points, num_scratch_points_to_allocate * sizeof(pointObj)); num_allocated_scratch_points = num_scratch_points_to_allocate; } steps = classPtr->leader->maxdistance / classPtr->leader->gridstep; #define x0 (cachePtr->point.x) #define y0 (cachePtr->point.y) #define gridstepsc (classPtr->leader->gridstep) #define otest(ox, oy) \ if ((x0 + (ox)) >= labelcache->gutter && \ (y0 + (oy)) >= labelcache->gutter && \ (x0 + (ox)) < image->width - labelcache->gutter && \ (y0 + (oy)) < image->height - labelcache->gutter) { \ scratch_line.point = scratch_points; \ scratch.poly = &scratch_line; \ offsetAndTest(map, cachePtr, (ox), (oy), priority, l, &scratch); \ if (cachePtr->status == MS_ON) \ break; \ } /* loop through possible offsetted positions */ for (i = 1; i <= steps; i++) { /* test the intermediate points on the ring */ /* (points marked "0" are the ones being tested) X00X00X 0XXXXX0 0XXXXX0 XXX.XXX 0XXXXX0 0XXXXX0 X00X00X */ int j; for (j = 1; j < i - 1; j++) { /* test the right positions */ otest(i * gridstepsc, j * gridstepsc); otest(i * gridstepsc, -j * gridstepsc); /* test the left positions */ otest(-i * gridstepsc, j * gridstepsc); otest(-i * gridstepsc, -j * gridstepsc); /* test the top positions */ otest(j * gridstepsc, -i * gridstepsc); otest(-j * gridstepsc, -i * gridstepsc); /* test the bottom positions */ otest(j * gridstepsc, i * gridstepsc); otest(-j * gridstepsc, i * gridstepsc); } if (j < (i - 1)) break; otest(i * gridstepsc, i * gridstepsc); otest(-i * gridstepsc, -i * gridstepsc); otest(i * gridstepsc, -i * gridstepsc); otest(-i * gridstepsc, i * gridstepsc); /* test the intermediate points on the ring */ /* (points marked "0" are the ones being tested) X00X00X 0XXXXX0 0XXXXX0 XXX.XXX 0XXXXX0 0XXXXX0 X00X00X */ /* test the extreme diagonal points */ /* (points marked "0" are the ones being tested) 0XXXXX0 XXXXXXX XXXXXXX XXX.XXX XXXXXXX XXXXXXX 0XXXXX0 (x0+i*gridstep, y0+i*gridstep), pos lr (x0-i*gridstep, y0-i*gridstep), pos ul (x0+i*gridstep, y0-i*gridstep), pos ur (x0-i*gridstep, y0+i*gridstep), pos ll */ /* test the 4 cardinal points on the ring */ /* (points marked "0" are the ones being tested) XXX0XXX XXXXXXX XXXXXXX 0XX.XX0 XXXXXXX XXXXXXX XXX0XXX * (x0+i*gridtep,y0), pos cr * (x0-i*gridstep,y0), pos cl * (x0,y0-i*gridstep), pos uc * (x0,y0+i*gridstep), pos lc */ otest(i * gridstepsc, 0); otest(-i * gridstepsc, 0); otest(0, -i * gridstepsc); otest(0, i * gridstepsc); } if (cachePtr->status == MS_ON) { int ll; shapeObj labelLeader; /* label polygon (bounding box, possibly rotated) */ labelLeader.line = cachePtr->leaderline; /* setup the label polygon structure */ labelLeader.numlines = 1; insertRenderedLabelMember(map, cachePtr); for (ll = 0; ll < classPtr->leader->numstyles; ll++) { retval = msDrawLineSymbol(map, image, &labelLeader, classPtr->leader->styles[ll], layerPtr->scalefactor); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } for (ll = 0; ll < cachePtr->numtextsymbols; ll++) { textSymbolObj *ts = cachePtr->textsymbols[ll]; if (ts->style_bounds) { /* here's where we draw the label styles */ for (i = 0; i < ts->label->numstyles; i++) { if (ts->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { retval = msDrawMarkerSymbol( map, image, &(labelLeader.line->point[1]), ts->label->styles[i], layerPtr->scalefactor); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } else if (ts->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { retval = msDrawLabelBounds(map, image, ts->style_bounds[i], ts->label->styles[i], ts->scalefactor); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } else if (ts->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER) { pointObj labelCenter; labelCenter.x = (ts->style_bounds[i]->bbox.maxx + ts->style_bounds[i]->bbox.minx) / 2; labelCenter.y = (ts->style_bounds[i]->bbox.maxy + ts->style_bounds[i]->bbox.miny) / 2; retval = msDrawMarkerSymbol(map, image, &labelCenter, ts->label->styles[i], layerPtr->scalefactor); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } else { msSetError(MS_MISCERR, "Labels only support LABELPNT, LABELPOLY and " "LABELCENTER GEOMTRANSFORMS", "msDrawOffsettedLabels()"); retval = MS_FAILURE; } } } if (ts->annotext) { retval = msDrawTextSymbol(map, image, ts->annopoint, ts); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } } /* TODO: draw cachePtr->marker, but where ? */ /* styleObj tstyle; static int foo =0; if(!foo) { srand(time(NULL)); foo = 1; initStyle(&tstyle); tstyle.width = 1; tstyle.color.alpha = 255; } tstyle.color.red = random()%255; tstyle.color.green = random()%255; tstyle.color.blue =random()%255; msDrawLineSymbol(&map->symbolset, image, cachePtr->poly, &tstyle, layerPtr->scalefactor); */ } } } offset_cleanup: free(scratch_points); return retval; } void fastComputeBounds(lineObj *line, rectObj *bounds) { int j; bounds->minx = bounds->maxx = line->point[0].x; bounds->miny = bounds->maxy = line->point[0].y; for (j = 0; j < line->numpoints; j++) { bounds->minx = MS_MIN(bounds->minx, line->point[j].x); bounds->maxx = MS_MAX(bounds->maxx, line->point[j].x); bounds->miny = MS_MIN(bounds->miny, line->point[j].y); bounds->maxy = MS_MAX(bounds->maxy, line->point[j].y); } } int computeMarkerBounds(mapObj *map, pointObj *annopoint, textSymbolObj *ts, label_bounds *poly) { int i; for (i = 0; i < ts->label->numstyles; i++) { styleObj *style = ts->label->styles[i]; if (style->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT && style->symbol < map->symbolset.numsymbols && style->symbol >= 0) { double sx, sy; int p; double aox, aoy; symbolObj *symbol = map->symbolset.symbol[style->symbol]; if (msGetMarkerSize(map, style, &sx, &sy, ts->scalefactor) != MS_SUCCESS) return -1; /* real error, different from MS_FALSE, return -1 so we can trap it */ if (style->angle) { pointObj *point = poly->poly->point; point[0].x = sx / 2.0; point[0].y = sy / 2.0; point[1].x = point[0].x; point[1].y = -point[0].y; point[2].x = -point[0].x; point[2].y = -point[0].y; point[3].x = -point[0].x; point[3].y = point[0].y; point[4].x = point[0].x; point[4].y = point[0].y; if (symbol->anchorpoint_x != 0.5 || symbol->anchorpoint_y != 0.5) { aox = (0.5 - symbol->anchorpoint_x) * sx; aoy = (0.5 - symbol->anchorpoint_y) * sy; for (p = 0; p < 5; p++) { point[p].x += aox; point[p].y += aoy; } } { double rot = -style->angle * MS_DEG_TO_RAD; double sina = sin(rot); double cosa = cos(rot); for (p = 0; p < 5; p++) { double tmpx = point[p].x; point[p].x = point[p].x * cosa - point[p].y * sina; point[p].y = tmpx * sina + point[p].y * cosa; } } aox = annopoint->x + style->offsetx * ts->scalefactor; aoy = annopoint->y + style->offsety * ts->scalefactor; for (p = 0; p < 5; p++) { point[p].x += aox; point[p].y += aoy; } fastComputeBounds(poly->poly, &poly->bbox); } else { double aox = (0.5 - symbol->anchorpoint_x) * sx + annopoint->x + style->offsetx * ts->scalefactor; double aoy = (0.5 - symbol->anchorpoint_y) * sy + annopoint->y + style->offsety * ts->scalefactor; poly->poly = NULL; poly->bbox.maxx = sx / 2.0 + aox; poly->bbox.minx = -sx / 2.0 + aox; poly->bbox.maxy = sy / 2.0 + aoy; poly->bbox.miny = -sy / 2.0 + aoy; } break; } } if (i == ts->label->numstyles) return MS_FALSE; /* the label has no marker styles */ else return MS_TRUE; } /* check that the current entry does not fall close to a label with identical * text, if configured so. Currently only checks the first label/text */ int msCheckLabelMinDistance(mapObj *map, labelCacheMemberObj *lc) { int i; textSymbolObj *s; /* shortcut */ textSymbolObj *ts; rectObj buffered; if (lc->numtextsymbols == 0) return MS_FALSE; /* no label with text */ s = lc->textsymbols[0]; if (!s->annotext || s->label->mindistance <= 0.0 || s->label->force == MS_TRUE) return MS_FALSE; /* min distance is not checked */ /* we buffer the label and check for intersection instead of calculating the distance of two textpaths. we also buffer only the bbox of lc for faster computation (it is still compared to the full textpath of the label cache members). */ buffered = lc->bbox; buffered.minx -= s->label->mindistance * s->resolutionfactor; buffered.miny -= s->label->mindistance * s->resolutionfactor; buffered.maxx += s->label->mindistance * s->resolutionfactor; buffered.maxy += s->label->mindistance * s->resolutionfactor; for (i = 0; i < map->labelcache.num_rendered_members; i++) { labelCacheMemberObj *ilc = map->labelcache.rendered_text_symbols[i]; if (ilc->numtextsymbols == 0 || !ilc->textsymbols[0]->annotext) continue; ts = ilc->textsymbols[0]; if (strcmp(s->annotext, ts->annotext) != 0) { /* only check min distance against same label */ continue; } if (msPointInRect(&ilc->point, &buffered) == MS_TRUE) { return MS_TRUE; } if (ts->textpath && ts->textpath->absolute) { if (intersectLabelPolygons(ts->textpath->bounds.poly, &ilc->bbox, NULL, &buffered) == MS_TRUE) { return MS_TRUE; } continue; } if (intersectLabelPolygons(NULL, &ilc->bbox, NULL, &buffered) == MS_TRUE) { return MS_TRUE; } } return MS_FALSE; } void copyLabelBounds(label_bounds *dst, label_bounds *src) { *dst = *src; if (src->poly) { int i; dst->poly = msSmallMalloc(sizeof(lineObj)); dst->poly->numpoints = src->poly->numpoints; dst->poly->point = msSmallMalloc(dst->poly->numpoints * sizeof(pointObj)); for (i = 0; i < dst->poly->numpoints; i++) { dst->poly->point[i] = src->poly->point[i]; } } } static int getLabelPositionFromString(char *pszString) { if (strcasecmp(pszString, "UL") == 0) return MS_UL; else if (strcasecmp(pszString, "LR") == 0) return MS_LR; else if (strcasecmp(pszString, "UR") == 0) return MS_UR; else if (strcasecmp(pszString, "LL") == 0) return MS_LL; else if (strcasecmp(pszString, "CR") == 0) return MS_CR; else if (strcasecmp(pszString, "CL") == 0) return MS_CL; else if (strcasecmp(pszString, "UC") == 0) return MS_UC; else if (strcasecmp(pszString, "LC") == 0) return MS_LC; else return MS_CC; } int msDrawLabelCache(mapObj *map, imageObj *image) { int nReturnVal = MS_SUCCESS; struct mstimeval starttime = {0}, endtime = {0}; if (map->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&starttime, NULL); if (image) { if (MS_RENDERER_PLUGIN(image->format)) { int i, l, ll, priority, its; double marker_offset_x, marker_offset_y; int label_offset_x, label_offset_y; const char *value; labelCacheMemberObj *cachePtr = NULL; layerObj *layerPtr = NULL; classObj *classPtr = NULL; textSymbolObj *textSymbolPtr = NULL; /* * some statically allocated containers for storing label bounds before * copying them into the cachePtr: we avoid allocating these structures * at runtime, except for the labels that are actually rendered. */ lineObj labelpoly_line; pointObj labelpoly_points[5]; label_bounds labelpoly_bounds = {0}; lineObj label_marker_line; pointObj label_marker_points[5]; label_bounds label_marker_bounds; lineObj metrics_line; pointObj metrics_points[5]; label_bounds metrics_bounds; label_marker_line.point = label_marker_points; label_marker_line.numpoints = 5; metrics_line.point = metrics_points; metrics_line.numpoints = 5; labelpoly_line.point = labelpoly_points; labelpoly_line.numpoints = 5; /* Look for labelcache_map_edge_buffer map metadata * If set then the value defines a buffer (in pixels) along the edge of * the map image where labels can't fall */ if ((value = msLookupHashTable(&(map->web.metadata), "labelcache_map_edge_buffer")) != NULL) { map->labelcache.gutter = MS_ABS(atoi(value)); if (map->debug) msDebug("msDrawLabelCache(): labelcache_map_edge_buffer = %d\n", map->labelcache.gutter); } for (priority = MS_MAX_LABEL_PRIORITY - 1; priority >= 0; priority--) { labelCacheSlotObj *cacheslot; cacheslot = &(map->labelcache.slots[priority]); for (l = cacheslot->numlabels - 1; l >= 0; l--) { cachePtr = &(cacheslot ->labels[l]); /* point to right spot in the label cache */ layerPtr = (GET_LAYER( map, cachePtr->layerindex)); /* set a couple of other pointers, avoids nasty references */ classPtr = (GET_CLASS(map, cachePtr->layerindex, cachePtr->classindex)); if (cachePtr->textsymbols[0]->textpath && cachePtr->textsymbols[0]->textpath->absolute) { /* we have an angle follow label */ cachePtr->bbox = cachePtr->textsymbols[0]->textpath->bounds.bbox; /* before going any further, check that mindistance is respected */ if (cachePtr->numtextsymbols && cachePtr->textsymbols[0]->label->mindistance > 0.0 && cachePtr->textsymbols[0]->annotext) { if (msCheckLabelMinDistance(map, cachePtr) == MS_TRUE) { cachePtr->status = MS_DELETE; MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping labelgroup %d \"%s\" in layer \"%s\": too " "close to an identical label (mindistance)\n", l, cachePtr->textsymbols[0]->annotext, layerPtr->name); continue; /* move on to next entry, this one is too close to an already placed one */ } } if (!cachePtr->textsymbols[0]->label->force) cachePtr->status = msTestLabelCacheCollisions( map, cachePtr, &cachePtr->textsymbols[0]->textpath->bounds, priority, l); else cachePtr->status = MS_ON; if (cachePtr->status) { if (MS_UNLIKELY( MS_FAILURE == msDrawTextSymbol( map, image, cachePtr->textsymbols[0]->annopoint /*not used*/, cachePtr->textsymbols[0]))) { return MS_FAILURE; } insertRenderedLabelMember(map, cachePtr); } else { MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping follow labelgroup %d \"%s\" in layer \"%s\": " "text collided\n", l, cachePtr->textsymbols[0]->annotext, layerPtr->name); } cachePtr->status = MS_DELETE; /* we're done with this label, it won't even have a second chance in the leader phase */ } else { marker_offset_x = marker_offset_y = 0; /* assume no marker */ if (layerPtr->type == MS_LAYER_POINT && cachePtr->markerid != -1) { /* there is a marker already in the image that we need to account for */ markerCacheMemberObj *markerPtr = &( cacheslot ->markers[cachePtr->markerid]); /* point to the right spot in the marker cache*/ marker_offset_x = (markerPtr->bounds.maxx - markerPtr->bounds.minx) / 2.0; marker_offset_y = (markerPtr->bounds.maxy - markerPtr->bounds.miny) / 2.0; } /* ** all other cases *could* have multiple labels defined */ cachePtr->status = MS_ON; /* assume this cache element can be placed */ for (ll = 0; ll < cachePtr->numtextsymbols; ll++) { /* RFC 77 TODO: Still may want to step through backwards... */ int label_marker_status = MS_ON, have_label_marker, metrics_status = MS_ON; int need_labelpoly = 0; /* reset the lineObj which may have been unset by a previous call * to get_metrics() */ label_marker_bounds.poly = &label_marker_line; labelpoly_bounds.poly = &labelpoly_line; textSymbolPtr = cachePtr->textsymbols[ll]; for (i = 0; i < textSymbolPtr->label->numstyles; i++) { if (textSymbolPtr->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY || textSymbolPtr->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER) { need_labelpoly = 1; break; } } /* compute the poly of the label styles */ if ((have_label_marker = computeMarkerBounds(map, &cachePtr->point, textSymbolPtr, &label_marker_bounds)) == MS_TRUE) { if (cachePtr->numtextsymbols > 1) { /* FIXME this test doesn't seem right, should probably check if we have an annotation layer with a regular style defined */ marker_offset_x = (label_marker_bounds.bbox.maxx - label_marker_bounds.bbox.minx) / 2.0; marker_offset_y = (label_marker_bounds.bbox.maxy - label_marker_bounds.bbox.miny) / 2.0; } else { /* we might be using an old style behavior with a markerPtr */ marker_offset_x = MS_MAX(marker_offset_x, (label_marker_bounds.bbox.maxx - label_marker_bounds.bbox.minx) / 2.0); marker_offset_y = MS_MAX(marker_offset_y, (label_marker_bounds.bbox.maxy - label_marker_bounds.bbox.miny) / 2.0); } /* add marker to cachePtr->poly */ if (textSymbolPtr->label->force != MS_TRUE) { label_marker_status = msTestLabelCacheCollisions( map, cachePtr, &label_marker_bounds, priority, l); } if (label_marker_status == MS_OFF && !(textSymbolPtr->label->force == MS_ON || classPtr->leader)) { cachePtr->status = MS_DELETE; MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping label %d of labelgroup %d of class %d in " "layer \"%s\": marker collided\n", ll, l, cachePtr->classindex, layerPtr->name); break; /* the marker collided, break from multi-label loop */ } } if (have_label_marker == -1) return MS_FAILURE; /* error occurred (symbol not found, etc...) */ if (textSymbolPtr->annotext) { /* * if we don't have an offset defined, first check that the * labelpoint itself does not collide this helps speed things up * in dense labeling, as if the labelpoint collides there's no * use in computing the labeltext bounds (i.e. going into * shaping+freetype). We do however skip collision testing * against the marker cache, as we want to allow rendering a * label for points that overlap each other: this is done by * setting priority to MAX_PRIORITY in the call to * msTestLabelCacheCollisions (which is a hack!!) */ if (!have_label_marker && textSymbolPtr->label->force != MS_TRUE && !classPtr->leader && !textSymbolPtr->label->offsetx && !textSymbolPtr->label->offsety) { label_bounds labelpoint_bounds; labelpoint_bounds.poly = NULL; labelpoint_bounds.bbox.minx = cachePtr->point.x - 0.1; labelpoint_bounds.bbox.maxx = cachePtr->point.x + 0.1; labelpoint_bounds.bbox.miny = cachePtr->point.y - 0.1; labelpoint_bounds.bbox.maxy = cachePtr->point.y + 0.1; if (MS_OFF == msTestLabelCacheCollisions( map, cachePtr, &labelpoint_bounds, MS_MAX_LABEL_PRIORITY, l)) { cachePtr->status = MS_DELETE; /* we won't check for leader offsetted positions, as the anchor point colided */ MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping label %d \"%s\" of labelgroup %d of " "class %d in layer \"%s\": labelpoint collided\n", ll, textSymbolPtr->annotext, l, cachePtr->classindex, layerPtr->name); break; } } /* compute label size */ if (!textSymbolPtr->textpath) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, textSymbolPtr))) { return MS_FAILURE; } } /* if our label has an outline, adjust the marker offset so the * outlinecolor does not bleed into the marker */ if (marker_offset_x && MS_VALID_COLOR(textSymbolPtr->label->outlinecolor)) { marker_offset_x += textSymbolPtr->label->outlinewidth / 2.0 * textSymbolPtr->scalefactor; marker_offset_y += textSymbolPtr->label->outlinewidth / 2.0 * textSymbolPtr->scalefactor; } /* apply offset and buffer settings */ if (textSymbolPtr->label->anglemode != MS_FOLLOW) { label_offset_x = textSymbolPtr->label->offsetx * textSymbolPtr->scalefactor; label_offset_y = textSymbolPtr->label->offsety * textSymbolPtr->scalefactor; } else { label_offset_x = 0; label_offset_y = 0; } if (textSymbolPtr->label->position == MS_AUTO) { /* no point in using auto positioning if the marker cannot be * placed */ int positions[MS_POSITIONS_LENGTH], npositions = 0; /* ** (Note: might be able to re-order this for more speed.) */ if (msLayerGetProcessingKey(layerPtr, "LABEL_POSITIONS")) { int p, ncustom_positions = 0; char **custom_positions = msStringSplitComplex( msLayerGetProcessingKey(layerPtr, "LABEL_POSITIONS"), ",", &ncustom_positions, MS_STRIPLEADSPACES | MS_STRIPENDSPACES); for (p = 0; p < MS_MIN(9, ncustom_positions); p++) positions[p] = getLabelPositionFromString(custom_positions[p]); npositions = p; msFree(custom_positions); } else if (layerPtr->type == MS_LAYER_POLYGON && marker_offset_x == 0) { positions[0] = MS_CC; positions[1] = MS_UC; positions[2] = MS_LC; positions[3] = MS_CL; positions[4] = MS_CR; npositions = 5; } else if (layerPtr->type == MS_LAYER_LINE && marker_offset_x == 0) { positions[0] = MS_UC; positions[1] = MS_LC; positions[2] = MS_CC; npositions = 3; } else { positions[0] = MS_UL; positions[1] = MS_LR; positions[2] = MS_UR; positions[3] = MS_LL; positions[4] = MS_CR; positions[5] = MS_CL; positions[6] = MS_UC; positions[7] = MS_LC; npositions = 8; } for (i = 0; i < npositions; i++) { // RFC 77 TODO: take label_marker_offset_x/y into account metrics_bounds.poly = &metrics_line; textSymbolPtr->annopoint = get_metrics(&(cachePtr->point), positions[i], textSymbolPtr->textpath, marker_offset_x + label_offset_x, marker_offset_y + label_offset_y, textSymbolPtr->rotation, textSymbolPtr->label->buffer * textSymbolPtr->scalefactor, &metrics_bounds); if (textSymbolPtr->label->force == MS_OFF) { for (its = 0; its < ll; its++) { /* check for collisions inside the label group */ if (intersectTextSymbol(cachePtr->textsymbols[its], &metrics_bounds) == MS_TRUE) { /* there was a self intersection */ break; /* next position, will break out to next position in containing loop*/ } if (its != ll) continue; /* goto next position, this one had an intersection with our own label group */ } } metrics_status = msTestLabelCacheCollisions( map, cachePtr, &metrics_bounds, priority, l); /* found a suitable place for this label */ if (metrics_status == MS_TRUE || (i == (npositions - 1) && textSymbolPtr->label->force == MS_ON)) { metrics_status = MS_TRUE; /* set to true in case we are forcing it */ /* compute anno poly for label background if needed */ if (need_labelpoly) get_metrics(&(cachePtr->point), positions[i], textSymbolPtr->textpath, marker_offset_x + label_offset_x, marker_offset_y + label_offset_y, textSymbolPtr->rotation, 1, &labelpoly_bounds); break; /* ...out of position loop */ } } /* next position */ /* if position auto didn't manage to find a position, but we * have leader configured for the class, then we want to * compute the label poly anyway, placed as MS_CC */ if (classPtr->leader && metrics_status == MS_FALSE) { metrics_bounds.poly = &metrics_line; textSymbolPtr->annopoint = get_metrics( &(cachePtr->point), MS_CC, textSymbolPtr->textpath, label_offset_x, label_offset_y, textSymbolPtr->rotation, textSymbolPtr->label->buffer * textSymbolPtr->scalefactor, &metrics_bounds); if (need_labelpoly) get_metrics(&(cachePtr->point), MS_CC, textSymbolPtr->textpath, label_offset_x, label_offset_y, textSymbolPtr->rotation, 1, &labelpoly_bounds); } } else { /* explicit position */ if (textSymbolPtr->label->position == MS_CC) { /* don't need the marker_offset */ metrics_bounds.poly = &metrics_line; textSymbolPtr->annopoint = get_metrics( &(cachePtr->point), MS_CC, textSymbolPtr->textpath, label_offset_x, label_offset_y, textSymbolPtr->rotation, textSymbolPtr->label->buffer * textSymbolPtr->scalefactor, &metrics_bounds); if (need_labelpoly) get_metrics(&(cachePtr->point), MS_CC, textSymbolPtr->textpath, label_offset_x, label_offset_y, textSymbolPtr->rotation, 1, &labelpoly_bounds); } else { metrics_bounds.poly = &metrics_line; textSymbolPtr->annopoint = get_metrics( &(cachePtr->point), textSymbolPtr->label->position, textSymbolPtr->textpath, marker_offset_x + label_offset_x, marker_offset_y + label_offset_y, textSymbolPtr->rotation, textSymbolPtr->label->buffer * textSymbolPtr->scalefactor, &metrics_bounds); if (need_labelpoly) get_metrics( &(cachePtr->point), textSymbolPtr->label->position, textSymbolPtr->textpath, marker_offset_x + label_offset_x, marker_offset_y + label_offset_y, textSymbolPtr->rotation, 1, &labelpoly_bounds); } if (textSymbolPtr->label->force == MS_ON) { metrics_status = MS_ON; } else { if (textSymbolPtr->label->force == MS_OFF) { /* check for collisions inside the label group unless the * label is FORCE GROUP */ for (its = 0; its < ll; its++) { /* check for collisions inside the label group */ if (intersectTextSymbol(cachePtr->textsymbols[its], &metrics_bounds) == MS_TRUE) { /* there was a self intersection */ break; /* will break out to next position in containing loop*/ } if (its != ll) { cachePtr->status = MS_DELETE; /* TODO RFC98: check if this is correct */ MS_DEBUG( MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping label %d (\"%s\") of labelgroup %d of " "class %d in layer \"%s\": intercollision with " "label text inside labelgroup\n", ll, textSymbolPtr->annotext, l, cachePtr->classindex, layerPtr->name); break; /* collision within the group, break out of textSymbol loop */ } } } /* TODO: in case we have leader lines and multiple labels, * there's no use in testing for labelcache collisions once * a first collision has been found. we only need to know * that the label group has collided, and the poly of the * whole label group: if(label_group) * testLabelCacheCollisions */ metrics_status = msTestLabelCacheCollisions( map, cachePtr, &metrics_bounds, priority, l); } } /* end POSITION AUTO vs Fixed POSITION */ if (!metrics_status && classPtr->leader == 0) { cachePtr->status = MS_DELETE; MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping label %d \"%s\" of labelgroup %d of class " "%d in layer \"%s\": text collided\n", ll, textSymbolPtr->annotext, l, cachePtr->classindex, layerPtr->name); break; /* no point looking at more labels, unless their is a leader defined */ } } /* if we're here, we can either fit the label directly, or we need * to put it in the leader queue */ assert((metrics_status && label_marker_status) || classPtr->leader); if (textSymbolPtr->annotext) { copyLabelBounds(&textSymbolPtr->textpath->bounds, &metrics_bounds); } if (have_label_marker) { if (!textSymbolPtr->style_bounds) textSymbolPtr->style_bounds = msSmallCalloc( textSymbolPtr->label->numstyles, sizeof(label_bounds *)); for (its = 0; its < textSymbolPtr->label->numstyles; its++) { if (textSymbolPtr->label->styles[its]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { textSymbolPtr->style_bounds[its] = msSmallMalloc(sizeof(label_bounds)); copyLabelBounds(textSymbolPtr->style_bounds[its], &label_marker_bounds); } } } if (!label_marker_status || !metrics_status) { MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Putting label %d of labelgroup %d of class %d , " "layer \"%s\" in leader queue\n", ll, l, cachePtr->classindex, layerPtr->name); cachePtr->status = MS_OFF; /* we have a collision, but this entry is a candidate for leader testing */ } /* do we need to copy the labelpoly, or can we use the static one * ?*/ if (cachePtr->numtextsymbols > 1 || (cachePtr->status == MS_OFF && classPtr->leader)) { /* * if we have more than one label, or if we have a single one * which didn't fit but needs to go through leader offset * testing */ if (!textSymbolPtr->style_bounds) textSymbolPtr->style_bounds = msSmallCalloc( textSymbolPtr->label->numstyles, sizeof(label_bounds *)); for (its = 0; its < textSymbolPtr->label->numstyles; its++) { if (textSymbolPtr->label->styles[its]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY || textSymbolPtr->label->styles[its]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER) { textSymbolPtr->style_bounds[its] = msSmallMalloc(sizeof(label_bounds)); copyLabelBounds(textSymbolPtr->style_bounds[its], &labelpoly_bounds); } } } /* else: we'll use labelpoly_bounds directly below */ } /* next label in the group */ if (cachePtr->status != MS_DELETE) { /* compute the global label bbox */ int inited = 0, s; for (its = 0; its < cachePtr->numtextsymbols; its++) { if (cachePtr->textsymbols[its]->annotext) { if (inited == 0) { cachePtr->bbox = cachePtr->textsymbols[its]->textpath->bounds.bbox; inited = 1; } else { cachePtr->bbox.minx = MS_MIN( cachePtr->bbox.minx, cachePtr->textsymbols[its]->textpath->bounds.bbox.minx); cachePtr->bbox.miny = MS_MIN( cachePtr->bbox.miny, cachePtr->textsymbols[its]->textpath->bounds.bbox.miny); cachePtr->bbox.maxx = MS_MAX( cachePtr->bbox.maxx, cachePtr->textsymbols[its]->textpath->bounds.bbox.maxx); cachePtr->bbox.maxy = MS_MAX( cachePtr->bbox.maxy, cachePtr->textsymbols[its]->textpath->bounds.bbox.maxy); } } for (s = 0; s < cachePtr->textsymbols[its]->label->numstyles; s++) { if (cachePtr->textsymbols[its] ->label->styles[s] ->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { if (inited == 0) { cachePtr->bbox = cachePtr->textsymbols[its]->style_bounds[s]->bbox; inited = 1; break; } else { cachePtr->bbox.minx = MS_MIN(cachePtr->bbox.minx, cachePtr->textsymbols[its] ->style_bounds[s] ->bbox.minx); cachePtr->bbox.miny = MS_MIN(cachePtr->bbox.miny, cachePtr->textsymbols[its] ->style_bounds[s] ->bbox.miny); cachePtr->bbox.maxx = MS_MAX(cachePtr->bbox.maxx, cachePtr->textsymbols[its] ->style_bounds[s] ->bbox.maxx); cachePtr->bbox.maxy = MS_MAX(cachePtr->bbox.maxy, cachePtr->textsymbols[its] ->style_bounds[s] ->bbox.maxy); break; } } } } } /* check that mindistance is respected */ if (cachePtr->numtextsymbols && cachePtr->textsymbols[0]->label->mindistance > 0.0 && cachePtr->textsymbols[0]->annotext) { if (msCheckLabelMinDistance(map, cachePtr) == MS_TRUE) { cachePtr->status = MS_DELETE; MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping labelgroup %d \"%s\" in layer \"%s\": too " "close to an identical label (mindistance)\n", l, cachePtr->textsymbols[0]->annotext, layerPtr->name); } } if (cachePtr->status == MS_OFF || cachePtr->status == MS_DELETE) continue; /* next labelCacheMemberObj, as we had a collision */ /* insert the rendered label */ insertRenderedLabelMember(map, cachePtr); for (ll = 0; ll < cachePtr->numtextsymbols; ll++) { textSymbolPtr = cachePtr->textsymbols[ll]; /* here's where we draw the label styles */ for (i = 0; i < textSymbolPtr->label->numstyles; i++) { if (textSymbolPtr->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { if (MS_UNLIKELY( MS_FAILURE == msDrawMarkerSymbol(map, image, &(cachePtr->point), textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } else if (textSymbolPtr->annotext && textSymbolPtr->label->styles[i] ->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (textSymbolPtr->style_bounds && textSymbolPtr->style_bounds[i]) { if (MS_UNLIKELY( MS_FAILURE == msDrawLabelBounds(map, image, textSymbolPtr->style_bounds[i], textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } else { if (MS_UNLIKELY( MS_FAILURE == msDrawLabelBounds(map, image, &labelpoly_bounds, textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } } else if (textSymbolPtr->annotext && textSymbolPtr->label->styles[i] ->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER) { pointObj labelCenter; if (textSymbolPtr->style_bounds && textSymbolPtr->style_bounds[i]) { labelCenter.x = (textSymbolPtr->style_bounds[i]->bbox.maxx + textSymbolPtr->style_bounds[i]->bbox.minx) / 2; labelCenter.y = (textSymbolPtr->style_bounds[i]->bbox.maxy + textSymbolPtr->style_bounds[i]->bbox.miny) / 2; if (MS_UNLIKELY( MS_FAILURE == msDrawMarkerSymbol(map, image, &labelCenter, textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } else { labelCenter.x = (labelpoly_bounds.bbox.maxx + labelpoly_bounds.bbox.minx) / 2; labelCenter.y = (labelpoly_bounds.bbox.maxy + labelpoly_bounds.bbox.miny) / 2; if (MS_UNLIKELY( MS_FAILURE == msDrawMarkerSymbol(map, image, &labelCenter, textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } } else { msSetError(MS_MISCERR, "Labels only support LABELPNT, LABELPOLY and " "LABELCENTER GEOMTRANSFORMS", "msDrawLabelCache()"); return MS_FAILURE; } } if (textSymbolPtr->annotext) { if (MS_UNLIKELY(MS_FAILURE == msDrawTextSymbol(map, image, textSymbolPtr->annopoint, textSymbolPtr))) { return MS_FAILURE; } } } } } /* next label(group) from cacheslot */ if (MS_UNLIKELY(MS_FAILURE == msDrawOffsettedLabels(image, map, priority))) { return MS_FAILURE; } } /* next priority */ #ifdef TBDEBUG styleObj tstyle; initStyle(&tstyle); tstyle.width = 1; tstyle.color.alpha = 255; tstyle.color.red = 255; tstyle.color.green = 0; tstyle.color.blue = 0; for (priority = MS_MAX_LABEL_PRIORITY - 1; priority >= 0; priority--) { labelCacheSlotObj *cacheslot; cacheslot = &(map->labelcache.slots[priority]); for (l = cacheslot->numlabels - 1; l >= 0; l--) { cachePtr = &(cacheslot ->labels[l]); /* point to right spot in the label cache */ /* assert((cachePtr->poly == NULL && cachePtr->status == MS_OFF) || (cachePtr->poly && (cachePtr->status == MS_ON)); */ if (cachePtr->status) { msDrawLineSymbol(map, image, cachePtr->poly, &tstyle, layerPtr->scalefactor); } } } #endif nReturnVal = MS_SUCCESS; /* necessary? */ } } if (map->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug("msDrawMap(): Drawing Label Cache, %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } return nReturnVal; } /** * Generic function to tell the underline device that layer * drawing is stating */ void msImageStartLayer(mapObj *map, layerObj *layer, imageObj *image) { if (image) { if (MS_RENDERER_PLUGIN(image->format)) { const char *approximation_scale = msLayerGetProcessingKey(layer, "APPROXIMATION_SCALE"); if (approximation_scale) { if (!strncasecmp(approximation_scale, "ROUND", 5)) { MS_IMAGE_RENDERER(image)->transform_mode = MS_TRANSFORM_ROUND; } else if (!strncasecmp(approximation_scale, "FULL", 4)) { MS_IMAGE_RENDERER(image)->transform_mode = MS_TRANSFORM_FULLRESOLUTION; } else if (!strncasecmp(approximation_scale, "SIMPLIFY", 8)) { MS_IMAGE_RENDERER(image)->transform_mode = MS_TRANSFORM_SIMPLIFY; } else { MS_IMAGE_RENDERER(image)->transform_mode = MS_TRANSFORM_SNAPTOGRID; MS_IMAGE_RENDERER(image)->approximation_scale = atof(approximation_scale); } } else { MS_IMAGE_RENDERER(image)->transform_mode = MS_IMAGE_RENDERER(image)->default_transform_mode; MS_IMAGE_RENDERER(image)->approximation_scale = MS_IMAGE_RENDERER(image)->default_approximation_scale; } MS_IMAGE_RENDERER(image)->startLayer(image, map, layer); } else if (MS_RENDERER_IMAGEMAP(image->format)) msImageStartLayerIM(map, layer, image); } } /** * Generic function to tell the underline device that layer * drawing is ending */ void msImageEndLayer(mapObj *map, layerObj *layer, imageObj *image) { if (image) { if (MS_RENDERER_PLUGIN(image->format)) { MS_IMAGE_RENDERER(image)->endLayer(image, map, layer); } } } /** * Generic function to tell the underline device that shape * drawing is starting */ void msDrawStartShape(mapObj *map, layerObj *layer, imageObj *image, shapeObj *shape) { (void)map; (void)layer; if (image) { if (MS_RENDERER_PLUGIN(image->format)) { if (image->format->vtable->startShape) image->format->vtable->startShape(image, shape); } } } /** * Generic function to tell the underline device that shape * drawing is ending */ void msDrawEndShape(mapObj *map, layerObj *layer, imageObj *image, shapeObj *shape) { (void)map; (void)layer; if (MS_RENDERER_PLUGIN(image->format)) { if (image->format->vtable->endShape) image->format->vtable->endShape(image, shape); } } /** * take the value from the shape and use it to change the * color in the style to match the range map */ int msShapeToRange(styleObj *style, shapeObj *shape) { /*first, get the value of the rangeitem, which should*/ /*evaluate to a double*/ const char *fieldStr = shape->values[style->rangeitemindex]; if (fieldStr == NULL) { /*if there's not value, bail*/ return MS_FAILURE; } double fieldVal = atof(fieldStr); /*faith that it's ok -- */ /*should switch to strtod*/ return msValueToRange(style, fieldVal, MS_COLORSPACE_RGB); } /** * Allow direct mapping of a value so that mapscript can use the * Ranges. The styls passed in is updated to reflect the right color * based on the fieldVal */ int msValueToRange(styleObj *style, double fieldVal, colorspace cs) { double range; double scaledVal; range = style->maxvalue - style->minvalue; scaledVal = (fieldVal - style->minvalue) / range; if (cs == MS_COLORSPACE_RGB) { /*At this point, we know where on the range we need to be*/ /*However, we don't know how to map it yet, since RGB(A) can */ /*Go up or down*/ style->color.red = (int)(MS_MAX( 0, (MS_MIN(255, (style->mincolor.red + ((style->maxcolor.red - style->mincolor.red) * scaledVal)))))); style->color.green = (int)(MS_MAX( 0, (MS_MIN(255, (style->mincolor.green + ((style->maxcolor.green - style->mincolor.green) * scaledVal)))))); style->color.blue = (int)(MS_MAX( 0, (MS_MIN(255, (style->mincolor.blue + ((style->maxcolor.blue - style->mincolor.blue) * scaledVal)))))); style->color.alpha = (int)(MS_MAX( 0, (MS_MIN(255, (style->mincolor.alpha + ((style->maxcolor.alpha - style->mincolor.alpha) * scaledVal)))))); } else { /* HSL */ assert(cs == MS_COLORSPACE_HSL); if (fieldVal <= style->minvalue) style->color = style->mincolor; else if (fieldVal >= style->maxvalue) style->color = style->maxcolor; else { double mh, ms, ml, Mh, Ms, Ml; msRGBtoHSL(&style->mincolor, &mh, &ms, &ml); msRGBtoHSL(&style->maxcolor, &Mh, &Ms, &Ml); mh += (Mh - mh) * scaledVal; ms += (Ms - ms) * scaledVal; ml += (Ml - ml) * scaledVal; msHSLtoRGB(mh, ms, ml, &style->color); style->color.alpha = style->mincolor.alpha + (style->maxcolor.alpha - style->mincolor.alpha) * scaledVal; } } /*( "msMapRange(): %i %i %i", style->color.red , style->color.green, * style->color.blue);*/ #if ALPHACOLOR_ENABLED /*NO ALPHA RANGE YET style->color.alpha = style->mincolor.alpha + * ((style->maxcolor.alpha - style->mincolor.alpha) * scaledVal);*/ #endif return MS_SUCCESS; } mapserver-8.4.0/src/mapdrawgdal.c000066400000000000000000002511521474174441300167640ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Code for drawing GDAL raster layers. Called from * msDrawRasterLayerLow() in mapraster.c. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include #include "mapserver.h" #include "mapresample.h" #include "mapthread.h" #include "maptime.h" extern int InvGeoTransform(double *gt_in, double *gt_out); #define MAXCOLORS 256 #define GEO_TRANS(tr, x, y) ((tr)[0] + (tr)[1] * (x) + (tr)[2] * (y)) #define SKIP_MASK(x, y) \ (mask_rb && !*(mask_rb->data.rgba.a + (y)*mask_rb->data.rgba.row_step + \ (x)*mask_rb->data.rgba.pixel_step)) #include "gdal.h" #include "cpl_string.h" #include "gdal_alg.h" static bool IsNoData(double dfValue, double dfNoDataValue); static int LoadGDALImages(GDALDatasetH hDS, int band_numbers[4], int band_count, layerObj *layer, int src_xoff, int src_yoff, int src_xsize, int src_ysize, GByte *pabyBuffer, int dst_xsize, int dst_ysize, int *pbHaveRGBNoData, int *pnNoData1, int *pnNoData2, int *pnNoData3, bool *pbScaled, double *pdfScaleMin, double *pdfScaleRatio, bool **ppbIsNoDataBuffer); static int msDrawRasterLayerGDAL_RawMode(mapObj *map, layerObj *layer, imageObj *image, GDALDatasetH hDS, int src_xoff, int src_yoff, int src_xsize, int src_ysize, int dst_xoff, int dst_yoff, int dst_xsize, int dst_ysize); static int msDrawRasterLayerGDAL_16BitClassification( mapObj *map, layerObj *layer, rasterBufferObj *rb, GDALRasterBandH hBand, int src_xoff, int src_yoff, int src_xsize, int src_ysize, int dst_xoff, int dst_yoff, int dst_xsize, int dst_ysize); /* * rasterBufferObj setting macros. */ #define GAMMA_CORRECT(color, gamma) \ (int)(0.5 + 255 * pow((color) / 255.0, (gamma))) /************************************************************************/ /* msDrawRasterLayerGDAL() */ /************************************************************************/ int msDrawRasterLayerGDAL(mapObj *map, layerObj *layer, imageObj *image, rasterBufferObj *rb, void *hDSVoid) { int i; /* loop counters */ int cmap[MAXCOLORS]; #ifndef NDEBUG int cmap_set = FALSE; #endif unsigned char rb_cmap[4][MAXCOLORS]; double adfGeoTransform[6], adfInvGeoTransform[6]; int dst_xoff, dst_yoff, dst_xsize, dst_ysize; int src_xoff, src_yoff, src_xsize, src_ysize; double llx, lly, urx, ury; rectObj copyRect, mapRect; unsigned char *pabyRaw1 = NULL, *pabyRaw2 = NULL, *pabyRaw3 = NULL, *pabyRawAlpha = NULL; int classified = FALSE; int red_band = 0, green_band = 0, blue_band = 0, alpha_band = 0; int band_count, band_numbers[4]; GDALDatasetH hDS = hDSVoid; GDALColorTableH hColorMap = NULL; GDALRasterBandH hBand1 = NULL, hBand2 = NULL, hBand3 = NULL, hBandAlpha = NULL; int bHaveRGBNoData = FALSE; int nNoData1 = -1, nNoData2 = -1, nNoData3 = -1; rasterBufferObj *mask_rb = NULL; rasterBufferObj s_mask_rb; if (layer->mask) { int ret; layerObj *maskLayer = GET_LAYER(map, msGetLayerIndex(map, layer->mask)); mask_rb = &s_mask_rb; memset(mask_rb, 0, sizeof(s_mask_rb)); ret = MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, mask_rb); if (ret != MS_SUCCESS) return -1; } /*only support rawdata and pluggable renderers*/ assert(MS_RENDERER_RAWDATA(image->format) || (MS_RENDERER_PLUGIN(image->format) && rb)); memset(cmap, 0xff, MAXCOLORS * sizeof(int)); memset(rb_cmap, 0, sizeof(rb_cmap)); /* -------------------------------------------------------------------- */ /* Test the image format instead of the map format. */ /* Normally the map format and the image format should be the */ /* same but In some cases like swf and pdf support, a temporary */ /* GD image object is created and used to render raster layers */ /* and then dumped into the SWF or the PDF file. */ /* -------------------------------------------------------------------- */ src_xsize = GDALGetRasterXSize(hDS); src_ysize = GDALGetRasterYSize(hDS); /* * If the RAW_WINDOW attribute is set, use that to establish what to * load. This is normally just set by the mapresample.c module to avoid * problems with rotated maps. */ if (CSLFetchNameValue(layer->processing, "RAW_WINDOW") != NULL) { char **papszTokens = CSLTokenizeString(CSLFetchNameValue(layer->processing, "RAW_WINDOW")); if (layer->debug) msDebug("msDrawGDAL(%s): using RAW_WINDOW=%s, dst=0,0,%d,%d\n", layer->name, CSLFetchNameValue(layer->processing, "RAW_WINDOW"), image->width, image->height); if (CSLCount(papszTokens) != 4) { CSLDestroy(papszTokens); msSetError(MS_IMGERR, "RAW_WINDOW PROCESSING directive corrupt.", "msDrawGDAL()"); return -1; } src_xoff = atoi(papszTokens[0]); src_yoff = atoi(papszTokens[1]); src_xsize = atoi(papszTokens[2]); src_ysize = atoi(papszTokens[3]); dst_xoff = 0; dst_yoff = 0; dst_xsize = image->width; dst_ysize = image->height; CSLDestroy(papszTokens); } /* * Compute the georeferenced window of overlap, and do nothing if there * is no overlap between the map extents, and the file we are operating on. */ else if (layer->transform) { int dst_lrx, dst_lry; if (layer->debug) msDebug("msDrawRasterLayerGDAL(): Entering transform.\n"); msGetGDALGeoTransform(hDS, map, layer, adfGeoTransform); InvGeoTransform(adfGeoTransform, adfInvGeoTransform); mapRect = map->extent; mapRect.minx -= map->cellsize * 0.5; mapRect.maxx += map->cellsize * 0.5; mapRect.miny -= map->cellsize * 0.5; mapRect.maxy += map->cellsize * 0.5; copyRect = mapRect; if (copyRect.minx < GEO_TRANS(adfGeoTransform, 0, src_ysize)) copyRect.minx = GEO_TRANS(adfGeoTransform, 0, src_ysize); if (copyRect.maxx > GEO_TRANS(adfGeoTransform, src_xsize, 0)) copyRect.maxx = GEO_TRANS(adfGeoTransform, src_xsize, 0); if (copyRect.miny < GEO_TRANS(adfGeoTransform + 3, 0, src_ysize)) copyRect.miny = GEO_TRANS(adfGeoTransform + 3, 0, src_ysize); if (copyRect.maxy > GEO_TRANS(adfGeoTransform + 3, src_xsize, 0)) copyRect.maxy = GEO_TRANS(adfGeoTransform + 3, src_xsize, 0); if (copyRect.minx >= copyRect.maxx || copyRect.miny >= copyRect.maxy) { if (layer->debug) msDebug("msDrawRasterLayerGDAL(): Error in overlap calculation.\n"); return 0; } /* * Copy the source and destination raster coordinates. */ llx = GEO_TRANS(adfInvGeoTransform + 0, copyRect.minx, copyRect.miny); lly = GEO_TRANS(adfInvGeoTransform + 3, copyRect.minx, copyRect.miny); urx = GEO_TRANS(adfInvGeoTransform + 0, copyRect.maxx, copyRect.maxy); ury = GEO_TRANS(adfInvGeoTransform + 3, copyRect.maxx, copyRect.maxy); src_xoff = MS_MAX(0, (int)floor(llx + 0.5)); src_yoff = MS_MAX(0, (int)floor(ury + 0.5)); src_xsize = MS_MIN(MS_MAX(0, (int)(urx - llx + 0.5)), GDALGetRasterXSize(hDS) - src_xoff); src_ysize = MS_MIN(MS_MAX(0, (int)(lly - ury + 0.5)), GDALGetRasterYSize(hDS) - src_yoff); /* We want very small windows to use at least one source pixel (#4172) */ if (src_xsize == 0 && (urx - llx) > 0.0) { src_xsize = 1; src_xoff = MS_MIN(src_xoff, GDALGetRasterXSize(hDS) - 1); } if (src_ysize == 0 && (lly - ury) > 0.0) { src_ysize = 1; src_yoff = MS_MIN(src_yoff, GDALGetRasterYSize(hDS) - 1); } if (src_xsize == 0 || src_ysize == 0) { if (layer->debug) msDebug("msDrawRasterLayerGDAL(): no apparent overlap between map view " "and this window(1).\n"); return 0; } if (map->cellsize == 0) { if (layer->debug) msDebug("msDrawRasterLayerGDAL(): Cellsize can't be 0.\n"); return 0; } dst_xoff = (int)((copyRect.minx - mapRect.minx) / map->cellsize); dst_yoff = (int)((mapRect.maxy - copyRect.maxy) / map->cellsize); dst_lrx = (int)((copyRect.maxx - mapRect.minx) / map->cellsize + 0.5); dst_lry = (int)((mapRect.maxy - copyRect.miny) / map->cellsize + 0.5); dst_lrx = MS_MAX(0, MS_MIN(image->width, dst_lrx)); dst_lry = MS_MAX(0, MS_MIN(image->height, dst_lry)); dst_xsize = MS_MAX(0, MS_MIN(image->width, dst_lrx - dst_xoff)); dst_ysize = MS_MAX(0, MS_MIN(image->height, dst_lry - dst_yoff)); if (dst_xsize == 0 || dst_ysize == 0) { if (layer->debug) msDebug("msDrawRasterLayerGDAL(): no apparent overlap between map view " "and this window(2).\n"); return 0; } if (layer->debug) msDebug("msDrawRasterLayerGDAL(): src=%d,%d,%d,%d, dst=%d,%d,%d,%d\n", src_xoff, src_yoff, src_xsize, src_ysize, dst_xoff, dst_yoff, dst_xsize, dst_ysize); #ifndef notdef if (layer->debug) { double d_src_xoff, d_src_yoff, geo_x, geo_y; geo_x = mapRect.minx + dst_xoff * map->cellsize; geo_y = mapRect.maxy - dst_yoff * map->cellsize; d_src_xoff = (geo_x - adfGeoTransform[0]) / adfGeoTransform[1]; d_src_yoff = (geo_y - adfGeoTransform[3]) / adfGeoTransform[5]; msDebug("msDrawRasterLayerGDAL(): source raster PL (%.3f,%.3f) for dst " "PL (%d,%d).\n", d_src_xoff, d_src_yoff, dst_xoff, dst_yoff); } #endif } /* * If layer transforms are turned off, just map 1:1. */ else { dst_xoff = src_xoff = 0; dst_yoff = src_yoff = 0; dst_xsize = src_xsize = MS_MIN(image->width, src_xsize); dst_ysize = src_ysize = MS_MIN(image->height, src_ysize); } /* * In RAWDATA mode we don't fool with colors. Do the raw processing, * and return from the function early. */ if (MS_RENDERER_RAWDATA(image->format)) { return msDrawRasterLayerGDAL_RawMode( map, layer, image, hDS, src_xoff, src_yoff, src_xsize, src_ysize, dst_xoff, dst_yoff, dst_xsize, dst_ysize); } /* * Is this image classified? We consider it classified if there are * classes with an expression string *or* a color range. We don't want * to treat the raster as classified if there is just a bogus class here * to force inclusion in the legend. */ for (i = 0; i < layer->numclasses; i++) { int s; /* change colour based on colour range? */ for (s = 0; s < layer->class[i] -> numstyles; s++) { if (MS_VALID_COLOR(layer->class[i] -> styles[s] -> mincolor) && MS_VALID_COLOR(layer->class[i] -> styles[s] -> maxcolor)) { classified = TRUE; break; } } if (layer->class[i] -> expression.string != NULL) { classified = TRUE; break; } } /* * Set up the band selection. We look for a BANDS directive in the * the PROCESSING options. If not found we default to grey=1, grey=1,alpha=2, * red=1,green=2,blue=3 or red=1,green=2,blue=3,alpha>=4. */ if (CSLFetchNameValue(layer->processing, "BANDS") == NULL) { const int gdal_band_count = GDALGetRasterCount(hDS); red_band = 1; if (gdal_band_count >= 4) { /* The alpha band is not necessarily the 4th one */ for (i = 4; i <= gdal_band_count; i++) { if (GDALGetRasterColorInterpretation(GDALGetRasterBand(hDS, i)) == GCI_AlphaBand) { alpha_band = i; break; } } } if (gdal_band_count >= 3) { green_band = 2; blue_band = 3; } if (gdal_band_count == 2 && GDALGetRasterColorInterpretation( GDALGetRasterBand(hDS, 2)) == GCI_AlphaBand) alpha_band = 2; hBand1 = GDALGetRasterBand(hDS, red_band); if (classified || GDALGetRasterColorTable(hBand1) != NULL) { alpha_band = 0; green_band = 0; blue_band = 0; } } else { int *band_list; band_list = msGetGDALBandList(layer, hDS, 4, &band_count); if (band_list == NULL) return -1; if (band_count > 0) red_band = band_list[0]; else red_band = 0; if (band_count > 2) { green_band = band_list[1]; blue_band = band_list[2]; } else { green_band = 0; blue_band = 0; } if (band_count > 3) alpha_band = band_list[3]; else alpha_band = 0; free(band_list); } band_numbers[0] = red_band; band_numbers[1] = green_band; band_numbers[2] = blue_band; band_numbers[3] = 0; if (blue_band != 0 && alpha_band != 0) { band_numbers[3] = alpha_band; band_count = 4; } else if (blue_band != 0 && alpha_band == 0) band_count = 3; else if (alpha_band != 0) { band_numbers[1] = alpha_band; band_count = 2; } else band_count = 1; if (layer->debug > 1 || (layer->debug > 0 && green_band != 0)) { msDebug( "msDrawRasterLayerGDAL(): red,green,blue,alpha bands = %d,%d,%d,%d\n", red_band, green_band, blue_band, alpha_band); } /* * Get band handles for PC256, RGB or RGBA cases. */ hBand1 = GDALGetRasterBand(hDS, red_band); if (hBand1 == NULL) return -1; hBand2 = hBand3 = hBandAlpha = NULL; if (green_band != 0) { hBand1 = GDALGetRasterBand(hDS, red_band); hBand2 = GDALGetRasterBand(hDS, green_band); hBand3 = GDALGetRasterBand(hDS, blue_band); if (hBand1 == NULL || hBand2 == NULL || hBand3 == NULL) return -1; } if (alpha_band != 0) hBandAlpha = GDALGetRasterBand(hDS, alpha_band); /* * The logic for a classification rendering of non-8bit raster bands * is sufficiently different than the normal mechanism of loading * into an 8bit buffer, that we isolate it into it's own subfunction. */ if (classified && hBand1 != NULL && GDALGetRasterDataType(hBand1) != GDT_Byte) { return msDrawRasterLayerGDAL_16BitClassification( map, layer, rb, hBand1, src_xoff, src_yoff, src_xsize, src_ysize, dst_xoff, dst_yoff, dst_xsize, dst_ysize); } /* * Get colormap for this image. If there isn't one, and we have only * one band create a greyscale colormap. */ bool isDefaultGreyscale = false; if (hBand2 != NULL) hColorMap = NULL; else { hColorMap = GDALGetRasterColorTable(hBand1); if (hColorMap != NULL) hColorMap = GDALCloneColorTable(hColorMap); else { hColorMap = GDALCreateColorTable(GPI_RGB); isDefaultGreyscale = true; for (i = 0; i < 256; i++) { colorObj pixel = {i, i, i, 0}; GDALColorEntry sEntry; if (MS_COMPARE_COLORS(pixel, layer->offsite)) { sEntry.c1 = 0; sEntry.c2 = 0; sEntry.c3 = 0; sEntry.c4 = 0; /* alpha set to zero */ } else { sEntry.c1 = i; sEntry.c2 = i; sEntry.c3 = i; sEntry.c4 = 255; } GDALSetColorEntry(hColorMap, i, &sEntry); } } /* ** If we have a known NODATA value, mark it now as transparent. */ { int bGotNoData; double dfNoDataValue = msGetGDALNoDataValue(layer, hBand1, &bGotNoData); if (bGotNoData && dfNoDataValue >= 0 && dfNoDataValue < GDALGetColorEntryCount(hColorMap)) { GDALColorEntry sEntry; memcpy(&sEntry, GDALGetColorEntry(hColorMap, (int)dfNoDataValue), sizeof(GDALColorEntry)); sEntry.c4 = 0; GDALSetColorEntry(hColorMap, (int)dfNoDataValue, &sEntry); } } } /* * Allocate imagery buffers. */ pabyRaw1 = (unsigned char *)malloc(((size_t)dst_xsize) * dst_ysize * band_count); if (pabyRaw1 == NULL) { msSetError(MS_MEMERR, "Allocating work image of size %dx%dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize, band_count); return -1; } if (hBand2 != NULL && hBand3 != NULL) { pabyRaw2 = pabyRaw1 + dst_xsize * dst_ysize * 1; pabyRaw3 = pabyRaw1 + dst_xsize * dst_ysize * 2; } if (hBandAlpha != NULL) { if (hBand2 != NULL) pabyRawAlpha = pabyRaw1 + dst_xsize * dst_ysize * 3; else pabyRawAlpha = pabyRaw1 + dst_xsize * dst_ysize * 1; } /* * Load image data into buffers with scaling, etc. */ bool bScaled = false; double dfScaleMin = 0; double dfScaleRatio = 0; bool *pbIsNoDataBuffer = NULL; if (LoadGDALImages(hDS, band_numbers, band_count, layer, src_xoff, src_yoff, src_xsize, src_ysize, pabyRaw1, dst_xsize, dst_ysize, &bHaveRGBNoData, &nNoData1, &nNoData2, &nNoData3, &bScaled, &dfScaleMin, &dfScaleRatio, &pbIsNoDataBuffer) == -1) { free(pabyRaw1); free(pbIsNoDataBuffer); return -1; } const char *sgamma = msLayerGetProcessingKey(layer, "GAMMA"); const double gamma = sgamma ? CPLAtof(sgamma) : 1.0; /* * Setup the mapping between source eight bit pixel values, and the * output images color table. There are two general cases, where the * class colors are provided by the MAP file, or where we use the native * color table. */ if (classified) { int c; const char *pszRangeColorspace = msLayerGetProcessingKey(layer, "RANGE_COLORSPACE"); colorspace iRangeColorspace; #ifndef NDEBUG cmap_set = TRUE; #endif if (hColorMap == NULL) { msSetError(MS_IOERR, "Attempt to classify 24bit image, this is unsupported.", "drawGDAL()"); free(pabyRaw1); free(pbIsNoDataBuffer); return -1; } if (!pszRangeColorspace || !strcasecmp(pszRangeColorspace, "RGB")) { iRangeColorspace = MS_COLORSPACE_RGB; } else if (!strcasecmp(pszRangeColorspace, "HSL")) { iRangeColorspace = MS_COLORSPACE_HSL; } else { msSetError(MS_MISCERR, "Unknown RANGE_COLORSPACE \"%s\", expecting RGB or HSL", "drawGDAL()", pszRangeColorspace); GDALDestroyColorTable(hColorMap); free(pabyRaw1); free(pbIsNoDataBuffer); return -1; } int color_count = GDALGetColorEntryCount(hColorMap); const bool bScaleColors = bScaled && !isDefaultGreyscale; if (!bScaleColors && color_count > 256) color_count = 256; for (i = 0; i < color_count; i++) { colorObj pixel; int colormap_index; GDALColorEntry sEntry; GDALGetColorEntryAsRGB(hColorMap, i, &sEntry); const int j = bScaleColors ? MAX(0, MIN(255, (int)((i - dfScaleMin) * dfScaleRatio))) : i; pixel.red = sEntry.c1; pixel.green = sEntry.c2; pixel.blue = sEntry.c3; colormap_index = i; if (!MS_COMPARE_COLORS(pixel, layer->offsite)) { c = msGetClass(layer, &pixel, colormap_index); if (c != -1) { /* belongs to any class */ int s; /* change colour based on colour range? Currently we only address the greyscale case properly. */ if (MS_VALID_COLOR(layer->class[c] -> styles[0] -> mincolor)) { for (s = 0; s < layer->class[c] -> numstyles; s++) { if (MS_VALID_COLOR(layer->class[c] -> styles[s] -> mincolor) && MS_VALID_COLOR(layer->class[c] -> styles[s] -> maxcolor)) { if (sEntry.c1 >= layer->class[c] -> styles[s] -> minvalue && sEntry.c1 <= layer->class[c] -> styles[s] -> maxvalue) { msValueToRange(layer->class[c] -> styles[s], sEntry.c1, iRangeColorspace); if (MS_VALID_COLOR(layer->class[c] -> styles[s] -> color)) { rb_cmap[0][j] = layer->class[c]->styles[s]->color.red; rb_cmap[1][j] = layer->class[c]->styles[s]->color.green; rb_cmap[2][j] = layer->class[c]->styles[s]->color.blue; rb_cmap[3][j] = (layer->class[c] -> styles[s] -> color.alpha != 255) ? (layer->class[c] -> styles[s] -> color.alpha) : (255 * layer->class[c] -> styles[0] -> opacity / 100); break; } } } } } else if (MS_TRANSPARENT_COLOR( layer->class[c] -> styles[0] -> color)) /* leave it transparent */; else if (MS_VALID_COLOR(layer->class[c] -> styles[0] -> color)) { rb_cmap[0][j] = layer->class[c]->styles[0]->color.red; rb_cmap[1][j] = layer->class[c]->styles[0]->color.green; rb_cmap[2][j] = layer->class[c]->styles[0]->color.blue; rb_cmap[3][j] = (255 * layer->class[c] -> styles[0] -> opacity / 100); } else { /* Use raster color */ rb_cmap[0][j] = pixel.red; rb_cmap[1][j] = pixel.green; rb_cmap[2][j] = pixel.blue; rb_cmap[3][j] = 255; } if (gamma != 1.0) { rb_cmap[0][j] = GAMMA_CORRECT(rb_cmap[0][j], gamma); rb_cmap[1][j] = GAMMA_CORRECT(rb_cmap[1][j], gamma); rb_cmap[2][j] = GAMMA_CORRECT(rb_cmap[2][j], gamma); } } } } } else if (hBand2 == NULL && hColorMap != NULL && rb->type == MS_BUFFER_BYTE_RGBA) { int color_count; #ifndef NDEBUG cmap_set = TRUE; #endif color_count = MS_MIN(256, GDALGetColorEntryCount(hColorMap)); const bool bScaleColors = bScaled && !isDefaultGreyscale; for (i = 0; i < color_count; i++) { GDALColorEntry sEntry; GDALGetColorEntryAsRGB(hColorMap, i, &sEntry); const int j = bScaleColors ? MAX(0, MIN(255, (int)((i - dfScaleMin) * dfScaleRatio))) : i; if (sEntry.c4 != 0 && (!MS_VALID_COLOR(layer->offsite) || layer->offsite.red != sEntry.c1 || layer->offsite.green != sEntry.c2 || layer->offsite.blue != sEntry.c3)) { rb_cmap[0][j] = sEntry.c1; rb_cmap[1][j] = sEntry.c2; rb_cmap[2][j] = sEntry.c3; rb_cmap[3][j] = sEntry.c4; if (gamma != 1.0) { rb_cmap[0][j] = GAMMA_CORRECT(rb_cmap[0][j], gamma); rb_cmap[1][j] = GAMMA_CORRECT(rb_cmap[1][j], gamma); rb_cmap[2][j] = GAMMA_CORRECT(rb_cmap[2][j], gamma); } } } } if (bHaveRGBNoData && layer->debug) msDebug("msDrawGDAL(): using RGB nodata values from GDAL dataset.\n"); /* -------------------------------------------------------------------- */ /* If there was no alpha band, but we have a dataset level mask */ /* load it as massage it so it will function as our alpha for */ /* transparency purposes. */ /* -------------------------------------------------------------------- */ if (hBandAlpha == NULL) { int nMaskFlags = GDALGetMaskFlags(hBand1); if (CSLTestBoolean( CSLFetchNameValueDef(layer->processing, "USE_MASK_BAND", "YES")) && (nMaskFlags & GMF_PER_DATASET) != 0 && (nMaskFlags & (GMF_NODATA | GMF_ALL_VALID)) == 0) { CPLErr eErr; unsigned char *pabyOrig = pabyRaw1; if (layer->debug) msDebug("msDrawGDAL(): using GDAL mask band for alpha.\n"); band_count++; pabyRaw1 = (unsigned char *)realloc(pabyOrig, ((size_t)dst_xsize) * dst_ysize * band_count); if (pabyRaw1 == NULL) { msSetError(MS_MEMERR, "Allocating work image of size %dx%dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize, band_count); free(pabyOrig); if (hColorMap != NULL) GDALDestroyColorTable(hColorMap); free(pbIsNoDataBuffer); return -1; } if (hBand2 != NULL) { pabyRaw2 = pabyRaw1 + dst_xsize * dst_ysize * 1; pabyRaw3 = pabyRaw1 + dst_xsize * dst_ysize * 2; pabyRawAlpha = pabyRaw1 + dst_xsize * dst_ysize * 3; } else { pabyRawAlpha = pabyRaw1 + dst_xsize * dst_ysize * 1; } hBandAlpha = GDALGetMaskBand(hBand1); eErr = GDALRasterIO(hBandAlpha, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pabyRawAlpha, dst_xsize, dst_ysize, GDT_Byte, 0, 0); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALRasterIO() failed: %s", "drawGDAL()", CPLGetLastErrorMsg()); if (hColorMap != NULL) GDALDestroyColorTable(hColorMap); free(pabyRaw1); free(pbIsNoDataBuffer); return -1; } /* In case the mask is not an alpha channel, expand values of 1 to 255, */ /* so we can deal as it was an alpha band afterwards */ if ((nMaskFlags & GMF_ALPHA) == 0) { for (i = 0; i < dst_xsize * dst_ysize; i++) if (pabyRawAlpha[i]) pabyRawAlpha[i] = 255; } } } /* -------------------------------------------------------------------- */ /* Single band plus colormap and alpha to truecolor. (RB) */ /* -------------------------------------------------------------------- */ if (hBand2 == NULL && rb->type == MS_BUFFER_BYTE_RGBA && hBandAlpha != NULL) { assert(cmap_set); int k = 0; for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { for (int j = dst_xoff; j < dst_xoff + dst_xsize; j++, k++) { int src_pixel, src_alpha, cmap_alpha, merged_alpha; if (SKIP_MASK(j, i) || (pbIsNoDataBuffer && pbIsNoDataBuffer[k])) continue; src_pixel = pabyRaw1[k]; src_alpha = pabyRawAlpha[k]; cmap_alpha = rb_cmap[3][src_pixel]; merged_alpha = (src_alpha * cmap_alpha) / 255; if (merged_alpha < 2) /* do nothing - transparent */; else if (merged_alpha > 253) { RB_SET_PIXEL(rb, j, i, rb_cmap[0][src_pixel], rb_cmap[1][src_pixel], rb_cmap[2][src_pixel], cmap_alpha); } else { RB_MIX_PIXEL(rb, j, i, rb_cmap[0][src_pixel], rb_cmap[1][src_pixel], rb_cmap[2][src_pixel], merged_alpha); } } } } /* -------------------------------------------------------------------- */ /* Single band plus colormap (no alpha) to truecolor (RB) */ /* -------------------------------------------------------------------- */ else if (hBand2 == NULL && rb->type == MS_BUFFER_BYTE_RGBA) { assert(cmap_set); int k = 0; for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { for (int j = dst_xoff; j < dst_xoff + dst_xsize; j++, k++) { int src_pixel = pabyRaw1[k]; if (SKIP_MASK(j, i) || (pbIsNoDataBuffer && pbIsNoDataBuffer[k])) continue; if (rb_cmap[3][src_pixel] > 253) { RB_SET_PIXEL(rb, j, i, rb_cmap[0][src_pixel], rb_cmap[1][src_pixel], rb_cmap[2][src_pixel], rb_cmap[3][src_pixel]); } else if (rb_cmap[3][src_pixel] > 1) { RB_MIX_PIXEL(rb, j, i, rb_cmap[0][src_pixel], rb_cmap[1][src_pixel], rb_cmap[2][src_pixel], rb_cmap[3][src_pixel]); } } } } /* -------------------------------------------------------------------- */ /* Input is 3 band RGB. Alpha blending is mixed into the loop */ /* since this case is less commonly used and has lots of other */ /* overhead. (RB) */ /* -------------------------------------------------------------------- */ else if (hBand3 != NULL && rb->type == MS_BUFFER_BYTE_RGBA) { int k = 0; for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { for (int j = dst_xoff; j < dst_xoff + dst_xsize; j++, k++) { if (SKIP_MASK(j, i) || (pbIsNoDataBuffer && pbIsNoDataBuffer[k])) continue; int red = pabyRaw1[k]; int green = pabyRaw2[k]; int blue = pabyRaw3[k]; if (MS_VALID_COLOR(layer->offsite) && red == layer->offsite.red && green == layer->offsite.green && blue == layer->offsite.blue) continue; if (bHaveRGBNoData && red == nNoData1 && green == nNoData2 && blue == nNoData3) continue; if (pabyRawAlpha == NULL || pabyRawAlpha[k] == 255) { if (gamma != 1.0) { red = GAMMA_CORRECT(red, gamma); green = GAMMA_CORRECT(green, gamma); blue = GAMMA_CORRECT(blue, gamma); } RB_SET_PIXEL(rb, j, i, red, green, blue, 255); } else if (pabyRawAlpha[k] != 0) { if (gamma != 1.0) { red = GAMMA_CORRECT(red, gamma); green = GAMMA_CORRECT(green, gamma); blue = GAMMA_CORRECT(blue, gamma); } RB_MIX_PIXEL(rb, j, i, red, green, blue, pabyRawAlpha[k]); } } } } /* ** Cleanup */ free(pabyRaw1); free(pbIsNoDataBuffer); if (hColorMap != NULL) GDALDestroyColorTable(hColorMap); return 0; } /************************************************************************/ /* ParseDefaultLUT() */ /************************************************************************/ static int ParseDefaultLUT(const char *lut_def, GByte *lut, int nMaxValIn) { const char *lut_read; int last_in = 0, last_out = 0, all_done = FALSE; /* -------------------------------------------------------------------- */ /* Parse definition, applying to lut on the fly. */ /* -------------------------------------------------------------------- */ lut_read = lut_def; while (!all_done) { int this_in = 0, this_out = 0; int lut_i; while (isspace(*lut_read)) lut_read++; /* if we are at end, assume nMaxValIn:255 */ if (*lut_read == '\0') { all_done = TRUE; if (last_in != nMaxValIn) { this_in = nMaxValIn; this_out = 255; } } /* otherwise read "in:out", and skip past */ else { this_in = atoi(lut_read); while (*lut_read != ':' && *lut_read) lut_read++; if (*lut_read == ':') lut_read++; while (isspace(*lut_read)) lut_read++; this_out = atoi(lut_read); while (*lut_read && *lut_read != ',' && *lut_read != '\n') lut_read++; if (*lut_read == ',' || *lut_read == '\n') lut_read++; while (isspace(*lut_read)) lut_read++; } this_in = MS_MAX(0, MS_MIN(nMaxValIn, this_in)); this_out = MS_MAX(0, MS_MIN(255, this_out)); /* apply linear values from last in:out to this in:out */ for (lut_i = last_in; lut_i <= this_in; lut_i++) { double ratio; if (last_in == this_in) ratio = 1.0; else ratio = (lut_i - last_in) / (double)(this_in - last_in); lut[lut_i] = (int)floor(((1.0 - ratio) * last_out + ratio * this_out) + 0.5); } last_in = this_in; last_out = this_out; } return 0; } /************************************************************************/ /* LutFromGimpLine() */ /************************************************************************/ static int LutFromGimpLine(char *lut_line, GByte *lut) { char wrkLUTDef[1000]; int i, count = 0; char **tokens; /* cleanup white space at end of line (DOS LF, etc) */ i = strlen(lut_line) - 1; while (i > 0 && isspace(lut_line[i])) lut_line[i--] = '\0'; while (*lut_line == 10 || *lut_line == 13) lut_line++; /* tokenize line */ tokens = CSLTokenizeString(lut_line); if (CSLCount(tokens) != 17 * 2) { CSLDestroy(tokens); msSetError(MS_MISCERR, "GIMP curve file appears corrupt.", "LutFromGimpLine()"); return -1; } /* Convert to our own format */ wrkLUTDef[0] = '\0'; for (i = 0; i < 17; i++) { if (atoi(tokens[i * 2]) >= 0) { if (count++ > 0) strlcat(wrkLUTDef, ",", sizeof(wrkLUTDef)); snprintf(wrkLUTDef + strlen(wrkLUTDef), sizeof(wrkLUTDef) - strlen(wrkLUTDef), "%s:%s", tokens[i * 2], tokens[i * 2 + 1]); } } CSLDestroy(tokens); return ParseDefaultLUT(wrkLUTDef, lut, 255); } /************************************************************************/ /* ParseGimpLUT() */ /* */ /* Parse a Gimp style LUT. */ /************************************************************************/ static int ParseGimpLUT(const char *lut_def, GByte *lut, int iColorIndex) { int i; GByte lutValue[256]; GByte lutColorBand[256]; char **lines = CSLTokenizeStringComplex(lut_def, "\n", FALSE, FALSE); if (!EQUALN(lines[0], "# GIMP Curves File", 18) || CSLCount(lines) < 6) { msSetError(MS_MISCERR, "GIMP curve file appears corrupt.", "ParseGimpLUT()"); CSLDestroy(lines); return -1; } /* * Convert the overall curve, and the color band specific curve into LUTs. */ if (LutFromGimpLine(lines[1], lutValue) != 0 || LutFromGimpLine(lines[iColorIndex + 1], lutColorBand) != 0) { CSLDestroy(lines); return -1; } CSLDestroy(lines); /* * Compose the two luts as if the raw value passed through the color band * specific lut, and then the general value lut. Usually one or the * other will be the identity mapping, but not always. */ for (i = 0; i < 256; i++) { lut[i] = lutValue[lutColorBand[i]]; } return 0; } /************************************************************************/ /* LoadLUT() */ /* */ /* Load a LUT according to RFC 21. */ /************************************************************************/ static int LoadLUT(layerObj *layer, int iColorIndex, char **ppszLutDef) { const char *lut_def; char key[20], lut_def_fromfile[2500]; *ppszLutDef = NULL; /* -------------------------------------------------------------------- */ /* Get lut specifier from processing directives. Do nothing if */ /* none are found. */ /* -------------------------------------------------------------------- */ sprintf(key, "LUT_%d", iColorIndex); lut_def = msLayerGetProcessingKey(layer, key); if (lut_def == NULL) lut_def = msLayerGetProcessingKey(layer, "LUT"); if (lut_def == NULL) return 0; /* -------------------------------------------------------------------- */ /* Does this look like a file? If so, read it into memory. */ /* -------------------------------------------------------------------- */ if (strspn(lut_def, "0123456789:, ") != strlen(lut_def)) { FILE *fp; char path[MS_MAXPATHLEN]; int len; msBuildPath(path, layer->map->mappath, lut_def); fp = fopen(path, "rb"); if (fp == NULL) { msSetError(MS_IOERR, "Failed to open LUT file '%s'.", "drawGDAL()", path); return -1; } len = fread(lut_def_fromfile, 1, sizeof(lut_def_fromfile), fp); fclose(fp); if (len == sizeof(lut_def_fromfile)) { msSetError(MS_IOERR, "LUT definition from file %s longer than maximum buffer size " "(%d bytes).", "drawGDAL()", path, (int)sizeof(lut_def_fromfile)); return -1; } lut_def_fromfile[len] = '\0'; lut_def = lut_def_fromfile; } *ppszLutDef = msStrdup(lut_def); return 0; } /************************************************************************/ /* FreeLUTs() */ /************************************************************************/ static void FreeLUTs(char **apszLUTs) { int i; for (i = 0; i < 4; i++) msFree(apszLUTs[i]); msFree(apszLUTs); } /************************************************************************/ /* LoadLUTs() */ /* */ /* Return an array of 4 strings (some possibly NULL) with loaded LUTs */ /* or NULL in case of failure. */ /************************************************************************/ static char **LoadLUTs(layerObj *layer, int band_count) { int i; char **apszLUTs; assert(band_count <= 4); apszLUTs = (char **)msSmallCalloc(4, sizeof(char *)); for (i = 0; i < band_count; i++) { if (LoadLUT(layer, i + 1, &apszLUTs[i]) != 0) { FreeLUTs(apszLUTs); return NULL; } } return apszLUTs; } /************************************************************************/ /* GetDataTypeAppropriateForLUTS() */ /* */ /* This does a quick examination of the LUT strings to determine */ /* if they have input values > 255, in which case the raster data */ /* must be queries on 16-bits. */ /************************************************************************/ static GDALDataType GetDataTypeAppropriateForLUTS(char **apszLUTs) { GDALDataType eDT = GDT_Byte; int i; for (i = 0; i < 4; i++) { const char *pszLastTuple; int nLastInValue; if (apszLUTs[i] == NULL) continue; if (EQUALN(apszLUTs[i], "# GIMP", 6)) continue; /* Find last in:out tuple in string */ pszLastTuple = strrchr(apszLUTs[i], ','); if (pszLastTuple == NULL) pszLastTuple = apszLUTs[i]; else pszLastTuple++; while (*pszLastTuple == ' ') pszLastTuple++; nLastInValue = atoi(pszLastTuple); if (nLastInValue > 255) { eDT = GDT_UInt16; break; } } return eDT; } /************************************************************************/ /* ApplyLUT() */ /************************************************************************/ static int ApplyLUT(int iColorIndex, const char *lut_def, const void *pInBuffer, GDALDataType eDT, GByte *pabyOutBuffer, int nPixelCount) { int i, err; GByte byteLut[256]; GByte *uint16Lut = NULL; assert(eDT == GDT_Byte || eDT == GDT_UInt16); if (lut_def == NULL) { if (pInBuffer != pabyOutBuffer) { GDALCopyWords((void *)pInBuffer, eDT, GDALGetDataTypeSize(eDT) / 8, pabyOutBuffer, GDT_Byte, 1, nPixelCount); } return 0; } /* -------------------------------------------------------------------- */ /* Parse the LUT description. */ /* -------------------------------------------------------------------- */ if (EQUALN(lut_def, "# GIMP", 6)) { if (eDT != GDT_Byte) { msSetError(MS_MISCERR, "Cannot apply a GIMP LUT on a 16-bit buffer", "ApplyLUT()"); return -1; } err = ParseGimpLUT(lut_def, byteLut, iColorIndex); } else { if (eDT == GDT_Byte) err = ParseDefaultLUT(lut_def, byteLut, 255); else { uint16Lut = (GByte *)malloc(65536); if (uint16Lut == NULL) { msSetError(MS_MEMERR, "Cannot allocate 16-bit LUT", "ApplyLUT()"); return -1; } err = ParseDefaultLUT(lut_def, uint16Lut, 65535); } } /* -------------------------------------------------------------------- */ /* Apply LUT. */ /* -------------------------------------------------------------------- */ if (eDT == GDT_Byte) { for (i = 0; i < nPixelCount; i++) pabyOutBuffer[i] = byteLut[((GByte *)pInBuffer)[i]]; } else { for (i = 0; i < nPixelCount; i++) pabyOutBuffer[i] = uint16Lut[((GUInt16 *)pInBuffer)[i]]; free(uint16Lut); } return err; } /************************************************************************/ /* LoadGDALImages() */ /* */ /* This call will load and process 1-4 bands of input for the */ /* selected rectangle, loading the result into the passed 8bit */ /* buffer. The processing options include scaling. */ /************************************************************************/ static int LoadGDALImages(GDALDatasetH hDS, int band_numbers[4], int band_count, layerObj *layer, int src_xoff, int src_yoff, int src_xsize, int src_ysize, GByte *pabyWholeBuffer, int dst_xsize, int dst_ysize, int *pbHaveRGBNoData, int *pnNoData1, int *pnNoData2, int *pnNoData3, bool *pbScaled, double *pdfScaleMin, double *pdfScaleRatio, bool **ppbIsNoDataBuffer) { int iColorIndex, result_code = 0; CPLErr eErr; float *pafWholeRawData; char **papszLUTs; *pbScaled = false; *pdfScaleMin = 0; *pdfScaleRatio = 0; *ppbIsNoDataBuffer = NULL; /* -------------------------------------------------------------------- */ /* If we have no alpha band, but we do have three input */ /* bands, then check for nodata values. If we only have one */ /* input band, then nodata will already have been adderssed as */ /* part of the real or manufactured color table. */ /* -------------------------------------------------------------------- */ if (band_count == 3) { *pnNoData1 = (int)msGetGDALNoDataValue( layer, GDALGetRasterBand(hDS, band_numbers[0]), pbHaveRGBNoData); if (*pbHaveRGBNoData) *pnNoData2 = (int)msGetGDALNoDataValue( layer, GDALGetRasterBand(hDS, band_numbers[1]), pbHaveRGBNoData); if (*pbHaveRGBNoData) *pnNoData3 = (int)msGetGDALNoDataValue( layer, GDALGetRasterBand(hDS, band_numbers[2]), pbHaveRGBNoData); } /* -------------------------------------------------------------------- */ /* Are we doing a simple, non-scaling case? If so, read directly */ /* and return. */ /* -------------------------------------------------------------------- */ if (CSLFetchNameValue(layer->processing, "SCALE") == NULL && CSLFetchNameValue(layer->processing, "SCALE_1") == NULL && CSLFetchNameValue(layer->processing, "SCALE_2") == NULL && CSLFetchNameValue(layer->processing, "SCALE_3") == NULL && CSLFetchNameValue(layer->processing, "SCALE_4") == NULL) { GDALDataType eDT; GUInt16 *panBuffer = NULL; void *pBuffer; papszLUTs = LoadLUTs(layer, band_count); if (papszLUTs == NULL) { return -1; } eDT = GetDataTypeAppropriateForLUTS(papszLUTs); if (eDT == GDT_UInt16) { panBuffer = (GUInt16 *)malloc(sizeof(GUInt16) * dst_xsize * dst_ysize * band_count); if (panBuffer == NULL) { msSetError(MS_MEMERR, "Allocating work uint16 image of size %dx%dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize, band_count); FreeLUTs(papszLUTs); return -1; } pBuffer = panBuffer; } else pBuffer = pabyWholeBuffer; eErr = GDALDatasetRasterIO(hDS, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pBuffer, dst_xsize, dst_ysize, eDT, band_count, band_numbers, 0, 0, 0); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALDatasetRasterIO() failed: %s", "drawGDAL()", CPLGetLastErrorMsg()); FreeLUTs(papszLUTs); msFree(panBuffer); return -1; } for (iColorIndex = 0; iColorIndex < band_count && result_code == 0; iColorIndex++) { result_code = ApplyLUT(iColorIndex + 1, papszLUTs[iColorIndex], (GByte *)pBuffer + dst_xsize * dst_ysize * iColorIndex * (GDALGetDataTypeSize(eDT) / 8), eDT, pabyWholeBuffer + dst_xsize * dst_ysize * iColorIndex, dst_xsize * dst_ysize); } FreeLUTs(papszLUTs); msFree(panBuffer); return result_code; } /* -------------------------------------------------------------------- */ /* Disable use of nodata if we are doing scaling. */ /* -------------------------------------------------------------------- */ *pbHaveRGBNoData = FALSE; /* -------------------------------------------------------------------- */ /* We need to do some scaling. Will load into either a 16bit */ /* unsigned or a floating point buffer depending on the source */ /* data. We offer a special case for 16U data because it is */ /* common and it is a substantial win to avoid a lot of floating */ /* point operations on it. */ /* -------------------------------------------------------------------- */ /* TODO */ /* -------------------------------------------------------------------- */ /* Allocate the raw imagery buffer, and load into it (band */ /* interleaved). */ /* -------------------------------------------------------------------- */ pafWholeRawData = (float *)malloc(sizeof(float) * dst_xsize * dst_ysize * band_count); if (pafWholeRawData == NULL) { msSetError(MS_MEMERR, "Allocating work float image of size %dx%dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize, band_count); return -1; } eErr = GDALDatasetRasterIO(hDS, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pafWholeRawData, dst_xsize, dst_ysize, GDT_Float32, band_count, band_numbers, 0, 0, 0); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALDatasetRasterIO() failed: %s", "drawGDAL()", CPLGetLastErrorMsg()); free(pafWholeRawData); return -1; } papszLUTs = LoadLUTs(layer, band_count); if (papszLUTs == NULL) { free(pafWholeRawData); return -1; } if (GetDataTypeAppropriateForLUTS(papszLUTs) != GDT_Byte) { msDebug("LoadGDALImage(%s): One of the LUT contains a input value > 255.\n" "This is not properly supported in combination with SCALE\n", layer->name); } /* -------------------------------------------------------------------- */ /* Fetch the scale processing option. */ /* -------------------------------------------------------------------- */ for (iColorIndex = 0; iColorIndex < band_count; iColorIndex++) { unsigned char *pabyBuffer; double dfScaleMin = 0.0, dfScaleMax = 255.0, dfScaleRatio = 0, dfNoDataValue; const char *pszScaleInfo; float *pafRawData; int nPixelCount = dst_xsize * dst_ysize, i, bGotNoData = FALSE; GDALRasterBandH hBand = GDALGetRasterBand(hDS, band_numbers[iColorIndex]); pszScaleInfo = CSLFetchNameValue(layer->processing, "SCALE"); const bool bIsAllBandScale = pszScaleInfo != NULL; if (pszScaleInfo == NULL) { char szBandScalingName[20]; sprintf(szBandScalingName, "SCALE_%d", iColorIndex + 1); pszScaleInfo = CSLFetchNameValue(layer->processing, szBandScalingName); } if (pszScaleInfo != NULL) { char **papszTokens; papszTokens = CSLTokenizeStringComplex(pszScaleInfo, " ,", FALSE, FALSE); if (CSLCount(papszTokens) == 1 && EQUAL(papszTokens[0], "AUTO")) { if (bIsAllBandScale && GDALGetRasterColorInterpretation(hBand) == GCI_AlphaBand && GDALGetRasterDataType(hBand) == GDT_Byte) { // Do not try to scale the alpha band, as it is going to produce // wrong results dfScaleMin = 0.0; dfScaleMax = 255.0; dfScaleRatio = 1.0; } else { dfScaleMin = dfScaleMax = 0.0; } } else if (CSLCount(papszTokens) != 2) { free(pafWholeRawData); CSLDestroy(papszTokens); FreeLUTs(papszLUTs); msSetError(MS_MISCERR, "SCALE PROCESSING option unparsable for layer %s.", "msDrawGDAL()", layer->name); return -1; } else { dfScaleMin = atof(papszTokens[0]); dfScaleMax = atof(papszTokens[1]); } CSLDestroy(papszTokens); } /* -------------------------------------------------------------------- */ /* If we are using autoscaling, then compute the max and min */ /* now. Perhaps we should eventually honour the offsite value */ /* as a nodata value, or get it from GDAL. */ /* -------------------------------------------------------------------- */ pafRawData = pafWholeRawData + iColorIndex * dst_xsize * dst_ysize; dfNoDataValue = msGetGDALNoDataValue(layer, hBand, &bGotNoData); /* we force assignment to a float rather than letting pafRawData[i] get promoted to double later to avoid float precision issues. */ float fNoDataValue = (float)dfNoDataValue; if (dfScaleMin == dfScaleMax) { int bMinMaxSet = 0; /* we force assignment to a float rather than letting pafRawData[i] get promoted to double later to avoid float precision issues. */ float fNoDataValue = (float)dfNoDataValue; for (i = 0; i < nPixelCount; i++) { if (bGotNoData && IsNoData(pafRawData[i], fNoDataValue)) continue; if (CPLIsNan(pafRawData[i])) continue; if (!bMinMaxSet) { dfScaleMin = dfScaleMax = pafRawData[i]; bMinMaxSet = TRUE; } dfScaleMin = MS_MIN(dfScaleMin, pafRawData[i]); dfScaleMax = MS_MAX(dfScaleMax, pafRawData[i]); } if (dfScaleMin == dfScaleMax) dfScaleMax = dfScaleMin + 1.0; } if (layer->debug > 0) msDebug("msDrawGDAL(%s): scaling to 8bit, src range=%g,%g\n", layer->name, dfScaleMin, dfScaleMax); /* -------------------------------------------------------------------- */ /* Now process the data. */ /* -------------------------------------------------------------------- */ if (dfScaleRatio == 0.0) dfScaleRatio = 256.0 / (dfScaleMax - dfScaleMin); pabyBuffer = pabyWholeBuffer + iColorIndex * nPixelCount; if (iColorIndex == 0 && bGotNoData) *ppbIsNoDataBuffer = (bool *)calloc(nPixelCount, 1); for (i = 0; i < nPixelCount; i++) { float fScaledValue; if (bGotNoData && IsNoData(pafRawData[i], fNoDataValue)) { if (iColorIndex == 0) (*ppbIsNoDataBuffer)[i] = true; continue; } fScaledValue = (float)((pafRawData[i] - dfScaleMin) * dfScaleRatio); if (fScaledValue < 0.0) pabyBuffer[i] = 0; else if (fScaledValue > 255.0) pabyBuffer[i] = 255; else pabyBuffer[i] = (int)fScaledValue; } if (iColorIndex == 0) { *pbScaled = true; *pdfScaleMin = dfScaleMin; *pdfScaleRatio = dfScaleRatio; } /* -------------------------------------------------------------------- */ /* Report a warning if NODATA keyword was applied. We are */ /* unable to utilize it since we can't return any pixels marked */ /* as nodata from this function. Need to fix someday. */ /* -------------------------------------------------------------------- */ if (bGotNoData) msDebug("LoadGDALImage(%s): NODATA value %g in GDAL\n" "file or PROCESSING directive largely ignored. Not yet fully " "supported for\n" "unclassified scaled data. The NODATA value is excluded from " "auto-scaling\n" "min/max computation, but will not be transparent.\n", layer->name, dfNoDataValue); /* -------------------------------------------------------------------- */ /* Apply LUT if there is one. */ /* -------------------------------------------------------------------- */ result_code = ApplyLUT(iColorIndex + 1, papszLUTs[iColorIndex], pabyBuffer, GDT_Byte, pabyBuffer, dst_xsize * dst_ysize); if (result_code == -1) { free(pafWholeRawData); FreeLUTs(papszLUTs); return result_code; } } free(pafWholeRawData); FreeLUTs(papszLUTs); return result_code; } /************************************************************************/ /* msGetGDALGeoTransform() */ /* */ /* Cover function that tries GDALGetGeoTransform(), a world */ /* file or OWS extents. It is assumed that TLOCK_GDAL is held */ /* before this function is called. */ /************************************************************************/ int msGetGDALGeoTransform(GDALDatasetH hDS, mapObj *map, layerObj *layer, double *padfGeoTransform) { const char *extent_priority = NULL; const char *value; const char *gdalDesc; const char *fullPath; char *fileExtension = NULL; char szPath[MS_MAXPATHLEN]; int fullPathLen; int success = 0; rectObj rect; /* -------------------------------------------------------------------- */ /* some GDAL drivers (ie. GIF) don't set geotransform on failure. */ /* -------------------------------------------------------------------- */ padfGeoTransform[0] = 0.0; padfGeoTransform[1] = 1.0; padfGeoTransform[2] = 0.0; padfGeoTransform[3] = GDALGetRasterYSize(hDS); padfGeoTransform[4] = 0.0; padfGeoTransform[5] = -1.0; /* -------------------------------------------------------------------- */ /* Do we want to override GDAL with a worldfile if one is present? */ /* -------------------------------------------------------------------- */ extent_priority = CSLFetchNameValue(layer->processing, "EXTENT_PRIORITY"); if (extent_priority != NULL && EQUALN(extent_priority, "WORLD", 5)) { /* is there a user configured worldfile? */ value = CSLFetchNameValue(layer->processing, "WORLDFILE"); if (value != NULL) { /* at this point, fullPath may be a filePath or path only */ fullPath = msBuildPath(szPath, map->mappath, value); /* fullPath is a path only, so let's append the dataset filename */ if (strrchr(szPath, '.') == NULL) { fullPathLen = strlen(fullPath); gdalDesc = msStripPath((char *)GDALGetDescription(hDS)); if ((fullPathLen + strlen(gdalDesc)) < MS_MAXPATHLEN) { strcpy((char *)(fullPath + fullPathLen), gdalDesc); } else { msDebug( "Path length to alternative worldfile exceeds MS_MAXPATHLEN.\n"); fullPath = NULL; } } /* fullPath has a filename included, so get the extension */ else { fileExtension = msStrdup(strrchr(szPath, '.') + 1); } } /* common behavior with worldfile generated from basename + .wld */ else { fullPath = GDALGetDescription(hDS); fileExtension = msStrdup("wld"); } if (fullPath) success = GDALReadWorldFile(fullPath, fileExtension, padfGeoTransform); if (success && layer->debug >= MS_DEBUGLEVEL_VVV) { msDebug("Worldfile location: %s.\n", fullPath); } else if (layer->debug >= MS_DEBUGLEVEL_VVV) { msDebug("Failed using worldfile location: %s.\n", fullPath ? fullPath : "(null)"); } msFree(fileExtension); if (success) return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Try GDAL. */ /* */ /* Make sure that ymax is always at the top, and ymin at the */ /* bottom ... that is flip any files without the usual */ /* orientation. This is intended to enable display of "raw" */ /* files with no coordinate system otherwise they break down in */ /* many ways. */ /* -------------------------------------------------------------------- */ if (GDALGetGeoTransform(hDS, padfGeoTransform) == CE_None) { if (padfGeoTransform[5] == 1.0 && padfGeoTransform[3] == 0.0) { padfGeoTransform[5] = -1.0; padfGeoTransform[3] = GDALGetRasterYSize(hDS); } return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Try worldfile. */ /* -------------------------------------------------------------------- */ if (GDALGetDescription(hDS) != NULL && GDALReadWorldFile(GDALGetDescription(hDS), "wld", padfGeoTransform)) { return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Do we have the extent keyword on the layer? We only use */ /* this if we have a single raster associated with the layer as */ /* opposed to a tile index. */ /* */ /* Arguably this ought to take priority over all the other */ /* stuff. */ /* -------------------------------------------------------------------- */ if (MS_VALID_EXTENT(layer->extent) && layer->data != NULL) { rect = layer->extent; padfGeoTransform[0] = rect.minx; padfGeoTransform[1] = (rect.maxx - rect.minx) / (double)GDALGetRasterXSize(hDS); padfGeoTransform[2] = 0; padfGeoTransform[3] = rect.maxy; padfGeoTransform[4] = 0; padfGeoTransform[5] = (rect.miny - rect.maxy) / (double)GDALGetRasterYSize(hDS); return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* We didn't find any info ... use the default. */ /* Reset our default geotransform. GDALGetGeoTransform() may */ /* have altered it even if GDALGetGeoTransform() failed. */ /* -------------------------------------------------------------------- */ padfGeoTransform[0] = 0.0; padfGeoTransform[1] = 1.0; padfGeoTransform[2] = 0.0; padfGeoTransform[3] = GDALGetRasterYSize(hDS); padfGeoTransform[4] = 0.0; padfGeoTransform[5] = -1.0; return MS_FAILURE; } /************************************************************************/ /* msDrawRasterLayerGDAL_RawMode() */ /* */ /* Handle the loading and application of data in rawmode. */ /************************************************************************/ static int msDrawRasterLayerGDAL_RawMode(mapObj *map, layerObj *layer, imageObj *image, GDALDatasetH hDS, int src_xoff, int src_yoff, int src_xsize, int src_ysize, int dst_xoff, int dst_yoff, int dst_xsize, int dst_ysize) { void *pBuffer; GDALDataType eDataType; int *band_list, band_count; int i, j, k, band; CPLErr eErr; float *f_nodatas = NULL; unsigned char *b_nodatas = NULL; GInt16 *i_nodatas = NULL; int got_nodata = FALSE; rasterBufferObj *mask_rb = NULL; rasterBufferObj s_mask_rb; if (layer->mask) { int ret; layerObj *maskLayer = GET_LAYER(map, msGetLayerIndex(map, layer->mask)); mask_rb = &s_mask_rb; memset(mask_rb, 0, sizeof(s_mask_rb)); ret = MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, mask_rb); if (ret != MS_SUCCESS) return -1; } if (image->format->bands > 256) { msSetError(MS_IMGERR, "Too many bands (more than 256).", "msDrawRasterLayerGDAL_RawMode()"); return -1; } /* -------------------------------------------------------------------- */ /* What data type do we need? */ /* -------------------------------------------------------------------- */ if (image->format->imagemode == MS_IMAGEMODE_INT16) eDataType = GDT_Int16; else if (image->format->imagemode == MS_IMAGEMODE_FLOAT32) eDataType = GDT_Float32; else if (image->format->imagemode == MS_IMAGEMODE_BYTE) eDataType = GDT_Byte; else return -1; /* -------------------------------------------------------------------- */ /* Work out the band list. */ /* -------------------------------------------------------------------- */ band_list = msGetGDALBandList(layer, hDS, image->format->bands, &band_count); if (band_list == NULL) return -1; if (band_count != image->format->bands) { free(band_list); msSetError(MS_IMGERR, "BANDS PROCESSING directive has wrong number of bands, expected " "%d, got %d.", "msDrawRasterLayerGDAL_RawMode()", image->format->bands, band_count); return -1; } /* -------------------------------------------------------------------- */ /* Do we have nodata values? */ /* -------------------------------------------------------------------- */ f_nodatas = (float *)calloc(band_count, sizeof(float)); if (f_nodatas == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msDrawRasterLayerGDAL_RawMode()", __FILE__, __LINE__, (unsigned int)(sizeof(float) * band_count)); free(band_list); return -1; } if (band_count <= 3 && (layer->offsite.red != -1 || layer->offsite.green != -1 || layer->offsite.blue != -1)) { if (band_count > 0) f_nodatas[0] = layer->offsite.red; if (band_count > 1) f_nodatas[1] = layer->offsite.green; if (band_count > 2) f_nodatas[2] = layer->offsite.blue; got_nodata = TRUE; } if (!got_nodata) { got_nodata = TRUE; for (band = 0; band < band_count && got_nodata; band++) { f_nodatas[band] = msGetGDALNoDataValue( layer, GDALGetRasterBand(hDS, band_list[band]), &got_nodata); } } if (!got_nodata) { free(f_nodatas); f_nodatas = NULL; } else if (eDataType == GDT_Byte) { b_nodatas = (unsigned char *)f_nodatas; for (band = 0; band < band_count; band++) b_nodatas[band] = (unsigned char)f_nodatas[band]; } else if (eDataType == GDT_Int16) { i_nodatas = (GInt16 *)f_nodatas; for (band = 0; band < band_count; band++) i_nodatas[band] = (GInt16)f_nodatas[band]; } /* -------------------------------------------------------------------- */ /* Allocate buffer, and read data into it. */ /* -------------------------------------------------------------------- */ pBuffer = malloc(((size_t)dst_xsize) * dst_ysize * image->format->bands * (GDALGetDataTypeSize(eDataType) / 8)); if (pBuffer == NULL) { msSetError(MS_MEMERR, "Allocating work image of size %dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize); free(band_list); free(f_nodatas); return -1; } eErr = GDALDatasetRasterIO(hDS, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pBuffer, dst_xsize, dst_ysize, eDataType, image->format->bands, band_list, 0, 0, 0); free(band_list); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALRasterIO() failed: %s", "msDrawRasterLayerGDAL_RawMode()", CPLGetLastErrorMsg()); free(pBuffer); free(f_nodatas); return -1; } /* -------------------------------------------------------------------- */ /* Transfer the data to the imageObj. */ /* -------------------------------------------------------------------- */ k = 0; for (band = 0; band < image->format->bands; band++) { for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { if (image->format->imagemode == MS_IMAGEMODE_INT16) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { int off = j + i * image->width + band * image->width * image->height; int off_mask = j + i * image->width; if ((i_nodatas && ((GInt16 *)pBuffer)[k] == i_nodatas[band]) || SKIP_MASK(j, i)) { k++; continue; } image->img.raw_16bit[off] = ((GInt16 *)pBuffer)[k++]; MS_SET_BIT(image->img_mask, off_mask); } } else if (image->format->imagemode == MS_IMAGEMODE_FLOAT32) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { int off = j + i * image->width + band * image->width * image->height; int off_mask = j + i * image->width; if ((f_nodatas && ((float *)pBuffer)[k] == f_nodatas[band]) || SKIP_MASK(j, i)) { k++; continue; } image->img.raw_float[off] = ((float *)pBuffer)[k++]; MS_SET_BIT(image->img_mask, off_mask); } } else if (image->format->imagemode == MS_IMAGEMODE_BYTE) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { int off = j + i * image->width + band * image->width * image->height; int off_mask = j + i * image->width; if ((b_nodatas && ((unsigned char *)pBuffer)[k] == b_nodatas[band]) || SKIP_MASK(j, i)) { k++; continue; } image->img.raw_byte[off] = ((unsigned char *)pBuffer)[k++]; MS_SET_BIT(image->img_mask, off_mask); } } } } free(pBuffer); free(f_nodatas); return 0; } /************************************************************************/ /* msDrawRasterLayerGDAL_16BitClassifcation() */ /* */ /* Handle the rendering of rasters going through a 16bit */ /* classification lookup instead of the more common 8bit one. */ /* */ /* Currently we are using one data path where we load the */ /* raster into a floating point buffer, and then scale to */ /* 16bit. Eventually we could add optimizations for some of */ /* the 16bit cases at the cost of some complication. */ /************************************************************************/ static int msDrawRasterLayerGDAL_16BitClassification( mapObj *map, layerObj *layer, rasterBufferObj *rb, GDALRasterBandH hBand, int src_xoff, int src_yoff, int src_xsize, int src_ysize, int dst_xoff, int dst_yoff, int dst_xsize, int dst_ysize) { float *pafRawData; double dfScaleMin = 0.0, dfScaleMax = 0.0, dfScaleRatio; int nPixelCount = dst_xsize * dst_ysize, i, nBucketCount = 0; GDALDataType eDataType; float fDataMin = 0.0, fDataMax = 255.0, fNoDataValue; const char *pszScaleInfo; const char *pszBuckets; int *cmap, c, j, k, bGotNoData = FALSE, bGotFirstValue; unsigned char *rb_cmap[4]; CPLErr eErr; rasterBufferObj *mask_rb = NULL; rasterBufferObj s_mask_rb; int lastC; struct mstimeval starttime = {0}, endtime = {0}; const char *pszClassifyScaled; int bClassifyScaled = FALSE; if (layer->mask) { int ret; layerObj *maskLayer = GET_LAYER(map, msGetLayerIndex(map, layer->mask)); mask_rb = &s_mask_rb; memset(mask_rb, 0, sizeof(s_mask_rb)); ret = MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, mask_rb); if (ret != MS_SUCCESS) return -1; } assert(rb->type == MS_BUFFER_BYTE_RGBA); /* ==================================================================== */ /* Read the requested data in one gulp into a floating point */ /* buffer. */ /* ==================================================================== */ pafRawData = (float *)malloc(sizeof(float) * dst_xsize * dst_ysize); if (pafRawData == NULL) { msSetError(MS_MEMERR, "Out of memory allocating working buffer.", "msDrawRasterLayerGDAL_16BitClassification()"); return -1; } eErr = GDALRasterIO(hBand, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pafRawData, dst_xsize, dst_ysize, GDT_Float32, 0, 0); if (eErr != CE_None) { free(pafRawData); msSetError(MS_IOERR, "GDALRasterIO() failed: %s", "msDrawRasterLayerGDAL_16BitClassification()", CPLGetLastErrorMsg()); return -1; } fNoDataValue = (float)msGetGDALNoDataValue(layer, hBand, &bGotNoData); /* ==================================================================== */ /* Determine scaling. */ /* ==================================================================== */ eDataType = GDALGetRasterDataType(hBand); /* -------------------------------------------------------------------- */ /* Scan for absolute min/max of this block. */ /* -------------------------------------------------------------------- */ bGotFirstValue = FALSE; for (i = 1; i < nPixelCount; i++) { if (bGotNoData && IsNoData(pafRawData[i], fNoDataValue)) continue; if (CPLIsNan(pafRawData[i])) continue; if (!bGotFirstValue) { fDataMin = fDataMax = pafRawData[i]; bGotFirstValue = TRUE; } else { fDataMin = MS_MIN(fDataMin, pafRawData[i]); fDataMax = MS_MAX(fDataMax, pafRawData[i]); } } /* -------------------------------------------------------------------- */ /* Fetch the scale classification option. */ /* -------------------------------------------------------------------- */ pszClassifyScaled = CSLFetchNameValue(layer->processing, "CLASSIFY_SCALED"); if (pszClassifyScaled != NULL) bClassifyScaled = CSLTestBoolean(pszClassifyScaled); /* -------------------------------------------------------------------- */ /* Fetch the scale processing option. */ /* -------------------------------------------------------------------- */ pszBuckets = CSLFetchNameValue(layer->processing, "SCALE_BUCKETS"); pszScaleInfo = CSLFetchNameValue(layer->processing, "SCALE"); if (pszScaleInfo != NULL) { char **papszTokens; papszTokens = CSLTokenizeStringComplex(pszScaleInfo, " ,", FALSE, FALSE); if (CSLCount(papszTokens) == 1 && EQUAL(papszTokens[0], "AUTO")) { dfScaleMin = dfScaleMax = 0.0; } else if (CSLCount(papszTokens) != 2) { free(pafRawData); CSLDestroy(papszTokens); msSetError(MS_MISCERR, "SCALE PROCESSING option unparsable for layer %s.", "msDrawGDAL()", layer->name); return -1; } else { dfScaleMin = atof(papszTokens[0]); dfScaleMax = atof(papszTokens[1]); } CSLDestroy(papszTokens); } /* -------------------------------------------------------------------- */ /* Special integer cases for scaling. */ /* */ /* TODO: Treat Int32 and UInt32 case the same way *if* the min */ /* and max are less than 65536 apart. */ /* -------------------------------------------------------------------- */ if (eDataType == GDT_Byte || eDataType == GDT_Int16 || eDataType == GDT_UInt16) { if (pszScaleInfo == NULL) { dfScaleMin = fDataMin - 0.5; dfScaleMax = fDataMax + 0.5; } if (pszBuckets == NULL) { nBucketCount = (int)floor(fDataMax - fDataMin + 1.1); } } /* -------------------------------------------------------------------- */ /* General case if no scaling values provided in mapfile. */ /* -------------------------------------------------------------------- */ else if (dfScaleMin == 0.0 && dfScaleMax == 0.0) { double dfEpsilon = (fDataMax - fDataMin) / (65536 * 2); dfScaleMin = fDataMin - dfEpsilon; dfScaleMax = fDataMax + dfEpsilon; } /* -------------------------------------------------------------------- */ /* How many buckets? Only set if we don't already have a value. */ /* -------------------------------------------------------------------- */ if (pszBuckets == NULL) { if (nBucketCount == 0) nBucketCount = 65536; } else { nBucketCount = atoi(pszBuckets); if (nBucketCount < 2) { free(pafRawData); msSetError( MS_MISCERR, "SCALE_BUCKETS PROCESSING option is not a value of 2 or more: %s.", "msDrawRasterLayerGDAL_16BitClassification()", pszBuckets); return -1; } } /* -------------------------------------------------------------------- */ /* Compute scaling ratio. */ /* -------------------------------------------------------------------- */ if (dfScaleMax == dfScaleMin) dfScaleMax = dfScaleMin + 1.0; dfScaleRatio = nBucketCount / (dfScaleMax - dfScaleMin); if (layer->debug > 0) msDebug("msDrawRasterGDAL_16BitClassification(%s):\n" " scaling to %d buckets from range=%g,%g.\n", layer->name, nBucketCount, dfScaleMin, dfScaleMax); /* ==================================================================== */ /* Compute classification lookup table. */ /* ==================================================================== */ cmap = (int *)msSmallCalloc(sizeof(int), nBucketCount); rb_cmap[0] = (unsigned char *)msSmallCalloc(1, nBucketCount); rb_cmap[1] = (unsigned char *)msSmallCalloc(1, nBucketCount); rb_cmap[2] = (unsigned char *)msSmallCalloc(1, nBucketCount); rb_cmap[3] = (unsigned char *)msSmallCalloc(1, nBucketCount); if (layer->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&starttime, NULL); } const char *sgamma = msLayerGetProcessingKey(layer, "GAMMA"); const double gamma = sgamma ? CPLAtof(sgamma) : 1.0; lastC = -1; for (i = 0; i < nBucketCount; i++) { double dfOriginalValue; cmap[i] = -1; // i = (int) ((dfOriginalValue - dfScaleMin) * dfScaleRatio+1)-1; dfOriginalValue = (i + 0.5) / dfScaleRatio + dfScaleMin; /* The creation of buckets takes a significant time when they are many, and many classes as well. When iterating over buckets, a faster strategy is to reuse first the last used class index. */ if (bClassifyScaled == TRUE) c = msGetClass_FloatRGB_WithFirstClassToTry(layer, (float)i, -1, -1, -1, lastC); else c = msGetClass_FloatRGB_WithFirstClassToTry(layer, (float)dfOriginalValue, -1, -1, -1, lastC); lastC = c; if (c != -1) { int s; int styleindex = 0; /* change colour based on colour range? */ if (MS_VALID_COLOR(layer->class[c] -> styles[0] -> mincolor)) { styleindex = -1; for (s = 0; s < layer->class[c] -> numstyles; s++) { if (MS_VALID_COLOR(layer->class[c] -> styles[s] -> mincolor) && MS_VALID_COLOR(layer->class[c] -> styles[s] -> maxcolor) && dfOriginalValue + 0.5 / dfScaleRatio >= layer->class[c] -> styles[s] -> minvalue && dfOriginalValue - 0.5 / dfScaleRatio <= layer -> class[c] -> styles[s] -> maxvalue) { msValueToRange(layer->class[c] -> styles[s], dfOriginalValue, MS_COLORSPACE_RGB); styleindex = s; break; } } } if (styleindex >= 0) { if (MS_TRANSPARENT_COLOR( layer->class[c] -> styles[styleindex] -> color)) { /* leave it transparent */ } else if (MS_VALID_COLOR( layer->class[c] -> styles[styleindex] -> color)) { /* use class color */ rb_cmap[0][i] = layer->class[c]->styles[styleindex]->color.red; rb_cmap[1][i] = layer->class[c]->styles[styleindex]->color.green; rb_cmap[2][i] = layer->class[c]->styles[styleindex]->color.blue; rb_cmap[3][i] = (255 * layer->class[c] -> styles[styleindex] -> opacity / 100); if (gamma != 1.0) { rb_cmap[0][i] = GAMMA_CORRECT(rb_cmap[0][i], gamma); rb_cmap[1][i] = GAMMA_CORRECT(rb_cmap[1][i], gamma); rb_cmap[2][i] = GAMMA_CORRECT(rb_cmap[2][i], gamma); } } } } } if (layer->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug( "msDrawRasterGDAL_16BitClassification() bucket creation time: %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } /* ==================================================================== */ /* Now process the data, applying to the working imageObj. */ /* ==================================================================== */ k = 0; for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { float fRawValue = pafRawData[k++]; int iMapIndex; /* * Skip nodata pixels ... no processing. */ if (bGotNoData && IsNoData(fRawValue, fNoDataValue)) continue; if (CPLIsNan(fRawValue)) continue; if (SKIP_MASK(j, i)) continue; /* * The funny +1/-1 is to avoid odd rounding around zero. * We could use floor() but sometimes it is expensive. */ iMapIndex = (int)((fRawValue - dfScaleMin) * dfScaleRatio + 1) - 1; if (iMapIndex >= nBucketCount || iMapIndex < 0) { continue; } /* currently we never have partial alpha so keep simple */ if (rb_cmap[3][iMapIndex] > 0) RB_SET_PIXEL(rb, j, i, rb_cmap[0][iMapIndex], rb_cmap[1][iMapIndex], rb_cmap[2][iMapIndex], rb_cmap[3][iMapIndex]); } } /* -------------------------------------------------------------------- */ /* Cleanup */ /* -------------------------------------------------------------------- */ free(pafRawData); free(cmap); free(rb_cmap[0]); free(rb_cmap[1]); free(rb_cmap[2]); free(rb_cmap[3]); assert(k == dst_xsize * dst_ysize); return 0; } /************************************************************************/ /* IsNoData() */ /************************************************************************/ static bool IsNoData(double dfValue, double dfNoDataValue) { return isnan(dfValue) || dfValue == dfNoDataValue; } /************************************************************************/ /* msGetGDALNoDataValue() */ /************************************************************************/ double msGetGDALNoDataValue(layerObj *layer, void *hBand, int *pbGotNoData) { const char *pszNODATAOpt; *pbGotNoData = FALSE; /* -------------------------------------------------------------------- */ /* Check for a NODATA setting in the .map file. */ /* -------------------------------------------------------------------- */ pszNODATAOpt = CSLFetchNameValue(layer->processing, "NODATA"); if (pszNODATAOpt != NULL) { if (EQUAL(pszNODATAOpt, "OFF") || strlen(pszNODATAOpt) == 0) return -1234567.0; if (!EQUAL(pszNODATAOpt, "AUTO")) { *pbGotNoData = TRUE; return atof(pszNODATAOpt); } } /* -------------------------------------------------------------------- */ /* Check for a NODATA setting on the raw file. */ /* -------------------------------------------------------------------- */ if (hBand == NULL) return -1234567.0; else return GDALGetRasterNoDataValue(hBand, pbGotNoData); } /************************************************************************/ /* msGetGDALBandList() */ /* */ /* max_bands - pass zero for no limit. */ /* band_count - location in which length of the return band */ /* list is placed. */ /* */ /* returns malloc() list of band numbers (*band_count long). */ /************************************************************************/ int *msGetGDALBandList(layerObj *layer, void *hDS, int max_bands, int *band_count) { int i, file_bands; int *band_list = NULL; file_bands = GDALGetRasterCount(hDS); if (file_bands == 0) { msSetError(MS_IMGERR, "Attempt to operate on GDAL file with no bands, layer=%s.", "msGetGDALBandList()", layer->name); return NULL; } /* -------------------------------------------------------------------- */ /* Use all (or first) bands. */ /* -------------------------------------------------------------------- */ if (CSLFetchNameValue(layer->processing, "BANDS") == NULL) { if (max_bands > 0) *band_count = MS_MIN(file_bands, max_bands); else *band_count = file_bands; band_list = (int *)malloc(sizeof(int) * *band_count); /* FIXME MS_CHECK_ALLOC leaks papszItems */ MS_CHECK_ALLOC(band_list, sizeof(int) * *band_count, NULL); for (i = 0; i < *band_count; i++) band_list[i] = i + 1; return band_list; } /* -------------------------------------------------------------------- */ /* get bands from BANDS processing directive. */ /* -------------------------------------------------------------------- */ else { char **papszItems = CSLTokenizeStringComplex( CSLFetchNameValue(layer->processing, "BANDS"), " ,", FALSE, FALSE); if (CSLCount(papszItems) == 0) { CSLDestroy(papszItems); msSetError(MS_IMGERR, "BANDS PROCESSING directive has no items.", "msGetGDALBandList()"); return NULL; } else if (max_bands != 0 && CSLCount(papszItems) > max_bands) { msSetError(MS_IMGERR, "BANDS PROCESSING directive has wrong number of bands, " "expected at most %d, got %d.", "msGetGDALBandList()", max_bands, CSLCount(papszItems)); CSLDestroy(papszItems); return NULL; } *band_count = CSLCount(papszItems); band_list = (int *)malloc(sizeof(int) * *band_count); MS_CHECK_ALLOC(band_list, sizeof(int) * *band_count, NULL); for (i = 0; i < *band_count; i++) { band_list[i] = atoi(papszItems[i]); if (band_list[i] < 1 || band_list[i] > GDALGetRasterCount(hDS)) { msSetError(MS_IMGERR, "BANDS PROCESSING directive includes illegal band '%s', " "should be from 1 to %d.", "msGetGDALBandList()", papszItems[i], GDALGetRasterCount(hDS)); CSLDestroy(papszItems); free(band_list); return NULL; } } CSLDestroy(papszItems); return band_list; } } mapserver-8.4.0/src/mapdummyrenderer.c000066400000000000000000000270001474174441300200520ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Dummy functions to implement when using a pluggable renderer * Author: Thomas Bonfort, thomas.bonfort@gmail.com * ****************************************************************************** * Copyright (c) 2010, Thomas Bonfort * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" int renderLineDummy(imageObj *img, shapeObj *p, strokeStyleObj *style) { (void)img; (void)p; (void)style; msSetError(MS_RENDERERERR, "renderLine not implemented", "renderLine()"); return MS_FAILURE; } int renderPolygonDummy(imageObj *img, shapeObj *p, colorObj *color) { (void)img; (void)p; (void)color; msSetError(MS_RENDERERERR, "renderPolygon not implemented", "renderPolygon()"); return MS_FAILURE; } int renderPolygonTiledDummy(imageObj *img, shapeObj *p, imageObj *tile) { (void)img; (void)p; (void)tile; msSetError(MS_RENDERERERR, "renderPolygonTiled not implemented", "renderPolygonTiled()"); return MS_FAILURE; } int renderLineTiledDummy(imageObj *img, shapeObj *p, imageObj *tile) { (void)img; (void)p; (void)tile; msSetError(MS_RENDERERERR, "renderLineTiled not implemented", "renderLineTiled()"); return MS_FAILURE; } int renderRasterGlyphsDummy(imageObj *img, double x, double y, int fontIndex, colorObj *color, char *text) { (void)img; (void)x; (void)y; (void)fontIndex; (void)color; (void)text; msSetError(MS_RENDERERERR, "renderRasterGlyphs not implemented", "renderRasterGlyphs()"); return MS_FAILURE; } int renderGlyphsLineDummy(imageObj *img, labelPathObj *labelpath, labelStyleObj *style, char *text) { (void)img; (void)labelpath; (void)style; (void)text; msSetError(MS_RENDERERERR, "renderGlyphsLine not implemented", "renderGlyphsLine()"); return MS_FAILURE; } int renderVectorSymbolDummy(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "renderVectorSymbol not implemented", "renderVectorSymbol()"); return MS_FAILURE; } void *createVectorSymbolTileDummy(int width, int height, symbolObj *symbol, symbolStyleObj *style) { (void)width; (void)height; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "createVectorSymbolTile not implemented", "createVectorSymbolTile()"); return NULL; } int renderPixmapSymbolDummy(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "renderPixmapSymbol not implemented", "renderPixmapSymbol()"); return MS_FAILURE; } void *createPixmapSymbolTileDummy(int width, int height, symbolObj *symbol, symbolStyleObj *style) { (void)width; (void)height; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "createPixmapSymbolTile not implemented", "createPixmapSymbolTile()"); return NULL; } int renderEllipseSymbolDummy(imageObj *image, double x, double y, symbolObj *symbol, symbolStyleObj *style) { (void)image; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "renderEllipseSymbol not implemented", "renderEllipseSymbol()"); return MS_FAILURE; } void *createEllipseSymbolTileDummy(int width, int height, symbolObj *symbol, symbolStyleObj *style) { (void)width; (void)height; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "createEllipseSymbolTile not implemented", "createEllipseSymbolTile()"); return NULL; } int renderTruetypeSymbolDummy(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "renderTruetypeSymbol not implemented", "renderTruetypeSymbol()"); return MS_FAILURE; } void *createTruetypeSymbolTileDummy(int width, int height, symbolObj *symbol, symbolStyleObj *style) { (void)width; (void)height; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "createTruetypeSymbolTile not implemented", "createTruetypeSymbolTile()"); return NULL; } int renderTileDummy(imageObj *img, imageObj *tile, double x, double y) { (void)img; (void)tile; (void)x; (void)y; msSetError(MS_RENDERERERR, "renderTile not implemented", "renderTile()"); return MS_FAILURE; } rasterBufferObj *loadImageFromFileDummy(char *path) { (void)path; msSetError(MS_RENDERERERR, "loadImageFromFile not implemented", "loadImageFromFile()"); return NULL; } int getRasterBufferHandleDummy(imageObj *img, rasterBufferObj *rb) { (void)img; (void)rb; msSetError(MS_RENDERERERR, "getRasterBufferHandle not implemented", "getRasterBufferHandle()"); return MS_FAILURE; } int getRasterBufferCopyDummy(imageObj *img, rasterBufferObj *rb) { (void)img; (void)rb; msSetError(MS_RENDERERERR, "getRasterBufferCopy not implemented", "getRasterBufferCopy()"); return MS_FAILURE; } rasterBufferObj *createRasterBufferDummy(int width, int height) { (void)width; (void)height; msSetError(MS_RENDERERERR, "createRasterBuffer not implemented", "createRasterBuffer()"); return NULL; } int mergeRasterBufferDummy(imageObj *dest, rasterBufferObj *overlay, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height) { (void)dest; (void)overlay; (void)opacity; (void)srcX; (void)srcY; (void)dstX; (void)dstY; (void)width; (void)height; msSetError(MS_RENDERERERR, "mergeRasterBuffer not implemented", "mergeRasterBuffer()"); return MS_FAILURE; } int initializeRasterBufferDummy(rasterBufferObj *rb, int width, int height, int mode) { (void)rb; (void)width; (void)height; (void)mode; msSetError(MS_RENDERERERR, "initializeRasterBuffer not implemented", "initializeRasterBuffer()"); return MS_FAILURE; } /* image i/o */ imageObj *createImageDummy(int width, int height, outputFormatObj *format, colorObj *bg) { (void)width; (void)height; (void)format; (void)bg; msSetError(MS_RENDERERERR, "createImage not implemented", "createImage()"); return NULL; } int saveImageDummy(imageObj *img, mapObj *map, FILE *fp, outputFormatObj *format) { (void)img; (void)map; (void)fp; (void)format; msSetError(MS_RENDERERERR, "saveImage not implemented", "saveImage()"); return MS_FAILURE; } /*...*/ /* helper functions */ int getTruetypeTextBBoxDummy(rendererVTableObj *renderer, char **fonts, int numfonts, double size, char *string, rectObj *rect, double **advances, int bAdjustBaseline) { (void)renderer; (void)fonts; (void)numfonts; (void)size; (void)string; (void)rect; (void)advances; (void)bAdjustBaseline; msSetError(MS_RENDERERERR, "getTruetypeTextBBox not implemented", "getTruetypeTextBBox()"); return MS_FAILURE; } int startLayerDummy(imageObj *img, mapObj *map, layerObj *layer) { (void)img; (void)map; (void)layer; msSetError(MS_RENDERERERR, "startLayer not implemented", "startLayer()"); return MS_FAILURE; } int endLayerDummy(imageObj *img, mapObj *map, layerObj *layer) { (void)img; (void)map; (void)layer; msSetError(MS_RENDERERERR, "endLayer not implemented", "endLayer()"); return MS_FAILURE; } int startShapeDummy(imageObj *img, shapeObj *shape) { (void)img; (void)shape; msSetError(MS_RENDERERERR, "startShape not implemented", "startShape()"); return MS_FAILURE; } int endShapeDummy(imageObj *img, shapeObj *shape) { (void)img; (void)shape; msSetError(MS_RENDERERERR, "endShape not implemented", "endShape()"); return MS_FAILURE; } int setClipDummy(imageObj *img, rectObj clipRect) { (void)img; (void)clipRect; msSetError(MS_RENDERERERR, "setClip not implemented", "setClip()"); return MS_FAILURE; } int resetClipDummy(imageObj *img) { (void)img; msSetError(MS_RENDERERERR, "resetClip not implemented", "resetClip()"); return MS_FAILURE; } int freeImageDummy(imageObj *image) { (void)image; msSetError(MS_RENDERERERR, "freeImage not implemented", "freeImage()"); return MS_FAILURE; } int freeTileDummy(imageObj *tile) { (void)tile; msSetError(MS_RENDERERERR, "freeTile not implemented", "freeTile()"); return MS_FAILURE; } int freeSymbolDummy(symbolObj *symbol) { (void)symbol; msSetError(MS_RENDERERERR, "freeSymbol not implemented", "freeSymbol()"); return MS_FAILURE; } int cleanupDummy(void *renderer_data) { (void)renderer_data; return MS_SUCCESS; } int msInitializeDummyRenderer(rendererVTableObj *renderer) { renderer->use_imagecache = 0; renderer->supports_pixel_buffer = 0; renderer->compositeRasterBuffer = NULL; renderer->supports_clipping = 0; renderer->supports_svg = 0; renderer->renderer_data = NULL; renderer->transform_mode = MS_TRANSFORM_SIMPLIFY; renderer->startLayer = &startLayerDummy; renderer->endLayer = &endLayerDummy; renderer->renderLine = &renderLineDummy; renderer->renderLineTiled = NULL; renderer->createImage = &createImageDummy; renderer->saveImage = &saveImageDummy; renderer->getRasterBufferHandle = &getRasterBufferHandleDummy; renderer->getRasterBufferCopy = getRasterBufferCopyDummy; renderer->initializeRasterBuffer = initializeRasterBufferDummy; renderer->renderPolygon = &renderPolygonDummy; renderer->freeImage = &freeImageDummy; renderer->renderEllipseSymbol = &renderEllipseSymbolDummy; renderer->renderVectorSymbol = &renderVectorSymbolDummy; renderer->renderPixmapSymbol = &renderPixmapSymbolDummy; renderer->mergeRasterBuffer = &mergeRasterBufferDummy; renderer->renderTile = &renderTileDummy; renderer->renderPolygonTiled = &renderPolygonTiledDummy; renderer->freeSymbol = &freeSymbolDummy; renderer->cleanup = &cleanupDummy; renderer->startShape = NULL; renderer->endShape = NULL; renderer->renderGlyphs = NULL; return MS_SUCCESS; } mapserver-8.4.0/src/mapentities.h000066400000000000000000000151521474174441300170260ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: HTML entity to unicode lookup table * Author: Thomas Bonfort * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* * Generated file * * This file was generated from: * http://www.w3.org/TR/REC-html40/sgml/entities.html * by means of the libgd script: * entities.tcl * and modified to avoid namespace collisions */ #ifdef __cplusplus extern "C" { #endif static const struct mapentities_s { const char *name; int value; } mapentities[] = { {"AElig", 198}, {"Aacute", 193}, {"Acirc", 194}, {"Agrave", 192}, {"Alpha", 913}, {"Aring", 197}, {"Atilde", 195}, {"Auml", 196}, {"Beta", 914}, {"Ccedil", 199}, {"Chi", 935}, {"Dagger", 8225}, {"Delta", 916}, {"ETH", 208}, {"Eacute", 201}, {"Ecirc", 202}, {"Egrave", 200}, {"Epsilon", 917}, {"Eta", 919}, {"Euml", 203}, {"Gamma", 915}, {"Iacute", 205}, {"Icirc", 206}, {"Igrave", 204}, {"Iota", 921}, {"Iuml", 207}, {"Kappa", 922}, {"Lambda", 923}, {"Mu", 924}, {"Ntilde", 209}, {"Nu", 925}, {"OElig", 338}, {"Oacute", 211}, {"Ocirc", 212}, {"Ograve", 210}, {"Omega", 937}, {"Omicron", 927}, {"Oslash", 216}, {"Otilde", 213}, {"Ouml", 214}, {"Phi", 934}, {"Pi", 928}, {"Prime", 8243}, {"Psi", 936}, {"Rho", 929}, {"Scaron", 352}, {"Sigma", 931}, {"THORN", 222}, {"Tau", 932}, {"Theta", 920}, {"Uacute", 218}, {"Ucirc", 219}, {"Ugrave", 217}, {"Upsilon", 933}, {"Uuml", 220}, {"Xi", 926}, {"Yacute", 221}, {"Yuml", 376}, {"Zeta", 918}, {"aacute", 225}, {"acirc", 226}, {"acute", 180}, {"aelig", 230}, {"agrave", 224}, {"alefsym", 8501}, {"alpha", 945}, {"amp", 38}, {"and", 8743}, {"ang", 8736}, {"aring", 229}, {"asymp", 8776}, {"atilde", 227}, {"auml", 228}, {"bdquo", 8222}, {"beta", 946}, {"brvbar", 166}, {"bull", 8226}, {"cap", 8745}, {"ccedil", 231}, {"cedil", 184}, {"cent", 162}, {"chi", 967}, {"circ", 710}, {"clubs", 9827}, {"cong", 8773}, {"copy", 169}, {"crarr", 8629}, {"cup", 8746}, {"curren", 164}, {"dArr", 8659}, {"dagger", 8224}, {"darr", 8595}, {"deg", 176}, {"delta", 948}, {"diams", 9830}, {"divide", 247}, {"eacute", 233}, {"ecirc", 234}, {"egrave", 232}, {"empty", 8709}, {"emsp", 8195}, {"ensp", 8194}, {"epsilon", 949}, {"equiv", 8801}, {"eta", 951}, {"eth", 240}, {"euml", 235}, {"euro", 8364}, {"exist", 8707}, {"fnof", 402}, {"forall", 8704}, {"frac12", 189}, {"frac14", 188}, {"frac34", 190}, {"frasl", 8260}, {"gamma", 947}, {"ge", 8805}, {"gt", 62}, {"hArr", 8660}, {"harr", 8596}, {"hearts", 9829}, {"hellip", 8230}, {"iacute", 237}, {"icirc", 238}, {"iexcl", 161}, {"igrave", 236}, {"image", 8465}, {"infin", 8734}, {"int", 8747}, {"iota", 953}, {"iquest", 191}, {"isin", 8712}, {"iuml", 239}, {"kappa", 954}, {"lArr", 8656}, {"lambda", 955}, {"lang", 9001}, {"laquo", 171}, {"larr", 8592}, {"lceil", 8968}, {"ldquo", 8220}, {"le", 8804}, {"lfloor", 8970}, {"lowast", 8727}, {"loz", 9674}, {"lrm", 8206}, {"lsaquo", 8249}, {"lsquo", 8216}, {"lt", 60}, {"macr", 175}, {"mdash", 8212}, {"micro", 181}, {"middot", 183}, {"minus", 8722}, {"mu", 956}, {"nabla", 8711}, {"nbsp", 160}, {"ndash", 8211}, {"ne", 8800}, {"ni", 8715}, {"not", 172}, {"notin", 8713}, {"nsub", 8836}, {"ntilde", 241}, {"nu", 957}, {"oacute", 243}, {"ocirc", 244}, {"oelig", 339}, {"ograve", 242}, {"oline", 8254}, {"omega", 969}, {"omicron", 959}, {"oplus", 8853}, {"or", 8744}, {"ordf", 170}, {"ordm", 186}, {"oslash", 248}, {"otilde", 245}, {"otimes", 8855}, {"ouml", 246}, {"para", 182}, {"part", 8706}, {"permil", 8240}, {"perp", 8869}, {"phi", 966}, {"pi", 960}, {"piv", 982}, {"plusmn", 177}, {"pound", 163}, {"prime", 8242}, {"prod", 8719}, {"prop", 8733}, {"psi", 968}, {"quot", 34}, {"rArr", 8658}, {"radic", 8730}, {"rang", 9002}, {"raquo", 187}, {"rarr", 8594}, {"rceil", 8969}, {"rdquo", 8221}, {"real", 8476}, {"reg", 174}, {"rfloor", 8971}, {"rho", 961}, {"rlm", 8207}, {"rsaquo", 8250}, {"rsquo", 8217}, {"sbquo", 8218}, {"scaron", 353}, {"sdot", 8901}, {"sect", 167}, {"shy", 173}, {"sigma", 963}, {"sigmaf", 962}, {"sim", 8764}, {"spades", 9824}, {"sub", 8834}, {"sube", 8838}, {"sum", 8721}, {"sup", 8835}, {"sup1", 185}, {"sup2", 178}, {"sup3", 179}, {"supe", 8839}, {"szlig", 223}, {"tau", 964}, {"there4", 8756}, {"theta", 952}, {"thetasym", 977}, {"thinsp", 8201}, {"thorn", 254}, {"tilde", 732}, {"times", 215}, {"trade", 8482}, {"uArr", 8657}, {"uacute", 250}, {"uarr", 8593}, {"ucirc", 251}, {"ugrave", 249}, {"uml", 168}, {"upsih", 978}, {"upsilon", 965}, {"uuml", 252}, {"weierp", 8472}, {"xi", 958}, {"yacute", 253}, {"yen", 165}, {"yuml", 255}, {"zeta", 950}, {"zwj", 8205}, {"zwnj", 8204}, }; #define MAP_ENTITY_NAME_LENGTH_MAX 8 #define MAP_NR_OF_ENTITIES 252 #ifdef __cplusplus } #endif mapserver-8.4.0/src/maperror.c000066400000000000000000000520431474174441300163260ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of msSetError(), msDebug() and related functions. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "maperror.h" #include "mapthread.h" #include "maptime.h" #include #ifndef _WIN32 #include #include #endif #include #include "cpl_conv.h" #include "cpl_string.h" static char *const ms_errorCodes[MS_NUMERRORCODES] = { "", "Unable to access file.", "Memory allocation error.", "Incorrect data type.", "Symbol definition error.", "Regular expression error.", "TrueType Font error.", "DBASE file error.", "GD library error.", "Unknown identifier.", "Premature End-of-File.", "Projection library error.", "General error message.", "CGI error.", "Web application error.", "Image handling error.", "Hash table error.", "Join error.", "Search returned no results.", "Shapefile error.", "Expression parser error.", "SDE error.", "OGR error.", "Query error.", "WMS server error.", "WMS connection error.", "OracleSpatial error.", "WFS server error.", "WFS connection error.", "WMS Map Context error.", "HTTP request error.", "Child array error.", "WCS server error.", "GEOS library error.", "Invalid rectangle.", "Date/time error.", "GML encoding error.", "SOS server error.", "NULL parent pointer error.", "AGG library error.", "OWS error.", "OpenGL renderer error.", "Renderer error.", "V8 engine error.", "OCG API error.", "Flatgeobuf error."}; #ifndef USE_THREAD // Get the MapServer error object errorObj *msGetErrorObj() { static errorObj ms_error = {MS_NOERR, "", "", "", MS_FALSE, 0, NULL, 0}; return &ms_error; } #endif #ifdef USE_THREAD typedef struct te_info { struct te_info *next; void *thread_id; errorObj ms_error; } te_info_t; static te_info_t *error_list = NULL; errorObj *msGetErrorObj() { te_info_t *link; void *thread_id; errorObj *ret_obj; msAcquireLock(TLOCK_ERROROBJ); thread_id = msGetThreadId(); /* find link for this thread */ for (link = error_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } /* If the target thread link is already at the head of the list were ok */ if (error_list != NULL && error_list->thread_id == thread_id) { } /* We don't have one ... initialize one. */ else if (link == NULL || link->next == NULL) { te_info_t *new_link; errorObj error_obj = {MS_NOERR, "", "", "", 0, 0, NULL, 0}; new_link = (te_info_t *)malloc(sizeof(te_info_t)); new_link->next = error_list; new_link->thread_id = thread_id; new_link->ms_error = error_obj; error_list = new_link; } /* If the link is not already at the head of the list, promote it */ else { te_info_t *target = link->next; link->next = link->next->next; target->next = error_list; error_list = target; } ret_obj = &(error_list->ms_error); msReleaseLock(TLOCK_ERROROBJ); return ret_obj; } #endif /* msInsertErrorObj() ** ** We maintain a chained list of errorObj in which the first errorObj is ** the most recent (i.e. a stack). msErrorReset() should be used to clear ** the list. ** ** Note that since some code in MapServer will fetch the head of the list and ** keep a handle on it for a while, the head of the chained list is static ** and never changes. ** A new errorObj is always inserted after the head, and only if the ** head of the list already contains some information. i.e. If the static ** errorObj at the head of the list is empty then it is returned directly, ** otherwise a new object is inserted after the head and the data that was in ** the head is moved to the new errorObj, freeing the head errorObj to receive ** the new error information. */ static errorObj *msInsertErrorObj(void) { errorObj *ms_error; ms_error = msGetErrorObj(); if (ms_error->code != MS_NOERR && ms_error->totalerrorcount < 100) { /* Head of the list already in use, insert a new errorObj after the head * and move head contents to this new errorObj, freeing the errorObj * for reuse. */ errorObj *new_error; new_error = (errorObj *)malloc(sizeof(errorObj)); /* Note: if malloc() failed then we simply do nothing and the head will * be overwritten by the caller... we cannot produce an error here * since we are already inside a msSetError() call. */ if (new_error) { new_error->next = ms_error->next; new_error->code = ms_error->code; new_error->isreported = ms_error->isreported; strlcpy(new_error->routine, ms_error->routine, sizeof(new_error->routine)); strlcpy(new_error->message, ms_error->message, sizeof(new_error->message)); new_error->errorcount = ms_error->errorcount; ms_error->next = new_error; ms_error->code = MS_NOERR; ms_error->isreported = MS_FALSE; ms_error->routine[0] = '\0'; ms_error->message[0] = '\0'; ms_error->errorcount = 0; } ms_error->totalerrorcount++; } return ms_error; } /* msResetErrorList() ** ** Clear the list of error objects. */ void msResetErrorList() { errorObj *ms_error, *this_error; ms_error = msGetErrorObj(); this_error = ms_error->next; while (this_error != NULL) { errorObj *next_error; next_error = this_error->next; msFree(this_error); this_error = next_error; } ms_error->next = NULL; ms_error->code = MS_NOERR; ms_error->isreported = MS_FALSE; ms_error->routine[0] = '\0'; ms_error->message[0] = '\0'; ms_error->errorcount = 0; ms_error->totalerrorcount = 0; /* -------------------------------------------------------------------- */ /* Cleanup our entry in the thread list. This is mainly */ /* imprortant when msCleanup() calls msResetErrorList(). */ /* -------------------------------------------------------------------- */ #ifdef USE_THREAD { void *thread_id = msGetThreadId(); te_info_t *link; msAcquireLock(TLOCK_ERROROBJ); /* find link for this thread */ for (link = error_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } if (link->thread_id == thread_id) { /* presumably link is at head of list. */ if (error_list == link) error_list = link->next; free(link); } else if (link->next != NULL && link->next->thread_id == thread_id) { te_info_t *next_link = link->next; link->next = link->next->next; free(next_link); } msReleaseLock(TLOCK_ERROROBJ); } #endif } char *msGetErrorCodeString(int code) { if (code < 0 || code > MS_NUMERRORCODES - 1) return ("Invalid error code."); return (ms_errorCodes[code]); } /* -------------------------------------------------------------------- */ /* Adding the displayable error string to a given string */ /* and reallocates the memory enough to hold the characters. */ /* If source is null returns a newly allocated string */ /* -------------------------------------------------------------------- */ char *msAddErrorDisplayString(char *source, errorObj *error) { if ((source = msStringConcatenate(source, error->routine)) == NULL) return (NULL); if ((source = msStringConcatenate(source, ": ")) == NULL) return (NULL); if ((source = msStringConcatenate(source, ms_errorCodes[error->code])) == NULL) return (NULL); if ((source = msStringConcatenate(source, " ")) == NULL) return (NULL); if ((source = msStringConcatenate(source, error->message)) == NULL) return (NULL); if (error->errorcount > 0) { char *pszTmp; if ((source = msStringConcatenate(source, " (message repeated ")) == NULL) return (NULL); pszTmp = msIntToString(error->errorcount); if ((source = msStringConcatenate(source, pszTmp)) == NULL) { msFree(pszTmp); return (NULL); } msFree(pszTmp); if ((source = msStringConcatenate(source, " times)")) == NULL) return (NULL); } return source; } char *msGetErrorString(const char *delimiter) { char *errstr = NULL; errorObj *error = msGetErrorObj(); if (!delimiter || !error) return (NULL); while (error && error->code != MS_NOERR) { if ((errstr = msAddErrorDisplayString(errstr, error)) == NULL) return (NULL); if (error->next && error->next->code != MS_NOERR) { /* (peek ahead) more errors, use delimiter */ if ((errstr = msStringConcatenate(errstr, delimiter)) == NULL) return (NULL); } error = error->next; } return (errstr); } static void msRedactString(char *str, const char *keyword) { char *password = strstr(str, keyword); if (password != NULL) { const char chOptionDelimiter = password - str > 0 ? password[-1] : 0; char *ptr = password + strlen(keyword); char chStringSep = *ptr; if (chStringSep == '\'' || chStringSep == '"') { ++ptr; } else if (chOptionDelimiter == ';' && chStringSep == '{' && strcmp(keyword, "pwd=") == 0) { // Handle cases like "\\SQL2019;DATABASE=msautotest;Driver={ODBC Driver 17 // for SQL Server};pwd={Password;12!};uid=sa;" ++ptr; chStringSep = '}'; } else { chStringSep = '\0'; } /* Replace all characters from after equal sign to end of line, end of * string, or end of quoted string. */ char *ptr_first_redacted_char = NULL; while (*ptr != '\0' && *ptr != '\r' && *ptr != '\n') { if (chStringSep == '\0') { if (*ptr == chOptionDelimiter) break; } else { if (*ptr == chStringSep) { break; } if (*ptr == '\\' && ptr[1] == chStringSep) { ptr++; } } if (!ptr_first_redacted_char) { ptr_first_redacted_char = ptr; *ptr = '*'; } ptr++; } if (ptr_first_redacted_char) { memmove(ptr_first_redacted_char + 1, ptr, strlen(ptr) + 1); } } } void msRedactCredentials(char *str) { // postgres or mssql formats msRedactString(str, "password="); // ODBC connections can use pwd rather than password msRedactString(str, "pwd="); } static void msSetErrorInternal(int ms_errcode, const char *http_status, const char *message, const char *routine) { errorObj *ms_error = msGetErrorObj(); /* Insert the error to the list if it is not the same as the previous error*/ if (ms_error->code != ms_errcode || !EQUAL(message, ms_error->message) || !EQUAL(routine, ms_error->routine)) { ms_error = msInsertErrorObj(); if (!routine) strcpy(ms_error->routine, ""); else { strlcpy(ms_error->routine, routine, sizeof(ms_error->routine)); } if (!http_status) strcpy(ms_error->http_status, ""); else { strlcpy(ms_error->http_status, http_status, sizeof(ms_error->http_status)); } strlcpy(ms_error->message, message, sizeof(ms_error->message)); ms_error->code = ms_errcode; ms_error->errorcount = 0; } else ++ms_error->errorcount; msRedactCredentials(ms_error->message); /* Log a copy of errors to MS_ERRORFILE if set (handled automatically inside * msDebug()) */ msDebug("%s: %s %s\n", ms_error->routine, ms_errorCodes[ms_error->code], ms_error->message); } void msSetError(int code, const char *message_fmt, const char *routine, ...) { va_list args; char message[MESSAGELENGTH]; if (!message_fmt) strcpy(message, ""); else { va_start(args, routine); vsnprintf(message, MESSAGELENGTH, message_fmt, args); va_end(args); } msSetErrorInternal(code, NULL, message, routine); } #ifdef _MSC_VER __declspec(thread) int gIsWMS = MS_FALSE; #else static _Thread_local int gIsWMS = MS_FALSE; #endif void msSetErrorSetIsWMS(int is_wms) { gIsWMS = is_wms; } void msSetErrorWithStatus(int ms_errcode, const char *http_status, const char *message_fmt, const char *routine, ...) { va_list args; char message[MESSAGELENGTH]; if (!message_fmt) strcpy(message, ""); else { va_start(args, routine); vsnprintf(message, MESSAGELENGTH, message_fmt, args); va_end(args); } if (http_status) { if (gIsWMS) { if (!CPLTestBoolean( CPLGetConfigOption("MS_WMS_ERROR_STATUS_CODE", "OFF"))) http_status = NULL; } else { http_status = NULL; } } msSetErrorInternal(ms_errcode, http_status, message, routine); } void msWriteError(FILE *stream) { errorObj *ms_error = msGetErrorObj(); while (ms_error && ms_error->code != MS_NOERR) { msIO_fprintf(stream, "%s: %s %s
\n", ms_error->routine, ms_errorCodes[ms_error->code], ms_error->message); ms_error->isreported = MS_TRUE; ms_error = ms_error->next; } } void msWriteErrorXML(FILE *stream) { char *message; errorObj *ms_error = msGetErrorObj(); while (ms_error && ms_error->code != MS_NOERR) { message = msEncodeHTMLEntities(ms_error->message); msIO_fprintf(stream, "%s: %s %s\n", ms_error->routine, ms_errorCodes[ms_error->code], message); ms_error->isreported = MS_TRUE; ms_error = ms_error->next; msFree(message); } } void msWriteErrorImage(mapObj *map, char *filename, int blank) { imageObj *img; int width = 400, height = 300; const int nMargin = 5; char **papszLines = NULL; pointObj pnt = {0}; outputFormatObj *format = NULL; char *errormsg = msGetErrorString("; "); errorObj *error = msGetErrorObj(); char *imagepath = NULL, *imageurl = NULL; colorObj imagecolor, *imagecolorptr = NULL; textSymbolObj ts; labelObj label; int charWidth = 5, charHeight = 8; /* hardcoded, should be looked up from ft face */ if (!errormsg) { errormsg = msStrdup("No error found sorry. This is likely a bug"); } if (map) { if (map->width > 0 && map->height > 0) { width = map->width; height = map->height; } format = map->outputformat; imagepath = map->web.imagepath; imageurl = map->web.imageurl; } /* Default to GIF if no suitable GD output format set */ if (format == NULL || !MS_RENDERER_PLUGIN(format)) format = msCreateDefaultOutputFormat(NULL, "AGG/PNG8", "png", NULL); if (!format->transparent) { if (map && MS_VALID_COLOR(map->imagecolor)) { imagecolorptr = &map->imagecolor; } else { MS_INIT_COLOR(imagecolor, 255, 255, 255, 255); imagecolorptr = &imagecolor; } } img = msImageCreate(width, height, format, imagepath, imageurl, MS_DEFAULT_RESOLUTION, MS_DEFAULT_RESOLUTION, imagecolorptr); const int nTextLength = strlen(errormsg); const int nWidthTxt = nTextLength * charWidth; const int nUsableWidth = width - (nMargin * 2); /* Check to see if it all fits on one line. If not, split the text on several * lines. */ if (!blank) { int nLines; if (nWidthTxt > nUsableWidth) { const int nMaxCharsPerLine = nUsableWidth / charWidth; nLines = (int)ceil((double)nTextLength / (double)nMaxCharsPerLine); if (nLines > 0) { papszLines = (char **)malloc(nLines * sizeof(char *)); for (int i = 0; i < nLines; i++) { papszLines[i] = (char *)malloc((nMaxCharsPerLine + 1) * sizeof(char)); papszLines[i][0] = '\0'; } } for (int i = 0; i < nLines; i++) { const int nStart = i * nMaxCharsPerLine; int nEnd = nStart + nMaxCharsPerLine; if (nStart < nTextLength) { if (nEnd > nTextLength) nEnd = nTextLength; const int nLength = nEnd - nStart; strncpy(papszLines[i], errormsg + nStart, nLength); papszLines[i][nLength] = '\0'; } } } else { nLines = 1; papszLines = (char **)malloc(nLines * sizeof(char *)); papszLines[0] = msStrdup(errormsg); } initLabel(&label); MS_INIT_COLOR(label.color, 0, 0, 0, 255); MS_INIT_COLOR(label.outlinecolor, 255, 255, 255, 255); label.outlinewidth = 1; label.size = MS_SMALL; MS_REFCNT_INCR((&label)); for (int i = 0; i < nLines; i++) { pnt.y = charHeight * ((i * 2) + 1); pnt.x = charWidth; initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString(&ts, &label, papszLines[i], 1, 1, 0); if (MS_LIKELY(MS_SUCCESS == msComputeTextPath(map, &ts))) { if (MS_SUCCESS != msDrawTextSymbol(NULL, img, pnt, &ts)) { /* an error occurred, but there's nothing much we can do about it here * as we are already handling an error condition */ } freeTextSymbol(&ts); } } if (papszLines) { free(papszLines); } } /* actually write the image */ if (!filename) { msIO_setHeader("Content-Type", "%s", MS_IMAGE_MIME_TYPE(format)); msIO_sendHeaders(); } msSaveImage(NULL, img, filename); msFreeImage(img); /* the errors are reported */ while (error && error->code != MS_NOERR) { error->isreported = MS_TRUE; error = error->next; } if (format->refcount == 0) msFreeOutputFormat(format); msFree(errormsg); } char *msGetVersion() { static char version[2048]; sprintf(version, "MapServer version %s", MS_VERSION); // add versions of required dependencies static char PROJVersion[20]; sprintf(PROJVersion, " PROJ version %d.%d", PROJ_VERSION_MAJOR, PROJ_VERSION_MINOR); strcat(version, PROJVersion); static char GDALVersion[20]; sprintf(GDALVersion, " GDAL version %d.%d", GDAL_VERSION_MAJOR, GDAL_VERSION_MINOR); strcat(version, GDALVersion); #if (defined USE_PNG) strcat(version, " OUTPUT=PNG"); #endif #if (defined USE_JPEG) strcat(version, " OUTPUT=JPEG"); #endif #ifdef USE_KML strcat(version, " OUTPUT=KML"); #endif strcat(version, " SUPPORTS=PROJ"); strcat(version, " SUPPORTS=AGG"); strcat(version, " SUPPORTS=FREETYPE"); #ifdef USE_CAIRO strcat(version, " SUPPORTS=CAIRO"); #endif #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) strcat(version, " SUPPORTS=SVG_SYMBOLS"); #ifdef USE_SVG_CAIRO strcat(version, " SUPPORTS=SVGCAIRO"); #else strcat(version, " SUPPORTS=RSVG"); #endif #endif #ifdef USE_OGL strcat(version, " SUPPORTS=OPENGL"); #endif #ifdef USE_ICONV strcat(version, " SUPPORTS=ICONV"); #endif #ifdef USE_EXEMPI strcat(version, " SUPPORTS=XMP"); #endif #ifdef USE_FRIBIDI strcat(version, " SUPPORTS=FRIBIDI"); #endif #ifdef USE_WMS_SVR strcat(version, " SUPPORTS=WMS_SERVER"); #endif #ifdef USE_WMS_LYR strcat(version, " SUPPORTS=WMS_CLIENT"); #endif #ifdef USE_WFS_SVR strcat(version, " SUPPORTS=WFS_SERVER"); #endif #ifdef USE_WFS_LYR strcat(version, " SUPPORTS=WFS_CLIENT"); #endif #ifdef USE_WCS_SVR strcat(version, " SUPPORTS=WCS_SERVER"); #endif #ifdef USE_SOS_SVR strcat(version, " SUPPORTS=SOS_SERVER"); #endif #ifdef USE_OGCAPI_SVR strcat(version, " SUPPORTS=OGCAPI_SERVER"); #endif #ifdef USE_FASTCGI strcat(version, " SUPPORTS=FASTCGI"); #endif #ifdef USE_THREAD strcat(version, " SUPPORTS=THREADS"); #endif #ifdef USE_GEOS strcat(version, " SUPPORTS=GEOS"); #endif #ifdef USE_V8_MAPSCRIPT strcat(version, " SUPPORTS=V8"); #endif #ifdef USE_PBF strcat(version, " SUPPORTS=PBF"); #endif #ifdef USE_JPEG strcat(version, " INPUT=JPEG"); #endif #ifdef USE_SDE strcat(version, " INPUT=SDE"); #endif #ifdef USE_POSTGIS strcat(version, " INPUT=POSTGIS"); #endif #ifdef USE_ORACLESPATIAL strcat(version, " INPUT=ORACLESPATIAL"); #endif strcat(version, " INPUT=OGR"); strcat(version, " INPUT=GDAL"); strcat(version, " INPUT=SHAPEFILE"); strcat(version, " INPUT=FLATGEOBUF"); return (version); } int msGetVersionInt() { return MS_VERSION_NUM; } mapserver-8.4.0/src/maperror.h000066400000000000000000000171761474174441300163430ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations for Error and Debug functions. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPERROR_H #define MAPERROR_H #include "mapthread.h" #ifdef __cplusplus extern "C" { #endif /*==================================================================== * maperror.c *====================================================================*/ #define MS_NOERR 0 /* general error codes */ #define MS_IOERR 1 #define MS_MEMERR 2 #define MS_TYPEERR 3 #define MS_SYMERR 4 #define MS_REGEXERR 5 #define MS_TTFERR 6 #define MS_DBFERR 7 #define MS_IDENTERR 9 #define MS_EOFERR 10 #define MS_PROJERR 11 #define MS_MISCERR 12 #define MS_CGIERR 13 #define MS_WEBERR 14 #define MS_IMGERR 15 #define MS_HASHERR 16 #define MS_JOINERR 17 #define MS_NOTFOUND 18 /* empty search results */ #define MS_SHPERR 19 #define MS_PARSEERR 20 #define MS_UNUSEDERR 21 #define MS_OGRERR 22 #define MS_QUERYERR 23 #define MS_WMSERR 24 /* WMS server error */ #define MS_WMSCONNERR 25 /* WMS connectiontype error */ #define MS_ORACLESPATIALERR 26 #define MS_WFSERR 27 /* WFS server error */ #define MS_WFSCONNERR 28 /* WFS connectiontype error */ #define MS_MAPCONTEXTERR 29 /* Map Context error */ #define MS_HTTPERR 30 #define MS_CHILDERR 31 /* Errors involving arrays of child objects */ #define MS_WCSERR 32 #define MS_GEOSERR 33 #define MS_RECTERR 34 #define MS_TIMEERR 35 #define MS_GMLERR 36 #define MS_SOSERR 37 #define MS_NULLPARENTERR 38 #define MS_AGGERR 39 #define MS_OWSERR 40 #define MS_OGLERR 41 #define MS_RENDERERERR 42 #define MS_V8ERR 43 #define MS_OGCAPIERR 44 #define MS_FGBERR 45 /* NOTE to developers: if adding a new constant, increment MS_NUMERRORCODES and * add a new string in ms_errorCodes[] */ #define MS_NUMERRORCODES 46 #define MESSAGELENGTH 2048 #define ROUTINELENGTH 64 #define HTTPSTATUSLENGTH 128 #define MS_ERROR_LANGUAGE "en-US" #define MS_HTTP_400_BAD_REQUEST "400 Bad Request" #define MS_HTTP_500_INTERNAL_SERVER_ERROR "500 Internal Server Error" #if defined(_WIN32) && !defined(__CYGWIN__) #define MS_DLL_EXPORT __declspec(dllexport) #else #define MS_DLL_EXPORT #endif #ifndef MS_PRINT_FUNC_FORMAT #if defined(__GNUC__) && __GNUC__ >= 3 && !defined(DOXYGEN_SKIP) #define MS_PRINT_FUNC_FORMAT(format_idx, arg_idx) \ __attribute__((__format__(__printf__, format_idx, arg_idx))) #else #define MS_PRINT_FUNC_FORMAT(format_idx, arg_idx) #endif #endif /** This class allows inspection of the MapServer error stack. Instances of errorObj are created internally by MapServer as errors happen. Errors are managed as a chained list with the first item being the most recent error. */ typedef struct errorObj { int code; ///< MapServer error code such as :data:`MS_IMGERR` char routine[ROUTINELENGTH]; ///< MapServer function in which the error was set char message[MESSAGELENGTH]; ///< Context-dependent error message char http_status[HTTPSTATUSLENGTH]; ////< HTTP status int isreported; ///< :data:`MS_TRUE` or :data:`MS_FALSE` flag indicating if ///< the error has been output int errorcount; ///< Number of subsequent errors #ifndef SWIG struct errorObj *next; int totalerrorcount; #endif } errorObj; /* ** Function prototypes */ /** Get the MapServer error object */ MS_DLL_EXPORT errorObj *msGetErrorObj(void); /** Clear the list of error objects */ MS_DLL_EXPORT void msResetErrorList(void); /** Returns a string containing MapServer version information, and details on what optional components are built in - the same report as produced by ``mapserv -v`` */ MS_DLL_EXPORT char *msGetVersion(void); /** Returns the MapServer version number (x.y.z) as an integer (x*10000 + y*100 + z) e.g. V7.4.2 would return 70402 */ MS_DLL_EXPORT int msGetVersionInt(void); /** Return a string of all errors */ MS_DLL_EXPORT char *msGetErrorString(const char *delimiter); #ifndef SWIG MS_DLL_EXPORT void msRedactCredentials(char *str); MS_DLL_EXPORT void msSetError(int code, const char *message, const char *routine, ...) MS_PRINT_FUNC_FORMAT(2, 4); void msSetErrorSetIsWMS(int is_wms); void msSetErrorWithStatus(int ms_errcode, const char *http_status, const char *message, const char *routine, ...) MS_PRINT_FUNC_FORMAT(3, 5); MS_DLL_EXPORT void msWriteError(FILE *stream); MS_DLL_EXPORT void msWriteErrorXML(FILE *stream); MS_DLL_EXPORT char *msGetErrorCodeString(int code); MS_DLL_EXPORT char *msAddErrorDisplayString(char *source, errorObj *error); struct mapObj; MS_DLL_EXPORT void msWriteErrorImage(struct mapObj *map, char *filename, int blank); #endif /* SWIG */ /*==================================================================== * mapdebug.c (See also MS-RFC-28) *====================================================================*/ typedef enum { MS_DEBUGLEVEL_ERRORSONLY = 0, /* DEBUG OFF, log fatal errors */ MS_DEBUGLEVEL_DEBUG = 1, /* DEBUG ON */ MS_DEBUGLEVEL_TUNING = 2, /* Reports timing info */ MS_DEBUGLEVEL_V = 3, /* Verbose */ MS_DEBUGLEVEL_VV = 4, /* Very verbose */ MS_DEBUGLEVEL_VVV = 5, /* Very very verbose */ MS_DEBUGLEVEL_DEVDEBUG = 20, /* Undocumented, will trigger debug messages only useful for developers */ } debugLevel; #ifndef SWIG typedef enum { MS_DEBUGMODE_OFF, MS_DEBUGMODE_FILE, MS_DEBUGMODE_STDERR, MS_DEBUGMODE_STDOUT, MS_DEBUGMODE_WINDOWSDEBUG } debugMode; typedef struct debug_info_obj { debugLevel global_debug_level; debugMode debug_mode; char *errorfile; FILE *fp; /* The following 2 members are used only with USE_THREAD (but we won't #ifndef * them) */ void *thread_id; struct debug_info_obj *next; } debugInfoObj; MS_DLL_EXPORT void msDebug(const char *pszFormat, ...) MS_PRINT_FUNC_FORMAT(1, 2); MS_DLL_EXPORT int msSetErrorFile(const char *pszErrorFile, const char *pszRelToPath); MS_DLL_EXPORT void msCloseErrorFile(void); MS_DLL_EXPORT const char *msGetErrorFile(void); MS_DLL_EXPORT void msSetGlobalDebugLevel(int level); MS_DLL_EXPORT debugLevel msGetGlobalDebugLevel(void); MS_DLL_EXPORT int msDebugInitFromEnv(void); MS_DLL_EXPORT void msDebugCleanup(void); #endif /* SWIG */ #ifdef __cplusplus } #endif #endif /* MAPERROR_H */ mapserver-8.4.0/src/mapfile.c000066400000000000000000007231031474174441300161160ustar00rootroot00000000000000/****************************************************************************** * $id: mapfile.c 7854 2008-08-14 19:22:48Z dmorissette $ * * Project: MapServer * Purpose: High level Map file parsing code. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include "mapserver.h" #include "mapfile.h" #include "mapthread.h" #include "maptime.h" #include "mapogcsld.h" #include "cpl_conv.h" #include "cpl_port.h" #include "cpl_string.h" extern int msyylex(void); extern void msyyrestart(FILE *); extern int msyylex_destroy(void); extern void msyycleanup_includes(); extern double msyynumber; extern int msyylineno; extern FILE *msyyin; extern int msyysource; extern int msyystate; extern const char *msyystring; extern char *msyybasepath; extern int msyyreturncomments; extern char *msyystring_buffer; extern int msyystring_icase; extern int loadSymbol(symbolObj *s, char *symbolpath); /* in mapsymbol.c */ extern void writeSymbol(symbolObj *s, FILE *stream); /* in mapsymbol.c */ static int loadGrid(layerObj *pLayer); static int loadStyle(styleObj *style); static void writeStyle(FILE *stream, int indent, styleObj *style); static int resolveSymbolNames(mapObj *map); static int loadExpression(expressionObj *exp); static void writeExpression(FILE *stream, int indent, const char *name, expressionObj *exp); /* ** Symbol to string static arrays needed for writing map files. ** Must be kept in sync with enumerations and defines found in mapserver.h. */ /* static char *msUnits[9]={"INCHES", "FEET", "MILES", "METERS", "KILOMETERS", * "DD", "PIXELS", "PERCENTAGES", "NAUTICALMILES"}; */ /* static char *msLayerTypes[10]={"POINT", "LINE", "POLYGON", "RASTER", * "ANNOTATION", "QUERY", "CIRCLE", "TILEINDEX","CHART"}; */ char *msPositionsText[MS_POSITIONS_LENGTH] = { "UL", "LR", "UR", "LL", "CR", "CL", "UC", "LC", "CC", "AUTO", "XY", "FOLLOW"}; /* msLabelPositions[] also used in mapsymbols.c (not static) */ /* static char *msBitmapFontSizes[5]={"TINY", "SMALL", "MEDIUM", "LARGE", * "GIANT"}; */ /* static char *msQueryMapStyles[4]={"NORMAL", "HILITE", "SELECTED", * "INVERTED"}; */ /* static char *msStatus[4]={"OFF", "ON", "DEFAULT", "EMBED"}; */ /* static char *msOnOff[2]={"OFF", "ON"}; */ /* static char *msTrueFalse[2]={"FALSE", "TRUE"}; */ /* static char *msYesNo[2]={"NO", "YES"}; */ /* static char *msJoinType[2]={"ONE-TO-ONE", "ONE-TO-MANY"}; */ /* static char *msAlignValue[3]={"LEFT","CENTER","RIGHT"}; */ /* ** Validates a string (value) against a series of patterns. We support up to *four to allow cascading from classObj to ** layerObj to webObj plus a legacy pattern like TEMPLATEPATTERN. */ int msValidateParameter(const char *value, const char *pattern1, const char *pattern2, const char *pattern3, const char *pattern4) { if (msEvalRegex(pattern1, value) == MS_TRUE) return MS_SUCCESS; if (msEvalRegex(pattern2, value) == MS_TRUE) return MS_SUCCESS; if (msEvalRegex(pattern3, value) == MS_TRUE) return MS_SUCCESS; if (msEvalRegex(pattern4, value) == MS_TRUE) return MS_SUCCESS; return (MS_FAILURE); } int msIsValidRegex(const char *e) { ms_regex_t re; int errcode = ms_regcomp(&re, e, MS_REG_EXTENDED | MS_REG_NOSUB); if (errcode != 0) { char szErrbuf[256]; ms_regerror(errcode, &re, szErrbuf, sizeof(szErrbuf)); msSetError(MS_REGEXERR, "Failed to compile expression (%s): %s.", "msIsValidRegex()", e, szErrbuf); return (MS_FALSE); } ms_regfree(&re); return MS_TRUE; } int msEvalRegex(const char *e, const char *s) { ms_regex_t re; if (!e || !s) return (MS_FALSE); int errcode = ms_regcomp(&re, e, MS_REG_EXTENDED | MS_REG_NOSUB); if (errcode != 0) { char szErrbuf[256]; ms_regerror(errcode, &re, szErrbuf, sizeof(szErrbuf)); msSetError(MS_REGEXERR, "Failed to compile expression (%s): %s.", "msEvalRegex()", e, szErrbuf); return (MS_FALSE); } if (ms_regexec(&re, s, 0, NULL, 0) != 0) { /* no match */ ms_regfree(&re); return (MS_FALSE); } ms_regfree(&re); return (MS_TRUE); } int msCaseEvalRegex(const char *e, const char *s) { ms_regex_t re; if (!e || !s) return (MS_FALSE); if (ms_regcomp(&re, e, MS_REG_EXTENDED | MS_REG_ICASE | MS_REG_NOSUB) != 0) { msSetError(MS_REGEXERR, "Failed to compile expression (%s).", "msEvalRegex()", e); return (MS_FALSE); } if (ms_regexec(&re, s, 0, NULL, 0) != 0) { /* no match */ ms_regfree(&re); return (MS_FALSE); } ms_regfree(&re); return (MS_TRUE); } #ifdef USE_MSFREE void msFree(void *p) { if (p) free(p); } #endif /* ** Free memory allocated for a character array */ void msFreeCharArray(char **array, int num_items) { int i; if (!array) return; for (i = 0; i < num_items; i++) msFree(array[i]); msFree(array); } /* ** Checks symbol from lexer against variable length list of ** legal symbols. */ int getSymbol(int n, ...) { int symbol; va_list argp; int i = 0; symbol = msyylex(); va_start(argp, n); while (i < n) { /* check each symbol in the list */ if (symbol == va_arg(argp, int)) { va_end(argp); return (symbol); } i++; } va_end(argp); msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getSymbol()", msyystring_buffer, msyylineno); return (-1); } /* ** Same as getSymbol, except no error message is set on failure */ int getSymbol2(int n, ...) { int symbol; va_list argp; int i = 0; symbol = msyylex(); va_start(argp, n); while (i < n) { /* check each symbol in the list */ if (symbol == va_arg(argp, int)) { va_end(argp); return (symbol); } i++; } va_end(argp); return (-1); } /* ** Get a string or symbol as a string. Operates like getString(), but also ** supports symbols. */ static char *getToken(void) { msyylex(); return msStrdup(msyystring_buffer); } /* ** Load a string from the map file. A "string" is defined in lexer.l. */ int getString(char **s) { /* if (*s) msSetError(MS_SYMERR, "Duplicate item (%s):(line %d)", "getString()", msyystring_buffer, msyylineno); return(MS_FAILURE); } else */ if (msyylex() == MS_STRING) { if (*s) free(*s); /* avoid leak */ *s = msStrdup(msyystring_buffer); return (MS_SUCCESS); } msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getString()", msyystring_buffer, msyylineno); return (MS_FAILURE); } int msCheckNumber(double number, int num_check_type, double value1, double value2) { if (num_check_type == MS_NUM_CHECK_NONE) { return MS_SUCCESS; } else if (num_check_type == MS_NUM_CHECK_RANGE && number >= value1 && number <= value2) { return MS_SUCCESS; } else if (num_check_type == MS_NUM_CHECK_GT && number > value1) { return MS_SUCCESS; } else if (num_check_type == MS_NUM_CHECK_GTE && number >= value1) { return MS_SUCCESS; } return MS_FAILURE; } /* ** Load a floating point number from the map file. (see lexer.l) */ int getDouble(double *d, int num_check_type, double value1, double value2) { if (msyylex() == MS_NUMBER) { if (msCheckNumber(msyynumber, num_check_type, value1, value2) == MS_SUCCESS) { *d = msyynumber; return (0); } } msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getDouble()", msyystring_buffer, msyylineno); return (-1); } /* ** Load a integer from the map file. (see lexer.l) */ int getInteger(int *i, int num_check_type, int value1, int value2) { if (msyylex() == MS_NUMBER) { if (msCheckNumber(msyynumber, num_check_type, value1, value2) == MS_SUCCESS) { *i = (int)msyynumber; return (0); } } msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getInteger()", msyystring_buffer, msyylineno); return (-1); } int getCharacter(char *c) { if (msyylex() == MS_STRING) { *c = msyystring_buffer[0]; return (0); } msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getCharacter()", msyystring_buffer, msyylineno); return (-1); } /* ** Try to load as an integer, then try as a named symbol. ** Part of work on bug 490. */ int getIntegerOrSymbol(int *i, int n, ...) { int symbol; va_list argp; int j = 0; symbol = msyylex(); if (symbol == MS_NUMBER) { *i = (int)msyynumber; return MS_SUCCESS; /* success */ } va_start(argp, n); while (j < n) { /* check each symbol in the list */ if (symbol == va_arg(argp, int)) { va_end(argp); *i = symbol; return MS_SUCCESS; } j++; } va_end(argp); msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getIntegerOrSymbol()", msyystring_buffer, msyylineno); return (-1); } /* ** msBuildPluginLibraryPath ** ** This function builds a path to be used dynamically to load plugin library. */ int msBuildPluginLibraryPath(char **dest, const char *lib_str, mapObj *map) { char szLibPath[MS_MAXPATHLEN] = {'\0'}; char szLibPathExt[MS_MAXPATHLEN] = {'\0'}; const char *plugin_dir = NULL; if (map) plugin_dir = msLookupHashTable(&(map->configoptions), "MS_PLUGIN_DIR"); /* do nothing on windows, filename without .dll will be loaded by default*/ #if !defined(_WIN32) if (lib_str) { size_t len = strlen(lib_str); if (3 < len && strcmp(lib_str + len - 3, ".so")) { strlcpy(szLibPathExt, lib_str, MS_MAXPATHLEN); strlcat(szLibPathExt, ".so", MS_MAXPATHLEN); lib_str = szLibPathExt; } } #endif /* !defined(_WIN32) */ if (NULL == msBuildPath(szLibPath, plugin_dir, lib_str)) { return MS_FAILURE; } msFree(*dest); *dest = msStrdup(szLibPath); return MS_SUCCESS; } /* ** Returns the index of specified symbol or -1 if not found. ** ** If try_addimage_if_notfound==MS_TRUE then msAddImageSymbol() will be called ** to try to allocate the symbol as an image symbol. */ int msGetSymbolIndex(symbolSetObj *symbols, const char *name, int try_addimage_if_notfound) { int i; if (!symbols || !name) return (-1); /* symbol 0 has no name */ for (i = 1; i < symbols->numsymbols; i++) { if (symbols->symbol[i]->name) if (strcasecmp(symbols->symbol[i]->name, name) == 0) return (i); } if (try_addimage_if_notfound) return ( msAddImageSymbol(symbols, name)); /* make sure it's not a filename */ return (-1); } /* ** Return the index number for a given layer based on its name. */ int msGetLayerIndex(mapObj *map, const char *name) { int i; if (!name) return (-1); for (i = 0; i < map->numlayers; i++) { if (!GET_LAYER(map, i)->name) /* skip it */ continue; if (strcmp(name, GET_LAYER(map, i)->name) == 0) return (i); } return (-1); } int loadColor(colorObj *color, attributeBindingObj *binding) { int symbol; char hex[2]; /* ** Note that negative color values can be used to suppress or change behavior. *For example, referenceObj uses ** a negative color component to suppress rectangle fills. */ if (binding) { if ((symbol = getSymbol(3, MS_NUMBER, MS_BINDING, MS_STRING)) == -1) return MS_FAILURE; } else { if ((symbol = getSymbol(2, MS_NUMBER, MS_STRING)) == -1) return MS_FAILURE; } color->alpha = 255; if (symbol == MS_NUMBER) { if (msyynumber >= -255 && msyynumber <= 255) { color->red = (int)msyynumber; } else { return MS_FAILURE; } if (getInteger(&(color->green), MS_NUM_CHECK_RANGE, -255, 255) == -1) return MS_FAILURE; if (getInteger(&(color->blue), MS_NUM_CHECK_RANGE, -255, 255) == -1) return MS_FAILURE; } else if (symbol == MS_STRING) { int len = strlen(msyystring_buffer); if (msyystring_buffer[0] == '#' && (len == 7 || len == 9)) { /* got a hex color w/optional alpha */ hex[0] = msyystring_buffer[1]; hex[1] = msyystring_buffer[2]; color->red = msHexToInt(hex); hex[0] = msyystring_buffer[3]; hex[1] = msyystring_buffer[4]; color->green = msHexToInt(hex); hex[0] = msyystring_buffer[5]; hex[1] = msyystring_buffer[6]; color->blue = msHexToInt(hex); if (len == 9) { hex[0] = msyystring_buffer[7]; hex[1] = msyystring_buffer[8]; color->alpha = msHexToInt(hex); } } else { /* TODO: consider named colors here */ msSetError(MS_SYMERR, "Invalid hex color (%s):(line %d)", "loadColor()", msyystring_buffer, msyylineno); return MS_FAILURE; } } else { assert(binding); msFree(binding->item); binding->item = msStrdup(msyystring_buffer); binding->index = -1; } return MS_SUCCESS; } #if ALPHACOLOR_ENABLED int loadColorWithAlpha(colorObj *color) { char hex[2]; /* ** Note that negative color values can be used to suppress or change behavior. *For example, referenceObj uses ** a negative color component to suppress rectangle fills. */ if (getInteger(&(color->red), MS_NUM_CHECK_RANGE, -255, 255) == -1) { if (msyystring_buffer[0] == '#' && strlen(msyystring_buffer) == 7) { /* got a hex color */ hex[0] = msyystring_buffer[1]; hex[1] = msyystring_buffer[2]; color->red = msHexToInt(hex); hex[0] = msyystring_buffer[3]; hex[1] = msyystring_buffer[4]; color->green = msHexToInt(hex); hex[0] = msyystring_buffer[5]; hex[1] = msyystring_buffer[6]; color->blue = msHexToInt(hex); color->alpha = 0; return (MS_SUCCESS); } else if (msyystring_buffer[0] == '#' && strlen(msyystring_buffer) == 9) { /* got a hex color with alpha */ hex[0] = msyystring_buffer[1]; hex[1] = msyystring_buffer[2]; color->red = msHexToInt(hex); hex[0] = msyystring_buffer[3]; hex[1] = msyystring_buffer[4]; color->green = msHexToInt(hex); hex[0] = msyystring_buffer[5]; hex[1] = msyystring_buffer[6]; color->blue = msHexToInt(hex); hex[0] = msyystring_buffer[7]; hex[1] = msyystring_buffer[8]; color->alpha = msHexToInt(hex); return (MS_SUCCESS); } return (MS_FAILURE); } if (getInteger(&(color->green), MS_NUM_CHECK_RANGE, -255, 255) == -1) return (MS_FAILURE); if (getInteger(&(color->blue), MS_NUM_CHECK_RANGE, -255, 255) == -1) return (MS_FAILURE); if (getInteger(&(color->alpha), MS_NUM_CHECK_RANGE, 0, 255) == -1) return (MS_FAILURE); return (MS_SUCCESS); } #endif /* ** Helper functions for writing mapfiles. */ static void writeLineFeed(FILE *stream) { msIO_fprintf(stream, "\n"); } static void writeIndent(FILE *stream, int indent) { const char *str = " "; /* change this string to define the indent */ int i; for (i = 0; i < indent; i++) msIO_fprintf(stream, "%s", str); } static void writeBlockBegin(FILE *stream, int indent, const char *name) { writeIndent(stream, indent); msIO_fprintf(stream, "%s\n", name); } static void writeBlockEnd(FILE *stream, int indent, const char *name) { writeIndent(stream, indent); msIO_fprintf(stream, "END # %s\n", name); } static void writeKeyword(FILE *stream, int indent, const char *name, int value, int size, ...) { va_list argp; int i, j = 0; const char *s; va_start(argp, size); while (j < size) { /* check each value/keyword mapping in the list, values with no match are ignored */ i = va_arg(argp, int); s = va_arg(argp, const char *); if (value == i) { writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %s\n", name, s); va_end(argp); return; } j++; } va_end(argp); } static void writeDimension(FILE *stream, int indent, const char *name, double x, double y, char *bind_x, char *bind_y) { writeIndent(stream, ++indent); if (bind_x) msIO_fprintf(stream, "%s [%s] ", name, bind_x); else msIO_fprintf(stream, "%s %.15g ", name, x); if (bind_y) msIO_fprintf(stream, "[%s]\n", bind_y); else msIO_fprintf(stream, "%.15g\n", y); } static void writeDoubleRange(FILE *stream, int indent, const char *name, double x, double y) { writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %f %f\n", name, x, y); } static void writeExtent(FILE *stream, int indent, const char *name, rectObj extent) { if (!MS_VALID_EXTENT(extent)) return; writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %.15g %.15g %.15g %.15g\n", name, extent.minx, extent.miny, extent.maxx, extent.maxy); } static void writeNumber(FILE *stream, int indent, const char *name, double defaultNumber, double number) { if (number == defaultNumber) return; /* don't output default */ writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %.15g\n", name, number); } static void writeCharacter(FILE *stream, int indent, const char *name, const char defaultCharacter, char character) { if (defaultCharacter == character) return; writeIndent(stream, ++indent); msIO_fprintf(stream, "%s '%c'\n", name, character); } static void writeStringElement(FILE *stream, const char *string) { char *string_to_free = NULL; const char *string_escaped; if (strchr(string, '\\')) { string_to_free = msStrdup(string); string_to_free = msReplaceSubstring(string_to_free, "\\", "\\\\"); string_escaped = string_to_free; } else { string_escaped = string; } if ((strchr(string_escaped, '\'') == NULL) && (strchr(string_escaped, '\"') == NULL)) msIO_fprintf(stream, "\"%s\"", string_escaped); else if ((strchr(string_escaped, '\"') != NULL) && (strchr(string_escaped, '\'') == NULL)) msIO_fprintf(stream, "'%s'", string_escaped); else if ((strchr(string_escaped, '\'') != NULL) && (strchr(string_escaped, '\"') == NULL)) msIO_fprintf(stream, "\"%s\"", string_escaped); else { char *string_tmp = msStringEscape(string_escaped); msIO_fprintf(stream, "\"%s\"", string_tmp); if (string_escaped != string_tmp) free(string_tmp); } if (string_to_free) free(string_to_free); } static void writeString(FILE *stream, int indent, const char *name, const char *defaultString, const char *string) { if (!string) return; if (defaultString && strcmp(string, defaultString) == 0) return; writeIndent(stream, ++indent); if (name) msIO_fprintf(stream, "%s ", name); writeStringElement(stream, string); writeLineFeed(stream); } static void writeNumberOrString(FILE *stream, int indent, const char *name, double defaultNumber, double number, char *string) { if (string) writeString(stream, indent, name, NULL, string); else writeNumber(stream, indent, name, defaultNumber, number); } static void writeNumberOrKeyword(FILE *stream, int indent, const char *name, double defaultNumber, double number, int value, int size, ...) { va_list argp; int i, j = 0; const char *s; va_start(argp, size); while (j < size) { /* check each value/keyword mapping in the list */ i = va_arg(argp, int); s = va_arg(argp, const char *); if (value == i) { writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %s\n", name, s); va_end(argp); return; } j++; } va_end(argp); writeNumber(stream, indent, name, defaultNumber, number); } static void writeNameValuePair(FILE *stream, int indent, const char *name, const char *value) { if (!name || !value) return; writeIndent(stream, ++indent); writeStringElement(stream, (char *)name); msIO_fprintf(stream, "\t"); writeStringElement(stream, (char *)value); writeLineFeed(stream); } static void writeAttributeBinding(FILE *stream, int indent, const char *name, attributeBindingObj *binding) { if (!binding || !binding->item) return; writeIndent(stream, ++indent); msIO_fprintf(stream, "%s [%s]\n", name, binding->item); } static void writeColor(FILE *stream, int indent, const char *name, colorObj *defaultColor, colorObj *color) { if (!defaultColor && !MS_VALID_COLOR(*color)) return; else if (defaultColor && MS_COMPARE_COLOR(*defaultColor, *color)) return; /* if defaultColor has the same value than the color, return.*/ writeIndent(stream, ++indent); #if ALPHACOLOR_ENABLED msIO_fprintf(stream, "%s %d %d %d\n", name, color->red, color->green, color->blue, color->alpha); #else if (color->alpha != 255) { char buffer[9]; sprintf(buffer, "%02x", color->red); sprintf(buffer + 2, "%02x", color->green); sprintf(buffer + 4, "%02x", color->blue); sprintf(buffer + 6, "%02x", color->alpha); *(buffer + 8) = 0; msIO_fprintf(stream, "%s \"#%s\"\n", name, buffer); } else { msIO_fprintf(stream, "%s %d %d %d\n", name, color->red, color->green, color->blue); } #endif } /* todo: deal with alpha's... */ static void writeColorRange(FILE *stream, int indent, const char *name, colorObj *mincolor, colorObj *maxcolor) { if (!MS_VALID_COLOR(*mincolor) || !MS_VALID_COLOR(*maxcolor)) return; writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %d %d %d %d %d %d\n", name, mincolor->red, mincolor->green, mincolor->blue, maxcolor->red, maxcolor->green, maxcolor->blue); } /* ** Initialize, load and free a single join */ void initJoin(joinObj *join) { join->numitems = 0; join->name = NULL; /* unique join name, used for variable substitution */ join->items = NULL; /* array to hold item names for the joined table */ join->values = NULL; /* arrays of strings to holds one record worth of data */ join->table = NULL; join->joininfo = NULL; join->from = NULL; /* join items */ join->to = NULL; join->header = NULL; join->template = NULL; /* only html type templates are supported */ join->footer = NULL; join->type = MS_JOIN_ONE_TO_ONE; join->connection = NULL; join->connectiontype = MS_DB_XBASE; } void freeJoin(joinObj *join) { msFree(join->name); msFree(join->table); msFree(join->from); msFree(join->to); msFree(join->header); msFree(join->template); msFree(join->footer); msFreeCharArray(join->items, join->numitems); /* these may have been free'd elsewhere */ msFreeCharArray(join->values, join->numitems); join->numitems = 0; msJoinClose(join); msFree(join->connection); } int loadJoin(joinObj *join) { int nTmp; initJoin(join); for (;;) { switch (msyylex()) { case (CONNECTION): if (getString(&join->connection) == MS_FAILURE) return (-1); break; case (CONNECTIONTYPE): if ((nTmp = getSymbol(5, MS_DB_XBASE, MS_DB_MYSQL, MS_DB_ORACLE, MS_DB_POSTGRES, MS_DB_CSV)) == -1) return (-1); join->connectiontype = nTmp; break; case (EOF): msSetError(MS_EOFERR, NULL, "loadJoin()"); return (-1); case (END): if ((join->from == NULL) || (join->to == NULL) || (join->table == NULL)) { msSetError(MS_EOFERR, "Join must define table, name, from and to properties.", "loadJoin()"); return (-1); } if ((join->type == MS_MULTIPLE) && ((join->template == NULL) || (join->name == NULL))) { msSetError( MS_EOFERR, "One-to-many joins must define template and name properties.", "loadJoin()"); return (-1); } return (0); case (FOOTER): if (getString(&join->footer) == MS_FAILURE) return (-1); break; case (FROM): if (getString(&join->from) == MS_FAILURE) return (-1); break; case (HEADER): if (getString(&join->header) == MS_FAILURE) return (-1); break; case (JOIN): break; /* for string loads */ case (NAME): if (getString(&join->name) == MS_FAILURE) return (-1); break; case (TABLE): if (getString(&join->table) == MS_FAILURE) return (-1); break; case (TEMPLATE): if (getString(&join->template) == MS_FAILURE) return (-1); break; case (TO): if (getString(&join->to) == MS_FAILURE) return (-1); break; case (TYPE): if ((nTmp = getSymbol(2, MS_JOIN_ONE_TO_ONE, MS_JOIN_ONE_TO_MANY)) == -1) return (-1); join->type = nTmp; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadJoin()", msyystring_buffer, msyylineno); return (-1); } } /* next token */ } static void writeScaleToken(FILE *stream, int indent, scaleTokenObj *token) { int i; indent++; writeBlockBegin(stream, indent, "SCALETOKEN"); writeString(stream, indent, "NAME", NULL, token->name); indent++; writeBlockBegin(stream, indent, "VALUES"); for (i = 0; i < token->n_entries; i++) { char minscale[32]; sprintf(minscale, "%g", token->tokens[i].minscale); writeNameValuePair(stream, indent, minscale, token->tokens[i].value); } writeBlockEnd(stream, indent, "VALUES"); indent--; writeBlockEnd(stream, indent, "SCALETOKEN"); } static void writeJoin(FILE *stream, int indent, joinObj *join) { indent++; writeBlockBegin(stream, indent, "JOIN"); writeString(stream, indent, "FOOTER", NULL, join->footer); writeString(stream, indent, "FROM", NULL, join->from); writeString(stream, indent, "HEADER", NULL, join->header); writeString(stream, indent, "NAME", NULL, join->name); writeString(stream, indent, "TABLE", NULL, join->table); writeString(stream, indent, "TEMPLATE", NULL, join->template); writeString(stream, indent, "TO", NULL, join->to); writeKeyword(stream, indent, "CONNECTIONTYPE", join->connectiontype, 3, MS_DB_CSV, "CSV", MS_DB_POSTGRES, "POSTGRESQL", MS_DB_MYSQL, "MYSQL"); writeKeyword(stream, indent, "TYPE", join->type, 1, MS_JOIN_ONE_TO_MANY, "ONE-TO-MANY"); writeBlockEnd(stream, indent, "JOIN"); } /* inserts a feature at the end of the list, can create a new list */ featureListNodeObjPtr insertFeatureList(featureListNodeObjPtr *list, shapeObj *shape) { featureListNodeObjPtr node; node = (featureListNodeObjPtr)msSmallMalloc(sizeof(featureListNodeObj)); msInitShape(&(node->shape)); if (msCopyShape(shape, &(node->shape)) == -1) { msFree(node); return (NULL); } /* AJS - alans@wunderground.com O(n^2) -> O(n) conversion, keep a pointer to * the end */ /* set the tailifhead to NULL, since it is only set for the head of the list */ node->tailifhead = NULL; node->next = NULL; /* if we are at the head of the list, we need to set the list to node, before * pointing tailifhead somewhere */ if (*list == NULL) { *list = node; } else { if ((*list)->tailifhead != NULL) /* this should never be NULL, but just in case */ (*list)->tailifhead->next = node; /* put the node at the end of the list */ } /* repoint the head of the list to the end - our new element this causes a loop if we are at the head, be careful not to walk in a loop */ (*list)->tailifhead = node; return (node); /* a pointer to last object in the list */ } void freeFeatureList(featureListNodeObjPtr list) { featureListNodeObjPtr listNext = NULL; while (list != NULL) { listNext = list->next; msFreeShape(&(list->shape)); msFree(list); list = listNext; } } /* lineObj = multipointObj */ static int loadFeaturePoints(lineObj *points) { int ret = -1; int buffer_size = 0; points->point = (pointObj *)malloc(sizeof(pointObj) * MS_FEATUREINITSIZE); MS_CHECK_ALLOC(points->point, sizeof(pointObj) * MS_FEATUREINITSIZE, MS_FAILURE); points->numpoints = 0; buffer_size = MS_FEATUREINITSIZE; while (ret < 0) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadFeaturePoints()"); ret = MS_FAILURE; break; case (END): ret = MS_SUCCESS; break; case (MS_NUMBER): if (points->numpoints == buffer_size) { /* just add it to the end */ pointObj *newPoints = (pointObj *)realloc( points->point, sizeof(pointObj) * (buffer_size + MS_FEATUREINCREMENT)); if (newPoints == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", __FUNCTION__, __FILE__, __LINE__, (unsigned int)(sizeof(pointObj) * (buffer_size + MS_FEATUREINCREMENT))); ret = MS_FAILURE; break; } points->point = newPoints; buffer_size += MS_FEATUREINCREMENT; } points->point[points->numpoints].x = atof(msyystring_buffer); if (getDouble(&(points->point[points->numpoints].y), MS_NUM_CHECK_NONE, -1, -1) == -1) { ret = MS_FAILURE; break; } points->numpoints++; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadFeaturePoints()", msyystring_buffer, msyylineno); ret = MS_FAILURE; break; } } if (ret == MS_FAILURE) { msFree(points->point); /* clean up */ points->point = NULL; points->numpoints = 0; } return ret; } static int loadFeature(layerObj *player, int type) { int status = MS_SUCCESS; featureListNodeObjPtr *list = &(player->features); multipointObj points = {0, NULL}; shapeObj *shape = NULL; shape = (shapeObj *)malloc(sizeof(shapeObj)); MS_CHECK_ALLOC(shape, sizeof(shapeObj), MS_FAILURE); msInitShape(shape); shape->type = type; for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadFeature()"); msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); case (END): if (player->features != NULL && player->features->tailifhead != NULL) shape->index = player->features->tailifhead->shape.index + 1; else shape->index = 0; if (insertFeatureList(list, shape) == NULL) status = MS_FAILURE; msFreeShape(shape); /* clean up */ msFree(shape); return (status); case (FEATURE): break; /* for string loads */ case (POINTS): if (loadFeaturePoints(&points) == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } status = msAddLine(shape, &points); msFree(points.point); /* clean up */ points.numpoints = 0; if (status == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } break; case (ITEMS): { char *string = NULL; if (getString(&string) == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } if (string) { if (shape->values) msFreeCharArray(shape->values, shape->numvalues); shape->values = msStringSplitComplex(string, ";", &shape->numvalues, MS_ALLOWEMPTYTOKENS); msFree(string); /* clean up */ } break; } case (TEXT): if (getString(&shape->text) == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } break; case (WKT): { char *string = NULL; /* todo, what do we do with multiple WKT property occurrences? */ msFreeShape(shape); msFree(shape); if (getString(&string) == MS_FAILURE) return (MS_FAILURE); if ((shape = msShapeFromWKT(string)) == NULL) status = MS_FAILURE; msFree(string); /* clean up */ if (status == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } break; } default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadfeature()", msyystring_buffer, msyylineno); msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } } /* next token */ } static void writeFeature(FILE *stream, int indent, shapeObj *feature) { int i, j; indent++; writeBlockBegin(stream, indent, "FEATURE"); indent++; for (i = 0; i < feature->numlines; i++) { writeBlockBegin(stream, indent, "POINTS"); for (j = 0; j < feature->line[i].numpoints; j++) { writeIndent(stream, indent); msIO_fprintf(stream, "%.15g %.15g\n", feature->line[i].point[j].x, feature->line[i].point[j].y); } writeBlockEnd(stream, indent, "POINTS"); } indent--; if (feature->numvalues) { writeIndent(stream, indent); msIO_fprintf(stream, "ITEMS \""); for (i = 0; i < feature->numvalues; i++) { if (i == 0) msIO_fprintf(stream, "%s", feature->values[i]); else msIO_fprintf(stream, ";%s", feature->values[i]); } msIO_fprintf(stream, "\"\n"); } writeString(stream, indent, "TEXT", NULL, feature->text); writeBlockEnd(stream, indent, "FEATURE"); } void initGrid(graticuleObj *pGraticule) { memset(pGraticule, 0, sizeof(graticuleObj)); } void freeGrid(graticuleObj *pGraticule) { msFree(pGraticule->labelformat); msFree(pGraticule->pboundingpoints); msFree(pGraticule->pboundinglines); } static int loadGrid(layerObj *pLayer) { for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadGrid()"); return (-1); case (END): return (0); case (GRID): break; /* for string loads */ case (LABELFORMAT): if (getString(&(pLayer->grid->labelformat)) == MS_FAILURE) { if (strcasecmp(msyystring_buffer, "DD") == 0) /* DD triggers a symbol to be returned instead of a string so check for this special case */ { msFree(pLayer->grid->labelformat); pLayer->grid->labelformat = msStrdup("DD"); } else return (-1); } break; case (MINARCS): if (getDouble(&(pLayer->grid->minarcs), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXARCS): if (getDouble(&(pLayer->grid->maxarcs), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MININTERVAL): if (getDouble(&(pLayer->grid->minincrement), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXINTERVAL): if (getDouble(&(pLayer->grid->maxincrement), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MINSUBDIVIDE): if (getDouble(&(pLayer->grid->minsubdivides), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXSUBDIVIDE): if (getDouble(&(pLayer->grid->maxsubdivides), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadGrid()", msyystring_buffer, msyylineno); return (-1); } } } static void writeGrid(FILE *stream, int indent, graticuleObj *pGraticule) { if (!pGraticule) return; indent++; writeBlockBegin(stream, indent, "GRID"); writeString(stream, indent, "LABELFORMAT", NULL, pGraticule->labelformat); writeNumber(stream, indent, "MAXARCS", 0, pGraticule->maxarcs); writeNumber(stream, indent, "MAXSUBDIVIDE", 0, pGraticule->maxsubdivides); writeNumber(stream, indent, "MAXINTERVAL", 0, pGraticule->maxincrement); writeNumber(stream, indent, "MINARCS", 0, pGraticule->minarcs); writeNumber(stream, indent, "MININTERVAL", 0, pGraticule->minincrement); writeNumber(stream, indent, "MINSUBDIVIDE", 0, pGraticule->minsubdivides); writeBlockEnd(stream, indent, "GRID"); } static int loadProjection(projectionObj *p) { p->gt.need_geotransform = MS_FALSE; if (p->proj != NULL || p->numargs != 0) { msSetError(MS_MISCERR, "Projection is already initialized. Multiple projection " "definitions are not allowed in this object. (line %d)", "loadProjection()", msyylineno); return (-1); } for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadProjection()"); return (-1); case (END): if (p->numargs == 1 && strstr(p->args[0], "+") != NULL) { char *one_line_def = p->args[0]; int result; p->args[0] = NULL; p->numargs = 0; result = msLoadProjectionString(p, one_line_def); free(one_line_def); return result; } else { if (p->numargs != 0) return msProcessProjection(p); else return 0; } break; case (MS_STRING): case (MS_AUTO): if (p->numargs == MS_MAXPROJARGS) { msSetError(MS_MISCERR, "Parsing error near (%s):(line %d): Too many arguments in " "projection string", "loadProjection()", msyystring_buffer, msyylineno); return -1; } p->args[p->numargs] = msStrdup(msyystring_buffer); p->numargs++; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadProjection()", msyystring_buffer, msyylineno); return (-1); } } /* next token */ } /************************************************************************/ /* msLoadProjectionStringEPSGLike */ /************************************************************************/ static int msLoadProjectionStringEPSGLike(projectionObj *p, const char *value, const char *pszPrefix, int bFollowEPSGAxisOrder) { size_t buffer_size = 0; char *init_string = NULL; const char *code; const char *next_sep; size_t prefix_len; prefix_len = strlen(pszPrefix); if (strncasecmp(value, pszPrefix, prefix_len) != 0) return -1; code = value + prefix_len; next_sep = strchr(code, pszPrefix[prefix_len - 1]); if (next_sep != NULL) code = next_sep + 1; buffer_size = 10 + strlen(code) + 1; init_string = (char *)msSmallMalloc(buffer_size); /* translate into PROJ.4 format. */ snprintf(init_string, buffer_size, "init=epsg:%s", code); p->args = (char **)msSmallMalloc(sizeof(char *) * 2); p->args[0] = init_string; p->numargs = 1; if (bFollowEPSGAxisOrder && msIsAxisInverted(atoi(code))) { p->args[1] = msStrdup("+epsgaxis=ne"); p->numargs = 2; } return 0; } /************************************************************************/ /* msLoadProjectionStringCRSLike */ /************************************************************************/ static int msLoadProjectionStringCRSLike(projectionObj *p, const char *value, const char *pszPrefix) { char init_string[100]; const char *id; const char *next_sep; size_t prefix_len; prefix_len = strlen(pszPrefix); if (strncasecmp(value, pszPrefix, prefix_len) != 0) return -1; id = value + prefix_len; next_sep = strchr(id, pszPrefix[prefix_len - 1]); if (next_sep != NULL) id = next_sep + 1; init_string[0] = '\0'; if (strcasecmp(id, "84") == 0 || strcasecmp(id, "CRS84") == 0) strncpy(init_string, "init=epsg:4326", sizeof(init_string)); else if (strcasecmp(id, "83") == 0 || strcasecmp(id, "CRS83") == 0) strncpy(init_string, "init=epsg:4269", sizeof(init_string)); else if (strcasecmp(id, "27") == 0 || strcasecmp(id, "CRS27") == 0) strncpy(init_string, "init=epsg:4267", sizeof(init_string)); else { msSetError(MS_PROJERR, "Unrecognised OGC CRS def '%s'.", "msLoadProjectionString()", value); return -1; } p->args = (char **)msSmallMalloc(sizeof(char *) * 2); p->args[0] = msStrdup(init_string); p->numargs = 1; return 0; } /************************************************************************/ /* msLoadProjectionStringEPSG */ /* */ /* Checks for EPSG type projection and set the axes for a */ /* certain code ranges. */ /* Use for now in WMS 1.3.0 and WFS >= 1.1.0 */ /************************************************************************/ int msLoadProjectionStringEPSG(projectionObj *p, const char *value) { assert(p); msFreeProjectionExceptContext(p); p->gt.need_geotransform = MS_FALSE; #ifdef USE_PROJ_FASTPATHS if (strcasestr(value, "epsg:4326")) { p->wellknownprojection = wkp_lonlat; } else if (strcasestr(value, "epsg:3857")) { p->wellknownprojection = wkp_gmerc; } else { p->wellknownprojection = wkp_none; } #endif if (msLoadProjectionStringEPSGLike(p, value, "EPSG:", MS_TRUE) == 0) { return msProcessProjection(p); } return msLoadProjectionString(p, value); } int msLoadProjectionCodeString(projectionObj *p, const char *value) { int num_params = 0; // exit if init= is already at the start of the string e.g. from // msOGRSpatialRef2ProjectionObj if (strncasecmp(value, "init=", 5) == 0) { return -1; } if (!strchr(value, ':')) { return -1; } char **papszList = msStringSplit(value, ':', &(num_params)); if (num_params != 2) { msFreeCharArray(papszList, num_params); return -1; } const size_t buffer_size = 5 + strlen(value) + 1; char *init_string = (char *)msSmallMalloc(buffer_size); /* translate into PROJ format. */ snprintf(init_string, buffer_size, "init=%s:%s", papszList[0], papszList[1]); p->args = (char **)msSmallMalloc(sizeof(char *)); p->args[0] = init_string; p->numargs = 1; msFreeCharArray(papszList, num_params); return 0; } int msLoadProjectionString(projectionObj *p, const char *value) { assert(p); p->gt.need_geotransform = MS_FALSE; msFreeProjectionExceptContext(p); /* * Handle new style definitions, the same as they would be given to * the proj program. * eg. * "+proj=utm +zone=11 +ellps=WGS84" */ if (value[0] == '+') { char *trimmed; int i, i_out = 0; trimmed = msStrdup(value + 1); for (i = 1; value[i] != '\0'; i++) { if (!isspace(value[i])) trimmed[i_out++] = value[i]; } trimmed[i_out] = '\0'; p->args = msStringSplit(trimmed, '+', &p->numargs); free(trimmed); } else if (strncasecmp(value, "AUTO:", 5) == 0 || strncasecmp(value, "AUTO2:", 6) == 0) { /* WMS/WFS AUTO projection: "AUTO:proj_id,units_id,lon0,lat0" */ /* WMS 1.3.0 projection: "AUTO2:auto_crs_id,factor,lon0,lat0"*/ /* Keep the projection defn into a single token for writeProjection() */ /* to work fine. */ p->args = (char **)msSmallMalloc(sizeof(char *)); p->args[0] = msStrdup(value); p->numargs = 1; } else if (msLoadProjectionStringEPSGLike(p, value, "EPSG:", MS_FALSE) == 0) { /* Assume long/lat ordering. Use msLoadProjectionStringEPSG() if wanting to * follow EPSG axis */ } else if (msLoadProjectionStringEPSGLike( p, value, "urn:ogc:def:crs:EPSG:", MS_TRUE) == 0) { } else if (msLoadProjectionStringEPSGLike( p, value, "urn:EPSG:geographicCRS:", MS_TRUE) == 0) { } else if (msLoadProjectionStringEPSGLike( p, value, "urn:x-ogc:def:crs:EPSG:", MS_TRUE) == 0) { /*this case is to account for OGC CITE tests where x-ogc was used before the ogc name became an official NID. Note also we also account for the fact that a space for the version of the espg is not used with CITE tests. (Syntax used could be urn:ogc:def:objectType:authority:code)*/ } else if (msLoadProjectionStringCRSLike(p, value, "urn:ogc:def:crs:OGC:") == 0) { } else if (msLoadProjectionStringEPSGLike( p, value, "http://www.opengis.net/def/crs/EPSG/", MS_TRUE) == 0) { /* URI projection support */ } else if (msLoadProjectionStringCRSLike( p, value, "http://www.opengis.net/def/crs/OGC/") == 0) { /* Mandatory support for this URI format specified in WFS1.1 (also in 1.0?) */ } else if (msLoadProjectionStringEPSGLike( p, value, "http://www.opengis.net/gml/srs/epsg.xml#", MS_FALSE) == 0) { /* We assume always long/lat ordering, as that is what GeoServer does... */ } else if (msLoadProjectionStringCRSLike(p, value, "CRS:") == 0) { } else if (msLoadProjectionCodeString(p, value) == 0) { /* allow strings in the form AUTH:XXXX */ } /* * Handle old style comma delimited. eg. "proj=utm,zone=11,ellps=WGS84". */ else { p->args = msStringSplit(value, ',', &p->numargs); } return msProcessProjection(p); } static void writeProjection(FILE *stream, int indent, projectionObj *p) { int i; if (!p || p->numargs <= 0) return; indent++; writeBlockBegin(stream, indent, "PROJECTION"); for (i = 0; i < p->numargs; i++) writeString(stream, indent, NULL, NULL, p->args[i]); writeBlockEnd(stream, indent, "PROJECTION"); } void initLeader(labelLeaderObj *leader) { leader->gridstep = 5; leader->maxdistance = 0; /* Set maxstyles = 0, styles[] will be allocated as needed on first call * to msGrowLabelLeaderStyles() */ leader->numstyles = leader->maxstyles = 0; leader->styles = NULL; } /* ** Initialize, load and free a labelObj structure */ void initLabel(labelObj *label) { int i; MS_REFCNT_INIT(label); label->align = MS_ALIGN_DEFAULT; MS_INIT_COLOR(label->color, 0, 0, 0, 255); MS_INIT_COLOR(label->outlinecolor, -1, -1, -1, 255); /* don't use it */ label->outlinewidth = 1; MS_INIT_COLOR(label->shadowcolor, -1, -1, -1, 255); /* don't use it */ label->shadowsizex = label->shadowsizey = 1; label->font = NULL; label->size = MS_MEDIUM; label->position = MS_CC; label->angle = 0; label->anglemode = MS_NONE; label->minsize = MS_MINFONTSIZE; label->maxsize = MS_MAXFONTSIZE; label->buffer = 0; label->offsetx = label->offsety = 0; label->minscaledenom = -1; label->maxscaledenom = -1; label->minfeaturesize = -1; /* no limit */ label->autominfeaturesize = MS_FALSE; label->mindistance = -1; /* no limit */ label->repeatdistance = 0; /* no repeat */ label->maxoverlapangle = 22.5; /* default max overlap angle */ label->partials = MS_FALSE; label->wrap = '\0'; label->maxlength = 0; label->space_size_10 = 0.0; label->encoding = NULL; label->force = MS_OFF; label->priority = MS_DEFAULT_LABEL_PRIORITY; /* Set maxstyles = 0, styles[] will be allocated as needed on first call * to msGrowLabelStyles() */ label->numstyles = label->maxstyles = 0; label->styles = NULL; label->numbindings = 0; label->nexprbindings = 0; for (i = 0; i < MS_LABEL_BINDING_LENGTH; i++) { label->bindings[i].item = NULL; label->bindings[i].index = -1; msInitExpression(&(label->exprBindings[i])); } msInitExpression(&(label->expression)); msInitExpression(&(label->text)); label->leader = NULL; label->sizeunits = MS_INHERIT; label->scalefactor = 1.0; return; } int freeLabelLeader(labelLeaderObj *leader) { int i; for (i = 0; i < leader->numstyles; i++) { if (freeStyle(leader->styles[i]) == MS_SUCCESS) { msFree(leader->styles[i]); } } msFree(leader->styles); return MS_SUCCESS; } int freeLabel(labelObj *label) { int i; if (MS_REFCNT_DECR_IS_NOT_ZERO(label)) { return MS_FAILURE; } msFree(label->font); msFree(label->encoding); for (i = 0; i < label->numstyles; i++) { /* each style */ if (label->styles[i] != NULL) { if (freeStyle(label->styles[i]) == MS_SUCCESS) { msFree(label->styles[i]); } } } msFree(label->styles); for (i = 0; i < MS_LABEL_BINDING_LENGTH; i++) { msFree(label->bindings[i].item); msFreeExpression(&(label->exprBindings[i])); } msFreeExpression(&(label->expression)); msFreeExpression(&(label->text)); if (label->leader) { freeLabelLeader(label->leader); msFree(label->leader); label->leader = NULL; } return MS_SUCCESS; } static int loadLeader(labelLeaderObj *leader) { for (;;) { switch (msyylex()) { case (END): return (0); break; case (EOF): msSetError(MS_EOFERR, NULL, "loadLeader()"); return (-1); case GRIDSTEP: if (getInteger(&(leader->gridstep), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case MAXDISTANCE: if (getInteger(&(leader->maxdistance), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case STYLE: if (msGrowLeaderStyles(leader) == NULL) return (-1); initStyle(leader->styles[leader->numstyles]); if (loadStyle(leader->styles[leader->numstyles]) != MS_SUCCESS) { freeStyle(leader->styles[leader->numstyles]); free(leader->styles[leader->numstyles]); leader->styles[leader->numstyles] = NULL; return -1; } leader->numstyles++; break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLeader()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } } static int loadLabel(labelObj *label) { int symbol; for (;;) { switch (msyylex()) { case (ANGLE): if ((symbol = getSymbol(5, MS_NUMBER, MS_AUTO, MS_AUTO2, MS_FOLLOW, MS_BINDING)) == -1) return (-1); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, -360.0, 360.0) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid ANGLE, must be between -360 and 360 (line %d)", "loadLabel()", msyylineno); return (MS_FAILURE); } label->angle = (double)msyynumber; } else if (symbol == MS_BINDING) { if (label->bindings[MS_LABEL_BINDING_ANGLE].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_ANGLE].item); label->bindings[MS_LABEL_BINDING_ANGLE].item = msStrdup(msyystring_buffer); label->numbindings++; } else { label->anglemode = symbol; } break; case (ALIGN): if ((symbol = getSymbol(4, MS_ALIGN_LEFT, MS_ALIGN_CENTER, MS_ALIGN_RIGHT, MS_BINDING)) == -1) return (-1); if ((symbol == MS_ALIGN_LEFT) || (symbol == MS_ALIGN_CENTER) || (symbol == MS_ALIGN_RIGHT)) { label->align = symbol; } else { if (label->bindings[MS_LABEL_BINDING_ALIGN].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_ALIGN].item); label->bindings[MS_LABEL_BINDING_ALIGN].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (ANTIALIAS): /*ignore*/ msyylex(); break; case (BUFFER): if (getInteger(&(label->buffer), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); break; case (COLOR): if (loadColor(&(label->color), &(label->bindings[MS_LABEL_BINDING_COLOR])) != MS_SUCCESS) return (-1); if (label->bindings[MS_LABEL_BINDING_COLOR].item) label->numbindings++; break; case (ENCODING): if ((getString(&label->encoding)) == MS_FAILURE) return (-1); break; case (END): return (0); break; case (EOF): msSetError(MS_EOFERR, NULL, "loadLabel()"); return (-1); case (EXPRESSION): if (loadExpression(&(label->expression)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ break; case (FONT): if ((symbol = getSymbol(2, MS_STRING, MS_BINDING)) == -1) return (-1); if (symbol == MS_STRING) { if (label->font != NULL) msFree(label->font); label->font = msStrdup(msyystring_buffer); } else { if (label->bindings[MS_LABEL_BINDING_FONT].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_FONT].item); label->bindings[MS_LABEL_BINDING_FONT].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (FORCE): switch (msyylex()) { case MS_ON: label->force = MS_ON; break; case MS_OFF: label->force = MS_OFF; break; case GROUP: label->force = MS_LABEL_FORCE_GROUP; break; default: msSetError(MS_MISCERR, "Invalid FORCE, must be ON,OFF,or GROUP (line %d)", "loadLabel()", msyylineno); return (-1); } break; case (LABEL): break; /* for string loads */ case (LEADER): msSetError(MS_MISCERR, "LABEL LEADER not implemented. LEADER goes at the CLASS level " "(line %d)", "loadLabel()", msyylineno); return (-1); case (MAXSIZE): if (getInteger(&(label->maxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXSCALEDENOM): if (getDouble(&(label->maxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MAXLENGTH): if (getInteger(&(label->maxlength), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MINDISTANCE): if (getInteger(&(label->mindistance), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (REPEATDISTANCE): if (getInteger(&(label->repeatdistance), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXOVERLAPANGLE): if (getDouble(&(label->maxoverlapangle), MS_NUM_CHECK_RANGE, 0, 360) == -1) return (-1); break; case (MINFEATURESIZE): if ((symbol = getSymbol(2, MS_NUMBER, MS_AUTO)) == -1) return (-1); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GT, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid MINFEATURESIZE, must be greater than 0 (line %d)", "loadLabel()", msyylineno); return (MS_FAILURE); } label->minfeaturesize = (int)msyynumber; } else label->autominfeaturesize = MS_TRUE; break; case (MINSCALEDENOM): if (getDouble(&(label->minscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MINSIZE): if (getInteger(&(label->minsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (OFFSET): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) label->offsetx = (int)msyynumber; // any integer ok else { if (label->bindings[MS_LABEL_BINDING_OFFSET_X].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_OFFSET_X].item); label->bindings[MS_LABEL_BINDING_OFFSET_X].item = msStrdup(msyystring_buffer); label->numbindings++; } if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) label->offsety = (int)msyynumber; // any integer ok else { if (label->bindings[MS_LABEL_BINDING_OFFSET_Y].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_OFFSET_Y].item); label->bindings[MS_LABEL_BINDING_OFFSET_Y].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (OUTLINECOLOR): if (loadColor(&(label->outlinecolor), &(label->bindings[MS_LABEL_BINDING_OUTLINECOLOR])) != MS_SUCCESS) return (-1); if (label->bindings[MS_LABEL_BINDING_OUTLINECOLOR].item) label->numbindings++; break; case (OUTLINEWIDTH): if (getInteger(&(label->outlinewidth), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (PARTIALS): if ((label->partials = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); break; case (POSITION): if ((label->position = getSymbol(11, MS_UL, MS_UC, MS_UR, MS_CL, MS_CC, MS_CR, MS_LL, MS_LC, MS_LR, MS_AUTO, MS_BINDING)) == -1) return (-1); if (label->position == MS_BINDING) { if (label->bindings[MS_LABEL_BINDING_POSITION].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_POSITION].item); label->bindings[MS_LABEL_BINDING_POSITION].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (PRIORITY): if (label->exprBindings[MS_LABEL_BINDING_PRIORITY].string) { msFreeExpression(&label->exprBindings[MS_LABEL_BINDING_PRIORITY]); label->nexprbindings--; } if ((symbol = getSymbol(3, MS_EXPRESSION, MS_NUMBER, MS_BINDING)) == -1) return (-1); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, 1, MS_MAX_LABEL_PRIORITY) == MS_FAILURE) { msSetError( MS_MISCERR, "Invalid PRIORITY, must be an integer between 1 and %d (line %d)", "loadLabel()", MS_MAX_LABEL_PRIORITY, msyylineno); return (-1); } label->priority = (int)msyynumber; } else if (symbol == MS_EXPRESSION) { msFree(label->exprBindings[MS_LABEL_BINDING_PRIORITY].string); label->exprBindings[MS_LABEL_BINDING_PRIORITY].string = msStrdup(msyystring_buffer); label->exprBindings[MS_LABEL_BINDING_PRIORITY].type = MS_EXPRESSION; label->nexprbindings++; } else { if (label->bindings[MS_LABEL_BINDING_PRIORITY].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_PRIORITY].item); label->bindings[MS_LABEL_BINDING_PRIORITY].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (SHADOWCOLOR): if (loadColor(&(label->shadowcolor), NULL) != MS_SUCCESS) return (-1); break; case (SHADOWSIZE): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (-1); if (symbol == MS_NUMBER) { label->shadowsizex = (int)msyynumber; // x offset, any int ok } else { if (label->bindings[MS_LABEL_BINDING_SHADOWSIZEX].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_SHADOWSIZEX].item); label->bindings[MS_LABEL_BINDING_SHADOWSIZEX].item = msStrdup(msyystring_buffer); label->numbindings++; } if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (-1); if (symbol == MS_NUMBER) { label->shadowsizey = (int)msyynumber; // y offset, any int ok } else { if (label->bindings[MS_LABEL_BINDING_SHADOWSIZEY].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_SHADOWSIZEY].item); label->bindings[MS_LABEL_BINDING_SHADOWSIZEY].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (SIZE): if (label->bindings[MS_LABEL_BINDING_SIZE].item) { msFree(label->bindings[MS_LABEL_BINDING_SIZE].item); label->bindings[MS_LABEL_BINDING_SIZE].item = NULL; label->numbindings--; } if (label->exprBindings[MS_LABEL_BINDING_SIZE].string) { msFreeExpression(&label->exprBindings[MS_LABEL_BINDING_SIZE]); label->nexprbindings--; } if ((symbol = getSymbol(8, MS_EXPRESSION, MS_NUMBER, MS_BINDING, MS_TINY, MS_SMALL, MS_MEDIUM, MS_LARGE, MS_GIANT)) == -1) return (-1); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GT, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid SIZE, must be greater than 0 (line %d)", "loadLabel()", msyylineno); return (-1); } label->size = (double)msyynumber; } else if (symbol == MS_BINDING) { label->bindings[MS_LABEL_BINDING_SIZE].item = msStrdup(msyystring_buffer); label->numbindings++; } else if (symbol == MS_EXPRESSION) { msFree(label->exprBindings[MS_LABEL_BINDING_SIZE].string); label->exprBindings[MS_LABEL_BINDING_SIZE].string = msStrdup(msyystring_buffer); label->exprBindings[MS_LABEL_BINDING_SIZE].type = MS_EXPRESSION; label->nexprbindings++; } else label->size = symbol; break; case (STYLE): if (msGrowLabelStyles(label) == NULL) return (-1); initStyle(label->styles[label->numstyles]); if (loadStyle(label->styles[label->numstyles]) != MS_SUCCESS) { freeStyle(label->styles[label->numstyles]); free(label->styles[label->numstyles]); label->styles[label->numstyles] = NULL; return (-1); } if (label->styles[label->numstyles]->_geomtransform.type == MS_GEOMTRANSFORM_NONE) label->styles[label->numstyles]->_geomtransform.type = MS_GEOMTRANSFORM_LABELPOINT; /* set a default, a marker? */ label->numstyles++; break; case (TEXT): if (loadExpression(&(label->text)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ if ((label->text.type != MS_STRING) && (label->text.type != MS_EXPRESSION)) { msSetError( MS_MISCERR, "Text expressions support constant or tagged replacement strings.", "loadLabel()"); return (-1); } break; case (TYPE): if (getSymbol(2, MS_TRUETYPE, MS_BITMAP) == -1) return (-1); /* ignore TYPE */ break; case (WRAP): if (getCharacter(&(label->wrap)) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLabel()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateLabelFromString(labelObj *label, char *string) { if (!label || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadLabel(label) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeLeader(FILE *stream, int indent, labelLeaderObj *leader) { int i; if (leader->maxdistance == 0 && leader->numstyles == 0) { return; } indent++; writeBlockBegin(stream, indent, "LEADER"); writeNumber(stream, indent, "MAXDISTANCE", 0, leader->maxdistance); writeNumber(stream, indent, "GRIDSTEP", 5, leader->gridstep); for (i = 0; i < leader->numstyles; i++) writeStyle(stream, indent, leader->styles[i]); writeBlockEnd(stream, indent, "LEADER"); } static void writeLabel(FILE *stream, int indent, labelObj *label) { int i; colorObj c; if (label->size == -1) return; /* there is no default label anymore */ indent++; writeBlockBegin(stream, indent, "LABEL"); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_ANGLE].item) writeAttributeBinding(stream, indent, "ANGLE", &(label->bindings[MS_LABEL_BINDING_ANGLE])); else writeNumberOrKeyword(stream, indent, "ANGLE", 0, label->angle, label->anglemode, 3, MS_FOLLOW, "FOLLOW", MS_AUTO, "AUTO", MS_AUTO2, "AUTO2"); writeExpression(stream, indent, "EXPRESSION", &(label->expression)); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_FONT].item) writeAttributeBinding(stream, indent, "FONT", &(label->bindings[MS_LABEL_BINDING_FONT])); else writeString(stream, indent, "FONT", NULL, label->font); writeNumber(stream, indent, "MAXSIZE", MS_MAXFONTSIZE, label->maxsize); writeNumber(stream, indent, "MINSIZE", MS_MINFONTSIZE, label->minsize); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_SIZE].item) writeAttributeBinding(stream, indent, "SIZE", &(label->bindings[MS_LABEL_BINDING_SIZE])); else writeNumber(stream, indent, "SIZE", -1, label->size); writeKeyword(stream, indent, "ALIGN", label->align, 3, MS_ALIGN_LEFT, "LEFT", MS_ALIGN_CENTER, "CENTER", MS_ALIGN_RIGHT, "RIGHT"); writeNumber(stream, indent, "BUFFER", 0, label->buffer); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_COLOR].item) writeAttributeBinding(stream, indent, "COLOR", &(label->bindings[MS_LABEL_BINDING_COLOR])); else { MS_INIT_COLOR(c, 0, 0, 0, 255); writeColor(stream, indent, "COLOR", &c, &(label->color)); } writeString(stream, indent, "ENCODING", NULL, label->encoding); if (label->leader) writeLeader(stream, indent, label->leader); writeKeyword(stream, indent, "FORCE", label->force, 2, MS_TRUE, "TRUE", MS_LABEL_FORCE_GROUP, "GROUP"); writeNumber(stream, indent, "MAXLENGTH", 0, label->maxlength); writeNumber(stream, indent, "MAXSCALEDENOM", -1, label->maxscaledenom); writeNumber(stream, indent, "MINDISTANCE", -1, label->mindistance); writeNumberOrKeyword(stream, indent, "MINFEATURESIZE", -1, label->minfeaturesize, 1, label->autominfeaturesize, MS_TRUE, "AUTO"); writeNumber(stream, indent, "MINSCALEDENOM", -1, label->minscaledenom); writeDimension(stream, indent, "OFFSET", label->offsetx, label->offsety, NULL, NULL); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_OUTLINECOLOR].item) writeAttributeBinding(stream, indent, "OUTLINECOLOR", &(label->bindings[MS_LABEL_BINDING_OUTLINECOLOR])); else writeColor(stream, indent, "OUTLINECOLOR", NULL, &(label->outlinecolor)); writeNumber(stream, indent, "OUTLINEWIDTH", 1, label->outlinewidth); writeKeyword(stream, indent, "PARTIALS", label->partials, 1, MS_TRUE, "TRUE"); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_POSITION].item) writeAttributeBinding(stream, indent, "POSITION", &(label->bindings[MS_LABEL_BINDING_POSITION])); else writeKeyword(stream, indent, "POSITION", label->position, 10, MS_UL, "UL", MS_UC, "UC", MS_UR, "UR", MS_CL, "CL", MS_CC, "CC", MS_CR, "CR", MS_LL, "LL", MS_LC, "LC", MS_LR, "LR", MS_AUTO, "AUTO"); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_PRIORITY].item) writeAttributeBinding(stream, indent, "PRIORITY", &(label->bindings[MS_LABEL_BINDING_PRIORITY])); else if (label->nexprbindings > 0 && label->exprBindings[MS_LABEL_BINDING_PRIORITY].string) writeExpression(stream, indent, "PRIORITY", &(label->exprBindings[MS_LABEL_BINDING_PRIORITY])); else writeNumber(stream, indent, "PRIORITY", MS_DEFAULT_LABEL_PRIORITY, label->priority); writeNumber(stream, indent, "REPEATDISTANCE", 0, label->repeatdistance); writeColor(stream, indent, "SHADOWCOLOR", NULL, &(label->shadowcolor)); writeDimension(stream, indent, "SHADOWSIZE", label->shadowsizex, label->shadowsizey, label->bindings[MS_LABEL_BINDING_SHADOWSIZEX].item, label->bindings[MS_LABEL_BINDING_SHADOWSIZEY].item); writeNumber(stream, indent, "MAXOVERLAPANGLE", 22.5, label->maxoverlapangle); for (i = 0; i < label->numstyles; i++) writeStyle(stream, indent, label->styles[i]); writeExpression(stream, indent, "TEXT", &(label->text)); writeCharacter(stream, indent, "WRAP", '\0', label->wrap); writeBlockEnd(stream, indent, "LABEL"); } char *msWriteLabelToString(labelObj *label) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeLabel(stdout, -1, label); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } void msInitExpression(expressionObj *exp) { memset(exp, 0, sizeof(*exp)); exp->type = MS_STRING; } void msFreeExpressionTokens(expressionObj *exp) { tokenListNodeObjPtr node = NULL; tokenListNodeObjPtr nextNode = NULL; if (!exp) return; if (exp->tokens) { node = exp->tokens; while (node != NULL) { nextNode = node->next; msFree(node->tokensrc); /* not set very often */ switch (node->token) { case MS_TOKEN_BINDING_DOUBLE: case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: case MS_TOKEN_BINDING_TIME: msFree(node->tokenval.bindval.item); break; case MS_TOKEN_LITERAL_TIME: /* anything to do? */ break; case MS_TOKEN_LITERAL_STRING: msFree(node->tokenval.strval); break; case MS_TOKEN_LITERAL_SHAPE: msFreeShape(node->tokenval.shpval); free(node->tokenval.shpval); break; } msFree(node); node = nextNode; } exp->tokens = exp->curtoken = NULL; } } void msFreeExpression(expressionObj *exp) { if (!exp) return; msFree(exp->string); msFree(exp->native_string); if ((exp->type == MS_REGEX) && exp->compiled) ms_regfree(&(exp->regex)); msFreeExpressionTokens(exp); msInitExpression(exp); /* re-initialize */ } int loadExpression(expressionObj *exp) { /* TODO: should we call msFreeExpression if exp->string != NULL? We do some * checking to avoid a leak but is it enough... */ msyystring_icase = MS_TRUE; if ((exp->type = getSymbol(6, MS_STRING, MS_EXPRESSION, MS_REGEX, MS_ISTRING, MS_IREGEX, MS_LIST)) == -1) return (-1); if (exp->string != NULL) { msFree(exp->string); msFree(exp->native_string); } exp->string = msStrdup(msyystring_buffer); exp->native_string = NULL; if (exp->type == MS_ISTRING) { exp->flags = exp->flags | MS_EXP_INSENSITIVE; exp->type = MS_STRING; } else if (exp->type == MS_IREGEX) { exp->flags = exp->flags | MS_EXP_INSENSITIVE; exp->type = MS_REGEX; } return (0); } /* --------------------------------------------------------------------------- msLoadExpressionString and loadExpressionString msLoadExpressionString wraps call to loadExpressionString with mutex acquisition and release. This function should be used everywhere outside the mapfile loading phase of an application. loadExpressionString does not check for a mutex! It should be used only within code that has properly acquired a mutex. See bug 339 for more details -- SG. ------------------------------------------------------------------------ */ int msLoadExpressionString(expressionObj *exp, const char *value) { int retval = MS_FAILURE; msAcquireLock(TLOCK_PARSER); retval = loadExpressionString(exp, value); msReleaseLock(TLOCK_PARSER); return retval; } int loadExpressionString(expressionObj *exp, const char *value) { msyystate = MS_TOKENIZE_STRING; msyystring = value; msyylex(); /* sets things up but processes no tokens */ msFreeExpression(exp); /* we're totally replacing the old expression so free (which re-inits) to start over */ msyystring_icase = MS_TRUE; if ((exp->type = getSymbol2(5, MS_EXPRESSION, MS_REGEX, MS_IREGEX, MS_ISTRING, MS_LIST)) != -1) { exp->string = msStrdup(msyystring_buffer); if (exp->type == MS_ISTRING) { exp->type = MS_STRING; exp->flags = exp->flags | MS_EXP_INSENSITIVE; } else if (exp->type == MS_IREGEX) { exp->type = MS_REGEX; exp->flags = exp->flags | MS_EXP_INSENSITIVE; } } else { /* failure above is not an error since we'll consider anything not matching * (like an unquoted number) as a STRING) */ exp->type = MS_STRING; if ((strlen(value) - strlen(msyystring_buffer)) == 2) exp->string = msStrdup(msyystring_buffer); /* value was quoted */ else exp->string = msStrdup(value); /* use the whole value */ } return (0); } /* msGetExpressionString() * * Returns the string representation of this expression, including delimiters * and any flags (e.g. i = case-insensitive). * * Returns a newly allocated buffer that should be freed by the caller or NULL. */ char *msGetExpressionString(expressionObj *exp) { if (exp->string) { char *exprstring; size_t buffer_size; const char *case_insensitive = ""; if (exp->flags & MS_EXP_INSENSITIVE) case_insensitive = "i"; /* Alloc buffer big enough for string + 2 delimiters + 'i' + \0 */ buffer_size = strlen(exp->string) + 4; exprstring = (char *)msSmallMalloc(buffer_size); switch (exp->type) { case (MS_REGEX): snprintf(exprstring, buffer_size, "/%s/%s", exp->string, case_insensitive); return exprstring; case (MS_STRING): snprintf(exprstring, buffer_size, "\"%s\"%s", exp->string, case_insensitive); return exprstring; case (MS_EXPRESSION): snprintf(exprstring, buffer_size, "(%s)", exp->string); return exprstring; case (MS_LIST): snprintf(exprstring, buffer_size, "{%s}", exp->string); return exprstring; default: /* We should never get to here really! */ free(exprstring); return NULL; } } return NULL; } static void writeExpression(FILE *stream, int indent, const char *name, expressionObj *exp) { if (!exp || !exp->string) return; writeIndent(stream, ++indent); switch (exp->type) { case (MS_LIST): fprintf(stream, "%s {%s}", name, exp->string); break; case (MS_REGEX): msIO_fprintf(stream, "%s /%s/", name, exp->string); break; case (MS_STRING): msIO_fprintf(stream, "%s ", name); writeStringElement(stream, exp->string); break; case (MS_EXPRESSION): msIO_fprintf(stream, "%s (%s)", name, exp->string); break; } if ((exp->type == MS_STRING || exp->type == MS_REGEX) && (exp->flags & MS_EXP_INSENSITIVE)) msIO_fprintf(stream, "i"); writeLineFeed(stream); } int loadHashTable(hashTableObj *ptable) { assert(ptable); for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadHashTable()"); return (MS_FAILURE); case (END): return (MS_SUCCESS); case (MS_STRING): { char *data = NULL; char *key = msStrdup(msyystring_buffer); /* the key is *always* a string */ if (getString(&data) == MS_FAILURE) { free(key); return (MS_FAILURE); } msInsertHashTable(ptable, key, data); free(key); free(data); break; } default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadHashTable()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } return (MS_SUCCESS); } static void writeHashTable(FILE *stream, int indent, const char *title, hashTableObj *table) { struct hashObj *tp; int i; if (!table) return; if (msHashIsEmpty(table)) return; indent++; writeBlockBegin(stream, indent, title); for (i = 0; i < MS_HASHSIZE; i++) { if (table->items[i] != NULL) { for (tp = table->items[i]; tp != NULL; tp = tp->next) writeNameValuePair(stream, indent, tp->key, tp->data); } } writeBlockEnd(stream, indent, title); } static void writeHashTableInline(FILE *stream, int indent, char *name, hashTableObj *table) { struct hashObj *tp = NULL; int i; if (!table) return; if (msHashIsEmpty(table)) return; ++indent; for (i = 0; i < MS_HASHSIZE; ++i) { if (table->items[i] != NULL) { for (tp = table->items[i]; tp != NULL; tp = tp->next) { writeIndent(stream, indent); msIO_fprintf(stream, "%s ", name); writeStringElement(stream, tp->key); msIO_fprintf(stream, " "); writeStringElement(stream, tp->data); writeLineFeed(stream); } } } } /* ** Initialize, load and free a cluster object */ void initCluster(clusterObj *cluster) { cluster->maxdistance = 10; cluster->buffer = 0; cluster->region = NULL; msInitExpression(&(cluster->group)); msInitExpression(&(cluster->filter)); } void freeCluster(clusterObj *cluster) { msFree(cluster->region); msFreeExpression(&(cluster->group)); msFreeExpression(&(cluster->filter)); } int loadCluster(clusterObj *cluster) { for (;;) { switch (msyylex()) { case (CLUSTER): break; /* for string loads */ case (MAXDISTANCE): if (getDouble(&(cluster->maxdistance), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (BUFFER): if (getDouble(&(cluster->buffer), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (REGION): if (getString(&cluster->region) == MS_FAILURE) return (-1); break; case (END): return (0); break; case (GROUP): if (loadExpression(&(cluster->group)) == -1) return (-1); break; case (FILTER): if (loadExpression(&(cluster->filter)) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadCluster()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } return (MS_SUCCESS); } int msUpdateClusterFromString(clusterObj *cluster, char *string) { if (!cluster || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadCluster(cluster) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeCluster(FILE *stream, int indent, clusterObj *cluster) { if (cluster->maxdistance == 10 && cluster->buffer == 0.0 && cluster->region == NULL && cluster->group.string == NULL && cluster->filter.string == NULL) return; /* Nothing to write */ indent++; writeBlockBegin(stream, indent, "CLUSTER"); writeNumber(stream, indent, "MAXDISTANCE", 10, cluster->maxdistance); writeNumber(stream, indent, "BUFFER", 0, cluster->buffer); writeString(stream, indent, "REGION", NULL, cluster->region); writeExpression(stream, indent, "GROUP", &(cluster->group)); writeExpression(stream, indent, "FILTER", &(cluster->filter)); writeBlockEnd(stream, indent, "CLUSTER"); } char *msWriteClusterToString(clusterObj *cluster) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeCluster(stdout, -1, cluster); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize, load and free a single style */ int initStyle(styleObj *style) { int i; MS_REFCNT_INIT(style); MS_INIT_COLOR(style->color, -1, -1, -1, 255); /* must explicitly set colors */ MS_INIT_COLOR(style->outlinecolor, -1, -1, -1, 255); /* New Color Range fields*/ MS_INIT_COLOR(style->mincolor, -1, -1, -1, 255); MS_INIT_COLOR(style->maxcolor, -1, -1, -1, 255); style->minvalue = 0.0; style->maxvalue = 1.0; style->rangeitem = NULL; /* End Color Range fields*/ style->symbol = 0; /* there is always a default symbol*/ style->symbolname = NULL; style->size = -1; /* in SIZEUNITS (layerObj) */ style->minsize = MS_MINSYMBOLSIZE; style->maxsize = MS_MAXSYMBOLSIZE; style->width = 1; /* in pixels */ style->outlinewidth = 0; /* in pixels */ style->minwidth = MS_MINSYMBOLWIDTH; style->maxwidth = MS_MAXSYMBOLWIDTH; style->minscaledenom = style->maxscaledenom = -1.0; style->offsetx = style->offsety = 0; /* no offset */ style->polaroffsetpixel = style->polaroffsetangle = 0; /* no polar offset */ style->angle = 0; style->autoangle = MS_FALSE; style->antialiased = MS_TRUE; style->opacity = 100; /* fully opaque */ msInitExpression(&(style->_geomtransform)); style->_geomtransform.type = MS_GEOMTRANSFORM_NONE; style->patternlength = 0; /* solid line */ style->gap = 0; style->initialgap = -1; style->linecap = MS_CJC_DEFAULT_CAPS; style->linejoin = MS_CJC_DEFAULT_JOINS; style->linejoinmaxsize = MS_CJC_DEFAULT_JOIN_MAXSIZE; style->numbindings = 0; style->nexprbindings = 0; for (i = 0; i < MS_STYLE_BINDING_LENGTH; i++) { style->bindings[i].item = NULL; style->bindings[i].index = -1; msInitExpression(&(style->exprBindings[i])); } style->sizeunits = MS_INHERIT; style->scalefactor = 1.0; return MS_SUCCESS; } int loadStyle(styleObj *style) { int symbol; for (;;) { switch (msyylex()) { /* New Color Range fields*/ case (COLORRANGE): /*These are both in one line now*/ if (loadColor(&(style->mincolor), NULL) != MS_SUCCESS) return (MS_FAILURE); if (loadColor(&(style->maxcolor), NULL) != MS_SUCCESS) return (MS_FAILURE); break; case (DATARANGE): /*These are both in one line now*/ if (getDouble(&(style->minvalue), MS_NUM_CHECK_NONE, -1, -1) == -1) return (MS_FAILURE); if (getDouble(&(style->maxvalue), MS_NUM_CHECK_NONE, -1, -1) == -1) return (MS_FAILURE); break; case (RANGEITEM): if (getString(&style->rangeitem) == MS_FAILURE) return (MS_FAILURE); break; /* End Range fields*/ case (ANGLE): if ((symbol = getSymbol(3, MS_NUMBER, MS_BINDING, MS_AUTO)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, -360.0, 360.0) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid ANGLE, must be between -360 and 360 (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } style->angle = (double)msyynumber; } else if (symbol == MS_BINDING) { if (style->bindings[MS_STYLE_BINDING_ANGLE].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_ANGLE].item); style->bindings[MS_STYLE_BINDING_ANGLE].item = msStrdup(msyystring_buffer); style->numbindings++; } else { style->autoangle = MS_TRUE; } break; case (ANTIALIAS): if ((symbol = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (MS_FAILURE); if (symbol == MS_FALSE) { style->antialiased = MS_FALSE; } break; case (COLOR): if (loadColor(&(style->color), &(style->bindings[MS_STYLE_BINDING_COLOR])) != MS_SUCCESS) return (MS_FAILURE); if (style->bindings[MS_STYLE_BINDING_COLOR].item) style->numbindings++; break; case (EOF): msSetError(MS_EOFERR, NULL, "loadStyle()"); return (MS_FAILURE); /* missing END (probably) */ case (END): { int alpha; /* apply opacity as the alpha channel color(s) */ if (style->opacity < 100) { alpha = MS_NINT(style->opacity * 2.55); style->color.alpha = alpha; style->outlinecolor.alpha = alpha; style->mincolor.alpha = alpha; style->maxcolor.alpha = alpha; } return (MS_SUCCESS); } break; case (GAP): if (getDouble(&(style->gap), MS_NUM_CHECK_NONE, -1, -1) == -1) return (MS_FAILURE); break; case (INITIALGAP): if (getDouble(&(style->initialgap), MS_NUM_CHECK_GTE, 0, -1) == -1) { // zero is ok msSetError(MS_MISCERR, "INITIALGAP requires a positive values (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } break; case (MAXSCALEDENOM): if (getDouble(&(style->maxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (MS_FAILURE); break; case (MINSCALEDENOM): if (getDouble(&(style->minscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (MS_FAILURE); break; case (GEOMTRANSFORM): { int s; if ((s = getSymbol(2, MS_STRING, MS_EXPRESSION)) == -1) return (MS_FAILURE); if (s == MS_STRING) msStyleSetGeomTransform(style, msyystring_buffer); else { /* handle expression case here for the moment */ msFree(style->_geomtransform.string); style->_geomtransform.string = msStrdup(msyystring_buffer); style->_geomtransform.type = MS_GEOMTRANSFORM_EXPRESSION; } } break; case (LINECAP): if ((style->linecap = getSymbol(4, MS_CJC_BUTT, MS_CJC_ROUND, MS_CJC_SQUARE, MS_CJC_TRIANGLE)) == -1) return (MS_FAILURE); break; case (LINEJOIN): if ((style->linejoin = getSymbol(4, MS_CJC_NONE, MS_CJC_ROUND, MS_CJC_MITER, MS_CJC_BEVEL)) == -1) return (MS_FAILURE); break; case (LINEJOINMAXSIZE): if (getDouble(&(style->linejoinmaxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (MS_FAILURE); break; case (MAXSIZE): if (getDouble(&(style->maxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (MS_FAILURE); break; case (MINSIZE): if (getDouble(&(style->minsize), MS_NUM_CHECK_GTE, 0, -1) == -1) return (MS_FAILURE); break; case (MAXWIDTH): if (getDouble(&(style->maxwidth), MS_NUM_CHECK_GT, 0, -1) == -1) return (MS_FAILURE); break; case (MINWIDTH): if (getDouble(&(style->minwidth), MS_NUM_CHECK_GTE, 0, -1) == -1) return (MS_FAILURE); break; case (OFFSET): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) style->offsetx = (double)msyynumber; // any double ok else { if (style->bindings[MS_STYLE_BINDING_OFFSET_X].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_OFFSET_X].item); style->bindings[MS_STYLE_BINDING_OFFSET_X].item = msStrdup(msyystring_buffer); style->numbindings++; } if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) style->offsety = (double)msyynumber; // any double ok else { if (style->bindings[MS_STYLE_BINDING_OFFSET_Y].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_OFFSET_Y].item); style->bindings[MS_STYLE_BINDING_OFFSET_Y].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (OPACITY): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) style->opacity = MS_MAX(MS_MIN((int)msyynumber, 100), 0); /* force opacity to between 0 and 100 */ else { if (style->bindings[MS_STYLE_BINDING_OPACITY].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_OPACITY].item); style->bindings[MS_STYLE_BINDING_OPACITY].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (OUTLINECOLOR): if (loadColor(&(style->outlinecolor), &(style->bindings[MS_STYLE_BINDING_OUTLINECOLOR])) != MS_SUCCESS) return (MS_FAILURE); if (style->bindings[MS_STYLE_BINDING_OUTLINECOLOR].item) style->numbindings++; break; case (PATTERN): { int done = MS_FALSE; for (;;) { /* read till the next END */ switch (msyylex()) { case (END): if (style->patternlength < 2) { msSetError(MS_SYMERR, "Not enough pattern elements. A minimum of 2 are " "required (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } done = MS_TRUE; break; case (MS_NUMBER): /* read the pattern values */ if (style->patternlength == MS_MAXPATTERNLENGTH) { msSetError(MS_SYMERR, "Pattern too long.", "loadStyle()"); return (MS_FAILURE); } style->pattern[style->patternlength] = atof(msyystring_buffer); // good enough? style->patternlength++; break; default: msSetError(MS_TYPEERR, "Parsing error near (%s):(line %d)", "loadStyle()", msyystring_buffer, msyylineno); return (MS_FAILURE); } if (done == MS_TRUE) break; } break; } case (OUTLINEWIDTH): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GTE, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid OUTLINEWIDTH, must be greater then or equal to 0 " "(line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } style->outlinewidth = (double)msyynumber; } else { if (style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].item); style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (SIZE): if (style->exprBindings[MS_STYLE_BINDING_SIZE].string) { msFreeExpression(&style->exprBindings[MS_STYLE_BINDING_SIZE]); style->nexprbindings--; } if ((symbol = getSymbol(3, MS_EXPRESSION, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GT, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid SIZE, must be greater than 0 (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } style->size = (double)msyynumber; } else if (symbol == MS_EXPRESSION) { msFree(style->exprBindings[MS_STYLE_BINDING_SIZE].string); style->exprBindings[MS_STYLE_BINDING_SIZE].string = msStrdup(msyystring_buffer); style->exprBindings[MS_STYLE_BINDING_SIZE].type = MS_EXPRESSION; style->nexprbindings++; } else { if (style->bindings[MS_STYLE_BINDING_SIZE].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_SIZE].item); style->bindings[MS_STYLE_BINDING_SIZE].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (STYLE): break; /* for string loads */ case (SYMBOL): if ((symbol = getSymbol(3, MS_NUMBER, MS_STRING, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GTE, 0, -1) == MS_FAILURE) { msSetError( MS_MISCERR, "Invalid SYMBOL id, must be greater than or equal to 0 (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } if (style->symbolname != NULL) { msFree(style->symbolname); style->symbolname = NULL; } style->symbol = (int)msyynumber; } else if (symbol == MS_STRING) { if (style->symbolname != NULL) msFree(style->symbolname); style->symbolname = msStrdup(msyystring_buffer); } else { if (style->bindings[MS_STYLE_BINDING_SYMBOL].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_SYMBOL].item); style->bindings[MS_STYLE_BINDING_SYMBOL].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (WIDTH): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GTE, 0, -1) == MS_FAILURE) { msSetError( MS_MISCERR, "Invalid WIDTH, must be greater than or equal to 0 (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } style->width = (double)msyynumber; } else { if (style->bindings[MS_STYLE_BINDING_WIDTH].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_WIDTH].item); style->bindings[MS_STYLE_BINDING_WIDTH].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (POLAROFFSET): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { style->polaroffsetpixel = (double)msyynumber; // ok? } else { if (style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item); style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item = msStrdup(msyystring_buffer); style->numbindings++; } if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { style->polaroffsetangle = (double)msyynumber; // ok? } else { if (style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item); style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item = msStrdup(msyystring_buffer); style->numbindings++; } break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadStyle()", msyystring_buffer, msyylineno); return (MS_FAILURE); } else { return (MS_SUCCESS); /* end of a string, not an error */ } } } } int msUpdateStyleFromString(styleObj *style, char *string) { if (!style || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadStyle(style) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } int freeStyle(styleObj *style) { int i; if (MS_REFCNT_DECR_IS_NOT_ZERO(style)) { return MS_FAILURE; } msFree(style->symbolname); msFreeExpression(&style->_geomtransform); msFree(style->rangeitem); for (i = 0; i < MS_STYLE_BINDING_LENGTH; i++) { msFree(style->bindings[i].item); msFreeExpression(&(style->exprBindings[i])); } return MS_SUCCESS; } void writeStyle(FILE *stream, int indent, styleObj *style) { indent++; writeBlockBegin(stream, indent, "STYLE"); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_ANGLE].item) writeAttributeBinding(stream, indent, "ANGLE", &(style->bindings[MS_STYLE_BINDING_ANGLE])); else writeNumberOrKeyword(stream, indent, "ANGLE", 0, style->angle, style->autoangle, 1, MS_TRUE, "AUTO"); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_COLOR].item) writeAttributeBinding(stream, indent, "COLOR", &(style->bindings[MS_STYLE_BINDING_COLOR])); else writeColor(stream, indent, "COLOR", NULL, &(style->color)); writeNumber(stream, indent, "GAP", 0, style->gap); writeNumber(stream, indent, "INITIALGAP", -1, style->initialgap); if (style->_geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) { writeIndent(stream, indent + 1); msIO_fprintf(stream, "GEOMTRANSFORM (%s)\n", style->_geomtransform.string); } else if (style->_geomtransform.type != MS_GEOMTRANSFORM_NONE) { writeKeyword(stream, indent, "GEOMTRANSFORM", style->_geomtransform.type, 8, MS_GEOMTRANSFORM_BBOX, "\"bbox\"", MS_GEOMTRANSFORM_END, "\"end\"", MS_GEOMTRANSFORM_LABELPOINT, "\"labelpnt\"", MS_GEOMTRANSFORM_LABELPOLY, "\"labelpoly\"", MS_GEOMTRANSFORM_LABELCENTER, "\"labelcenter\"", MS_GEOMTRANSFORM_START, "\"start\"", MS_GEOMTRANSFORM_VERTICES, "\"vertices\"", MS_GEOMTRANSFORM_CENTROID, "\"centroid\""); } if (style->linecap != MS_CJC_DEFAULT_CAPS) { writeKeyword(stream, indent, "LINECAP", (int)style->linecap, 5, MS_CJC_NONE, "NONE", MS_CJC_ROUND, "ROUND", MS_CJC_SQUARE, "SQUARE", MS_CJC_BUTT, "BUTT", MS_CJC_TRIANGLE, "TRIANGLE"); } if (style->linejoin != MS_CJC_DEFAULT_JOINS) { writeKeyword(stream, indent, "LINEJOIN", (int)style->linejoin, 5, MS_CJC_NONE, "NONE", MS_CJC_ROUND, "ROUND", MS_CJC_BEVEL, "BEVEL", MS_CJC_MITER, "MITER"); } writeNumber(stream, indent, "LINEJOINMAXSIZE", MS_CJC_DEFAULT_JOIN_MAXSIZE, style->linejoinmaxsize); writeNumber(stream, indent, "MAXSCALEDENOM", -1, style->maxscaledenom); writeNumber(stream, indent, "MAXSIZE", MS_MAXSYMBOLSIZE, style->maxsize); writeNumber(stream, indent, "MAXWIDTH", MS_MAXSYMBOLWIDTH, style->maxwidth); writeNumber(stream, indent, "MINSCALEDENOM", -1, style->minscaledenom); writeNumber(stream, indent, "MINSIZE", MS_MINSYMBOLSIZE, style->minsize); writeNumber(stream, indent, "MINWIDTH", MS_MINSYMBOLWIDTH, style->minwidth); if ((style->numbindings > 0 && (style->bindings[MS_STYLE_BINDING_OFFSET_X].item || style->bindings[MS_STYLE_BINDING_OFFSET_Y].item)) || style->offsetx != 0 || style->offsety != 0) writeDimension(stream, indent, "OFFSET", style->offsetx, style->offsety, style->bindings[MS_STYLE_BINDING_OFFSET_X].item, style->bindings[MS_STYLE_BINDING_OFFSET_Y].item); if ((style->numbindings > 0 && (style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item || style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item)) || style->polaroffsetangle != 0 || style->polaroffsetpixel != 0) writeDimension(stream, indent, "POLAROFFSET", style->polaroffsetpixel, style->polaroffsetangle, style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item, style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_OPACITY].item) writeAttributeBinding(stream, indent, "OPACITY", &(style->bindings[MS_STYLE_BINDING_OPACITY])); else writeNumber(stream, indent, "OPACITY", 100, style->opacity); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_OUTLINECOLOR].item) writeAttributeBinding(stream, indent, "OUTLINECOLOR", &(style->bindings[MS_STYLE_BINDING_OUTLINECOLOR])); else writeColor(stream, indent, "OUTLINECOLOR", NULL, &(style->outlinecolor)); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].item) writeAttributeBinding(stream, indent, "OUTLINEWIDTH", &(style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH])); else writeNumber(stream, indent, "OUTLINEWIDTH", 0, style->outlinewidth); /* PATTERN */ if (style->patternlength != 0) { int i; indent++; writeBlockBegin(stream, indent, "PATTERN"); writeIndent(stream, indent); for (i = 0; i < style->patternlength; i++) msIO_fprintf(stream, " %.2f", style->pattern[i]); msIO_fprintf(stream, "\n"); writeBlockEnd(stream, indent, "PATTERN"); indent--; } if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_SIZE].item) writeAttributeBinding(stream, indent, "SIZE", &(style->bindings[MS_STYLE_BINDING_SIZE])); else writeNumber(stream, indent, "SIZE", -1, style->size); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_SYMBOL].item) writeAttributeBinding(stream, indent, "SYMBOL", &(style->bindings[MS_STYLE_BINDING_SYMBOL])); else writeNumberOrString(stream, indent, "SYMBOL", 0, style->symbol, style->symbolname); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_WIDTH].item) writeAttributeBinding(stream, indent, "WIDTH", &(style->bindings[MS_STYLE_BINDING_WIDTH])); else writeNumber(stream, indent, "WIDTH", 1, style->width); writeString(stream, indent, "RANGEITEM", NULL, style->rangeitem); /* If COLORRANGE is valid, assume DATARANGE also needs to be written */ if (MS_VALID_COLOR(style->mincolor) && MS_VALID_COLOR(style->maxcolor)) { writeColorRange(stream, indent, "COLORRANGE", &(style->mincolor), &(style->maxcolor)); writeDoubleRange(stream, indent, "DATARANGE", style->minvalue, style->maxvalue); } writeBlockEnd(stream, indent, "STYLE"); } char *msWriteStyleToString(styleObj *style) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeStyle(stdout, -1, style); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize, load and free a single class */ int initClass(classObj *class) { class->status = MS_ON; class->debug = MS_OFF; MS_REFCNT_INIT(class); class->isfallback = FALSE; msInitExpression(&(class->expression)); class->name = NULL; class->title = NULL; msInitExpression(&(class->text)); class->template = NULL; initHashTable(&(class->metadata)); initHashTable(&(class->validation)); class->maxscaledenom = class->minscaledenom = -1.0; class->minfeaturesize = -1; /* no limit */ /* Set maxstyles = 0, styles[] will be allocated as needed on first call * to msGrowClassStyles() */ class->numstyles = class->maxstyles = 0; class->styles = NULL; class->numlabels = class->maxlabels = 0; class->labels = NULL; class->keyimage = NULL; class->group = NULL; class->leader = NULL; class->sizeunits = MS_INHERIT; class->scalefactor = 1.0; return (0); } int freeClass(classObj *class) { int i; if (MS_REFCNT_DECR_IS_NOT_ZERO(class)) { return MS_FAILURE; } msFreeExpression(&(class->expression)); msFreeExpression(&(class->text)); msFree(class->name); msFree(class->title); msFree(class->template); msFree(class->group); msFreeHashItems(&(class->metadata)); msFreeHashItems(&(class->validation)); for (i = 0; i < class->numstyles; i++) { /* each style */ if (class->styles[i] != NULL) { if (freeStyle(class->styles[i]) == MS_SUCCESS) { msFree(class->styles[i]); } } } msFree(class->styles); for (i = 0; i < class->numlabels; i++) { /* each label */ if (class->labels[i] != NULL) { if (freeLabel(class->labels[i]) == MS_SUCCESS) { msFree(class->labels[i]); } } } msFree(class->labels); msFree(class->keyimage); if (class->leader) { freeLabelLeader(class->leader); msFree(class->leader); class->leader = NULL; } return MS_SUCCESS; } /* ** Ensure there is at least one free entry in the sttyles array of this ** classObj. Grow the allocated styles array if necessary and allocate ** a new style for styles[numstyles] if there is not already one, ** setting its contents to all zero bytes (i.e. does not call initStyle() ** on it). ** ** This function is safe to use for the initial allocation of the styles[] ** array as well (i.e. when maxstyles==0 and styles==NULL) ** ** Returns a reference to the new styleObj on success, NULL on error. */ styleObj *msGrowClassStyles(classObj *class) { /* Do we need to increase the size of styles[] by MS_STYLE_ALLOCSIZE? */ if (class->numstyles == class->maxstyles) { styleObj **newStylePtr; int i, newsize; newsize = class->maxstyles + MS_STYLE_ALLOCSIZE; /* Alloc/realloc styles */ newStylePtr = (styleObj **)realloc(class->styles, newsize * sizeof(styleObj *)); MS_CHECK_ALLOC(newStylePtr, newsize * sizeof(styleObj *), NULL); class->styles = newStylePtr; class->maxstyles = newsize; for (i = class->numstyles; i < class->maxstyles; i++) { class->styles[i] = NULL; } } if (class->styles[class->numstyles] == NULL) { class->styles[class->numstyles] = (styleObj *)calloc(1, sizeof(styleObj)); MS_CHECK_ALLOC(class->styles[class->numstyles], sizeof(styleObj), NULL); } return class->styles[class->numstyles]; } /* exactly the same as for a classObj */ styleObj *msGrowLabelStyles(labelObj *label) { /* Do we need to increase the size of styles[] by MS_STYLE_ALLOCSIZE? */ if (label->numstyles == label->maxstyles) { styleObj **newStylePtr; int i, newsize; newsize = label->maxstyles + MS_STYLE_ALLOCSIZE; /* Alloc/realloc styles */ newStylePtr = (styleObj **)realloc(label->styles, newsize * sizeof(styleObj *)); MS_CHECK_ALLOC(newStylePtr, newsize * sizeof(styleObj *), NULL); label->styles = newStylePtr; label->maxstyles = newsize; for (i = label->numstyles; i < label->maxstyles; i++) { label->styles[i] = NULL; } } if (label->styles[label->numstyles] == NULL) { label->styles[label->numstyles] = (styleObj *)calloc(1, sizeof(styleObj)); MS_CHECK_ALLOC(label->styles[label->numstyles], sizeof(styleObj), NULL); } return label->styles[label->numstyles]; } /* exactly the same as for a labelLeaderObj, needs refactoring */ styleObj *msGrowLeaderStyles(labelLeaderObj *leader) { /* Do we need to increase the size of styles[] by MS_STYLE_ALLOCSIZE? */ if (leader->numstyles == leader->maxstyles) { styleObj **newStylePtr; int i, newsize; newsize = leader->maxstyles + MS_STYLE_ALLOCSIZE; /* Alloc/realloc styles */ newStylePtr = (styleObj **)realloc(leader->styles, newsize * sizeof(styleObj *)); MS_CHECK_ALLOC(newStylePtr, newsize * sizeof(styleObj *), NULL); leader->styles = newStylePtr; leader->maxstyles = newsize; for (i = leader->numstyles; i < leader->maxstyles; i++) { leader->styles[i] = NULL; } } if (leader->styles[leader->numstyles] == NULL) { leader->styles[leader->numstyles] = (styleObj *)calloc(1, sizeof(styleObj)); MS_CHECK_ALLOC(leader->styles[leader->numstyles], sizeof(styleObj), NULL); } return leader->styles[leader->numstyles]; } /* msMaybeAllocateClassStyle() ** ** Ensure that requested style index exists and has been initialized. ** ** Returns MS_SUCCESS/MS_FAILURE. */ int msMaybeAllocateClassStyle(classObj *c, int idx) { if (c == NULL) return MS_FAILURE; if (idx < 0) { msSetError(MS_MISCERR, "Invalid style index: %d", "msMaybeAllocateClassStyle()", idx); return MS_FAILURE; } /* Alloc empty styles as needed up to idx. * Nothing to do if requested style already exists */ while (c->numstyles <= idx) { if (msGrowClassStyles(c) == NULL) return MS_FAILURE; if (initStyle(c->styles[c->numstyles]) == MS_FAILURE) { msSetError(MS_MISCERR, "Failed to init new styleObj", "msMaybeAllocateClassStyle()"); freeStyle(c->styles[c->numstyles]); free(c->styles[c->numstyles]); c->styles[c->numstyles] = NULL; return (MS_FAILURE); } c->numstyles++; } return MS_SUCCESS; } /* * Reset style info in the class to defaults * the only members we don't touch are name, expression, and join/query stuff * This is used with STYLEITEM before overwriting the contents of a class. */ void resetClassStyle(classObj *class) { int i; /* reset labels */ for (i = 0; i < class->numlabels; i++) { if (class->labels[i] != NULL) { if (freeLabel(class->labels[i]) == MS_SUCCESS) { msFree(class->labels[i]); } class->labels[i] = NULL; } } class->numlabels = 0; msFreeExpression(&(class->text)); msInitExpression(&(class->text)); /* reset styles */ for (i = 0; i < class->numstyles; i++) { if (class->styles[i] != NULL) { if (freeStyle(class->styles[i]) == MS_SUCCESS) { msFree(class->styles[i]); } class->styles[i] = NULL; } } class->numstyles = 0; class->layer = NULL; } labelObj *msGrowClassLabels(classObj *class) { /* Do we need to increase the size of labels[] by MS_LABEL_ALLOCSIZE? */ if (class->numlabels == class->maxlabels) { labelObj **newLabelPtr; int i, newsize; newsize = class->maxlabels + MS_LABEL_ALLOCSIZE; /* Alloc/realloc labels */ newLabelPtr = (labelObj **)realloc(class->labels, newsize * sizeof(labelObj *)); MS_CHECK_ALLOC(newLabelPtr, newsize * sizeof(labelObj *), NULL); class->labels = newLabelPtr; class->maxlabels = newsize; for (i = class->numlabels; i < class->maxlabels; i++) { class->labels[i] = NULL; } } if (class->labels[class->numlabels] == NULL) { class->labels[class->numlabels] = (labelObj *)calloc(1, sizeof(labelObj)); MS_CHECK_ALLOC(class->labels[class->numlabels], sizeof(labelObj), NULL); } return class->labels[class->numlabels]; } int loadClass(classObj *class, layerObj *layer) { if (!class || !layer) return (-1); class->layer = (layerObj *)layer; for (;;) { switch (msyylex()) { case (CLASS): break; /* for string loads */ case (DEBUG): if ((class->debug = getSymbol(3, MS_ON, MS_OFF, MS_NUMBER)) == -1) return (-1); if (class->debug == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, 0, 5) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid DEBUG level, must be between 0 and 5 (line %d)", "loadClass()", msyylineno); return (-1); } class->debug = (int)msyynumber; } break; case (EOF): msSetError(MS_EOFERR, NULL, "loadClass()"); return (-1); case (END): return (0); break; case (EXPRESSION): if (loadExpression(&(class->expression)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ break; case (GROUP): if (getString(&class->group) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (KEYIMAGE): if (getString(&class->keyimage) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (LABEL): if (msGrowClassLabels(class) == NULL) return (-1); initLabel(class->labels[class->numlabels]); class->labels[class->numlabels]->size = MS_MEDIUM; /* only set a default if the LABEL section is present */ if (loadLabel(class->labels[class->numlabels]) == -1) { freeLabel(class->labels[class->numlabels]); free(class->labels[class->numlabels]); class->labels[class->numlabels] = NULL; return (-1); } class->numlabels++; break; case (LEADER): if (!class->leader) { class->leader = msSmallMalloc(sizeof(labelLeaderObj)); initLeader(class->leader); } if (loadLeader(class->leader) == -1) return (-1); break; case (MAXSCALE): case (MAXSCALEDENOM): if (getDouble(&(class->maxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (METADATA): if (loadHashTable(&(class->metadata)) != MS_SUCCESS) return (-1); break; case (MINSCALE): case (MINSCALEDENOM): if (getDouble(&(class->minscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MINFEATURESIZE): if (getInteger(&(class->minfeaturesize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (NAME): if (getString(&class->name) == MS_FAILURE) return (-1); break; case (STATUS): if ((class->status = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (STYLE): if (msGrowClassStyles(class) == NULL) return (-1); initStyle(class->styles[class->numstyles]); if (loadStyle(class->styles[class->numstyles]) != MS_SUCCESS) { freeStyle(class->styles[class->numstyles]); free(class->styles[class->numstyles]); class->styles[class->numstyles] = NULL; return (-1); } class->numstyles++; break; case (TEMPLATE): if (getString(&class->template) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TEXT): if (loadExpression(&(class->text)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ if ((class->text.type != MS_STRING) && (class->text.type != MS_EXPRESSION)) { msSetError( MS_MISCERR, "Text expressions support constant or tagged replacement strings.", "loadClass()"); return (-1); } break; case (TITLE): if (getString(&class->title) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (VALIDATION): if (loadHashTable(&(class->validation)) != MS_SUCCESS) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadClass()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } } static int classResolveSymbolNames(classObj *class) { int i, j; int try_addimage_if_notfound = MS_TRUE; /* step through styles and labels to resolve symbol names */ /* class styles */ for (i = 0; i < class->numstyles; i++) { if (class->styles[i]->symbolname) { if ((class->styles[i]->symbol = msGetSymbolIndex( &(class->layer->map->symbolset), class->styles[i]->symbolname, try_addimage_if_notfound)) == -1) { msSetError(MS_MISCERR, "Undefined symbol \"%s\" in class, style %d of layer %s.", "classResolveSymbolNames()", class->styles[i]->symbolname, i, class->layer->name); return MS_FAILURE; } } } /* label styles */ for (i = 0; i < class->numlabels; i++) { for (j = 0; j < class->labels[i]->numstyles; j++) { if (class->labels[i]->styles[j]->symbolname) { if ((class->labels[i]->styles[j]->symbol = msGetSymbolIndex(&(class->layer->map->symbolset), class->labels[i]->styles[j]->symbolname, try_addimage_if_notfound)) == -1) { msSetError( MS_MISCERR, "Undefined symbol \"%s\" in class, label style %d of layer %s.", "classResolveSymbolNames()", class->labels[i]->styles[j]->symbolname, j, class->layer->name); return MS_FAILURE; } } } } return MS_SUCCESS; } int msUpdateClassFromString(classObj *class, char *string) { if (!class || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadClass(class, class->layer) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); if (classResolveSymbolNames(class) != MS_SUCCESS) return MS_FAILURE; return MS_SUCCESS; } static void writeClass(FILE *stream, int indent, classObj *class) { int i; if (class->status == MS_DELETE) return; indent++; writeBlockBegin(stream, indent, "CLASS"); writeString(stream, indent, "NAME", NULL, class->name); writeString(stream, indent, "GROUP", NULL, class->group); writeNumber(stream, indent, "DEBUG", 0, class->debug); writeExpression(stream, indent, "EXPRESSION", &(class->expression)); writeString(stream, indent, "KEYIMAGE", NULL, class->keyimage); for (i = 0; i < class->numlabels; i++) writeLabel(stream, indent, class->labels[i]); if (class->leader) writeLeader(stream, indent, class->leader); writeNumber(stream, indent, "MAXSCALEDENOM", -1, class->maxscaledenom); writeHashTable(stream, indent, "METADATA", &(class->metadata)); writeNumber(stream, indent, "MINSCALEDENOM", -1, class->minscaledenom); writeNumber(stream, indent, "MINFEATURESIZE", -1, class->minfeaturesize); writeKeyword(stream, indent, "STATUS", class->status, 1, MS_OFF, "OFF"); for (i = 0; i < class->numstyles; i++) writeStyle(stream, indent, class->styles[i]); writeString(stream, indent, "TEMPLATE", NULL, class->template); writeExpression(stream, indent, "TEXT", &(class->text)); writeString(stream, indent, "TITLE", NULL, class->title); writeHashTable(stream, indent, "VALIDATION", &(class->validation)); writeBlockEnd(stream, indent, "CLASS"); } char *msWriteClassToString(classObj *class) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeClass(stdout, -1, class); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } int initCompositingFilter(CompositingFilter *filter) { filter->filter = NULL; filter->next = NULL; return MS_SUCCESS; } void freeCompositingFilter(CompositingFilter *filter) { if (!filter) return; if (filter->next) freeCompositingFilter(filter->next); free(filter->filter); free(filter); } int initLayerCompositer(LayerCompositer *compositer) { compositer->comp_op = MS_COMPOP_SRC_OVER; compositer->opacity = 100; compositer->next = NULL; compositer->filter = NULL; return MS_SUCCESS; } void freeLayerCompositer(LayerCompositer *compositer) { if (!compositer) return; if (compositer->next) freeLayerCompositer(compositer->next); freeCompositingFilter(compositer->filter); free(compositer); } /* ** Initialize, load and free a single layer structure */ int initLayer(layerObj *layer, mapObj *map) { if (layer == NULL) { msSetError(MS_MEMERR, "Layer is null", "initLayer()"); return (-1); } layer->debug = (int)msGetGlobalDebugLevel(); MS_REFCNT_INIT(layer); /* Set maxclasses = 0, class[] will be allocated as needed on first call * to msGrowLayerClasses() */ layer->numclasses = 0; layer->maxclasses = 0; layer->class = NULL; layer->name = NULL; layer->group = NULL; layer->status = MS_OFF; layer->data = NULL; layer->rendermode = MS_FIRST_MATCHING_CLASS; layer->map = map; /* point back to the encompassing structure */ layer->type = -1; layer->toleranceunits = MS_PIXELS; layer->tolerance = -1; /* perhaps this should have a different value based on type */ layer->symbolscaledenom = -1.0; /* -1 means nothing is set */ layer->scalefactor = 1.0; layer->maxscaledenom = -1.0; layer->minscaledenom = -1.0; layer->minfeaturesize = -1; /* no limit */ layer->maxgeowidth = -1.0; layer->mingeowidth = -1.0; layer->sizeunits = MS_PIXELS; layer->maxfeatures = -1; /* no quota */ layer->startindex = -1; /*used for pagination*/ layer->scaletokens = NULL; layer->numscaletokens = 0; layer->template = layer->header = layer->footer = NULL; layer->transform = MS_TRUE; layer->classitem = NULL; layer->classitemindex = -1; layer->units = MS_METERS; if (msInitProjection(&(layer->projection)) == -1) return (-1); if (map) { msProjectionInheritContextFrom(&(layer->projection), &(map->projection)); } layer->project = MS_TRUE; layer->reprojectorLayerToMap = NULL; layer->reprojectorMapToLayer = NULL; initCluster(&layer->cluster); MS_INIT_COLOR(layer->offsite, -1, -1, -1, 255); layer->labelcache = MS_ON; layer->postlabelcache = MS_FALSE; layer->labelitem = NULL; layer->labelitemindex = -1; layer->labelmaxscaledenom = -1; layer->labelminscaledenom = -1; layer->tileitem = msStrdup("location"); layer->tileitemindex = -1; layer->tileindex = NULL; layer->tilesrs = NULL; layer->bandsitem = NULL; layer->bandsitemindex = -1; layer->currentfeature = layer->features = NULL; layer->connection = NULL; layer->plugin_library = NULL; layer->plugin_library_original = NULL; layer->connectiontype = MS_SHAPEFILE; layer->vtable = NULL; layer->classgroup = NULL; layer->layerinfo = NULL; layer->wfslayerinfo = NULL; layer->items = NULL; layer->iteminfo = NULL; layer->numitems = 0; layer->resultcache = NULL; msInitExpression(&(layer->filter)); layer->filteritem = NULL; layer->filteritemindex = -1; layer-> requires = layer->labelrequires = NULL; initHashTable(&(layer->metadata)); initHashTable(&(layer->bindvals)); initHashTable(&(layer->validation)); layer->styleitem = NULL; layer->styleitemindex = -1; layer->processing = NULL; layer->numjoins = 0; layer->joins = (joinObj *)malloc(MS_MAXJOINS * sizeof(joinObj)); MS_CHECK_ALLOC(layer->joins, MS_MAXJOINS * sizeof(joinObj), -1); layer->extent.minx = -1.0; layer->extent.miny = -1.0; layer->extent.maxx = -1.0; layer->extent.maxy = -1.0; layer->mask = NULL; layer->maskimage = NULL; layer->grid = NULL; msInitExpression(&(layer->_geomtransform)); layer->_geomtransform.type = MS_GEOMTRANSFORM_NONE; msInitExpression(&(layer->utfdata)); layer->utfitem = NULL; layer->utfitemindex = -1; layer->encoding = NULL; layer->sortBy.nProperties = 0; layer->sortBy.properties = NULL; layer->orig_st = NULL; layer->compositer = NULL; initHashTable(&(layer->connectionoptions)); return (0); } int initScaleToken(scaleTokenObj *token) { token->n_entries = 0; token->name = NULL; token->tokens = NULL; return MS_SUCCESS; } int freeScaleTokenEntry(scaleTokenEntryObj *token) { msFree(token->value); return MS_SUCCESS; } int freeScaleToken(scaleTokenObj *scaletoken) { int i; msFree(scaletoken->name); for (i = 0; i < scaletoken->n_entries; i++) { freeScaleTokenEntry(&scaletoken->tokens[i]); } msFree(scaletoken->tokens); return MS_SUCCESS; } int freeLayer(layerObj *layer) { int i; if (!layer) return MS_FAILURE; if (MS_REFCNT_DECR_IS_NOT_ZERO(layer)) { return MS_FAILURE; } if (layer->debug >= MS_DEBUGLEVEL_VVV) msDebug("freeLayer(): freeing layer at %p.\n", layer); if (msLayerIsOpen(layer)) msLayerClose(layer); msFree(layer->name); msFree(layer->encoding); msFree(layer->group); msFree(layer->data); msFree(layer->classitem); msFree(layer->labelitem); msFree(layer->header); msFree(layer->footer); msFree(layer->template); msFree(layer->tileindex); msFree(layer->tileitem); msFree(layer->tilesrs); msFree(layer->bandsitem); msFree(layer->plugin_library); msFree(layer->plugin_library_original); msFree(layer->connection); msFree(layer->vtable); msFree(layer->classgroup); msProjectDestroyReprojector(layer->reprojectorLayerToMap); msProjectDestroyReprojector(layer->reprojectorMapToLayer); msFreeProjection(&(layer->projection)); msFreeExpression(&layer->_geomtransform); freeCluster(&layer->cluster); for (i = 0; i < layer->maxclasses; i++) { if (layer->class[i] != NULL) { layer->class[i]->layer = NULL; if (freeClass(layer->class[i]) == MS_SUCCESS) { msFree(layer->class[i]); } } } msFree(layer->class); if (layer->numscaletokens > 0) { for (i = 0; i < layer->numscaletokens; i++) { freeScaleToken(&layer->scaletokens[i]); } msFree(layer->scaletokens); } if (layer->features) freeFeatureList(layer->features); if (layer->resultcache) { cleanupResultCache(layer->resultcache); msFree(layer->resultcache); } msFree(layer->styleitem); msFree(layer->filteritem); msFreeExpression(&(layer->filter)); msFree(layer->requires); msFree(layer->labelrequires); msFreeHashItems(&(layer->metadata)); msFreeHashItems(&(layer->validation)); msFreeHashItems(&layer->bindvals); CSLDestroy(layer->processing); for (i = 0; i < layer->numjoins; i++) /* each join */ freeJoin(&(layer->joins[i])); msFree(layer->joins); layer->numjoins = 0; layer->classgroup = NULL; msFree(layer->mask); if (layer->maskimage) { msFreeImage(layer->maskimage); } if (layer->compositer) { freeLayerCompositer(layer->compositer); } if (layer->grid) { freeGrid(layer->grid); msFree(layer->grid); } msFreeExpression(&(layer->utfdata)); msFree(layer->utfitem); for (i = 0; i < layer->sortBy.nProperties; i++) msFree(layer->sortBy.properties[i].item); msFree(layer->sortBy.properties); msFreeHashItems(&layer->connectionoptions); return MS_SUCCESS; } /* ** Ensure there is at least one free entry in the class array of this ** layerObj. Grow the allocated class array if necessary and allocate ** a new class for class[numclasses] if there is not already one, ** setting its contents to all zero bytes (i.e. does not call initClass() ** on it). ** ** This function is safe to use for the initial allocation of the class[] ** array as well (i.e. when maxclasses==0 and class==NULL) ** ** Returns a reference to the new classObj on success, NULL on error. */ classObj *msGrowLayerClasses(layerObj *layer) { /* Do we need to increase the size of class[] by MS_CLASS_ALLOCSIZE? */ if (layer->numclasses == layer->maxclasses) { classObj **newClassPtr; int i, newsize; newsize = layer->maxclasses + MS_CLASS_ALLOCSIZE; /* Alloc/realloc classes */ newClassPtr = (classObj **)realloc(layer->class, newsize * sizeof(classObj *)); MS_CHECK_ALLOC(newClassPtr, newsize * sizeof(classObj *), NULL); layer->class = newClassPtr; layer->maxclasses = newsize; for (i = layer->numclasses; i < layer->maxclasses; i++) { layer->class[i] = NULL; } } if (layer->class[layer->numclasses] == NULL) { layer->class[layer->numclasses] = (classObj *)calloc(1, sizeof(classObj)); MS_CHECK_ALLOC(layer->class[layer->numclasses], sizeof(classObj), NULL); } return layer->class[layer->numclasses]; } scaleTokenObj *msGrowLayerScaletokens(layerObj *layer) { layer->scaletokens = msSmallRealloc( layer->scaletokens, (layer->numscaletokens + 1) * sizeof(scaleTokenObj)); memset(&layer->scaletokens[layer->numscaletokens], 0, sizeof(scaleTokenObj)); return &layer->scaletokens[layer->numscaletokens]; } int loadScaletoken(scaleTokenObj *token, layerObj *layer) { (void)layer; for (;;) { int stop = 0; switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadScaletoken()"); return (MS_FAILURE); case (NAME): if (getString(&token->name) == MS_FAILURE) return (MS_FAILURE); break; case (VALUES): for (;;) { if (stop) break; switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadScaletoken()"); return (MS_FAILURE); case (END): stop = 1; if (token->n_entries == 0) { msSetError(MS_PARSEERR, "Scaletoken (line:%d) has no VALUES defined", "loadScaleToken()", msyylineno); return (MS_FAILURE); } token->tokens[token->n_entries - 1].maxscale = DBL_MAX; break; case (MS_STRING): /* we have a key */ token->tokens = msSmallRealloc(token->tokens, (token->n_entries + 1) * sizeof(scaleTokenEntryObj)); if (1 != sscanf(msyystring_buffer, "%lf", &token->tokens[token->n_entries].minscale)) { msSetError(MS_PARSEERR, "failed to parse SCALETOKEN VALUE (%s):(line %d), " "expecting \"minscale\"", "loadScaletoken()", msyystring_buffer, msyylineno); return (MS_FAILURE); } if (token->n_entries == 0) { /* check supplied value was 0*/ if (token->tokens[0].minscale != 0) { msSetError(MS_PARSEERR, "First SCALETOKEN VALUE (%s):(line %d) must be zero, " "expecting \"0\"", "loadScaletoken()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } else { /* set max scale of previous token */ token->tokens[token->n_entries - 1].maxscale = token->tokens[token->n_entries].minscale; } token->tokens[token->n_entries].value = NULL; if (getString(&(token->tokens[token->n_entries].value)) == MS_FAILURE) return (MS_FAILURE); token->n_entries++; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadScaletoken()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } break; case (END): if (!token->name || !*(token->name)) { msSetError(MS_PARSEERR, "ScaleToken missing mandatory NAME entry (line %d)", "loadScaleToken()", msyylineno); return MS_FAILURE; } if (token->n_entries == 0) { msSetError(MS_PARSEERR, "ScaleToken missing at least one VALUES entry (line %d)", "loadScaleToken()", msyylineno); return MS_FAILURE; } return MS_SUCCESS; default: msSetError(MS_IDENTERR, "Parsing error 2 near (%s):(line %d)", "loadScaletoken()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } /* next token*/ } static const struct { CompositingOperation eOp; const char *pszName; } CompOps[] = { {MS_COMPOP_CLEAR, "clear"}, {MS_COMPOP_COLOR_BURN, "color-burn"}, {MS_COMPOP_COLOR_DODGE, "color-dodge"}, {MS_COMPOP_CONTRAST, "contrast"}, {MS_COMPOP_DARKEN, "darken"}, {MS_COMPOP_DIFFERENCE, "difference"}, {MS_COMPOP_DST, "dst"}, {MS_COMPOP_DST_ATOP, "dst-atop"}, {MS_COMPOP_DST_IN, "dst-in"}, {MS_COMPOP_DST_OUT, "dst-out"}, {MS_COMPOP_DST_OVER, "dst-over"}, {MS_COMPOP_EXCLUSION, "exclusion"}, {MS_COMPOP_HARD_LIGHT, "hard-light"}, {MS_COMPOP_HSL_COLOR, "hsl-color"}, {MS_COMPOP_HSL_HUE, "hsl-hue"}, {MS_COMPOP_HSL_LUMINOSITY, "hsl-luminosity"}, {MS_COMPOP_HSL_SATURATION, "hsl-saturation"}, {MS_COMPOP_INVERT, "invert"}, {MS_COMPOP_INVERT_RGB, "invert-rgb"}, {MS_COMPOP_LIGHTEN, "lighten"}, {MS_COMPOP_MINUS, "minus"}, {MS_COMPOP_MULTIPLY, "multiply"}, {MS_COMPOP_OVERLAY, "overlay"}, {MS_COMPOP_PLUS, "plus"}, {MS_COMPOP_SCREEN, "screen"}, {MS_COMPOP_SOFT_LIGHT, "soft-light"}, {MS_COMPOP_SRC, "src"}, {MS_COMPOP_SRC_ATOP, "src-atop"}, {MS_COMPOP_SRC_IN, "src-in"}, {MS_COMPOP_SRC_OUT, "src-out"}, {MS_COMPOP_SRC_OVER, "src-over"}, {MS_COMPOP_XOR, "xor"}, }; #define SIZEOF_COMP_OPS ((int)(sizeof(CompOps) / sizeof(CompOps[0]))) int loadLayerCompositer(LayerCompositer *compositer) { for (;;) { switch (msyylex()) { case COMPFILTER: { CompositingFilter **filter = &compositer->filter; while (*filter) { filter = &((*filter)->next); } *filter = msSmallMalloc(sizeof(CompositingFilter)); initCompositingFilter(*filter); if (getString(&((*filter)->filter)) == MS_FAILURE) return (MS_FAILURE); } break; case COMPOP: { char *compop = NULL; if (getString(&compop) == MS_FAILURE) return (MS_FAILURE); bool bFound = false; for (int i = 0; i < SIZEOF_COMP_OPS; ++i) { if (strcmp(compop, CompOps[i].pszName) == 0) { bFound = true; compositer->comp_op = CompOps[i].eOp; break; } } if (!bFound) { msSetError(MS_PARSEERR, "Unknown COMPOP \"%s\"", "loadLayerCompositer()", compop); free(compop); return MS_FAILURE; } free(compop); } break; case END: return MS_SUCCESS; case OPACITY: if (getInteger(&(compositer->opacity), MS_NUM_CHECK_RANGE, 0, 100) == -1) { msSetError(MS_PARSEERR, "OPACITY must be between 0 and 100 (line %d)", "loadLayerCompositer()", msyylineno); return MS_FAILURE; } break; default: msSetError(MS_IDENTERR, "Parsing error 2 near (%s):(line %d)", "loadLayerCompositer()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } } int loadLayer(layerObj *layer, mapObj *map) { int type; layer->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (BINDVALS): if (loadHashTable(&(layer->bindvals)) != MS_SUCCESS) return (-1); break; case (CLASS): if (msGrowLayerClasses(layer) == NULL) return (-1); initClass(layer->class[layer->numclasses]); if (loadClass(layer->class[layer->numclasses], layer) == -1) { freeClass(layer->class[layer->numclasses]); free(layer->class[layer->numclasses]); layer->class[layer->numclasses] = NULL; return (-1); } layer->numclasses++; break; case (CLUSTER): if (loadCluster(&layer->cluster) == -1) return (-1); break; case (CLASSGROUP): if (getString(&layer->classgroup) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (CLASSITEM): if (getString(&layer->classitem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (COMPOSITE): { LayerCompositer *compositer = msSmallMalloc(sizeof(LayerCompositer)); initLayerCompositer(compositer); if (MS_FAILURE == loadLayerCompositer(compositer)) { freeLayerCompositer(compositer); return -1; } if (!layer->compositer) { layer->compositer = compositer; } else { LayerCompositer *lctmp = layer->compositer; while (lctmp->next) lctmp = lctmp->next; lctmp->next = compositer; } break; } case (CONNECTION): if (getString(&layer->connection) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (CONNECTIONTYPE): if ((type = getSymbol(14, MS_OGR, MS_POSTGIS, MS_WMS, MS_ORACLESPATIAL, MS_WFS, MS_GRATICULE, MS_PLUGIN, MS_UNION, MS_UVRASTER, MS_CONTOUR, MS_KERNELDENSITY, MS_IDW, MS_FLATGEOBUF, MS_RASTER_LABEL)) == -1) return (-1); layer->connectiontype = type; break; case (DATA): if (getString(&layer->data) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (DEBUG): if ((layer->debug = getSymbol(3, MS_ON, MS_OFF, MS_NUMBER)) == -1) return (-1); if (layer->debug == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, 0, 5) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid DEBUG level, must be between 0 and 5 (line %d)", "loadLayer()", msyylineno); return (-1); } layer->debug = (int)msyynumber; } break; case (EOF): msSetError(MS_EOFERR, NULL, "loadLayer()"); return (-1); break; case (ENCODING): if (getString(&layer->encoding) == MS_FAILURE) return (-1); break; case (END): if ((int)layer->type == -1) { msSetError(MS_MISCERR, "Layer type not set.", "loadLayer()"); return (-1); } return (0); break; case (EXTENT): { if (getDouble(&(layer->extent.minx), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(layer->extent.miny), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(layer->extent.maxx), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(layer->extent.maxy), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (!MS_VALID_EXTENT(layer->extent)) { msSetError(MS_MISCERR, "Given layer extent is invalid. Check that it is in the " "form: minx, miny, maxx, maxy", "loadLayer()"); return (-1); } break; } case (FEATURE): if ((int)layer->type == -1) { msSetError(MS_MISCERR, "Layer type must be set before defining inline features.", "loadLayer()"); return (-1); } if (layer->type == MS_LAYER_POLYGON) type = MS_SHAPE_POLYGON; else if (layer->type == MS_LAYER_LINE) type = MS_SHAPE_LINE; else type = MS_SHAPE_POINT; layer->connectiontype = MS_INLINE; if (loadFeature(layer, type) == MS_FAILURE) return (-1); break; case (FILTER): if (loadExpression(&(layer->filter)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ break; case (FILTERITEM): if (getString(&layer->filteritem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (FOOTER): if (getString(&layer->footer) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (GRID): layer->connectiontype = MS_GRATICULE; if (layer->grid) { freeGrid(layer->grid); msFree(layer->grid); } layer->grid = (void *)malloc(sizeof(graticuleObj)); MS_CHECK_ALLOC(layer->grid, sizeof(graticuleObj), -1); initGrid(layer->grid); loadGrid(layer); break; case (GROUP): if (getString(&layer->group) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (GEOMTRANSFORM): { if (getSymbol(1, MS_EXPRESSION) == -1) return (MS_FAILURE); /* handle expression case here for the moment */ msFree(layer->_geomtransform.string); layer->_geomtransform.string = msStrdup(msyystring_buffer); layer->_geomtransform.type = MS_GEOMTRANSFORM_EXPRESSION; } break; case (HEADER): if (getString(&layer->header) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (JOIN): if (layer->numjoins == MS_MAXJOINS) { /* no room */ msSetError(MS_IDENTERR, "Maximum number of joins reached.", "loadLayer()"); return (-1); } if (loadJoin(&(layer->joins[layer->numjoins])) == -1) { freeJoin(&(layer->joins[layer->numjoins])); return (-1); } layer->numjoins++; break; case (LABELCACHE): if ((layer->labelcache = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (LABELITEM): if (getString(&layer->labelitem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (LABELMAXSCALE): case (LABELMAXSCALEDENOM): if (getDouble(&(layer->labelmaxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (LABELMINSCALE): case (LABELMINSCALEDENOM): if (getDouble(&(layer->labelminscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (LABELREQUIRES): if (getString(&layer->labelrequires) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (LAYER): break; /* for string loads */ case (MASK): if (getString(&layer->mask) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (MAXFEATURES): if (getInteger(&(layer->maxfeatures), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXSCALE): case (MAXSCALEDENOM): if (getDouble(&(layer->maxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MAXGEOWIDTH): if (getDouble(&(layer->maxgeowidth), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (METADATA): if (loadHashTable(&(layer->metadata)) != MS_SUCCESS) return (-1); break; case (MINSCALE): case (MINSCALEDENOM): if (getDouble(&(layer->minscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MINGEOWIDTH): if (getDouble(&(layer->mingeowidth), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MINFEATURESIZE): if (getInteger(&(layer->minfeaturesize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (NAME): if (getString(&layer->name) == MS_FAILURE) return (-1); break; case (OFFSITE): if (loadColor(&(layer->offsite), NULL) != MS_SUCCESS) return (-1); break; case (CONNECTIONOPTIONS): if (loadHashTable(&(layer->connectionoptions)) != MS_SUCCESS) return (-1); break; case (MS_PLUGIN): { int rv; if (map->config) { // value *must* represent a config key char *value = NULL; const char *plugin_library = NULL; if (getString(&value) == MS_FAILURE) return (-1); plugin_library = msConfigGetPlugin(map->config, value); msFree(value); if (!plugin_library) { msSetError(MS_MISCERR, "Plugin value not found in config file. See " "mapserver.org/mapfile/config.html for more information.", "loadLayer()"); return (-1); } msFree(layer->plugin_library_original); layer->plugin_library_original = strdup(plugin_library); } else { if (getString(&layer->plugin_library_original) == MS_FAILURE) return (-1); } rv = msBuildPluginLibraryPath(&layer->plugin_library, layer->plugin_library_original, map); if (rv == MS_FAILURE) return (-1); } break; case (PROCESSING): { /* NOTE: processing array maintained as size+1 with NULL terminator. This ensure that CSL (GDAL string list) functions can be used on the list for easy processing. */ char *value = NULL; if (getString(&value) == MS_FAILURE) return (-1); msLayerAddProcessing(layer, value); free(value); value = NULL; } break; case (POSTLABELCACHE): if ((layer->postlabelcache = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); if (layer->postlabelcache) layer->labelcache = MS_OFF; break; case (PROJECTION): if (loadProjection(&(layer->projection)) == -1) return (-1); layer->project = MS_TRUE; break; case (REQUIRES): if (getString(&layer->requires) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (SCALETOKEN): if (msGrowLayerScaletokens(layer) == NULL) return (-1); initScaleToken(&layer->scaletokens[layer->numscaletokens]); if (loadScaletoken(&layer->scaletokens[layer->numscaletokens], layer) == -1) { freeScaleToken(&layer->scaletokens[layer->numscaletokens]); return (-1); } layer->numscaletokens++; break; case (SIZEUNITS): if ((layer->sizeunits = getSymbol( 8, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD, MS_PIXELS)) == -1) return (-1); break; case (STATUS): if ((layer->status = getSymbol(3, MS_ON, MS_OFF, MS_DEFAULT)) == -1) return (-1); break; case (STYLEITEM): if (getString(&layer->styleitem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (SYMBOLSCALE): case (SYMBOLSCALEDENOM): if (getDouble(&(layer->symbolscaledenom), MS_NUM_CHECK_GTE, 1, -1) == -1) return (-1); break; case (TEMPLATE): if (getString(&layer->template) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TILEINDEX): if (getString(&layer->tileindex) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TILEITEM): if (getString(&layer->tileitem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TILESRS): if (getString(&layer->tilesrs) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TOLERANCE): if (getDouble(&(layer->tolerance), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (TOLERANCEUNITS): if ((layer->toleranceunits = getSymbol( 8, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD, MS_PIXELS)) == -1) return (-1); break; case (TRANSFORM): if ((layer->transform = getSymbol(11, MS_TRUE, MS_FALSE, MS_UL, MS_UC, MS_UR, MS_CL, MS_CC, MS_CR, MS_LL, MS_LC, MS_LR)) == -1) return (-1); break; case (TYPE): if ((type = getSymbol(9, MS_LAYER_POINT, MS_LAYER_LINE, MS_LAYER_RASTER, MS_LAYER_POLYGON, MS_LAYER_ANNOTATION, MS_LAYER_QUERY, MS_LAYER_CIRCLE, MS_LAYER_CHART, TILEINDEX)) == -1) return (-1); if (type == TILEINDEX) type = MS_LAYER_TILEINDEX; /* TILEINDEX is also a parameter */ if (type == MS_LAYER_ANNOTATION) { msSetError(MS_IDENTERR, "Annotation Layers have been removed. To obtain same " "functionality, use a layer with label->styles and no " "class->styles", "loadLayer()"); return -1; } layer->type = type; break; case (UNITS): if ((layer->units = getSymbol(9, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD, MS_PIXELS, MS_PERCENTAGES)) == -1) return (-1); break; case (UTFDATA): if (loadExpression(&(layer->utfdata)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ break; case (UTFITEM): if (getString(&layer->utfitem) == MS_FAILURE) return (-1); break; case (VALIDATION): if (loadHashTable(&(layer->validation)) != MS_SUCCESS) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLayer()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateLayerFromString(layerObj *layer, char *string) { int i; if (!layer || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadLayer(layer, layer->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); /* step through classes to resolve symbol names */ for (i = 0; i < layer->numclasses; i++) { if (classResolveSymbolNames(layer->class[i]) != MS_SUCCESS) return MS_FAILURE; } return MS_SUCCESS; } static void writeCompositingFilter(FILE *stream, int indent, CompositingFilter *filter) { while (filter) { writeString(stream, indent, "COMPFILTER", "", filter->filter); filter = filter->next; } } static void writeLayerCompositer(FILE *stream, int indent, LayerCompositer *compositor) { indent++; while (compositor) { writeBlockBegin(stream, indent, "COMPOSITE"); writeCompositingFilter(stream, indent, compositor->filter); if (compositor->comp_op != MS_COMPOP_SRC_OVER) { bool bFound = false; for (int i = 0; i < SIZEOF_COMP_OPS; ++i) { if (compositor->comp_op == CompOps[i].eOp) { bFound = true; writeString(stream, indent, "COMPOP", NULL, CompOps[i].pszName); break; } } if (!bFound) { assert(0); } } writeNumber(stream, indent, "OPACITY", 100, compositor->opacity); writeBlockEnd(stream, indent, "COMPOSITE"); compositor = compositor->next; } } static void writeLayer(FILE *stream, int indent, layerObj *layer) { int i; featureListNodeObjPtr current = NULL; if (layer->status == MS_DELETE) return; indent++; writeBlockBegin(stream, indent, "LAYER"); writeHashTable(stream, indent, "BINDVALS", &(layer->bindvals)); /* class - see below */ writeString(stream, indent, "CLASSGROUP", NULL, layer->classgroup); writeString(stream, indent, "CLASSITEM", NULL, layer->classitem); writeCluster(stream, indent, &(layer->cluster)); writeLayerCompositer(stream, indent, layer->compositer); writeString(stream, indent, "CONNECTION", NULL, layer->connection); writeKeyword(stream, indent, "CONNECTIONTYPE", layer->connectiontype, 12, MS_OGR, "OGR", MS_POSTGIS, "POSTGIS", MS_WMS, "WMS", MS_ORACLESPATIAL, "ORACLESPATIAL", MS_WFS, "WFS", MS_PLUGIN, "PLUGIN", MS_UNION, "UNION", MS_UVRASTER, "UVRASTER", MS_CONTOUR, "CONTOUR", MS_KERNELDENSITY, "KERNELDENSITY", MS_IDW, "IDW", MS_FLATGEOBUF, "FLATGEOBUF"); writeHashTable(stream, indent, "CONNECTIONOPTIONS", &(layer->connectionoptions)); writeString(stream, indent, "DATA", NULL, layer->data); writeNumber(stream, indent, "DEBUG", 0, layer->debug); /* is this right? see loadLayer() */ writeString(stream, indent, "ENCODING", NULL, layer->encoding); writeExtent(stream, indent, "EXTENT", layer->extent); writeExpression(stream, indent, "FILTER", &(layer->filter)); writeString(stream, indent, "FILTERITEM", NULL, layer->filteritem); writeString(stream, indent, "FOOTER", NULL, layer->footer); writeString(stream, indent, "GROUP", NULL, layer->group); if (layer->_geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) { writeIndent(stream, indent + 1); fprintf(stream, "GEOMTRANSFORM (%s)\n", layer->_geomtransform.string); } writeString(stream, indent, "HEADER", NULL, layer->header); /* join - see below */ writeKeyword(stream, indent, "LABELCACHE", layer->labelcache, 1, MS_OFF, "OFF"); writeString(stream, indent, "LABELITEM", NULL, layer->labelitem); writeNumber(stream, indent, "LABELMAXSCALEDENOM", -1, layer->labelmaxscaledenom); writeNumber(stream, indent, "LABELMINSCALEDENOM", -1, layer->labelminscaledenom); writeString(stream, indent, "LABELREQUIRES", NULL, layer->labelrequires); writeNumber(stream, indent, "MAXFEATURES", -1, layer->maxfeatures); writeNumber(stream, indent, "MAXGEOWIDTH", -1, layer->maxgeowidth); writeNumber(stream, indent, "MAXSCALEDENOM", -1, layer->maxscaledenom); writeString(stream, indent, "MASK", NULL, layer->mask); writeHashTable(stream, indent, "METADATA", &(layer->metadata)); writeNumber(stream, indent, "MINGEOWIDTH", -1, layer->mingeowidth); writeNumber(stream, indent, "MINSCALEDENOM", -1, layer->minscaledenom); writeNumber(stream, indent, "MINFEATURESIZE", -1, layer->minfeaturesize); writeString(stream, indent, "NAME", NULL, layer->name); writeColor(stream, indent, "OFFSITE", NULL, &(layer->offsite)); writeString(stream, indent, "PLUGIN", NULL, layer->plugin_library_original); writeKeyword(stream, indent, "POSTLABELCACHE", layer->postlabelcache, 1, MS_TRUE, "TRUE"); for (i = 0; layer->processing && layer->processing[i]; i++) writeString(stream, indent, "PROCESSING", NULL, layer->processing[i]); writeProjection(stream, indent, &(layer->projection)); writeString(stream, indent, "REQUIRES", NULL, layer->requires); writeKeyword(stream, indent, "SIZEUNITS", layer->sizeunits, 7, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES", MS_DD, "DD"); writeKeyword(stream, indent, "STATUS", layer->status, 3, MS_ON, "ON", MS_OFF, "OFF", MS_DEFAULT, "DEFAULT"); writeString(stream, indent, "STYLEITEM", NULL, layer->styleitem); writeNumber(stream, indent, "SYMBOLSCALEDENOM", -1, layer->symbolscaledenom); writeString(stream, indent, "TEMPLATE", NULL, layer->template); writeString(stream, indent, "TILEINDEX", NULL, layer->tileindex); writeString(stream, indent, "TILEITEM", NULL, layer->tileitem); writeString(stream, indent, "TILESRS", NULL, layer->tilesrs); writeNumber(stream, indent, "TOLERANCE", -1, layer->tolerance); writeKeyword(stream, indent, "TOLERANCEUNITS", layer->toleranceunits, 7, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES", MS_DD, "DD"); writeKeyword(stream, indent, "TRANSFORM", layer->transform, 10, MS_FALSE, "FALSE", MS_UL, "UL", MS_UC, "UC", MS_UR, "UR", MS_CL, "CL", MS_CC, "CC", MS_CR, "CR", MS_LL, "LL", MS_LC, "LC", MS_LR, "LR"); writeKeyword(stream, indent, "TYPE", layer->type, 9, MS_LAYER_POINT, "POINT", MS_LAYER_LINE, "LINE", MS_LAYER_POLYGON, "POLYGON", MS_LAYER_RASTER, "RASTER", MS_LAYER_ANNOTATION, "ANNOTATION", MS_LAYER_QUERY, "QUERY", MS_LAYER_CIRCLE, "CIRCLE", MS_LAYER_TILEINDEX, "TILEINDEX", MS_LAYER_CHART, "CHART"); writeKeyword(stream, indent, "UNITS", layer->units, 9, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES", MS_DD, "DD", MS_PIXELS, "PIXELS", MS_PERCENTAGES, "PERCENTATGES"); writeExpression(stream, indent, "UTFDATA", &(layer->utfdata)); writeString(stream, indent, "UTFITEM", NULL, layer->utfitem); writeHashTable(stream, indent, "VALIDATION", &(layer->validation)); /* write potentially multiply occurring objects last */ for (i = 0; i < layer->numscaletokens; i++) writeScaleToken(stream, indent, &(layer->scaletokens[i])); for (i = 0; i < layer->numjoins; i++) writeJoin(stream, indent, &(layer->joins[i])); for (i = 0; i < layer->numclasses; i++) writeClass(stream, indent, layer->class[i]); if (layer->grid && layer->connectiontype == MS_GRATICULE) writeGrid(stream, indent, layer->grid); else { current = layer->features; while (current != NULL) { writeFeature(stream, indent, &(current->shape)); current = current->next; } } writeBlockEnd(stream, indent, "LAYER"); writeLineFeed(stream); } char *msWriteLayerToString(layerObj *layer) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeLayer(stdout, -1, layer); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize, load and free a referenceMapObj structure */ void initReferenceMap(referenceMapObj *ref) { ref->height = ref->width = 0; ref->extent.minx = ref->extent.miny = ref->extent.maxx = ref->extent.maxy = -1.0; ref->image = NULL; MS_INIT_COLOR(ref->color, 255, 0, 0, 255); MS_INIT_COLOR(ref->outlinecolor, 0, 0, 0, 255); ref->status = MS_OFF; ref->marker = 0; ref->markername = NULL; ref->markersize = 0; ref->minboxsize = 3; ref->maxboxsize = 0; ref->map = NULL; } void freeReferenceMap(referenceMapObj *ref) { msFree(ref->image); msFree(ref->markername); } int loadReferenceMap(referenceMapObj *ref, mapObj *map) { int state; ref->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadReferenceMap()"); return (-1); case (END): if (!ref->image) { msSetError(MS_MISCERR, "No image defined for the reference map.", "loadReferenceMap()"); return (-1); } if (ref->width == 0 || ref->height == 0) { msSetError(MS_MISCERR, "No image size defined for the reference map.", "loadReferenceMap()"); return (-1); } return (0); break; case (COLOR): if (loadColor(&(ref->color), NULL) != MS_SUCCESS) return (-1); break; case (EXTENT): if (getDouble(&(ref->extent.minx), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(ref->extent.miny), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(ref->extent.maxx), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(ref->extent.maxy), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (!MS_VALID_EXTENT(ref->extent)) { msSetError(MS_MISCERR, "Given reference extent is invalid. Check that it " "is in the form: minx, miny, maxx, maxy", "loadReferenceMap()"); return (-1); } break; case (IMAGE): if (getString(&ref->image) == MS_FAILURE) return (-1); break; case (OUTLINECOLOR): if (loadColor(&(ref->outlinecolor), NULL) != MS_SUCCESS) return (-1); break; case (SIZE): if (getInteger(&(ref->width), MS_NUM_CHECK_RANGE, 5, ref->map->maxsize) == -1) return (-1); // is 5 reasonable? if (getInteger(&(ref->height), MS_NUM_CHECK_RANGE, 5, ref->map->maxsize) == -1) return (-1); break; case (STATUS): if ((ref->status = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (MARKER): if ((state = getSymbol(2, MS_NUMBER, MS_STRING)) == -1) return (-1); if (state == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GTE, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid MARKER, must be greater than 0 (line %d)", "loadReferenceMap()", msyylineno); return (-1); } ref->marker = (int)msyynumber; } else { if (ref->markername != NULL) msFree(ref->markername); ref->markername = msStrdup(msyystring_buffer); } break; case (MARKERSIZE): if (getInteger(&(ref->markersize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MINBOXSIZE): if (getInteger(&(ref->minboxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXBOXSIZE): if (getInteger(&(ref->maxboxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (REFERENCE): break; /* for string loads */ default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadReferenceMap()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateReferenceMapFromString(referenceMapObj *ref, char *string) { if (!ref || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadReferenceMap(ref, ref->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeReferenceMap(FILE *stream, int indent, referenceMapObj *ref) { colorObj c; if (!ref->image) return; indent++; writeBlockBegin(stream, indent, "REFERENCE"); MS_INIT_COLOR(c, 255, 0, 0, 255); writeColor(stream, indent, "COLOR", &c, &(ref->color)); writeExtent(stream, indent, "EXTENT", ref->extent); writeString(stream, indent, "IMAGE", NULL, ref->image); MS_INIT_COLOR(c, 0, 0, 0, 255); writeColor(stream, indent, "OUTLINECOLOR", &c, &(ref->outlinecolor)); writeDimension(stream, indent, "SIZE", ref->width, ref->height, NULL, NULL); writeKeyword(stream, indent, "STATUS", ref->status, 2, MS_ON, "ON", MS_OFF, "OFF"); writeNumberOrString(stream, indent, "MARKER", 0, ref->marker, ref->markername); writeNumber(stream, indent, "MARKERSIZE", -1, ref->markersize); writeNumber(stream, indent, "MAXBOXSIZE", -1, ref->maxboxsize); writeNumber(stream, indent, "MINBOXSIZE", -1, ref->minboxsize); writeBlockEnd(stream, indent, "REFERENCE"); writeLineFeed(stream); } char *msWriteReferenceMapToString(referenceMapObj *ref) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeReferenceMap(stdout, -1, ref); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } #define MAX_FORMATOPTIONS 100 static int loadOutputFormat(mapObj *map) { char *name = NULL; char *mimetype = NULL; char *driver = NULL; char *extension = NULL; int imagemode = MS_NOOVERRIDE; int transparent = MS_NOOVERRIDE; char *formatoptions[MAX_FORMATOPTIONS]; int numformatoptions = 0; char *value = NULL; for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadOutputFormat()"); goto load_output_error; case (END): { outputFormatObj *format; if (driver == NULL) { msSetError(MS_MISCERR, "OUTPUTFORMAT clause lacks DRIVER keyword near (%s):(%d)", "loadOutputFormat()", msyystring_buffer, msyylineno); goto load_output_error; } format = msCreateDefaultOutputFormat(map, driver, name, NULL); if (format == NULL) { msSetError(MS_MISCERR, "OUTPUTFORMAT (%s) clause references driver (%s), but this " "driver isn't configured.", "loadOutputFormat()", name, driver); goto load_output_error; } msFree(name); name = NULL; msFree(driver); driver = NULL; if (transparent != MS_NOOVERRIDE) format->transparent = transparent; if (extension != NULL) { msFree(format->extension); format->extension = extension; extension = NULL; } if (mimetype != NULL) { msFree(format->mimetype); format->mimetype = mimetype; mimetype = NULL; } if (imagemode != MS_NOOVERRIDE) { if (format->renderer != MS_RENDER_WITH_AGG || imagemode != MS_IMAGEMODE_PC256) { /* don't force to PC256 with agg, this can happen when using mapfile * defined GD outputformats that are now falling back to agg/png8 */ format->imagemode = imagemode; } if (transparent == MS_NOOVERRIDE) { if (imagemode == MS_IMAGEMODE_RGB) format->transparent = MS_FALSE; else if (imagemode == MS_IMAGEMODE_RGBA) format->transparent = MS_TRUE; } if (format->imagemode == MS_IMAGEMODE_INT16 || format->imagemode == MS_IMAGEMODE_FLOAT32 || format->imagemode == MS_IMAGEMODE_BYTE) format->renderer = MS_RENDER_WITH_RAWDATA; } while (numformatoptions--) { char *key = strchr(formatoptions[numformatoptions], '='); if (!key || !*(key + 1)) { msSetError( MS_MISCERR, "Failed to parse FORMATOPTION, expecting \"KEY=VALUE\" syntax.", "loadOutputFormat()"); goto load_output_error; } *key = 0; key++; msSetOutputFormatOption(format, formatoptions[numformatoptions], key); free(formatoptions[numformatoptions]); } format->inmapfile = MS_TRUE; msOutputFormatValidate(format, MS_FALSE); return (0); } case (NAME): msFree(name); if ((name = getToken()) == NULL) goto load_output_error; break; case (MIMETYPE): if (getString(&mimetype) == MS_FAILURE) goto load_output_error; break; case (DRIVER): { int s; if ((s = getSymbol(2, MS_STRING, TEMPLATE)) == -1) /* allow the template to be quoted or not in the mapfile */ goto load_output_error; free(driver); if (s == MS_STRING) driver = msStrdup(msyystring_buffer); else driver = msStrdup("TEMPLATE"); } break; case (EXTENSION): if (getString(&extension) == MS_FAILURE) goto load_output_error; if (extension[0] == '.') { char *temp = msStrdup(extension + 1); free(extension); extension = temp; } break; case (FORMATOPTION): if (getString(&value) == MS_FAILURE) goto load_output_error; if (numformatoptions < MAX_FORMATOPTIONS) formatoptions[numformatoptions++] = value; value = NULL; break; case (IMAGEMODE): value = getToken(); if (strcasecmp(value, "PC256") == 0) imagemode = MS_IMAGEMODE_PC256; else if (strcasecmp(value, "RGB") == 0) imagemode = MS_IMAGEMODE_RGB; else if (strcasecmp(value, "RGBA") == 0) imagemode = MS_IMAGEMODE_RGBA; else if (strcasecmp(value, "INT16") == 0) imagemode = MS_IMAGEMODE_INT16; else if (strcasecmp(value, "FLOAT32") == 0) imagemode = MS_IMAGEMODE_FLOAT32; else if (strcasecmp(value, "BYTE") == 0) imagemode = MS_IMAGEMODE_BYTE; else if (strcasecmp(value, "FEATURE") == 0) imagemode = MS_IMAGEMODE_FEATURE; else { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d), expected PC256, RGB, " "RGBA, FEATURE, BYTE, INT16, or FLOAT32 for IMAGEMODE.", "loadOutputFormat()", msyystring_buffer, msyylineno); goto load_output_error; } free(value); value = NULL; break; case (TRANSPARENT): if ((transparent = getSymbol(2, MS_ON, MS_OFF)) == -1) goto load_output_error; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadOutputFormat()", msyystring_buffer, msyylineno); goto load_output_error; } } /* next token */ load_output_error: msFree(driver); msFree(extension); msFree(mimetype); msFree(name); msFree(value); return -1; } /* ** utility function to write an output format structure to file */ static void writeOutputformatobject(FILE *stream, int indent, outputFormatObj *outputformat) { int i = 0; if (!outputformat) return; indent++; writeBlockBegin(stream, indent, "OUTPUTFORMAT"); writeString(stream, indent, "NAME", NULL, outputformat->name); writeString(stream, indent, "MIMETYPE", NULL, outputformat->mimetype); writeString(stream, indent, "DRIVER", NULL, outputformat->driver); writeString(stream, indent, "EXTENSION", NULL, outputformat->extension); writeKeyword(stream, indent, "IMAGEMODE", outputformat->imagemode, 7, MS_IMAGEMODE_PC256, "PC256", MS_IMAGEMODE_RGB, "RGB", MS_IMAGEMODE_RGBA, "RGBA", MS_IMAGEMODE_INT16, "INT16", MS_IMAGEMODE_FLOAT32, "FLOAT32", MS_IMAGEMODE_BYTE, "BYTE", MS_IMAGEMODE_FEATURE, "FEATURE"); writeKeyword(stream, indent, "TRANSPARENT", outputformat->transparent, 2, MS_TRUE, "TRUE", MS_FALSE, "FALSE"); for (i = 0; i < outputformat->numformatoptions; i++) writeString(stream, indent, "FORMATOPTION", NULL, outputformat->formatoptions[i]); writeBlockEnd(stream, indent, "OUTPUTFORMAT"); writeLineFeed(stream); } /* ** Write the output formats to file */ static void writeOutputformat(FILE *stream, int indent, mapObj *map) { int i = 0; if (!map->outputformat) return; writeOutputformatobject(stream, indent, map->outputformat); for (i = 0; i < map->numoutputformats; i++) { if (map->outputformatlist[i]->inmapfile == MS_TRUE && strcmp(map->outputformatlist[i]->name, map->outputformat->name) != 0) writeOutputformatobject(stream, indent, map->outputformatlist[i]); } } /* ** Initialize, load and free a legendObj structure */ void initLegend(legendObj *legend) { legend->height = legend->width = 0; MS_INIT_COLOR(legend->imagecolor, 255, 255, 255, 255); /* white */ MS_INIT_COLOR(legend->outlinecolor, -1, -1, -1, 255); initLabel(&legend->label); legend->label.position = MS_XY; /* override */ legend->keysizex = 20; legend->keysizey = 10; legend->keyspacingx = 5; legend->keyspacingy = 5; legend->status = MS_OFF; legend->transparent = MS_NOOVERRIDE; legend->position = MS_LL; legend->postlabelcache = MS_FALSE; /* draw with labels */ legend->template = NULL; legend->map = NULL; } void freeLegend(legendObj *legend) { if (legend->template) free(legend->template); freeLabel(&(legend->label)); } int loadLegend(legendObj *legend, mapObj *map) { legend->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadLegend()"); return (-1); case (END): legend->label.position = MS_XY; /* overrides go here */ return (0); break; case (IMAGECOLOR): if (loadColor(&(legend->imagecolor), NULL) != MS_SUCCESS) return (-1); break; case (KEYSIZE): if (getInteger(&(legend->keysizex), MS_NUM_CHECK_RANGE, MS_LEGEND_KEYSIZE_MIN, MS_LEGEND_KEYSIZE_MAX) == -1) return (-1); if (getInteger(&(legend->keysizey), MS_NUM_CHECK_RANGE, MS_LEGEND_KEYSIZE_MIN, MS_LEGEND_KEYSIZE_MAX) == -1) return (-1); break; case (KEYSPACING): if (getInteger(&(legend->keyspacingx), MS_NUM_CHECK_RANGE, MS_LEGEND_KEYSPACING_MIN, MS_LEGEND_KEYSPACING_MAX) == -1) return (-1); if (getInteger(&(legend->keyspacingy), MS_NUM_CHECK_RANGE, MS_LEGEND_KEYSPACING_MIN, MS_LEGEND_KEYSPACING_MAX) == -1) return (-1); break; case (LABEL): if (loadLabel(&(legend->label)) == -1) return (-1); legend->label.angle = 0; /* force */ break; case (LEGEND): break; /* for string loads */ case (OUTLINECOLOR): if (loadColor(&(legend->outlinecolor), NULL) != MS_SUCCESS) return (-1); break; case (POSITION): if ((legend->position = getSymbol(6, MS_UL, MS_UR, MS_LL, MS_LR, MS_UC, MS_LC)) == -1) return (-1); break; case (POSTLABELCACHE): if ((legend->postlabelcache = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); break; case (STATUS): if ((legend->status = getSymbol(3, MS_ON, MS_OFF, MS_EMBED)) == -1) return (-1); break; case (TRANSPARENT): if ((legend->transparent = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (TEMPLATE): if (getString(&legend->template) == MS_FAILURE) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLegend()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateLegendFromString(legendObj *legend, char *string) { if (!legend || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadLegend(legend, legend->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeLegend(FILE *stream, int indent, legendObj *legend) { colorObj c; indent++; writeBlockBegin(stream, indent, "LEGEND"); MS_INIT_COLOR(c, 255, 255, 255, 255); writeColor(stream, indent, "IMAGECOLOR", &c, &(legend->imagecolor)); writeDimension(stream, indent, "KEYSIZE", legend->keysizex, legend->keysizey, NULL, NULL); writeDimension(stream, indent, "KEYSPACING", legend->keyspacingx, legend->keyspacingy, NULL, NULL); writeLabel(stream, indent, &(legend->label)); writeColor(stream, indent, "OUTLINECOLOR", NULL, &(legend->outlinecolor)); if (legend->status == MS_EMBED) writeKeyword(stream, indent, "POSITION", legend->position, 6, MS_LL, "LL", MS_UL, "UL", MS_UR, "UR", MS_LR, "LR", MS_UC, "UC", MS_LC, "LC"); writeKeyword(stream, indent, "POSTLABELCACHE", legend->postlabelcache, 1, MS_TRUE, "TRUE"); writeKeyword(stream, indent, "STATUS", legend->status, 3, MS_ON, "ON", MS_OFF, "OFF", MS_EMBED, "EMBED"); writeKeyword(stream, indent, "TRANSPARENT", legend->transparent, 2, MS_TRUE, "TRUE", MS_FALSE, "FALSE"); writeString(stream, indent, "TEMPLATE", NULL, legend->template); writeBlockEnd(stream, indent, "LEGEND"); writeLineFeed(stream); } char *msWriteLegendToString(legendObj *legend) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeLegend(stdout, -1, legend); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize, load and free a scalebarObj structure */ void initScalebar(scalebarObj *scalebar) { MS_INIT_COLOR(scalebar->imagecolor, -1, -1, -1, 255); scalebar->width = 200; scalebar->height = 3; scalebar->style = 0; /* only 2 styles at this point */ scalebar->intervals = 4; initLabel(&scalebar->label); scalebar->label.position = MS_XY; /* override */ MS_INIT_COLOR(scalebar->backgroundcolor, -1, -1, -1, 255); /* if not set, scalebar creation needs to set this to match the background color */ MS_INIT_COLOR(scalebar->color, 0, 0, 0, 255); /* default to black */ MS_INIT_COLOR(scalebar->outlinecolor, -1, -1, -1, 255); scalebar->units = MS_MILES; scalebar->status = MS_OFF; scalebar->position = MS_LL; scalebar->transparent = MS_NOOVERRIDE; /* no transparency */ scalebar->postlabelcache = MS_FALSE; /* draw with labels */ scalebar->align = MS_ALIGN_CENTER; scalebar->offsetx = 0; scalebar->offsety = 0; } void freeScalebar(scalebarObj *scalebar) { freeLabel(&(scalebar->label)); } int loadScalebar(scalebarObj *scalebar) { for (;;) { switch (msyylex()) { case (ALIGN): if ((scalebar->align = getSymbol(3, MS_ALIGN_LEFT, MS_ALIGN_CENTER, MS_ALIGN_RIGHT)) == -1) return (-1); break; case (BACKGROUNDCOLOR): if (loadColor(&(scalebar->backgroundcolor), NULL) != MS_SUCCESS) return (-1); break; case (COLOR): if (loadColor(&(scalebar->color), NULL) != MS_SUCCESS) return (-1); break; case (EOF): msSetError(MS_EOFERR, NULL, "loadScalebar()"); return (-1); case (END): return (0); break; case (IMAGECOLOR): if (loadColor(&(scalebar->imagecolor), NULL) != MS_SUCCESS) return (-1); break; case (INTERVALS): if (getInteger(&(scalebar->intervals), MS_NUM_CHECK_RANGE, MS_SCALEBAR_INTERVALS_MIN, MS_SCALEBAR_INTERVALS_MAX) == -1) return (-1); break; case (LABEL): if (loadLabel(&(scalebar->label)) == -1) return (-1); scalebar->label.angle = 0; break; case (OUTLINECOLOR): if (loadColor(&(scalebar->outlinecolor), NULL) != MS_SUCCESS) return (-1); break; case (POSITION): if ((scalebar->position = getSymbol(6, MS_UL, MS_UR, MS_LL, MS_LR, MS_UC, MS_LC)) == -1) return (-1); break; case (POSTLABELCACHE): if ((scalebar->postlabelcache = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); break; case (SCALEBAR): break; /* for string loads */ case (SIZE): if (getInteger(&(scalebar->width), MS_NUM_CHECK_RANGE, MS_SCALEBAR_WIDTH_MIN, MS_SCALEBAR_WIDTH_MAX) == -1) return (-1); if (getInteger(&(scalebar->height), MS_NUM_CHECK_RANGE, MS_SCALEBAR_HEIGHT_MIN, MS_SCALEBAR_HEIGHT_MAX) == -1) return (-1); break; case (STATUS): if ((scalebar->status = getSymbol(3, MS_ON, MS_OFF, MS_EMBED)) == -1) return (-1); break; case (STYLE): if (getInteger(&(scalebar->style), MS_NUM_CHECK_RANGE, 0, 1) == -1) return (-1); // only 2 styles: 0 and 1 break; case (TRANSPARENT): if ((scalebar->transparent = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (UNITS): if ((scalebar->units = getSymbol(6, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES)) == -1) return (-1); break; case (OFFSET): if (getInteger(&(scalebar->offsetx), MS_NUM_CHECK_RANGE, MS_SCALEBAR_OFFSET_MIN, MS_SCALEBAR_OFFSET_MAX) == -1) return (-1); if (getInteger(&(scalebar->offsety), MS_NUM_CHECK_RANGE, MS_SCALEBAR_OFFSET_MIN, MS_SCALEBAR_OFFSET_MAX) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadScalebar()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateScalebarFromString(scalebarObj *scalebar, char *string) { if (!scalebar || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadScalebar(scalebar) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeScalebar(FILE *stream, int indent, scalebarObj *scalebar) { colorObj c; indent++; writeBlockBegin(stream, indent, "SCALEBAR"); writeKeyword(stream, indent, "ALIGN", scalebar->align, 2, MS_ALIGN_LEFT, "LEFT", MS_ALIGN_RIGHT, "RIGHT"); writeColor(stream, indent, "BACKGROUNDCOLOR", NULL, &(scalebar->backgroundcolor)); MS_INIT_COLOR(c, 0, 0, 0, 255); writeColor(stream, indent, "COLOR", &c, &(scalebar->color)); writeColor(stream, indent, "IMAGECOLOR", NULL, &(scalebar->imagecolor)); writeNumber(stream, indent, "INTERVALS", -1, scalebar->intervals); writeLabel(stream, indent, &(scalebar->label)); writeColor(stream, indent, "OUTLINECOLOR", NULL, &(scalebar->outlinecolor)); if (scalebar->status == MS_EMBED) writeKeyword(stream, indent, "POSITION", scalebar->position, 6, MS_LL, "LL", MS_UL, "UL", MS_UR, "UR", MS_LR, "LR", MS_UC, "UC", MS_LC, "LC"); writeKeyword(stream, indent, "POSTLABELCACHE", scalebar->postlabelcache, 1, MS_TRUE, "TRUE"); writeDimension(stream, indent, "SIZE", scalebar->width, scalebar->height, NULL, NULL); writeKeyword(stream, indent, "STATUS", scalebar->status, 3, MS_ON, "ON", MS_OFF, "OFF", MS_EMBED, "EMBED"); writeNumber(stream, indent, "STYLE", 0, scalebar->style); writeKeyword(stream, indent, "TRANSPARENT", scalebar->transparent, 2, MS_TRUE, "TRUE", MS_FALSE, "FALSE"); writeKeyword(stream, indent, "UNITS", scalebar->units, 6, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES"); writeBlockEnd(stream, indent, "SCALEBAR"); writeLineFeed(stream); } char *msWriteScalebarToString(scalebarObj *scalebar) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeScalebar(stdout, -1, scalebar); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize a queryMapObj structure */ void initQueryMap(queryMapObj *querymap) { querymap->width = querymap->height = -1; querymap->style = MS_HILITE; querymap->status = MS_OFF; MS_INIT_COLOR(querymap->color, 255, 255, 0, 255); /* yellow */ } int loadQueryMap(queryMapObj *querymap, mapObj *map) { querymap->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (QUERYMAP): break; /* for string loads */ case (COLOR): if (loadColor(&(querymap->color), NULL) != MS_SUCCESS) return MS_FAILURE; break; case (EOF): msSetError(MS_EOFERR, NULL, "loadQueryMap()"); return (-1); case (END): return (0); break; case (SIZE): /* ** we do -1 (and avoid 0) here to maintain backwards compatibility as *older versions write "SIZE -1 -1" when saving a mapfile */ if (getInteger(&(querymap->width), MS_NUM_CHECK_RANGE, -1, querymap->map->maxsize) == -1 || querymap->width == 0) { msSetError(MS_MISCERR, "Invalid SIZE value (line %d)", "loadQueryMap()", msyylineno); return (-1); } if (getInteger(&(querymap->height), MS_NUM_CHECK_RANGE, -1, querymap->map->maxsize) == -1 || querymap->height == 0) { msSetError(MS_MISCERR, "Invalid SIZE value (line %d)", "loadQueryMap()", msyylineno); return (-1); } break; case (STATUS): if ((querymap->status = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (STYLE): case (TYPE): if ((querymap->style = getSymbol(3, MS_NORMAL, MS_HILITE, MS_SELECTED)) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadQueryMap()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } } int msUpdateQueryMapFromString(queryMapObj *querymap, char *string) { if (!querymap || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadQueryMap(querymap, querymap->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeQueryMap(FILE *stream, int indent, queryMapObj *querymap) { colorObj c; indent++; writeBlockBegin(stream, indent, "QUERYMAP"); MS_INIT_COLOR(c, 255, 255, 0, 255); writeColor(stream, indent, "COLOR", &c, &(querymap->color)); if (querymap->width != -1 && querymap->height != -1) // don't write SIZE if not explicitly set writeDimension(stream, indent, "SIZE", querymap->width, querymap->height, NULL, NULL); writeKeyword(stream, indent, "STATUS", querymap->status, 2, MS_ON, "ON", MS_OFF, "OFF"); writeKeyword(stream, indent, "STYLE", querymap->style, 3, MS_NORMAL, "NORMAL", MS_HILITE, "HILITE", MS_SELECTED, "SELECTED"); writeBlockEnd(stream, indent, "QUERYMAP"); writeLineFeed(stream); } char *msWriteQueryMapToString(queryMapObj *querymap) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeQueryMap(stdout, -1, querymap); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize a webObj structure */ void initWeb(webObj *web) { web->template = NULL; web->header = web->footer = NULL; web->error = web->empty = NULL; web->mintemplate = web->maxtemplate = NULL; web->minscaledenom = web->maxscaledenom = -1; web->imagepath = msStrdup(""); web->temppath = NULL; web->imageurl = msStrdup(""); initHashTable(&(web->metadata)); initHashTable(&(web->validation)); web->map = NULL; web->queryformat = msStrdup("text/html"); web->legendformat = msStrdup("text/html"); web->browseformat = msStrdup("text/html"); } void freeWeb(webObj *web) { msFree(web->template); msFree(web->header); msFree(web->footer); msFree(web->error); msFree(web->empty); msFree(web->maxtemplate); msFree(web->mintemplate); msFree(web->imagepath); msFree(web->temppath); msFree(web->imageurl); msFree(web->queryformat); msFree(web->legendformat); msFree(web->browseformat); msFreeHashItems(&(web->metadata)); msFreeHashItems(&(web->validation)); } static void writeWeb(FILE *stream, int indent, webObj *web) { indent++; writeBlockBegin(stream, indent, "WEB"); writeString(stream, indent, "BROWSEFORMAT", "text/html", web->browseformat); writeString(stream, indent, "EMPTY", NULL, web->empty); writeString(stream, indent, "ERROR", NULL, web->error); writeString(stream, indent, "FOOTER", NULL, web->footer); writeString(stream, indent, "HEADER", NULL, web->header); writeString(stream, indent, "IMAGEPATH", "", web->imagepath); writeString(stream, indent, "TEMPPATH", NULL, web->temppath); writeString(stream, indent, "IMAGEURL", "", web->imageurl); writeString(stream, indent, "LEGENDFORMAT", "text/html", web->legendformat); writeNumber(stream, indent, "MAXSCALEDENOM", -1, web->maxscaledenom); writeString(stream, indent, "MAXTEMPLATE", NULL, web->maxtemplate); writeHashTable(stream, indent, "METADATA", &(web->metadata)); writeNumber(stream, indent, "MINSCALEDENOM", -1, web->minscaledenom); writeString(stream, indent, "MINTEMPLATE", NULL, web->mintemplate); writeString(stream, indent, "QUERYFORMAT", "text/html", web->queryformat); writeString(stream, indent, "TEMPLATE", NULL, web->template); writeHashTable(stream, indent, "VALIDATION", &(web->validation)); writeBlockEnd(stream, indent, "WEB"); writeLineFeed(stream); } char *msWriteWebToString(webObj *web) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeWeb(stdout, -1, web); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } int loadWeb(webObj *web, mapObj *map) { web->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (BROWSEFORMAT): /* change to use validation in 6.0 */ free(web->browseformat); web->browseformat = NULL; /* there is a default */ if (getString(&web->browseformat) == MS_FAILURE) return (-1); break; case (EMPTY): if (getString(&web->empty) == MS_FAILURE) return (-1); break; case (WEB): break; /* for string loads */ case (EOF): msSetError(MS_EOFERR, NULL, "loadWeb()"); return (-1); case (END): return (0); break; case (ERROR): if (getString(&web->error) == MS_FAILURE) return (-1); break; case (FOOTER): if (getString(&web->footer) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (HEADER): if (getString(&web->header) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (IMAGEPATH): if (getString(&web->imagepath) == MS_FAILURE) return (-1); break; case (TEMPPATH): if (getString(&web->temppath) == MS_FAILURE) return (-1); break; case (IMAGEURL): if (getString(&web->imageurl) == MS_FAILURE) return (-1); break; case (LEGENDFORMAT): /* change to use validation in 6.0 */ free(web->legendformat); web->legendformat = NULL; /* there is a default */ if (getString(&web->legendformat) == MS_FAILURE) return (-1); break; case (MAXSCALEDENOM): if (getDouble(&web->maxscaledenom, MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MAXTEMPLATE): if (getString(&web->maxtemplate) == MS_FAILURE) return (-1); break; case (METADATA): if (loadHashTable(&(web->metadata)) != MS_SUCCESS) return (-1); break; case (MINSCALEDENOM): if (getDouble(&web->minscaledenom, MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MINTEMPLATE): if (getString(&web->mintemplate) == MS_FAILURE) return (-1); break; case (QUERYFORMAT): /* change to use validation in 6.0 */ free(web->queryformat); web->queryformat = NULL; /* there is a default */ if (getString(&web->queryformat) == MS_FAILURE) return (-1); break; case (TEMPLATE): if (getString(&web->template) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (VALIDATION): if (loadHashTable(&(web->validation)) != MS_SUCCESS) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadWeb()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } } int msUpdateWebFromString(webObj *web, char *string) { if (!web || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadWeb(web, web->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } /* ** Initialize, load and free a mapObj structure ** ** This really belongs in mapobject.c, but currently it also depends on ** lots of other init methods in this file. */ int initMap(mapObj *map) { int i = 0; MS_REFCNT_INIT(map); map->debug = (int)msGetGlobalDebugLevel(); /* Set maxlayers = 0, layers[] and layerorder[] will be allocated as needed, * on the first call to msGrowMapLayers() */ map->numlayers = 0; map->maxlayers = 0; map->layers = NULL; map->layerorder = NULL; /* used to modify the order in which the layers are drawn */ map->status = MS_ON; map->name = msStrdup("MS"); map->extent.minx = map->extent.miny = map->extent.maxx = map->extent.maxy = -1.0; map->scaledenom = -1.0; map->resolution = MS_DEFAULT_RESOLUTION; /* pixels per inch */ map->defresolution = MS_DEFAULT_RESOLUTION; /* pixels per inch */ map->height = map->width = -1; map->maxsize = MS_MAXIMAGESIZE_DEFAULT; map->gt.need_geotransform = MS_FALSE; map->gt.rotation_angle = 0.0; map->units = MS_METERS; map->cellsize = 0; map->shapepath = NULL; map->mappath = NULL; map->sldurl = NULL; MS_INIT_COLOR(map->imagecolor, 255, 255, 255, 255); /* white */ map->numoutputformats = 0; map->outputformatlist = NULL; map->outputformat = NULL; /* map->configoptions = msCreateHashTable();; */ initHashTable(&(map->configoptions)); map->imagetype = NULL; map->palette.numcolors = 0; for (i = 0; i < MS_MAX_LABEL_PRIORITY; i++) { map->labelcache.slots[i].labels = NULL; /* cache is initialize at draw time */ map->labelcache.slots[i].cachesize = 0; map->labelcache.slots[i].numlabels = 0; map->labelcache.slots[i].markers = NULL; map->labelcache.slots[i].markercachesize = 0; map->labelcache.slots[i].nummarkers = 0; } map->fontset.filename = NULL; map->fontset.numfonts = 0; /* map->fontset.fonts = NULL; */ initHashTable(&(map->fontset.fonts)); msInitSymbolSet(&map->symbolset); map->symbolset.fontset = &(map->fontset); map->symbolset.map = map; initLegend(&map->legend); initScalebar(&map->scalebar); initWeb(&map->web); initReferenceMap(&map->reference); initQueryMap(&map->querymap); map->projContext = msProjectionContextGetFromPool(); if (msInitProjection(&(map->projection)) == -1) return (-1); if (msInitProjection(&(map->latlon)) == -1) return (-1); msProjectionSetContext(&(map->projection), map->projContext); msProjectionSetContext(&(map->latlon), map->projContext); /* initialize a default "geographic" projection */ map->latlon.numargs = 2; map->latlon.args[0] = msStrdup("proj=latlong"); map->latlon.args[1] = msStrdup("ellps=WGS84"); /* probably want a different ellipsoid */ if (msProcessProjection(&(map->latlon)) == -1) return (-1); map->templatepattern = map->datapattern = NULL; /* Encryption key information - see mapcrypto.c */ map->encryption_key_loaded = MS_FALSE; msInitQuery(&(map->query)); #ifdef USE_V8_MAPSCRIPT map->v8context = NULL; #endif map->config = NULL; return (0); } /* ** Ensure there is at least one free entry in the layers and layerorder ** arrays of this mapObj. Grow the allocated layers/layerorder arrays if ** necessary and allocate a new layer for layers[numlayers] if there is ** not already one, setting its contents to all zero bytes (i.e. does not ** call initLayer() on it). ** ** This function is safe to use for the initial allocation of the layers[] ** and layerorder[] arrays as well (i.e. when maxlayers==0 and layers==NULL) ** ** Returns a reference to the new layerObj on success, NULL on error. */ layerObj *msGrowMapLayers(mapObj *map) { /* Do we need to increase the size of layers/layerorder by * MS_LAYER_ALLOCSIZE? */ if (map->numlayers == map->maxlayers) { layerObj **newLayersPtr; int *newLayerorderPtr; int i, newsize; newsize = map->maxlayers + MS_LAYER_ALLOCSIZE; /* Alloc/realloc layers */ newLayersPtr = (layerObj **)realloc(map->layers, newsize * sizeof(layerObj *)); MS_CHECK_ALLOC(newLayersPtr, newsize * sizeof(layerObj *), NULL); map->layers = newLayersPtr; /* Alloc/realloc layerorder */ newLayerorderPtr = (int *)realloc(map->layerorder, newsize * sizeof(int)); MS_CHECK_ALLOC(newLayerorderPtr, newsize * sizeof(int), NULL); map->layerorder = newLayerorderPtr; map->maxlayers = newsize; for (i = map->numlayers; i < map->maxlayers; i++) { map->layers[i] = NULL; map->layerorder[i] = 0; } } if (map->layers[map->numlayers] == NULL) { map->layers[map->numlayers] = (layerObj *)calloc(1, sizeof(layerObj)); MS_CHECK_ALLOC(map->layers[map->numlayers], sizeof(layerObj), NULL); } return map->layers[map->numlayers]; } int msFreeLabelCacheSlot(labelCacheSlotObj *cacheslot) { int i, j; /* free the labels */ if (cacheslot->labels) { for (i = 0; i < cacheslot->numlabels; i++) { for (j = 0; j < cacheslot->labels[i].numtextsymbols; j++) { freeTextSymbol(cacheslot->labels[i].textsymbols[j]); free(cacheslot->labels[i].textsymbols[j]); } msFree(cacheslot->labels[i].textsymbols); if (cacheslot->labels[i].leaderline) { msFree(cacheslot->labels[i].leaderline->point); msFree(cacheslot->labels[i].leaderline); msFree(cacheslot->labels[i].leaderbbox); } } } msFree(cacheslot->labels); cacheslot->labels = NULL; cacheslot->cachesize = 0; cacheslot->numlabels = 0; msFree(cacheslot->markers); cacheslot->markers = NULL; cacheslot->markercachesize = 0; cacheslot->nummarkers = 0; return (MS_SUCCESS); } int msFreeLabelCache(labelCacheObj *cache) { int p; for (p = 0; p < MS_MAX_LABEL_PRIORITY; p++) { if (msFreeLabelCacheSlot(&(cache->slots[p])) != MS_SUCCESS) return MS_FAILURE; } cache->num_allocated_rendered_members = cache->num_rendered_members = 0; msFree(cache->rendered_text_symbols); return MS_SUCCESS; } int msInitLabelCacheSlot(labelCacheSlotObj *cacheslot) { if (cacheslot->labels || cacheslot->markers) msFreeLabelCacheSlot(cacheslot); cacheslot->labels = (labelCacheMemberObj *)malloc( sizeof(labelCacheMemberObj) * MS_LABELCACHEINITSIZE); MS_CHECK_ALLOC(cacheslot->labels, sizeof(labelCacheMemberObj) * MS_LABELCACHEINITSIZE, MS_FAILURE); cacheslot->cachesize = MS_LABELCACHEINITSIZE; cacheslot->numlabels = 0; cacheslot->markers = (markerCacheMemberObj *)malloc( sizeof(markerCacheMemberObj) * MS_LABELCACHEINITSIZE); MS_CHECK_ALLOC(cacheslot->markers, sizeof(markerCacheMemberObj) * MS_LABELCACHEINITSIZE, MS_FAILURE); cacheslot->markercachesize = MS_LABELCACHEINITSIZE; cacheslot->nummarkers = 0; return (MS_SUCCESS); } int msInitLabelCache(labelCacheObj *cache) { int p; for (p = 0; p < MS_MAX_LABEL_PRIORITY; p++) { if (msInitLabelCacheSlot(&(cache->slots[p])) != MS_SUCCESS) return MS_FAILURE; } cache->gutter = 0; cache->num_allocated_rendered_members = cache->num_rendered_members = 0; cache->rendered_text_symbols = NULL; return MS_SUCCESS; } static void writeMap(FILE *stream, int indent, mapObj *map) { int i; colorObj c; writeBlockBegin(stream, indent, "MAP"); writeNumber(stream, indent, "ANGLE", 0, map->gt.rotation_angle); writeHashTableInline(stream, indent, "CONFIG", &(map->configoptions)); writeNumber(stream, indent, "DEBUG", 0, map->debug); writeNumber(stream, indent, "DEFRESOLUTION", 72.0, map->defresolution); writeExtent(stream, indent, "EXTENT", map->extent); writeString(stream, indent, "FONTSET", NULL, map->fontset.filename); MS_INIT_COLOR(c, 255, 255, 255, 255); writeColor(stream, indent, "IMAGECOLOR", &c, &(map->imagecolor)); writeString(stream, indent, "IMAGETYPE", NULL, map->imagetype); writeNumber(stream, indent, "MAXSIZE", MS_MAXIMAGESIZE_DEFAULT, map->maxsize); writeString(stream, indent, "NAME", NULL, map->name); writeNumber(stream, indent, "RESOLUTION", 72.0, map->resolution); writeString(stream, indent, "SHAPEPATH", NULL, map->shapepath); writeDimension(stream, indent, "SIZE", map->width, map->height, NULL, NULL); writeKeyword(stream, indent, "STATUS", map->status, 2, MS_ON, "ON", MS_OFF, "OFF"); writeString(stream, indent, "SYMBOLSET", NULL, map->symbolset.filename); writeKeyword(stream, indent, "UNITS", map->units, 7, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES", MS_DD, "DD"); writeLineFeed(stream); writeOutputformat(stream, indent, map); /* write symbol with INLINE tag in mapfile */ for (i = 0; i < map->symbolset.numsymbols; i++) { if (map->symbolset.symbol[i]->inmapfile) writeSymbol(map->symbolset.symbol[i], stream); } writeProjection(stream, indent, &(map->projection)); writeLegend(stream, indent, &(map->legend)); writeQueryMap(stream, indent, &(map->querymap)); writeReferenceMap(stream, indent, &(map->reference)); writeScalebar(stream, indent, &(map->scalebar)); writeWeb(stream, indent, &(map->web)); for (i = 0; i < map->numlayers; i++) writeLayer(stream, indent, GET_LAYER(map, map->layerorder[i])); writeBlockEnd(stream, indent, "MAP"); } char *msWriteMapToString(mapObj *map) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeMap(stdout, 0, map); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } int msSaveMap(mapObj *map, char *filename) { FILE *stream; char szPath[MS_MAXPATHLEN]; if (!map) { msSetError(MS_MISCERR, "Map is undefined.", "msSaveMap()"); return (-1); } if (!filename) { msSetError(MS_MISCERR, "Filename is undefined.", "msSaveMap()"); return (-1); } stream = fopen(msBuildPath(szPath, map->mappath, filename), "w"); if (!stream) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "(%s)", "msSaveMap()", filename); return (-1); } writeMap(stream, 0, map); fclose(stream); return (0); } static void writeConfig(FILE *stream, int indent, configObj *config) { writeBlockBegin(stream, indent, "CONFIG"); writeHashTable(stream, indent, "ENV", &(config->env)); writeHashTable(stream, indent, "MAPS", &(config->maps)); writeBlockEnd(stream, indent, "CONFIG"); } int msSaveConfig(configObj *config, const char *filename) { FILE *stream; if (!config) { msSetError(MS_MISCERR, "Config is undefined.", "msSaveConfigMap()"); return (-1); } if (!filename) { msSetError(MS_MISCERR, "Filename is undefined.", "msSaveConfigMap()"); return (-1); } stream = fopen(filename, "w"); if (!stream) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "(%s)", "msSaveConfig()", filename); return (-1); } writeConfig(stream, 0, config); fclose(stream); return (0); } static int loadMapInternal(mapObj *map) { int foundMapToken = MS_FALSE; int foundBomToken = MS_FALSE; int token; for (;;) { token = msyylex(); if (!foundBomToken && token == BOM) { foundBomToken = MS_TRUE; if (!foundMapToken) { continue; /*skip a leading bom*/ } } if (!foundMapToken && token != MAP) { msSetError(MS_IDENTERR, "First token must be MAP, this doesn't look like a mapfile.", "msLoadMap()"); return (MS_FAILURE); } switch (token) { case (CONFIG): { char *key = NULL, *value = NULL; if (getString(&key) == MS_FAILURE) return MS_FAILURE; if (getString(&value) == MS_FAILURE) { free(key); return MS_FAILURE; } if (msSetConfigOption(map, key, value) == MS_FAILURE) { free(key); free(value); return MS_FAILURE; } free(key); free(value); } break; case (DEBUG): if ((map->debug = getSymbol(3, MS_ON, MS_OFF, MS_NUMBER)) == -1) return MS_FAILURE; if (map->debug == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, 0, 5) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid DEBUG level, must be between 0 and 5 (line %d)", "msLoadMap()", msyylineno); return (-1); } map->debug = (int)msyynumber; } break; case (END): if (msyyin) { fclose(msyyin); msyyin = NULL; } /*** Make config options current ***/ msApplyMapConfigOptions(map); /*** Compute rotated extent info if applicable ***/ msMapComputeGeotransform(map); /*** OUTPUTFORMAT related setup ***/ if (msPostMapParseOutputFormatSetup(map) == MS_FAILURE) return MS_FAILURE; if (loadSymbolSet(&(map->symbolset), map) == -1) return MS_FAILURE; if (resolveSymbolNames(map) == MS_FAILURE) return MS_FAILURE; if (msLoadFontSet(&(map->fontset), map) == -1) return MS_FAILURE; return MS_SUCCESS; break; case (EOF): msSetError(MS_EOFERR, NULL, "msLoadMap()"); return MS_FAILURE; case (EXTENT): { if (getDouble(&(map->extent.minx), MS_NUM_CHECK_NONE, -1, -1) == -1) return MS_FAILURE; if (getDouble(&(map->extent.miny), MS_NUM_CHECK_NONE, -1, -1) == -1) return MS_FAILURE; if (getDouble(&(map->extent.maxx), MS_NUM_CHECK_NONE, -1, -1) == -1) return MS_FAILURE; if (getDouble(&(map->extent.maxy), MS_NUM_CHECK_NONE, -1, -1) == -1) return MS_FAILURE; if (!MS_VALID_EXTENT(map->extent)) { msSetError(MS_MISCERR, "Given map extent is invalid. Check that it " "is in the form: minx, miny, maxx, maxy", "loadMapInternal()"); return MS_FAILURE; } } break; case (ANGLE): { double rotation_angle; if (getDouble(&(rotation_angle), MS_NUM_CHECK_RANGE, -360, 360) == -1) return MS_FAILURE; msMapSetRotation(map, rotation_angle); } break; case (FONTSET): if (getString(&map->fontset.filename) == MS_FAILURE) return MS_FAILURE; break; case (IMAGECOLOR): if (loadColor(&(map->imagecolor), NULL) != MS_SUCCESS) return MS_FAILURE; break; case (IMAGETYPE): msFree(map->imagetype); map->imagetype = getToken(); break; case (LATLON): if (loadProjection(&map->latlon) == -1) return MS_FAILURE; break; case (LAYER): if (msGrowMapLayers(map) == NULL) return MS_FAILURE; if (initLayer((GET_LAYER(map, map->numlayers)), map) == -1) return MS_FAILURE; if (loadLayer((GET_LAYER(map, map->numlayers)), map) == -1) return MS_FAILURE; GET_LAYER(map, map->numlayers)->index = map->numlayers; /* save the index */ /* Update the layer order list with the layer's index. */ map->layerorder[map->numlayers] = map->numlayers; map->numlayers++; break; case (OUTPUTFORMAT): if (loadOutputFormat(map) == -1) return MS_FAILURE; break; case (LEGEND): if (loadLegend(&(map->legend), map) == -1) return MS_FAILURE; break; case (MAP): foundMapToken = MS_TRUE; break; case (MAXSIZE): if (getInteger(&(map->maxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return MS_FAILURE; break; case (NAME): free(map->name); map->name = NULL; /* erase default */ if (getString(&map->name) == MS_FAILURE) return MS_FAILURE; break; case (PROJECTION): if (loadProjection(&map->projection) == -1) return MS_FAILURE; break; case (QUERYMAP): if (loadQueryMap(&(map->querymap), map) == -1) return MS_FAILURE; break; case (REFERENCE): if (loadReferenceMap(&(map->reference), map) == -1) return MS_FAILURE; break; case (RESOLUTION): if (getDouble(&(map->resolution), MS_NUM_CHECK_RANGE, MS_RESOLUTION_MIN, MS_RESOLUTION_MAX) == -1) return MS_FAILURE; break; case (DEFRESOLUTION): if (getDouble(&(map->defresolution), MS_NUM_CHECK_RANGE, MS_RESOLUTION_MIN, MS_RESOLUTION_MAX) == -1) return MS_FAILURE; break; case (SCALE): case (SCALEDENOM): if (getDouble(&(map->scaledenom), MS_NUM_CHECK_GTE, 1, -1) == -1) return MS_FAILURE; break; case (SCALEBAR): if (loadScalebar(&(map->scalebar)) == -1) return MS_FAILURE; break; case (SHAPEPATH): if (getString(&map->shapepath) == MS_FAILURE) return MS_FAILURE; break; case (SIZE): if (getInteger(&(map->width), MS_NUM_CHECK_RANGE, 1, map->maxsize) == -1) return MS_FAILURE; if (getInteger(&(map->height), MS_NUM_CHECK_RANGE, 1, map->maxsize) == -1) return MS_FAILURE; break; case (STATUS): if ((map->status = getSymbol(2, MS_ON, MS_OFF)) == -1) return MS_FAILURE; break; case (SYMBOL): if (msGrowSymbolSet(&(map->symbolset)) == NULL) return MS_FAILURE; if ((loadSymbol(map->symbolset.symbol[map->symbolset.numsymbols], map->mappath) == -1)) { msFreeSymbol(map->symbolset.symbol[map->symbolset.numsymbols]); free(map->symbolset.symbol[map->symbolset.numsymbols]); map->symbolset.symbol[map->symbolset.numsymbols] = NULL; return MS_FAILURE; } map->symbolset.symbol[map->symbolset.numsymbols]->inmapfile = MS_TRUE; map->symbolset.numsymbols++; break; case (SYMBOLSET): if (getString(&map->symbolset.filename) == MS_FAILURE) return MS_FAILURE; break; case (UNITS): if ((int)(map->units = getSymbol(7, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD)) == -1) return MS_FAILURE; break; case (WEB): if (loadWeb(&(map->web), map) == -1) return MS_FAILURE; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "msLoadMap()", msyystring_buffer, msyylineno); return MS_FAILURE; } } /* next token */ } static bool msGetCWD(char *szBuffer, size_t nBufferSize, const char *pszFunctionName) { if (NULL == getcwd(szBuffer, nBufferSize)) { #ifndef _WIN32 if (errno == EACCES) msSetError(MS_MISCERR, "getcwd() failed with EACCES: you may need to force the " "current directory in the mapserver launcher " "(e.g -d option of spawn-fcgi)", pszFunctionName); else if (errno == ENAMETOOLONG) msSetError(MS_MISCERR, "getcwd() returned a too long path", pszFunctionName); else msSetError(MS_MISCERR, "getcwd() failed with errno code %d", pszFunctionName, errno); #else msSetError(MS_MISCERR, "getcwd() returned a too long path", pszFunctionName); #endif return FALSE; } return TRUE; } /* * Apply any SLD styles referenced in a LAYER's STYLEITEM */ static void applyStyleItemToLayer(mapObj *map) { // applying SLD can create cloned layers so store the original layer count int layerCount = map->numlayers; for (int i = 0; i < layerCount; i++) { layerObj *layer = GET_LAYER(map, i); if (layer->styleitem && STARTS_WITH_CI(layer->styleitem, "sld://")) { const char *filename = layer->styleitem + strlen("sld://"); if (*filename == '\0') { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "Empty SLD filename: \"%s\".", "applyLayerDefaultSubstitutions()", layer->styleitem); } else { msSLDApplyFromFile(map, layer, filename); } } } } /* ** Sets up string-based mapfile loading and calls loadMapInternal to do the *work. */ mapObj *msLoadMapFromString(char *buffer, char *new_mappath, const configObj *config) { mapObj *map; struct mstimeval starttime = {0}, endtime = {0}; char szPath[MS_MAXPATHLEN], szCWDPath[MS_MAXPATHLEN]; char *mappath = NULL; int debuglevel; debuglevel = (int)msGetGlobalDebugLevel(); if (debuglevel >= MS_DEBUGLEVEL_TUNING) { /* In debug mode, track time spent loading/parsing mapfile. */ msGettimeofday(&starttime, NULL); } if (!buffer) { msSetError(MS_MISCERR, "No buffer to load.", "msLoadMapFromString()"); return (NULL); } /* ** Allocate mapObj structure */ map = (mapObj *)calloc(1, sizeof(mapObj)); MS_CHECK_ALLOC(map, sizeof(mapObj), NULL); if (initMap(map) == -1) { /* initialize this map */ msFreeMap(map); return (NULL); } map->config = config; // create a read-only reference msAcquireLock(TLOCK_PARSER); /* might need to move this lock a bit higher, yup (bug 2108) */ msyystate = MS_TOKENIZE_STRING; msyystring = buffer; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 (do lines mean anything here?) */ /* If new_mappath is provided then use it, otherwise use the CWD */ if (!msGetCWD(szCWDPath, MS_MAXPATHLEN, "msLoadMapFromString()")) { msFreeMap(map); msReleaseLock(TLOCK_PARSER); return (NULL); } if (new_mappath) { mappath = msStrdup(new_mappath); map->mappath = msStrdup(msBuildPath(szPath, szCWDPath, mappath)); } else map->mappath = msStrdup(szCWDPath); msyybasepath = map->mappath; /* for INCLUDEs */ if (loadMapInternal(map) != MS_SUCCESS) { msFreeMap(map); msReleaseLock(TLOCK_PARSER); if (mappath != NULL) free(mappath); return NULL; } if (mappath != NULL) free(mappath); msyylex_destroy(); msReleaseLock(TLOCK_PARSER); applyStyleItemToLayer(map); if (debuglevel >= MS_DEBUGLEVEL_TUNING) { /* In debug mode, report time spent loading/parsing mapfile. */ msGettimeofday(&endtime, NULL); msDebug("msLoadMapFromString(): %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } if (resolveSymbolNames(map) == MS_FAILURE) return NULL; return map; } /* ** Sets up file-based mapfile loading and calls loadMapInternal to do the work. */ mapObj *msLoadMap(const char *filename, const char *new_mappath, const configObj *config) { mapObj *map; struct mstimeval starttime = {0}, endtime = {0}; char szPath[MS_MAXPATHLEN], szCWDPath[MS_MAXPATHLEN]; int debuglevel; debuglevel = (int)msGetGlobalDebugLevel(); if (debuglevel >= MS_DEBUGLEVEL_TUNING) { /* In debug mode, track time spent loading/parsing mapfile. */ msGettimeofday(&starttime, NULL); } if (!filename) { msSetError(MS_MISCERR, "Filename is undefined.", "msLoadMap()"); return (NULL); } const char *ms_mapfile_pattern = CPLGetConfigOption("MS_MAPFILE_PATTERN", MS_DEFAULT_MAPFILE_PATTERN); if (msEvalRegex(ms_mapfile_pattern, filename) != MS_TRUE) { msSetError(MS_REGEXERR, "Filename validation failed.", "msLoadMap()"); return (NULL); } /* ** Allocate mapObj structure */ map = (mapObj *)calloc(1, sizeof(mapObj)); MS_CHECK_ALLOC(map, sizeof(mapObj), NULL); if (initMap(map) == -1) { /* initialize this map */ msFreeMap(map); return (NULL); } map->config = config; // create a read-only reference msAcquireLock(TLOCK_PARSER); /* Steve: might need to move this lock a bit higher; Umberto: done */ #ifdef USE_XMLMAPFILE /* If the mapfile is an xml mapfile, transform it */ const char *ms_xmlmapfile_xslt = CPLGetConfigOption("MS_XMLMAPFILE_XSLT", NULL); if (ms_xmlmapfile_xslt && (msEvalRegex(MS_DEFAULT_XMLMAPFILE_PATTERN, filename) == MS_TRUE)) { msyyin = tmpfile(); if (msyyin == NULL) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "tmpfile() failed to create temporary file", "msLoadMap()"); msReleaseLock(TLOCK_PARSER); msFreeMap(map); return NULL; } if (msTransformXmlMapfile(ms_xmlmapfile_xslt, filename, msyyin) != MS_SUCCESS) { fclose(msyyin); msFreeMap(map); return NULL; } fseek(msyyin, 0, SEEK_SET); } else { #endif if ((msyyin = fopen(filename, "r")) == NULL) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "(%s)", "msLoadMap()", filename); msReleaseLock(TLOCK_PARSER); msFreeMap(map); return NULL; } #ifdef USE_XMLMAPFILE } #endif msyystate = MS_TOKENIZE_FILE; msyylex(); /* sets things up, but doesn't process any tokens */ msyyrestart(msyyin); /* start at line beginning, line 1 */ msyylineno = 1; /* If new_mappath is provided then use it, otherwise use the location */ /* of the mapfile as the default path */ if (!msGetCWD(szCWDPath, MS_MAXPATHLEN, "msLoadMap()")) { msReleaseLock(TLOCK_PARSER); msFreeMap(map); return NULL; } if (new_mappath) map->mappath = msStrdup(msBuildPath(szPath, szCWDPath, new_mappath)); else { char *path = msGetPath(filename); map->mappath = msStrdup(msBuildPath(szPath, szCWDPath, path)); free(path); } msyybasepath = map->mappath; /* for INCLUDEs */ if (loadMapInternal(map) != MS_SUCCESS) { msFreeMap(map); if (msyyin) { msyycleanup_includes(); fclose(msyyin); msyyin = NULL; } msReleaseLock(TLOCK_PARSER); return NULL; } msReleaseLock(TLOCK_PARSER); applyStyleItemToLayer(map); if (debuglevel >= MS_DEBUGLEVEL_TUNING) { /* In debug mode, report time spent loading/parsing mapfile. */ msGettimeofday(&endtime, NULL); msDebug("msLoadMap(): %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } return map; } static void hashTableSubstituteString(hashTableObj *hash, const char *from, const char *to) { const char *key, *val; char *new_val; key = msFirstKeyFromHashTable(hash); while (key != NULL) { val = msLookupHashTable(hash, key); if (strcasestr(val, from)) { new_val = msCaseReplaceSubstring(msStrdup(val), from, to); msInsertHashTable(hash, key, new_val); msFree(new_val); } key = msNextKeyFromHashTable(hash, key); } } static void classSubstituteString(classObj *class, const char *from, const char *to) { if (class->expression.string) class->expression.string = msCaseReplaceSubstring(class->expression.string, from, to); if (class->text.string) class->text.string = msCaseReplaceSubstring(class->text.string, from, to); if (class->title) class->title = msCaseReplaceSubstring(class->title, from, to); } static void layerSubstituteString(layerObj *layer, const char *from, const char *to) { int c; if (layer->data) layer->data = msCaseReplaceSubstring(layer->data, from, to); if (layer->tileindex) layer->tileindex = msCaseReplaceSubstring(layer->tileindex, from, to); if (layer->connection) layer->connection = msCaseReplaceSubstring(layer->connection, from, to); if (layer->filter.string) layer->filter.string = msCaseReplaceSubstring(layer->filter.string, from, to); if (layer->mask) layer->mask = msCaseReplaceSubstring(layer->mask, from, to); // new for 8.0 /* The bindvalues are most useful when able to substitute values from the URL */ hashTableSubstituteString(&layer->bindvals, from, to); hashTableSubstituteString(&layer->metadata, from, to); msLayerSubstituteProcessing(layer, from, to); for (c = 0; c < layer->numclasses; c++) { classSubstituteString(layer->class[c], from, to); } } static void mapSubstituteString(mapObj *map, const char *from, const char *to) { int l; for (l = 0; l < map->numlayers; l++) { layerSubstituteString(GET_LAYER(map, l), from, to); } /* output formats (#3751) */ for (l = 0; l < map->numoutputformats; l++) { int o; for (o = 0; o < map->outputformatlist[l]->numformatoptions; o++) { map->outputformatlist[l]->formatoptions[o] = msCaseReplaceSubstring( map->outputformatlist[l]->formatoptions[o], from, to); } } hashTableSubstituteString(&map->web.metadata, from, to); if (map->web.template) map->web.template = msCaseReplaceSubstring(map->web.template, from, to); } static void applyOutputFormatDefaultSubstitutions(outputFormatObj *format, const char *option, hashTableObj *table) { const char *filename; filename = msGetOutputFormatOption(format, option, NULL); if (filename && strlen(filename) > 0) { char *tmpfilename = msStrdup(filename); const char *default_key = msFirstKeyFromHashTable(table); while (default_key) { if (!strncasecmp(default_key, "default_", 8)) { char *new_filename = NULL; size_t buffer_size = (strlen(default_key) - 5); char *tag = (char *)msSmallMalloc(buffer_size); snprintf(tag, buffer_size, "%%%s%%", &(default_key[8])); new_filename = msStrdup(tmpfilename); new_filename = msCaseReplaceSubstring( new_filename, tag, msLookupHashTable(table, default_key)); free(tag); msSetOutputFormatOption(format, option, new_filename); free(new_filename); } default_key = msNextKeyFromHashTable(table, default_key); } msFree(tmpfilename); } return; } static void applyClassDefaultSubstitutions(classObj *class, hashTableObj *table) { const char *default_key = msFirstKeyFromHashTable(table); while (default_key) { if (!strncasecmp(default_key, "default_", 8)) { size_t buffer_size = (strlen(default_key) - 5); char *tag = (char *)msSmallMalloc(buffer_size); snprintf(tag, buffer_size, "%%%s%%", &(default_key[8])); classSubstituteString(class, tag, msLookupHashTable(table, default_key)); free(tag); } default_key = msNextKeyFromHashTable(table, default_key); } return; } static void applyLayerDefaultSubstitutions(layerObj *layer, hashTableObj *table) { int i; const char *default_key = msFirstKeyFromHashTable(table); while (default_key) { if (!strncasecmp(default_key, "default_", 8)) { size_t buffer_size = (strlen(default_key) - 5); const char *to = msLookupHashTable(table, default_key); char *tag = (char *)msSmallMalloc(buffer_size); snprintf(tag, buffer_size, "%%%s%%", &(default_key[8])); for (i = 0; i < layer->numclasses; i++) { classSubstituteString(layer->class[i], tag, to); } layerSubstituteString(layer, tag, to); free(tag); } default_key = msNextKeyFromHashTable(table, default_key); } return; } static void applyHashTableDefaultSubstitutions(hashTableObj *hashTab, hashTableObj *table) { const char *default_key = msFirstKeyFromHashTable(table); while (default_key) { if (!strncasecmp(default_key, "default_", 8)) { size_t buffer_size = (strlen(default_key) - 5); const char *to = msLookupHashTable(table, default_key); char *tag = (char *)msSmallMalloc(buffer_size); snprintf(tag, buffer_size, "%%%s%%", &(default_key[8])); hashTableSubstituteString(hashTab, tag, to); free(tag); } default_key = msNextKeyFromHashTable(table, default_key); } return; } /* ** Loop through layer metadata for keys that have a default_%key% pattern to *replace ** remaining %key% entries by their default value. */ void msApplyDefaultSubstitutions(mapObj *map) { int i, j; /* output formats (#3751) */ for (i = 0; i < map->numoutputformats; i++) { applyOutputFormatDefaultSubstitutions(map->outputformatlist[i], "filename", &(map->web.validation)); applyOutputFormatDefaultSubstitutions(map->outputformatlist[i], "JSONP", &(map->web.validation)); } for (i = 0; i < map->numlayers; i++) { layerObj *layer = GET_LAYER(map, i); for (j = 0; j < layer->numclasses; j++) { /* class settings take precedence... */ classObj *class = GET_CLASS(map, i, j); applyClassDefaultSubstitutions(class, &(class->validation)); } applyLayerDefaultSubstitutions( layer, &(layer->validation)); /* ...then layer settings... */ applyLayerDefaultSubstitutions( layer, &(map->web.validation)); /* ...and finally web settings */ } applyHashTableDefaultSubstitutions(&map->web.metadata, &(map->web.validation)); } char *_get_param_value(const char *key, char **names, char **values, int npairs) { if (npairs <= 0) return NULL; // bail, no point searching if (getenv(key)) { /* environment override */ return getenv(key); } while (npairs) { npairs--; if (strcasecmp(key, names[npairs]) == 0) { return values[npairs]; } } return NULL; } void msApplySubstitutions(mapObj *map, char **names, char **values, int npairs) { int l; const char *key, *value, *validation; char *tag; for (l = 0; l < map->numlayers; l++) { int c; layerObj *lp = GET_LAYER(map, l); for (c = 0; c < lp->numclasses; c++) { classObj *cp = lp->class[c]; key = NULL; while ((key = msNextKeyFromHashTable(&cp->validation, key))) { value = _get_param_value(key, names, values, npairs); if (!value) continue; /*parameter was not in url*/ validation = msLookupHashTable(&cp->validation, key); if (msEvalRegex(validation, value)) { /* we've found a substitution and it validates correctly, now let's * apply it */ tag = msSmallMalloc(strlen(key) + 3); sprintf(tag, "%%%s%%", key); classSubstituteString(cp, tag, value); free(tag); } else { msSetError(MS_REGEXERR, "Parameter pattern validation failed.", "msApplySubstitutions()"); if (map->debug || lp->debug) { msDebug("layer (%s), class %d: failed to validate (%s=%s) for " "regex (%s)\n", lp->name, c, key, value, validation); } } } } key = NULL; while ((key = msNextKeyFromHashTable(&lp->validation, key))) { value = _get_param_value(key, names, values, npairs); if (!value) continue; /*parameter was not in url*/ validation = msLookupHashTable(&lp->validation, key); if (msEvalRegex(validation, value)) { /* we've found a substitution and it validates correctly, now let's * apply it */ tag = msSmallMalloc(strlen(key) + 3); sprintf(tag, "%%%s%%", key); layerSubstituteString(lp, tag, value); free(tag); } else { msSetError(MS_REGEXERR, "Parameter pattern validation failed.", "msApplySubstitutions()"); if (map->debug || lp->debug) { msDebug("layer (%s): failed to validate (%s=%s) for regex (%s)\n", lp->name, key, value, validation); } } } } key = NULL; while ((key = msNextKeyFromHashTable(&map->web.validation, key))) { value = _get_param_value(key, names, values, npairs); if (!value) continue; /*parameter was not in url*/ validation = msLookupHashTable(&map->web.validation, key); if (msEvalRegex(validation, value)) { /* we've found a substitution and it validates correctly, now let's apply * it */ tag = msSmallMalloc(strlen(key) + 3); sprintf(tag, "%%%s%%", key); mapSubstituteString(map, tag, value); free(tag); } else { msSetError(MS_REGEXERR, "Parameter pattern validation failed.", "msApplySubstitutions()"); if (map->debug) { msDebug("failed to validate (%s=%s) for regex (%s)\n", key, value, validation); } } } } /* ** Returns an array with one entry per mapfile token. Useful to manipulate ** mapfiles in MapScript. ** ** The returned array should be freed using msFreeCharArray(). */ static char **tokenizeMapInternal(char *filename, int *ret_numtokens) { char **tokens = NULL; int numtokens = 0, numtokens_allocated = 0; size_t buffer_size = 0; *ret_numtokens = 0; if (!filename) { msSetError(MS_MISCERR, "Filename is undefined.", "msTokenizeMap()"); return NULL; } /* ** Check map filename to make sure it's legal */ const char *ms_mapfile_pattern = CPLGetConfigOption("MS_MAPFILE_PATTERN", MS_DEFAULT_MAPFILE_PATTERN); if (msEvalRegex(ms_mapfile_pattern, filename) != MS_TRUE) { msSetError(MS_REGEXERR, "Filename validation failed.", "msTokenizeMap()"); return (NULL); } if ((msyyin = fopen(filename, "r")) == NULL) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "(%s)", "msTokenizeMap()", filename); return NULL; } msyystate = MS_TOKENIZE_FILE; /* restore lexer state to INITIAL, and do return comments */ msyylex(); msyyreturncomments = 1; /* want all tokens, including comments */ msyyrestart(msyyin); /* start at line beginning, line 1 */ msyylineno = 1; numtokens = 0; numtokens_allocated = 256; tokens = (char **)malloc(numtokens_allocated * sizeof(char *)); if (tokens == NULL) { msSetError(MS_MEMERR, NULL, "msTokenizeMap()"); fclose(msyyin); return NULL; } for (;;) { if (numtokens_allocated <= numtokens) { numtokens_allocated *= 2; /* double size of the array every time we reach the limit */ char **tokensNew = (char **)realloc(tokens, numtokens_allocated * sizeof(char *)); if (tokensNew == NULL) { msSetError(MS_MEMERR, "Realloc() error.", "msTokenizeMap()"); fclose(msyyin); for (int i = 0; i < numtokens; i++) msFree(tokens[i]); msFree(tokens); return NULL; } tokens = tokensNew; } switch (msyylex()) { case (EOF): /* This is the normal way out... cleanup and exit */ fclose(msyyin); *ret_numtokens = numtokens; return (tokens); break; case (MS_STRING): buffer_size = strlen(msyystring_buffer) + 2 + 1; tokens[numtokens] = (char *)msSmallMalloc(buffer_size); snprintf(tokens[numtokens], buffer_size, "\"%s\"", msyystring_buffer); break; case (MS_EXPRESSION): buffer_size = strlen(msyystring_buffer) + 2 + 1; tokens[numtokens] = (char *)msSmallMalloc(buffer_size); snprintf(tokens[numtokens], buffer_size, "(%s)", msyystring_buffer); break; case (MS_REGEX): buffer_size = strlen(msyystring_buffer) + 2 + 1; tokens[numtokens] = (char *)msSmallMalloc(buffer_size); snprintf(tokens[numtokens], buffer_size, "/%s/", msyystring_buffer); break; default: tokens[numtokens] = msStrdup(msyystring_buffer); break; } if (tokens[numtokens] == NULL) { int i; msSetError(MS_MEMERR, NULL, "msTokenizeMap()"); fclose(msyyin); for (i = 0; i < numtokens; i++) msFree(tokens[i]); msFree(tokens); return NULL; } numtokens++; } return NULL; /* should never get here */ } /* ** Wraps tokenizeMapInternal */ char **msTokenizeMap(char *filename, int *numtokens) { char **tokens; msAcquireLock(TLOCK_PARSER); tokens = tokenizeMapInternal(filename, numtokens); msReleaseLock(TLOCK_PARSER); return tokens; } void msCloseConnections(mapObj *map) { int i; layerObj *lp; for (i = 0; i < map->numlayers; i++) { lp = (GET_LAYER(map, i)); /* If the vtable is null, then the layer is never accessed or used -> skip * it */ if (lp->vtable) { lp->vtable->LayerCloseConnection(lp); } } } void initResultCache(resultCacheObj *resultcache) { if (resultcache) { resultcache->results = NULL; resultcache->numresults = 0; resultcache->cachesize = 0; resultcache->bounds.minx = resultcache->bounds.miny = resultcache->bounds.maxx = resultcache->bounds.maxy = -1; resultcache->previousBounds = resultcache->bounds; } } void cleanupResultCache(resultCacheObj *resultcache) { if (resultcache) { if (resultcache->results) { int i; for (i = 0; i < resultcache->numresults; i++) { if (resultcache->results[i].shape) { msFreeShape(resultcache->results[i].shape); msFree(resultcache->results[i].shape); } } free(resultcache->results); } resultcache->results = NULL; initResultCache(resultcache); } } static int resolveSymbolNames(mapObj *map) { int i, j; /* step through layers and classes to resolve symbol names */ for (i = 0; i < map->numlayers; i++) { for (j = 0; j < GET_LAYER(map, i)->numclasses; j++) { if (classResolveSymbolNames(GET_LAYER(map, i)->class[j]) != MS_SUCCESS) return MS_FAILURE; } } return MS_SUCCESS; } mapserver-8.4.0/src/mapfile.dtd000066400000000000000000000154241474174441300164470ustar00rootroot00000000000000 mapserver-8.4.0/src/mapfile.h000066400000000000000000000154351474174441300161250ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Keyword definitions for the mapfiles and symbolfiles. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPFILE_H #define MAPFILE_H enum MS_LEXER_STATES { MS_TOKENIZE_DEFAULT = 0, MS_TOKENIZE_FILE, MS_TOKENIZE_STRING, MS_TOKENIZE_EXPRESSION, MS_TOKENIZE_VALUE, MS_TOKENIZE_NAME, MS_TOKENIZE_CONFIG }; enum MS_TOKEN_SOURCES { MS_FILE_TOKENS = 0, MS_STRING_TOKENS }; /* ** Keyword definitions for the mapfiles and symbolfiles (used by lexer) */ #define ANGLE 1000 #define ANTIALIAS 1001 #define BACKGROUNDCOLOR 1002 #define BUFFER 1003 #define CLASS 1004 #define CLASSITEM 1005 #define COLOR 1006 #define DATA 1007 #define DD 1008 #define EMPTY 1010 #define END 1011 #define ERROR 1012 #define EXPRESSION 1013 #define EXTENT 1014 #define FEATURE 1015 #define FILLED 1016 #define FOOTER 1017 #define FONT 1018 #define FONTSET 1019 #define FROM 1020 #define GROUP 1021 #define HEADER 1022 #define IMAGE 1023 #define IMAGECOLOR 1024 #define IMAGEPATH 1025 #define IMAGEURL 1026 #define INDEX 1027 #define INTERLACE 1028 #define INTERVALS 1029 #define JOIN 1030 #define KEYSIZE 1031 #define KEYSPACING 1032 #define LABEL 1033 #define LABELCACHE 1035 #define LABELITEM 1036 #define LABELMAXSCALE 1037 #define LABELMINSCALE 1038 #define LAYER 1040 #define LEGEND 1041 #define LOG 1043 #define MAP 1044 #define MAXFEATURES 1047 #define MAXSCALE 1048 #define MAXSIZE 1049 #define MAXTEMPLATE 1050 #define MINDISTANCE 1051 #define MINFEATURESIZE 1053 #define MINSCALE 1054 #define MINSIZE 1055 #define MINTEMPLATE 1056 #define NAME 1057 #define NFTEMPLATE 1058 #define OFFSET 1060 #define OFFSITE 1061 #define OUTLINECOLOR 1062 #define PARTIALS 1063 #define POINTS 1064 #define POSITION 1065 #define POSTLABELCACHE 1098 #define PROJECTION 1066 #define QUERY 1067 #define QUERYITEM 1068 #define QUERYMAP 1069 #define REFERENCE 1070 #define SCALE 1071 #define SCALEBAR 1072 #define SHADOWCOLOR 1074 #define SHADOWSIZE 1075 #define SHAPEPATH 1076 #define SIZE 1077 #define STATUS 1078 #define STYLE 1080 #define SYMBOL 1081 #define SYMBOLSCALE 1082 #define TABLE 1083 #define TEMPLATE 1084 #define TEXT 1085 #define TEXTITEM 1086 #define TILEINDEX 1088 #define TILEITEM 1089 #define TOLERANCE 1090 #define TO 1091 #define TRANSPARENT 1092 #define TRANSFORM 1093 #define TYPE 1094 #define UNITS 1095 #define WEB 1096 #define WRAP 1097 #define FORCE 1098 #define TOLERANCEUNITS 1099 #define CHARACTER 1100 #define CONNECTION 1101 #define CONNECTIONTYPE 1102 #define SYMBOLSET 1105 #define IMAGETYPE 1113 #define IMAGEQUALITY 1114 #define GAP 1115 #define FILTER 1116 #define FILTERITEM 1117 #define REQUIRES 1118 #define LABELREQUIRES 1119 #define METADATA 1120 #define LATLON 1121 #define RESOLUTION 1122 #define SIZEUNITS 1123 #define STYLEITEM 1124 #define TITLE 1126 #define LINECAP 1127 #define LINEJOIN 1128 #define LINEJOINMAXSIZE 1129 #define TRANSPARENCY 1130 #define MARKER 1131 #define MARKERSIZE 1132 #define MINBOXSIZE 1133 #define MAXBOXSIZE 1134 #define OUTPUTFORMAT 1135 #define MIMETYPE 1136 #define DRIVER 1137 #define IMAGEMODE 1138 #define FORMATOPTION 1139 #define GRATICULE 1140 #define GRID 1141 #define MAXARCS 1142 #define MINARCS 1143 #define MAXINTERVAL 1144 #define MININTERVAL 1145 #define MAXSUBDIVIDE 1146 #define MINSUBDIVIDE 1147 #define LABELFORMAT 1148 #define PROCESSING 1153 /* The DEBUG macro is also used to request debugging output. Redefine for keyword purposes. */ #ifdef DEBUG #undef DEBUG #endif #define DEBUG 1154 #define EXTENSION 1155 #define KEYIMAGE 1156 #define QUERYFORMAT 1157 #define CONFIG 1158 #define BANDSITEM 1159 #define ENCODING 1162 #define WIDTH 1163 #define MINWIDTH 1164 #define MAXWIDTH 1165 #define OUTLINEWIDTH 1166 /* Color Range support (was Gradient Support)*/ #define COLORRANGE 1170 #define DATARANGE 1172 #define RANGEITEM 1173 /* WKT support (bug 1466) */ #define WKT 1180 #define LEGENDFORMAT 1190 /* bug 1518 */ #define BROWSEFORMAT 1191 #define RELATIVETO 1192 #define OPACITY 1193 #define PRIORITY 1194 #define PATTERN 1195 #define MAXSCALEDENOM 1196 #define MINSCALEDENOM 1197 #define LABELMAXSCALEDENOM 1198 #define LABELMINSCALEDENOM 1199 #define SYMBOLSCALEDENOM 1200 #define SCALEDENOM 1201 #define CLASSGROUP 1202 #define ALIGN 1203 /* bug 2468 */ #define MAXGEOWIDTH 1204 #define MINGEOWIDTH 1205 #define ITEMS 1206 /* rfc40 label wrapping */ #define MAXLENGTH 1210 /* rfc44 URL configuration support */ #define VALIDATION 1212 /* rfc48 geometry transforms */ #define GEOMTRANSFORM 1220 /* rfc55 output resolution */ #define DEFRESOLUTION 1221 /* label repeat enhancement */ #define REPEATDISTANCE 1222 /* rfc60 label collision detection */ #define MAXOVERLAPANGLE 1223 /* rfc66 temporary path */ #define TEMPPATH 1224 /* rfc68 union connection type */ #define UNION 1225 /* rfc69 cluster */ #define CLUSTER 1226 #define MAXDISTANCE 1227 #define REGION 1228 #define INITIALGAP 1229 #define ANCHORPOINT 1230 #define MASK 1250 #define POLAROFFSET 1251 /* rfc78 leader-lines labels */ #define LEADER 1260 #define GRIDSTEP 1261 /* rfc 86 scale-dependant token substitutions */ #define SCALETOKEN 1270 #define VALUES 1271 #define TILESRS 1272 /* rfc 93 support for utfgrid */ #define UTFDATA 1280 #define UTFITEM 1281 /* rfc 113 layer compositing */ #define COMPOSITE 1290 #define COMPOP 1291 #define COMPFILTER 1292 #define BOM 1300 /* rfc59 bindvals objects */ #define BINDVALS 2000 #define CONNECTIONOPTIONS 2001 #endif /* MAPFILE_H */ mapserver-8.4.0/src/mapflatgeobuf.c000066400000000000000000000257461474174441300173250ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implements support for FlatGeobuf access. * Authors: Björn Harrtell * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #define NEED_IGNORE_RET_VAL #include #include #include "mapserver.h" #include "mapows.h" #include "flatgeobuf/flatgeobuf_c.h" #include #include static void msFGBPassThroughFieldDefinitions(layerObj *layer, flatgeobuf_ctx *ctx) { for (int i = 0; i < ctx->columns_len; i++) { char item[255]; char gml_width[32], gml_precision[32]; const char *gml_type = NULL; const flatgeobuf_column *column = &(ctx->columns[i]); strncpy(item, column->name, 255 - 1); gml_width[0] = '\0'; gml_precision[0] = '\0'; switch (column->type) { case flatgeobuf_column_type_byte: case flatgeobuf_column_type_ubyte: case flatgeobuf_column_type_bool: case flatgeobuf_column_type_short: case flatgeobuf_column_type_ushort: case flatgeobuf_column_type_int: case flatgeobuf_column_type_uint: gml_type = "Integer"; sprintf(gml_width, "%d", 4); break; case flatgeobuf_column_type_long: case flatgeobuf_column_type_ulong: gml_type = "Long"; sprintf(gml_width, "%d", 8); break; case flatgeobuf_column_type_float: case flatgeobuf_column_type_double: gml_type = "Real"; sprintf(gml_width, "%d", 8); sprintf(gml_precision, "%d", 15); break; case flatgeobuf_column_type_string: case flatgeobuf_column_type_json: case flatgeobuf_column_type_datetime: default: gml_type = "Character"; sprintf(gml_width, "%d", 4096); break; } msUpdateGMLFieldMetadata(layer, item, gml_type, gml_width, gml_precision, 0); } } void msFlatGeobufLayerFreeItemInfo(layerObj *layer) { if (layer->iteminfo) { free(layer->iteminfo); layer->iteminfo = NULL; } } int msFlatGeobufLayerInitItemInfo(layerObj *layer) { if (!layer->layerinfo) { msSetError(MS_FGBERR, "FlatGeobuf layer has not been opened.", "msFlatGeobufLayerInitItemInfo()"); return MS_FAILURE; } msFlatGeobufLayerFreeItemInfo(layer); flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; for (int j = 0; j < ctx->columns_len; j++) { ctx->columns[j].itemindex = -1; for (int i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], ctx->columns[j].name) == 0) { ctx->columns[j].itemindex = i; break; } } } return MS_SUCCESS; } int msFlatGeobufLayerOpen(layerObj *layer) { char szPath[MS_MAXPATHLEN]; int ret; if (layer->layerinfo) return MS_SUCCESS; if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; flatgeobuf_ctx *ctx = flatgeobuf_init_ctx(); layer->layerinfo = ctx; ctx->file = VSIFOpenL(msBuildPath(szPath, layer->map->mappath, layer->data), "rb"); if (!ctx->file) ctx->file = VSIFOpenL(msBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, layer->data), "rb"); if (!ctx->file) { layer->layerinfo = NULL; flatgeobuf_free_ctx(ctx); return MS_FAILURE; } ret = flatgeobuf_check_magicbytes(ctx); if (ret == -1) { layer->layerinfo = NULL; flatgeobuf_free_ctx(ctx); return MS_FAILURE; } ret = flatgeobuf_decode_header(ctx); if (ret == -1) { layer->layerinfo = NULL; flatgeobuf_free_ctx(ctx); return MS_FAILURE; } if (layer->projection.numargs > 0 && EQUAL(layer->projection.args[0], "auto")) { OGRSpatialReferenceH hSRS = OSRNewSpatialReference(NULL); char *pszWKT = NULL; if (ctx->srid > 0) { if (OSRImportFromEPSG(hSRS, ctx->srid) != OGRERR_NONE) { OSRDestroySpatialReference(hSRS); flatgeobuf_free_ctx(ctx); return MS_FAILURE; } if (OSRExportToWkt(hSRS, &pszWKT) != OGRERR_NONE) { OSRDestroySpatialReference(hSRS); flatgeobuf_free_ctx(ctx); return MS_FAILURE; } } else if (ctx->wkt == NULL) { OSRDestroySpatialReference(hSRS); return MS_SUCCESS; } int bOK = MS_FALSE; if (msOGCWKT2ProjectionObj(ctx->wkt ? ctx->wkt : pszWKT, &(layer->projection), layer->debug) == MS_SUCCESS) bOK = MS_TRUE; CPLFree(pszWKT); OSRDestroySpatialReference(hSRS); if (bOK != MS_TRUE) if (layer->debug || layer->map->debug) msDebug("Unable to get SRS from FlatGeobuf '%s' for layer '%s'.\n", szPath, layer->name); } return MS_SUCCESS; } int msFlatGeobufLayerIsOpen(layerObj *layer) { if (layer->layerinfo) return MS_TRUE; else return MS_FALSE; } int msFlatGeobufLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)isQuery; flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; if (!ctx->has_extent || !ctx->index_node_size) return MS_SUCCESS; if (msRectOverlap(&ctx->bounds, &rect) != MS_TRUE) return MS_DONE; if (msRectContained(&ctx->bounds, &rect) == MS_FALSE && ctx->index_node_size > 0) { flatgeobuf_index_search(ctx, &rect); if (ctx->search_result_len == 0) return MS_DONE; } else { flatgeobuf_index_skip(ctx); } return MS_SUCCESS; } int msFlatGeobufLayerNextShape(layerObj *layer, shapeObj *shape) { flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; do { if (ctx->search_result) { if (ctx->search_index >= ctx->search_result_len) return MS_DONE; flatgeobuf_search_item item = ctx->search_result[ctx->search_index]; if (VSIFSeekL(ctx->file, ctx->feature_offset + item.offset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Unable to seek in file", "msFlatGeobufLayerNextShape"); return MS_FAILURE; } ctx->offset = ctx->feature_offset + item.offset; ctx->search_index++; ctx->feature_index = item.index; } int ret = flatgeobuf_decode_feature(ctx, layer, shape); if (ret == -1) return MS_FAILURE; shape->index = ctx->feature_index; if (!ctx->search_result) ctx->feature_index++; if (ctx->done) return MS_DONE; if (ctx->is_null_geom) { msFreeCharArray(shape->values, shape->numvalues); shape->values = NULL; } } while (ctx->is_null_geom); return MS_SUCCESS; } int msFlatGeobufLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { (void)shape; (void)record; flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; long i = record->shapeindex; if (i < 0 || (uint64_t)i >= ctx->features_count) { msSetError(MS_MISCERR, "Invalid feature id", "msFlatGeobufLayerGetShape"); return MS_FAILURE; } uint64_t offset; flatgeobuf_read_feature_offset(ctx, i, &offset); if (VSIFSeekL(ctx->file, ctx->feature_offset + offset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Unable to seek in file", "msFlatGeobufLayerGetShape"); return MS_FAILURE; } int ret = flatgeobuf_decode_feature(ctx, layer, shape); if (ret == -1) return MS_FAILURE; return MS_SUCCESS; } int msFlatGeobufLayerClose(layerObj *layer) { flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_SUCCESS; VSIFCloseL(ctx->file); flatgeobuf_free_ctx(ctx); layer->layerinfo = NULL; return MS_SUCCESS; } int msFlatGeobufLayerGetItems(layerObj *layer) { const char *value; flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; layer->numitems = ctx->columns_len; char **items = (char **)malloc(sizeof(char *) * ctx->columns_len); for (int i = 0; i < ctx->columns_len; i++) items[i] = msStrdup(ctx->columns[i].name); layer->items = items; if ((value = msOWSLookupMetadata(&(layer->metadata), "G", "types")) != NULL && strcasecmp(value, "auto") == 0) msFGBPassThroughFieldDefinitions(layer, ctx); return msLayerInitItemInfo(layer); } int msFlatGeobufLayerGetExtent(layerObj *layer, rectObj *extent) { flatgeobuf_ctx *ctx; ctx = layer->layerinfo; extent->minx = ctx->xmin; extent->miny = ctx->ymin; extent->maxx = ctx->xmax; extent->maxy = ctx->ymax; return MS_SUCCESS; } int msFlatGeobufLayerSupportsCommonFilters(layerObj *layer) { (void)layer; return MS_TRUE; } int msFlatGeobufLayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); layer->vtable->LayerSupportsCommonFilters = msFlatGeobufLayerSupportsCommonFilters; layer->vtable->LayerInitItemInfo = msFlatGeobufLayerInitItemInfo; layer->vtable->LayerFreeItemInfo = msFlatGeobufLayerFreeItemInfo; layer->vtable->LayerOpen = msFlatGeobufLayerOpen; layer->vtable->LayerIsOpen = msFlatGeobufLayerIsOpen; layer->vtable->LayerWhichShapes = msFlatGeobufLayerWhichShapes; layer->vtable->LayerNextShape = msFlatGeobufLayerNextShape; layer->vtable->LayerGetShape = msFlatGeobufLayerGetShape; /* layer->vtable->LayerGetShapeCount, use default */ layer->vtable->LayerClose = msFlatGeobufLayerClose; layer->vtable->LayerGetItems = msFlatGeobufLayerGetItems; layer->vtable->LayerGetExtent = msFlatGeobufLayerGetExtent; /* layer->vtable->LayerGetAutoStyle, use default */ /* layer->vtable->LayerCloseConnection, use default */ layer->vtable->LayerSetTimeFilter = msLayerMakeBackticsTimeFilter; /* layer->vtable->LayerTranslateFilter, use default */ /* layer->vtable->LayerApplyFilterToLayer, use default */ /* layer->vtable->LayerCreateItems, use default */ /* layer->vtable->LayerGetNumFeatures, use default */ return MS_SUCCESS; } mapserver-8.4.0/src/mapflatgeobuf.h000066400000000000000000000033101474174441300173110ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: FlatGeobuf access API * Author: Björn Harrtell. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPFLATGEOBUF_H #define MAPFLATGEOBUF_H #include #include "mapprimitive.h" #include "mapproject.h" #include "cpl_vsi.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* MAPFLATGEOBUF_H */ mapserver-8.4.0/src/mapgdal.cpp000066400000000000000000000632541474174441300164520ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of support for output using GDAL. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2002, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "mapthread.h" #include "mapgdal.h" #include #include "cpl_conv.h" #include "cpl_string.h" #include "ogr_srs_api.h" #include "gdal.h" static int bGDALInitialized = 0; /************************************************************************/ /* msGDALInitialize() */ /************************************************************************/ void msGDALInitialize(void) { if (!bGDALInitialized) { msAcquireLock(TLOCK_GDAL); GDALAllRegister(); CPLPushErrorHandler(CPLQuietErrorHandler); msReleaseLock(TLOCK_GDAL); bGDALInitialized = 1; } } /************************************************************************/ /* msGDALCleanup() */ /************************************************************************/ void msGDALCleanup(void) { if (bGDALInitialized) { int iRepeat = 5; /* ** Cleanup any unreferenced but open datasets as will tend ** to exist due to deferred close requests. We are careful ** to only close one file at a time before reflecting the ** list as closing some datasets may cause others to be ** closed (subdatasets in a VRT for instance). */ GDALDatasetH *pahDSList = NULL; int nDSCount = 0; int bDidSomething; msAcquireLock(TLOCK_GDAL); do { int i; GDALGetOpenDatasets(&pahDSList, &nDSCount); bDidSomething = FALSE; for (i = 0; i < nDSCount && !bDidSomething; i++) { if (GDALReferenceDataset(pahDSList[i]) == 1) { GDALClose(pahDSList[i]); bDidSomething = TRUE; } else GDALDereferenceDataset(pahDSList[i]); } } while (bDidSomething); while (iRepeat--) CPLPopErrorHandler(); msReleaseLock(TLOCK_GDAL); bGDALInitialized = 0; } } /************************************************************************/ /* msCleanVSIDir() */ /* */ /* For the temporary /vsimem/msout directory we need to be sure */ /* things are clean before we start, and after we are done. */ /************************************************************************/ void msCleanVSIDir(const char *pszDir) { char **papszFiles = CPLReadDir(pszDir); int i, nFileCount = CSLCount(papszFiles); for (i = 0; i < nFileCount; i++) { if (strcasecmp(papszFiles[i], ".") == 0 || strcasecmp(papszFiles[i], "..") == 0) continue; VSIUnlink(CPLFormFilename(pszDir, papszFiles[i], NULL)); } CSLDestroy(papszFiles); } /************************************************************************/ /* msSaveImageGDAL() */ /************************************************************************/ int msSaveImageGDAL(mapObj *map, imageObj *image, const char *filenameIn) { int bFileIsTemporary = MS_FALSE; GDALDatasetH hMemDS, hOutputDS; GDALDriverH hMemDriver, hOutputDriver; int nBands = 1; int iLine; outputFormatObj *format = image->format; rasterBufferObj rb; GDALDataType eDataType = GDT_Byte; int bUseXmp = MS_FALSE; const char *filename = NULL; char *filenameToFree = NULL; const char *gdal_driver_shortname = format->driver + 5; msGDALInitialize(); memset(&rb, 0, sizeof(rasterBufferObj)); #ifdef USE_EXEMPI if (map != NULL) { bUseXmp = msXmpPresent(map); } #endif /* -------------------------------------------------------------------- */ /* Identify the proposed output driver. */ /* -------------------------------------------------------------------- */ msAcquireLock(TLOCK_GDAL); hOutputDriver = GDALGetDriverByName(gdal_driver_shortname); if (hOutputDriver == NULL) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Failed to find %s driver.", "msSaveImageGDAL()", gdal_driver_shortname); return MS_FAILURE; } /* -------------------------------------------------------------------- */ /* We will need to write the output to a temporary file and */ /* then stream to stdout if no filename is passed. If the */ /* driver supports virtualio then we hold the temporary file in */ /* memory, otherwise we try to put it in a reasonable temporary */ /* file location. */ /* -------------------------------------------------------------------- */ if (filenameIn == NULL) { const char *pszExtension = format->extension; if (pszExtension == NULL) pszExtension = "img.tmp"; if (bUseXmp == MS_FALSE && msGDALDriverSupportsVirtualIOOutput(hOutputDriver)) { msCleanVSIDir("/vsimem/msout"); filenameToFree = msTmpFile(map, NULL, "/vsimem/msout/", pszExtension); } if (filenameToFree == NULL && map != NULL) filenameToFree = msTmpFile(map, map->mappath, NULL, pszExtension); else if (filenameToFree == NULL) { filenameToFree = msTmpFile(map, NULL, NULL, pszExtension); } filename = filenameToFree; bFileIsTemporary = MS_TRUE; } else { filename = filenameIn; } /* -------------------------------------------------------------------- */ /* Establish the characteristics of our memory, and final */ /* dataset. */ /* -------------------------------------------------------------------- */ if (format->imagemode == MS_IMAGEMODE_RGB) { nBands = 3; assert(MS_RENDERER_PLUGIN(format) && format->vtable->supports_pixel_buffer); if (MS_UNLIKELY(MS_FAILURE == format->vtable->getRasterBufferHandle(image, &rb))) { msReleaseLock(TLOCK_GDAL); msFree(filenameToFree); return MS_FAILURE; } } else if (format->imagemode == MS_IMAGEMODE_RGBA) { nBands = 4; assert(MS_RENDERER_PLUGIN(format) && format->vtable->supports_pixel_buffer); if (MS_UNLIKELY(MS_FAILURE == format->vtable->getRasterBufferHandle(image, &rb))) { msReleaseLock(TLOCK_GDAL); msFree(filenameToFree); return MS_FAILURE; } } else if (format->imagemode == MS_IMAGEMODE_INT16) { nBands = format->bands; eDataType = GDT_Int16; } else if (format->imagemode == MS_IMAGEMODE_FLOAT32) { nBands = format->bands; eDataType = GDT_Float32; } else if (format->imagemode == MS_IMAGEMODE_BYTE) { nBands = format->bands; eDataType = GDT_Byte; } else { msReleaseLock(TLOCK_GDAL); msSetError(MS_MEMERR, "Unknown format. This is a bug.", "msSaveImageGDAL()"); msFree(filenameToFree); return MS_FAILURE; } /* -------------------------------------------------------------------- */ /* Create a memory dataset which we can use as a source for a */ /* CreateCopy(). */ /* -------------------------------------------------------------------- */ hMemDriver = GDALGetDriverByName("MEM"); if (hMemDriver == NULL) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Failed to find MEM driver.", "msSaveImageGDAL()"); msFree(filenameToFree); return MS_FAILURE; } hMemDS = GDALCreate(hMemDriver, "msSaveImageGDAL_temp", image->width, image->height, nBands, eDataType, NULL); if (hMemDS == NULL) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Failed to create MEM dataset.", "msSaveImageGDAL()"); msFree(filenameToFree); return MS_FAILURE; } /* -------------------------------------------------------------------- */ /* Copy the gd image into the memory dataset. */ /* -------------------------------------------------------------------- */ for (iLine = 0; iLine < image->height; iLine++) { int iBand; for (iBand = 0; iBand < nBands; iBand++) { CPLErr eErr; GDALRasterBandH hBand = GDALGetRasterBand(hMemDS, iBand + 1); if (format->imagemode == MS_IMAGEMODE_INT16) { eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, image->img.raw_16bit + iLine * image->width + iBand * image->width * image->height, image->width, 1, GDT_Int16, 2, 0); } else if (format->imagemode == MS_IMAGEMODE_FLOAT32) { eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, image->img.raw_float + iLine * image->width + iBand * image->width * image->height, image->width, 1, GDT_Float32, 4, 0); } else if (format->imagemode == MS_IMAGEMODE_BYTE) { eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, image->img.raw_byte + iLine * image->width + iBand * image->width * image->height, image->width, 1, GDT_Byte, 1, 0); } else { GByte *pabyData; unsigned char *pixptr = NULL; assert(rb.type == MS_BUFFER_BYTE_RGBA); switch (iBand) { case 0: pixptr = rb.data.rgba.r; break; case 1: pixptr = rb.data.rgba.g; break; case 2: pixptr = rb.data.rgba.b; break; case 3: pixptr = rb.data.rgba.a; break; } assert(pixptr); if (pixptr == NULL) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Missing RGB or A buffer.\n", "msSaveImageGDAL()"); GDALClose(hMemDS); msFree(filenameToFree); return MS_FAILURE; } pabyData = (GByte *)(pixptr + iLine * rb.data.rgba.row_step); if (rb.data.rgba.a == NULL || iBand == 3) { eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, pabyData, image->width, 1, GDT_Byte, rb.data.rgba.pixel_step, 0); } else { /* We need to un-pre-multiple RGB by alpha. */ GByte *pabyUPM = (GByte *)malloc(image->width); GByte *pabyAlpha = (GByte *)(rb.data.rgba.a + iLine * rb.data.rgba.row_step); int i; for (i = 0; i < image->width; i++) { int alpha = pabyAlpha[i * rb.data.rgba.pixel_step]; if (alpha == 0) pabyUPM[i] = 0; else { int result = (pabyData[i * rb.data.rgba.pixel_step] * 255) / alpha; if (result > 255) result = 255; pabyUPM[i] = result; } } eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, pabyUPM, image->width, 1, GDT_Byte, 1, 0); free(pabyUPM); } } if (eErr != CE_None) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "GDALRasterIO() failed.\n", "msSaveImageGDAL()"); GDALClose(hMemDS); msFree(filenameToFree); return MS_FAILURE; } } } /* -------------------------------------------------------------------- */ /* Attach the palette if appropriate. */ /* -------------------------------------------------------------------- */ if (format->imagemode == MS_IMAGEMODE_RGB) { GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 1), GCI_RedBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 2), GCI_GreenBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 3), GCI_BlueBand); } else if (format->imagemode == MS_IMAGEMODE_RGBA) { GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 1), GCI_RedBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 2), GCI_GreenBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 3), GCI_BlueBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 4), GCI_AlphaBand); } /* -------------------------------------------------------------------- */ /* Assign the projection and coordinate system to the memory */ /* dataset. */ /* -------------------------------------------------------------------- */ if (map != NULL) { char *pszWKT; GDALSetGeoTransform(hMemDS, map->gt.geotransform); pszWKT = msProjectionObj2OGCWKT(&(map->projection)); if (pszWKT != NULL) { GDALSetProjection(hMemDS, pszWKT); msFree(pszWKT); } } /* -------------------------------------------------------------------- */ /* Possibly assign a nodata value. */ /* -------------------------------------------------------------------- */ const char *nullvalue = msGetOutputFormatOption(format, "NULLVALUE", NULL); if (nullvalue != NULL) { const double dfNullValue = atof(nullvalue); for (int iBand = 0; iBand < nBands; iBand++) { GDALRasterBandH hBand = GDALGetRasterBand(hMemDS, iBand + 1); GDALSetRasterNoDataValue(hBand, dfNullValue); } } /* -------------------------------------------------------------------- */ /* Try to save resolution in the output file. */ /* -------------------------------------------------------------------- */ if (image->resolution > 0) { char res[30]; snprintf(res, sizeof(res), "%lf", image->resolution); GDALSetMetadataItem(hMemDS, "TIFFTAG_XRESOLUTION", res, NULL); GDALSetMetadataItem(hMemDS, "TIFFTAG_YRESOLUTION", res, NULL); GDALSetMetadataItem(hMemDS, "TIFFTAG_RESOLUTIONUNIT", "2", NULL); } /* -------------------------------------------------------------------- */ /* Separate creation options from metadata items. */ /* -------------------------------------------------------------------- */ std::vector apszCreationOptions; for (int i = 0; i < format->numformatoptions; i++) { char *option = format->formatoptions[i]; // MDI stands for MetaDataItem if (STARTS_WITH(option, "mdi_")) { const char *option_without_band = option + strlen("mdi_"); GDALMajorObjectH hObject = (GDALMajorObjectH)hMemDS; if (STARTS_WITH(option_without_band, "BAND_")) { int nBandNumber = atoi(option_without_band + strlen("BAND_")); if (nBandNumber > 0 && nBandNumber <= nBands) { const char *pszAfterBand = strchr(option_without_band + strlen("BAND_"), '_'); if (pszAfterBand != NULL) { hObject = (GDALMajorObjectH)GDALGetRasterBand(hMemDS, nBandNumber); option_without_band = pszAfterBand + 1; } } else { msDebug("Invalid band number %d in metadata item option %s", nBandNumber, option); } } if (hObject) { std::string osDomain(option_without_band); size_t nUnderscorePos = osDomain.find('_'); if (nUnderscorePos != std::string::npos) { std::string osKeyValue = osDomain.substr(nUnderscorePos + 1); osDomain.resize(nUnderscorePos); if (osDomain == "default") osDomain.clear(); size_t nEqualPos = osKeyValue.find('='); if (nEqualPos != std::string::npos) { GDALSetMetadataItem( hObject, osKeyValue.substr(0, nEqualPos).c_str(), osKeyValue.substr(nEqualPos + 1).c_str(), osDomain.c_str()); } } else { msDebug("Invalid format in metadata item option %s", option); } } } else { apszCreationOptions.emplace_back(option); } } apszCreationOptions.emplace_back(nullptr); /* -------------------------------------------------------------------- */ /* Create a disk image in the selected output format from the */ /* memory image. */ /* -------------------------------------------------------------------- */ hOutputDS = GDALCreateCopy(hOutputDriver, filename, hMemDS, FALSE, &apszCreationOptions[0], NULL, NULL); if (hOutputDS == NULL) { GDALClose(hMemDS); msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Failed to create output %s file.\n%s", "msSaveImageGDAL()", format->driver + 5, CPLGetLastErrorMsg()); msFree(filenameToFree); return MS_FAILURE; } /* closing the memory DS also frees all associated resources. */ GDALClose(hMemDS); GDALClose(hOutputDS); msReleaseLock(TLOCK_GDAL); /* -------------------------------------------------------------------- */ /* Are we writing license info into the image? */ /* If so, add it to the temp file on disk now. */ /* -------------------------------------------------------------------- */ #ifdef USE_EXEMPI if (bUseXmp == MS_TRUE) { if (msXmpWrite(map, filename) == MS_FAILURE) { /* Something bad happened. */ msSetError(MS_MISCERR, "XMP write to %s failed.\n", "msSaveImageGDAL()", filename); msFree(filenameToFree); return MS_FAILURE; } } #endif /* -------------------------------------------------------------------- */ /* Is this supposed to be a temporary file? If so, stream to */ /* stdout and delete the file. */ /* -------------------------------------------------------------------- */ if (bFileIsTemporary) { VSILFILE *fp; unsigned char block[4000]; int bytes_read; if (msIO_needBinaryStdout() == MS_FAILURE) { msFree(filenameToFree); return MS_FAILURE; } /* We aren't sure how far back GDAL exports the VSI*L API, so we only use it if we suspect we need it. But we do need it if holding temporary file in memory. */ fp = VSIFOpenL(filename, "rb"); if (fp == NULL) { msSetError(MS_MISCERR, "Failed to open %s for streaming to stdout.", "msSaveImageGDAL()", filename); msFree(filenameToFree); return MS_FAILURE; } while ((bytes_read = VSIFReadL(block, 1, sizeof(block), fp)) > 0) msIO_fwrite(block, 1, bytes_read, stdout); VSIFCloseL(fp); VSIUnlink(filename); msCleanVSIDir("/vsimem/msout"); } msFree(filenameToFree); return MS_SUCCESS; } /************************************************************************/ /* msInitGDALOutputFormat() */ /************************************************************************/ int msInitDefaultGDALOutputFormat(outputFormatObj *format) { GDALDriverH hDriver; msGDALInitialize(); /* -------------------------------------------------------------------- */ /* check that this driver exists. Note visiting drivers should */ /* be pretty threadsafe so don't bother acquiring the GDAL */ /* lock. */ /* -------------------------------------------------------------------- */ hDriver = GDALGetDriverByName(format->driver + 5); if (hDriver == NULL) { msSetError(MS_MISCERR, "No GDAL driver named `%s' available.", "msInitGDALOutputFormat()", format->driver + 5); return MS_FAILURE; } if (GDALGetMetadataItem(hDriver, GDAL_DCAP_CREATE, NULL) == NULL && GDALGetMetadataItem(hDriver, GDAL_DCAP_CREATECOPY, NULL) == NULL) { msSetError(MS_MISCERR, "GDAL `%s' driver does not support output.", "msInitGDALOutputFormat()", format->driver + 5); return MS_FAILURE; } /* -------------------------------------------------------------------- */ /* Initialize the object. */ /* -------------------------------------------------------------------- */ format->imagemode = MS_IMAGEMODE_RGB; format->renderer = MS_RENDER_WITH_AGG; if (GDALGetMetadataItem(hDriver, GDAL_DMD_MIMETYPE, NULL) != NULL) format->mimetype = msStrdup(GDALGetMetadataItem(hDriver, GDAL_DMD_MIMETYPE, NULL)); if (GDALGetMetadataItem(hDriver, GDAL_DMD_EXTENSION, NULL) != NULL) format->extension = msStrdup(GDALGetMetadataItem(hDriver, GDAL_DMD_EXTENSION, NULL)); return MS_SUCCESS; } char **msGetStringListFromHashTable(hashTableObj *table) { struct hashObj *tp = NULL; int i; char **papszRet = NULL; if (!table) return NULL; if (msHashIsEmpty(table)) return NULL; for (i = 0; i < MS_HASHSIZE; ++i) { if (table->items[i] != NULL) { for (tp = table->items[i]; tp != NULL; tp = tp->next) { papszRet = CSLSetNameValue(papszRet, tp->key, tp->data); } } } return papszRet; } /************************************************************************/ /* msProjectionObj2OGCWKT() */ /* */ /* We stick to the C API for OGRSpatialReference object access */ /* to allow MapServer+GDAL to be built without C++ */ /* complications. */ /* */ /* Note that this function will return NULL on failure, and the */ /* returned string should be freed with msFree(). */ /************************************************************************/ char *msProjectionObj2OGCWKT(projectionObj *projection) { OGRSpatialReferenceH hSRS; char *pszWKT = NULL, *pszProj4, *pszInitEpsg = NULL; int nLength = 0, i; OGRErr eErr; if (projection->proj == NULL) return NULL; hSRS = OSRNewSpatialReference(NULL); /* -------------------------------------------------------------------- */ /* Look for an EPSG-like projection argument */ /* -------------------------------------------------------------------- */ if ((projection->numargs == 1 || (projection->numargs == 2 && strstr(projection->args[1], "epsgaxis=") != NULL)) && (pszInitEpsg = strcasestr(projection->args[0], "init=epsg:"))) { int nEpsgCode = atoi(pszInitEpsg + strlen("init=epsg:")); eErr = OSRImportFromEPSG(hSRS, nEpsgCode); } else { /* -------------------------------------------------------------------- */ /* Form arguments into a full Proj.4 definition string. */ /* -------------------------------------------------------------------- */ for (i = 0; i < projection->numargs; i++) nLength += strlen(projection->args[i]) + 2; pszProj4 = (char *)CPLMalloc(nLength + 2); pszProj4[0] = '\0'; for (i = 0; i < projection->numargs; i++) { strcat(pszProj4, "+"); strcat(pszProj4, projection->args[i]); strcat(pszProj4, " "); } /* -------------------------------------------------------------------- */ /* Ingest the string into OGRSpatialReference. */ /* -------------------------------------------------------------------- */ eErr = OSRImportFromProj4(hSRS, pszProj4); CPLFree(pszProj4); } /* -------------------------------------------------------------------- */ /* Export as a WKT string. */ /* -------------------------------------------------------------------- */ if (eErr == OGRERR_NONE) OSRExportToWkt(hSRS, &pszWKT); OSRDestroySpatialReference(hSRS); if (pszWKT) { char *pszWKT2 = msStrdup(pszWKT); CPLFree(pszWKT); return pszWKT2; } else return NULL; } /************************************************************************/ /* msGDALDriverSupportsVirtualIOOutput() */ /************************************************************************/ int msGDALDriverSupportsVirtualIOOutput(GDALDriverH hDriver) { /* We need special testing here for the netCDF driver, since recent */ /* GDAL versions advertise VirtualIO support, but this is only for the */ /* read-side of the driver, not the write-side. */ return GDALGetMetadataItem(hDriver, GDAL_DCAP_VIRTUALIO, NULL) != NULL && !EQUAL(GDALGetDescription(hDriver), "netCDF"); } mapserver-8.4.0/src/mapgdal.h000066400000000000000000000033311474174441300161050ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: GDAL interface * Author: Even Rouault * ****************************************************************************** * Copyright (c) 2020, Even Rouault * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPGDAL_H #define MAPGDAL_H #include "mapserver.h" #include "gdal.h" #ifdef __cplusplus extern "C" { #endif int msGDALDriverSupportsVirtualIOOutput(GDALDriverH hDriver); #ifdef __cplusplus } #endif #endif /* MAPGDAL_H */ mapserver-8.4.0/src/mapgeomtransform.c000066400000000000000000000263351474174441300200650ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: RFC48 implementation of geometry transformations for styling * Author: Thomas Bonfort , Camptocamp (thomas.bonfort at camptocamp.com) * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "mapthread.h" extern int yyparse(parseObj *p); void msStyleSetGeomTransform(styleObj *s, const char *transform) { if (!transform) { msFree(s->_geomtransform.string); s->_geomtransform.string = NULL; s->_geomtransform.type = MS_GEOMTRANSFORM_NONE; return; } if (!strncasecmp("start", transform, 5)) { s->_geomtransform.type = MS_GEOMTRANSFORM_START; } else if (!strncasecmp("end", transform, 3)) { s->_geomtransform.type = MS_GEOMTRANSFORM_END; } else if (!strncasecmp("vertices", transform, 8)) { s->_geomtransform.type = MS_GEOMTRANSFORM_VERTICES; } else if (!strncasecmp("bbox", transform, 4)) { s->_geomtransform.type = MS_GEOMTRANSFORM_BBOX; } else if (!strncasecmp("labelpnt", transform, 8)) { s->_geomtransform.type = MS_GEOMTRANSFORM_LABELPOINT; } else if (!strncasecmp("labelpoly", transform, 9)) { s->_geomtransform.type = MS_GEOMTRANSFORM_LABELPOLY; } else if (!strncasecmp("labelcenter", transform, 11)) { s->_geomtransform.type = MS_GEOMTRANSFORM_LABELCENTER; } else if (!strncasecmp("centroid", transform, 8)) { s->_geomtransform.type = MS_GEOMTRANSFORM_CENTROID; } else { s->_geomtransform.type = MS_GEOMTRANSFORM_NONE; msSetError(MS_MISCERR, "unknown transform expression", "msStyleSetGeomTransform()"); msFree(s->_geomtransform.string); s->_geomtransform.string = NULL; return; } msFree(s->_geomtransform.string); s->_geomtransform.string = msStrdup(transform); } /* * return a copy of the geometry transform expression * returned char* must be freed by the caller */ char *msStyleGetGeomTransform(styleObj *s) { return msStrdup(s->_geomtransform.string); } double calcOrientation(pointObj *p1, pointObj *p2) { double theta; theta = atan2(p2->x - p1->x, p2->y - p1->y); return MS_RAD_TO_DEG * (theta - MS_PI2); } double calcMidAngle(pointObj *p1, pointObj *p2, pointObj *p3) { pointObj p1n; double dx12, dy12, dx23, dy23, l12, l23; /* We treat both segments as vector 1-2 and vector 2-3 and * compute their dx,dy and length */ dx12 = p2->x - p1->x; dy12 = p2->y - p1->y; l12 = sqrt(dx12 * dx12 + dy12 * dy12); dx23 = p3->x - p2->x; dy23 = p3->y - p2->y; l23 = sqrt(dx23 * dx23 + dy23 * dy23); /* Normalize length of vector 1-2 to same as length of vector 2-3 */ if (l12 > 0.0) { p1n.x = p2->x - dx12 * (l23 / l12); p1n.y = p2->y - dy12 * (l23 / l12); } else p1n = *p2; /* segment 1-2 is 0-length, use segment 2-3 for orientation */ /* Return the orientation defined by the sum of the normalized vectors */ return calcOrientation(&p1n, p3); } /* * RFC48 implementation: * - transform the original shapeobj * - use the styleObj to render the transformed shapeobj */ int msDrawTransformedShape(mapObj *map, imageObj *image, shapeObj *shape, styleObj *style, double scalefactor) { int type = style->_geomtransform.type; int i, j, status = MS_SUCCESS; switch (type) { case MS_GEOMTRANSFORM_END: /*render point on last vertex only*/ for (j = 0; j < shape->numlines; j++) { lineObj *line = &(shape->line[j]); pointObj *p = &(line->point[line->numpoints - 1]); if (p->x < 0 || p->x > image->width || p->y < 0 || p->y > image->height) continue; if (style->autoangle == MS_TRUE && line->numpoints > 1) { style->angle = calcOrientation(&(line->point[line->numpoints - 2]), p); } status = msDrawMarkerSymbol(map, image, p, style, scalefactor); } break; case MS_GEOMTRANSFORM_START: /*render point on first vertex only*/ for (j = 0; j < shape->numlines; j++) { lineObj *line = &(shape->line[j]); pointObj *p = &(line->point[0]); /*skip if outside image*/ if (p->x < 0 || p->x > image->width || p->y < 0 || p->y > image->height) continue; if (style->autoangle == MS_TRUE && line->numpoints > 1) { style->angle = calcOrientation(p, &(line->point[1])); } status = msDrawMarkerSymbol(map, image, p, style, scalefactor); } break; case MS_GEOMTRANSFORM_VERTICES: for (j = 0; j < shape->numlines; j++) { lineObj *line = &(shape->line[j]); for (i = 1; i < line->numpoints - 1; i++) { pointObj *p = &(line->point[i]); /*skip points outside image*/ if (p->x < 0 || p->x > image->width || p->y < 0 || p->y > image->height) continue; if (style->autoangle == MS_TRUE) { style->angle = calcMidAngle(&(line->point[i - 1]), &(line->point[i]), &(line->point[i + 1])); } status = msDrawMarkerSymbol(map, image, p, style, scalefactor); } } break; case MS_GEOMTRANSFORM_BBOX: { shapeObj bbox; lineObj bbox_line; pointObj bbox_points[5]; int padding = MS_MAX(style->width, style->size) + 3; /* so clipped shape does not extent into image */ /*create a shapeObj representing the bounding box (clipped by the image * size)*/ bbox.numlines = 1; bbox.line = &bbox_line; bbox.line->numpoints = 5; bbox.line->point = bbox_points; msComputeBounds(shape); bbox_points[0].x = bbox_points[4].x = bbox_points[1].x = (shape->bounds.minx < -padding) ? -padding : shape->bounds.minx; /* cppcheck-suppress unreadVariable */ bbox_points[2].x = bbox_points[3].x = (shape->bounds.maxx > image->width + padding) ? image->width + padding : shape->bounds.maxx; bbox_points[0].y = bbox_points[4].y = bbox_points[3].y = (shape->bounds.miny < -padding) ? -padding : shape->bounds.miny; /* cppcheck-suppress unreadVariable */ bbox_points[1].y = bbox_points[2].y = (shape->bounds.maxy > image->height + padding) ? image->height + padding : shape->bounds.maxy; status = msDrawShadeSymbol(map, image, &bbox, style, scalefactor); } break; case MS_GEOMTRANSFORM_CENTROID: { double unused; /*used by centroid function*/ pointObj centroid; if (MS_SUCCESS == msGetPolygonCentroid(shape, ¢roid, &unused, &unused)) { status = msDrawMarkerSymbol(map, image, ¢roid, style, scalefactor); } } break; case MS_GEOMTRANSFORM_EXPRESSION: { int status; shapeObj *tmpshp; parseObj p; p.shape = shape; /* set a few parser globals (hence the lock) */ p.expr = &(style->_geomtransform); if (p.expr->tokens == NULL) { /* this could happen if drawing originates from legend code (#5193) */ status = msTokenizeExpression(p.expr, NULL, NULL); if (status != MS_SUCCESS) { msSetError(MS_MISCERR, "Unable to tokenize expression.", "msDrawTransformedShape()"); return MS_FAILURE; } } p.expr->curtoken = p.expr->tokens; /* reset */ p.type = MS_PARSE_TYPE_SHAPE; status = yyparse(&p); if (status != 0) { msSetError(MS_PARSEERR, "Failed to process shape expression: %s", "msDrawTransformedShape", style->_geomtransform.string); return MS_FAILURE; } tmpshp = p.result.shpval; switch (tmpshp->type) { case MS_SHAPE_POINT: case MS_SHAPE_POLYGON: /* cppcheck-suppress unreadVariable */ status = msDrawShadeSymbol(map, image, tmpshp, style, scalefactor); break; case MS_SHAPE_LINE: /* cppcheck-suppress unreadVariable */ status = msDrawLineSymbol(map, image, tmpshp, style, scalefactor); break; } msFreeShape(tmpshp); msFree(tmpshp); } break; case MS_GEOMTRANSFORM_LABELPOINT: case MS_GEOMTRANSFORM_LABELPOLY: break; default: msSetError(MS_MISCERR, "unknown geomtransform", "msDrawTransformedShape()"); return MS_FAILURE; } return status; } /* * RFC89 implementation: * - transform directly the shapeobj */ int msGeomTransformShape(mapObj *map, layerObj *layer, shapeObj *shape) { int i; expressionObj *e = &layer->_geomtransform; #ifdef USE_V8_MAPSCRIPT if (!map->v8context) { msV8CreateContext(map); if (!map->v8context) { msSetError(MS_V8ERR, "Unable to create v8 context.", "msGeomTransformShape()"); return MS_FAILURE; } } msV8ContextSetLayer(map, layer); #endif switch (e->type) { case MS_GEOMTRANSFORM_EXPRESSION: { int status; shapeObj *tmpshp; parseObj p; p.shape = shape; /* set a few parser globals (hence the lock) */ p.expr = e; p.expr->curtoken = p.expr->tokens; /* reset */ p.type = MS_PARSE_TYPE_SHAPE; p.dblval = map->cellsize * (msInchesPerUnit(map->units, 0) / msInchesPerUnit(layer->units, 0)); p.dblval2 = 0; /* data_cellsize is only set with contour layer */ if (layer->connectiontype == MS_CONTOUR) { const char *value = msLookupHashTable(&layer->metadata, "__data_cellsize__"); if (value) p.dblval2 = atof(value); } status = yyparse(&p); if (status != 0) { msSetError(MS_PARSEERR, "Failed to process shape expression: %s", "msGeomTransformShape()", e->string); return MS_FAILURE; } tmpshp = p.result.shpval; for (i = 0; i < shape->numlines; i++) free(shape->line[i].point); shape->numlines = 0; if (shape->line) free(shape->line); shape->line = NULL; shape->type = tmpshp->type; /* might have been a change (e.g. centerline) */ for (i = 0; i < tmpshp->numlines; i++) msAddLine(shape, &(tmpshp->line[i])); /* copy each line */ msFreeShape(tmpshp); msFree(tmpshp); } break; default: msSetError(MS_MISCERR, "unknown geomtransform", "msGeomTransformShape()"); return MS_FAILURE; } return MS_SUCCESS; } mapserver-8.4.0/src/mapgeomutil.cpp000066400000000000000000000100521474174441300173540ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Rendering utility functions * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "renderers/agg/include/agg_arc.h" #include "renderers/agg/include/agg_basics.h" shapeObj *msRasterizeArc(double x0, double y0, double radius, double startAngle, double endAngle, int isSlice) { static int allocated_size = 100; shapeObj *shape = (shapeObj *)calloc(1, sizeof(shapeObj)); MS_CHECK_ALLOC(shape, sizeof(shapeObj), NULL); mapserver::arc arc(x0, y0, radius, radius, startAngle * MS_DEG_TO_RAD, endAngle * MS_DEG_TO_RAD, true); arc.approximation_scale(1); arc.rewind(1); msInitShape(shape); lineObj *line = (lineObj *)calloc(1, sizeof(lineObj)); if (!line) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msRasterizeArc()", __FILE__, __LINE__, (unsigned int)sizeof(lineObj)); free(shape); return NULL; } shape->line = line; shape->numlines = 1; line->point = (pointObj *)calloc(allocated_size, sizeof(pointObj)); if (!line->point) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msRasterizeArc()", __FILE__, __LINE__, (unsigned int)(allocated_size * sizeof(pointObj))); free(line); free(shape); return NULL; } line->numpoints = 0; double x, y; // first segment from center to first point of arc if (isSlice) { line->point[0].x = x0; line->point[0].y = y0; line->numpoints = 1; } while (arc.vertex(&x, &y) != mapserver::path_cmd_stop) { if (line->numpoints == allocated_size) { allocated_size *= 2; line->point = (pointObj *)realloc(line->point, allocated_size * sizeof(pointObj)); if (!line->point) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msRasterizeArc()", __FILE__, __LINE__, (unsigned int)(allocated_size * sizeof(pointObj))); free(line); free(shape); return NULL; } } line->point[line->numpoints].x = x; line->point[line->numpoints].y = y; line->numpoints++; } // make sure the shape is closed if (line->point[line->numpoints - 1].x != line->point[0].x || line->point[line->numpoints - 1].y != line->point[0].y) { if (line->numpoints == allocated_size) { allocated_size *= 2; line->point = (pointObj *)msSmallRealloc( line->point, allocated_size * sizeof(pointObj)); } line->point[line->numpoints].x = line->point[0].x; line->point[line->numpoints].y = line->point[0].y; line->numpoints++; } return shape; } mapserver-8.4.0/src/mapgeos.c000066400000000000000000001405431474174441300161350ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapServer-GEOS integration. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "mapgraph.h" #ifdef USE_GEOS // To avoid accidental use of non reentrant GEOS API. // (check only effective in GEOS >= 3.5) #define GEOS_USE_ONLY_R_API #include /* ** Error handling... */ static void msGEOSError(const char *format, ...) { va_list args; va_start(args, format); msSetError(MS_GEOSERR, format, "msGEOSError()", args); /* just pass along to MapServer error handling */ va_end(args); return; } static void msGEOSNotice(const char *fmt, ...) { (void)fmt; /* do nothing with notices at this point */ } #ifndef USE_THREAD static GEOSContextHandle_t geos_handle; static inline GEOSContextHandle_t msGetGeosContextHandle() { return geos_handle; } #else #include "mapthread.h" typedef struct geos_thread_info { struct geos_thread_info *next; void *thread_id; GEOSContextHandle_t geos_handle; } geos_thread_info_t; static geos_thread_info_t *geos_list = NULL; static GEOSContextHandle_t msGetGeosContextHandle() { geos_thread_info_t *link; GEOSContextHandle_t ret_obj; void *thread_id; msAcquireLock(TLOCK_GEOS); thread_id = msGetThreadId(); /* find link for this thread */ for (link = geos_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } /* If the target thread link is already at the head of the list were ok */ if (geos_list != NULL && geos_list->thread_id == thread_id) { } /* We don't have one ... initialize one. */ else if (link == NULL || link->next == NULL) { geos_thread_info_t *new_link; new_link = (geos_thread_info_t *)malloc(sizeof(geos_thread_info_t)); new_link->next = geos_list; new_link->thread_id = thread_id; new_link->geos_handle = initGEOS_r(msGEOSNotice, msGEOSError); geos_list = new_link; } /* If the link is not already at the head of the list, promote it */ else { geos_thread_info_t *target = link->next; link->next = link->next->next; target->next = geos_list; geos_list = target; } ret_obj = geos_list->geos_handle; msReleaseLock(TLOCK_GEOS); return ret_obj; } #endif /* ** Setup/Cleanup wrappers */ void msGEOSSetup() { #ifndef USE_THREAD geos_handle = initGEOS_r(msGEOSNotice, msGEOSError); #endif } void msGEOSCleanup() { #ifndef USE_THREAD finishGEOS_r(geos_handle); geos_handle = NULL; #else geos_thread_info_t *link; msAcquireLock(TLOCK_GEOS); for (link = geos_list; link != NULL;) { geos_thread_info_t *cur = link; link = link->next; finishGEOS_r(cur->geos_handle); free(cur); } geos_list = NULL; msReleaseLock(TLOCK_GEOS); #endif } /* ** Translation functions */ static GEOSGeom msGEOSShape2Geometry_point(pointObj *point) { GEOSCoordSeq coords; GEOSGeom g; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!point) return NULL; coords = GEOSCoordSeq_create_r(handle, 1, 2); /* todo handle z's */ if (!coords) return NULL; GEOSCoordSeq_setX_r(handle, coords, 0, point->x); GEOSCoordSeq_setY_r(handle, coords, 0, point->y); /* GEOSCoordSeq_setY(coords, 0, point->z); */ g = GEOSGeom_createPoint_r(handle, coords); /* g owns the coordinate in coords */ return g; } static GEOSGeom msGEOSShape2Geometry_multipoint(lineObj *multipoint) { int i; GEOSGeom g; GEOSGeom *points; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!multipoint) return NULL; points = malloc(multipoint->numpoints * sizeof(GEOSGeom)); if (!points) return NULL; for (i = 0; i < multipoint->numpoints; i++) points[i] = msGEOSShape2Geometry_point(&(multipoint->point[i])); g = GEOSGeom_createCollection_r(handle, GEOS_MULTIPOINT, points, multipoint->numpoints); free(points); return g; } static GEOSGeom msGEOSShape2Geometry_line(lineObj *line) { int i; GEOSGeom g; GEOSCoordSeq coords; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!line) return NULL; coords = GEOSCoordSeq_create_r(handle, line->numpoints, 2); /* todo handle z's */ if (!coords) return NULL; for (i = 0; i < line->numpoints; i++) { GEOSCoordSeq_setX_r(handle, coords, i, line->point[i].x); GEOSCoordSeq_setY_r(handle, coords, i, line->point[i].y); /* GEOSCoordSeq_setZ(coords, i, line->point[i].z); */ } g = GEOSGeom_createLineString_r( handle, coords); /* g owns the coordinates in coords */ return g; } static GEOSGeom msGEOSShape2Geometry_multiline(shapeObj *multiline) { int i; GEOSGeom g; GEOSGeom *lines; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!multiline) return NULL; lines = malloc(multiline->numlines * sizeof(GEOSGeom)); if (!lines) return NULL; for (i = 0; i < multiline->numlines; i++) lines[i] = msGEOSShape2Geometry_line(&(multiline->line[i])); g = GEOSGeom_createCollection_r(handle, GEOS_MULTILINESTRING, lines, multiline->numlines); free(lines); return g; } static GEOSGeom msGEOSShape2Geometry_simplepolygon(shapeObj *shape, int r, int *outerList) { int i, j, k; GEOSCoordSeq coords; GEOSGeom g; GEOSGeom outerRing; GEOSGeom *innerRings = NULL; int numInnerRings = 0, *innerList; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape || !outerList) return NULL; /* build the outer shell */ coords = GEOSCoordSeq_create_r(handle, shape->line[r].numpoints, 2); /* todo handle z's */ if (!coords) return NULL; for (i = 0; i < shape->line[r].numpoints; i++) { GEOSCoordSeq_setX_r(handle, coords, i, shape->line[r].point[i].x); GEOSCoordSeq_setY_r(handle, coords, i, shape->line[r].point[i].y); /* GEOSCoordSeq_setZ(coords, i, shape->line[r].point[i].z); */ } outerRing = GEOSGeom_createLinearRing_r( handle, coords); /* outerRing owns the coordinates in coords */ /* build the holes */ innerList = msGetInnerList(shape, r, outerList); for (j = 0; j < shape->numlines; j++) if (innerList[j] == MS_TRUE) numInnerRings++; if (numInnerRings > 0) { k = 0; /* inner ring counter */ innerRings = msSmallMalloc(numInnerRings * sizeof(GEOSGeom)); for (j = 0; j < shape->numlines; j++) { if (innerList[j] == MS_FALSE) continue; coords = GEOSCoordSeq_create_r(handle, shape->line[j].numpoints, 2); /* todo handle z's */ if (!coords) { free(innerRings); free(innerList); return NULL; /* todo, this will leak memory (shell + allocated holes) */ } for (i = 0; i < shape->line[j].numpoints; i++) { GEOSCoordSeq_setX_r(handle, coords, i, shape->line[j].point[i].x); GEOSCoordSeq_setY_r(handle, coords, i, shape->line[j].point[i].y); /* GEOSCoordSeq_setZ(coords, i, shape->line[j].point[i].z); */ } innerRings[k] = GEOSGeom_createLinearRing_r( handle, coords); /* innerRings[k] owns the coordinates in coords */ k++; } } g = GEOSGeom_createPolygon_r(handle, outerRing, innerRings, numInnerRings); free(innerList); /* clean up */ free(innerRings); /* clean up */ return g; } static GEOSGeom msGEOSShape2Geometry_polygon(shapeObj *shape) { int i, j; GEOSGeom *polygons; int *outerList, numOuterRings = 0, lastOuterRing = 0; GEOSGeom g; GEOSContextHandle_t handle = msGetGeosContextHandle(); outerList = msGetOuterList(shape); for (i = 0; i < shape->numlines; i++) { if (outerList[i] == MS_TRUE) { numOuterRings++; lastOuterRing = i; /* save for the simple case */ } } if (numOuterRings == 1) { g = msGEOSShape2Geometry_simplepolygon(shape, lastOuterRing, outerList); } else { /* a true multipolygon */ polygons = msSmallMalloc(numOuterRings * sizeof(GEOSGeom)); j = 0; /* part counter */ for (i = 0; i < shape->numlines; i++) { if (outerList[i] == MS_FALSE) continue; polygons[j] = msGEOSShape2Geometry_simplepolygon( shape, i, outerList); /* TODO: account for NULL return values */ j++; } g = GEOSGeom_createCollection_r(handle, GEOS_MULTIPOLYGON, polygons, numOuterRings); free(polygons); } free(outerList); return g; } GEOSGeom msGEOSShape2Geometry(shapeObj *shape) { if (!shape) return NULL; /* a NULL shape generates a NULL geometry */ switch (shape->type) { case MS_SHAPE_POINT: if (shape->numlines == 0 || shape->line[0].numpoints == 0) /* not enough info for a point */ return NULL; if (shape->line[0].numpoints == 1) /* simple point */ return msGEOSShape2Geometry_point(&(shape->line[0].point[0])); else /* multi-point */ return msGEOSShape2Geometry_multipoint(&(shape->line[0])); break; case MS_SHAPE_LINE: if (shape->numlines == 0 || shape->line[0].numpoints < 2) /* not enough info for a line */ return NULL; if (shape->numlines == 1) /* simple line */ return msGEOSShape2Geometry_line(&(shape->line[0])); else /* multi-line */ return msGEOSShape2Geometry_multiline(shape); break; case MS_SHAPE_POLYGON: if (shape->numlines == 0 || shape->line[0].numpoints < 4) /* not enough info for a polygon (first=last) */ return NULL; return msGEOSShape2Geometry_polygon( shape); /* simple and multipolygon cases are addressed */ break; default: break; } return NULL; /* should not get here */ } static shapeObj *msGEOSGeometry2Shape_point(GEOSGeom g) { GEOSCoordSeq coords; shapeObj *shape = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_POINT; shape->line = (lineObj *)malloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)malloc(sizeof(pointObj)); shape->line[0].numpoints = 1; shape->geometry = (GEOSGeom)g; coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, g); GEOSCoordSeq_getX_r(handle, coords, 0, &(shape->line[0].point[0].x)); GEOSCoordSeq_getY_r(handle, coords, 0, &(shape->line[0].point[0].y)); /* GEOSCoordSeq_getZ(coords, 0, &(shape->line[0].point[0].z)); */ shape->bounds.minx = shape->bounds.maxx = shape->line[0].point[0].x; shape->bounds.miny = shape->bounds.maxy = shape->line[0].point[0].y; return shape; } static shapeObj *msGEOSGeometry2Shape_multipoint(GEOSGeom g) { int i; int numPoints; GEOSCoordSeq coords; GEOSGeom point; shapeObj *shape = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; numPoints = GEOSGetNumGeometries_r(handle, g); /* each geometry has 1 point */ shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_POINT; shape->line = (lineObj *)malloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)malloc(sizeof(pointObj) * numPoints); shape->line[0].numpoints = numPoints; shape->geometry = (GEOSGeom)g; for (i = 0; i < numPoints; i++) { point = (GEOSGeom)GEOSGetGeometryN_r(handle, g, i); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, point); GEOSCoordSeq_getX_r(handle, coords, 0, &(shape->line[0].point[i].x)); GEOSCoordSeq_getY_r(handle, coords, 0, &(shape->line[0].point[i].y)); /* GEOSCoordSeq_getZ(coords, 0, &(shape->line[0].point[i].z)); */ } msComputeBounds(shape); return shape; } static shapeObj *msGEOSGeometry2Shape_line(GEOSGeom g) { shapeObj *shape = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); int i; int numPoints; GEOSCoordSeq coords; if (!g) return NULL; numPoints = GEOSGetNumCoordinates_r(handle, g); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, g); shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_LINE; shape->line = (lineObj *)malloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)malloc(sizeof(pointObj) * numPoints); shape->line[0].numpoints = numPoints; shape->geometry = (GEOSGeom)g; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(shape->line[0].point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(shape->line[0].point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(shape->line[0].point[i].z)); */ } msComputeBounds(shape); return shape; } static void msGEOSGeometry2Shape_multiline_part(GEOSContextHandle_t handle, GEOSGeom part, shapeObj *shape) { int i; int type, numGeometries, numPoints; GEOSCoordSeq coords; lineObj line; type = GEOSGeomTypeId_r(handle, part); if (type == GEOS_MULTILINESTRING) { numGeometries = GEOSGetNumGeometries_r(handle, part); for (i = 0; i < numGeometries; i++) { GEOSGeom subPart = (GEOSGeom)GEOSGetGeometryN_r(handle, part, i); msGEOSGeometry2Shape_multiline_part(handle, subPart, shape); } } else { numPoints = GEOSGetNumCoordinates_r(handle, part); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, part); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); } } static shapeObj *msGEOSGeometry2Shape_multiline(GEOSGeom g) { int i; int numGeometries; GEOSGeom part; shapeObj *shape = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; numGeometries = GEOSGetNumGeometries_r(handle, g); shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_LINE; shape->geometry = (GEOSGeom)g; for (i = 0; i < numGeometries; i++) { part = (GEOSGeom)GEOSGetGeometryN_r(handle, g, i); msGEOSGeometry2Shape_multiline_part(handle, part, shape); } msComputeBounds(shape); return shape; } static shapeObj *msGEOSGeometry2Shape_polygon(GEOSGeom g) { shapeObj *shape = NULL; lineObj line; int numPoints, numRings; int i, j; GEOSCoordSeq coords; GEOSGeom ring; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_POLYGON; shape->geometry = (GEOSGeom)g; /* exterior ring */ ring = (GEOSGeom)GEOSGetExteriorRing_r(handle, g); numPoints = GEOSGetNumCoordinates_r(handle, ring); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, ring); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); /* interior rings */ numRings = GEOSGetNumInteriorRings_r(handle, g); for (j = 0; j < numRings; j++) { ring = (GEOSGeom)GEOSGetInteriorRingN_r(handle, g, j); if (GEOSisRing_r(handle, ring) != 1) continue; /* skip it */ numPoints = GEOSGetNumCoordinates_r(handle, ring); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, ring); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); } msComputeBounds(shape); return shape; } static shapeObj *msGEOSGeometry2Shape_multipolygon(GEOSGeom g) { int i, j, k; shapeObj *shape = NULL; lineObj line; int numPoints, numRings, numPolygons; GEOSCoordSeq coords; GEOSGeom polygon, ring; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; numPolygons = GEOSGetNumGeometries_r(handle, g); shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_POLYGON; shape->geometry = (GEOSGeom)g; for (k = 0; k < numPolygons; k++) { /* for each polygon */ polygon = (GEOSGeom)GEOSGetGeometryN_r(handle, g, k); /* exterior ring */ ring = (GEOSGeom)GEOSGetExteriorRing_r(handle, polygon); numPoints = GEOSGetNumCoordinates_r(handle, ring); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, ring); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); /* interior rings */ numRings = GEOSGetNumInteriorRings_r(handle, polygon); for (j = 0; j < numRings; j++) { ring = (GEOSGeom)GEOSGetInteriorRingN_r(handle, polygon, j); if (GEOSisRing_r(handle, ring) != 1) continue; /* skip it */ numPoints = GEOSGetNumCoordinates_r(handle, ring); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, ring); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); } } /* next polygon */ msComputeBounds(shape); return shape; } shapeObj *msGEOSGeometry2Shape(GEOSGeom g) { int type; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; /* a NULL geometry generates a NULL shape */ type = GEOSGeomTypeId_r(handle, g); switch (type) { case GEOS_POINT: return msGEOSGeometry2Shape_point(g); break; case GEOS_MULTIPOINT: return msGEOSGeometry2Shape_multipoint(g); break; case GEOS_LINESTRING: return msGEOSGeometry2Shape_line(g); break; case GEOS_MULTILINESTRING: return msGEOSGeometry2Shape_multiline(g); break; case GEOS_POLYGON: return msGEOSGeometry2Shape_polygon(g); break; case GEOS_MULTIPOLYGON: return msGEOSGeometry2Shape_multipolygon(g); break; case GEOS_GEOMETRYCOLLECTION: if (!GEOSisEmpty_r(handle, g)) { shapeObj *shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_LINE; shape->geometry = (GEOSGeom)g; const int numGeoms = GEOSGetNumGeometries_r(handle, g); for (int i = 0; i < numGeoms; i++) { /* for each geometry */ shapeObj *shape2 = msGEOSGeometry2Shape((GEOSGeom)GEOSGetGeometryN_r(handle, g, i)); if (shape2) { for (int j = 0; j < shape2->numlines; j++) msAddLineDirectly(shape, &shape2->line[j]); shape2->numlines = 0; shape2->geometry = NULL; /* not owned */ msFreeShape(shape2); } } msComputeBounds(shape); return shape; } break; default: msSetError(MS_GEOSERR, "Unsupported GEOS geometry type (%d).", "msGEOSGeometry2Shape()", type); } return NULL; } #endif /* ** Maintenance functions exposed to MapServer/MapScript. */ void msGEOSFreeGeometry(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape || !shape->geometry) return; g = (GEOSGeom)shape->geometry; GEOSGeom_destroy_r(handle, g); shape->geometry = NULL; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSFreeGEOSGeom()"); return; #endif } /* ** WKT input and output functions */ shapeObj *msGEOSShapeFromWKT(const char *wkt) { #ifdef USE_GEOS GEOSGeom g; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!wkt) return NULL; g = GEOSGeomFromWKT_r(handle, wkt); if (!g) { msSetError(MS_GEOSERR, "Error reading WKT geometry \"%s\".", "msGEOSShapeFromWKT()", wkt); return NULL; } else { return msGEOSGeometry2Shape(g); } #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSShapeFromWKT()"); return NULL; #endif } /* Return should be freed with msGEOSFreeWKT */ char *msGEOSShapeToWKT(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; /* if we have a geometry, we should update it*/ msGEOSFreeGeometry(shape); shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g = (GEOSGeom)shape->geometry; if (!g) return NULL; return GEOSGeomToWKT_r(handle, g); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSShapeToWKT()"); return NULL; #endif } void msGEOSFreeWKT(char *pszGEOSWKT) { #ifdef USE_GEOS GEOSContextHandle_t handle = msGetGeosContextHandle(); #if GEOS_VERSION_MAJOR > 3 || \ (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 2) GEOSFree_r(handle, pszGEOSWKT); #endif #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSFreeWKT()"); #endif } shapeObj *msGEOSOffsetCurve(shapeObj *p, double offset) { #if defined USE_GEOS && (GEOS_VERSION_MAJOR > 3 || \ (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 3)) int typeChanged = 0; GEOSGeom g1, g2 = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!p) return NULL; /* * GEOSOffsetCurve_r() uses BufferBuilder.bufferLineSingleSided(), which * works with lines, naturally. In order to allow offsets for a MapServer * polygonObj, it has to be processed as line and afterwards reverted. */ if (p->type == MS_SHAPE_POLYGON) { p->type = MS_SHAPE_LINE; typeChanged = 1; msGEOSFreeGeometry(p); } if (typeChanged || !p->geometry) p->geometry = (GEOSGeom)msGEOSShape2Geometry(p); g1 = (GEOSGeom)p->geometry; if (!g1) return NULL; if (GEOSGeomTypeId_r(handle, g1) == GEOS_MULTILINESTRING) { GEOSGeom *lines = malloc(p->numlines * sizeof(GEOSGeom)); if (!lines) return NULL; for (int i = 0; i < p->numlines; i++) { lines[i] = GEOSOffsetCurve_r(handle, GEOSGetGeometryN_r(handle, g1, i), offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset * 1.5)); } g2 = GEOSGeom_createCollection_r(handle, GEOS_MULTILINESTRING, lines, p->numlines); free(lines); } else { g2 = GEOSOffsetCurve_r(handle, g1, offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset * 1.5)); } /* * Undo change of geometry type. We won't re-create the geos gemotry here, * it's up to each geos function to create it. */ if (typeChanged) { msGEOSFreeGeometry(p); p->type = MS_SHAPE_POLYGON; } if (g2) return msGEOSGeometry2Shape(g2); return NULL; #else msSetError(MS_GEOSERR, "GEOS Offset Curve support is not available.", "msGEOSingleSidedBuffer()"); return NULL; #endif } /* ** Analytical functions exposed to MapServer/MapScript. */ shapeObj *msGEOSBuffer(shapeObj *shape, double width) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSBuffer_r(handle, g1, width, 30); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSBuffer()"); return NULL; #endif } shapeObj *msGEOSSimplify(shapeObj *shape, double tolerance) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSSimplify_r(handle, g1, tolerance); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS Simplify support is not available.", "msGEOSSimplify()"); return NULL; #endif } shapeObj *msGEOSTopologyPreservingSimplify(shapeObj *shape, double tolerance) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSTopologyPreserveSimplify_r(handle, g1, tolerance); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS Simplify support is not available.", "msGEOSTopologyPreservingSimplify()"); return NULL; #endif } shapeObj *msGEOSConvexHull(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSConvexHull_r(handle, g1); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSConvexHull()"); return NULL; #endif } shapeObj *msGEOSBoundary(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSBoundary_r(handle, g1); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSBoundary()"); return NULL; #endif } pointObj *msGEOSGetCentroid(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSCoordSeq coords; pointObj *point; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSGetCentroid_r(handle, g1); if (!g2) return NULL; point = (pointObj *)malloc(sizeof(pointObj)); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, g2); GEOSCoordSeq_getX_r(handle, coords, 0, &(point->x)); GEOSCoordSeq_getY_r(handle, coords, 0, &(point->y)); /* GEOSCoordSeq_getZ(coords, 0, &(point->z)); */ GEOSGeom_destroy_r(handle, g2); return point; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSGetCentroid()"); return NULL; #endif } shapeObj *msGEOSUnion(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2, g3; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return NULL; if (!shape1->geometry) /* if no geometry for the shape then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return NULL; if (!shape2->geometry) /* if no geometry for the shape then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return NULL; g3 = GEOSUnion_r(handle, g1, g2); return msGEOSGeometry2Shape(g3); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSUnion()"); return NULL; #endif } shapeObj *msGEOSIntersection(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2, g3; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return NULL; if (!shape1->geometry) /* if no geometry for the shape then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return NULL; if (!shape2->geometry) /* if no geometry for the shape then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return NULL; g3 = GEOSIntersection_r(handle, g1, g2); return msGEOSGeometry2Shape(g3); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSIntersection()"); return NULL; #endif } shapeObj *msGEOSDifference(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2, g3; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return NULL; if (!shape1->geometry) /* if no geometry for the shape then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return NULL; if (!shape2->geometry) /* if no geometry for the shape then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return NULL; g3 = GEOSDifference_r(handle, g1, g2); return msGEOSGeometry2Shape(g3); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSDifference()"); return NULL; #endif } shapeObj *msGEOSSymDifference(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2, g3; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return NULL; if (!shape1->geometry) /* if no geometry for the shape then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return NULL; if (!shape2->geometry) /* if no geometry for the shape then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return NULL; g3 = GEOSSymDifference_r(handle, g1, g2); return msGEOSGeometry2Shape(g3); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSSymDifference()"); return NULL; #endif } shapeObj *msGEOSLineMerge(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (shape->type != MS_SHAPE_LINE) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSLineMerge_r(handle, g1); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSLineMerge()"); return NULL; #endif } shapeObj *msGEOSVoronoiDiagram(shapeObj *shape, double tolerance, int onlyEdges) { #if defined(USE_GEOS) && \ (GEOS_VERSION_MAJOR > 3 || \ (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 5)) GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSVoronoiDiagram_r(handle, g1, NULL, tolerance, onlyEdges); return msGEOSGeometry2Shape(g2); #else msSetError( MS_GEOSERR, "GEOS support is not available or GEOS version is not 3.5 or higher.", "msGEOSVoronoiDiagram()"); return NULL; #endif } static int keepEdge(lineObj *segment, shapeObj *polygon) { int i, j; if (segment->numpoints < 2) return MS_FALSE; if (msIntersectPointPolygon(&segment->point[0], polygon) != MS_TRUE) return MS_FALSE; if (msIntersectPointPolygon(&segment->point[1], polygon) != MS_TRUE) return MS_FALSE; for (i = 0; i < polygon->numlines; i++) for (j = 1; j < polygon->line[i].numpoints; j++) if (msIntersectSegments(&(segment->point[0]), &(segment->point[1]), &(polygon->line[i].point[j - 1]), &(polygon->line[i].point[j])) == MS_TRUE) return (MS_FALSE); return (MS_TRUE); } #define ARE_SAME_POINTS(a, b) \ (((a).x != (b).x || (a).y != (b).y) ? MS_FALSE : MS_TRUE) // returns the index of the node, we use z to store a count of points at the // same coordinate static int buildNodes(multipointObj *nodes, pointObj *point) { int i; for (i = 0; i < nodes->numpoints; i++) { if (ARE_SAME_POINTS(nodes->point[i], *point)) { // found it nodes->point[i].z++; return i; } } // not found, add it nodes->point[i].x = point->x; nodes->point[i].y = point->y; nodes->point[i].z = 1; nodes->numpoints++; return i; } shapeObj *msGEOSCenterline(shapeObj *shape) { #if defined(USE_GEOS) && \ (GEOS_VERSION_MAJOR > 3 || \ (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 5)) int i; shapeObj *shape2 = NULL; multipointObj nodes; graphObj *graph; int *path = NULL; // array of node indexes int path_size = 0; double path_dist = -1, max_path_dist = -1; if (!shape) return NULL; if (shape->type != MS_SHAPE_POLYGON) { msSetError(MS_GEOSERR, "Centerlines can only be computed for polygon shapes.", "msGEOSCenterline()"); return NULL; } shape2 = msGEOSVoronoiDiagram(shape, 0.0, MS_TRUE); if (!shape2) { msSetError(MS_GEOSERR, "Voronoi diagram generation failed.", "msGEOSCenterline()"); return NULL; } // process the edges and build a graph representation nodes.point = (pointObj *)malloc(shape2->numlines * sizeof(pointObj) * 2); nodes.numpoints = 0; if (!nodes.point) { msFreeShape(shape2); free(shape2); return NULL; } graph = msCreateGraph(shape2->numlines * 2); if (!graph) { msFreeShape(shape2); free(shape2); free(nodes.point); return NULL; } for (i = 0; i < shape2->numlines; i++) { if (keepEdge(&shape2->line[i], shape) == MS_TRUE) { int src = buildNodes(&nodes, &shape2->line[i].point[0]); int dest = buildNodes(&nodes, &shape2->line[i].point[1]); msGraphAddEdge(graph, src, dest, msDistancePointToPoint(&shape2->line[i].point[0], &shape2->line[i].point[1])); } } msFreeShape(shape2); // done with voronoi geometry, shape2 is still allocated // though, just empty shape2->type = MS_SHAPE_LINE; // will fill with centerline if (nodes.numpoints == 0) { msSetError(MS_GEOSERR, "Centerline generation failed, try densifying the shapes.", "msGEOSCenterline()"); free(shape2); msFreeGraph(graph); free(nodes.point); return NULL; } // step through edge nodes (z=1) for (i = 0; i < nodes.numpoints; i++) { if (nodes.point[i].z != 1) continue; // skip if (!path) { // first one, keep this path path = msGraphGetLongestShortestPath(graph, i, &path_size, &path_dist); max_path_dist = path_dist; } else { int *tmp_path = NULL; int tmp_path_size = 0; double tmp_path_dist = -1; if (i == path[path_size - 1]) continue; // skip, graph is bi-directional so it can't be any longer tmp_path = msGraphGetLongestShortestPath(graph, i, &tmp_path_size, &tmp_path_dist); if (tmp_path_dist > max_path_dist) { free(path); path = tmp_path; path_size = tmp_path_size; path_dist = tmp_path_dist; max_path_dist = tmp_path_dist; } else { // skip path msFree(tmp_path); } } } msFreeGraph(graph); // done with graph // transform the path into a shape if (!path) { msSetError(MS_GEOSERR, "Centerline generation failed.", "msGEOSCenterline()"); free(shape2); free(nodes.point); return NULL; } else { lineObj line; line.point = (pointObj *)malloc(path_size * sizeof(pointObj)); if (!line.point) { free(shape2); free(path); free(nodes.point); return NULL; } line.numpoints = path_size; for (i = 0; i < path_size; i++) { line.point[i].x = nodes.point[path[i]].x; line.point[i].y = nodes.point[path[i]].y; } msAddLineDirectly(shape2, &line); } free(path); // clean up free(nodes.point); return shape2; #else msSetError( MS_GEOSERR, "GEOS support is not available or GEOS version is not 3.5 or higher.", "msGEOSCenterline()"); return NULL; #endif } /* ** Binary predicates exposed to MapServer/MapScript */ /* ** Does shape1 contain shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSContains(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = shape2->geometry; if (!g2) return -1; result = GEOSContains_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSContains()"); return -1; #endif } /* ** Does shape1 overlap shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSOverlaps(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = shape2->geometry; if (!g2) return -1; result = GEOSOverlaps_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSOverlaps()"); return -1; #endif } /* ** Is shape1 within shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSWithin(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = shape2->geometry; if (!g2) return -1; result = GEOSWithin_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSWithin()"); return -1; #endif } /* ** Does shape1 cross shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSCrosses(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = shape2->geometry; if (!g2) return -1; result = GEOSCrosses_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSCrosses()"); return -1; #endif } /* ** Does shape1 intersect shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSIntersects(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSIntersects_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else if (!shape1 || !shape2) return -1; switch (shape1->type) { /* todo: deal with point shapes */ case (MS_SHAPE_LINE): switch (shape2->type) { case (MS_SHAPE_LINE): return msIntersectPolylines(shape1, shape2); case (MS_SHAPE_POLYGON): return msIntersectPolylinePolygon(shape1, shape2); } break; case (MS_SHAPE_POLYGON): switch (shape2->type) { case (MS_SHAPE_LINE): return msIntersectPolylinePolygon(shape2, shape1); case (MS_SHAPE_POLYGON): return msIntersectPolygons(shape1, shape2); } break; } return -1; #endif } /* ** Does shape1 touch shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSTouches(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSTouches_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSTouches()"); return -1; #endif } /* ** Does shape1 equal shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSEquals(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSEquals_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSEquals()"); return -1; #endif } /* ** Are shape1 and shape2 disjoint, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSDisjoint(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSDisjoint_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSDisjoint()"); return -1; #endif } /* ** Useful misc. functions that return -1 on failure. */ double msGEOSArea(shapeObj *shape) { #if defined(USE_GEOS) && defined(GEOS_CAPI_VERSION_MAJOR) && \ defined(GEOS_CAPI_VERSION_MINOR) && \ (GEOS_CAPI_VERSION_MAJOR > 1 || GEOS_CAPI_VERSION_MINOR >= 1) GEOSGeom g; double area; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return -1; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g = (GEOSGeom)shape->geometry; if (!g) return -1; result = GEOSArea_r(handle, g, &area); return ((result == 0) ? -1 : area); #elif defined(USE_GEOS) msSetError(MS_GEOSERR, "GEOS support enabled, but old version lacks GEOSArea().", "msGEOSArea()"); return -1; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSArea()"); return -1; #endif } double msGEOSLength(shapeObj *shape) { #if defined(USE_GEOS) && defined(GEOS_CAPI_VERSION_MAJOR) && \ defined(GEOS_CAPI_VERSION_MINOR) && \ (GEOS_CAPI_VERSION_MAJOR > 1 || GEOS_CAPI_VERSION_MINOR >= 1) GEOSGeom g; double length; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return -1; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g = (GEOSGeom)shape->geometry; if (!g) return -1; result = GEOSLength_r(handle, g, &length); return ((result == 0) ? -1 : length); #elif defined(USE_GEOS) msSetError(MS_GEOSERR, "GEOS support enabled, but old version lacks GEOSLength().", "msGEOSLength()"); return -1; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSLength()"); return -1; #endif } double msGEOSDistance(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; double distance; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSDistance_r(handle, g1, g2, &distance); return ((result == 0) ? -1 : distance); #else return msDistanceShapeToShape( shape1, shape2); /* fall back on brute force method (for MapScript) */ #endif } mapserver-8.4.0/src/mapgml.c000066400000000000000000002647621474174441300157710ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: shapeObj to GML output via MapServer queries. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "maperror.h" #include "mapows.h" #include "mapgml.h" #include "maptime.h" /* Use only mapgml.c if WMS or WFS is available (with minor exceptions at end) */ #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) static int msGMLGeometryLookup(gmlGeometryListObj *geometryList, const char *type); /* ** Functions that write the feature boundary geometry (i.e. a rectObj). */ /* GML 2.1.2 */ static int gmlWriteBounds_GML2(FILE *stream, rectObj *rect, const char *srsname, const char *tab, const char *pszTopPrefix) { char *srsname_encoded; if (!stream) return (MS_FAILURE); if (!rect) return (MS_FAILURE); if (!tab) return (MS_FAILURE); msIO_fprintf(stream, "%s<%s:boundedBy>\n", tab, pszTopPrefix); if (srsname) { srsname_encoded = msEncodeHTMLEntities(srsname); msIO_fprintf(stream, "%s\t\n", tab, srsname_encoded); msFree(srsname_encoded); } else msIO_fprintf(stream, "%s\t\n", tab); msIO_fprintf(stream, "%s\t\t", tab); msIO_fprintf(stream, "%.6f,%.6f %.6f,%.6f", rect->minx, rect->miny, rect->maxx, rect->maxy); msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s\t\n", tab); msIO_fprintf(stream, "%s\n", tab, pszTopPrefix); return MS_SUCCESS; } /* GML 3.1 or GML 3.2 (MapServer limits GML encoding to the level 0 profile) */ static int gmlWriteBounds_GML3(FILE *stream, rectObj *rect, const char *srsname, const char *tab, const char *pszTopPrefix) { char *srsname_encoded; if (!stream) return (MS_FAILURE); if (!rect) return (MS_FAILURE); if (!tab) return (MS_FAILURE); msIO_fprintf(stream, "%s<%s:boundedBy>\n", tab, pszTopPrefix); if (srsname) { srsname_encoded = msEncodeHTMLEntities(srsname); msIO_fprintf(stream, "%s\t\n", tab, srsname_encoded); msFree(srsname_encoded); } else msIO_fprintf(stream, "%s\t\n", tab); msIO_fprintf(stream, "%s\t\t%.6f %.6f\n", tab, rect->minx, rect->miny); msIO_fprintf(stream, "%s\t\t%.6f %.6f\n", tab, rect->maxx, rect->maxy); msIO_fprintf(stream, "%s\t\n", tab); msIO_fprintf(stream, "%s\n", tab, pszTopPrefix); return MS_SUCCESS; } static void gmlStartGeometryContainer(FILE *stream, const char *name, const char *namespace, const char *tab) { const char *tag_name = OWS_GML_DEFAULT_GEOMETRY_NAME; if (name) tag_name = name; if (namespace) msIO_fprintf(stream, "%s<%s:%s>\n", tab, namespace, tag_name); else msIO_fprintf(stream, "%s<%s>\n", tab, tag_name); } static void gmlEndGeometryContainer(FILE *stream, const char *name, const char *namespace, const char *tab) { const char *tag_name = OWS_GML_DEFAULT_GEOMETRY_NAME; if (name) tag_name = name; if (namespace) msIO_fprintf(stream, "%s\n", tab, namespace, tag_name); else msIO_fprintf(stream, "%s\n", tab, tag_name); } /* GML 2.1.2 */ static int gmlWriteGeometry_GML2(FILE *stream, gmlGeometryListObj *geometryList, shapeObj *shape, const char *srsname, const char *namespace, const char *tab, int nSRSDimension, int geometry_precision) { int i, j, k; int *innerlist, *outerlist = NULL, numouters; char *srsname_encoded = NULL; int geometry_aggregate_index, geometry_simple_index; char *geometry_aggregate_name = NULL, *geometry_simple_name = NULL; if (!stream) return (MS_FAILURE); if (!shape) return (MS_FAILURE); if (!tab) return (MS_FAILURE); if (!geometryList) return (MS_FAILURE); if (shape->numlines <= 0) return (MS_SUCCESS); /* empty shape, nothing to output */ if (srsname) srsname_encoded = msEncodeHTMLEntities(srsname); /* feature geometry */ switch (shape->type) { case (MS_SHAPE_POINT): geometry_simple_index = msGMLGeometryLookup(geometryList, "point"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multipoint"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; if ((geometry_simple_index != -1 && shape->line[0].numpoints == 1 && shape->numlines == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->line[0].numpoints == 1 && shape->numlines == 1)) { /* write a Point(s) */ for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* Point */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); if (nSRSDimension == 3) msIO_fprintf( stream, "%s %.*f,%.*f,%.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%s %.*f,%.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); msIO_fprintf(stream, "%s\n", tab); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } } } else if ((geometry_aggregate_index != -1) || (geometryList->numgeometries == 0)) { /* write a MultiPoint */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiPoint */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); if (nSRSDimension == 3) msIO_fprintf( stream, "%s %.*f,%.*f,%.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf( stream, "%s %f,%f\n", tab, shape->line[i].point[j].x, shape->line[i].point[j].y); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s\n", tab); gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; case (MS_SHAPE_LINE): geometry_simple_index = msGMLGeometryLookup(geometryList, "line"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multiline"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; if ((geometry_simple_index != -1 && shape->numlines == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->numlines == 1)) { /* write a LineStrings(s) */ for (i = 0; i < shape->numlines; i++) { gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* LineString */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s\n", tab); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } } else if (geometry_aggregate_index != -1 || (geometryList->numgeometries == 0)) { /* write a MultiCurve */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiLineString */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); for (j = 0; j < shape->numlines; j++) { msIO_fprintf(stream, "%s \n", tab); /* no srsname at this point */ msIO_fprintf(stream, "%s \n", tab); /* no srsname at this point */ msIO_fprintf(stream, "%s ", tab); for (i = 0; i < shape->line[j].numpoints; i++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[j].point[i].x, geometry_precision, shape->line[j].point[i].y, geometry_precision, shape->line[j].point[i].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[j].point[i].x, geometry_precision, shape->line[j].point[i].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } msIO_fprintf(stream, "%s\n", tab); gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; case ( MS_SHAPE_POLYGON): /* this gets nasty, since our shapes are so flexible */ geometry_simple_index = msGMLGeometryLookup(geometryList, "polygon"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multipolygon"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; /* get a list of outer rings for this polygon */ outerlist = msGetOuterList(shape); numouters = 0; for (i = 0; i < shape->numlines; i++) if (outerlist[i] == MS_TRUE) numouters++; if ((geometry_simple_index != -1 && numouters == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->numlines == 1)) { /* write a Polygon(s) */ for (i = 0; i < shape->numlines; i++) { if (outerlist[i] == MS_FALSE) break; /* skip non-outer rings, each outer ring is a new polygon */ /* get a list of inner rings for this polygon */ innerlist = msGetInnerList(shape, i, outerlist); gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* Polygon */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); for (k = 0; k < shape->numlines; k++) { /* now step through all the inner rings */ if (innerlist[k] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[k].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y, geometry_precision, shape->line[k].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s\n", tab); free(innerlist); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } free(outerlist); outerlist = NULL; } else if (geometry_aggregate_index != -1 || (geometryList->numgeometries == 0)) { /* write a MultiPolygon */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiPolygon */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); for (i = 0; i < shape->numlines; i++) { /* step through the outer rings */ if (outerlist[i] == MS_TRUE) { innerlist = msGetInnerList(shape, i, outerlist); msIO_fprintf(stream, "%s\n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); for (k = 0; k < shape->numlines; k++) { /* now step through all the inner rings */ if (innerlist[k] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[k].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y, geometry_precision, shape->line[k].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s\n", tab); free(innerlist); } } msIO_fprintf(stream, "%s\n", tab); free(outerlist); outerlist = NULL; gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; default: break; } /* clean-up */ msFree(srsname_encoded); msFree(outerlist); return (MS_SUCCESS); } static char *gmlCreateGeomId(OWSGMLVersion nGMLVersion, const char *pszFID, int *p_id) { char *pszGMLId; if (nGMLVersion == OWS_GML32) { pszGMLId = (char *)msSmallMalloc(strlen(pszFID) + 1 + strlen(" gml:id=\"\"") + 10); sprintf(pszGMLId, " gml:id=\"%s.%d\"", pszFID, *p_id); (*p_id)++; } else pszGMLId = msStrdup(""); return pszGMLId; } /* GML 3.1 or GML 3.2 (MapServer limits GML encoding to the level 0 profile) */ static int gmlWriteGeometry_GML3(FILE *stream, gmlGeometryListObj *geometryList, shapeObj *shape, const char *srsname, const char *namespace, const char *tab, const char *pszFID, OWSGMLVersion nGMLVersion, int nSRSDimension, int geometry_precision) { int i, j, k, id = 1; int *innerlist, *outerlist = NULL, numouters; char *srsname_encoded = NULL; char *pszGMLId; int geometry_aggregate_index, geometry_simple_index; char *geometry_aggregate_name = NULL, *geometry_simple_name = NULL; if (!stream) return (MS_FAILURE); if (!shape) return (MS_FAILURE); if (!tab) return (MS_FAILURE); if (!geometryList) return (MS_FAILURE); if (shape->numlines <= 0) return (MS_SUCCESS); /* empty shape, nothing to output */ if (srsname) srsname_encoded = msEncodeHTMLEntities(srsname); /* feature geometry */ switch (shape->type) { case (MS_SHAPE_POINT): geometry_simple_index = msGMLGeometryLookup(geometryList, "point"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multipoint"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; if ((geometry_simple_index != -1 && shape->line[0].numpoints == 1 && shape->numlines == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->line[0].numpoints == 1 && shape->numlines == 1)) { /* write a Point(s) */ for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* Point */ pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); if (nSRSDimension == 3) msIO_fprintf( stream, "%s %.*f %.*f %.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%s %.*f %.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); msIO_fprintf(stream, "%s \n", tab); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); msFree(pszGMLId); } } } else if ((geometry_aggregate_index != -1) || (geometryList->numgeometries == 0)) { /* write a MultiPoint */ pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiPoint */ if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { msIO_fprintf(stream, "%s \n", tab); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); msIO_fprintf(stream, "%s \n", tab, pszGMLId); if (nSRSDimension == 3) msIO_fprintf(stream, "%s %.*f %.*f " "%.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%s %.*f %.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); msIO_fprintf(stream, "%s \n", tab); msFree(pszGMLId); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; case (MS_SHAPE_LINE): geometry_simple_index = msGMLGeometryLookup(geometryList, "line"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multiline"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; if ((geometry_simple_index != -1 && shape->numlines == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->numlines == 1)) { /* write a LineStrings(s) */ for (i = 0; i < shape->numlines; i++) { gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* LineString (should be Curve?) */ pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } } else if (geometry_aggregate_index != -1 || (geometryList->numgeometries == 0)) { /* write a MultiCurve */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiCurve */ pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); for (i = 0; i < shape->numlines; i++) { msIO_fprintf(stream, "%s \n", tab); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); msIO_fprintf(stream, "%s \n", tab, pszGMLId); /* no srsname at this point */ msFree(pszGMLId); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } msIO_fprintf(stream, "%s \n", tab); gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; case ( MS_SHAPE_POLYGON): /* this gets nasty, since our shapes are so flexible */ geometry_simple_index = msGMLGeometryLookup(geometryList, "polygon"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multipolygon"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; /* get a list of outer rings for this polygon */ outerlist = msGetOuterList(shape); numouters = 0; for (i = 0; i < shape->numlines; i++) if (outerlist[i] == MS_TRUE) numouters++; if ((geometry_simple_index != -1 && numouters == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->numlines == 1)) { /* write a Polygon(s) */ for (i = 0; i < shape->numlines; i++) { if (outerlist[i] == MS_FALSE) break; /* skip non-outer rings, each outer ring is a new polygon */ /* get a list of inner rings for this polygon */ innerlist = msGetInnerList(shape, i, outerlist); gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); /* Polygon (should be Surface?) */ if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); for (k = 0; k < shape->numlines; k++) { /* now step through all the inner rings */ if (innerlist[k] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[k].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y, geometry_precision, shape->line[k].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); free(innerlist); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } free(outerlist); outerlist = NULL; } else if (geometry_aggregate_index != -1 || (geometryList->numgeometries == 0)) { /* write a MultiSurface */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); /* MultiSurface */ if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); for (i = 0; i < shape->numlines; i++) { /* step through the outer rings */ if (outerlist[i] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); /* get a list of inner rings for this polygon */ innerlist = msGetInnerList(shape, i, outerlist); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); for (k = 0; k < shape->numlines; k++) { /* now step through all the inner rings */ if (innerlist[k] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[k].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y, geometry_precision, shape->line[k].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); free(innerlist); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); free(outerlist); outerlist = NULL; gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; default: break; } /* clean-up */ msFree(outerlist); msFree(srsname_encoded); return (MS_SUCCESS); } /* ** Wrappers for the format specific encoding functions. */ static int gmlWriteBounds(FILE *stream, OWSGMLVersion format, rectObj *rect, const char *srsname, const char *tab, const char *pszTopPrefix) { switch (format) { case (OWS_GML2): return gmlWriteBounds_GML2(stream, rect, srsname, tab, pszTopPrefix); break; case (OWS_GML3): case (OWS_GML32): return gmlWriteBounds_GML3(stream, rect, srsname, tab, pszTopPrefix); break; default: msSetError(MS_IOERR, "Unsupported GML format.", "gmlWriteBounds()"); } return (MS_FAILURE); } static int gmlWriteGeometry(FILE *stream, gmlGeometryListObj *geometryList, OWSGMLVersion format, shapeObj *shape, const char *srsname, const char *namespace, const char *tab, const char *pszFID, int nSRSDimension, int geometry_precision) { switch (format) { case (OWS_GML2): return gmlWriteGeometry_GML2(stream, geometryList, shape, srsname, namespace, tab, nSRSDimension, geometry_precision); break; case (OWS_GML3): case (OWS_GML32): return gmlWriteGeometry_GML3(stream, geometryList, shape, srsname, namespace, tab, pszFID, format, nSRSDimension, geometry_precision); break; default: msSetError(MS_IOERR, "Unsupported GML format.", "gmlWriteGeometry()"); } return (MS_FAILURE); } /* ** GML specific metadata handling functions. */ int msItemInGroups(const char *name, gmlGroupListObj *groupList) { int i, j; gmlGroupObj *group; if (!groupList) return MS_FALSE; /* no groups */ for (i = 0; i < groupList->numgroups; i++) { group = &(groupList->groups[i]); for (j = 0; j < group->numitems; j++) { if (strcasecmp(name, group->items[j]) == 0) return MS_TRUE; } } return MS_FALSE; } static int msGMLGeometryLookup(gmlGeometryListObj *geometryList, const char *type) { int i; if (!geometryList || !type) return -1; /* nothing to look for */ for (i = 0; i < geometryList->numgeometries; i++) if (geometryList->geometries[i].type && (strcasecmp(geometryList->geometries[i].type, type) == 0)) return i; if (geometryList->numgeometries == 1 && geometryList->geometries[0].type == NULL) return 0; return -1; /* not found */ } gmlGeometryListObj *msGMLGetGeometries(layerObj *layer, const char *metadata_namespaces, int bWithDefaultGeom) { int i; const char *value = NULL; char tag[64]; char **names = NULL; int numnames = 0; gmlGeometryListObj *geometryList = NULL; gmlGeometryObj *geometry = NULL; /* allocate memory and initialize the item collection */ geometryList = (gmlGeometryListObj *)malloc(sizeof(gmlGeometryListObj)); MS_CHECK_ALLOC(geometryList, sizeof(gmlGeometryListObj), NULL); geometryList->geometries = NULL; geometryList->numgeometries = 0; if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "geometries")) != NULL) { names = msStringSplit(value, ',', &numnames); /* allocation an array of gmlGeometryObj's */ geometryList->numgeometries = numnames; geometryList->geometries = (gmlGeometryObj *)malloc( sizeof(gmlGeometryObj) * geometryList->numgeometries); if (geometryList->geometries == NULL) { msSetError( MS_MEMERR, "Out of memory allocating %u bytes.\n", "msGMLGetGeometries()", (unsigned int)(sizeof(gmlGeometryObj) * geometryList->numgeometries)); free(geometryList); return NULL; } for (i = 0; i < geometryList->numgeometries; i++) { geometry = &(geometryList->geometries[i]); geometry->name = msStrdup(names[i]); /* initialize a few things */ geometry->type = NULL; geometry->occurmin = 0; geometry->occurmax = 1; snprintf(tag, 64, "%s_type", names[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) geometry->type = msStrdup(value); /* TODO: validate input value */ snprintf(tag, 64, "%s_occurances", names[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) { char **occur; int numoccur; occur = msStringSplit(value, ',', &numoccur); if (numoccur == 2) { /* continue (TODO: throw an error if != 2) */ geometry->occurmin = atof(occur[0]); if (strcasecmp(occur[1], "UNBOUNDED") == 0) geometry->occurmax = OWS_GML_OCCUR_UNBOUNDED; else geometry->occurmax = atof(occur[1]); } msFreeCharArray(occur, numoccur); } } msFreeCharArray(names, numnames); } else if (bWithDefaultGeom) { geometryList->numgeometries = 1; geometryList->geometries = (gmlGeometryObj *)calloc(1, sizeof(gmlGeometryObj)); geometryList->geometries[0].name = msStrdup(OWS_GML_DEFAULT_GEOMETRY_NAME); geometryList->geometries[0].type = NULL; geometryList->geometries[0].occurmin = 0; geometryList->geometries[0].occurmax = 1; } return geometryList; } void msGMLFreeGeometries(gmlGeometryListObj *geometryList) { int i; if (!geometryList) return; for (i = 0; i < geometryList->numgeometries; i++) { msFree(geometryList->geometries[i].name); msFree(geometryList->geometries[i].type); } free(geometryList->geometries); free(geometryList); } static void msGMLWriteItem(FILE *stream, gmlItemObj *item, const char *value, const char *namespace, const char *tab, OWSGMLVersion outputformat, const char *pszFID) { char *encoded_value = NULL, *tag_name; int add_namespace = MS_TRUE; char gmlid[256]; gmlid[0] = 0; if (!stream || !item) return; if (!item->visible) return; if (!namespace) add_namespace = MS_FALSE; if (item->alias) tag_name = item->alias; else tag_name = item->name; if (strchr(tag_name, ':') != NULL) add_namespace = MS_FALSE; if (item->type && (EQUAL(item->type, "Date") || EQUAL(item->type, "DateTime") || EQUAL(item->type, "Time"))) { struct tm tm; if (msParseTime(value, &tm) == MS_TRUE) { const char *pszStartTag = ""; const char *pszEndTag = ""; encoded_value = (char *)msSmallMalloc(256); if (outputformat == OWS_GML32) { if (pszFID != NULL) snprintf(gmlid, 256, " gml:id=\"%s.%s\"", pszFID, tag_name); pszStartTag = ""; pszEndTag = ""; } if (EQUAL(item->type, "Date")) snprintf(encoded_value, 256, "%s%04d-%02d-%02d%s", pszStartTag, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, pszEndTag); else if (EQUAL(item->type, "Time")) snprintf(encoded_value, 256, "%s%02d:%02d:%02dZ%s", pszStartTag, tm.tm_hour, tm.tm_min, tm.tm_sec, pszEndTag); else { // Detected date time already formatted as YYYY-MM-DDTHH:mm:SS+ab:cd // because msParseTime() can't handle time zones. if (strlen(value) == 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 && value[4] == '-' && value[7] == '-' && value[10] == 'T' && value[13] == ':' && value[16] == ':' && (value[19] == '+' || value[19] == '-') && value[22] == ':') { snprintf(encoded_value, 256, "%s%s%s", pszStartTag, value, pszEndTag); } else { snprintf(encoded_value, 256, "%s%04d-%02d-%02dT%02d:%02d:%02dZ%s", pszStartTag, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, pszEndTag); } } } } if (encoded_value == NULL) { if (item->encode == MS_TRUE) encoded_value = msEncodeHTMLEntities(value); else encoded_value = msStrdup(value); } if (!item->template) { /* build the tag from pieces */ if (add_namespace == MS_TRUE && msIsXMLTagValid(tag_name) == MS_FALSE) msIO_fprintf(stream, "\n", tag_name); if (add_namespace == MS_TRUE) msIO_fprintf(stream, "%s<%s:%s%s>%s\n", tab, namespace, tag_name, gmlid, encoded_value, namespace, tag_name); else msIO_fprintf(stream, "%s<%s%s>%s\n", tab, tag_name, gmlid, encoded_value, tag_name); } else { char *tag = NULL; tag = msStrdup(item->template); tag = msReplaceSubstring(tag, "$value", encoded_value); if (namespace) tag = msReplaceSubstring(tag, "$namespace", namespace); msIO_fprintf(stream, "%s%s\n", tab, tag); free(tag); } free(encoded_value); return; } gmlNamespaceListObj *msGMLGetNamespaces(webObj *web, const char *metadata_namespaces) { int i; const char *value = NULL; char tag[64]; char **prefixes = NULL; int numprefixes = 0; gmlNamespaceListObj *namespaceList = NULL; gmlNamespaceObj *namespace = NULL; /* allocate the collection */ namespaceList = (gmlNamespaceListObj *)malloc(sizeof(gmlNamespaceListObj)); MS_CHECK_ALLOC(namespaceList, sizeof(gmlNamespaceListObj), NULL); namespaceList->namespaces = NULL; namespaceList->numnamespaces = 0; /* list of namespaces (TODO: make this automatic by parsing metadata) */ if ((value = msOWSLookupMetadata(&(web->metadata), metadata_namespaces, "external_namespace_prefixes")) != NULL) { prefixes = msStringSplit(value, ',', &numprefixes); /* allocation an array of gmlNamespaceObj's */ namespaceList->numnamespaces = numprefixes; namespaceList->namespaces = (gmlNamespaceObj *)malloc( sizeof(gmlNamespaceObj) * namespaceList->numnamespaces); if (namespaceList->namespaces == NULL) { msSetError(MS_MEMERR, "Out of memory allocating %u bytes.\n", "msGMLGetNamespaces()", (unsigned int)(sizeof(gmlNamespaceObj) * namespaceList->numnamespaces)); free(namespaceList); return NULL; } for (i = 0; i < namespaceList->numnamespaces; i++) { namespace = &(namespaceList->namespaces[i]); namespace->prefix = msStrdup(prefixes[i]); /* initialize a few things */ namespace->uri = NULL; namespace->schemalocation = NULL; snprintf(tag, 64, "%s_uri", namespace->prefix); if ((value = msOWSLookupMetadata(&(web->metadata), metadata_namespaces, tag)) != NULL) namespace->uri = msStrdup(value); snprintf(tag, 64, "%s_schema_location", namespace->prefix); if ((value = msOWSLookupMetadata(&(web->metadata), metadata_namespaces, tag)) != NULL) namespace->schemalocation = msStrdup(value); } msFreeCharArray(prefixes, numprefixes); } return namespaceList; } void msGMLFreeNamespaces(gmlNamespaceListObj *namespaceList) { int i; if (!namespaceList) return; for (i = 0; i < namespaceList->numnamespaces; i++) { msFree(namespaceList->namespaces[i].prefix); msFree(namespaceList->namespaces[i].uri); msFree(namespaceList->namespaces[i].schemalocation); } free(namespaceList); } gmlConstantListObj *msGMLGetConstants(layerObj *layer, const char *metadata_namespaces) { int i; const char *value = NULL; char tag[64]; char **names = NULL; int numnames = 0; gmlConstantListObj *constantList = NULL; gmlConstantObj *constant = NULL; /* allocate the collection */ constantList = (gmlConstantListObj *)malloc(sizeof(gmlConstantListObj)); MS_CHECK_ALLOC(constantList, sizeof(gmlConstantListObj), NULL); constantList->constants = NULL; constantList->numconstants = 0; /* list of constants (TODO: make this automatic by parsing metadata) */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "constants")) != NULL) { names = msStringSplit(value, ',', &numnames); /* allocation an array of gmlConstantObj's */ constantList->numconstants = numnames; constantList->constants = (gmlConstantObj *)malloc( sizeof(gmlConstantObj) * constantList->numconstants); if (constantList->constants == NULL) { msSetError( MS_MEMERR, "Out of memory allocating %u bytes.\n", "msGMLGetConstants()", (unsigned int)(sizeof(gmlConstantObj) * constantList->numconstants)); free(constantList); return NULL; } for (i = 0; i < constantList->numconstants; i++) { constant = &(constantList->constants[i]); constant->name = msStrdup(names[i]); /* initialize a few things */ constant->value = NULL; constant->type = NULL; snprintf(tag, 64, "%s_value", constant->name); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) constant->value = msStrdup(value); snprintf(tag, 64, "%s_type", constant->name); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) constant->type = msStrdup(value); } msFreeCharArray(names, numnames); } return constantList; } void msGMLFreeConstants(gmlConstantListObj *constantList) { int i; if (!constantList) return; for (i = 0; i < constantList->numconstants; i++) { msFree(constantList->constants[i].name); msFree(constantList->constants[i].value); msFree(constantList->constants[i].type); } free(constantList); } static void msGMLWriteConstant(FILE *stream, gmlConstantObj *constant, const char *namespace, const char *tab) { int add_namespace = MS_TRUE; if (!stream || !constant) return; if (!constant->value) return; if (!namespace) add_namespace = MS_FALSE; if (strchr(constant->name, ':') != NULL) add_namespace = MS_FALSE; if (add_namespace == MS_TRUE && msIsXMLTagValid(constant->name) == MS_FALSE) msIO_fprintf( stream, "\n", constant->name); if (add_namespace == MS_TRUE) msIO_fprintf(stream, "%s<%s:%s>%s\n", tab, namespace, constant->name, constant->value, namespace, constant->name); else msIO_fprintf(stream, "%s<%s>%s\n", tab, constant->name, constant->value, constant->name); return; } static void msGMLWriteGroup(FILE *stream, gmlGroupObj *group, shapeObj *shape, gmlItemListObj *itemList, gmlConstantListObj *constantList, const char *namespace, const char *tab, OWSGMLVersion outputformat, const char *pszFID) { int i, j; int add_namespace = MS_TRUE; char *itemtab; gmlItemObj *item = NULL; gmlConstantObj *constant = NULL; if (!stream || !group) return; /* setup the item/constant tab */ itemtab = (char *)msSmallMalloc(sizeof(char) * strlen(tab) + 3); sprintf(itemtab, "%s ", tab); if (!namespace || strchr(group->name, ':') != NULL) add_namespace = MS_FALSE; /* start the group */ if (add_namespace == MS_TRUE) msIO_fprintf(stream, "%s<%s:%s>\n", tab, namespace, group->name); else msIO_fprintf(stream, "%s<%s>\n", tab, group->name); /* now the items/constants in the group */ for (i = 0; i < group->numitems; i++) { for (j = 0; j < constantList->numconstants; j++) { constant = &(constantList->constants[j]); if (strcasecmp(constant->name, group->items[i]) == 0) { msGMLWriteConstant(stream, constant, namespace, itemtab); break; } } if (j != constantList->numconstants) continue; /* found this one */ for (j = 0; j < itemList->numitems; j++) { item = &(itemList->items[j]); if (strcasecmp(item->name, group->items[i]) == 0) { /* the number of items matches the number of values exactly */ msGMLWriteItem(stream, item, shape->values[j], namespace, itemtab, outputformat, pszFID); break; } } } /* end the group */ if (add_namespace == MS_TRUE) msIO_fprintf(stream, "%s\n", tab, namespace, group->name); else msIO_fprintf(stream, "%s\n", tab, group->name); msFree(itemtab); return; } #endif gmlGroupListObj *msGMLGetGroups(layerObj *layer, const char *metadata_namespaces) { int i; const char *value = NULL; char tag[64]; char **names = NULL; int numnames = 0; gmlGroupListObj *groupList = NULL; gmlGroupObj *group = NULL; /* allocate the collection */ groupList = (gmlGroupListObj *)malloc(sizeof(gmlGroupListObj)); MS_CHECK_ALLOC(groupList, sizeof(gmlGroupListObj), NULL); groupList->groups = NULL; groupList->numgroups = 0; /* list of groups (TODO: make this automatic by parsing metadata) */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "groups")) != NULL && value[0] != '\0') { names = msStringSplit(value, ',', &numnames); /* allocation an array of gmlGroupObj's */ groupList->numgroups = numnames; groupList->groups = (gmlGroupObj *)malloc(sizeof(gmlGroupObj) * groupList->numgroups); if (groupList->groups == NULL) { msSetError(MS_MEMERR, "Out of memory allocating %u bytes.\n", "msGMLGetGroups()", (unsigned int)(sizeof(gmlGroupObj) * groupList->numgroups)); free(groupList); return NULL; } for (i = 0; i < groupList->numgroups; i++) { group = &(groupList->groups[i]); group->name = msStrdup(names[i]); /* initialize a few things */ group->items = NULL; group->numitems = 0; group->type = NULL; snprintf(tag, 64, "%s_group", group->name); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) group->items = msStringSplit(value, ',', &group->numitems); snprintf(tag, 64, "%s_type", group->name); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) group->type = msStrdup(value); } msFreeCharArray(names, numnames); } return groupList; } void msGMLFreeGroups(gmlGroupListObj *groupList) { int i; if (!groupList) return; for (i = 0; i < groupList->numgroups; i++) { msFree(groupList->groups[i].name); msFreeCharArray(groupList->groups[i].items, groupList->groups[i].numitems); msFree(groupList->groups[i].type); } msFree(groupList->groups); free(groupList); } /* Dump GML query results for WMS GetFeatureInfo */ int msGMLWriteQuery(mapObj *map, char *filename, const char *namespaces) { #if defined(USE_WMS_SVR) int status; int i, j, k; layerObj *lp = NULL; shapeObj shape; FILE *stream_to_free = NULL; FILE *stream = stdout; /* defaults to stdout */ char szPath[MS_MAXPATHLEN]; char *value; char *pszMapSRS = NULL; gmlGroupListObj *groupList = NULL; gmlItemListObj *itemList = NULL; gmlConstantListObj *constantList = NULL; gmlGeometryListObj *geometryList = NULL; gmlItemObj *item = NULL; gmlConstantObj *constant = NULL; msInitShape(&shape); if (filename && strlen(filename) > 0) { /* deal with the filename if present */ stream_to_free = fopen(msBuildPath(szPath, map->mappath, filename), "w"); if (!stream_to_free) { msSetError(MS_IOERR, "(%s)", "msGMLWriteQuery()", filename); return (MS_FAILURE); } stream = stream_to_free; } msIO_fprintf(stream, "\n\n"); msOWSPrintValidateMetadata(stream, &(map->web.metadata), namespaces, "rootname", OWS_NOERR, "<%s ", "msGMLOutput"); msOWSPrintEncodeMetadata(stream, &(map->web.metadata), namespaces, "uri", OWS_NOERR, "xmlns=\"%s\"", NULL); msIO_fprintf(stream, "\n\t xmlns:gml=\"http://www.opengis.net/gml\""); msIO_fprintf(stream, "\n\t xmlns:xlink=\"http://www.w3.org/1999/xlink\""); msIO_fprintf(stream, "\n\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""); msOWSPrintEncodeMetadata(stream, &(map->web.metadata), namespaces, "schema", OWS_NOERR, "\n\t xsi:schemaLocation=\"%s\"", NULL); msIO_fprintf(stream, ">\n"); /* a schema *should* be required */ msOWSPrintEncodeMetadata(stream, &(map->web.metadata), namespaces, "description", OWS_NOERR, "\t%s\n", NULL); /* Look up map SRS. We need an EPSG code for GML, if not then we get null and * we'll fall back on the layer's SRS */ msOWSGetEPSGProj(&(map->projection), NULL, namespaces, MS_TRUE, &pszMapSRS); /* step through the layers looking for query results */ for (i = 0; i < map->numlayers; i++) { char *pszOutputSRS = NULL; int nSRSDimension = 2; const char *geomtype; lp = (GET_LAYER(map, map->layerorder[i])); if (lp->resultcache && lp->resultcache->numresults > 0) { /* found results */ reprojectionObj *reprojector = NULL; /* Determine output SRS, if map has none, then try using layer's native * SRS */ if ((pszOutputSRS = pszMapSRS) == NULL) { msOWSGetEPSGProj(&(lp->projection), NULL, namespaces, MS_TRUE, &pszOutputSRS); if (pszOutputSRS == NULL) { msSetError( MS_WMSERR, "No valid EPSG code in map or layer projection for GML output", "msGMLWriteQuery()"); continue; /* No EPSG code, cannot output this layer */ } } /* start this collection (layer) */ /* if no layer name provided fall back on the layer name + "_layer" */ value = (char *)msSmallMalloc(strlen(lp->name) + 7); sprintf(value, "%s_layer", lp->name); msOWSPrintValidateMetadata(stream, &(lp->metadata), namespaces, "layername", OWS_NOERR, "\t<%s>\n", value); msFree(value); value = (char *)msOWSLookupMetadata(&(lp->metadata), "OM", "title"); if (value) { msOWSPrintEncodeMetadata(stream, &(lp->metadata), namespaces, "title", OWS_NOERR, "\t%s\n", value); } geomtype = msOWSLookupMetadata(&(lp->metadata), "OFG", "geomtype"); if (geomtype != NULL && (strstr(geomtype, "25d") != NULL || strstr(geomtype, "25D") != NULL)) { nSRSDimension = 3; } /* populate item and group metadata structures */ itemList = msGMLGetItems(lp, namespaces); constantList = msGMLGetConstants(lp, namespaces); groupList = msGMLGetGroups(lp, namespaces); geometryList = msGMLGetGeometries(lp, namespaces, MS_FALSE); if (itemList == NULL || constantList == NULL || groupList == NULL || geometryList == NULL) { msSetError(MS_MISCERR, "Unable to populate item and group metadata structures", "msGMLWriteQuery()"); if (stream_to_free != NULL) fclose(stream_to_free); return MS_FAILURE; } if (pszOutputSRS == pszMapSRS && msProjectionsDiffer(&(lp->projection), &(map->projection))) { reprojector = msProjectCreateReprojector(&(lp->projection), &(map->projection)); if (reprojector == NULL) { msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); msFree(pszOutputSRS); if (stream_to_free != NULL) fclose(stream_to_free); return MS_FAILURE; } } for (j = 0; j < lp->resultcache->numresults; j++) { status = msLayerGetShape(lp, &shape, &(lp->resultcache->results[j])); if (status != MS_SUCCESS) { msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); msProjectDestroyReprojector(reprojector); msFree(pszOutputSRS); if (stream_to_free != NULL) fclose(stream_to_free); return MS_FAILURE; } /* project the shape into the map projection (if necessary), note that * this projects the bounds as well */ if (reprojector) { status = msProjectShapeEx(reprojector, &shape); if (status != MS_SUCCESS) { msIO_fprintf(stream, "\n", msGetErrorString(",")); msFreeShape(&shape); continue; } } /* start this feature */ /* specify a feature name, if nothing provided fall back on the layer * name + "_feature" */ value = (char *)msSmallMalloc(strlen(lp->name) + 9); sprintf(value, "%s_feature", lp->name); msOWSPrintValidateMetadata(stream, &(lp->metadata), namespaces, "featurename", OWS_NOERR, "\t\t<%s>\n", value); msFree(value); /* Write the feature geometry and bounding box unless 'none' was * requested. */ /* Default to bbox only if nothing specified and output full geometry * only if explicitly requested */ if (!(geometryList && geometryList->numgeometries == 1 && strcasecmp(geometryList->geometries[0].name, "none") == 0)) { gmlWriteBounds(stream, OWS_GML2, &(shape.bounds), pszOutputSRS, "\t\t\t", "gml"); if (geometryList && geometryList->numgeometries > 0) gmlWriteGeometry(stream, geometryList, OWS_GML2, &(shape), pszOutputSRS, NULL, "\t\t\t", "", nSRSDimension, 6); } /* write any item/values */ for (k = 0; k < itemList->numitems; k++) { item = &(itemList->items[k]); if (msItemInGroups(item->name, groupList) == MS_FALSE) msGMLWriteItem(stream, item, shape.values[k], NULL, "\t\t\t", OWS_GML2, NULL); } /* write any constants */ for (k = 0; k < constantList->numconstants; k++) { constant = &(constantList->constants[k]); if (msItemInGroups(constant->name, groupList) == MS_FALSE) msGMLWriteConstant(stream, constant, NULL, "\t\t\t"); } /* write any groups */ for (k = 0; k < groupList->numgroups; k++) msGMLWriteGroup(stream, &(groupList->groups[k]), &shape, itemList, constantList, NULL, "\t\t\t", OWS_GML2, NULL); /* end this feature */ /* specify a feature name if nothing provided */ /* fall back on the layer name + "Feature" */ value = (char *)msSmallMalloc(strlen(lp->name) + 9); sprintf(value, "%s_feature", lp->name); msOWSPrintValidateMetadata(stream, &(lp->metadata), namespaces, "featurename", OWS_NOERR, "\t\t\n", value); msFree(value); msFreeShape(&shape); /* init too */ } msProjectDestroyReprojector(reprojector); /* end this collection (layer) */ /* if no layer name provided fall back on the layer name + "_layer" */ value = (char *)msSmallMalloc(strlen(lp->name) + 7); sprintf(value, "%s_layer", lp->name); msOWSPrintValidateMetadata(stream, &(lp->metadata), namespaces, "layername", OWS_NOERR, "\t\n", value); msFree(value); msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); /* msLayerClose(lp); */ } if (pszOutputSRS != pszMapSRS) { msFree(pszOutputSRS); } } /* next layer */ /* end this document */ msOWSPrintValidateMetadata(stream, &(map->web.metadata), namespaces, "rootname", OWS_NOERR, "\n", "msGMLOutput"); if (stream_to_free != NULL) fclose(stream_to_free); msFree(pszMapSRS); return (MS_SUCCESS); #else /* Stub for mapscript */ msSetError(MS_MISCERR, "WMS server support not enabled", "msGMLWriteQuery()"); return MS_FAILURE; #endif } #ifdef USE_WFS_SVR void msGMLWriteWFSBounds(mapObj *map, FILE *stream, const char *tab, OWSGMLVersion outputformat, int nWFSVersion, int bUseURN) { rectObj resultBounds = {-1.0, -1.0, -1.0, -1.0}; /*add a check to see if the map projection is set to be north-east*/ int bSwapAxis = msIsAxisInvertedProj(&(map->projection)); /* Need to start with BBOX of the whole resultset */ if (msGetQueryResultBounds(map, &resultBounds) > 0) { char *srs = NULL; if (bSwapAxis) { double tmp; tmp = resultBounds.minx; resultBounds.minx = resultBounds.miny; resultBounds.miny = tmp; tmp = resultBounds.maxx; resultBounds.maxx = resultBounds.maxy; resultBounds.maxy = tmp; } if (bUseURN) { srs = msOWSGetProjURN(&(map->projection), NULL, "FGO", MS_TRUE); if (!srs) srs = msOWSGetProjURN(&(map->projection), &(map->web.metadata), "FGO", MS_TRUE); } else { msOWSGetEPSGProj(&(map->projection), NULL, "FGO", MS_TRUE, &srs); if (!srs) msOWSGetEPSGProj(&(map->projection), &(map->web.metadata), "FGO", MS_TRUE, &srs); } gmlWriteBounds(stream, outputformat, &resultBounds, srs, tab, (nWFSVersion == OWS_2_0_0) ? "wfs" : "gml"); msFree(srs); } } #endif /* ** msGMLWriteWFSQuery() ** ** Similar to msGMLWriteQuery() but tuned for use with WFS */ int msGMLWriteWFSQuery(mapObj *map, FILE *stream, const char *default_namespace_prefix, OWSGMLVersion outputformat, int nWFSVersion, int bUseURN, int bGetPropertyValueRequest) { #ifdef USE_WFS_SVR int status; int i, j, k; layerObj *lp = NULL; shapeObj shape; gmlGroupListObj *groupList = NULL; gmlItemListObj *itemList = NULL; gmlConstantListObj *constantList = NULL; gmlGeometryListObj *geometryList = NULL; gmlItemObj *item = NULL; gmlConstantObj *constant = NULL; const char *namespace_prefix = NULL; int bSwapAxis; msInitShape(&shape); /*add a check to see if the map projection is set to be north-east*/ bSwapAxis = msIsAxisInvertedProj(&(map->projection)); /* Need to start with BBOX of the whole resultset */ if (!bGetPropertyValueRequest) { msGMLWriteWFSBounds(map, stream, " ", outputformat, nWFSVersion, bUseURN); } /* step through the layers looking for query results */ for (i = 0; i < map->numlayers; i++) { lp = GET_LAYER(map, map->layerorder[i]); if (lp->resultcache && lp->resultcache->numresults > 0) { /* found results */ char *layerName; const char *value; int featureIdIndex = -1; /* no feature id */ char *srs = NULL; int bOutputGMLIdOnly = MS_FALSE; int nSRSDimension = 2; const char *geomtype; reprojectionObj *reprojector = NULL; int geometry_precision = 6; /* setup namespace, a layer can override the default */ namespace_prefix = msOWSLookupMetadata(&(lp->metadata), "OFG", "namespace_prefix"); if (!namespace_prefix) namespace_prefix = default_namespace_prefix; geomtype = msOWSLookupMetadata(&(lp->metadata), "OFG", "geomtype"); if (geomtype != NULL && (strstr(geomtype, "25d") != NULL || strstr(geomtype, "25D") != NULL)) { nSRSDimension = 3; } value = msOWSLookupMetadata(&(lp->metadata), "OFG", "featureid"); if (value) { /* find the featureid amongst the items for this layer */ for (j = 0; j < lp->numitems; j++) { if (strcasecmp(lp->items[j], value) == 0) { /* found it */ featureIdIndex = j; break; } } /* Produce a warning if a featureid was set but the corresponding item * is not found. */ if (featureIdIndex == -1) msIO_fprintf(stream, "\n", value, lp->name); } else if (outputformat == OWS_GML32) msIO_fprintf(stream, "\n", lp->name); /* populate item and group metadata structures */ itemList = msGMLGetItems(lp, "G"); constantList = msGMLGetConstants(lp, "G"); groupList = msGMLGetGroups(lp, "G"); geometryList = msGMLGetGeometries(lp, "GFO", MS_FALSE); if (itemList == NULL || constantList == NULL || groupList == NULL || geometryList == NULL) { msSetError(MS_MISCERR, "Unable to populate item and group metadata structures", "msGMLWriteWFSQuery()"); return MS_FAILURE; } if (bGetPropertyValueRequest) { const char *value = msOWSLookupMetadata(&(lp->metadata), "G", "include_items"); if (value != NULL && strcmp(value, "@gml:id") == 0) bOutputGMLIdOnly = MS_TRUE; } if (namespace_prefix) { layerName = (char *)msSmallMalloc(strlen(namespace_prefix) + strlen(lp->name) + 2); sprintf(layerName, "%s:%s", namespace_prefix, lp->name); } else { layerName = msStrdup(lp->name); } if (bUseURN) { srs = msOWSGetProjURN(&(map->projection), NULL, "FGO", MS_TRUE); if (!srs) srs = msOWSGetProjURN(&(map->projection), &(map->web.metadata), "FGO", MS_TRUE); if (!srs) srs = msOWSGetProjURN(&(lp->projection), &(lp->metadata), "FGO", MS_TRUE); } else { msOWSGetEPSGProj(&(map->projection), NULL, "FGO", MS_TRUE, &srs); if (!srs) msOWSGetEPSGProj(&(map->projection), &(map->web.metadata), "FGO", MS_TRUE, &srs); if (!srs) msOWSGetEPSGProj(&(lp->projection), &(lp->metadata), "FGO", MS_TRUE, &srs); } if (msProjectionsDiffer(&(lp->projection), &(map->projection))) { reprojector = msProjectCreateReprojector(&(lp->projection), &(map->projection)); if (reprojector == NULL) { msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); msFree(layerName); msFree(srs); return MS_FAILURE; } } for (j = 0; j < lp->resultcache->numresults; j++) { char *pszFID; if (lp->resultcache->results[j].shape) { /* msDebug("Using cached shape %ld\n", * lp->resultcache->results[j].shapeindex); */ msCopyShape(lp->resultcache->results[j].shape, &shape); } else { status = msLayerGetShape(lp, &shape, &(lp->resultcache->results[j])); if (status != MS_SUCCESS) { msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); msFree(layerName); msProjectDestroyReprojector(reprojector); msFree(srs); return (status); } } /* project the shape into the map projection (if necessary), note that * this projects the bounds as well */ if (reprojector) msProjectShapeEx(reprojector, &shape); if (featureIdIndex != -1) { pszFID = (char *)msSmallMalloc( strlen(lp->name) + 1 + strlen(shape.values[featureIdIndex]) + 1); sprintf(pszFID, "%s.%s", lp->name, shape.values[featureIdIndex]); } else pszFID = msStrdup(""); if (bOutputGMLIdOnly) { msIO_fprintf(stream, " %s\n", pszFID); msFree(pszFID); msFreeShape(&shape); /* init too */ continue; } /* ** start this feature */ if (nWFSVersion == OWS_2_0_0) msIO_fprintf(stream, " \n"); else msIO_fprintf(stream, " \n"); if (msIsXMLTagValid(layerName) == MS_FALSE) msIO_fprintf(stream, "\n", layerName); if (featureIdIndex != -1) { if (!bGetPropertyValueRequest) { if (outputformat == OWS_GML2) msIO_fprintf(stream, " <%s fid=\"%s\">\n", layerName, pszFID); else /* OWS_GML3 or OWS_GML32 */ msIO_fprintf(stream, " <%s gml:id=\"%s\">\n", layerName, pszFID); } } else { if (!bGetPropertyValueRequest) msIO_fprintf(stream, " <%s>\n", layerName); } if (bSwapAxis) msAxisSwapShape(&shape); /* write the feature geometry and bounding box */ if (!(geometryList && geometryList->numgeometries == 1 && strcasecmp(geometryList->geometries[0].name, "none") == 0)) { if (!bGetPropertyValueRequest) gmlWriteBounds(stream, outputformat, &(shape.bounds), srs, " ", "gml"); if (msOWSLookupMetadata(&(lp->metadata), "F", "geometry_precision")) { geometry_precision = atoi(msOWSLookupMetadata( &(lp->metadata), "F", "geometry_precision")); } else if (msOWSLookupMetadata(&map->web.metadata, "F", "geometry_precision")) { geometry_precision = atoi(msOWSLookupMetadata( &map->web.metadata, "F", "geometry_precision")); } gmlWriteGeometry(stream, geometryList, outputformat, &(shape), srs, namespace_prefix, " ", pszFID, nSRSDimension, geometry_precision); } /* write any item/values */ for (k = 0; k < itemList->numitems; k++) { item = &(itemList->items[k]); if (msItemInGroups(item->name, groupList) == MS_FALSE) msGMLWriteItem(stream, item, shape.values[k], namespace_prefix, " ", outputformat, pszFID); } /* write any constants */ for (k = 0; k < constantList->numconstants; k++) { constant = &(constantList->constants[k]); if (msItemInGroups(constant->name, groupList) == MS_FALSE) msGMLWriteConstant(stream, constant, namespace_prefix, " "); } /* write any groups */ for (k = 0; k < groupList->numgroups; k++) msGMLWriteGroup(stream, &(groupList->groups[k]), &shape, itemList, constantList, namespace_prefix, " ", outputformat, pszFID); if (!bGetPropertyValueRequest) /* end this feature */ msIO_fprintf(stream, " \n", layerName); if (nWFSVersion == OWS_2_0_0) msIO_fprintf(stream, " \n"); else msIO_fprintf(stream, " \n"); msFree(pszFID); pszFID = NULL; msFreeShape(&shape); /* init too */ } msProjectDestroyReprojector(reprojector); msFree(srs); /* done with this layer, do a little clean-up */ msFree(layerName); msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); /* msLayerClose(lp); */ } } /* next layer */ return (MS_SUCCESS); #else /* Stub for mapscript */ (void)map; (void)stream; (void)default_namespace_prefix; (void)outputformat; (void)nWFSVersion; (void)bUseURN; (void)bGetPropertyValueRequest; msSetError(MS_MISCERR, "WFS server support not enabled", "msGMLWriteWFSQuery()"); return MS_FAILURE; #endif /* USE_WFS_SVR */ } #ifdef USE_LIBXML2 /** * msGML3BoundedBy() * * returns an object of BoundedBy as per GML 3 * * @param xmlNsPtr psNs the namespace object * @param minx minx * @param miny miny * @param maxx maxx * @param mayy mayy * @param psEpsg epsg code * @param dimension number of dimensions * * @return psNode xmlNodePtr of XML construct * */ xmlNodePtr msGML3BoundedBy(xmlNsPtr psNs, double minx, double miny, double maxx, double maxy, const char *psEpsg) { xmlNodePtr psNode = NULL, psSubNode = NULL; char *pszTmp = NULL; char *pszTmp2 = NULL; char *pszEpsg = NULL; psNode = xmlNewNode(psNs, BAD_CAST "boundedBy"); psSubNode = xmlNewChild(psNode, NULL, BAD_CAST "Envelope", NULL); if (psEpsg) { const size_t bufferSize = strlen(psEpsg) + 1; pszEpsg = (char *)msSmallMalloc(bufferSize); snprintf(pszEpsg, bufferSize, "%s", psEpsg); msStringToLower(pszEpsg); pszTmp = msStringConcatenate(pszTmp, "urn:ogc:crs:"); pszTmp = msStringConcatenate(pszTmp, pszEpsg); xmlNewProp(psSubNode, BAD_CAST "srsName", BAD_CAST pszTmp); free(pszEpsg); free(pszTmp); pszTmp = msIntToString(2); xmlNewProp(psSubNode, BAD_CAST "srsDimension", BAD_CAST pszTmp); free(pszTmp); } pszTmp = msDoubleToString(minx, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, " "); pszTmp2 = msDoubleToString(miny, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, pszTmp2); xmlNewChild(psSubNode, NULL, BAD_CAST "lowerCorner", BAD_CAST pszTmp); free(pszTmp); free(pszTmp2); pszTmp = msDoubleToString(maxx, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, " "); pszTmp2 = msDoubleToString(maxy, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, pszTmp2); xmlNewChild(psSubNode, NULL, BAD_CAST "upperCorner", BAD_CAST pszTmp); free(pszTmp); free(pszTmp2); return psNode; } /** *msGML3Point() * * returns an object of Point as per GML 3 * * @param xmlNsPtr psNs the gml namespace object * @param pszSrsName EPSG code of geometry * @param id * @param x x coordinate * @param y y coordinate * @param z z coordinate * * @return psNode xmlNodePtr of XML construct * */ xmlNodePtr msGML3Point(xmlNsPtr psNs, const char *psSrsName, const char *id, double x, double y) { xmlNodePtr psNode = xmlNewNode(psNs, BAD_CAST "Point"); if (id) { xmlNewNsProp(psNode, psNs, BAD_CAST "id", BAD_CAST id); } if (psSrsName) { const size_t bufferSize = strlen(psSrsName) + 1; char *pszSrsName = (char *)msSmallMalloc(bufferSize); snprintf(pszSrsName, bufferSize, "%s", psSrsName); msStringToLower(pszSrsName); char *pszTmp = NULL; pszTmp = msStringConcatenate(pszTmp, "urn:ogc:crs:"); pszTmp = msStringConcatenate(pszTmp, pszSrsName); xmlNewProp(psNode, BAD_CAST "srsName", BAD_CAST pszTmp); free(pszSrsName); free(pszTmp); const int dimension = 2; pszTmp = msIntToString(dimension); xmlNewProp(psNode, BAD_CAST "srsDimension", BAD_CAST pszTmp); free(pszTmp); } char *pszTmp = msDoubleToString(x, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, " "); char *pszTmp2 = msDoubleToString(y, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, pszTmp2); xmlNewChild(psNode, NULL, BAD_CAST "pos", BAD_CAST pszTmp); free(pszTmp); free(pszTmp2); return psNode; } /** * msGML3TimePeriod() * * returns an object of TimePeriod as per GML 3 * * @param xmlNsPtr psNs the gml namespace object * @param pszStart start time * @param pszEnd end time * * @return psNode xmlNodePtr of XML construct * */ xmlNodePtr msGML3TimePeriod(xmlNsPtr psNs, char *pszStart, char *pszEnd) { xmlNodePtr psNode = NULL; psNode = xmlNewNode(psNs, BAD_CAST "TimePeriod"); xmlNewChild(psNode, NULL, BAD_CAST "beginPosition", BAD_CAST pszStart); if (pszEnd) xmlNewChild(psNode, NULL, BAD_CAST "endPosition", BAD_CAST pszEnd); else { xmlNewChild(psNode, NULL, BAD_CAST "endPosition", NULL); xmlNewProp(psNode, BAD_CAST "indeterminatePosition", BAD_CAST "now"); } return psNode; } /** * msGML3TimeInstant() * * returns an object of TimeInstant as per GML 3 * * @param xmlNsPtr psNs the gml namespace object * @param timeInstant time instant * * @return psNode xmlNodePtr of XML construct * */ xmlNodePtr msGML3TimeInstant(xmlNsPtr psNs, char *pszTime) { xmlNodePtr psNode = NULL; psNode = xmlNewNode(psNs, BAD_CAST "TimeInstant"); xmlNewChild(psNode, NULL, BAD_CAST "timePosition", BAD_CAST pszTime); return psNode; } #endif /* USE_LIBXML2 */ /************************************************************************/ /* The following functions are enabled in all cases, even if */ /* WMS and WFS are not available. */ /************************************************************************/ gmlItemListObj *msGMLGetItems(layerObj *layer, const char *metadata_namespaces) { int i, j; char **xmlitems = NULL; int numxmlitems = 0; char **incitems = NULL; int numincitems = 0; char **excitems = NULL; int numexcitems = 0; char **optionalitems = NULL; int numoptionalitems = 0; char **mandatoryitems = NULL; int nummandatoryitems = 0; char **defaultitems = NULL; int numdefaultitems = 0; const char *value = NULL; char tag[64]; gmlItemListObj *itemList = NULL; gmlItemObj *item = NULL; /* get a list of items that might be included in output */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "include_items")) != NULL) incitems = msStringSplit(value, ',', &numincitems); /* get a list of items that should be excluded in output */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "exclude_items")) != NULL) excitems = msStringSplit(value, ',', &numexcitems); /* get a list of items that should not be XML encoded */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "xml_items")) != NULL) xmlitems = msStringSplit(value, ',', &numxmlitems); /* get a list of items that should be indicated as optional in * DescribeFeatureType */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "optional_items")) != NULL) optionalitems = msStringSplit(value, ',', &numoptionalitems); /* get a list of items that should be indicated as mandatory in * DescribeFeatureType */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "mandatory_items")) != NULL) mandatoryitems = msStringSplit(value, ',', &nummandatoryitems); /* get a list of items that should be presented by default in GetFeature */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "default_items")) != NULL) defaultitems = msStringSplit(value, ',', &numdefaultitems); /* allocate memory and iinitialize the item collection */ itemList = (gmlItemListObj *)malloc(sizeof(gmlItemListObj)); if (itemList == NULL) { msSetError(MS_MEMERR, "Error allocating a collection GML item structures.", "msGMLGetItems()"); return NULL; } itemList->numitems = layer->numitems; itemList->items = (gmlItemObj *)malloc(sizeof(gmlItemObj) * itemList->numitems); if (!itemList->items) { msSetError(MS_MEMERR, "Error allocating a collection GML item structures.", "msGMLGetItems()"); free(itemList); return NULL; } for (i = 0; i < layer->numitems; i++) { item = &(itemList->items[i]); item->name = msStrdup(layer->items[i]); /* initialize the item */ item->alias = NULL; item->type = NULL; item->template = NULL; item->encode = MS_TRUE; item->visible = MS_FALSE; item->width = 0; item->precision = 0; item->outputByDefault = (numdefaultitems == 0); item->minOccurs = 0; /* check visibility, included items first... */ if (numincitems == 1 && strcasecmp("all", incitems[0]) == 0) { item->visible = MS_TRUE; } else { for (j = 0; j < numincitems; j++) { if (strcasecmp(layer->items[i], incitems[j]) == 0) item->visible = MS_TRUE; } } /* ...and now excluded items */ for (j = 0; j < numexcitems; j++) { if (strcasecmp(layer->items[i], excitems[j]) == 0) item->visible = MS_FALSE; } /* check encoding */ for (j = 0; j < numxmlitems; j++) { if (strcasecmp(layer->items[i], xmlitems[j]) == 0) item->encode = MS_FALSE; } /* check optional */ if (numoptionalitems == 1 && strcasecmp("all", optionalitems[0]) == 0) { item->minOccurs = 0; } else if (numoptionalitems > 0) { item->minOccurs = 1; for (j = 0; j < numoptionalitems; j++) { if (strcasecmp(layer->items[i], optionalitems[j]) == 0) item->minOccurs = 0; } } /* check mandatory */ if (nummandatoryitems == 1 && strcasecmp("all", mandatoryitems[0]) == 0) { item->minOccurs = 1; } else if (nummandatoryitems > 0) { item->minOccurs = 0; for (j = 0; j < nummandatoryitems; j++) { if (strcasecmp(layer->items[i], mandatoryitems[j]) == 0) item->minOccurs = 1; } } /* check default */ for (j = 0; j < numdefaultitems; j++) { if (strcasecmp(layer->items[i], defaultitems[j]) == 0) item->outputByDefault = 1; } snprintf(tag, sizeof(tag), "%s_alias", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->alias = msStrdup(value); snprintf(tag, sizeof(tag), "%s_type", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->type = msStrdup(value); snprintf(tag, sizeof(tag), "%s_template", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->template = msStrdup(value); snprintf(tag, sizeof(tag), "%s_width", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->width = atoi(value); snprintf(tag, sizeof(tag), "%s_precision", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->precision = atoi(value); } msFreeCharArray(incitems, numincitems); msFreeCharArray(excitems, numexcitems); msFreeCharArray(xmlitems, numxmlitems); msFreeCharArray(optionalitems, numoptionalitems); msFreeCharArray(mandatoryitems, nummandatoryitems); msFreeCharArray(defaultitems, numdefaultitems); return itemList; } void msGMLFreeItems(gmlItemListObj *itemList) { int i; if (!itemList) return; for (i = 0; i < itemList->numitems; i++) { msFree(itemList->items[i].name); msFree(itemList->items[i].alias); msFree(itemList->items[i].type); msFree(itemList->items[i].template); } if (itemList->items != NULL) free(itemList->items); free(itemList); } mapserver-8.4.0/src/mapgml.h000066400000000000000000000041051474174441300157550ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Headers for mapgml.c. shapeObj to GML output via MapServer * queries. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPGML_H #define MAPGML_H #ifdef USE_LIBXML2 #include #include xmlNodePtr msGML3BoundedBy(xmlNsPtr psNs, double minx, double miny, double maxx, double maxy, const char *psEpsg); xmlNodePtr msGML3TimePeriod(xmlNsPtr psNs, char *pszStart, char *pszEnd); xmlNodePtr msGML3TimeInstant(xmlNsPtr psNs, char *timeInstant); xmlNodePtr msGML3Point(xmlNsPtr psNs, const char *psSrsName, const char *id, double x, double y); #endif /* USE_LIBXML2 */ #endif mapserver-8.4.0/src/mapgraph.cpp000066400000000000000000000241421474174441300166350ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions for basic undirected, weighted graph support. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "mapgraph.h" #include // for std::swap graphObj *msCreateGraph(signed int numnodes) { graphObj *graph = nullptr; if (numnodes <= 0) return nullptr; graph = (graphObj *)malloc(sizeof(graphObj)); if (!graph) return nullptr; graph->head = (graphNodeObj **)calloc(numnodes, sizeof(graphNodeObj *)); if (!graph->head) { free(graph); return nullptr; } graph->numnodes = numnodes; return graph; } void msFreeGraph(graphObj *graph) { if (!graph) return; graphNodeObj *tmp = nullptr; for (int i = 0; i < graph->numnodes; i++) { while (graph->head[i] != nullptr) { tmp = graph->head[i]; graph->head[i] = graph->head[i]->next; free(tmp); } } free(graph->head); free(graph); } int msGraphAddEdge(graphObj *graph, int src, int dest, double weight) { graphNodeObj *node = nullptr; if (!graph) return MS_FAILURE; // src -> dest node = (graphNodeObj *)malloc(sizeof(graphNodeObj)); if (!node) return MS_FAILURE; node->dest = dest; node->weight = weight; node->next = graph->head[src]; graph->head[src] = node; // dest -> src node = (graphNodeObj *)malloc(sizeof(graphNodeObj)); if (!node) return MS_FAILURE; node->dest = src; node->weight = weight; node->next = graph->head[dest]; graph->head[dest] = node; return MS_SUCCESS; } void msPrintGraph(graphObj *graph) { int i; if (!graph) return; for (i = 0; i < graph->numnodes; i++) { graphNodeObj *node = graph->head[i]; if (node != nullptr) { do { msDebug("%d -> %d (%.6f)\t", i, node->dest, node->weight); node = node->next; } while (node != nullptr); msDebug("\n"); } } } /* ** Derived from an number web resources including: ** ** *https://www.geeksforgeeks.org/dijkstras-algorithm-for-adjacency-list-representation-greedy-algo-8/ ** https://youtube.com/watch?v=pSqmAO-m7Lk ** https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm ** ** Much of the bulk here is for min-heap (key,value) management. */ typedef struct { int idx; double dist; } minHeapNodeObj; typedef struct { int size; int capacity; int *pos; minHeapNodeObj **nodes; } minHeapObj; static minHeapNodeObj *newMinHeapNode(int idx, double dist) { minHeapNodeObj *node = (minHeapNodeObj *)malloc(sizeof(minHeapNodeObj)); if (!node) return nullptr; node->idx = idx; node->dist = dist; return node; } static void freeMinHeap(minHeapObj *minHeap) { if (!minHeap) return; free(minHeap->pos); for (int i = 0; i < minHeap->size; i++) { free(minHeap->nodes[i]); } free(minHeap->nodes); free(minHeap); } static minHeapObj *createMinHeap(signed int capacity) { minHeapObj *minHeap = (minHeapObj *)malloc(sizeof(minHeapObj)); if (!minHeap) return nullptr; minHeap->pos = (int *)malloc(capacity * sizeof(int)); if (!minHeap->pos) { free(minHeap); return nullptr; } minHeap->size = 0; minHeap->capacity = capacity; minHeap->nodes = (minHeapNodeObj **)malloc(capacity * sizeof(minHeapNodeObj *)); if (!minHeap->nodes) { free(minHeap->pos); free(minHeap); return nullptr; } return minHeap; } static void minHeapify(minHeapObj *minHeap, int idx) { int smallest = idx; const int left = 2 * idx + 1; const int right = 2 * idx + 2; if (left < minHeap->size && minHeap->nodes[left]->dist < minHeap->nodes[smallest]->dist) smallest = left; if (right < minHeap->size && minHeap->nodes[right]->dist < minHeap->nodes[smallest]->dist) smallest = right; if (smallest != idx) { minHeapNodeObj *smallestNode = minHeap->nodes[smallest]; minHeapNodeObj *idxNode = minHeap->nodes[idx]; minHeap->pos[smallestNode->idx] = idx; // swap positions minHeap->pos[idxNode->idx] = smallest; std::swap(minHeap->nodes[smallest], minHeap->nodes[idx]); // swap nodes minHeapify(minHeap, smallest); } } static bool isEmpty(const minHeapObj *minHeap) { return minHeap->size == 0; } static minHeapNodeObj *extractMin(minHeapObj *minHeap) { if (isEmpty(minHeap)) return nullptr; // store root node minHeapNodeObj *root = minHeap->nodes[0]; // replace root node with last node minHeapNodeObj *lastNode = minHeap->nodes[minHeap->size - 1]; minHeap->nodes[0] = lastNode; // update position of last node minHeap->pos[root->idx] = minHeap->size - 1; minHeap->pos[lastNode->idx] = 0; // Reduce heap size and heapify root --minHeap->size; minHeapify(minHeap, 0); return root; } static void decreaseKey(minHeapObj *minHeap, int idx, int dist) { // get the index of idx in min heap nodes int i = minHeap->pos[idx]; // get the node and update its dist value minHeap->nodes[i]->dist = dist; // travel up while the complete tree is not hepified (this is a O(Logn) loop) while (i && minHeap->nodes[i]->dist < minHeap->nodes[(i - 1) / 2]->dist) { // swap this node with its parent minHeap->pos[minHeap->nodes[i]->idx] = (i - 1) / 2; minHeap->pos[minHeap->nodes[(i - 1) / 2]->idx] = i; std::swap(minHeap->nodes[i], minHeap->nodes[(i - 1) / 2]); // move to parent index i = (i - 1) / 2; } } static bool isInMinHeap(const minHeapObj *minHeap, int idx) { return minHeap->pos[idx] < minHeap->size; } typedef struct { double *dist; int *prev; } dijkstraOutputObj; static dijkstraOutputObj *dijkstra(graphObj *graph, int src) { int n = graph->numnodes; minHeapObj *minHeap = createMinHeap(n); // priority queue implemented as a min heap structure if (!minHeap) return nullptr; dijkstraOutputObj *output = nullptr; output = (dijkstraOutputObj *)malloc(sizeof(dijkstraOutputObj)); output->dist = (double *)malloc(n * sizeof(double)); output->prev = (int *)malloc(n * sizeof(int)); if (!output->dist || !output->prev) { msFree(output->dist); msFree(output->prev); free(output); freeMinHeap(minHeap); return nullptr; } // initialize for (int i = 0; i < n; i++) { output->dist[i] = HUGE_VAL; output->prev[i] = -1; minHeap->nodes[i] = newMinHeapNode( i, output->dist[i]); // allocate a min heap node for each graph node minHeap->pos[i] = i; } // make dist value of src vertex as 0 so that it is extracted first minHeap->pos[src] = src; output->dist[src] = 0; decreaseKey(minHeap, src, output->dist[src]); // initially size of min heap is equal to graph->numnodes (n) minHeap->size = n; // In the following loop, minHeap contains all nodes // whose shortest distance is not yet finalized. while (!isEmpty(minHeap)) { // extract the vertex with minimum distance value and store the node index minHeapNodeObj *minHeapNode = extractMin(minHeap); int u = minHeapNode->idx; free(minHeapNode); // done with this node // traverse through all adjacent nodes of u and update their distance values graphNodeObj *node = graph->head[u]; while (node != nullptr) { int v = node->dest; // if shortest distance to v is not finalized yet, and distance to v // through u is less than its previously calculated distance if (isInMinHeap(minHeap, v) && output->dist[u] != HUGE_VAL && node->weight + output->dist[u] < output->dist[v]) { output->dist[v] = output->dist[u] + node->weight; output->prev[v] = u; decreaseKey(minHeap, v, output->dist[v]); } node = node->next; } } freeMinHeap(minHeap); return output; } int *msGraphGetLongestShortestPath(graphObj *graph, int src, int *path_size, double *path_dist) { if (!graph || src < 0 || src > graph->numnodes) return nullptr; int *path = (int *)malloc((graph->numnodes) * sizeof(int)); // worst case is path traverses all nodes if (!path) return nullptr; dijkstraOutputObj *output = dijkstra(graph, src); if (!output) { free(path); return nullptr; // algorithm failed for some reason } // get longest shortest distance from src to another node (our dest) *path_dist = -1; int dest = -1; for (int i = 0; i < graph->numnodes; i++) { if (output->dist[i] != HUGE_VAL && *path_dist < output->dist[i]) { *path_dist = output->dist[i]; dest = i; } } if (dest == -1) { // unable to determine destination node free(path); free(output->dist); free(output->prev); free(output); return nullptr; } // construct the path from src to dest int j = 0; for (int i = dest; i != -1; i = output->prev[i], j++) path[j] = i; std::reverse(path, path + j); *path_size = j; // clean up dijkstra output free(output->dist); free(output->prev); free(output); return path; } mapserver-8.4.0/src/mapgraph.h000066400000000000000000000042041474174441300162770ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations for basic undirected, weighted graph support. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPGRAPH_H #define MAPGRAPH_H #ifdef __cplusplus extern "C" { #endif typedef struct graphNodeObj { int dest; double weight; struct graphNodeObj *next; } graphNodeObj; typedef struct { int numnodes; struct graphNodeObj **head; } graphObj; graphObj *msCreateGraph(int numnodes); void msFreeGraph(graphObj *graph); int msGraphAddEdge(graphObj *graph, int src, int dest, double weight); void msPrintGraph(graphObj *graph); int *msGraphGetLongestShortestPath(graphObj *graph, int src, int *path_size, double *path_dist); #ifdef __cplusplus } #endif #endif /* MAPGRAPH_H */ mapserver-8.4.0/src/mapgraticule.c000066400000000000000000001342631474174441300171610ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: Graticule Renderer * Author: John Novak, Novacell Technologies (jnovak@novacell.com) * ********************************************************************** * Copyright (c) 2003, John Novak, Novacell Technologies * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver.h" #include #include "mapproject.h" /********************************************************************************************************************** * */ typedef enum { posBottom = 1, posTop, posLeft, posRight } msGraticulePosition; typedef enum { lpDefault = 0, lpDDMMSS = 1, lpDDMM, lpDD } msLabelProcessingType; void DefineAxis(int iTickCountTarget, double *Min, double *Max, double *Inc); static int _AdjustLabelPosition(layerObj *pLayer, shapeObj *pShape, msGraticulePosition ePosition); static void _FormatLabel(layerObj *pLayer, shapeObj *pShape, double dDataToFormat); int msGraticuleLayerInitItemInfo(layerObj *layer); #define MAPGRATICULE_ARC_SUBDIVISION_DEFAULT (256) #define MAPGRATICULE_ARC_MINIMUM (16) #define MAPGRATICULE_FORMAT_STRING_DEFAULT "%5.2g" #define MAPGRATICULE_FORMAT_STRING_DDMMSS "%3d %02d %02d" #define MAPGRATICULE_FORMAT_STRING_DDMM "%3d %02d" #define MAPGRATICULE_FORMAT_STRING_DD "%3d" /********************************************************************************************************************** * */ int msGraticuleLayerOpen(layerObj *layer) { graticuleObj *pInfo = layer->grid; if (pInfo == NULL) return MS_FAILURE; pInfo->dincrementlatitude = 15.0; pInfo->dincrementlongitude = 15.0; pInfo->dwhichlatitude = -90.0; pInfo->dwhichlongitude = -180.0; pInfo->bvertical = 1; if (layer->numclasses == 0) msDebug("GRID layer has no classes, nothing will be rendered.\n"); if (layer->numclasses > 0 && layer->class[0] -> numlabels > 0) pInfo->blabelaxes = 1; else pInfo->blabelaxes = 0; if (pInfo->labelformat == NULL) { pInfo->labelformat = (char *)msSmallMalloc(strlen(MAPGRATICULE_FORMAT_STRING_DEFAULT) + 1); pInfo->ilabeltype = (int)lpDefault; strcpy(pInfo->labelformat, MAPGRATICULE_FORMAT_STRING_DEFAULT); } else if (strcmp(pInfo->labelformat, "DDMMSS") == 0) { msFree(pInfo->labelformat); pInfo->labelformat = (char *)msSmallMalloc(strlen(MAPGRATICULE_FORMAT_STRING_DDMMSS) + 1); pInfo->ilabeltype = (int)lpDDMMSS; strcpy(pInfo->labelformat, MAPGRATICULE_FORMAT_STRING_DDMMSS); } else if (strcmp(pInfo->labelformat, "DDMM") == 0) { msFree(pInfo->labelformat); pInfo->labelformat = (char *)msSmallMalloc(strlen(MAPGRATICULE_FORMAT_STRING_DDMM) + 1); pInfo->ilabeltype = (int)lpDDMM; strcpy(pInfo->labelformat, MAPGRATICULE_FORMAT_STRING_DDMM); } else if (strcmp(pInfo->labelformat, "DD") == 0) { msFree(pInfo->labelformat); pInfo->labelformat = (char *)msSmallMalloc(strlen(MAPGRATICULE_FORMAT_STRING_DD) + 1); pInfo->ilabeltype = (int)lpDD; strcpy(pInfo->labelformat, MAPGRATICULE_FORMAT_STRING_DD); } return MS_SUCCESS; } /********************************************************************************************************************** * Return MS_TRUE if layer is open, MS_FALSE otherwise. */ int msGraticuleLayerIsOpen(layerObj *layer) { if (layer->grid) return MS_TRUE; return MS_FALSE; } /********************************************************************************************************************** * */ int msGraticuleLayerClose(layerObj *layer) { (void)layer; return MS_SUCCESS; } /********************************************************************************************************************** * */ int msGraticuleLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)isQuery; graticuleObj *pInfo = layer->grid; int iAxisTickCount = 0; rectObj rectMapCoordinates; if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; pInfo->dstartlatitude = rect.miny; pInfo->dstartlongitude = rect.minx; pInfo->dendlatitude = rect.maxy; pInfo->dendlongitude = rect.maxx; pInfo->bvertical = 1; pInfo->extent = rect; if (pInfo->minincrement > 0.0) { pInfo->dincrementlongitude = pInfo->minincrement; pInfo->dincrementlatitude = pInfo->minincrement; } else if (pInfo->maxincrement > 0.0) { pInfo->dincrementlongitude = pInfo->maxincrement; pInfo->dincrementlatitude = pInfo->maxincrement; } else { pInfo->dincrementlongitude = 0; pInfo->dincrementlatitude = 0; } if (pInfo->maxarcs > 0) iAxisTickCount = (int)pInfo->maxarcs; else if (pInfo->minarcs > 0) iAxisTickCount = (int)pInfo->minarcs; DefineAxis(iAxisTickCount, &pInfo->dstartlongitude, &pInfo->dendlongitude, &pInfo->dincrementlongitude); DefineAxis(iAxisTickCount, &pInfo->dstartlatitude, &pInfo->dendlatitude, &pInfo->dincrementlatitude); pInfo->dwhichlatitude = pInfo->dstartlatitude; pInfo->dwhichlongitude = pInfo->dstartlongitude; if (pInfo->minincrement > 0.0 && pInfo->maxincrement > 0.0 && pInfo->minincrement == pInfo->maxincrement) { pInfo->dincrementlongitude = pInfo->minincrement; pInfo->dincrementlatitude = pInfo->minincrement; } else if (pInfo->minincrement > 0.0) { pInfo->dincrementlongitude = pInfo->minincrement; pInfo->dincrementlatitude = pInfo->minincrement; } else if (pInfo->maxincrement > 0.0) { pInfo->dincrementlongitude = pInfo->maxincrement; pInfo->dincrementlatitude = pInfo->maxincrement; } /* * If using PROJ, project rect back into map system, and generate rect corner * points in native system. These lines will be used when generating labels to * get correct placement at arc/rect edge intersections. */ rectMapCoordinates = layer->map->extent; layer->project = msProjectionsDiffer(&(layer->projection), &(layer->map->projection)); if (layer->project && strstr(layer->map->projection.args[0], "epsg:3857") && msProjIsGeographicCRS(&(layer->projection))) { if (rectMapCoordinates.minx < -20037508) rectMapCoordinates.minx = -20037508; if (rectMapCoordinates.maxx > 20037508) rectMapCoordinates.maxx = 20037508; } msFree(pInfo->pboundinglines); pInfo->pboundinglines = (lineObj *)msSmallMalloc(sizeof(lineObj) * 4); msFree(pInfo->pboundingpoints); pInfo->pboundingpoints = (pointObj *)msSmallMalloc(sizeof(pointObj) * 8); { /* * top */ pInfo->pboundinglines[0].numpoints = 2; pInfo->pboundinglines[0].point = &pInfo->pboundingpoints[0]; pInfo->pboundinglines[0].point[0].x = rectMapCoordinates.minx; pInfo->pboundinglines[0].point[0].y = rectMapCoordinates.maxy; pInfo->pboundinglines[0].point[1].x = rectMapCoordinates.maxx; pInfo->pboundinglines[0].point[1].y = rectMapCoordinates.maxy; if (layer->project) msProjectLine(&layer->map->projection, &layer->projection, &pInfo->pboundinglines[0]); /* * bottom */ pInfo->pboundinglines[1].numpoints = 2; pInfo->pboundinglines[1].point = &pInfo->pboundingpoints[2]; pInfo->pboundinglines[1].point[0].x = rectMapCoordinates.minx; pInfo->pboundinglines[1].point[0].y = rectMapCoordinates.miny; pInfo->pboundinglines[1].point[1].x = rectMapCoordinates.maxx; pInfo->pboundinglines[1].point[1].y = rectMapCoordinates.miny; if (layer->project) msProjectLine(&layer->map->projection, &layer->projection, &pInfo->pboundinglines[1]); /* * left */ pInfo->pboundinglines[2].numpoints = 2; pInfo->pboundinglines[2].point = &pInfo->pboundingpoints[4]; pInfo->pboundinglines[2].point[0].x = rectMapCoordinates.minx; pInfo->pboundinglines[2].point[0].y = rectMapCoordinates.miny; pInfo->pboundinglines[2].point[1].x = rectMapCoordinates.minx; pInfo->pboundinglines[2].point[1].y = rectMapCoordinates.maxy; if (layer->project) msProjectLine(&layer->map->projection, &layer->projection, &pInfo->pboundinglines[2]); /* * right */ pInfo->pboundinglines[3].numpoints = 2; pInfo->pboundinglines[3].point = &pInfo->pboundingpoints[6]; pInfo->pboundinglines[3].point[0].x = rectMapCoordinates.maxx; pInfo->pboundinglines[3].point[0].y = rectMapCoordinates.miny; pInfo->pboundinglines[3].point[1].x = rectMapCoordinates.maxx; pInfo->pboundinglines[3].point[1].y = rectMapCoordinates.maxy; if (layer->project) msProjectLine(&layer->map->projection, &layer->projection, &pInfo->pboundinglines[3]); } return MS_SUCCESS; } /********************************************************************************************************************** * */ int msGraticuleLayerNextShape(layerObj *layer, shapeObj *shape) { graticuleObj *pInfo = layer->grid; if (pInfo->minsubdivides <= 0.0 || pInfo->maxsubdivides <= 0.0) pInfo->minsubdivides = pInfo->maxsubdivides = MAPGRATICULE_ARC_SUBDIVISION_DEFAULT; shape->numlines = 1; shape->type = MS_SHAPE_LINE; shape->line = (lineObj *)msSmallMalloc(sizeof(lineObj)); shape->line->numpoints = (int)pInfo->maxsubdivides; shape->line->point = NULL; /* * Subdivide and draw current arc, rendering the arc labels first */ if (pInfo->bvertical) { int iPointIndex; double dArcDelta = (pInfo->dendlatitude - pInfo->dstartlatitude) / (double)shape->line->numpoints; double dArcPosition = pInfo->dstartlatitude + dArcDelta; double dStartY, dDeltaX; switch (pInfo->ilabelstate) { case 0: if (!pInfo->blabelaxes) { /* Bottom */ pInfo->ilabelstate++; msFreeShape(shape); return MS_SUCCESS; } dDeltaX = (pInfo->dwhichlongitude - pInfo->pboundinglines[1].point[0].x) / (pInfo->pboundinglines[1].point[1].x - pInfo->pboundinglines[1].point[0].x); if (dDeltaX < 0) dDeltaX = dDeltaX * -1; dStartY = (pInfo->pboundinglines[1].point[1].y - pInfo->pboundinglines[1].point[0].y) * dDeltaX + pInfo->pboundinglines[1].point[0].y; shape->line->numpoints = (int)2; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line->point[0].x = pInfo->dwhichlongitude; shape->line->point[0].y = dStartY; shape->line->point[1].x = pInfo->dwhichlongitude; shape->line->point[1].y = dStartY + dArcDelta; _FormatLabel(layer, shape, shape->line->point[0].x); if (_AdjustLabelPosition(layer, shape, posBottom) != MS_SUCCESS) { msFreeShape(shape); pInfo->ilabelstate++; return MS_SUCCESS; } pInfo->ilabelstate++; return MS_SUCCESS; case 1: if (!pInfo->blabelaxes) { /* Top */ pInfo->ilabelstate++; msFreeShape(shape); return MS_SUCCESS; } dDeltaX = (pInfo->dwhichlongitude - pInfo->pboundinglines[0].point[0].x) / (pInfo->pboundinglines[0].point[1].x - pInfo->pboundinglines[0].point[0].x); if (dDeltaX < 0) dDeltaX = dDeltaX * -1; dStartY = (pInfo->pboundinglines[0].point[1].y - pInfo->pboundinglines[0].point[0].y) * dDeltaX + pInfo->pboundinglines[0].point[1].y; shape->line->numpoints = (int)2; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line->point[0].x = pInfo->dwhichlongitude; shape->line->point[0].y = dStartY - dArcDelta; shape->line->point[1].x = pInfo->dwhichlongitude; shape->line->point[1].y = dStartY; _FormatLabel(layer, shape, shape->line->point[0].x); if (_AdjustLabelPosition(layer, shape, posTop) != MS_SUCCESS) { msFreeShape(shape); pInfo->ilabelstate++; return MS_SUCCESS; } pInfo->ilabelstate++; return MS_SUCCESS; case 2: shape->line->numpoints = (int)shape->line->numpoints + 1; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * shape->line->numpoints); shape->line->point[0].x = pInfo->dwhichlongitude; shape->line->point[0].y = pInfo->dstartlatitude; for (iPointIndex = 1; iPointIndex < shape->line->numpoints; iPointIndex++) { shape->line->point[iPointIndex].x = pInfo->dwhichlongitude; shape->line->point[iPointIndex].y = dArcPosition; dArcPosition += dArcDelta; } pInfo->ilabelstate = 0; pInfo->dwhichlongitude += pInfo->dincrementlongitude; break; default: pInfo->ilabelstate = 0; break; } } else { /*horizontal*/ int iPointIndex; double dArcDelta = (pInfo->dendlongitude - pInfo->dstartlongitude) / (double)shape->line->numpoints; double dArcPosition = pInfo->dstartlongitude + dArcDelta; double dStartX, dDeltaY; switch (pInfo->ilabelstate) { case 0: if (!pInfo->blabelaxes) { /* Left side */ pInfo->ilabelstate++; msFreeShape(shape); return MS_SUCCESS; } dDeltaY = (pInfo->dwhichlatitude - pInfo->pboundinglines[2].point[0].y) / (pInfo->pboundinglines[2].point[1].y - pInfo->pboundinglines[2].point[0].y); if (dDeltaY < 0) dDeltaY = dDeltaY * -1; dStartX = (pInfo->pboundinglines[2].point[1].x - pInfo->pboundinglines[2].point[0].x) * dDeltaY + pInfo->pboundinglines[2].point[0].x; shape->line->numpoints = (int)2; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line->point[0].x = dStartX; shape->line->point[0].y = pInfo->dwhichlatitude; shape->line->point[1].x = dStartX + dArcDelta; shape->line->point[1].y = pInfo->dwhichlatitude; _FormatLabel(layer, shape, shape->line->point[0].y); if (_AdjustLabelPosition(layer, shape, posLeft) != MS_SUCCESS) { msFreeShape(shape); pInfo->ilabelstate++; return MS_SUCCESS; } pInfo->ilabelstate++; return MS_SUCCESS; case 1: if (!pInfo->blabelaxes) { /* Right side */ pInfo->ilabelstate++; msFreeShape(shape); return MS_SUCCESS; } dDeltaY = (pInfo->dwhichlatitude - pInfo->pboundinglines[3].point[0].y) / (pInfo->pboundinglines[3].point[1].y - pInfo->pboundinglines[3].point[0].y); if (dDeltaY < 0) dDeltaY = dDeltaY * -1; dStartX = (pInfo->pboundinglines[3].point[1].x - pInfo->pboundinglines[3].point[0].x) * dDeltaY + pInfo->pboundinglines[3].point[0].x; shape->line->numpoints = (int)2; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line->point[0].x = dStartX - dArcDelta; shape->line->point[0].y = pInfo->dwhichlatitude; shape->line->point[1].x = dStartX; shape->line->point[1].y = pInfo->dwhichlatitude; _FormatLabel(layer, shape, shape->line->point[0].y); if (_AdjustLabelPosition(layer, shape, posRight) != MS_SUCCESS) { msFreeShape(shape); pInfo->ilabelstate++; return MS_SUCCESS; } pInfo->ilabelstate++; return MS_SUCCESS; case 2: shape->line->numpoints = (int)shape->line->numpoints + 1; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * shape->line->numpoints); shape->line->point[0].x = pInfo->dstartlongitude; shape->line->point[0].y = pInfo->dwhichlatitude; for (iPointIndex = 1; iPointIndex < shape->line->numpoints; iPointIndex++) { shape->line->point[iPointIndex].x = dArcPosition; shape->line->point[iPointIndex].y = pInfo->dwhichlatitude; dArcPosition += dArcDelta; } pInfo->ilabelstate = 0; pInfo->dwhichlatitude += pInfo->dincrementlatitude; break; default: pInfo->ilabelstate = 0; break; } } /* * Increment and move to next arc */ if (pInfo->bvertical && pInfo->dwhichlongitude > pInfo->dendlongitude) { pInfo->dwhichlatitude = pInfo->dstartlatitude; pInfo->bvertical = 0; } if (pInfo->dwhichlatitude > pInfo->dendlatitude) { /* free the lineObj and pointObj that have been erroneously allocated * beforehand */ msFreeShape(shape); return MS_DONE; } return MS_SUCCESS; } /********************************************************************************************************************** * */ int msGraticuleLayerGetItems(layerObj *layer) { char **ppItemName = (char **)msSmallMalloc(sizeof(char *)); *ppItemName = (char *)msSmallMalloc(64); /* why is this necessary? */ strcpy(*ppItemName, "Graticule"); layer->numitems = 1; layer->items = ppItemName; return MS_SUCCESS; } /********************************************************************************************************************** * */ int msGraticuleLayerInitItemInfo(layerObj *layer) { (void)layer; return MS_SUCCESS; } /********************************************************************************************************************** * */ void msGraticuleLayerFreeItemInfo(layerObj *layer) { (void)layer; } /********************************************************************************************************************** * */ int msGraticuleLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { (void)layer; (void)shape; (void)record; return MS_FAILURE; } /********************************************************************************************************************** * */ int msGraticuleLayerGetExtent(layerObj *layer, rectObj *extent) { graticuleObj *pInfo = layer->grid; if (pInfo) { *extent = pInfo->extent; return MS_SUCCESS; } return MS_FAILURE; } /********************************************************************************************************************** * */ int msGraticuleLayerGetAutoStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { (void)map; (void)layer; (void)c; (void)shape; return MS_SUCCESS; } /************************************************************************/ /* msGraticuleLayerFreeIntersectionPoints */ /* */ /* Free intersection object. */ /************************************************************************/ void msGraticuleLayerFreeIntersectionPoints(graticuleIntersectionObj *psValue) { if (psValue) { for (int i = 0; i < psValue->nTop; i++) msFree(psValue->papszTopLabels[i]); msFree(psValue->papszTopLabels); msFree(psValue->pasTop); for (int i = 0; i < psValue->nBottom; i++) msFree(psValue->papszBottomLabels[i]); msFree(psValue->papszBottomLabels); msFree(psValue->pasBottom); for (int i = 0; i < psValue->nLeft; i++) msFree(psValue->papszLeftLabels[i]); msFree(psValue->papszLeftLabels); msFree(psValue->pasLeft); for (int i = 0; i < psValue->nRight; i++) msFree(psValue->papszRightLabels[i]); msFree(psValue->papszRightLabels); msFree(psValue->pasRight); msFree(psValue); } } /************************************************************************/ /* msGraticuleLayerInitIntersectionPoints */ /* */ /* init intersection object. */ /************************************************************************/ static void msGraticuleLayerInitIntersectionPoints(graticuleIntersectionObj *psValue) { if (psValue) { psValue->nTop = 0; psValue->pasTop = NULL; psValue->papszTopLabels = NULL; psValue->nBottom = 0; psValue->pasBottom = NULL; psValue->papszBottomLabels = NULL; psValue->nLeft = 0; psValue->pasLeft = NULL; psValue->papszLeftLabels = NULL; psValue->nRight = 0; psValue->pasRight = NULL; psValue->papszRightLabels = NULL; } } /************************************************************************/ /* msGraticuleLayerGetIntersectionPoints */ /* */ /* Utility function thar returns all intersection positions and */ /* labels (4 sides of the map) for a grid layer. */ /************************************************************************/ graticuleIntersectionObj * msGraticuleLayerGetIntersectionPoints(mapObj *map, layerObj *layer) { shapeObj shapegrid, tmpshape; rectObj searchrect; int status; pointObj oFirstPoint; pointObj oLastPoint; lineObj oLineObj; rectObj cliprect; graticuleObj *pInfo = NULL; double dfTmp; int i = 0; if (layer->connectiontype != MS_GRATICULE) return NULL; pInfo = layer->grid; /*set cellsize if bnot already set*/ if (map->cellsize == 0) map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); if (layer->transform == MS_TRUE) searchrect = map->extent; else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) msProjectRect(&map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ status = msLayerOpen(layer); if (status != MS_SUCCESS) return NULL; status = msLayerWhichShapes(layer, searchrect, MS_FALSE); if (status == MS_DONE) { /* no overlap */ msLayerClose(layer); return NULL; } else if (status != MS_SUCCESS) { msLayerClose(layer); return NULL; } /* step through the target shapes */ msInitShape(&shapegrid); cliprect.minx = map->extent.minx - map->cellsize; cliprect.miny = map->extent.miny - map->cellsize; cliprect.maxx = map->extent.maxx + map->cellsize; cliprect.maxy = map->extent.maxy + map->cellsize; /* clip using the layer projection */ /* msProjectRect(&map->projection , &layer->projection, &cliprect); */ graticuleIntersectionObj *psValues = (graticuleIntersectionObj *)msSmallMalloc( sizeof(graticuleIntersectionObj)); msGraticuleLayerInitIntersectionPoints(psValues); while ((status = msLayerNextShape(layer, &shapegrid)) == MS_SUCCESS) { /*don't really need a class here*/ /* shapegrid.classindex = msShapeGetClass(layer, &shapegrid, map->scaledenom, NULL, 0); if((shapegrid.classindex == -1) || (layer->class[shapegrid.classindex]->status == MS_OFF)) { msFreeShape(&shapegrid); continue; } */ msInitShape(&tmpshape); msCopyShape(&shapegrid, &tmpshape); /* status = msDrawShape(map, layer, &tmpshape, image, -1); */ if (layer->project) { if (layer->reprojectorLayerToMap == NULL) { layer->reprojectorLayerToMap = msProjectCreateReprojector(&layer->projection, &map->projection); } if (layer->reprojectorLayerToMap) msProjectShapeEx(layer->reprojectorLayerToMap, &shapegrid); } msClipPolylineRect(&shapegrid, cliprect); msTransformShapeToPixelRound(&shapegrid, map->extent, map->cellsize); if (shapegrid.numlines <= 0 || shapegrid.line[0].numpoints < 2) { /* once clipped the shape didn't need to be drawn */ msFreeShape(&shapegrid); msFreeShape(&tmpshape); continue; } { int iTmpLine = 0; int nNumPoints = 0; /*grid code seems to return lines that can double cross the extenst??*/ /*creating a more than one clipped shape. Take the shape that has the most points, which should be the most likley to be correct*/ if (shapegrid.numlines > 1) { for (i = 0; i < shapegrid.numlines; i++) { if (shapegrid.line[i].numpoints > nNumPoints) { nNumPoints = shapegrid.line[i].numpoints; iTmpLine = i; } } } /* get the first and last point*/ oFirstPoint.x = shapegrid.line[iTmpLine].point[0].x; oFirstPoint.y = shapegrid.line[iTmpLine].point[0].y; oLineObj = shapegrid.line[iTmpLine]; oLastPoint.x = oLineObj.point[oLineObj.numpoints - 1].x; oLastPoint.y = oLineObj.point[oLineObj.numpoints - 1].y; if (pInfo->bvertical) { /*vertical*/ /*SHAPES ARE DRAWN FROM BOTTOM TO TOP.*/ /*Normally lines are drawn FROM BOTTOM TO TOP but not always for some reason, so make sure that firstpoint < lastpoint in y, We are in pixel coordinates so y increases as we we go down*/ if (oFirstPoint.y < oLastPoint.y) { dfTmp = oFirstPoint.x; oFirstPoint.x = oLastPoint.x; oLastPoint.x = dfTmp; dfTmp = oFirstPoint.y; oFirstPoint.y = oLastPoint.y; oLastPoint.y = dfTmp; } /*first point should cross the BOTTOM base where y== map->height*/ if (abs((int)oFirstPoint.y - map->height) <= 1) { char *pszLabel = NULL; oFirstPoint.y = map->height; /*validate point is in map width/height*/ if (oFirstPoint.x < 0 || oFirstPoint.x > map->width) continue; /*validate point is in map width/height*/ if (oLastPoint.x < 0 || oLastPoint.x > map->width) continue; if (shapegrid.text) pszLabel = msStrdup(shapegrid.text); else { _FormatLabel( layer, &tmpshape, tmpshape.line[0].point[tmpshape.line[0].numpoints - 1].x); if (tmpshape.text) pszLabel = msStrdup(tmpshape.text); else pszLabel = msStrdup("unknown"); } /*validate that the value is not already in the array*/ if (psValues->nBottom > 0) { /* if (psValues->pasBottom[psValues->nBottom-1].x == oFirstPoint.x) continue; */ for (i = 0; i < psValues->nBottom; i++) { if (psValues->pasBottom[i].x == oFirstPoint.x) break; } if (i < psValues->nBottom) { msFree(pszLabel); continue; } } if (psValues->pasBottom == NULL) { psValues->pasBottom = (pointObj *)msSmallMalloc(sizeof(pointObj)); psValues->papszBottomLabels = (char **)msSmallMalloc(sizeof(char *)); psValues->nBottom = 1; } else { psValues->nBottom++; psValues->pasBottom = (pointObj *)msSmallRealloc( psValues->pasBottom, sizeof(pointObj) * psValues->nBottom); psValues->papszBottomLabels = (char **)msSmallRealloc(psValues->papszBottomLabels, sizeof(char *) * psValues->nBottom); } psValues->pasBottom[psValues->nBottom - 1].x = oFirstPoint.x; psValues->pasBottom[psValues->nBottom - 1].y = oFirstPoint.y; psValues->papszBottomLabels[psValues->nBottom - 1] = pszLabel; } /*first point should cross the TOP base where y==0*/ if (abs((int)oLastPoint.y) <= 1) { char *pszLabel = NULL; oLastPoint.y = 0; /*validate point is in map width/height*/ if (oLastPoint.x < 0 || oLastPoint.x > map->width) continue; if (shapegrid.text) pszLabel = msStrdup(shapegrid.text); else { _FormatLabel( layer, &tmpshape, tmpshape.line[0].point[tmpshape.line[0].numpoints - 1].x); if (tmpshape.text) pszLabel = msStrdup(tmpshape.text); else pszLabel = msStrdup("unknown"); } /*validate if same value is not already there*/ if (psValues->nTop > 0) { /* if (psValues->pasTop[psValues->nTop-1].x == oLastPoint.x) continue; */ for (i = 0; i < psValues->nTop; i++) { if (psValues->pasTop[i].x == oLastPoint.x || strcasecmp(pszLabel, psValues->papszTopLabels[i]) == 0) break; } if (i < psValues->nTop) { msFree(pszLabel); continue; } } if (psValues->pasTop == NULL) { psValues->pasTop = (pointObj *)msSmallMalloc(sizeof(pointObj)); psValues->papszTopLabels = (char **)msSmallMalloc(sizeof(char *)); psValues->nTop = 1; } else { psValues->nTop++; psValues->pasTop = (pointObj *)msSmallRealloc( psValues->pasTop, sizeof(pointObj) * psValues->nTop); psValues->papszTopLabels = (char **)msSmallRealloc( psValues->papszTopLabels, sizeof(char *) * psValues->nTop); } psValues->pasTop[psValues->nTop - 1].x = oLastPoint.x; psValues->pasTop[psValues->nTop - 1].y = oLastPoint.y; psValues->papszTopLabels[psValues->nTop - 1] = pszLabel; } } else { /*horizontal*/ /*Normally lines are drawn from left to right but not always for some reason, so make sure that firstpoint < lastpoint in x*/ if (oFirstPoint.x > oLastPoint.x) { dfTmp = oFirstPoint.x; oFirstPoint.x = oLastPoint.x; oLastPoint.x = dfTmp; dfTmp = oFirstPoint.y; oFirstPoint.y = oLastPoint.y; oLastPoint.y = dfTmp; } /*first point should cross the LEFT base where x=0 axis*/ if (abs((int)oFirstPoint.x) <= 1) { char *pszLabel = NULL; oFirstPoint.x = 0; /*validate point is in map width/height*/ if (oFirstPoint.y < 0 || oFirstPoint.y > map->height) continue; if (shapegrid.text) pszLabel = msStrdup(shapegrid.text); else { _FormatLabel( layer, &tmpshape, tmpshape.line[0].point[tmpshape.line[0].numpoints - 1].y); if (tmpshape.text) pszLabel = msStrdup(tmpshape.text); else pszLabel = msStrdup("unknown"); } /*validate that the previous value is not the same*/ if (psValues->nLeft > 0) { /* if (psValues->pasLeft[psValues->nLeft-1].y == oFirstPoint.y) continue; */ for (i = 0; i < psValues->nLeft; i++) { if (psValues->pasLeft[i].y == oFirstPoint.y) break; } if (i < psValues->nLeft) { msFree(pszLabel); continue; } } if (psValues->pasLeft == NULL) { psValues->pasLeft = (pointObj *)msSmallMalloc(sizeof(pointObj)); psValues->papszLeftLabels = (char **)msSmallMalloc(sizeof(char *)); psValues->nLeft = 1; } else { psValues->nLeft++; psValues->pasLeft = (pointObj *)msSmallRealloc( psValues->pasLeft, sizeof(pointObj) * psValues->nLeft); psValues->papszLeftLabels = (char **)msSmallRealloc( psValues->papszLeftLabels, sizeof(char *) * psValues->nLeft); } psValues->pasLeft[psValues->nLeft - 1].x = oFirstPoint.x; psValues->pasLeft[psValues->nLeft - 1].y = oFirstPoint.y; psValues->papszLeftLabels[psValues->nLeft - 1] = pszLabel; /* takes ownership of allocated pszLabel */ } /*first point should cross the RIGHT base where x=map=>width axis*/ if (abs((int)oLastPoint.x - map->width) <= 1) { char *pszLabel = NULL; oLastPoint.x = map->width; /*validate point is in map width/height*/ if (oLastPoint.y < 0 || oLastPoint.y > map->height) continue; if (shapegrid.text) pszLabel = msStrdup(shapegrid.text); else { _FormatLabel( layer, &tmpshape, tmpshape.line[0].point[tmpshape.line[0].numpoints - 1].y); if (tmpshape.text) pszLabel = msStrdup(tmpshape.text); else pszLabel = msStrdup("unknown"); } /*validate that the previous value is not the same*/ if (psValues->nRight > 0) { /* if (psValues->pasRight[psValues->nRight-1].y == oLastPoint.y) continue; */ for (i = 0; i < psValues->nRight; i++) { if (psValues->pasRight[i].y == oLastPoint.y) break; } if (i < psValues->nRight) { msFree(pszLabel); continue; } } if (psValues->pasRight == NULL) { psValues->pasRight = (pointObj *)msSmallMalloc(sizeof(pointObj)); psValues->papszRightLabels = (char **)msSmallMalloc(sizeof(char *)); psValues->nRight = 1; } else { psValues->nRight++; psValues->pasRight = (pointObj *)msSmallRealloc( psValues->pasRight, sizeof(pointObj) * psValues->nRight); psValues->papszRightLabels = (char **)msSmallRealloc( psValues->papszRightLabels, sizeof(char *) * psValues->nRight); } psValues->pasRight[psValues->nRight - 1].x = oLastPoint.x; psValues->pasRight[psValues->nRight - 1].y = oLastPoint.y; psValues->papszRightLabels[psValues->nRight - 1] = pszLabel; } } msFreeShape(&shapegrid); msFreeShape(&tmpshape); } msInitShape(&shapegrid); } msLayerClose(layer); return psValues; } /********************************************************************************************************************** * */ int msGraticuleLayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); layer->vtable->LayerInitItemInfo = msGraticuleLayerInitItemInfo; /* should use defaults for item info functions */ layer->vtable->LayerFreeItemInfo = msGraticuleLayerFreeItemInfo; layer->vtable->LayerOpen = msGraticuleLayerOpen; layer->vtable->LayerIsOpen = msGraticuleLayerIsOpen; layer->vtable->LayerWhichShapes = msGraticuleLayerWhichShapes; layer->vtable->LayerNextShape = msGraticuleLayerNextShape; /* layer->vtable->LayerResultsGetShape, use default */ layer->vtable->LayerGetShape = msGraticuleLayerGetShape; /* layer->vtable->LayerGetShapeCount, use default */ layer->vtable->LayerClose = msGraticuleLayerClose; layer->vtable->LayerGetItems = msGraticuleLayerGetItems; layer->vtable->LayerGetExtent = msGraticuleLayerGetExtent; layer->vtable->LayerGetAutoStyle = msGraticuleLayerGetAutoStyle; /* layer->vtable->LayerCloseConnection, use default */; layer->vtable->LayerSetTimeFilter = msLayerMakePlainTimeFilter; /* layer->vtable->LayerApplyFilterToLayer, use default */ /* layer->vtable->LayerCreateItems, use default */ /* layer->vtable->LayerGetNumFeatures, use default */ return MS_SUCCESS; } /********************************************************************************************************************** * */ static void _FormatLabel(layerObj *pLayer, shapeObj *pShape, double dDataToFormat) { graticuleObj *pInfo = pLayer->grid; char cBuffer[32]; int iDegrees, iMinutes; switch (pInfo->ilabeltype) { case lpDDMMSS: iDegrees = (int)dDataToFormat; dDataToFormat = fabs(dDataToFormat - (double)iDegrees); iMinutes = (int)(dDataToFormat * 60.0); dDataToFormat = dDataToFormat - (((double)iMinutes) / 60.0); sprintf(cBuffer, pInfo->labelformat, iDegrees, iMinutes, (int)(dDataToFormat * 3600.0)); break; case lpDDMM: iDegrees = (int)dDataToFormat; dDataToFormat = fabs(dDataToFormat - (double)iDegrees); sprintf(cBuffer, pInfo->labelformat, iDegrees, (int)(dDataToFormat * 60.0)); break; case lpDD: iDegrees = (int)dDataToFormat; sprintf(cBuffer, pInfo->labelformat, iDegrees); break; case lpDefault: default: sprintf(cBuffer, pInfo->labelformat, dDataToFormat); } pShape->text = msStrdup(cBuffer); } /********************************************************************************************************************** * * Move label position into display area by adjusting underlying shape line. */ static int _AdjustLabelPosition(layerObj *pLayer, shapeObj *pShape, msGraticulePosition ePosition) { graticuleObj *pInfo = pLayer->grid; rectObj rectLabel; pointObj ptPoint; double size = -1; char *labeltxt; if (pInfo == NULL || pShape == NULL) { msSetError(MS_MISCERR, "Assertion failed: Null shape or non-configured grid!, ", "_AdjustLabelPosition()"); return MS_FAILURE; } assert(pLayer->class[0] -> numlabels >= 1); if (msCheckParentPointer(pLayer->map, "map") == MS_FAILURE) return MS_FAILURE; ptPoint = pShape->line->point[0]; if (pLayer->project) { if (pLayer->reprojectorLayerToMap == NULL) { pLayer->reprojectorLayerToMap = msProjectCreateReprojector( &pLayer->projection, &pLayer->map->projection); } if (pLayer->reprojectorLayerToMap) msProjectShapeEx(pLayer->reprojectorLayerToMap, pShape); /* Poor man detection of reprojection failure */ if (msProjIsGeographicCRS(&(pLayer->projection)) != msProjIsGeographicCRS(&(pLayer->map->projection))) { if (ptPoint.x == pShape->line->point[0].x && ptPoint.y == pShape->line->point[0].y) { return MS_FAILURE; } } } if (pLayer->transform) { msTransformShapeToPixelRound(pShape, pLayer->map->extent, pLayer->map->cellsize); } size = pLayer->class[0] ->labels[0] ->size; /* TODO someday: adjust minsize/maxsize/resolution*/ /* We only use the first label as there's no use (yet) in defining multiple labels for GRID layers, as the only label to represent is the longitude or latitude */ labeltxt = msShapeGetLabelAnnotation(pLayer, pShape, pLayer->class[0] -> labels[0]); assert(labeltxt); if (msGetStringSize(pLayer->map, pLayer->class[0] -> labels[0], size, labeltxt, &rectLabel) != MS_SUCCESS) { free(labeltxt); return MS_FAILURE; /* msSetError already called */ } free(labeltxt); switch (ePosition) { case posBottom: pShape->line->point[1].y = pLayer->map->height; pShape->line->point[0].y = pLayer->map->height - (fabs(rectLabel.maxy - rectLabel.miny) * 2 + 5); break; case posTop: pShape->line->point[1].y = 0; pShape->line->point[0].y = fabs(rectLabel.maxy - rectLabel.miny) * 2 + 5; break; case posLeft: pShape->line->point[0].x = 0; pShape->line->point[1].x = fabs(rectLabel.maxx - rectLabel.minx) * 2 + 5; break; case posRight: pShape->line->point[1].x = pLayer->map->width; pShape->line->point[0].x = pLayer->map->width - (fabs(rectLabel.maxx - rectLabel.minx) * 2 + 5); break; } if (pLayer->transform) msTransformPixelToShape(pShape, pLayer->map->extent, pLayer->map->cellsize); if (pLayer->project) { /* Clamp coordinates into the validity area of the projection, in the */ /* particular case of EPSG:3857 (WebMercator) to longlat reprojection */ if (strstr(pLayer->map->projection.args[0], "epsg:3857") && msProjIsGeographicCRS(&(pLayer->projection))) { if (!pLayer->map->projection.gt.need_geotransform && ePosition == posLeft && pShape->line->point[0].x < -20037508) { pShape->line->point[1].x = -20037508 + (pShape->line->point[1].x - pShape->line->point[0].x); pShape->line->point[0].x = -20037508; } else if (pLayer->map->projection.gt.need_geotransform && ePosition == posLeft && pLayer->map->projection.gt.geotransform[0] + pShape->line->point[0].x * pLayer->map->projection.gt.geotransform[1] + pShape->line->point[0].y * pLayer->map->projection.gt.geotransform[2] < -20037508) { double y_tmp; double width = pShape->line->point[1].x - pShape->line->point[0].x; y_tmp = pLayer->map->projection.gt.geotransform[3] + pShape->line->point[0].x * pLayer->map->projection.gt.geotransform[4] + pShape->line->point[0].y * pLayer->map->projection.gt.geotransform[5]; pShape->line->point[0].x = pLayer->map->projection.gt.invgeotransform[0] + -20037508 * pLayer->map->projection.gt.invgeotransform[1] + y_tmp * pLayer->map->projection.gt.invgeotransform[2]; pShape->line->point[1].x = pShape->line->point[0].x + width; } if (!pLayer->map->projection.gt.need_geotransform && ePosition == posRight && pShape->line->point[1].x > 20037508) { pShape->line->point[0].x = 20037508 - (pShape->line->point[1].x - pShape->line->point[0].x); pShape->line->point[1].x = 20037508; } else if (pLayer->map->projection.gt.need_geotransform && ePosition == posRight && pLayer->map->projection.gt.geotransform[0] + pShape->line->point[1].x * pLayer->map->projection.gt.geotransform[1] + pShape->line->point[1].y * pLayer->map->projection.gt.geotransform[2] > 20037508) { double y_tmp; double width = pShape->line->point[1].x - pShape->line->point[0].x; y_tmp = pLayer->map->projection.gt.geotransform[3] + pShape->line->point[1].x * pLayer->map->projection.gt.geotransform[4] + pShape->line->point[1].y * pLayer->map->projection.gt.geotransform[5]; pShape->line->point[1].x = pLayer->map->projection.gt.invgeotransform[0] + 20037508 * pLayer->map->projection.gt.invgeotransform[1] + y_tmp * pLayer->map->projection.gt.invgeotransform[2]; pShape->line->point[0].x = pShape->line->point[1].x - width; } } if (pLayer->reprojectorMapToLayer == NULL) { pLayer->reprojectorMapToLayer = msProjectCreateReprojector( &pLayer->map->projection, &pLayer->projection); } if (pLayer->reprojectorMapToLayer) msProjectShapeEx(pLayer->reprojectorMapToLayer, pShape); } switch (ePosition) { case posBottom: case posTop: pShape->line->point[1].x = ptPoint.x; pShape->line->point[0].x = ptPoint.x; break; case posLeft: case posRight: pShape->line->point[1].y = ptPoint.y; pShape->line->point[0].y = ptPoint.y; break; } return MS_SUCCESS; } /********************************************************************************************************************** ********************************************************************************************************************** * DefineAxes - Copyright (c) 2000, Michael P.D. Bramley. * * Permission is granted to use this code without restriction as long as * this copyright notice appears in all source files. * * Minor tweaks to increment calculations - jnovak */ void DefineAxis(int iTickCountTarget, double *Min, double *Max, double *Inc) { /* define local variables... */ double Test_inc, /* candidate increment value */ Test_min, /* minimum scale value */ Test_max, /* maximum scale value */ Range = *Max - *Min; /* range of data */ int i = 0; /* counter */ /* don't create problems -- solve them */ if (Range < 0) { *Inc = 0; return; } /* handle special case of repeated values */ else if (Range == 0) { *Min = ceil(*Max) - 1; *Max = *Min + 1; *Inc = 1; return; } /* compute candidate for increment */ Test_inc = pow(10.0, ceil(log10(Range / 10))); if (*Inc > 0 && (Test_inc < *Inc || Test_inc > *Inc)) Test_inc = *Inc; /* establish maximum scale value... */ Test_max = ((long)(*Max / Test_inc)) * Test_inc; if (Test_max < *Max) Test_max += Test_inc; /* establish minimum scale value... */ Test_min = Test_max; do { ++i; Test_min -= Test_inc; } while (Test_min > *Min); /* subtracting small values can screw up the scale limits, */ /* eg: if DefineAxis is called with (min,max)=(0.01, 0.1), */ /* then the calculated scale is 1.0408E17 TO 0.05 BY 0.01. */ /* the following if statement corrects for this... */ /* if(fabs(Test_min) < 1E-10) */ /* Test_min = 0 ; */ /* adjust for too few tick marks */ if (iTickCountTarget <= 0) iTickCountTarget = MAPGRATICULE_ARC_MINIMUM; while (i < iTickCountTarget) { Test_inc /= 2; i *= 2; } if (i < 6 && 0) { Test_inc /= 2; if ((Test_min + Test_inc) <= *Min) Test_min += Test_inc; if ((Test_max - Test_inc) >= *Max) Test_max -= Test_inc; } /* pass back axis definition to caller */ *Min = Test_min; *Max = Test_max; *Inc = Test_inc; } /********************************************************************************************************************** **********************************************************************************************************************/ mapserver-8.4.0/src/maphash.c000066400000000000000000000145321474174441300161210ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implement hashTableObj class. * Author: Sean Gillies, sgillies@frii.com * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "mapserver.h" #include "maphash.h" static unsigned hash(const char *key) { unsigned hashval; for (hashval = 0; *key != '\0'; key++) hashval = tolower(*key) + 31 * hashval; return (hashval % MS_HASHSIZE); } hashTableObj *msCreateHashTable() { int i; hashTableObj *table; table = (hashTableObj *)msSmallMalloc(sizeof(hashTableObj)); table->items = (struct hashObj **)msSmallMalloc(sizeof(struct hashObj *) * MS_HASHSIZE); for (i = 0; i < MS_HASHSIZE; i++) table->items[i] = NULL; table->numitems = 0; return table; } int initHashTable(hashTableObj *table) { int i; table->items = (struct hashObj **)malloc(sizeof(struct hashObj *) * MS_HASHSIZE); MS_CHECK_ALLOC(table->items, sizeof(struct hashObj *) * MS_HASHSIZE, MS_FAILURE); for (i = 0; i < MS_HASHSIZE; i++) table->items[i] = NULL; table->numitems = 0; return MS_SUCCESS; } void msFreeHashTable(hashTableObj *table) { if (table != NULL) { msFreeHashItems(table); free(table); } } int msHashIsEmpty(const hashTableObj *table) { if (table->numitems == 0) return MS_TRUE; else return MS_FALSE; } void msFreeHashItems(hashTableObj *table) { int i; struct hashObj *tp = NULL; struct hashObj *prev_tp = NULL; if (table) { if (table->items) { for (i = 0; i < MS_HASHSIZE; i++) { if (table->items[i] != NULL) { for (tp = table->items[i]; tp != NULL; prev_tp = tp, tp = tp->next, free(prev_tp)) { msFree(tp->key); msFree(tp->data); } } } free(table->items); table->items = NULL; } else { msSetError(MS_HASHERR, "No items allocated.", "msFreeHashItems()"); } } else { msSetError(MS_HASHERR, "Can't free NULL table", "msFreeHashItems()"); } } struct hashObj *msInsertHashTable(hashTableObj *table, const char *key, const char *value) { struct hashObj *tp; unsigned hashval; if (!table || !key || !value) { msSetError(MS_HASHERR, "Invalid hash table or key", "msInsertHashTable"); return NULL; } for (tp = table->items[hash(key)]; tp != NULL; tp = tp->next) if (strcasecmp(key, tp->key) == 0) break; if (tp == NULL) { /* not found */ tp = (struct hashObj *)malloc(sizeof(*tp)); MS_CHECK_ALLOC(tp, sizeof(*tp), NULL); tp->key = msStrdup(key); hashval = hash(key); tp->next = table->items[hashval]; table->items[hashval] = tp; table->numitems++; } else { free(tp->data); } if ((tp->data = msStrdup(value)) == NULL) return NULL; return tp; } const char *msLookupHashTable(const hashTableObj *table, const char *key) { struct hashObj *tp; if (!table || !key) { return (NULL); } for (tp = table->items[hash(key)]; tp != NULL; tp = tp->next) if (strcasecmp(key, tp->key) == 0) return (tp->data); return NULL; } int msRemoveHashTable(hashTableObj *table, const char *key) { struct hashObj *tp; struct hashObj *prev_tp = NULL; int status = MS_FAILURE; if (!table || !key) { msSetError(MS_HASHERR, "No hash table", "msRemoveHashTable"); return MS_FAILURE; } tp = table->items[hash(key)]; if (!tp) { msSetError(MS_HASHERR, "No such hash entry", "msRemoveHashTable"); return MS_FAILURE; } prev_tp = NULL; while (tp != NULL) { if (strcasecmp(key, tp->key) == 0) { status = MS_SUCCESS; if (prev_tp) { prev_tp->next = tp->next; msFree(tp->key); msFree(tp->data); free(tp); break; } else { table->items[hash(key)] = tp->next; msFree(tp->key); msFree(tp->data); free(tp); break; } } prev_tp = tp; tp = tp->next; } if (status == MS_SUCCESS) table->numitems--; return status; } const char *msFirstKeyFromHashTable(const hashTableObj *table) { int hash_index; if (!table) { msSetError(MS_HASHERR, "No hash table", "msFirstKeyFromHashTable"); return NULL; } for (hash_index = 0; hash_index < MS_HASHSIZE; hash_index++) { if (table->items[hash_index] != NULL) return table->items[hash_index]->key; } return NULL; } const char *msNextKeyFromHashTable(const hashTableObj *table, const char *lastKey) { int hash_index; struct hashObj *link; if (!table) { msSetError(MS_HASHERR, "No hash table", "msNextKeyFromHashTable"); return NULL; } if (lastKey == NULL) return msFirstKeyFromHashTable(table); hash_index = hash(lastKey); for (link = table->items[hash_index]; link != NULL && strcasecmp(lastKey, link->key) != 0; link = link->next) { } if (link != NULL && link->next != NULL) return link->next->key; while (++hash_index < MS_HASHSIZE) { if (table->items[hash_index] != NULL) return table->items[hash_index]->key; } return NULL; } mapserver-8.4.0/src/maphash.h000066400000000000000000000116151474174441300161250ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations for the hashTableObj and related stuff. * Author: Sean Gillies, sgillies@frii.com * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPHASH__H #define MAPHASH__H #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32) && !defined(__CYGWIN__) #define MS_DLL_EXPORT __declspec(dllexport) #else #define MS_DLL_EXPORT #endif #define MS_HASHSIZE 41 /* ========================================================================= * Structs * ========================================================================= */ #ifndef SWIG struct hashObj { struct hashObj *next; /* pointer to next item */ char *key; /* string key that is hashed */ char *data; /* string stored in this item */ }; #endif /*SWIG*/ /** * An object to store key-value pairs * */ typedef struct { #ifndef SWIG struct hashObj **items; /* the hash table */ #endif #ifdef SWIG %immutable; #endif /*SWIG*/ int numitems; ///< \**immutable** number of items #ifdef SWIG %mutable; #endif /*SWIG*/ } hashTableObj; /* ========================================================================= * Functions * ========================================================================= */ #ifndef SWIG /* msCreateHashTable - create a hash table * ARGS: * None * RETURNS: * New hash table */ MS_DLL_EXPORT hashTableObj *msCreateHashTable(void); /* For use in mapfile.c with hashTableObj structure members */ MS_DLL_EXPORT int initHashTable(hashTableObj *table); /* msFreeHashTable - free allocated memory * ARGS: * table - target hash table * RETURNS: * None */ MS_DLL_EXPORT void msFreeHashTable(hashTableObj *table); /* Free only the items for hashTableObj structure members (metadata, &c) */ MS_DLL_EXPORT void msFreeHashItems(hashTableObj *table); /* msInsertHashTable - insert new item * ARGS: * table - the target hash table * key - key string for new item * value - data string for new item * RETURNS: * pointer to the new item or NULL * EXCEPTIONS: * raise MS_HASHERR on failure */ MS_DLL_EXPORT struct hashObj * msInsertHashTable(hashTableObj *table, const char *key, const char *value); /* msLookupHashTable - get the value of an item by its key * ARGS: * table - the target hash table * key - key string of item * RETURNS: * string value of item */ MS_DLL_EXPORT const char *msLookupHashTable(const hashTableObj *table, const char *key); /* msRemoveHashTable - remove item from table at key * ARGS: * table - target hash table * key - key string * RETURNS: * MS_SUCCESS or MS_FAILURE */ MS_DLL_EXPORT int msRemoveHashTable(hashTableObj *table, const char *key); /* msFirstKeyFromHashTable - get key of first item * ARGS: * table - target hash table * RETURNS: * first key as a string */ MS_DLL_EXPORT const char *msFirstKeyFromHashTable(const hashTableObj *table); /* msNextKeyFromHashTable - get next key * ARGS: * table - target hash table * prevkey - the previous key * RETURNS: * the key of the item of following prevkey as a string */ MS_DLL_EXPORT const char *msNextKeyFromHashTable(const hashTableObj *table, const char *prevkey); /* msHashIsEmpty - get next key * ARGS: * table - target hash table * RETURNS: * MS_TRUE if the table is empty and MS_FALSE if the table has items */ MS_DLL_EXPORT int msHashIsEmpty(const hashTableObj *table); #endif /*SWIG*/ #ifdef __cplusplus } #endif #endif /* MAPHASH__H */ mapserver-8.4.0/src/maphttp.c000066400000000000000000001032061474174441300161520ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: Utility functions to access files via HTTP (requires libcurl) * Author: Daniel Morissette, DM Solutions Group (morissette@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2001-2003, Daniel Morissette, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #define NEED_IGNORE_RET_VAL /* For now this code is enabled only when WMS/WFS client is enabled. * This should be changed to a test on the presence of libcurl which * is really what the real dependency is. */ #include "mapserver-config.h" #if defined(USE_CURL) #include "mapserver.h" #include "maphttp.h" #include "maperror.h" #include "mapthread.h" #include "mapows.h" #include "cpl_conv.h" #include #ifndef _WIN32 #include #include #endif /* * Note: This code uses libcurl to access remote files via the HTTP protocol. * Requires libcurl v 7.10 or more recent. * See http://curl.haxx.se/libcurl/c/ for the lib source code and docs. */ #include #ifndef CURL_AT_LEAST_VERSION #define CURL_VERSION_BITS(x, y, z) ((x) << 16 | (y) << 8 | z) #define CURL_AT_LEAST_VERSION(x, y, z) \ (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) #endif // #ifndef CURL_AT_LEAST_VERSION #define unchecked_curl_easy_setopt(handle, opt, param) \ IGNORE_RET_VAL(curl_easy_setopt(handle, opt, param)) /********************************************************************** * msHTTPInit() * * This function is called to init libcurl before the first HTTP request * in this process is executed. * On further calls (when gbCurlInitialized = MS_TRUE) it simply doest nothing. * * Returns MS_SUCCESS/MS_FAILURE. * * msHTTPCleanup() will have to be called in msCleanup() when this process * exits. **********************************************************************/ static int gbCurlInitialized = MS_FALSE; int msHTTPInit() { /* curl_global_init() should only be called once (no matter how * many threads or libcurl sessions that'll be used) by every * application that uses libcurl. */ msAcquireLock(TLOCK_OWS); if (!gbCurlInitialized && curl_global_init(CURL_GLOBAL_ALL) != 0) { msReleaseLock(TLOCK_OWS); msSetError(MS_HTTPERR, "Libcurl initialization failed.", "msHTTPInit()"); return MS_FAILURE; } gbCurlInitialized = MS_TRUE; msReleaseLock(TLOCK_OWS); return MS_SUCCESS; } /********************************************************************** * msHTTPCleanup() * **********************************************************************/ void msHTTPCleanup() { msAcquireLock(TLOCK_OWS); if (gbCurlInitialized) curl_global_cleanup(); gbCurlInitialized = MS_FALSE; msReleaseLock(TLOCK_OWS); } /********************************************************************** * msHTTPInitRequestObj() * * Should be called on a new array of httpRequestObj to initialize them * for use with msHTTPExecuteRequest(), etc. * **********************************************************************/ void msHTTPInitRequestObj(httpRequestObj *pasReqInfo, int numRequests) { int i; for (i = 0; i < numRequests; i++) { pasReqInfo[i].pszGetUrl = NULL; pasReqInfo[i].pszPostRequest = NULL; pasReqInfo[i].pszPostContentType = NULL; pasReqInfo[i].pszOutputFile = NULL; pasReqInfo[i].nLayerId = 0; pasReqInfo[i].nTimeout = 0; pasReqInfo[i].nMaxBytes = 0; pasReqInfo[i].nStatus = 0; pasReqInfo[i].pszContentType = NULL; pasReqInfo[i].pszErrBuf = NULL; pasReqInfo[i].pszUserAgent = NULL; pasReqInfo[i].pszHTTPCookieData = NULL; pasReqInfo[i].pszProxyAddress = NULL; pasReqInfo[i].pszProxyUsername = NULL; pasReqInfo[i].pszProxyPassword = NULL; pasReqInfo[i].pszHttpUsername = NULL; pasReqInfo[i].pszHttpPassword = NULL; pasReqInfo[i].debug = MS_FALSE; pasReqInfo[i].curl_handle = NULL; pasReqInfo[i].fp = NULL; pasReqInfo[i].result_data = NULL; pasReqInfo[i].result_size = 0; pasReqInfo[i].result_buf_size = 0; } } /********************************************************************** * msHTTPFreeRequestObj() * **********************************************************************/ void msHTTPFreeRequestObj(httpRequestObj *pasReqInfo, int numRequests) { int i; for (i = 0; i < numRequests; i++) { if (pasReqInfo[i].pszGetUrl) free(pasReqInfo[i].pszGetUrl); pasReqInfo[i].pszGetUrl = NULL; if (pasReqInfo[i].pszPostRequest) free(pasReqInfo[i].pszPostRequest); pasReqInfo[i].pszPostRequest = NULL; if (pasReqInfo[i].pszPostContentType) free(pasReqInfo[i].pszPostContentType); pasReqInfo[i].pszPostContentType = NULL; if (pasReqInfo[i].pszOutputFile) free(pasReqInfo[i].pszOutputFile); pasReqInfo[i].pszOutputFile = NULL; if (pasReqInfo[i].pszContentType) free(pasReqInfo[i].pszContentType); pasReqInfo[i].pszContentType = NULL; if (pasReqInfo[i].pszErrBuf) free(pasReqInfo[i].pszErrBuf); pasReqInfo[i].pszErrBuf = NULL; if (pasReqInfo[i].pszUserAgent) free(pasReqInfo[i].pszUserAgent); pasReqInfo[i].pszUserAgent = NULL; if (pasReqInfo[i].pszHTTPCookieData) free(pasReqInfo[i].pszHTTPCookieData); pasReqInfo[i].pszHTTPCookieData = NULL; pasReqInfo[i].curl_handle = NULL; free(pasReqInfo[i].result_data); pasReqInfo[i].result_data = NULL; pasReqInfo[i].result_size = 0; pasReqInfo[i].result_buf_size = 0; } } /********************************************************************** * msHTTPWriteFct() * * CURL_OPTWRITEFUNCTION, called to write blocks of data to the file we * are downloading. Should return the number of bytes that were taken * care of. If that amount differs from the amount passed to it * it'll signal an error to the library and it will abort the transfer * and produce a CURLE_WRITE_ERROR. * **********************************************************************/ static size_t msHTTPWriteFct(void *buffer, size_t size, size_t nmemb, void *reqInfo) { httpRequestObj *psReq; psReq = (httpRequestObj *)reqInfo; if (psReq->debug) { msDebug("msHTTPWriteFct(id=%d, %d bytes)\n", psReq->nLayerId, (int)(size * nmemb)); } if (psReq->nMaxBytes > 0 && (psReq->result_size + size * nmemb) > (size_t)psReq->nMaxBytes) { msSetError(MS_HTTPERR, "Requested transfer larger than configured maximum %d.", "msHTTPWriteFct()", psReq->nMaxBytes); return -1; } /* Case where we are writing to a disk file. */ if (psReq->fp != NULL) { psReq->result_size += size * nmemb; return fwrite(buffer, size, nmemb, psReq->fp); } /* Case where we build up the result in memory */ else { if (psReq->result_data == NULL) { psReq->result_buf_size = size * nmemb + 10000; psReq->result_data = (char *)msSmallMalloc(psReq->result_buf_size); } else if (psReq->result_size + nmemb * size > (size_t)psReq->result_buf_size) { psReq->result_buf_size = psReq->result_size + nmemb * size + 10000; psReq->result_data = (char *)msSmallRealloc(psReq->result_data, psReq->result_buf_size); } if (psReq->result_data == NULL) { msSetError(MS_HTTPERR, "Unable to grow HTTP result buffer to size %d.", "msHTTPWriteFct()", psReq->result_buf_size); psReq->result_buf_size = 0; psReq->result_size = 0; return -1; } memcpy(psReq->result_data + psReq->result_size, buffer, size * nmemb); psReq->result_size += size * nmemb; return size * nmemb; } } /********************************************************************** * msGetCURLAuthType() * * Returns the equivalent CURL CURLAUTH_ constant given a * MS_HTTP_AUTH_TYPE, or CURLAUTH_BASIC if no match is found. **********************************************************************/ long msGetCURLAuthType(enum MS_HTTP_AUTH_TYPE authType) { switch (authType) { case MS_BASIC: return CURLAUTH_BASIC; case MS_DIGEST: return CURLAUTH_DIGEST; case MS_NTLM: return CURLAUTH_NTLM; case MS_ANY: return CURLAUTH_ANY; case MS_ANYSAFE: return CURLAUTH_ANYSAFE; default: return CURLAUTH_BASIC; } } /********************************************************************** * msHTTPAuthProxySetup() * * Common code used by msPrepareWFSLayerRequest() and * msPrepareWMSLayerRequest() to handle proxy / http auth for requests * * Return value: * MS_SUCCESS if all requests completed successfully. * MS_FAILURE if a fatal error happened **********************************************************************/ int msHTTPAuthProxySetup(hashTableObj *mapmd, hashTableObj *lyrmd, httpRequestObj *pasReqInfo, int numRequests, mapObj *map, const char *namespaces) { const char *pszTmp; char *pszProxyHost = NULL; long nProxyPort = 0; char *pszProxyUsername = NULL, *pszProxyPassword = NULL; char *pszHttpAuthUsername = NULL, *pszHttpAuthPassword = NULL; enum MS_HTTP_AUTH_TYPE eHttpAuthType = MS_BASIC; enum MS_HTTP_AUTH_TYPE eProxyAuthType = MS_BASIC; enum MS_HTTP_PROXY_TYPE eProxyType = MS_HTTP; /* ------------------------------------------------------------------ * Check for authentication and proxying metadata. If the metadata is not * found in the layer metadata, check the map-level metadata. * ------------------------------------------------------------------ */ if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_host")) != NULL) { pszProxyHost = msStrdup(pszTmp); } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_port")) != NULL) { nProxyPort = atol(pszTmp); } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_type")) != NULL) { if (strcasecmp(pszTmp, "HTTP") == 0) eProxyType = MS_HTTP; else if (strcasecmp(pszTmp, "SOCKS5") == 0) eProxyType = MS_SOCKS5; else { msSetError(MS_WMSERR, "Invalid proxy_type metadata '%s' specified", "msHTTPAuthProxySetup()", pszTmp); return MS_FAILURE; } } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_auth_type")) != NULL) { if (strcasecmp(pszTmp, "BASIC") == 0) eProxyAuthType = MS_BASIC; else if (strcasecmp(pszTmp, "DIGEST") == 0) eProxyAuthType = MS_DIGEST; else if (strcasecmp(pszTmp, "NTLM") == 0) eProxyAuthType = MS_NTLM; else if (strcasecmp(pszTmp, "ANY") == 0) eProxyAuthType = MS_ANY; else if (strcasecmp(pszTmp, "ANYSAFE") == 0) eProxyAuthType = MS_ANYSAFE; else { msSetError(MS_WMSERR, "Invalid proxy_auth_type metadata '%s' specified", "msHTTPAuthProxySetup()", pszTmp); return MS_FAILURE; } } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_username")) != NULL) { pszProxyUsername = msStrdup(pszTmp); } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_password")) != NULL) { pszProxyPassword = msDecryptStringTokens(map, pszTmp); if (pszProxyPassword == NULL) { msFree(pszProxyHost); msFree(pszProxyUsername); return (MS_FAILURE); /* An error should already have been produced */ } } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "auth_type")) != NULL) { if (strcasecmp(pszTmp, "BASIC") == 0) eHttpAuthType = MS_BASIC; else if (strcasecmp(pszTmp, "DIGEST") == 0) eHttpAuthType = MS_DIGEST; else if (strcasecmp(pszTmp, "NTLM") == 0) eHttpAuthType = MS_NTLM; else if (strcasecmp(pszTmp, "ANY") == 0) eHttpAuthType = MS_ANY; else if (strcasecmp(pszTmp, "ANYSAFE") == 0) eHttpAuthType = MS_ANYSAFE; else { msSetError(MS_WMSERR, "Invalid auth_type metadata '%s' specified", "msHTTPAuthProxySetup()", pszTmp); return MS_FAILURE; } } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "auth_username")) != NULL) { pszHttpAuthUsername = msStrdup(pszTmp); } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "auth_password")) != NULL) { pszHttpAuthPassword = msDecryptStringTokens(map, pszTmp); if (pszHttpAuthPassword == NULL) { msFree(pszHttpAuthUsername); msFree(pszProxyHost); msFree(pszProxyUsername); msFree(pszProxyPassword); return (MS_FAILURE); /* An error should already have been produced */ } } pasReqInfo[numRequests].pszProxyAddress = pszProxyHost; pasReqInfo[numRequests].nProxyPort = nProxyPort; pasReqInfo[numRequests].eProxyType = eProxyType; pasReqInfo[numRequests].eProxyAuthType = eProxyAuthType; pasReqInfo[numRequests].pszProxyUsername = pszProxyUsername; pasReqInfo[numRequests].pszProxyPassword = pszProxyPassword; pasReqInfo[numRequests].eHttpAuthType = eHttpAuthType; pasReqInfo[numRequests].pszHttpUsername = pszHttpAuthUsername; pasReqInfo[numRequests].pszHttpPassword = pszHttpAuthPassword; return MS_SUCCESS; } /********************************************************************** * msHTTPExecuteRequests() * * Fetch a map slide via HTTP request and save to specified temp file. * * If bCheckLocalCache==MS_TRUE then if the pszOutputfile already exists * then it is not downloaded again, and status 242 is returned. * * Return value: * MS_SUCCESS if all requests completed successfully. * MS_FAILURE if a fatal error happened * MS_DONE if some requests failed with 40x status for instance (not fatal) **********************************************************************/ int msHTTPExecuteRequests(httpRequestObj *pasReqInfo, int numRequests, int bCheckLocalCache) { int i, nStatus = MS_SUCCESS, nTimeout, still_running = 0, num_msgs = 0; CURLM *multi_handle; CURLMsg *curl_msg; char debug = MS_FALSE; const char *pszCurlCABundle = NULL; if (numRequests == 0) return MS_SUCCESS; /* Nothing to do */ if (!gbCurlInitialized) msHTTPInit(); /* Establish the timeout (seconds) for how long we are going to wait * for a response. * We use the longest timeout value in the array of requests */ nTimeout = pasReqInfo[0].nTimeout; for (i = 0; i < numRequests; i++) { if (pasReqInfo[i].nTimeout > nTimeout) nTimeout = pasReqInfo[i].nTimeout; if (pasReqInfo[i].debug) debug = MS_TRUE; /* For the download loop */ } if (nTimeout <= 0) nTimeout = 30; /* Check if we've got a CURL_CA_BUNDLE env. var. * If set then the value is the full path to the ca-bundle.crt file * e.g. CURL_CA_BUNDLE=/usr/local/share/curl/curl-ca-bundle.crt */ pszCurlCABundle = CPLGetConfigOption("CURL_CA_BUNDLE", NULL); if (debug) { msDebug("HTTP: Starting to prepare HTTP requests.\n"); if (pszCurlCABundle) msDebug("Using CURL_CA_BUNDLE=%s\n", pszCurlCABundle); } const char *pszHttpVersion = CPLGetConfigOption("CURL_HTTP_VERSION", NULL); /* Alloc a curl-multi handle, and add a curl-easy handle to it for each * file to download. */ multi_handle = curl_multi_init(); if (multi_handle == NULL) { msSetError(MS_HTTPERR, "curl_multi_init() failed.", "msHTTPExecuteRequests()"); return (MS_FAILURE); } for (i = 0; i < numRequests; i++) { CURL *http_handle; FILE *fp; if (pasReqInfo[i].pszGetUrl == NULL) { msSetError(MS_HTTPERR, "URL or output file parameter missing.", "msHTTPExecuteRequests()"); return (MS_FAILURE); } if (pasReqInfo[i].debug) { msDebug("HTTP request: id=%d, %s\n", pasReqInfo[i].nLayerId, pasReqInfo[i].pszGetUrl); } /* Reset some members */ pasReqInfo[i].nStatus = 0; if (pasReqInfo[i].pszContentType) free(pasReqInfo[i].pszContentType); pasReqInfo[i].pszContentType = NULL; /* Check local cache if requested */ if (bCheckLocalCache && pasReqInfo[i].pszOutputFile != NULL) { fp = fopen(pasReqInfo[i].pszOutputFile, "r"); if (fp) { /* File already there, don't download again. */ if (pasReqInfo[i].debug) msDebug("HTTP request: id=%d, found in cache, skipping.\n", pasReqInfo[i].nLayerId); fclose(fp); pasReqInfo[i].nStatus = 242; pasReqInfo[i].pszContentType = msStrdup("unknown/cached"); continue; } } /* Alloc curl handle */ http_handle = curl_easy_init(); if (http_handle == NULL) { msSetError(MS_HTTPERR, "curl_easy_init() failed.", "msHTTPExecuteRequests()"); return (MS_FAILURE); } pasReqInfo[i].curl_handle = http_handle; /* set URL, note that curl keeps only a ref to our string buffer */ unchecked_curl_easy_setopt(http_handle, CURLOPT_URL, pasReqInfo[i].pszGetUrl); #if CURL_AT_LEAST_VERSION(7, 85, 0) unchecked_curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS_STR, "http,https"); #else unchecked_curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); #endif if (pszHttpVersion && strcmp(pszHttpVersion, "1.0") == 0) unchecked_curl_easy_setopt(http_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); else if (pszHttpVersion && strcmp(pszHttpVersion, "1.1") == 0) unchecked_curl_easy_setopt(http_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); /* Set User-Agent (auto-generate if not set by caller */ if (pasReqInfo[i].pszUserAgent == NULL) { curl_version_info_data *psCurlVInfo; psCurlVInfo = curl_version_info(CURLVERSION_NOW); pasReqInfo[i].pszUserAgent = (char *)msSmallMalloc(100 * sizeof(char)); if (pasReqInfo[i].pszUserAgent) { sprintf(pasReqInfo[i].pszUserAgent, "MapServer/%s libcurl/%d.%d.%d", MS_VERSION, psCurlVInfo->version_num / 0x10000 & 0xff, psCurlVInfo->version_num / 0x100 & 0xff, psCurlVInfo->version_num & 0xff); } } if (pasReqInfo[i].pszUserAgent) { unchecked_curl_easy_setopt(http_handle, CURLOPT_USERAGENT, pasReqInfo[i].pszUserAgent); } /* Enable following redirections. Requires libcurl 7.10.1 at least */ unchecked_curl_easy_setopt(http_handle, CURLOPT_FOLLOWLOCATION, 1); unchecked_curl_easy_setopt(http_handle, CURLOPT_MAXREDIRS, 10); /* Set timeout.*/ unchecked_curl_easy_setopt(http_handle, CURLOPT_TIMEOUT, nTimeout); /* Pass CURL_CA_BUNDLE if set */ if (pszCurlCABundle) unchecked_curl_easy_setopt(http_handle, CURLOPT_CAINFO, pszCurlCABundle); /* Set proxying settings */ if (pasReqInfo[i].pszProxyAddress != NULL && strlen(pasReqInfo[i].pszProxyAddress) > 0) { long nProxyType = CURLPROXY_HTTP; unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXY, pasReqInfo[i].pszProxyAddress); if (pasReqInfo[i].nProxyPort > 0 && pasReqInfo[i].nProxyPort < 65535) { unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXYPORT, pasReqInfo[i].nProxyPort); } switch (pasReqInfo[i].eProxyType) { case MS_HTTP: nProxyType = CURLPROXY_HTTP; break; case MS_SOCKS5: nProxyType = CURLPROXY_SOCKS5; break; } unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXYTYPE, nProxyType); /* If there is proxy authentication information, set it */ if (pasReqInfo[i].pszProxyUsername != NULL && pasReqInfo[i].pszProxyPassword != NULL && strlen(pasReqInfo[i].pszProxyUsername) > 0 && strlen(pasReqInfo[i].pszProxyPassword) > 0) { char szUsernamePasswd[128]; #if LIBCURL_VERSION_NUM >= 0x070a07 long nProxyAuthType = CURLAUTH_BASIC; /* CURLOPT_PROXYAUTH available only in Curl 7.10.7 and up */ nProxyAuthType = msGetCURLAuthType(pasReqInfo[i].eProxyAuthType); unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXYAUTH, nProxyAuthType); #else /* We log an error but don't abort processing */ msSetError(MS_HTTPERR, "CURLOPT_PROXYAUTH not supported. Requires Curl 7.10.7 and " "up. *_proxy_auth_type setting ignored.", "msHTTPExecuteRequests()"); #endif /* LIBCURL_VERSION_NUM */ snprintf(szUsernamePasswd, 127, "%s:%s", pasReqInfo[i].pszProxyUsername, pasReqInfo[i].pszProxyPassword); unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXYUSERPWD, szUsernamePasswd); } } /* Set HTTP Authentication settings */ if (pasReqInfo[i].pszHttpUsername != NULL && pasReqInfo[i].pszHttpPassword != NULL && strlen(pasReqInfo[i].pszHttpUsername) > 0 && strlen(pasReqInfo[i].pszHttpPassword) > 0) { char szUsernamePasswd[128]; long nHttpAuthType = CURLAUTH_BASIC; snprintf(szUsernamePasswd, 127, "%s:%s", pasReqInfo[i].pszHttpUsername, pasReqInfo[i].pszHttpPassword); unchecked_curl_easy_setopt(http_handle, CURLOPT_USERPWD, szUsernamePasswd); nHttpAuthType = msGetCURLAuthType(pasReqInfo[i].eHttpAuthType); unchecked_curl_easy_setopt(http_handle, CURLOPT_HTTPAUTH, nHttpAuthType); } /* NOSIGNAL should be set to true for timeout to work in multithread * environments on Unix, requires libcurl 7.10 or more recent. * (this force avoiding the use of sgnal handlers) */ #ifdef CURLOPT_NOSIGNAL unchecked_curl_easy_setopt(http_handle, CURLOPT_NOSIGNAL, 1); #endif /* If we are writing file to disk, open the file now. */ if (pasReqInfo[i].pszOutputFile != NULL) { if ((fp = fopen(pasReqInfo[i].pszOutputFile, "wb")) == NULL) { msSetError(MS_HTTPERR, "Can't open output file %s.", "msHTTPExecuteRequests()", pasReqInfo[i].pszOutputFile); return (MS_FAILURE); } pasReqInfo[i].fp = fp; } /* coverity[bad_sizeof] */ unchecked_curl_easy_setopt(http_handle, CURLOPT_WRITEDATA, &(pasReqInfo[i])); unchecked_curl_easy_setopt(http_handle, CURLOPT_WRITEFUNCTION, msHTTPWriteFct); /* Provide a buffer where libcurl can write human readable error msgs */ if (pasReqInfo[i].pszErrBuf == NULL) pasReqInfo[i].pszErrBuf = (char *)msSmallMalloc((CURL_ERROR_SIZE + 1) * sizeof(char)); pasReqInfo[i].pszErrBuf[0] = '\0'; unchecked_curl_easy_setopt(http_handle, CURLOPT_ERRORBUFFER, pasReqInfo[i].pszErrBuf); pasReqInfo[i].curl_headers = NULL; if (pasReqInfo[i].pszPostRequest != NULL) { char szBuf[100]; snprintf(szBuf, 100, "Content-Type: %s", pasReqInfo[i].pszPostContentType); pasReqInfo[i].curl_headers = curl_slist_append(NULL, szBuf); unchecked_curl_easy_setopt(http_handle, CURLOPT_POST, 1); unchecked_curl_easy_setopt(http_handle, CURLOPT_POSTFIELDS, pasReqInfo[i].pszPostRequest); if (debug) { msDebug("HTTP: POST = %s", pasReqInfo[i].pszPostRequest); } unchecked_curl_easy_setopt(http_handle, CURLOPT_HTTPHEADER, pasReqInfo[i].curl_headers); } /* Added by RFC-42 HTTP Cookie Forwarding */ if (pasReqInfo[i].pszHTTPCookieData != NULL) { /* Check if there's no end of line in the Cookie string */ /* This could break the HTTP Header */ for (size_t nPos = 0; nPos < strlen(pasReqInfo[i].pszHTTPCookieData); nPos++) { if (pasReqInfo[i].pszHTTPCookieData[nPos] == '\n') { msSetError(MS_HTTPERR, "Can't use cookie containing a newline character.", "msHTTPExecuteRequests()"); return (MS_FAILURE); } } /* Set the Curl option to send Cookie */ unchecked_curl_easy_setopt(http_handle, CURLOPT_COOKIE, pasReqInfo[i].pszHTTPCookieData); } /* Add to multi handle */ curl_multi_add_handle(multi_handle, http_handle); } if (debug) { msDebug("HTTP: Before download loop\n"); } /* DOWNLOAD LOOP ... inspired from multi-double.c example */ /* we start some action by calling perform right away */ while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running)) ; while (still_running) { struct timeval timeout; int rc; /* select() return code */ fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd; FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); /* set a suitable timeout to play around with */ timeout.tv_sec = 0; timeout.tv_usec = 100000; /* get file descriptors from the transfers */ curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout); switch (rc) { case -1: /* select error */ /* ==================================================================== */ /* On Windows the select function (just above) returns -1 when */ /* it is called the second time and all the calls after */ /* that. This causes an infinite loop. */ /* I do not really know why. */ /* To solve the problem the break from case -1 has been removed. */ /* ==================================================================== */ #ifndef _WIN32 break; #endif case 0: default: /* timeout or readable/writable sockets */ curl_multi_perform(multi_handle, &still_running); break; } } if (debug) msDebug("HTTP: After download loop\n"); /* Scan message stack from CURL and report fatal errors*/ while ((curl_msg = curl_multi_info_read(multi_handle, &num_msgs)) != NULL) { httpRequestObj *psReq = NULL; if (curl_msg->msg == CURLMSG_DONE && curl_msg->data.result != CURLE_OK) { /* Something went wrong with this transfer... report error */ for (i = 0; i < numRequests; i++) { if (pasReqInfo[i].curl_handle == curl_msg->easy_handle) { psReq = &(pasReqInfo[i]); break; } } if (psReq != NULL) { /* Record error code in nStatus as a negative value */ psReq->nStatus = -curl_msg->data.result; } } } if (debug) { /* Print a msDebug header for timings reported in the loop below */ msDebug("msHTTPExecuteRequests() timing summary per layer (connect_time + " "time_to_first_packet + download_time = total_time in seconds)\n"); } /* Check status of all requests, close files, report errors and cleanup * handles */ for (i = 0; i < numRequests; i++) { httpRequestObj *psReq; CURL *http_handle; long lVal = 0; psReq = &(pasReqInfo[i]); if (psReq->nStatus == 242) continue; /* Nothing to do here, this file was in cache already */ if (psReq->fp) fclose(psReq->fp); psReq->fp = NULL; http_handle = (CURL *)(psReq->curl_handle); if (psReq->nStatus == 0 && curl_easy_getinfo(http_handle, CURLINFO_HTTP_CODE, &lVal) == CURLE_OK) { char *pszContentType = NULL; psReq->nStatus = lVal; /* Fetch content type of response */ if (curl_easy_getinfo(http_handle, CURLINFO_CONTENT_TYPE, &pszContentType) == CURLE_OK && pszContentType != NULL) { psReq->pszContentType = msStrdup(pszContentType); } } if (!MS_HTTP_SUCCESS(psReq->nStatus)) { /* Set status to MS_DONE to indicate that transfers were */ /* completed but may not be successful */ nStatus = MS_DONE; if (psReq->nStatus == -(CURLE_OPERATION_TIMEOUTED)) { /* Timeout isn't a fatal error */ if (psReq->debug) msDebug("HTTP: TIMEOUT of %d seconds exceeded for %s\n", nTimeout, psReq->pszGetUrl); msSetError(MS_HTTPERR, "HTTP: TIMEOUT of %d seconds exceeded for %s\n", "msHTTPExecuteRequests()", nTimeout, psReq->pszGetUrl); /* Rewrite error message, the curl timeout message isn't * of much use to our users. */ sprintf(psReq->pszErrBuf, "TIMEOUT of %d seconds exceeded.", nTimeout); } else if (psReq->nStatus > 0) { /* Got an HTTP Error, e.g. 404, etc. */ if (psReq->debug) msDebug("HTTP: HTTP GET request failed with status %d (%s)" " for %s\n", psReq->nStatus, psReq->pszErrBuf, psReq->pszGetUrl); msSetError(MS_HTTPERR, "HTTP GET request failed with status %d (%s) " "for %s", "msHTTPExecuteRequests()", psReq->nStatus, psReq->pszErrBuf, psReq->pszGetUrl); } else { /* Got a curl error */ errorObj *error = msGetErrorObj(); if (psReq->debug) msDebug("HTTP: request failed with curl error " "code %d (%s) for %s", -psReq->nStatus, psReq->pszErrBuf, psReq->pszGetUrl); if (!error || error->code == MS_NOERR) /* only set error if one hasn't already been set */ msSetError(MS_HTTPERR, "HTTP: request failed with curl error " "code %d (%s) for %s", "msHTTPExecuteRequests()", -psReq->nStatus, psReq->pszErrBuf, psReq->pszGetUrl); } } /* Report download times foreach handle, in debug mode */ if (psReq->debug) { double dConnectTime = 0.0, dTotalTime = 0.0, dStartTfrTime = 0.0; curl_easy_getinfo(http_handle, CURLINFO_CONNECT_TIME, &dConnectTime); curl_easy_getinfo(http_handle, CURLINFO_STARTTRANSFER_TIME, &dStartTfrTime); curl_easy_getinfo(http_handle, CURLINFO_TOTAL_TIME, &dTotalTime); /* STARTTRANSFER_TIME includes CONNECT_TIME, but TOTAL_TIME * doesn't, so we need to add it. */ dTotalTime += dConnectTime; msDebug("Layer %d: %.3f + %.3f + %.3f = %.3fs\n", psReq->nLayerId, dConnectTime, dStartTfrTime - dConnectTime, dTotalTime - dStartTfrTime, dTotalTime); } /* Cleanup this handle */ unchecked_curl_easy_setopt(http_handle, CURLOPT_URL, ""); curl_multi_remove_handle(multi_handle, http_handle); curl_easy_cleanup(http_handle); psReq->curl_handle = NULL; curl_slist_free_all(psReq->curl_headers); // free the header list } /* Cleanup multi handle, each handle had to be cleaned up individually */ curl_multi_cleanup(multi_handle); return nStatus; } /********************************************************************** * msHTTPGetFile() * * Wrapper to call msHTTPExecuteRequests() for a single file. **********************************************************************/ int msHTTPGetFile(const char *pszGetUrl, const char *pszOutputFile, int *pnHTTPStatus, int nTimeout, int bCheckLocalCache, int bDebug, int nMaxBytes) { httpRequestObj *pasReqInfo; /* Alloc httpRequestInfo structs through which status of each request * will be returned. * We need to alloc 2 instance of requestobj so that the last * object in the array can be set to NULL. */ pasReqInfo = (httpRequestObj *)calloc(2, sizeof(httpRequestObj)); MS_CHECK_ALLOC(pasReqInfo, 2 * sizeof(httpRequestObj), MS_FAILURE); msHTTPInitRequestObj(pasReqInfo, 2); pasReqInfo[0].pszGetUrl = msStrdup(pszGetUrl); pasReqInfo[0].pszOutputFile = msStrdup(pszOutputFile); pasReqInfo[0].debug = (char)bDebug; pasReqInfo[0].nTimeout = nTimeout; pasReqInfo[0].nMaxBytes = nMaxBytes; if (msHTTPExecuteRequests(pasReqInfo, 1, bCheckLocalCache) != MS_SUCCESS) { *pnHTTPStatus = pasReqInfo[0].nStatus; if (pasReqInfo[0].debug) msDebug("HTTP request failed for %s.\n", pszGetUrl); msHTTPFreeRequestObj(pasReqInfo, 2); free(pasReqInfo); return MS_FAILURE; } *pnHTTPStatus = pasReqInfo[0].nStatus; msHTTPFreeRequestObj(pasReqInfo, 2); free(pasReqInfo); return MS_SUCCESS; } #endif /* defined(USE_WMS_LYR) || defined(USE_WMS_SVR) */ mapserver-8.4.0/src/maphttp.h000066400000000000000000000103271474174441300161600ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: http requests related functions * Author: MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPHTTP_H #define MAPHTTP_H #include "mapprimitive.h" #include #ifdef __cplusplus extern "C" { #endif #define MS_HTTP_SUCCESS(status) (status == 200 || status == 242) enum MS_HTTP_PROXY_TYPE { MS_HTTP, MS_SOCKS5 }; enum MS_HTTP_AUTH_TYPE { MS_BASIC, MS_DIGEST, MS_NTLM, MS_ANY, MS_ANYSAFE }; typedef struct http_request_info { int nLayerId; char *pszGetUrl; char *pszOutputFile; int nTimeout; int nMaxBytes; rectObj bbox; int width; int height; int nStatus; /* 200=success, value < 0 if request failed */ char *pszContentType; /* Content-Type of the response */ char *pszErrBuf; /* Buffer where curl can write errors */ char *pszPostRequest; /* post request content (NULL for GET) */ char *pszPostContentType; /* post request MIME type */ char *pszUserAgent; /* User-Agent, auto-generated if not set */ char *pszHTTPCookieData; /* HTTP Cookie data */ char *pszProxyAddress; /* The address (IP or hostname) of proxy svr */ long nProxyPort; /* The proxy's port */ enum MS_HTTP_PROXY_TYPE eProxyType; /* The type of proxy */ enum MS_HTTP_AUTH_TYPE eProxyAuthType; /* Auth method against proxy */ char *pszProxyUsername; /* Proxy authentication username */ char *pszProxyPassword; /* Proxy authentication password */ enum MS_HTTP_AUTH_TYPE eHttpAuthType; /* HTTP Authentication type */ char *pszHttpUsername; /* HTTP Authentication username */ char *pszHttpPassword; /* HTTP Authentication password */ /* For debugging/profiling */ int debug; /* Debug mode? MS_TRUE/MS_FALSE */ /* Private members */ void *curl_headers; /* property to store a curl_slist handle */ void *curl_handle; /* CURLM * handle */ FILE *fp; /* FILE * used during download */ char *result_data; /* output if pszOutputFile is NULL */ int result_size; int result_buf_size; } httpRequestObj; #ifdef USE_CURL int msHTTPInit(void); void msHTTPCleanup(void); void msHTTPInitRequestObj(httpRequestObj *pasReqInfo, int numRequests); void msHTTPFreeRequestObj(httpRequestObj *pasReqInfo, int numRequests); int msHTTPExecuteRequests(httpRequestObj *pasReqInfo, int numRequests, int bCheckLocalCache); int msHTTPGetFile(const char *pszGetUrl, const char *pszOutputFile, int *pnHTTPStatus, int nTimeout, int bCheckLocalCache, int bDebug, int nMaxBytes); int msHTTPAuthProxySetup(hashTableObj *mapmd, hashTableObj *lyrmd, httpRequestObj *pasReqInfo, int numRequests, mapObj *map, const char *namespaces); #endif /*USE_CURL*/ #ifdef __cplusplus } #endif #endif /* MAPHTTP_H */ mapserver-8.4.0/src/mapiconv.c000066400000000000000000000032321474174441300163070ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Wrapper for iconv functions * Author: Even Rouault * ****************************************************************************** * Copyright (c) 2020 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapiconv.h" size_t msIconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) { return iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft); } mapserver-8.4.0/src/mapiconv.h000066400000000000000000000033671474174441300163250ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Wrapper for iconv functions * Author: Even Rouault * ****************************************************************************** * Copyright (c) 2020 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #ifndef MAPICONV_H #define MAPICONV_H #ifdef __cplusplus extern "C" { #endif #include /* Wrapper of iconv() to be used from C++ */ size_t msIconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); #ifdef __cplusplus } #endif #endif mapserver-8.4.0/src/mapimageio.c000066400000000000000000001133471474174441300166140ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Low level PNG/JPEG/GIF image io native functions * Author: Thomas Bonfort (tbonfort) * ****************************************************************************** * Copyright (c) 2009 Thomas Bonfort * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include #include #include #include #include #ifdef USE_GIF #include #endif typedef struct _streamInfo { FILE *fp; bufferObj *buffer; } streamInfo; static void png_write_data_to_stream(png_structp png_ptr, png_bytep data, png_size_t length) { FILE *fp = ((streamInfo *)png_get_io_ptr(png_ptr))->fp; msIO_fwrite(data, length, 1, fp); } static void png_write_data_to_buffer(png_structp png_ptr, png_bytep data, png_size_t length) { bufferObj *buffer = ((streamInfo *)png_get_io_ptr(png_ptr))->buffer; msBufferAppend(buffer, data, length); } static void png_flush_data(png_structp png_ptr) { (void)png_ptr; /* do nothing */ } typedef struct { struct jpeg_destination_mgr pub; unsigned char *data; } ms_destination_mgr; typedef struct { ms_destination_mgr mgr; FILE *stream; } ms_stream_destination_mgr; typedef struct { ms_destination_mgr mgr; bufferObj *buffer; } ms_buffer_destination_mgr; #define OUTPUT_BUF_SIZE 4096 static void jpeg_init_destination(j_compress_ptr cinfo) { ms_destination_mgr *dest = (ms_destination_mgr *)cinfo->dest; /* Allocate the output buffer --- it will be released when done with image */ dest->data = (unsigned char *)(*cinfo->mem->alloc_small)( (j_common_ptr)cinfo, JPOOL_IMAGE, OUTPUT_BUF_SIZE * sizeof(unsigned char)); dest->pub.next_output_byte = dest->data; dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; } static void jpeg_stream_term_destination(j_compress_ptr cinfo) { ms_stream_destination_mgr *dest = (ms_stream_destination_mgr *)cinfo->dest; msIO_fwrite(dest->mgr.data, OUTPUT_BUF_SIZE - dest->mgr.pub.free_in_buffer, 1, dest->stream); dest->mgr.pub.next_output_byte = dest->mgr.data; dest->mgr.pub.free_in_buffer = OUTPUT_BUF_SIZE; } static void jpeg_buffer_term_destination(j_compress_ptr cinfo) { ms_buffer_destination_mgr *dest = (ms_buffer_destination_mgr *)cinfo->dest; msBufferAppend(dest->buffer, dest->mgr.data, OUTPUT_BUF_SIZE - dest->mgr.pub.free_in_buffer); dest->mgr.pub.next_output_byte = dest->mgr.data; dest->mgr.pub.free_in_buffer = OUTPUT_BUF_SIZE; } static boolean jpeg_stream_empty_output_buffer(j_compress_ptr cinfo) { ms_stream_destination_mgr *dest = (ms_stream_destination_mgr *)cinfo->dest; msIO_fwrite(dest->mgr.data, OUTPUT_BUF_SIZE, 1, dest->stream); dest->mgr.pub.next_output_byte = dest->mgr.data; dest->mgr.pub.free_in_buffer = OUTPUT_BUF_SIZE; return TRUE; } static boolean jpeg_buffer_empty_output_buffer(j_compress_ptr cinfo) { ms_buffer_destination_mgr *dest = (ms_buffer_destination_mgr *)cinfo->dest; msBufferAppend(dest->buffer, dest->mgr.data, OUTPUT_BUF_SIZE); dest->mgr.pub.next_output_byte = dest->mgr.data; dest->mgr.pub.free_in_buffer = OUTPUT_BUF_SIZE; return TRUE; } static void msJPEGErrorExit(j_common_ptr cinfo) { jmp_buf *pJmpBuffer = (jmp_buf *)cinfo->client_data; char buffer[JMSG_LENGTH_MAX]; /* Create the message */ (*cinfo->err->format_message)(cinfo, buffer); msSetError(MS_MISCERR, "libjpeg: %s", "jpeg_ErrorExit()", buffer); /* Return control to the setjmp point */ longjmp(*pJmpBuffer, 1); } int saveAsJPEG(mapObj *map, rasterBufferObj *rb, streamInfo *info, outputFormatObj *format) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; int quality; const char *pszOptimized; int optimized; int arithmetic; ms_destination_mgr *dest; JSAMPLE *rowdata = NULL; unsigned int row; jmp_buf setjmp_buffer; quality = atoi(msGetOutputFormatOption(format, "QUALITY", "75")); pszOptimized = msGetOutputFormatOption(format, "OPTIMIZED", "YES"); optimized = EQUAL(pszOptimized, "YES") || EQUAL(pszOptimized, "ON") || EQUAL(pszOptimized, "TRUE"); arithmetic = EQUAL(pszOptimized, "ARITHMETIC"); if (setjmp(setjmp_buffer)) { jpeg_destroy_compress(&cinfo); free(rowdata); return MS_FAILURE; } cinfo.err = jpeg_std_error(&jerr); jerr.error_exit = msJPEGErrorExit; cinfo.client_data = (void *)&(setjmp_buffer); jpeg_create_compress(&cinfo); if (cinfo.dest == NULL) { if (info->fp) { cinfo.dest = (struct jpeg_destination_mgr *)(*cinfo.mem->alloc_small)( (j_common_ptr)&cinfo, JPOOL_PERMANENT, sizeof(ms_stream_destination_mgr)); ((ms_stream_destination_mgr *)cinfo.dest)->mgr.pub.empty_output_buffer = jpeg_stream_empty_output_buffer; ((ms_stream_destination_mgr *)cinfo.dest)->mgr.pub.term_destination = jpeg_stream_term_destination; ((ms_stream_destination_mgr *)cinfo.dest)->stream = info->fp; } else { cinfo.dest = (struct jpeg_destination_mgr *)(*cinfo.mem->alloc_small)( (j_common_ptr)&cinfo, JPOOL_PERMANENT, sizeof(ms_buffer_destination_mgr)); ((ms_buffer_destination_mgr *)cinfo.dest)->mgr.pub.empty_output_buffer = jpeg_buffer_empty_output_buffer; ((ms_buffer_destination_mgr *)cinfo.dest)->mgr.pub.term_destination = jpeg_buffer_term_destination; ((ms_buffer_destination_mgr *)cinfo.dest)->buffer = info->buffer; } } dest = (ms_destination_mgr *)cinfo.dest; dest->pub.init_destination = jpeg_init_destination; cinfo.image_width = rb->width; cinfo.image_height = rb->height; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); if (arithmetic) cinfo.arith_code = TRUE; else if (optimized) cinfo.optimize_coding = TRUE; if (arithmetic || optimized) { /* libjpeg turbo 1.5.2 honours max_memory_to_use, but has no backing */ /* store implementation, so better not set max_memory_to_use ourselves. */ /* See https://github.com/libjpeg-turbo/libjpeg-turbo/issues/162 */ if (cinfo.mem->max_memory_to_use > 0) { if (map == NULL || msGetConfigOption(map, "JPEGMEM") == NULL) { /* If the user doesn't provide a value for JPEGMEM, we want to be sure */ /* that at least the image size will be used before creating the * temporary file */ cinfo.mem->max_memory_to_use = MS_MAX(cinfo.mem->max_memory_to_use, cinfo.input_components * rb->width * rb->height); } } } jpeg_start_compress(&cinfo, TRUE); rowdata = (JSAMPLE *)malloc(sizeof(JSAMPLE) * rb->width * cinfo.input_components); for (row = 0; row < rb->height; row++) { JSAMPLE *pixptr = rowdata; unsigned char *r, *g, *b; r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { *(pixptr++) = *r; *(pixptr++) = *g; *(pixptr++) = *b; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } (void)jpeg_write_scanlines(&cinfo, &rowdata, 1); } /* Step 6: Finish compression */ jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); free(rowdata); return MS_SUCCESS; } /* * sort a given list of rgba entries so that all the opaque pixels are at the * end */ int remapPaletteForPNG(rasterBufferObj *rb, rgbPixel *rgb, unsigned char *a, int *num_a) { int bot_idx, top_idx; unsigned x; int remap[256]; unsigned int maxval = rb->data.palette.scaling_maxval; assert(rb->type == MS_BUFFER_BYTE_PALETTE); /* ** remap the palette colors so that all entries with ** the maximal alpha value (i.e., fully opaque) are at the end and can ** therefore be omitted from the tRNS chunk. Note that the ordering of ** opaque entries is reversed from how they were previously arranged ** --not that this should matter to anyone. */ for (top_idx = (int)rb->data.palette.num_entries - 1, bot_idx = x = 0; x < rb->data.palette.num_entries; ++x) { if (rb->data.palette.palette[x].a == maxval) remap[x] = top_idx--; else remap[x] = bot_idx++; } /* sanity check: top and bottom indices should have just crossed paths */ if (bot_idx != top_idx + 1) { msSetError(MS_MISCERR, "quantization sanity check failed", "createPNGPalette()"); return MS_FAILURE; } *num_a = bot_idx; for (x = 0; x < rb->width * rb->height; x++) rb->data.palette.pixels[x] = remap[rb->data.palette.pixels[x]]; for (x = 0; x < rb->data.palette.num_entries; ++x) { if (maxval == 255) { a[remap[x]] = rb->data.palette.palette[x].a; rgb[remap[x]].r = rb->data.palette.palette[x].r; rgb[remap[x]].g = rb->data.palette.palette[x].g; rgb[remap[x]].b = rb->data.palette.palette[x].b; } else { /* rescale palette */ rgb[remap[x]].r = (rb->data.palette.palette[x].r * 255 + (maxval >> 1)) / maxval; rgb[remap[x]].g = (rb->data.palette.palette[x].g * 255 + (maxval >> 1)) / maxval; rgb[remap[x]].b = (rb->data.palette.palette[x].b * 255 + (maxval >> 1)) / maxval; a[remap[x]] = (rb->data.palette.palette[x].a * 255 + (maxval >> 1)) / maxval; } if (a[remap[x]] != 255) { /* un-premultiply pixels */ double da = 255.0 / a[remap[x]]; rgb[remap[x]].r *= da; rgb[remap[x]].g *= da; rgb[remap[x]].b *= da; } } return MS_SUCCESS; } int savePalettePNG(rasterBufferObj *rb, streamInfo *info, int compression) { png_infop info_ptr; rgbPixel rgb[256]; unsigned char a[256]; int num_a; int sample_depth; png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); assert(rb->type == MS_BUFFER_BYTE_PALETTE); if (!png_ptr) return (MS_FAILURE); png_set_compression_level(png_ptr, compression); png_set_filter(png_ptr, 0, PNG_FILTER_NONE); info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return (MS_FAILURE); } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); return (MS_FAILURE); } if (info->fp) png_set_write_fn(png_ptr, info, png_write_data_to_stream, png_flush_data); else png_set_write_fn(png_ptr, info, png_write_data_to_buffer, png_flush_data); if (rb->data.palette.num_entries <= 2) sample_depth = 1; else if (rb->data.palette.num_entries <= 4) sample_depth = 2; else if (rb->data.palette.num_entries <= 16) sample_depth = 4; else sample_depth = 8; png_set_IHDR(png_ptr, info_ptr, rb->width, rb->height, sample_depth, PNG_COLOR_TYPE_PALETTE, 0, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); remapPaletteForPNG(rb, rgb, a, &num_a); png_set_PLTE(png_ptr, info_ptr, (png_colorp)(rgb), rb->data.palette.num_entries); if (num_a) png_set_tRNS(png_ptr, info_ptr, a, num_a, NULL); png_write_info(png_ptr, info_ptr); png_set_packing(png_ptr); for (unsigned row = 0; row < rb->height; row++) { unsigned char *rowptr = &(rb->data.palette.pixels[row * rb->width]); png_write_row(png_ptr, rowptr); } png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); return MS_SUCCESS; } int readPalette(const char *palette, rgbaPixel *entries, unsigned int *nEntries, int useAlpha) { FILE *stream = NULL; char buffer[MS_BUFFER_LENGTH]; *nEntries = 0; stream = fopen(palette, "r"); if (!stream) { msSetError(MS_IOERR, "Error opening palette file %s.", "readPalette()", palette); return MS_FAILURE; } while (fgets(buffer, MS_BUFFER_LENGTH, stream) && *nEntries < 256) { int r, g, b, a = 0; /* while there are colors to load */ if (buffer[0] == '#' || buffer[0] == '\n' || buffer[0] == '\r') continue; /* skip comments and blank lines */ if (!useAlpha) { if (3 != sscanf(buffer, "%d,%d,%d\n", &r, &g, &b)) { fclose(stream); msSetError(MS_MISCERR, "failed to parse color %d r,g,b triplet in line \"%s\" from " "file %s", "readPalette()", *nEntries + 1, buffer, palette); return MS_FAILURE; } } else { if (4 != sscanf(buffer, "%d,%d,%d,%d\n", &r, &g, &b, &a)) { fclose(stream); msSetError(MS_MISCERR, "failed to parse color %d r,g,b,a quadruplet in line \"%s\" " "from file %s", "readPalette()", *nEntries + 1, buffer, palette); return MS_FAILURE; } } if (useAlpha && a != 255) { double da = a / 255.0; entries[*nEntries].r = r * da; entries[*nEntries].g = g * da; entries[*nEntries].b = b * da; entries[*nEntries].a = a; } else { entries[*nEntries].r = r; entries[*nEntries].g = g; entries[*nEntries].b = b; entries[*nEntries].a = 255; } (*nEntries)++; } fclose(stream); return MS_SUCCESS; } int saveAsPNG(mapObj *map, rasterBufferObj *rb, streamInfo *info, outputFormatObj *format) { int force_pc256 = MS_FALSE; int force_palette = MS_FALSE; const char *force_string, *zlib_compression; int compression = -1; zlib_compression = msGetOutputFormatOption(format, "COMPRESSION", NULL); if (zlib_compression && *zlib_compression) { char *endptr; compression = strtol(zlib_compression, &endptr, 10); if (*endptr || compression < -1 || compression > 9) { msSetError(MS_MISCERR, "failed to parse FORMATOPTION \"COMPRESSION=%s\", expecting " "integer from 0 to 9.", "saveAsPNG()", zlib_compression); return MS_FAILURE; } } force_string = msGetOutputFormatOption(format, "QUANTIZE_FORCE", NULL); if (force_string && (strcasecmp(force_string, "on") == 0 || strcasecmp(force_string, "yes") == 0 || strcasecmp(force_string, "true") == 0)) force_pc256 = MS_TRUE; force_string = msGetOutputFormatOption(format, "PALETTE_FORCE", NULL); if (force_string && (strcasecmp(force_string, "on") == 0 || strcasecmp(force_string, "yes") == 0 || strcasecmp(force_string, "true") == 0)) force_palette = MS_TRUE; if (force_pc256 || force_palette) { rasterBufferObj qrb; rgbaPixel palette[256], paletteGiven[256]; unsigned int numPaletteGivenEntries; memset(&qrb, 0, sizeof(rasterBufferObj)); qrb.type = MS_BUFFER_BYTE_PALETTE; qrb.width = rb->width; qrb.height = rb->height; qrb.data.palette.pixels = (unsigned char *)malloc(sizeof(unsigned char) * qrb.width * qrb.height); qrb.data.palette.scaling_maxval = 255; int ret; if (force_pc256) { qrb.data.palette.palette = palette; qrb.data.palette.num_entries = atoi(msGetOutputFormatOption(format, "QUANTIZE_COLORS", "256")); ret = msQuantizeRasterBuffer(rb, &(qrb.data.palette.num_entries), qrb.data.palette.palette, NULL, 0, &qrb.data.palette.scaling_maxval); } else { unsigned colorsWanted = (unsigned)atoi( msGetOutputFormatOption(format, "QUANTIZE_COLORS", "0")); const char *palettePath = msGetOutputFormatOption(format, "PALETTE", "palette.txt"); char szPath[MS_MAXPATHLEN]; if (map) { msBuildPath(szPath, map->mappath, palettePath); palettePath = szPath; } if (readPalette(palettePath, paletteGiven, &numPaletteGivenEntries, format->transparent) != MS_SUCCESS) { msFree(qrb.data.palette.pixels); return MS_FAILURE; } if (numPaletteGivenEntries == 256 || colorsWanted == 0) { qrb.data.palette.palette = paletteGiven; qrb.data.palette.num_entries = numPaletteGivenEntries; ret = MS_SUCCESS; /* we have a full palette and don't want an additional quantization step */ } else { /* quantize the image, and mix our colours in the resulting palette */ qrb.data.palette.palette = palette; qrb.data.palette.num_entries = MS_MAX(colorsWanted, numPaletteGivenEntries); ret = msQuantizeRasterBuffer(rb, &(qrb.data.palette.num_entries), qrb.data.palette.palette, paletteGiven, numPaletteGivenEntries, &qrb.data.palette.scaling_maxval); } } if (ret != MS_FAILURE) { msClassifyRasterBuffer(rb, &qrb); ret = savePalettePNG(&qrb, info, compression); } msFree(qrb.data.palette.pixels); return ret; } else if (rb->type == MS_BUFFER_BYTE_RGBA) { png_infop info_ptr; int color_type; unsigned int *rowdata; png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) return (MS_FAILURE); png_set_compression_level(png_ptr, compression); png_set_filter(png_ptr, 0, PNG_FILTER_NONE); info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return (MS_FAILURE); } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); return (MS_FAILURE); } if (info->fp) png_set_write_fn(png_ptr, info, png_write_data_to_stream, png_flush_data); else png_set_write_fn(png_ptr, info, png_write_data_to_buffer, png_flush_data); if (rb->data.rgba.a) color_type = PNG_COLOR_TYPE_RGB_ALPHA; else color_type = PNG_COLOR_TYPE_RGB; png_set_IHDR(png_ptr, info_ptr, rb->width, rb->height, 8, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_write_info(png_ptr, info_ptr); if (!rb->data.rgba.a && rb->data.rgba.pixel_step == 4) png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); rowdata = (unsigned int *)malloc(rb->width * sizeof(unsigned int)); for (unsigned row = 0; row < rb->height; row++) { unsigned int *pixptr = rowdata; unsigned char *a, *r, *g, *b; r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; if (rb->data.rgba.a) { a = rb->data.rgba.a + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { if (*a) { double da = *a / 255.0; unsigned char *pix = (unsigned char *)pixptr; pix[0] = *r / da; pix[1] = *g / da; pix[2] = *b / da; pix[3] = *a; } else { *pixptr = 0; } pixptr++; a += rb->data.rgba.pixel_step; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } } else { for (unsigned col = 0; col < rb->width; col++) { unsigned char *pix = (unsigned char *)pixptr; pix[0] = *r; pix[1] = *g; pix[2] = *b; pixptr++; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } } png_write_row(png_ptr, (png_bytep)rowdata); } png_write_end(png_ptr, info_ptr); free(rowdata); png_destroy_write_struct(&png_ptr, &info_ptr); return MS_SUCCESS; } else { msSetError(MS_MISCERR, "Unknown buffer type", "saveAsPNG()"); return MS_FAILURE; } } /* For platforms with incomplete ANSI defines. Fortunately, SEEK_SET is defined to be zero by the standard. */ #ifndef SEEK_SET #define SEEK_SET 0 #endif /* SEEK_SET */ int readPNG(char *path, rasterBufferObj *rb) { png_uint_32 width, height; unsigned char *a, *r, *g, *b; int bit_depth, color_type; unsigned char **row_pointers; png_structp png_ptr = NULL; png_infop info_ptr = NULL; FILE *stream = fopen(path, "rb"); if (!stream) return MS_FAILURE; /* could pass pointers to user-defined error handlers instead of NULLs: */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fclose(stream); return MS_FAILURE; /* out of memory */ } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, NULL, NULL); fclose(stream); return MS_FAILURE; /* out of memory */ } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(stream); return MS_FAILURE; } png_init_io(png_ptr, stream); png_read_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); rb->width = width; rb->height = height; rb->type = MS_BUFFER_BYTE_RGBA; rb->data.rgba.pixels = (unsigned char *)malloc(sizeof(unsigned char) * width * height * 4); row_pointers = (unsigned char **)malloc(height * sizeof(unsigned char *)); rb->data.rgba.pixel_step = 4; rb->data.rgba.row_step = width * 4; b = rb->data.rgba.b = &rb->data.rgba.pixels[0]; g = rb->data.rgba.g = &rb->data.rgba.pixels[1]; r = rb->data.rgba.r = &rb->data.rgba.pixels[2]; a = rb->data.rgba.a = &rb->data.rgba.pixels[3]; for (unsigned i = 0; i < height; i++) { row_pointers[i] = &(rb->data.rgba.pixels[i * rb->data.rgba.row_step]); } if (color_type == PNG_COLOR_TYPE_PALETTE) /* expand palette images to RGB */ png_set_expand(png_ptr); if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) /* expand low bit-depth grayscale to 8bits */ png_set_expand(png_ptr); if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) /* expand transparency chunks to full alpha */ png_set_expand(png_ptr); if (bit_depth == 16) /* scale 16bits down to 8 */ png_set_strip_16(png_ptr); if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) /* convert grayscale to rgba */ png_set_gray_to_rgb(png_ptr); png_set_bgr(png_ptr); if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_PALETTE) png_set_add_alpha(png_ptr, 0xff, PNG_FILLER_AFTER); png_read_update_info(png_ptr, info_ptr); assert(png_get_rowbytes(png_ptr, info_ptr) == rb->data.rgba.row_step); png_read_image(png_ptr, row_pointers); free(row_pointers); row_pointers = NULL; png_read_end(png_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL); /*premultiply data*/ for (unsigned i = 0; i < width * height; i++) { if (*a < 255) { if (*a == 0) { *r = *g = *b = 0; } else { *r = (*r * *a + 255) >> 8; *g = (*g * *a + 255) >> 8; *b = (*b * *a + 255) >> 8; } } a += 4; b += 4; g += 4; r += 4; } fclose(stream); return MS_SUCCESS; } int msSaveRasterBuffer(mapObj *map, rasterBufferObj *rb, FILE *stream, outputFormatObj *format) { if (strcasestr(format->driver, "/png")) { streamInfo info; info.fp = stream; info.buffer = NULL; return saveAsPNG(map, rb, &info, format); } else if (strcasestr(format->driver, "/jpeg")) { streamInfo info; info.fp = stream; info.buffer = NULL; return saveAsJPEG(map, rb, &info, format); } else { msSetError(MS_MISCERR, "unsupported image format\n", "msSaveRasterBuffer()"); return MS_FAILURE; } } int msSaveRasterBufferToBuffer(rasterBufferObj *data, bufferObj *buffer, outputFormatObj *format) { if (strcasestr(format->driver, "/png")) { streamInfo info; info.fp = NULL; info.buffer = buffer; return saveAsPNG(NULL, data, &info, format); } else if (strcasestr(format->driver, "/jpeg")) { streamInfo info; info.fp = NULL; info.buffer = buffer; return saveAsJPEG(NULL, data, &info, format); } else { msSetError(MS_MISCERR, "unsupported image format\n", "msSaveRasterBuffer()"); return MS_FAILURE; } } #ifdef USE_GIF #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 static char const *gif_error_msg(int code) #else static char const *gif_error_msg() #endif { static char msg[80]; #if (!defined GIFLIB_MAJOR) || (GIFLIB_MAJOR < 5) int code = GifLastError(); #endif switch (code) { case E_GIF_ERR_OPEN_FAILED: /* should not see this */ return "Failed to open given file"; case E_GIF_ERR_WRITE_FAILED: return "Write failed"; case E_GIF_ERR_HAS_SCRN_DSCR: /* should not see this */ return "Screen descriptor already passed to giflib"; case E_GIF_ERR_HAS_IMAG_DSCR: /* should not see this */ return "Image descriptor already passed to giflib"; case E_GIF_ERR_NO_COLOR_MAP: /* should not see this */ return "Neither global nor local color map set"; case E_GIF_ERR_DATA_TOO_BIG: /* should not see this */ return "Too much pixel data passed to giflib"; case E_GIF_ERR_NOT_ENOUGH_MEM: return "Out of memory"; case E_GIF_ERR_DISK_IS_FULL: return "Disk is full"; case E_GIF_ERR_CLOSE_FAILED: /* should not see this */ return "File close failed"; case E_GIF_ERR_NOT_WRITEABLE: /* should not see this */ return "File not writable"; case D_GIF_ERR_OPEN_FAILED: return "Failed to open file"; case D_GIF_ERR_READ_FAILED: return "Failed to read from file"; case D_GIF_ERR_NOT_GIF_FILE: return "File is not a GIF file"; case D_GIF_ERR_NO_SCRN_DSCR: return "No screen descriptor detected - invalid file"; case D_GIF_ERR_NO_IMAG_DSCR: return "No image descriptor detected - invalid file"; case D_GIF_ERR_NO_COLOR_MAP: return "No global or local color map found"; case D_GIF_ERR_WRONG_RECORD: return "Wrong record type detected - invalid file?"; case D_GIF_ERR_DATA_TOO_BIG: return "Data in file too big for image"; case D_GIF_ERR_NOT_ENOUGH_MEM: return "Out of memory"; case D_GIF_ERR_CLOSE_FAILED: return "Close failed"; case D_GIF_ERR_NOT_READABLE: return "File not opened for read"; case D_GIF_ERR_IMAGE_DEFECT: return "Defective image"; case D_GIF_ERR_EOF_TOO_SOON: return "Unexpected EOF - invalid file"; default: sprintf(msg, "Unknown giflib error code %d", code); return msg; } } /* not fully implemented and tested */ /* missing: set the first pointer to a,r,g,b */ int readGIF(char *path, rasterBufferObj *rb) { int codeSize, extCode, firstImageRead = MS_FALSE; unsigned char *r, *g, *b, *a; int transIdx = -1; GifFileType *image; GifPixelType *line; GifRecordType recordType; GifByteType *codeBlock, *extension; ColorMapObject *cmap; int interlacedOffsets[] = {0, 4, 2, 1}; int interlacedJumps[] = {8, 8, 4, 2}; #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 int errcode; #endif rb->type = MS_BUFFER_BYTE_RGBA; #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 image = DGifOpenFileName(path, &errcode); if (image == NULL) { msSetError(MS_MISCERR, "failed to load gif image: %s", "readGIF()", gif_error_msg(errcode)); return MS_FAILURE; } #else image = DGifOpenFileName(path); if (image == NULL) { msSetError(MS_MISCERR, "failed to load gif image: %s", "readGIF()", gif_error_msg()); return MS_FAILURE; } #endif rb->width = image->SWidth; rb->height = image->SHeight; rb->data.rgba.row_step = rb->width * 4; rb->data.rgba.pixel_step = 4; rb->data.rgba.pixels = (unsigned char *)malloc(sizeof(unsigned char) * rb->width * rb->height * 4); b = rb->data.rgba.b = &rb->data.rgba.pixels[0]; g = rb->data.rgba.g = &rb->data.rgba.pixels[1]; r = rb->data.rgba.r = &rb->data.rgba.pixels[2]; a = rb->data.rgba.a = &rb->data.rgba.pixels[3]; cmap = (image->Image.ColorMap) ? image->Image.ColorMap : image->SColorMap; for (unsigned i = 0; i < rb->width * rb->height; i++) { *a = 255; *r = cmap->Colors[image->SBackGroundColor].Red; *g = cmap->Colors[image->SBackGroundColor].Green; *b = cmap->Colors[image->SBackGroundColor].Blue; a += rb->data.rgba.pixel_step; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } do { if (DGifGetRecordType(image, &recordType) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } switch (recordType) { case SCREEN_DESC_RECORD_TYPE: DGifGetScreenDesc(image); break; case IMAGE_DESC_RECORD_TYPE: if (DGifGetImageDesc(image) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } if (!firstImageRead) { unsigned row = image->Image.Top; unsigned col = image->Image.Left; unsigned width = image->Image.Width; unsigned height = image->Image.Height; /* sanity check: */ if (col + width > rb->width || row + height > rb->height) { msSetError(MS_MISCERR, "corrupted gif image, img size exceeds screen size", "readGIF()"); return MS_FAILURE; } line = (GifPixelType *)malloc(width * sizeof(GifPixelType)); if (image->Image.Interlace) { int count; for (count = 0; count < 4; count++) { for (unsigned i = row + interlacedOffsets[count]; i < row + height; i += interlacedJumps[count]) { int offset = i * rb->data.rgba.row_step + col * rb->data.rgba.pixel_step; a = rb->data.rgba.a + offset; r = rb->data.rgba.r + offset; g = rb->data.rgba.g + offset; b = rb->data.rgba.b + offset; if (DGifGetLine(image, line, width) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } for (unsigned j = 0; j < width; j++) { GifPixelType pix = line[j]; if (transIdx == -1 || pix != transIdx) { *a = 255; *r = cmap->Colors[pix].Red; *g = cmap->Colors[pix].Green; *b = cmap->Colors[pix].Blue; } else { *a = *r = *g = *b = 0; } a += rb->data.rgba.pixel_step; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } } } } else { for (unsigned i = 0; i < height; i++) { int offset = i * rb->data.rgba.row_step + col * rb->data.rgba.pixel_step; a = rb->data.rgba.a + offset; r = rb->data.rgba.r + offset; g = rb->data.rgba.g + offset; b = rb->data.rgba.b + offset; if (DGifGetLine(image, line, width) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } for (unsigned j = 0; j < width; j++) { GifPixelType pix = line[j]; if (transIdx == -1 || pix != transIdx) { *a = 255; *r = cmap->Colors[pix].Red; *g = cmap->Colors[pix].Green; *b = cmap->Colors[pix].Blue; } else { *a = *r = *g = *b = 0; } a += rb->data.rgba.pixel_step; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } } } free((char *)line); firstImageRead = MS_TRUE; } else { /* Skip all next images */ if (DGifGetCode(image, &codeSize, &codeBlock) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } while (codeBlock != NULL) { if (DGifGetCodeNext(image, &codeBlock) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } } } break; case EXTENSION_RECORD_TYPE: /* skip all extension blocks */ if (DGifGetExtension(image, &extCode, &extension) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } if (extCode == 249 && (extension[1] & 1)) transIdx = extension[4]; for (;;) { if (DGifGetExtensionNext(image, &extension) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } if (extension == NULL) break; if (extension[1] & 1) transIdx = extension[4]; } break; case UNDEFINED_RECORD_TYPE: break; case TERMINATE_RECORD_TYPE: break; default: break; } } while (recordType != TERMINATE_RECORD_TYPE); #if defined GIFLIB_MAJOR && GIFLIB_MINOR && \ ((GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1) || (GIFLIB_MAJOR > 5)) if (DGifCloseFile(image, &errcode) == GIF_ERROR) { msSetError(MS_MISCERR, "failed to close gif after loading: %s", "readGIF()", gif_error_msg(errcode)); return MS_FAILURE; } #else if (DGifCloseFile(image) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "failed to close gif after loading: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "failed to close gif after loading: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } #endif return MS_SUCCESS; } #endif int msLoadMSRasterBufferFromFile(char *path, rasterBufferObj *rb) { FILE *stream; unsigned char signature[8]; int ret = MS_FAILURE; stream = fopen(path, "rb"); if (!stream) { msSetError(MS_MISCERR, "unable to open file %s for reading", "msLoadMSRasterBufferFromFile()", path); return MS_FAILURE; } if (1 != fread(signature, 8, 1, stream)) { fclose(stream); msSetError(MS_MISCERR, "Unable to read header from image file %s", "msLoadMSRasterBufferFromFile()", path); return MS_FAILURE; } fclose(stream); if (png_sig_cmp(signature, 0, 8) == 0) { ret = readPNG(path, rb); } else if (!strncmp((char *)signature, "GIF", 3)) { #ifdef USE_GIF ret = readGIF(path, rb); #else msSetError(MS_MISCERR, "pixmap %s seems to be GIF formatted, but this server is " "compiled without GIF support", "readImage()", path); return MS_FAILURE; #endif } else { msSetError(MS_MISCERR, "unsupported pixmap format", "readImage()"); return MS_FAILURE; } return ret; } mapserver-8.4.0/src/mapimagemap.c000066400000000000000000000623761474174441300167670ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implements imagemap outputformat support. * Author: Attila Csipa * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "dxfcolor.h" #include #include #ifdef _WIN32 #include #include #endif #define MYDEBUG 0 #define DEBUG_IF if (MYDEBUG > 2) /* * Client-side imagemap support was originally written by * Attila Csipa (http://prometheus.org.yu/me.php). C. Scott Ananian * (http://cscott.net) cleaned up the code somewhat and made it more flexible: * you can now customize the generated HREFs and create mouseover and * mouseout attributes. * * Use * IMAGETYPE imagemap * to select this driver. * * The following FORMATOPTIONs are available. If any are set to the empty * string the associated attribute will be suppressed. * POLYHREF the href string to use for the elements. * use a %s to interpolate the area title. * default: "javascript:Clicked('%s');" * POLYMOUSEOVER the onMouseOver string to use for the elements. * use a %s to interpolate the area title. * default: "" (ie the attribute is suppressed) * POLYMOUSEOUT the onMouseOut string to use for the elements. * use a %s to interpolate the area title. * default: "" (ie the attribute is suppressed) * SYMBOLMOUSEOVER and SYMBOLMOUSEOUT are equivalent properties for * tags representing symbols, with the same defaults. * MAPNAME the string which will be used in the name attribute * of the tag. There is no %s interpolation. * default: "map1" * SUPPRESS if "yes", then we will suppress area declarations with * no title. * default: "NO" * * For example, http://vevo.verifiedvoting.org/verifier contains this * .map file fragment: * OUTPUTFORMAT * NAME imagemap * DRIVER imagemap * FORMATOPTION "POLYHREF=/verifier/map.php?state=%s" * FORMATOPTION "SYMBOLHREF=#" * FORMATOPTION "SUPPRESS=YES" * FORMATOPTION "MAPNAME=map-48" * FORMATOPTION "POLYMOUSEOUT=return nd();" * FORMATOPTION "POLYMOUSEOVER=return overlib('%s');" * END */ /*-------------------------------------------------------------------------*/ /* A pString is a variable-length (appendable) string, stored as a triple: * character pointer, allocated length, and used length. The one wrinkle * is that we use pointers to the allocated size and character pointer, * in order to support referring to fields declared elsewhere (ie in the * 'image' data structure) for these. The 'iprintf' function appends * to a pString. */ typedef struct pString { /* these two fields are somewhere else */ char **string; int *alloc_size; /* this field is stored locally. */ int string_len; } pString; /* These are the pStrings we declare statically. One is the 'output' * imagemap/dxf file; parts of this live in another data structure and * are only referenced indirectly here. The other contains layer-specific * information for the dxf output. */ static char *layerlist = NULL; static int layersize = 0; static pString imgStr, layerStr = {&layerlist, &layersize, 0}; /* Format strings for the various bits of a client-side imagemap. */ static const char *polyHrefFmt, *polyMOverFmt, *polyMOutFmt; static const char *symbolHrefFmt, *symbolMOverFmt, *symbolMOutFmt; static const char *mapName; /* Should we suppress AREA declarations in imagemaps with no title? */ static int suppressEmpty = 0; /* Prevent buffer-overrun and format-string attacks by "sanitizing" any * provided format string to fit the number of expected string arguments * (MAX) exactly. */ static const char *makeFmtSafe(const char *fmt, int MAX) { /* format string should have exactly 'MAX' %s */ char *result = msSmallMalloc(strlen(fmt) + 1 + 3 * MAX), *cp; int numstr = 0, saw_percent = 0; strcpy(result, fmt); for (cp = result; *cp; cp++) { if (saw_percent) { if (*cp == '%') { /* safe */ } else if (*cp == 's' && numstr < MAX) { numstr++; /* still safe */ } else { /* disable this unsafe format string! */ *(cp - 1) = ' '; } saw_percent = 0; } else if (*cp == '%') saw_percent = 1; } /* fixup format strings without enough %s in them */ while (numstr < MAX) { strcpy(cp, "%.s"); /* print using zero-length precision */ cp += 3; numstr++; } return result; } /* Append the given printf-style formatted string to the pString 'ps'. * This is much cleaner (and faster) than the technique this file * used to use! */ static void im_iprintf(pString *ps, const char *fmt, ...) { int n, remaining; va_list ap; do { remaining = *(ps->alloc_size) - ps->string_len; va_start(ap, fmt); #if defined(HAVE_VSNPRINTF) n = vsnprintf((*(ps->string)) + ps->string_len, remaining, fmt, ap); #else /* If vsnprintf() is not available then require a minimum * of 512 bytes of free space to prevent a buffer overflow * This is not fully bulletproof but should help, see bug 1613 */ if (remaining < 512) n = -1; else n = vsprintf((*(ps->string)) + ps->string_len, fmt, ap); #endif va_end(ap); /* if that worked, we're done! */ if (-1 < n && n < remaining) { ps->string_len += n; return; } else { /* double allocated string size */ *(ps->alloc_size) *= 2; /* these keeps realloc linear.*/ if (*(ps->alloc_size) < 1024) /* careful: initial size can be 0 */ *(ps->alloc_size) = 1024; if (n > -1 && *(ps->alloc_size) <= (n + ps->string_len)) /* ensure at least as much as what is needed */ *(ps->alloc_size) = n + ps->string_len + 1; *(ps->string) = (char *)msSmallRealloc(*(ps->string), *(ps->alloc_size)); /* if realloc doesn't work, we're screwed! */ } } while (1); /* go back and try again. */ } static int lastcolor = -1; static int matchdxfcolor(colorObj col) { int best = 7; int delta = 128 * 255; int tcolor = 0; if (lastcolor != -1) return lastcolor; while (tcolor < 256 && (ctable[tcolor].r != col.red || ctable[tcolor].g != col.green || ctable[tcolor].b != col.blue)) { const int dr = ctable[tcolor].r - col.red; const int dg = ctable[tcolor].g - col.green; const int db = ctable[tcolor].b - col.blue; const int newdelta = dr * dr + dg * dg + db * db; if (newdelta < delta) { best = tcolor; delta = newdelta; } tcolor++; } if (tcolor >= 256) tcolor = best; /* DEBUG_IF printf("%d/%d/%d (%d/%d - %d), %d : %d/%d/%d
\n", * ctable[tcolor].r, ctable[tcolor].g, ctable[tcolor].b, tcolor, best, delta, * lastcolor, col.red, col.green, col.blue); */ lastcolor = tcolor; return tcolor; } static char *lname; static int dxf; void msImageStartLayerIM(mapObj *map, layerObj *layer, imageObj *image) { (void)map; (void)image; DEBUG_IF printf("ImageStartLayerIM\n
"); free(lname); if (layer->name) lname = msStrdup(layer->name); else lname = msStrdup("NONE"); if (dxf == 2) { im_iprintf(&layerStr, "LAYER\n%s\n", lname); } else if (dxf) { im_iprintf(&layerStr, " 0\nLAYER\n 2\n%s\n" " 70\n 64\n 6\nCONTINUOUS\n", lname); } lastcolor = -1; } /* * Utility function to create a IM image. Returns * a pointer to an imageObj structure. */ imageObj *msImageCreateIM(int width, int height, outputFormatObj *format, char *imagepath, char *imageurl, double resolution, double defresolution) { imageObj *image = NULL; if (setvbuf(stdout, NULL, _IONBF, 0)) { printf("Whoops..."); }; DEBUG_IF printf("msImageCreateIM
\n"); if (width > 0 && height > 0) { image = (imageObj *)msSmallCalloc(1, sizeof(imageObj)); imgStr.string = &(image->img.imagemap); imgStr.alloc_size = &(image->size); image->format = format; format->refcount++; image->width = width; image->height = height; image->imagepath = NULL; image->imageurl = NULL; image->resolution = resolution; image->resolutionfactor = resolution / defresolution; if (strcasecmp("ON", msGetOutputFormatOption(format, "DXF", "OFF")) == 0) { dxf = 1; im_iprintf(&layerStr, " 2\nLAYER\n 70\n 10\n"); } else dxf = 0; if (strcasecmp("ON", msGetOutputFormatOption(format, "SCRIPT", "OFF")) == 0) { dxf = 2; im_iprintf(&layerStr, ""); } /* get href formation string options */ polyHrefFmt = makeFmtSafe(msGetOutputFormatOption(format, "POLYHREF", "javascript:Clicked('%s');"), 1); polyMOverFmt = makeFmtSafe(msGetOutputFormatOption(format, "POLYMOUSEOVER", ""), 1); polyMOutFmt = makeFmtSafe(msGetOutputFormatOption(format, "POLYMOUSEOUT", ""), 1); symbolHrefFmt = makeFmtSafe(msGetOutputFormatOption(format, "SYMBOLHREF", "javascript:SymbolClicked();"), 1); symbolMOverFmt = makeFmtSafe(msGetOutputFormatOption(format, "SYMBOLMOUSEOVER", ""), 1); symbolMOutFmt = makeFmtSafe(msGetOutputFormatOption(format, "SYMBOLMOUSEOUT", ""), 1); /* get name of client-side image map */ mapName = msGetOutputFormatOption(format, "MAPNAME", "map1"); /* should we suppress area declarations with no title? */ if (strcasecmp("YES", msGetOutputFormatOption(format, "SUPPRESS", "NO")) == 0) { suppressEmpty = 1; } lname = msStrdup("NONE"); *(imgStr.string) = msStrdup(""); if (*(imgStr.string)) { *(imgStr.alloc_size) = imgStr.string_len = strlen(*(imgStr.string)); } else { *(imgStr.alloc_size) = imgStr.string_len = 0; } if (imagepath) { image->imagepath = msStrdup(imagepath); } if (imageurl) { image->imageurl = msStrdup(imageurl); } return image; } else { msSetError(MS_IMGERR, "Cannot create IM image of size %d x %d.", "msImageCreateIM()", width, height); } return image; } /* ------------------------------------------------------------------------- */ /* Draw a single marker symbol of the specified size and color */ /* ------------------------------------------------------------------------- */ void msDrawMarkerSymbolIM(mapObj *map, imageObj *img, pointObj *p, styleObj *style, double scalefactor) { symbolObj *symbol; int ox, oy; double size; DEBUG_IF printf("msDrawMarkerSymbolIM\n
"); /* skip this, we don't do text */ if (!p) return; if (style->symbol > map->symbolset.numsymbols || style->symbol < 0) return; /* no such symbol, 0 is OK */ symbol = map->symbolset.symbol[style->symbol]; ox = style->offsetx * scalefactor; oy = style->offsety * scalefactor; if (style->size == -1) { size = msSymbolGetDefaultSize(symbol); size = MS_NINT(size * scalefactor); } else size = MS_NINT(style->size * scalefactor); size = MS_MAX(size, style->minsize * img->resolutionfactor); size = MS_MIN(size, style->maxsize * img->resolutionfactor); if (size < 1) return; /* size too small */ /* DEBUG_IF printf(".%d.%d.%d.", symbol->type, style->symbol, fc); */ if (style->symbol == 0) { /* simply draw a single pixel of the specified color */ if (dxf) { if (dxf == 2) im_iprintf(&imgStr, "POINT\n%.0f %.0f\n%d\n", p->x + ox, p->y + oy, matchdxfcolor(style->color)); else im_iprintf(&imgStr, " 0\nPOINT\n 10\n%f\n 20\n%f\n 30\n0.0\n" " 62\n%6d\n 8\n%s\n", p->x + ox, p->y + oy, matchdxfcolor(style->color), lname); } else { im_iprintf(&imgStr, "\n", p->x + ox, p->y + oy); } /* point2 = &( p->line[j].point[i] ); */ /* if(point1->y == point2->y) {} */ return; } DEBUG_IF printf("A"); switch (symbol->type) { case (MS_SYMBOL_TRUETYPE): DEBUG_IF printf("T"); break; case (MS_SYMBOL_PIXMAP): DEBUG_IF printf("P"); break; case (MS_SYMBOL_VECTOR): DEBUG_IF printf("V"); { double d, offset_x, offset_y; d = size / symbol->sizey; offset_x = MS_NINT(p->x - d * .5 * symbol->sizex + ox); offset_y = MS_NINT(p->y - d * .5 * symbol->sizey + oy); /* For now I only render filled vector symbols in imagemap, and no */ /* dxf support available yet. */ if (symbol->filled && !dxf /* && fc >= 0 */) { /* char *title=(p->numvalues) ? p->values[0] : ""; */ char *title = ""; int j; im_iprintf(&imgStr, "numpoints; j++) { im_iprintf(&imgStr, "%s %d,%d", j == 0 ? "" : ",", (int)MS_NINT(d * symbol->points[j].x + offset_x), (int)MS_NINT(d * symbol->points[j].y + offset_y)); } im_iprintf(&imgStr, "\" />\n"); } /* end of imagemap, filled case. */ } break; default: DEBUG_IF printf("DEF"); break; } /* end switch statement */ return; } /* ------------------------------------------------------------------------- */ /* Draw a line symbol of the specified size and color */ /* ------------------------------------------------------------------------- */ void msDrawLineSymbolIM(mapObj *map, imageObj *img, shapeObj *p, styleObj *style, double scalefactor_ignored) { (void)img; (void)scalefactor_ignored; symbolObj *symbol; int i, j, l; char first = 1; DEBUG_IF printf("msDrawLineSymbolIM
\n"); if (!p) return; if (p->numlines <= 0) return; if (style->symbol > map->symbolset.numsymbols || style->symbol < 0) return; /* no such symbol, 0 is OK */ symbol = map->symbolset.symbol[style->symbol]; if (suppressEmpty && p->numvalues == 0) return; /* suppress area with empty title */ if (style->symbol == 0) { /* just draw a single width line */ for (l = 0, j = 0; j < p->numlines; j++) { if (dxf == 2) { im_iprintf(&imgStr, "LINE\n%d\n", matchdxfcolor(style->color)); } else if (dxf) { im_iprintf(&imgStr, " 0\nPOLYLINE\n 70\n 0\n 62\n%6d\n 8\n%s\n", matchdxfcolor(style->color), lname); } else { char *title; first = 1; title = (p->numvalues) ? p->values[0] : ""; im_iprintf(&imgStr, "line[j].point[p->line[j].numpoints-1] ); */ for (i = 0; i < p->line[j].numpoints; i++, l++) { if (dxf == 2) { im_iprintf(&imgStr, "%.0f %.0f\n", p->line[j].point[i].x, p->line[j].point[i].y); } else if (dxf) { im_iprintf(&imgStr, " 0\nVERTEX\n 10\n%f\n 20\n%f\n 30\n%f\n", p->line[j].point[i].x, p->line[j].point[i].y, 0.0); } else { im_iprintf(&imgStr, "%s %.0f,%.0f", first ? "" : ",", p->line[j].point[i].x, p->line[j].point[i].y); } first = 0; /* point2 = &( p->line[j].point[i] ); */ /* if(point1->y == point2->y) {} */ } im_iprintf(&imgStr, dxf ? (dxf == 2 ? "" : " 0\nSEQEND\n") : "\" />\n"); } /* DEBUG_IF printf ("%d, ",strlen(img->img.imagemap) ); */ return; } DEBUG_IF printf("-%d-", symbol->type); return; } /* ------------------------------------------------------------------------- */ /* Draw a shade symbol of the specified size and color */ /* ------------------------------------------------------------------------- */ void msDrawShadeSymbolIM(mapObj *map, imageObj *img, shapeObj *p, styleObj *style, double scalefactor_ignored) { (void)img; (void)scalefactor_ignored; symbolObj *symbol; int i, j, l; char first = 1; DEBUG_IF printf("msDrawShadeSymbolIM\n
"); if (!p) return; if (p->numlines <= 0) return; symbol = map->symbolset.symbol[style->symbol]; if (suppressEmpty && p->numvalues == 0) return; /* suppress area with empty title */ if (style->symbol == 0) { /* simply draw a single pixel of the specified color // */ for (l = 0, j = 0; j < p->numlines; j++) { if (dxf == 2) { im_iprintf(&imgStr, "POLY\n%d\n", matchdxfcolor(style->color)); } else if (dxf) { im_iprintf(&imgStr, " 0\nPOLYLINE\n 73\n 1\n 62\n%6d\n 8\n%s\n", matchdxfcolor(style->color), lname); } else { char *title = (p->numvalues) ? p->values[0] : ""; first = 1; im_iprintf(&imgStr, "line[j].point[p->line[j].numpoints-1] ); */ for (i = 0; i < p->line[j].numpoints; i++, l++) { if (dxf == 2) { im_iprintf(&imgStr, "%.0f %.0f\n", p->line[j].point[i].x, p->line[j].point[i].y); } else if (dxf) { im_iprintf(&imgStr, " 0\nVERTEX\n 10\n%f\n 20\n%f\n 30\n%f\n", p->line[j].point[i].x, p->line[j].point[i].y, 0.0); } else { im_iprintf(&imgStr, "%s %.0f,%.0f", first ? "" : ",", p->line[j].point[i].x, p->line[j].point[i].y); } first = 0; /* point2 = &( p->line[j].point[i] ); */ /* if(point1->y == point2->y) {} */ } im_iprintf(&imgStr, dxf ? (dxf == 2 ? "" : " 0\nSEQEND\n") : "\" />\n"); } return; } /* DEBUG_IF printf ("d"); */ DEBUG_IF printf("-%d-", symbol->type); return; } /* * Simply draws a label based on the label point and the supplied label object. */ int msDrawTextIM(mapObj *map, imageObj *img, pointObj labelPnt, char *string, labelObj *label, double scalefactor) { (void)map; (void)img; DEBUG_IF printf("msDrawText
\n"); if (!string) return (0); /* not errors, just don't want to do anything */ if (strlen(string) == 0) return (0); if (!dxf) return (0); if (dxf == 2) { im_iprintf(&imgStr, "TEXT\n%d\n%s\n%.0f\n%.0f\n%.0f\n", matchdxfcolor(label->color), string, labelPnt.x, labelPnt.y, -label->angle); } else { im_iprintf(&imgStr, " 0\nTEXT\n 1\n%s\n 10\n%f\n 20\n%f\n 30\n0.0\n 40\n%f\n " "50\n%f\n 62\n%6d\n 8\n%s\n 73\n 2\n 72\n 1\n", string, labelPnt.x, labelPnt.y, label->size * scalefactor * 100, -label->angle, matchdxfcolor(label->color), lname); } return (0); } /* * Save an image to a file named filename, if filename is NULL it goes to stdout */ int msSaveImageIM(imageObj *img, const char *filename, outputFormatObj *format) { FILE *stream_to_free = NULL; FILE *stream; char workbuffer[5000]; DEBUG_IF printf("msSaveImageIM\n
"); if (filename != NULL && strlen(filename) > 0) { stream_to_free = fopen(filename, "wb"); if (!stream_to_free) { msSetError(MS_IOERR, "(%s)", "msSaveImage()", filename); return (MS_FAILURE); } stream = stream_to_free; } else { /* use stdout */ #ifdef _WIN32 /* * Change stdout mode to binary on win32 platforms */ if (_setmode(_fileno(stdout), _O_BINARY) == -1) { msSetError(MS_IOERR, "Unable to change stdout to binary mode.", "msSaveImage()"); return (MS_FAILURE); } #endif stream = stdout; } if (strcasecmp(format->driver, "imagemap") == 0) { DEBUG_IF printf("ALLOCD %d
\n", img->size); /* DEBUG_IF printf("F %s
\n", img->img.imagemap); */ DEBUG_IF printf("FLEN %d
\n", (int)strlen(img->img.imagemap)); if (dxf == 2) { msIO_fprintf(stream, "%s", layerlist); } else if (dxf) { msIO_fprintf( stream, " 0\nSECTION\n 2\nHEADER\n 9\n$ACADVER\n 1\nAC1009\n0\nENDSEC\n " "0\nSECTION\n 2\nTABLES\n 0\nTABLE\n%s0\nENDTAB\n0\nENDSEC\n " "0\nSECTION\n 2\nBLOCKS\n0\nENDSEC\n 0\nSECTION\n 2\nENTITIES\n", layerlist); } else { msIO_fprintf(stream, "\n", mapName, img->width, img->height); } const int nSize = sizeof(workbuffer); const int size = strlen(img->img.imagemap); if (size > nSize) { int iIndice = 0; while ((iIndice + nSize) <= size) { snprintf(workbuffer, sizeof(workbuffer), "%s", img->img.imagemap + iIndice); workbuffer[nSize - 1] = '\0'; msIO_fwrite(workbuffer, strlen(workbuffer), 1, stream); iIndice += nSize - 1; } if (iIndice < size) { sprintf(workbuffer, "%s", img->img.imagemap + iIndice); msIO_fprintf(stream, "%s", workbuffer); } } else msIO_fwrite(img->img.imagemap, size, 1, stream); if (strcasecmp("OFF", msGetOutputFormatOption(format, "SKIPENDTAG", "OFF")) == 0) { if (dxf == 2) msIO_fprintf(stream, "END"); else if (dxf) msIO_fprintf(stream, "0\nENDSEC\n0\nEOF\n"); else msIO_fprintf(stream, ""); } } else { msSetError(MS_MISCERR, "Unknown output image type driver: %s.", "msSaveImage()", format->driver); if (stream_to_free != NULL) fclose(stream_to_free); return (MS_FAILURE); } if (stream_to_free != NULL) fclose(stream_to_free); return (MS_SUCCESS); } /* * Free gdImagePtr */ void msFreeImageIM(imageObj *img) { free(img->img.imagemap); } mapserver-8.4.0/src/mapio.c000066400000000000000000001107661474174441300156130ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementations for MapServer IO redirection capability. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2004, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "mapserver.h" #include "mapthread.h" #ifdef _WIN32 #include #include #endif #ifdef MOD_WMS_ENABLED #include "httpd.h" #include "apr_strings.h" #endif static int is_msIO_initialized = MS_FALSE; static int is_msIO_header_enabled = MS_TRUE; typedef struct msIOContextGroup_t { msIOContext stdin_context; msIOContext stdout_context; msIOContext stderr_context; void *thread_id; struct msIOContextGroup_t *next; } msIOContextGroup; static msIOContextGroup default_contexts; static msIOContextGroup *io_context_list = NULL; static void msIO_Initialize(void); #ifdef msIO_printf #undef msIO_printf #undef msIO_fprintf #undef msIO_fwrite #undef msIO_fread #undef msIO_vfprintf #endif /************************************************************************/ /* msIO_Cleanup() */ /************************************************************************/ void msIO_Cleanup() { if (is_msIO_initialized) { is_msIO_initialized = MS_FALSE; while (io_context_list != NULL) { msIOContextGroup *last = io_context_list; io_context_list = io_context_list->next; free(last); } } } /************************************************************************/ /* msIO_GetContextGroup() */ /************************************************************************/ static msIOContextGroup *msIO_GetContextGroup() { void *nThreadId = msGetThreadId(); msIOContextGroup *prev = NULL, *group = io_context_list; if (group != NULL && group->thread_id == nThreadId) return group; /* -------------------------------------------------------------------- */ /* Search for group for this thread */ /* -------------------------------------------------------------------- */ msAcquireLock(TLOCK_IOCONTEXT); msIO_Initialize(); group = io_context_list; while (group != NULL && group->thread_id != nThreadId) { prev = group; group = group->next; } /* -------------------------------------------------------------------- */ /* If we found it, make sure it is pushed to the front of the */ /* link for faster finding next time, and return it. */ /* -------------------------------------------------------------------- */ if (group != NULL) { if (prev != NULL) { prev->next = group->next; group->next = io_context_list; io_context_list = group; } msReleaseLock(TLOCK_IOCONTEXT); return group; } /* -------------------------------------------------------------------- */ /* Create a new context group for this thread. */ /* -------------------------------------------------------------------- */ group = (msIOContextGroup *)calloc(1, sizeof(msIOContextGroup)); group->stdin_context = default_contexts.stdin_context; group->stdout_context = default_contexts.stdout_context; group->stderr_context = default_contexts.stderr_context; group->thread_id = nThreadId; group->next = io_context_list; io_context_list = group; msReleaseLock(TLOCK_IOCONTEXT); return group; } /* returns MS_TRUE if the msIO standard output hasn't been redirected */ int msIO_isStdContext() { msIOContextGroup *group = io_context_list; void *nThreadId = msGetThreadId(); if (!group || group->thread_id != nThreadId) { group = msIO_GetContextGroup(); if (!group) { return MS_FALSE; /* probably a bug */ } } if (group->stderr_context.cbData == (void *)stderr && group->stdin_context.cbData == (void *)stdin && group->stdout_context.cbData == (void *)stdout) return MS_TRUE; return MS_FALSE; } /************************************************************************/ /* msIO_getHandler() */ /************************************************************************/ msIOContext *msIO_getHandler(FILE *fp) { void *nThreadId = msGetThreadId(); msIOContextGroup *group = io_context_list; msIO_Initialize(); if (group == NULL || group->thread_id != nThreadId) { group = msIO_GetContextGroup(); if (group == NULL) return NULL; } if (fp == stdin || fp == NULL || strcmp((const char *)fp, "stdin") == 0) return &(group->stdin_context); else if (fp == stdout || strcmp((const char *)fp, "stdout") == 0) return &(group->stdout_context); else if (fp == stderr || strcmp((const char *)fp, "stderr") == 0) return &(group->stderr_context); else return NULL; } /************************************************************************/ /* msIO_setHeaderEnabled() */ /************************************************************************/ void msIO_setHeaderEnabled(int bFlag) { is_msIO_header_enabled = bFlag; } /************************************************************************/ /* msIO_setHeader() */ /************************************************************************/ void msIO_setHeader(const char *header, const char *value, ...) { va_list args; va_start(args, value); #ifdef MOD_WMS_ENABLED msIOContext *ioctx = msIO_getHandler(stdout); if (ioctx && !strcmp(ioctx->label, "apache")) { request_rec *r = (request_rec *)(ioctx->cbData); char *fullvalue = apr_pvsprintf(r->pool, value, args); if (strcasecmp(header, "Content-Type") == 0) { r->content_type = fullvalue; } else if (strcasecmp(header, "Status") == 0) { r->status = atoi(fullvalue); } else { apr_table_setn(r->headers_out, apr_pstrdup(r->pool, header), fullvalue); } } else { #endif // MOD_WMS_ENABLED if (is_msIO_header_enabled) { msIO_fprintf(stdout, "%s: ", header); msIO_vfprintf(stdout, value, args); msIO_fprintf(stdout, "\r\n"); } #ifdef MOD_WMS_ENABLED } #endif va_end(args); } void msIO_sendHeaders() { #ifdef MOD_WMS_ENABLED msIOContext *ioctx = msIO_getHandler(stdout); if (ioctx && !strcmp(ioctx->label, "apache")) return; #endif // !MOD_WMS_ENABLED if (is_msIO_header_enabled) { msIO_printf("\r\n"); fflush(stdout); } } /************************************************************************/ /* msIO_installHandlers() */ /************************************************************************/ int msIO_installHandlers(msIOContext *stdin_context, msIOContext *stdout_context, msIOContext *stderr_context) { msIOContextGroup *group; msIO_Initialize(); group = msIO_GetContextGroup(); if (stdin_context == NULL) group->stdin_context = default_contexts.stdin_context; else if (stdin_context != &group->stdin_context) group->stdin_context = *stdin_context; if (stdout_context == NULL) group->stdout_context = default_contexts.stdout_context; else if (stdout_context != &group->stdout_context) group->stdout_context = *stdout_context; if (stderr_context == NULL) group->stderr_context = default_contexts.stderr_context; else if (stderr_context != &group->stderr_context) group->stderr_context = *stderr_context; return MS_TRUE; } /************************************************************************/ /* msIO_contextRead() */ /************************************************************************/ int msIO_contextRead(msIOContext *context, void *data, int byteCount) { if (context->write_channel == MS_TRUE) return 0; else return context->readWriteFunc(context->cbData, data, byteCount); } /************************************************************************/ /* msIO_contextWrite() */ /************************************************************************/ int msIO_contextWrite(msIOContext *context, const void *data, int byteCount) { if (context->write_channel == MS_FALSE) return 0; else return context->readWriteFunc(context->cbData, (void *)data, byteCount); } /* ==================================================================== */ /* ==================================================================== */ /* Stdio-like cover functions. */ /* ==================================================================== */ /* ==================================================================== */ /************************************************************************/ /* _ms_vsprintf() */ /************************************************************************/ static int _ms_vsprintf(char **workBufPtr, const char *format, va_list ap) { int ret_val; int workBufSize = 16000; *workBufPtr = (char *)malloc(workBufSize * sizeof(char)); if (*workBufPtr == NULL) { msSetError(MS_MEMERR, NULL, "_ms_vsprintf()"); return -1; } #if defined(HAVE_VSNPRINTF) /* This should grow a big enough buffer to hold any formatted result. */ { va_list wrk_args; #ifdef va_copy va_copy(wrk_args, ap); #else wrk_args = ap; #endif while ((ret_val = vsnprintf(*workBufPtr, workBufSize, format, wrk_args)) >= workBufSize - 1 || ret_val == -1) { workBufSize *= 4; *workBufPtr = (char *)realloc(*workBufPtr, workBufSize); if (*workBufPtr == NULL) { msSetError(MS_MEMERR, NULL, "_ms_vsprintf()"); va_end(wrk_args); return -1; } #ifdef va_copy va_end(wrk_args); va_copy(wrk_args, ap); #else wrk_args = ap; #endif } va_end(wrk_args); } #else /* We do not have vsnprintf()... there is a risk of buffer overrun */ ret_val = vsprintf(*workBufPtr, format, ap); if (ret_val < 0 || ret_val >= workBufSize) { msSetError(MS_MISCERR, "Possible buffer overrun.", "_ms_vsprintf()"); msFree(*workBufPtr); *workBufPtr = NULL; return -1; } #endif return ret_val; } /************************************************************************/ /* msIO_printf() */ /************************************************************************/ int msIO_printf(const char *format, ...) { va_list args; int ret; va_start(args, format); ret = msIO_vfprintf(stdout, format, args); va_end(args); return ret; } /************************************************************************/ /* msIO_fprintf() */ /************************************************************************/ int msIO_fprintf(FILE *fp, const char *format, ...) { va_list args; int ret; va_start(args, format); ret = msIO_vfprintf(fp, format, args); va_end(args); return ret; } /************************************************************************/ /* msIO_vfprintf() */ /************************************************************************/ int msIO_vfprintf(FILE *fp, const char *format, va_list ap) { int return_val; msIOContext *context; char workBuf[8000]; #if !defined(HAVE_VSNPRINTF) return_val = vsprintf(workBuf, format, ap); if (return_val < 0 || return_val >= sizeof(workBuf)) { msSetError(MS_MISCERR, "Possible buffer overrun.", "msIO_vfprintf()"); return -1; } char *outbuf = workBuf; #else va_list args_copy; #ifdef va_copy va_copy(args_copy, ap); #else args_copy = ap; #endif /* va_copy */ char *largerBuf = NULL; return_val = vsnprintf(workBuf, sizeof(workBuf), format, ap); if (return_val == -1 || return_val >= (int)sizeof(workBuf) - 1) { return_val = _ms_vsprintf(&largerBuf, format, args_copy); } va_end(args_copy); if (return_val < 0) return -1; char *outbuf = largerBuf ? largerBuf : workBuf; #endif /* HAVE_VSNPRINTF */ context = msIO_getHandler(fp); if (context == NULL) return_val = fwrite(outbuf, 1, return_val, fp); else return_val = msIO_contextWrite(context, outbuf, return_val); #if defined(HAVE_VSNPRINTF) msFree(largerBuf); #endif return return_val; } /************************************************************************/ /* msIO_fwrite() */ /************************************************************************/ int msIO_fwrite(const void *data, size_t size, size_t nmemb, FILE *fp) { msIOContext *context; if (size == 0 || nmemb == 0) return 0; context = msIO_getHandler(fp); if (context == NULL) return fwrite(data, size, nmemb, fp); else return msIO_contextWrite(context, data, size * nmemb) / size; } /************************************************************************/ /* msIO_fread() */ /************************************************************************/ int msIO_fread(void *data, size_t size, size_t nmemb, FILE *fp) { msIOContext *context; if (size == 0 || nmemb == 0) return 0; context = msIO_getHandler(fp); if (context == NULL) return fread(data, size, nmemb, fp); else return msIO_contextRead(context, data, size * nmemb) / size; } /* ==================================================================== */ /* ==================================================================== */ /* Internal default callbacks implementing stdio reading and */ /* writing. */ /* ==================================================================== */ /* ==================================================================== */ /************************************************************************/ /* msIO_stdioRead() */ /* */ /* This is the default implementation via stdio. */ /************************************************************************/ static int msIO_stdioRead(void *cbData, void *data, int byteCount) { return fread(data, 1, byteCount, (FILE *)cbData); } /************************************************************************/ /* msIO_stdioWrite() */ /* */ /* This is the default implementation via stdio. */ /************************************************************************/ static int msIO_stdioWrite(void *cbData, void *data, int byteCount) { return fwrite(data, 1, byteCount, (FILE *)cbData); } /************************************************************************/ /* msIO_Initialize() */ /************************************************************************/ static void msIO_Initialize(void) { if (is_msIO_initialized == MS_TRUE) return; default_contexts.stdin_context.label = "stdio"; default_contexts.stdin_context.write_channel = MS_FALSE; default_contexts.stdin_context.readWriteFunc = msIO_stdioRead; default_contexts.stdin_context.cbData = (void *)stdin; default_contexts.stdout_context.label = "stdio"; default_contexts.stdout_context.write_channel = MS_TRUE; default_contexts.stdout_context.readWriteFunc = msIO_stdioWrite; default_contexts.stdout_context.cbData = (void *)stdout; default_contexts.stderr_context.label = "stdio"; default_contexts.stderr_context.write_channel = MS_TRUE; default_contexts.stderr_context.readWriteFunc = msIO_stdioWrite; default_contexts.stderr_context.cbData = (void *)stderr; default_contexts.next = NULL; default_contexts.thread_id = 0; is_msIO_initialized = MS_TRUE; } /* ==================================================================== */ /* ==================================================================== */ /* FastCGI output redirection functions. */ /* ==================================================================== */ /* ==================================================================== */ /************************************************************************/ /* msIO_needBinaryStdout() */ /* */ /* This function is intended to ensure that stdout is in binary */ /* mode. */ /* */ /* But don't do it we are using FastCGI. We will take care of */ /* doing it in the libfcgi library in that case for the normal */ /* cgi case, and for the fastcgi case the _setmode() call */ /* causes a crash. */ /************************************************************************/ int msIO_needBinaryStdout() { #if defined(_WIN32) && !defined(USE_FASTCGI) if (_setmode(_fileno(stdout), _O_BINARY) == -1) { msSetError(MS_IOERR, "Unable to change stdout to binary mode.", "msIO_needBinaryStdout()"); return (MS_FAILURE); } #endif return MS_SUCCESS; } /************************************************************************/ /* msIO_needBinaryStdin() */ /* */ /* This function is intended to ensure that stdin is in binary */ /* mode. */ /* */ /* But don't do it we are using FastCGI. We will take care of */ /* doing it in the libfcgi library in that case for the normal */ /* cgi case, and for the fastcgi case the _setmode() call */ /* causes a crash. */ /************************************************************************/ int msIO_needBinaryStdin() { #if defined(_WIN32) && !defined(USE_FASTCGI) if (_setmode(_fileno(stdin), _O_BINARY) == -1) { msSetError(MS_IOERR, "Unable to change stdin to binary mode.", "msIO_needBinaryStdin()"); return (MS_FAILURE); } #endif return MS_SUCCESS; } /* ==================================================================== */ /* memory buffer io handling functions. */ /* ==================================================================== */ /************************************************************************/ /* msIO_resetHandlers() */ /************************************************************************/ void msIO_resetHandlers() { msIOContextGroup *group = msIO_GetContextGroup(); if (group == NULL) return; if (strcmp(group->stdin_context.label, "buffer") == 0) { msIOBuffer *buf = (msIOBuffer *)group->stdin_context.cbData; if (buf->data != NULL) free(buf->data); free(buf); } if (strcmp(group->stdout_context.label, "buffer") == 0) { msIOBuffer *buf = (msIOBuffer *)group->stdout_context.cbData; if (buf->data != NULL) free(buf->data); free(buf); } if (strcmp(group->stderr_context.label, "buffer") == 0) { msIOBuffer *buf = (msIOBuffer *)group->stderr_context.cbData; if (buf->data != NULL) free(buf->data); free(buf); } msIO_installHandlers(NULL, NULL, NULL); } /************************************************************************/ /* msIO_installStdoutToBuffer() */ /************************************************************************/ void msIO_installStdoutToBuffer() { msIOContextGroup *group = msIO_GetContextGroup(); msIOContext context; context.label = "buffer"; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = calloc(1, sizeof(msIOBuffer)); msIO_installHandlers(&group->stdin_context, &context, &group->stderr_context); } /************************************************************************/ /* msIO_pushStdoutToBufferAndGetOldContext() */ /* */ /* This function installs a temporary buffer I/O context and returns */ /* previously installed stdout handler. This previous stdout handler */ /* should later be restored with msIO_restoreOldStdoutContext(). */ /* This function can be for example used when wanting to ingest into */ /* libxml objects XML generated by msIO_fprintf() */ /************************************************************************/ msIOContext *msIO_pushStdoutToBufferAndGetOldContext() { msIOContextGroup *group = msIO_GetContextGroup(); msIOContext *old_context; /* Backup current context */ old_context = (msIOContext *)msSmallMalloc(sizeof(msIOContext)); memcpy(old_context, &group->stdout_context, sizeof(msIOContext)); msIO_installStdoutToBuffer(); return old_context; } /************************************************************************/ /* msIO_restoreOldStdoutContext() */ /************************************************************************/ void msIO_restoreOldStdoutContext(msIOContext *context_to_restore) { msIOContextGroup *group = msIO_GetContextGroup(); msIOContext *prev_context = &group->stdout_context; msIOBuffer *buffer; /* Free memory associated to our temporary context */ assert(strcmp(prev_context->label, "buffer") == 0); buffer = (msIOBuffer *)prev_context->cbData; msFree(buffer->data); msFree(buffer); /* Restore old context */ msIO_installHandlers(&group->stdin_context, context_to_restore, &group->stderr_context); msFree(context_to_restore); } /************************************************************************/ /* msIO_installStdinFromBuffer() */ /************************************************************************/ void msIO_installStdinFromBuffer() { msIOContextGroup *group = msIO_GetContextGroup(); msIOContext context; context.label = "buffer"; context.write_channel = MS_FALSE; context.readWriteFunc = msIO_bufferRead; context.cbData = calloc(1, sizeof(msIOBuffer)); msIO_installHandlers(&context, &group->stdout_context, &group->stderr_context); } /************************************************************************/ /* msIO_getAndStripStdoutBufferMimeHeaders() */ /* */ /************************************************************************/ hashTableObj *msIO_getAndStripStdoutBufferMimeHeaders() { /* -------------------------------------------------------------------- */ /* Find stdout buffer. */ /* -------------------------------------------------------------------- */ msIOContext *ctx = msIO_getHandler((FILE *)"stdout"); msIOBuffer *buf; int start_of_mime_header, current_pos; hashTableObj *hashTable; if (ctx == NULL || ctx->write_channel == MS_FALSE || strcmp(ctx->label, "buffer") != 0) { msSetError(MS_MISCERR, "Can't identify msIO buffer.", "msIO_getAndStripStdoutBufferMimeHeaders"); return NULL; } buf = (msIOBuffer *)ctx->cbData; hashTable = msCreateHashTable(); /* -------------------------------------------------------------------- */ /* Loop over all headers. */ /* -------------------------------------------------------------------- */ current_pos = 0; while (MS_TRUE) { int pos_of_column = -1; char *key, *value; start_of_mime_header = current_pos; while (current_pos < buf->data_offset) { if (buf->data[current_pos] == '\r') { if (current_pos + 1 == buf->data_offset || buf->data[current_pos + 1] != '\n') { pos_of_column = -1; break; } break; } if (buf->data[current_pos] == ':') { pos_of_column = current_pos; if (current_pos + 1 == buf->data_offset || buf->data[current_pos + 1] != ' ') { pos_of_column = -1; break; } } current_pos++; } if (pos_of_column < 0 || current_pos == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt mime headers.", "msIO_getAndStripStdoutBufferMimeHeaders"); msFreeHashTable(hashTable); return NULL; } key = (char *)malloc(pos_of_column - start_of_mime_header + 1); memcpy(key, buf->data + start_of_mime_header, pos_of_column - start_of_mime_header); key[pos_of_column - start_of_mime_header] = '\0'; value = (char *)malloc(current_pos - (pos_of_column + 2) + 1); memcpy(value, buf->data + pos_of_column + 2, current_pos - (pos_of_column + 2)); value[current_pos - (pos_of_column + 2)] = '\0'; msInsertHashTable(hashTable, key, value); msFree(key); msFree(value); /* -------------------------------------------------------------------- */ /* Go to next line. */ /* -------------------------------------------------------------------- */ current_pos += 2; if (current_pos == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt mime headers.", "msIO_getAndStripStdoutBufferMimeHeaders"); msFreeHashTable(hashTable); return NULL; } /* If next line is a '\r', this is the end of mime headers. */ if (buf->data[current_pos] == '\r') { current_pos++; if (current_pos == buf->data_offset || buf->data[current_pos] != '\n') { msSetError(MS_MISCERR, "Corrupt mime headers.", "msIO_getAndStripStdoutBufferMimeHeaders"); msFreeHashTable(hashTable); return NULL; } current_pos++; break; } } /* -------------------------------------------------------------------- */ /* Move data to front of buffer, and reset length. */ /* -------------------------------------------------------------------- */ memmove(buf->data, buf->data + current_pos, buf->data_offset - current_pos); buf->data[buf->data_offset - current_pos] = '\0'; buf->data_offset -= current_pos; return hashTable; } /************************************************************************/ /* msIO_stripStdoutBufferContentType() */ /* */ /* Strip off Content-Type header from buffer, and return to */ /* caller. Returned string is the callers responsibility to */ /* call msFree() on to deallocate. This function will return */ /* NULL if there is no Content-Type header. */ /************************************************************************/ char *msIO_stripStdoutBufferContentType() { /* -------------------------------------------------------------------- */ /* Find stdout buffer. */ /* -------------------------------------------------------------------- */ msIOContext *ctx = msIO_getHandler((FILE *)"stdout"); msIOBuffer *buf; char *content_type = NULL; int end_of_ct, start_of_data; if (ctx == NULL || ctx->write_channel == MS_FALSE || strcmp(ctx->label, "buffer") != 0) { msSetError(MS_MISCERR, "Can't identify msIO buffer.", "msIO_stripStdoutBufferContentType"); return NULL; } buf = (msIOBuffer *)ctx->cbData; /* -------------------------------------------------------------------- */ /* Return NULL if we don't have a Content-Type header. */ /* -------------------------------------------------------------------- */ if (buf->data_offset < 14 || strncasecmp((const char *)buf->data, "Content-Type: ", 14) != 0) return NULL; /* -------------------------------------------------------------------- */ /* Find newline marker at end of content type argument. */ /* -------------------------------------------------------------------- */ end_of_ct = 13; while (end_of_ct + 1 < buf->data_offset && buf->data[end_of_ct + 1] != '\r') end_of_ct++; if (end_of_ct + 1 == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt Content-Type header.", "msIO_stripStdoutBufferContentType"); return NULL; } /* -------------------------------------------------------------------- */ /* Continue on to the start of data ... */ /* Go to next line and skip if empty. */ /* -------------------------------------------------------------------- */ start_of_data = end_of_ct + 3; if (start_of_data < buf->data_offset && buf->data[start_of_data] == '\r') start_of_data += 2; if (start_of_data == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt Content-Type header.", "msIO_stripStdoutBufferContentType"); return NULL; } /* -------------------------------------------------------------------- */ /* Copy out content type. Note we go against the coding guidelines */ /* here and use strncpy() instead of strlcpy() as the source */ /* buffer may not be NULL terminated - strlcpy() requires NULL */ /* terminated sources (see issue #4672). */ /* -------------------------------------------------------------------- */ content_type = (char *)malloc(end_of_ct - 14 + 2); strncpy(content_type, (const char *)buf->data + 14, end_of_ct - 14 + 2); content_type[end_of_ct - 14 + 1] = '\0'; /* -------------------------------------------------------------------- */ /* Move data to front of buffer, and reset length. */ /* -------------------------------------------------------------------- */ memmove(buf->data, buf->data + start_of_data, buf->data_offset - start_of_data); buf->data[buf->data_offset - start_of_data] = '\0'; buf->data_offset -= start_of_data; return content_type; } /************************************************************************/ /* msIO_stripStdoutBufferContentHeaders() */ /* */ /* Strip off Content-* headers from buffer. */ /************************************************************************/ void msIO_stripStdoutBufferContentHeaders() { /* -------------------------------------------------------------------- */ /* Find stdout buffer. */ /* -------------------------------------------------------------------- */ msIOContext *ctx = msIO_getHandler((FILE *)"stdout"); msIOBuffer *buf; int start_of_data; if (ctx == NULL || ctx->write_channel == MS_FALSE || strcmp(ctx->label, "buffer") != 0) { msSetError(MS_MISCERR, "Can't identify msIO buffer.", "msIO_stripStdoutBufferContentHeaders"); return; } buf = (msIOBuffer *)ctx->cbData; /* -------------------------------------------------------------------- */ /* Exit if we don't have any content-* header. */ /* -------------------------------------------------------------------- */ if (buf->data_offset < 8 || strncasecmp((const char *)buf->data, "Content-", 8) != 0) return; /* -------------------------------------------------------------------- */ /* Loop over all content-* headers. */ /* -------------------------------------------------------------------- */ start_of_data = 0; while (buf->data_offset > start_of_data && strncasecmp((const char *)buf->data + start_of_data, "Content-", 8) == 0) { /* -------------------------------------------------------------------- */ /* Find newline marker at end of content-* header argument. */ /* -------------------------------------------------------------------- */ start_of_data += 7; while (start_of_data + 1 < buf->data_offset && buf->data[start_of_data + 1] != '\r') start_of_data++; if (start_of_data + 1 == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt Content-* header.", "msIO_stripStdoutBufferContentHeaders"); return; } /* -------------------------------------------------------------------- */ /* Go to next line. */ /* -------------------------------------------------------------------- */ start_of_data += 3; } /* -------------------------------------------------------------------- */ /* Continue on to the start of data ... */ /* Skip next line if empty. */ /* -------------------------------------------------------------------- */ if (start_of_data < buf->data_offset && buf->data[start_of_data] == '\r') start_of_data += 2; if (start_of_data == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt Content-* header.", "msIO_stripStdoutBufferContentHeaders"); return; } /* -------------------------------------------------------------------- */ /* Move data to front of buffer, and reset length. */ /* -------------------------------------------------------------------- */ memmove(buf->data, buf->data + start_of_data, buf->data_offset - start_of_data); buf->data[buf->data_offset - start_of_data] = '\0'; buf->data_offset -= start_of_data; return; } /************************************************************************/ /* msIO_bufferWrite() */ /************************************************************************/ int msIO_bufferWrite(void *cbData, void *data, int byteCount) { msIOBuffer *buf = (msIOBuffer *)cbData; /* ** Grow buffer if needed (reserve one extra byte to put nul character) */ if (buf->data_offset + byteCount >= buf->data_len) { buf->data_len = buf->data_len * 2 + byteCount + 100; if (buf->data == NULL) buf->data = (unsigned char *)malloc(buf->data_len); else buf->data = (unsigned char *)realloc(buf->data, buf->data_len); if (buf->data == NULL) { msSetError(MS_MEMERR, "Failed to allocate %d bytes for capture buffer.", "msIO_bufferWrite()", buf->data_len); buf->data_len = 0; return 0; } } /* ** Copy result into buffer. */ memcpy(buf->data + buf->data_offset, data, byteCount); buf->data_offset += byteCount; buf->data[buf->data_offset] = '\0'; return byteCount; } /************************************************************************/ /* msIO_bufferRead() */ /************************************************************************/ int msIO_bufferRead(void *cbData, void *data, int byteCount) { (void)cbData; (void)data; (void)byteCount; /* not implemented yet. */ return 0; } mapserver-8.4.0/src/mapio.h000066400000000000000000000113701474174441300156070ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Definitions for MapServer IO redirection capability. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2004, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPIO_H #define MAPIO_H /* ** We deliberately emulate stdio functions in the msIO cover functions. ** This makes it easy for folks to understand the semantics, and means we ** can just #define things to use stdio in the simplest case. */ #include #include "maphash.h" #ifdef __cplusplus extern "C" { #endif #ifndef MS_PRINT_FUNC_FORMAT #if defined(__GNUC__) && __GNUC__ >= 3 && !defined(DOXYGEN_SKIP) #define MS_PRINT_FUNC_FORMAT(format_idx, arg_idx) \ __attribute__((__format__(__printf__, format_idx, arg_idx))) #else #define MS_PRINT_FUNC_FORMAT(format_idx, arg_idx) #endif #endif /* stdio analogs */ int MS_DLL_EXPORT msIO_printf(const char *format, ...) MS_PRINT_FUNC_FORMAT(1, 2); int MS_DLL_EXPORT msIO_fprintf(FILE *stream, const char *format, ...) MS_PRINT_FUNC_FORMAT(2, 3); int MS_DLL_EXPORT msIO_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); int MS_DLL_EXPORT msIO_fread(void *ptr, size_t size, size_t nmemb, FILE *stream); int MS_DLL_EXPORT msIO_vfprintf(FILE *fp, const char *format, va_list ap) MS_PRINT_FUNC_FORMAT(2, 0); /* ** Definitions for the callback function and the details of the IO ** channel contexts. */ typedef int (*msIO_llReadWriteFunc)(void *cbData, void *data, int byteCount); typedef struct msIOContext_t { const char *label; int write_channel; /* 1 for stdout/stderr, 0 for stdin */ msIO_llReadWriteFunc readWriteFunc; void *cbData; } msIOContext; int MS_DLL_EXPORT msIO_installHandlers(msIOContext *stdin_context, msIOContext *stdout_context, msIOContext *stderr_context); msIOContext MS_DLL_EXPORT *msIO_getHandler(FILE *); void MS_DLL_EXPORT msIO_setHeaderEnabled(int bFlag); void msIO_setHeader(const char *header, const char *value, ...) MS_PRINT_FUNC_FORMAT(2, 3); void msIO_sendHeaders(void); /* ** These can be used instead of the stdio style functions if you have ** msIOContext's for the channel in question. */ int msIO_contextRead(msIOContext *context, void *data, int byteCount); int msIO_contextWrite(msIOContext *context, const void *data, int byteCount); /* ** For redirecting IO to a memory buffer. */ typedef struct { unsigned char *data; int data_len; /* really buffer length */ int data_offset; /* really buffer used */ } msIOBuffer; int MS_DLL_EXPORT msIO_bufferRead(void *, void *, int); int MS_DLL_EXPORT msIO_bufferWrite(void *, void *, int); void MS_DLL_EXPORT msIO_resetHandlers(void); void MS_DLL_EXPORT msIO_installStdoutToBuffer(void); void MS_DLL_EXPORT msIO_installStdinFromBuffer(void); void MS_DLL_EXPORT msIO_Cleanup(void); char MS_DLL_EXPORT *msIO_stripStdoutBufferContentType(void); void MS_DLL_EXPORT msIO_stripStdoutBufferContentHeaders(void); hashTableObj MS_DLL_EXPORT *msIO_getAndStripStdoutBufferMimeHeaders(void); msIOContext *msIO_pushStdoutToBufferAndGetOldContext(void); void msIO_restoreOldStdoutContext(msIOContext *context_to_restore); int MS_DLL_EXPORT msIO_isStdContext(void); /* this is just for setting normal stdout's to binary mode on windows */ int msIO_needBinaryStdout(void); int msIO_needBinaryStdin(void); #ifdef __cplusplus } #endif #endif /* nef MAPIO_H */ mapserver-8.4.0/src/mapjoin.c000066400000000000000000000632471474174441300161440ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implements MapServer joins. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #define ROW_ALLOCATION_SIZE 10 /* DBF/XBase function prototypes */ int msDBFJoinConnect(layerObj *layer, joinObj *join); int msDBFJoinPrepare(joinObj *join, shapeObj *shape); int msDBFJoinNext(joinObj *join); int msDBFJoinClose(joinObj *join); int msDBFJoinTable(layerObj *layer, joinObj *join, shapeObj *shape); /* CSV (comma delimited text file) function prototypes */ int msCSVJoinConnect(layerObj *layer, joinObj *join); int msCSVJoinPrepare(joinObj *join, shapeObj *shape); int msCSVJoinNext(joinObj *join); int msCSVJoinClose(joinObj *join); int msCSVJoinTable(layerObj *layer, joinObj *join, shapeObj *shape); /* MySQL function prototypes */ int msMySQLJoinConnect(layerObj *layer, joinObj *join); int msMySQLJoinPrepare(joinObj *join, shapeObj *shape); int msMySQLJoinNext(joinObj *join); int msMySQLJoinClose(joinObj *join); int msMySQLJoinTable(layerObj *layer, joinObj *join, shapeObj *shape); /* PostgreSQL function prototypes */ int msPOSTGRESQLJoinConnect(layerObj *layer, joinObj *join); int msPOSTGRESQLJoinPrepare(joinObj *join, shapeObj *shape); int msPOSTGRESQLJoinNext(joinObj *join); int msPOSTGRESQLJoinClose(joinObj *join); /* wrapper function for DB specific join functions */ int msJoinConnect(layerObj *layer, joinObj *join) { switch (join->connectiontype) { case (MS_DB_XBASE): return msDBFJoinConnect(layer, join); break; case (MS_DB_CSV): return msCSVJoinConnect(layer, join); break; case (MS_DB_MYSQL): return msMySQLJoinConnect(layer, join); break; case (MS_DB_POSTGRES): return msPOSTGRESQLJoinConnect(layer, join); break; default: break; } msSetError(MS_JOINERR, "Unsupported join connection type.", "msJoinConnect()"); return MS_FAILURE; } int msJoinPrepare(joinObj *join, shapeObj *shape) { switch (join->connectiontype) { case (MS_DB_XBASE): return msDBFJoinPrepare(join, shape); break; case (MS_DB_CSV): return msCSVJoinPrepare(join, shape); break; case (MS_DB_MYSQL): return msMySQLJoinPrepare(join, shape); break; case (MS_DB_POSTGRES): return msPOSTGRESQLJoinPrepare(join, shape); break; default: break; } msSetError(MS_JOINERR, "Unsupported join connection type.", "msJoinPrepare()"); return MS_FAILURE; } int msJoinNext(joinObj *join) { switch (join->connectiontype) { case (MS_DB_XBASE): return msDBFJoinNext(join); break; case (MS_DB_CSV): return msCSVJoinNext(join); break; case (MS_DB_MYSQL): return msMySQLJoinNext(join); break; case (MS_DB_POSTGRES): return msPOSTGRESQLJoinNext(join); break; default: break; } msSetError(MS_JOINERR, "Unsupported join connection type.", "msJoinNext()"); return MS_FAILURE; } int msJoinClose(joinObj *join) { switch (join->connectiontype) { case (MS_DB_XBASE): return msDBFJoinClose(join); break; case (MS_DB_CSV): return msCSVJoinClose(join); break; case (MS_DB_MYSQL): return msMySQLJoinClose(join); break; case (MS_DB_POSTGRES): return msPOSTGRESQLJoinClose(join); break; default: break; } msSetError(MS_JOINERR, "Unsupported join connection type.", "msJoinClose()"); return MS_FAILURE; } /* */ /* XBASE join functions */ /* */ typedef struct { DBFHandle hDBF; int fromindex, toindex; char *target; int nextrecord; } msDBFJoinInfo; int msDBFJoinConnect(layerObj *layer, joinObj *join) { int i; char szPath[MS_MAXPATHLEN]; msDBFJoinInfo *joininfo; if (join->joininfo) return (MS_SUCCESS); /* already open */ if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; /* allocate a msDBFJoinInfo struct */ joininfo = (msDBFJoinInfo *)malloc(sizeof(msDBFJoinInfo)); if (!joininfo) { msSetError(MS_MEMERR, "Error allocating XBase table info structure.", "msDBFJoinConnect()"); return (MS_FAILURE); } /* initialize any members that won't get set later on in this function */ joininfo->target = NULL; joininfo->nextrecord = 0; join->joininfo = joininfo; /* open the XBase file */ if ((joininfo->hDBF = msDBFOpen(msBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, join->table), "rb")) == NULL) { if ((joininfo->hDBF = msDBFOpen(msBuildPath(szPath, layer->map->mappath, join->table), "rb")) == NULL) { msSetError(MS_IOERR, "(%s)", "msDBFJoinConnect()", join->table); return (MS_FAILURE); } } /* get "to" item index */ if ((joininfo->toindex = msDBFGetItemIndex(joininfo->hDBF, join->to)) == -1) { msSetError(MS_DBFERR, "Item %s not found in table %s.", "msDBFJoinConnect()", join->to, join->table); return (MS_FAILURE); } /* get "from" item index */ for (i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], join->from) == 0) { /* found it */ joininfo->fromindex = i; break; } } if (i == layer->numitems) { msSetError(MS_JOINERR, "Item %s not found in layer %s.", "msDBFJoinConnect()", join->from, layer->name); return (MS_FAILURE); } /* finally store away the item names in the XBase table */ join->numitems = msDBFGetFieldCount(joininfo->hDBF); join->items = msDBFGetItems(joininfo->hDBF); if (!join->items) return (MS_FAILURE); return (MS_SUCCESS); } int msDBFJoinPrepare(joinObj *join, shapeObj *shape) { msDBFJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msDBFJoinPrepare()"); return (MS_FAILURE); } if (!shape) { msSetError(MS_JOINERR, "Shape to be joined is empty.", "msDBFJoinPrepare()"); return (MS_FAILURE); } if (!shape->values) { msSetError(MS_JOINERR, "Shape to be joined has no attributes.", "msDBFJoinPrepare()"); return (MS_FAILURE); } joininfo->nextrecord = 0; /* starting with the first record */ if (joininfo->target) free(joininfo->target); /* clear last target */ joininfo->target = msStrdup(shape->values[joininfo->fromindex]); return (MS_SUCCESS); } int msDBFJoinNext(joinObj *join) { int i, n; msDBFJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msDBFJoinNext()"); return (MS_FAILURE); } if (!joininfo->target) { msSetError(MS_JOINERR, "No target specified, run msDBFJoinPrepare() first.", "msDBFJoinNext()"); return (MS_FAILURE); } /* clear any old data */ if (join->values) { msFreeCharArray(join->values, join->numitems); join->values = NULL; } n = msDBFGetRecordCount(joininfo->hDBF); for (i = joininfo->nextrecord; i < n; i++) { /* find a match */ if (strcmp(joininfo->target, msDBFReadStringAttribute(joininfo->hDBF, i, joininfo->toindex)) == 0) break; } if (i == n) { /* unable to do the join */ if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msDBFJoinNext()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) join->values[i] = msStrdup("\0"); /* initialize to zero length strings */ joininfo->nextrecord = n; return (MS_DONE); } if ((join->values = msDBFGetValues(joininfo->hDBF, i)) == NULL) return (MS_FAILURE); joininfo->nextrecord = i + 1; /* so we know where to start looking next time through */ return (MS_SUCCESS); } int msDBFJoinClose(joinObj *join) { msDBFJoinInfo *joininfo = join->joininfo; if (!joininfo) return (MS_SUCCESS); /* already closed */ if (joininfo->hDBF) msDBFClose(joininfo->hDBF); if (joininfo->target) free(joininfo->target); free(joininfo); joininfo = NULL; return (MS_SUCCESS); } /* */ /* CSV (comma separated value) join functions */ /* */ typedef struct { int fromindex, toindex; char *target; char ***rows; int numrows; int nextrow; } msCSVJoinInfo; int msCSVJoinConnect(layerObj *layer, joinObj *join) { int i; FILE *stream; char szPath[MS_MAXPATHLEN]; msCSVJoinInfo *joininfo; char buffer[MS_BUFFER_LENGTH]; if (join->joininfo) return (MS_SUCCESS); /* already open */ if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; /* allocate a msCSVJoinInfo struct */ if ((joininfo = (msCSVJoinInfo *)malloc(sizeof(msCSVJoinInfo))) == NULL) { msSetError(MS_MEMERR, "Error allocating CSV table info structure.", "msCSVJoinConnect()"); return (MS_FAILURE); } /* initialize any members that won't get set later on in this function */ joininfo->target = NULL; joininfo->nextrow = 0; join->joininfo = joininfo; /* open the CSV file */ if ((stream = fopen(msBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, join->table), "r")) == NULL) { if ((stream = fopen(msBuildPath(szPath, layer->map->mappath, join->table), "r")) == NULL) { msSetError(MS_IOERR, "(%s)", "msCSVJoinConnect()", join->table); return (MS_FAILURE); } } /* once through to get the number of rows */ joininfo->numrows = 0; while (fgets(buffer, MS_BUFFER_LENGTH, stream) != NULL) joininfo->numrows++; rewind(stream); if ((joininfo->rows = (char ***)malloc(joininfo->numrows * sizeof(char **))) == NULL) { fclose(stream); msSetError(MS_MEMERR, "Error allocating rows.", "msCSVJoinConnect()"); return (MS_FAILURE); } /* load the rows */ i = 0; while (fgets(buffer, MS_BUFFER_LENGTH, stream) != NULL) { msStringTrimEOL(buffer); joininfo->rows[i] = msStringSplitComplex(buffer, ",", &(join->numitems), MS_ALLOWEMPTYTOKENS); i++; } fclose(stream); /* get "from" item index */ for (i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], join->from) == 0) { /* found it */ joininfo->fromindex = i; break; } } if (i == layer->numitems) { msSetError(MS_JOINERR, "Item %s not found in layer %s.", "msCSVJoinConnect()", join->from, layer->name); return (MS_FAILURE); } /* get "to" index (for now the user tells us which column, 1..n) */ joininfo->toindex = atoi(join->to) - 1; if (joininfo->toindex < 0 || joininfo->toindex > join->numitems) { msSetError(MS_JOINERR, "Invalid column index %s.", "msCSVJoinConnect()", join->to); return (MS_FAILURE); } /* store away the column names (1..n) */ if ((join->items = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, "Error allocating space for join item names.", "msCSVJoinConnect()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) { join->items[i] = (char *)malloc(12); /* plenty of space */ sprintf(join->items[i], "%d", i + 1); } return (MS_SUCCESS); } int msCSVJoinPrepare(joinObj *join, shapeObj *shape) { msCSVJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msCSVJoinPrepare()"); return (MS_FAILURE); } if (!shape) { msSetError(MS_JOINERR, "Shape to be joined is empty.", "msCSVJoinPrepare()"); return (MS_FAILURE); } if (!shape->values) { msSetError(MS_JOINERR, "Shape to be joined has no attributes.", "msCSVJoinPrepare()"); return (MS_FAILURE); } joininfo->nextrow = 0; /* starting with the first record */ if (joininfo->target) free(joininfo->target); /* clear last target */ joininfo->target = msStrdup(shape->values[joininfo->fromindex]); return (MS_SUCCESS); } int msCSVJoinNext(joinObj *join) { int i, j; msCSVJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msCSVJoinNext()"); return (MS_FAILURE); } /* clear any old data */ if (join->values) { msFreeCharArray(join->values, join->numitems); join->values = NULL; } for (i = joininfo->nextrow; i < joininfo->numrows; i++) { /* find a match */ if (strcmp(joininfo->target, joininfo->rows[i][joininfo->toindex]) == 0) break; } if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msCSVJoinNext()"); return (MS_FAILURE); } if (i == joininfo->numrows) { /* unable to do the join */ for (j = 0; j < join->numitems; j++) join->values[j] = msStrdup("\0"); /* initialize to zero length strings */ joininfo->nextrow = joininfo->numrows; return (MS_DONE); } for (j = 0; j < join->numitems; j++) join->values[j] = msStrdup(joininfo->rows[i][j]); joininfo->nextrow = i + 1; /* so we know where to start looking next time through */ return (MS_SUCCESS); } int msCSVJoinClose(joinObj *join) { int i; msCSVJoinInfo *joininfo = join->joininfo; if (!joininfo) return (MS_SUCCESS); /* already closed */ for (i = 0; i < joininfo->numrows; i++) msFreeCharArray(joininfo->rows[i], join->numitems); free(joininfo->rows); if (joininfo->target) free(joininfo->target); free(joininfo); joininfo = NULL; return (MS_SUCCESS); } #ifdef USE_MYSQL #ifndef _mysql_h #include #endif char *DB_HOST = NULL; char *DB_USER = NULL; char *DB_PASSWD = NULL; char *DB_DATABASE = NULL; char *delim; #define MYDEBUG if (0) MYSQL_RES *msMySQLQuery(char *q, MYSQL *conn) { MYSQL_RES *qresult = NULL; if (mysql_query(conn, q) < 0) { mysql_close(conn); msSetError(MS_QUERYERR, "Bad mysql query (%s)", "msMySQLQuery()", q); return qresult; } if (!(qresult = mysql_store_result(conn))) { mysql_close(conn); msSetError(MS_QUERYERR, "mysql query failed (%s)", "msMySQLQuery()", q); return qresult; } return qresult; } /* */ /* mysql join functions */ /* */ typedef struct { MYSQL mysql, *conn; MYSQL_RES *qresult; MYSQL_ROW row; int rows; int fromindex; char *tocolumn; char *target; int nextrecord; } msMySQLJoinInfo; #endif int msMySQLJoinConnect(layerObj *layer, joinObj *join) { (void)layer; (void)join; #ifndef USE_MYSQL msSetError(MS_QUERYERR, "MySQL support not available (compile with --with-mysql)", "msMySQLJoinConnect()"); return (MS_FAILURE); #else int i; char qbuf[4000]; char *conn_decrypted; msMySQLJoinInfo *joininfo; MYDEBUG if (setvbuf(stdout, NULL, _IONBF, 0)) { printf("Whoops..."); }; if (join->joininfo) return (MS_SUCCESS); /* already open */ /* allocate a msMySQLJoinInfo struct */ joininfo = (msMySQLJoinInfo *)malloc(sizeof(msMySQLJoinInfo)); if (!joininfo) { msSetError(MS_MEMERR, "Error allocating mysql table info structure.", "msMySQLJoinConnect()"); return (MS_FAILURE); } /* initialize any members that won't get set later on in this function */ joininfo->qresult = NULL; joininfo->target = NULL; joininfo->nextrecord = 0; join->joininfo = joininfo; /* open the mysql connection */ if (join->connection == NULL) { msSetError( MS_QUERYERR, "Error parsing MYSQL JOIN: nothing specified in CONNECTION statement.", "msMySQLJoinConnect()"); return (MS_FAILURE); } conn_decrypted = msDecryptStringTokens(layer->map, join->connection); if (conn_decrypted == NULL) { msSetError( MS_QUERYERR, "Error parsing MYSQL JOIN: unable to decrypt CONNECTION statement.", "msMySQLJoinConnect()"); return (MS_FAILURE); } delim = msStrdup(":"); DB_HOST = msStrdup(strtok(conn_decrypted, delim)); DB_USER = msStrdup(strtok(NULL, delim)); DB_PASSWD = msStrdup(strtok(NULL, delim)); DB_DATABASE = msStrdup(strtok(NULL, delim)); free(conn_decrypted); if (DB_HOST == NULL || DB_USER == NULL || DB_PASSWD == NULL || DB_DATABASE == NULL) { msSetError(MS_QUERYERR, "DB param error: at least one of HOST, USER, PASSWD or DATABASE " "is null!", "msMySQLJoinConnect()"); return MS_FAILURE; } if (strcmp(DB_PASSWD, "none") == 0) strcpy(DB_PASSWD, ""); #if MYSQL_VERSION_ID >= 40000 mysql_init(&(joininfo->mysql)); if (!(joininfo->conn = mysql_real_connect( &(joininfo->mysql), DB_HOST, DB_USER, DB_PASSWD, NULL, 0, NULL, 0))) #else if (!(joininfo->conn = mysql_connect(&(joininfo->mysql), DB_HOST, DB_USER, DB_PASSWD))) #endif { char tmp[4000]; snprintf(tmp, sizeof(tmp), "Failed to connect to SQL server: Error: %s\nHost: " "%s\nUsername:%s\nPassword:%s\n", mysql_error(joininfo->conn), DB_HOST, DB_USER, DB_PASSWD); msSetError(MS_QUERYERR, "%s", "msMYSQLLayerOpen()", tmp); free(joininfo); return MS_FAILURE; } MYDEBUG printf("msMYSQLLayerOpen2 called
\n"); if (mysql_select_db(joininfo->conn, DB_DATABASE) < 0) { mysql_close(joininfo->conn); } MYDEBUG printf("msMYSQLLayerOpen3 called
\n"); if (joininfo->qresult != NULL) { /* query leftover */ MYDEBUG printf("msMYSQLLayerOpen4 called
\n"); mysql_free_result(joininfo->qresult); } MYDEBUG printf("msMYSQLLayerOpen5 called
\n"); snprintf(qbuf, sizeof(qbuf), "SELECT count(%s) FROM %s", join->to, join->table); MYDEBUG printf("%s
\n", qbuf); if ((joininfo->qresult = msMySQLQuery(qbuf, joininfo->conn))) { /* There were some rows found, write 'em out for debug */ int numrows = mysql_affected_rows(joininfo->conn); MYDEBUG printf("%d rows
\n", numrows); for (i = 0; i < numrows; i++) { MYSQL_ROW row = mysql_fetch_row(joininfo->qresult); MYDEBUG printf("(%s)
\n", row[0]); joininfo->rows = atoi(row[0]); } } else { msSetError(MS_DBFERR, "Item %s not found in table %s.", "msMySQLJoinConnect()", join->to, join->table); return (MS_FAILURE); } snprintf(qbuf, sizeof(qbuf), "EXPLAIN %s", join->table); if ((joininfo->qresult = msMySQLQuery(qbuf, joininfo->conn))) { /* There were some rows found, write 'em out for debug */ join->numitems = mysql_affected_rows(joininfo->conn); if ((join->items = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msMySQLJoinConnect()"); return (MS_FAILURE); } MYDEBUG printf("%d rows
\n", join->numitems); for (i = 0; i < join->numitems; i++) { MYSQL_ROW row = mysql_fetch_row(joininfo->qresult); MYDEBUG printf("(%s)
\n", row[0]); join->items[i] = msStrdup(row[0]); } } else { msSetError(MS_DBFERR, "Item %s not found in table %s.", "msMySQLJoinConnect()", join->to, join->table); return (MS_FAILURE); } joininfo->tocolumn = msStrdup(join->to); /* get "from" item index */ for (i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], join->from) == 0) { /* found it */ joininfo->fromindex = i; break; } } if (i == layer->numitems) { msSetError(MS_JOINERR, "Item %s not found in layer %s.", "msMySQLJoinConnect()", join->from, layer->name); return (MS_FAILURE); } /* finally store away the item names in the XBase table */ if (!join->items) return (MS_FAILURE); return (MS_SUCCESS); #endif } int msMySQLJoinPrepare(joinObj *join, shapeObj *shape) { (void)join; (void)shape; #ifndef USE_MYSQL msSetError(MS_QUERYERR, "MySQL support not available (compile with --with-mysql)", "msMySQLJoinPrepare()"); return (MS_FAILURE); #else msMySQLJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msMySQLJoinPrepare()"); return (MS_FAILURE); } if (!shape) { msSetError(MS_JOINERR, "Shape to be joined is empty.", "msMySQLJoinPrepare()"); return (MS_FAILURE); } if (!shape->values) { msSetError(MS_JOINERR, "Shape to be joined has no attributes.", "msMySQLJoinPrepare()"); return (MS_FAILURE); } joininfo->nextrecord = 0; /* starting with the first record */ if (joininfo->target) free(joininfo->target); /* clear last target */ joininfo->target = msStrdup(shape->values[joininfo->fromindex]); return (MS_SUCCESS); #endif } int msMySQLJoinNext(joinObj *join) { (void)join; #ifndef USE_MYSQL msSetError(MS_QUERYERR, "MySQL support not available (compile with --with-mysql)", "msMySQLJoinNext()"); return (MS_FAILURE); #else int i; char qbuf[4000]; msMySQLJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msMySQLJoinNext()"); return (MS_FAILURE); } if (!joininfo->target) { msSetError(MS_JOINERR, "No target specified, run msMySQLJoinPrepare() first.", "msMySQLJoinNext()"); return (MS_FAILURE); } /* clear any old data */ if (join->values) { msFreeCharArray(join->values, join->numitems); join->values = NULL; } /* int n = joininfo->rows; */ /* for(i=joininfo->nextrecord; itarget, msMySQLReadStringAttribute(joininfo->conn, i, * joininfo->toindex)) == 0) break; */ /* } */ snprintf(qbuf, sizeof(qbuf), "SELECT * FROM %s WHERE %s = %s", join->table, joininfo->tocolumn, joininfo->target); MYDEBUG printf("%s
\n", qbuf); if ((joininfo->qresult = msMySQLQuery(qbuf, joininfo->conn))) { /* There were some rows found, write 'em out for debug */ int numrows = mysql_affected_rows(joininfo->conn); int numfields = mysql_field_count(joininfo->conn); MYDEBUG printf("%d rows
\n", numrows); if (numrows > 0) { MYSQL_ROW row = mysql_fetch_row(joininfo->qresult); for (i = 0; i < numfields; i++) { MYDEBUG printf("%s,", row[i]); } MYDEBUG printf("
\n"); free(join->values); if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msMySQLJoinNext()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) { /* join->values[i] = msStrdup("\0"); */ /* initialize to zero length strings */ join->values[i] = msStrdup(row[i]); /* initialize to zero length strings */ /* rows = atoi(row[0]); */ } } else { if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msMySQLJoinNext()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) join->values[i] = msStrdup("\0"); /* initialize to zero length strings */ return (MS_DONE); } } else { msSetError(MS_QUERYERR, "Query error (%s)", "msMySQLJoinNext()", qbuf); return (MS_FAILURE); } #ifdef __NOTDEF__ if (i == n) { /* unable to do the join */ if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msMySQLJoinNext()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) join->values[i] = msStrdup("\0"); /* initialize to zero length strings */ joininfo->nextrecord = n; return (MS_DONE); } if ((join->values = msMySQLGetValues(joininfo->conn, i)) == NULL) return (MS_FAILURE); joininfo->nextrecord = i + 1; /* so we know where to start looking next time through */ #endif /* __NOTDEF__ */ return (MS_SUCCESS); #endif } int msMySQLJoinClose(joinObj *join) { (void)join; #ifndef USE_MYSQL msSetError(MS_QUERYERR, "MySQL support not available (compile with --with-mysql)", "msMySQLJoinClose()"); return (MS_FAILURE); #else msMySQLJoinInfo *joininfo = join->joininfo; if (!joininfo) return (MS_SUCCESS); /* already closed */ mysql_close(joininfo->conn); if (joininfo->target) free(joininfo->target); free(joininfo); joininfo = NULL; return (MS_SUCCESS); #endif } mapserver-8.4.0/src/mapkml.cpp000066400000000000000000000177371474174441300163330ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Headers for mapkml.cpp Google Earth KML output * Author: David Kana and the MapServer team * ****************************************************************************** * Copyright (c) 1996-2009 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #ifdef USE_KML #include "mapkmlrenderer.h" #ifdef __cplusplus extern "C" { #endif KmlRenderer *getKmlRenderer(imageObj *img) { return (KmlRenderer *)img->img.plugin; } imageObj *msCreateImageKml(int width, int height, outputFormatObj *format, colorObj *bg) { imageObj *image = NULL; image = (imageObj *)malloc(sizeof(imageObj)); MS_CHECK_ALLOC(image, sizeof(imageObj), NULL); memset(image, 0, sizeof(imageObj)); KmlRenderer *ren = new KmlRenderer(width, height, format, bg); image->img.plugin = (void *)ren; return image; } int msSaveImageKml(imageObj *img, mapObj * /*map*/, FILE *fp, outputFormatObj *format) { KmlRenderer *renderer = getKmlRenderer(img); return renderer->saveImage(img, fp, format); } int msRenderLineKml(imageObj *img, shapeObj *p, strokeStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderLine(img, p, style); return MS_SUCCESS; } int msRenderPolygonKml(imageObj *img, shapeObj *p, colorObj *color) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderPolygon(img, p, color); return MS_SUCCESS; } int msRenderPolygonTiledKml(imageObj * /*img*/, shapeObj * /*p*/, imageObj * /*tile*/) { /*KmlRenderer* renderer = getKmlRenderer(img);*/ return MS_SUCCESS; } int msRenderLineTiledKml(imageObj * /*img*/, shapeObj * /*p*/, imageObj * /*tile*/) { return MS_SUCCESS; } int msRenderGlyphsKml(imageObj *img, const textSymbolObj *ts, colorObj *c, colorObj *oc, int ow, int /*isMarker*/) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderGlyphs(img, ts, c, oc, ow); return MS_SUCCESS; } int msRenderVectorSymbolKml(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderVectorSymbol(img, x, y, symbol, style); return MS_SUCCESS; } int msRenderPixmapSymbolKml(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderPixmapSymbol(img, x, y, symbol, style); return MS_SUCCESS; } int msRenderEllipseSymbolKml(imageObj *image, double x, double y, symbolObj *symbol, symbolStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(image); renderer->renderEllipseSymbol(image, x, y, symbol, style); return MS_SUCCESS; } int msRenderTruetypeSymbolKml(imageObj *image, double x, double y, symbolObj *symbol, symbolStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(image); renderer->renderTruetypeSymbol(image, x, y, symbol, style); return MS_SUCCESS; } int msRenderTileKml(imageObj * /*img*/, imageObj * /*tile*/, double /*x*/, double /*y*/) { return MS_SUCCESS; } int msGetRasterBufferKml(imageObj * /*img*/, rasterBufferObj * /*rb*/) { return MS_FAILURE; // not supported for kml } int msGetTruetypeTextBBoxKml(rendererVTableObj * /*r*/, char ** /*fonts*/, int /*numfonts*/, double size, char *string, rectObj *rect, double **advances, int /*bAdjustBaseline*/) { rect->minx = 0.0; rect->maxx = 0.0; rect->miny = 0.0; rect->maxy = 0.0; if (advances) { int numglyphs = msGetNumGlyphs(string); *advances = (double *)msSmallMalloc(numglyphs * sizeof(double)); for (int i = 0; i < numglyphs; i++) { (*advances)[i] = size; } } return MS_SUCCESS; } int msStartNewLayerKml(imageObj *img, mapObj * /*map*/, layerObj *layer) { KmlRenderer *renderer = getKmlRenderer(img); return renderer->startNewLayer(img, layer); } int msCloseNewLayerKml(imageObj *img, mapObj * /*map*/, layerObj *layer) { KmlRenderer *renderer = getKmlRenderer(img); return renderer->closeNewLayer(img, layer); } int msFreeImageKml(imageObj *image) { KmlRenderer *renderer = getKmlRenderer(image); if (renderer) { delete renderer; } image->img.plugin = NULL; return MS_SUCCESS; } int msFreeSymbolKml(symbolObj * /*symbol*/) { return MS_SUCCESS; } int msStartShapeKml(imageObj *img, shapeObj *shape) { KmlRenderer *renderer = getKmlRenderer(img); renderer->startShape(img, shape); return MS_SUCCESS; } int msEndShapeKml(imageObj *img, shapeObj *shape) { KmlRenderer *renderer = getKmlRenderer(img); renderer->endShape(img, shape); return MS_SUCCESS; } int msMergeRasterBufferKml(imageObj *dest, rasterBufferObj *overlay, double /*opacity*/, int /*srcX*/, int /*srcY*/, int /*dstX*/, int /*dstY*/, int /*width*/, int /*height*/) { KmlRenderer *renderer = getKmlRenderer(dest); return renderer->mergeRasterBuffer(dest, overlay); } #ifdef __cplusplus } #endif #endif /*USE_KML*/ int aggInitializeRasterBuffer(rasterBufferObj *rb, int width, int height, int mode); int msPopulateRendererVTableKML(rendererVTableObj *renderer) { #ifdef USE_KML renderer->supports_pixel_buffer = 0; renderer->supports_clipping = 0; renderer->use_imagecache = 0; renderer->default_transform_mode = MS_TRANSFORM_NONE; renderer->startLayer = msStartNewLayerKml; renderer->endLayer = msCloseNewLayerKml; renderer->renderLine = &msRenderLineKml; renderer->createImage = &msCreateImageKml; renderer->saveImage = &msSaveImageKml; renderer->renderPolygon = &msRenderPolygonKml; renderer->renderGlyphs = &msRenderGlyphsKml; renderer->renderEllipseSymbol = &msRenderEllipseSymbolKml; renderer->renderVectorSymbol = &msRenderVectorSymbolKml; renderer->renderPixmapSymbol = &msRenderPixmapSymbolKml; renderer->mergeRasterBuffer = &msMergeRasterBufferKml; renderer->loadImageFromFile = msLoadMSRasterBufferFromFile; renderer->initializeRasterBuffer = aggInitializeRasterBuffer; renderer->renderTile = &msRenderTileKml; renderer->renderPolygonTiled = &msRenderPolygonTiledKml; renderer->renderLineTiled = NULL; renderer->freeSymbol = &msFreeSymbolKml; renderer->freeImage = &msFreeImageKml; renderer->mergeRasterBuffer = msMergeRasterBufferKml; renderer->compositeRasterBuffer = NULL; renderer->startShape = &msStartShapeKml; renderer->endShape = &msEndShapeKml; return MS_SUCCESS; #else (void)renderer; msSetError(MS_MISCERR, "KML Driver requested but is not built in", "msPopulateRendererVTableKML()"); return MS_FAILURE; #endif } mapserver-8.4.0/src/mapkmlrenderer.cpp000066400000000000000000001256331474174441300200550ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Google Earth KML output * Author: David Kana and the MapServer team * ****************************************************************************** * Copyright (c) 1996-2009 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver-config.h" #ifdef USE_KML #include "mapserver.h" #include "maperror.h" #include "mapkmlrenderer.h" #include "mapio.h" #include "mapows.h" #include "cpl_conv.h" #include "cpl_vsi.h" #define KML_MAXFEATURES_TODRAW 1000 KmlRenderer::KmlRenderer(int width, int height, outputFormatObj * /*format*/, colorObj * /*color*/) : Width(width), Height(height), MapCellsize(1.0), XmlDoc(NULL), LayerNode(NULL), GroundOverlayNode(NULL), PlacemarkNode(NULL), GeomNode(NULL), Items(NULL), NumItems(0), FirstLayer(MS_TRUE), map(NULL), currentLayer(NULL), mElevationFromAttribute(false), mElevationAttributeIndex(-1), mCurrentElevationValue(0.0) { /*private variables*/ pszLayerDescMetadata = NULL; papszLayerIncludeItems = NULL; nIncludeItems = 0; papszLayerExcludeItems = NULL; nExcludeItems = 0; pszLayerNameAttributeMetadata = NULL; /*metadata to use for a name for each feature*/ LineStyle = NULL; numLineStyle = 0; xmlNodePtr styleNode; xmlNodePtr listStyleNode; /* Create document.*/ XmlDoc = xmlNewDoc(BAD_CAST "1.0"); xmlNodePtr rootNode = xmlNewNode(NULL, BAD_CAST "kml"); /* Name spaces*/ xmlSetNs(rootNode, xmlNewNs(rootNode, BAD_CAST "http://www.opengis.net/kml/2.2", NULL)); xmlDocSetRootElement(XmlDoc, rootNode); DocNode = xmlNewChild(rootNode, NULL, BAD_CAST "Document", NULL); styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST "LayerFolder_check"); listStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "ListStyle", NULL); xmlNewChild(listStyleNode, NULL, BAD_CAST "listItemType", BAD_CAST "check"); styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST "LayerFolder_checkHideChildren"); listStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "ListStyle", NULL); xmlNewChild(listStyleNode, NULL, BAD_CAST "listItemType", BAD_CAST "checkHideChildren"); styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST "LayerFolder_checkOffOnly"); listStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "ListStyle", NULL); xmlNewChild(listStyleNode, NULL, BAD_CAST "listItemType", BAD_CAST "checkOffOnly"); styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST "LayerFolder_radioFolder"); listStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "ListStyle", NULL); xmlNewChild(listStyleNode, NULL, BAD_CAST "listItemType", BAD_CAST "radioFolder"); StyleHashTable = msCreateHashTable(); } KmlRenderer::~KmlRenderer() { if (XmlDoc) xmlFreeDoc(XmlDoc); if (StyleHashTable) msFreeHashTable(StyleHashTable); if (LineStyle) msFree(LineStyle); xmlCleanupParser(); } imageObj *KmlRenderer::createImage(int, int, outputFormatObj *, colorObj *) { return NULL; } int KmlRenderer::saveImage(imageObj *, FILE *fp, outputFormatObj *format) { /* -------------------------------------------------------------------- */ /* Write out the document. */ /* -------------------------------------------------------------------- */ int bufSize = 0; xmlChar *buf = NULL; msIOContext *context = NULL; int chunkSize = 4096; int bZip = MS_FALSE; if (msIO_needBinaryStdout() == MS_FAILURE) return MS_FAILURE; xmlDocDumpFormatMemoryEnc(XmlDoc, &buf, &bufSize, "UTF-8", 1); if (format && format->driver && strcasecmp(format->driver, "kmz") == 0) { bZip = MS_TRUE; } if (bZip) { VSILFILE *fpZip; int bytes_read; char buffer[1024]; char *zip_filename = NULL; void *hZip = NULL; zip_filename = msTmpFile(NULL, NULL, "/vsimem/kmlzip/", "kmz"); hZip = CPLCreateZip(zip_filename, NULL); CPLCreateFileInZip(hZip, "mapserver.kml", NULL); for (int i = 0; i < bufSize; i += chunkSize) { int size = chunkSize; if (i + size > bufSize) size = bufSize - i; CPLWriteFileInZip(hZip, buf + i, size); } CPLCloseFileInZip(hZip); CPLCloseZip(hZip); context = msIO_getHandler(fp); fpZip = VSIFOpenL(zip_filename, "r"); while ((bytes_read = VSIFReadL(buffer, 1, sizeof(buffer), fpZip)) > 0) { if (context) msIO_contextWrite(context, buffer, bytes_read); else msIO_fwrite(buffer, 1, bytes_read, fp); } VSIFCloseL(fpZip); msFree(zip_filename); xmlFree(buf); return (MS_SUCCESS); } context = msIO_getHandler(fp); for (int i = 0; i < bufSize; i += chunkSize) { int size = chunkSize; if (i + size > bufSize) size = bufSize - i; if (context) msIO_contextWrite(context, buf + i, size); else msIO_fwrite(buf + i, 1, size, fp); } xmlFree(buf); return (MS_SUCCESS); } /************************************************************************/ /* processLayer */ /* */ /* Set parameters that make sense to a kml output. */ /************************************************************************/ void KmlRenderer::processLayer(layerObj *layer, outputFormatObj *format) { int i; const char *asRaster = NULL; int nMaxFeatures = -1; const char *pszTmp; char szTmp[10]; if (!layer) return; /*turn of labelcache*/ layer->labelcache = MS_OFF; /*if there are labels we want the coordinates to be the center of the element.*/ for (i = 0; i < layer->numclasses; i++) if (layer->_class[i]->numlabels > 0) layer->_class[i]->labels[0]->position = MS_XY; /*we do not want to draw multiple styles. the new rendering architecture does not allow to know if we are dealing with a multi-style. So here we remove all styles beside the first one*/ for (i = 0; i < layer->numclasses; i++) { while (layer->_class[i]->numstyles > 1) msDeleteStyle(layer->_class[i], layer->_class[i]->numstyles - 1); } /*if layer has a metadata KML_OUTPUTASRASTER set to true, add a processing directive to use an agg driver*/ asRaster = msLookupHashTable(&layer->metadata, "kml_outputasraster"); if (!asRaster) asRaster = msLookupHashTable(&(layer->map->web.metadata), "kml_outputasraster"); if (asRaster && (strcasecmp(asRaster, "true") == 0 || strcasecmp(asRaster, "yes") == 0)) msLayerAddProcessing(layer, "RENDERER=png24"); /*set a maxfeaturestodraw, if not already set*/ pszTmp = msLookupHashTable(&layer->metadata, "maxfeaturestodraw"); if (pszTmp) nMaxFeatures = atoi(pszTmp); else { pszTmp = msLookupHashTable(&layer->map->web.metadata, "maxfeaturestodraw"); if (pszTmp) nMaxFeatures = atoi(pszTmp); } if (nMaxFeatures < 0 && format) nMaxFeatures = atoi(msGetOutputFormatOption(format, "maxfeaturestodraw", "-1")); if (nMaxFeatures < 0 && format) { snprintf(szTmp, sizeof(szTmp), "%d", KML_MAXFEATURES_TODRAW); msSetOutputFormatOption(format, "maxfeaturestodraw", szTmp); } } /************************************************************************/ /* getLayerName */ /* */ /* Internal utility function to build name used for the layer. */ /************************************************************************/ char *KmlRenderer::getLayerName(layerObj *layer) { char stmp[20]; const char *name = NULL; ; if (!layer) return NULL; name = msLookupHashTable(&layer->metadata, "ows_name"); if (name && strlen(name) > 0) return msStrdup(name); if (layer->name && strlen(layer->name) > 0) return msStrdup(layer->name); sprintf(stmp, "Layer%d", layer->index); return msStrdup(stmp); } const char *KmlRenderer::getAliasName(layerObj *lp, char *pszItemName, const char *namespaces) { const char *pszAlias = NULL; if (lp && pszItemName && strlen(pszItemName) > 0) { char szTmp[256]; snprintf(szTmp, sizeof(szTmp), "%s_alias", pszItemName); pszAlias = msOWSLookupMetadata(&(lp->metadata), namespaces, szTmp); } return pszAlias; } int KmlRenderer::startNewLayer(imageObj *img, layerObj *layer) { char *layerName = NULL; const char *value = NULL; LayerNode = xmlNewNode(NULL, BAD_CAST "Folder"); layerName = getLayerName(layer); xmlNewChild(LayerNode, NULL, BAD_CAST "name", BAD_CAST layerName); msFree(layerName); const char *layerVisibility = layer->status != MS_OFF ? "1" : "0"; xmlNewChild(LayerNode, NULL, BAD_CAST "visibility", BAD_CAST layerVisibility); const char *layerDsiplayFolder = msLookupHashTable(&(layer->metadata), "kml_folder_display"); if (layerDsiplayFolder == NULL) layerDsiplayFolder = msLookupHashTable(&(layer->map->web.metadata), "kml_folder_display"); if (!layerDsiplayFolder || strlen(layerDsiplayFolder) <= 0) { xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_check"); } else { if (strcasecmp(layerDsiplayFolder, "checkHideChildren") == 0) xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_checkHideChildren"); else if (strcasecmp(layerDsiplayFolder, "checkOffOnly") == 0) xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_checkOffOnly"); else if (strcasecmp(layerDsiplayFolder, "radioFolder") == 0) xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_radioFolder"); else xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_check"); } /*Init few things on the first layer*/ if (FirstLayer) { FirstLayer = MS_FALSE; map = layer->map; if (layer->map->mappath) snprintf(MapPath, sizeof(MapPath), "%s", layer->map->mappath); /*First rendered layer - check mapfile projection*/ checkProjection(layer->map); /*check for image path and image url*/ if (layer->map->debug && (layer->map->web.imageurl == NULL || layer->map->web.imagepath == NULL)) msDebug("KmlRenderer::startNewLayer: imagepath and imageurl should be " "set in the web object\n"); /*map rect for ground overlay*/ MapExtent = layer->map->extent; MapCellsize = layer->map->cellsize; BgColor = layer->map->imagecolor; xmlNewChild(DocNode, NULL, BAD_CAST "name", BAD_CAST layer->map->name); aggFormat = msSelectOutputFormat(layer->map, "png24"); aggFormat->transparent = MS_TRUE; } currentLayer = layer; if (!msLayerIsOpen(layer)) { if (msLayerOpen(layer) != MS_SUCCESS) { msSetError(MS_MISCERR, "msLayerOpen failed", "KmlRenderer::startNewLayer"); return MS_FAILURE; } } /*pre process the layer to set things that make sense for kml output*/ if (img) processLayer(layer, img->format); else processLayer(layer, NULL); if (msLookupHashTable(&layer->metadata, "kml_description")) pszLayerDescMetadata = msLookupHashTable(&layer->metadata, "kml_description"); else if (msLookupHashTable(&layer->metadata, "ows_description")) pszLayerDescMetadata = msLookupHashTable(&layer->metadata, "ows_description"); value = msLookupHashTable(&layer->metadata, "kml_include_items"); if (!value) value = msLookupHashTable(&layer->metadata, "ows_include_items"); if (value) papszLayerIncludeItems = msStringSplit(value, ',', &nIncludeItems); value = msLookupHashTable(&layer->metadata, "kml_exclude_items"); if (!value) value = msLookupHashTable(&layer->metadata, "ows_exclude_items"); if (value) papszLayerExcludeItems = msStringSplit(value, ',', &nExcludeItems); if (msLookupHashTable(&layer->metadata, "kml_name_item")) pszLayerNameAttributeMetadata = msLookupHashTable(&layer->metadata, "kml_name_item"); /*get all attributes*/ if (msLayerWhichItems(layer, MS_TRUE, NULL) != MS_SUCCESS) { return MS_FAILURE; } NumItems = layer->numitems; if (NumItems) { Items = (char **)msSmallCalloc(NumItems, sizeof(char *)); for (int i = 0; i < NumItems; i++) Items[i] = msStrdup(layer->items[i]); } const char *elevationAttribute = msLookupHashTable(&layer->metadata, "kml_elevation_attribute"); if (elevationAttribute) { mElevationFromAttribute = true; for (int i = 0; i < layer->numitems; ++i) { if (strcasecmp(layer->items[i], elevationAttribute) == 0) { mElevationAttributeIndex = i; } } } setupRenderingParams(&layer->metadata); return MS_SUCCESS; } int KmlRenderer::closeNewLayer(imageObj *, layerObj *) { flushPlacemark(); xmlAddChild(DocNode, LayerNode); if (Items) { msFreeCharArray(Items, NumItems); Items = NULL; NumItems = 0; } if (pszLayerDescMetadata) pszLayerDescMetadata = NULL; if (pszLayerNameAttributeMetadata) pszLayerNameAttributeMetadata = NULL; if (papszLayerIncludeItems && nIncludeItems > 0) msFreeCharArray(papszLayerIncludeItems, nIncludeItems); papszLayerIncludeItems = NULL; if (papszLayerExcludeItems && nExcludeItems > 0) msFreeCharArray(papszLayerExcludeItems, nExcludeItems); papszLayerExcludeItems = NULL; return MS_SUCCESS; } int KmlRenderer::mergeRasterBuffer(imageObj *image, rasterBufferObj *rb) { assert(rb && rb->type == MS_BUFFER_BYTE_RGBA); char *tmpFileName = NULL; char *tmpUrl = NULL; FILE *tmpFile = NULL; tmpFileName = msTmpFile(NULL, MapPath, image->imagepath, "png"); tmpFile = fopen(tmpFileName, "wb"); if (tmpFile) { if (!aggFormat->vtable) msInitializeRendererVTable(aggFormat); msSaveRasterBuffer(map, rb, tmpFile, aggFormat); tmpUrl = msStrdup(image->imageurl); tmpUrl = msStringConcatenate(tmpUrl, (char *)(msGetBasename(tmpFileName))); tmpUrl = msStringConcatenate(tmpUrl, ".png"); createGroundOverlayNode(LayerNode, tmpUrl, currentLayer); msFree(tmpFileName); msFree(tmpUrl); fclose(tmpFile); return MS_SUCCESS; } else { msSetError(MS_IOERR, "Failed to create file for kml overlay", "KmlRenderer::mergeRasterBuffer()"); return MS_FAILURE; } } void KmlRenderer::setupRenderingParams(hashTableObj *layerMetadata) { AltitudeMode = 0; Extrude = 0; Tessellate = 0; const char *altitudeModeVal = msLookupHashTable(layerMetadata, "kml_altitudeMode"); if (altitudeModeVal) { if (strcasecmp(altitudeModeVal, "absolute") == 0) AltitudeMode = absolute; else if (strcasecmp(altitudeModeVal, "relativeToGround") == 0) AltitudeMode = relativeToGround; else if (strcasecmp(altitudeModeVal, "clampToGround") == 0) AltitudeMode = clampToGround; } const char *extrudeVal = msLookupHashTable(layerMetadata, "kml_extrude"); if (altitudeModeVal) { Extrude = atoi(extrudeVal); } const char *tessellateVal = msLookupHashTable(layerMetadata, "kml_tessellate"); if (tessellateVal) { Tessellate = atoi(tessellateVal); } } int KmlRenderer::checkProjection(mapObj *map) { projectionObj *projection = &map->projection; if (projection && projection->numargs > 0 && msProjIsGeographicCRS(projection)) { return MS_SUCCESS; } else { char epsg_string[100]; rectObj sRect; projectionObj out; /* for layer the do not have any projection set, set them with the current map projection*/ if (projection && projection->numargs > 0) { layerObj *lp = NULL; int i = 0; char *pszMapProjectString = msGetProjectionString(projection); if (pszMapProjectString) { for (i = 0; i < map->numlayers; i++) { lp = GET_LAYER(map, i); if (lp->projection.numargs == 0 && lp->transform == MS_TRUE) { msFreeProjection(&lp->projection); msLoadProjectionString(&lp->projection, pszMapProjectString); } } msFree(pszMapProjectString); } } strcpy(epsg_string, "epsg:4326"); msInitProjection(&out); msProjectionInheritContextFrom(&out, projection); msLoadProjectionString(&out, epsg_string); sRect = map->extent; msProjectRect(projection, &out, &sRect); msFreeProjectionExceptContext(projection); msLoadProjectionString(projection, epsg_string); /*change also units and extents*/ map->extent = sRect; map->units = MS_DD; if (map->debug) msDebug("KmlRenderer::checkProjection: Mapfile projection set to " "epsg:4326\n"); return MS_SUCCESS; } } xmlNodePtr KmlRenderer::createPlacemarkNode(xmlNodePtr parentNode, char *styleUrl) { xmlNodePtr placemarkNode = xmlNewChild(parentNode, NULL, BAD_CAST "Placemark", NULL); /*always add a name. It will be replaced by a text value if available*/ char tmpid[100]; char *stmp = NULL, *layerName = NULL; if (CurrentShapeName && strlen(CurrentShapeName) > 0) { xmlNewChild(placemarkNode, NULL, BAD_CAST "name", BAD_CAST CurrentShapeName); } else { sprintf(tmpid, ".%d", CurrentShapeIndex); layerName = getLayerName(currentLayer); stmp = msStringConcatenate(stmp, layerName); stmp = msStringConcatenate(stmp, tmpid); xmlNewChild(placemarkNode, NULL, BAD_CAST "name", BAD_CAST stmp); } msFree(layerName); msFree(stmp); if (styleUrl) xmlNewChild(placemarkNode, NULL, BAD_CAST "styleUrl", BAD_CAST styleUrl); return placemarkNode; } void KmlRenderer::renderLine(imageObj *, shapeObj *p, strokeStyleObj *style) { if (p->numlines == 0) return; if (PlacemarkNode == NULL) PlacemarkNode = createPlacemarkNode(LayerNode, NULL); if (!PlacemarkNode) return; addLineStyleToList(style); SymbologyFlag[Line] = 1; /*p->index > CurrentDrawnShapeIndexneed to be reviewd. Added since the height level code caches shapes when rendering lines*/ if (CurrentDrawnShapeIndex == -1 || p->index > CurrentDrawnShapeIndex) { xmlNodePtr geomNode = getGeomParentNode("LineString"); addAddRenderingSpecifications(geomNode); addCoordsNode(geomNode, p->line[0].point, p->line[0].numpoints); /* more than one line => MultiGeometry*/ if (p->numlines > 1) { geomNode = getGeomParentNode("LineString"); // returns MultiGeom Node for (int i = 1; i < p->numlines; i++) { xmlNodePtr lineStringNode = xmlNewChild(geomNode, NULL, BAD_CAST "LineString", NULL); addAddRenderingSpecifications(lineStringNode); addCoordsNode(lineStringNode, p->line[i].point, p->line[i].numpoints); } } CurrentDrawnShapeIndex = p->index; } } void KmlRenderer::renderPolygon(imageObj *, shapeObj *p, colorObj *color) { if (PlacemarkNode == NULL) PlacemarkNode = createPlacemarkNode(LayerNode, NULL); if (!PlacemarkNode) return; memcpy(&PolygonColor, color, sizeof(colorObj)); SymbologyFlag[Polygon] = 1; if (p->index != CurrentDrawnShapeIndex) { xmlNodePtr geomParentNode = getGeomParentNode("Polygon"); for (int i = 0; i < p->numlines; i++) { xmlNodePtr bdryNode = NULL; if (i == 0) /* __TODO__ check ring order*/ bdryNode = xmlNewChild(geomParentNode, NULL, BAD_CAST "outerBoundaryIs", NULL); else bdryNode = xmlNewChild(geomParentNode, NULL, BAD_CAST "innerBoundaryIs", NULL); xmlNodePtr ringNode = xmlNewChild(bdryNode, NULL, BAD_CAST "LinearRing", NULL); addAddRenderingSpecifications(ringNode); addCoordsNode(ringNode, p->line[i].point, p->line[i].numpoints); } CurrentDrawnShapeIndex = p->index; } } void KmlRenderer::addCoordsNode(xmlNodePtr parentNode, pointObj *pts, int numPts) { char lineBuf[128]; xmlNodePtr coordsNode = xmlNewChild(parentNode, NULL, BAD_CAST "coordinates", NULL); xmlNodeAddContent(coordsNode, BAD_CAST "\n"); for (int i = 0; i < numPts; i++) { if (mElevationFromAttribute) { sprintf(lineBuf, "\t%.8f,%.8f,%.8f\n", pts[i].x, pts[i].y, mCurrentElevationValue); } else if (AltitudeMode == relativeToGround || AltitudeMode == absolute) { sprintf(lineBuf, "\t%.8f,%.8f,%.8f\n", pts[i].x, pts[i].y, pts[i].z); } else sprintf(lineBuf, "\t%.8f,%.8f\n", pts[i].x, pts[i].y); xmlNodeAddContent(coordsNode, BAD_CAST lineBuf); } xmlNodeAddContent(coordsNode, BAD_CAST "\t"); } void KmlRenderer::renderGlyphs(imageObj *, const textSymbolObj *ts, colorObj *clr, colorObj * /*oc*/, int /*ow*/) { if (ts->annotext == NULL || ts->textpath->numglyphs == 0) return; if (PlacemarkNode == NULL) PlacemarkNode = createPlacemarkNode(LayerNode, NULL); if (!PlacemarkNode) return; memcpy(&LabelColor, clr, sizeof(colorObj)); SymbologyFlag[Label] = 1; /*there is alaws a default name (layer.shapeid). Replace it*/ for (xmlNodePtr node = PlacemarkNode->children; node; node = node->next) { if (node->type != XML_ELEMENT_NODE) continue; if (strcmp((char *)node->name, "name") == 0) { xmlNodeSetContent(node, BAD_CAST ts->annotext); break; } } /*xmlNewChild(PlacemarkNode, NULL, BAD_CAST "name", BAD_CAST text);*/ xmlNodePtr geomNode = getGeomParentNode("Point"); addAddRenderingSpecifications(geomNode); pointObj pt; pt.x = ts->textpath->glyphs[0].pnt.x; pt.y = ts->textpath->glyphs[0].pnt.y; pt.z = 0.0; addCoordsNode(geomNode, &pt, 1); } void KmlRenderer::addAddRenderingSpecifications(xmlNodePtr node) { /* 0 0 clampToGround */ if (Extrude) xmlNewChild(node, NULL, BAD_CAST "extrude", BAD_CAST "1"); if (Tessellate) xmlNewChild(node, NULL, BAD_CAST "tessellate", BAD_CAST "1"); if (AltitudeMode == absolute) xmlNewChild(node, NULL, BAD_CAST "altitudeMode", BAD_CAST "absolute"); else if (AltitudeMode == relativeToGround) xmlNewChild(node, NULL, BAD_CAST "altitudeMode", BAD_CAST "relativeToGround"); else if (AltitudeMode == clampToGround) xmlNewChild(node, NULL, BAD_CAST "altitudeMode", BAD_CAST "clampToGround"); } imageObj *agg2CreateImage(int width, int height, outputFormatObj *format, colorObj *bg); int KmlRenderer::createIconImage(char *fileName, symbolObj *symbol, symbolStyleObj *symstyle) { pointObj p; int status; imageObj *tmpImg = NULL; tmpImg = agg2CreateImage((int)(symbol->sizex * symstyle->scale), (int)(symbol->sizey * symstyle->scale), aggFormat, NULL); tmpImg->format = aggFormat; if (!aggFormat->vtable) msInitializeRendererVTable(aggFormat); p.x = symbol->sizex * symstyle->scale / 2; p.y = symbol->sizey * symstyle->scale / 2; p.z = 0.0; status = msDrawMarkerSymbol(map, tmpImg, &p, symstyle->style, 1); if (status != MS_SUCCESS) return status; return msSaveImage(map, tmpImg, fileName); } void KmlRenderer::renderSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { if (PlacemarkNode == NULL) PlacemarkNode = createPlacemarkNode(LayerNode, NULL); if (!PlacemarkNode) return; snprintf(SymbolUrl, sizeof(SymbolUrl), "%s", lookupSymbolUrl(img, symbol, style)); SymbologyFlag[Symbol] = 1; xmlNodePtr geomNode = getGeomParentNode("Point"); addAddRenderingSpecifications(geomNode); pointObj pt; pt.x = x; pt.y = y; pt.z = 0.0; addCoordsNode(geomNode, &pt, 1); } void KmlRenderer::renderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { renderSymbol(img, x, y, symbol, style); } void KmlRenderer::renderVectorSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { renderSymbol(img, x, y, symbol, style); } void KmlRenderer::renderEllipseSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { renderSymbol(img, x, y, symbol, style); } void KmlRenderer::renderTruetypeSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { renderSymbol(img, x, y, symbol, style); } xmlNodePtr KmlRenderer::createGroundOverlayNode(xmlNodePtr parentNode, char *imageHref, layerObj *layer) { /* GroundOverlay.kml 7fffffff 1 http://www.google.com/intl/en/images/logo.gif onInterval 86400 0.75 37.83234 37.832122 -122.373033 -122.373724 45 */ char layerHexColor[32]; xmlNodePtr groundOverlayNode = xmlNewChild(parentNode, NULL, BAD_CAST "GroundOverlay", NULL); char *layerName = getLayerName(layer); xmlNewChild(groundOverlayNode, NULL, BAD_CAST "name", BAD_CAST layerName); if (layer->compositer && layer->compositer->opacity > 0 && layer->compositer->opacity < 100) { sprintf(layerHexColor, "%02xffffff", (unsigned int)MS_NINT(layer->compositer->opacity * 2.55)); xmlNewChild(groundOverlayNode, NULL, BAD_CAST "color", BAD_CAST layerHexColor); } else xmlNewChild(groundOverlayNode, NULL, BAD_CAST "color", BAD_CAST "ffffffff"); char stmp[20]; sprintf(stmp, "%d", layer->index); xmlNewChild(groundOverlayNode, NULL, BAD_CAST "drawOrder", BAD_CAST stmp); if (imageHref) { xmlNodePtr iconNode = xmlNewChild(groundOverlayNode, NULL, BAD_CAST "Icon", NULL); xmlNewChild(iconNode, NULL, BAD_CAST "href", BAD_CAST imageHref); } char crdStr[64]; rectObj mapextent; if (map->gt.need_geotransform == MS_TRUE) mapextent = currentLayer->map->saved_extent; else mapextent = currentLayer->map->extent; xmlNodePtr latLonBoxNode = xmlNewChild(groundOverlayNode, NULL, BAD_CAST "LatLonBox", NULL); sprintf(crdStr, "%.8f", mapextent.maxy); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "north", BAD_CAST crdStr); sprintf(crdStr, "%.8f", mapextent.miny); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "south", BAD_CAST crdStr); sprintf(crdStr, "%.8f", mapextent.minx); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "west", BAD_CAST crdStr); sprintf(crdStr, "%.8f", mapextent.maxx); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "east", BAD_CAST crdStr); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "rotation", BAD_CAST "0.0"); return groundOverlayNode; } void KmlRenderer::startShape(imageObj *, shapeObj *shape) { if (PlacemarkNode) flushPlacemark(); CurrentShapeIndex = -1; CurrentDrawnShapeIndex = -1; CurrentShapeName = NULL; /*should be done at endshape but the plugin architecture does not call * endshape yet*/ if (LineStyle) { msFree(LineStyle); LineStyle = NULL; numLineStyle = 0; } CurrentShapeIndex = shape->index; if (pszLayerNameAttributeMetadata) { for (int i = 0; i < currentLayer->numitems; i++) { if (strcasecmp(currentLayer->items[i], pszLayerNameAttributeMetadata) == 0 && shape->values[i]) { CurrentShapeName = msStrdup(shape->values[i]); break; } } } PlacemarkNode = NULL; GeomNode = NULL; DescriptionNode = createDescriptionNode(shape); if (mElevationFromAttribute && shape->numvalues > mElevationAttributeIndex && mElevationAttributeIndex >= 0 && shape->values[mElevationAttributeIndex]) { mCurrentElevationValue = atof(shape->values[mElevationAttributeIndex]); } memset(SymbologyFlag, 0, NumSymbologyFlag); } void KmlRenderer::endShape(imageObj *, shapeObj *) { CurrentShapeIndex = -1; if (CurrentShapeName) msFree(CurrentShapeName); CurrentShapeName = NULL; } xmlNodePtr KmlRenderer::getGeomParentNode(const char *geomName) { /*we do not need a multi-geometry for point layers*/ if (currentLayer->type != MS_LAYER_POINT && currentLayer->type != MS_LAYER_ANNOTATION && GeomNode) { /*placemark geometry already defined, we need multigeometry node*/ xmlNodePtr multiGeomNode = xmlNewNode(NULL, BAD_CAST "MultiGeometry"); xmlAddChild(multiGeomNode, GeomNode); GeomNode = multiGeomNode; xmlNodePtr geomNode = xmlNewChild(multiGeomNode, NULL, BAD_CAST geomName, NULL); return geomNode; } else { GeomNode = xmlNewNode(NULL, BAD_CAST geomName); return GeomNode; } } const char *KmlRenderer::lookupSymbolUrl(imageObj *img, symbolObj *symbol, symbolStyleObj *symstyle) { char symbolHexColor[32]; /* */ sprintf(symbolHexColor, "%02x%02x%02x%02x", symstyle->style->color.alpha, symstyle->style->color.blue, symstyle->style->color.green, symstyle->style->color.red); snprintf(SymbolName, sizeof(SymbolName), "symbol_%s_%.1f_%s", symbol->name, symstyle->scale, symbolHexColor); const char *symbolUrl = msLookupHashTable(StyleHashTable, SymbolName); if (!symbolUrl) { char iconFileName[MS_MAXPATHLEN]; char iconUrl[MS_MAXPATHLEN]; if (img->imagepath) { char *tmpFileName = msTmpFile(NULL, MapPath, img->imagepath, "png"); snprintf(iconFileName, sizeof(iconFileName), "%s", tmpFileName); msFree(tmpFileName); } else { sprintf(iconFileName, "symbol_%s_%.1f.%s", symbol->name, symstyle->scale, "png"); } if (createIconImage(iconFileName, symbol, symstyle) != MS_SUCCESS) { msSetError(MS_IOERR, "Error creating icon file '%s'", "KmlRenderer::lookupSymbolStyle()", iconFileName); return NULL; } if (img->imageurl) sprintf(iconUrl, "%s%s.%s", img->imageurl, msGetBasename(iconFileName), "png"); else snprintf(iconUrl, sizeof(iconUrl), "%s", iconFileName); hashObj *hash = msInsertHashTable(StyleHashTable, SymbolName, iconUrl); symbolUrl = hash->data; } return symbolUrl; } const char *KmlRenderer::lookupPlacemarkStyle() { char lineHexColor[32]; char polygonHexColor[32]; char labelHexColor[32]; char *styleName = NULL; styleName = msStringConcatenate(styleName, "style"); if (SymbologyFlag[Line]) { /* ffffffff normal 1 */ for (int i = 0; i < numLineStyle; i++) { if (currentLayer && currentLayer->compositer && currentLayer->compositer->opacity > 0 && currentLayer->compositer->opacity < 100 && LineStyle[i].color->alpha == 255) LineStyle[i].color->alpha = MS_NINT(currentLayer->compositer->opacity * 2.55); sprintf(lineHexColor, "%02x%02x%02x%02x", LineStyle[i].color->alpha, LineStyle[0].color->blue, LineStyle[i].color->green, LineStyle[i].color->red); char lineStyleName[64]; snprintf(lineStyleName, sizeof(lineStyleName), "_line_%s_w%.1f", lineHexColor, LineStyle[i].width); styleName = msStringConcatenate(styleName, lineStyleName); } } if (SymbologyFlag[Polygon]) { /* ffffffff normal 1 1 */ if (currentLayer && currentLayer->compositer && currentLayer->compositer->opacity > 0 && currentLayer->compositer->opacity < 100 && PolygonColor.alpha == 255) PolygonColor.alpha = MS_NINT(currentLayer->compositer->opacity * 2.55); sprintf(polygonHexColor, "%02x%02x%02x%02x", PolygonColor.alpha, PolygonColor.blue, PolygonColor.green, PolygonColor.red); char polygonStyleName[64]; sprintf(polygonStyleName, "_polygon_%s", polygonHexColor); styleName = msStringConcatenate(styleName, polygonStyleName); } if (SymbologyFlag[Label]) { /* ffffffff normal 1 */ if (currentLayer && currentLayer->compositer && currentLayer->compositer->opacity > 0 && currentLayer->compositer->opacity < 100 && LabelColor.alpha == 255) LabelColor.alpha = MS_NINT(currentLayer->compositer->opacity * 2.55); sprintf(labelHexColor, "%02x%02x%02x%02x", LabelColor.alpha, LabelColor.blue, LabelColor.green, LabelColor.red); // __TODO__ add label scale char labelStyleName[64]; sprintf(labelStyleName, "_label_%s", labelHexColor); styleName = msStringConcatenate(styleName, labelStyleName); } if (SymbologyFlag[Symbol]) { /* */ /* __TODO__ add label scale */ styleName = msStringConcatenate(styleName, "_"); styleName = msStringConcatenate(styleName, SymbolName); } const char *styleUrl = msLookupHashTable(StyleHashTable, styleName); if (!styleUrl) { char *styleValue = NULL; styleValue = msStringConcatenate(styleValue, "#"); styleValue = msStringConcatenate(styleValue, styleName); hashObj *hash = msInsertHashTable(StyleHashTable, styleName, styleValue); styleUrl = hash->data; msFree(styleValue); /* Insert new Style node into Document node*/ xmlNodePtr styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST styleName); if (SymbologyFlag[Polygon]) { xmlNodePtr polyStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "PolyStyle", NULL); xmlNewChild(polyStyleNode, NULL, BAD_CAST "color", BAD_CAST polygonHexColor); } if (SymbologyFlag[Line]) { for (int i = 0; i < numLineStyle; i++) { xmlNodePtr lineStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "LineStyle", NULL); sprintf(lineHexColor, "%02x%02x%02x%02x", LineStyle[i].color->alpha, LineStyle[i].color->blue, LineStyle[i].color->green, LineStyle[i].color->red); xmlNewChild(lineStyleNode, NULL, BAD_CAST "color", BAD_CAST lineHexColor); char width[16]; sprintf(width, "%.1f", LineStyle[i].width); xmlNewChild(lineStyleNode, NULL, BAD_CAST "width", BAD_CAST width); } } if (SymbologyFlag[Symbol]) { xmlNodePtr iconStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "IconStyle", NULL); xmlNodePtr iconNode = xmlNewChild(iconStyleNode, NULL, BAD_CAST "Icon", NULL); xmlNewChild(iconNode, NULL, BAD_CAST "href", BAD_CAST SymbolUrl); /*char scale[16]; sprintf(scale, "%.1f", style->scale); xmlNewChild(iconStyleNode, NULL, BAD_CAST "scale", BAD_CAST scale);*/ } else { const char *value = msLookupHashTable(¤tLayer->metadata, "kml_default_symbol_href"); if (value && strlen(value) > 0) { xmlNodePtr iconStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "IconStyle", NULL); xmlNodePtr iconNode = xmlNewChild(iconStyleNode, NULL, BAD_CAST "Icon", NULL); xmlNewChild(iconNode, NULL, BAD_CAST "href", BAD_CAST value); } } if (SymbologyFlag[Label]) { xmlNodePtr labelStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "LabelStyle", NULL); xmlNewChild(labelStyleNode, NULL, BAD_CAST "color", BAD_CAST labelHexColor); /*char scale[16]; sprintf(scale, "%.1f", style->scale); xmlNewChild(iconStyleNode, NULL, BAD_CAST "scale", BAD_CAST scale);*/ } } if (styleName) msFree(styleName); return styleUrl; } void KmlRenderer::flushPlacemark() { if (PlacemarkNode) { const char *styleUrl = lookupPlacemarkStyle(); xmlNewChild(PlacemarkNode, NULL, BAD_CAST "styleUrl", BAD_CAST styleUrl); if (DescriptionNode) xmlAddChild(PlacemarkNode, DescriptionNode); if (GeomNode) xmlAddChild(PlacemarkNode, GeomNode); } } xmlNodePtr KmlRenderer::createDescriptionNode(shapeObj *shape) { /* */ /*description nodes for vector layers: - if kml_description is set, use it - if not, dump the attributes */ if (pszLayerDescMetadata) { char *pszTmp = NULL; char *pszTmpDesc = NULL; size_t bufferSize = 0; pszTmpDesc = msStrdup(pszLayerDescMetadata); for (int i = 0; i < currentLayer->numitems; i++) { bufferSize = strlen(currentLayer->items[i]) + 3; pszTmp = (char *)msSmallMalloc(bufferSize); snprintf(pszTmp, bufferSize, "%%%s%%", currentLayer->items[i]); if (strcasestr(pszTmpDesc, pszTmp)) pszTmpDesc = msCaseReplaceSubstring(pszTmpDesc, pszTmp, shape->values[i]); msFree(pszTmp); } xmlNodePtr descriptionNode = xmlNewNode(NULL, BAD_CAST "description"); xmlNodeAddContent(descriptionNode, BAD_CAST pszTmpDesc); msFree(pszTmpDesc); return descriptionNode; } else if ((papszLayerIncludeItems && nIncludeItems > 0) || (papszLayerExcludeItems && nExcludeItems > 0)) { /* -------------------------------------------------------------------- */ /* preferred way is to use the ExtendedData tag (#3728) */ /* http://code.google.com/apis/kml/documentation/extendeddata.html */ /* -------------------------------------------------------------------- */ xmlNodePtr extendedDataNode = xmlNewNode(NULL, BAD_CAST "ExtendedData"); xmlNodePtr dataNode = NULL; const char *pszAlias = NULL; int bIncludeAll = MS_FALSE; if (papszLayerIncludeItems && nIncludeItems == 1 && strcasecmp(papszLayerIncludeItems[0], "all") == 0) bIncludeAll = MS_TRUE; for (int i = 0; i < currentLayer->numitems; i++) { int j = 0, k = 0; /*TODO optimize to calculate this only once per layer*/ for (j = 0; j < nIncludeItems; j++) { if (strcasecmp(currentLayer->items[i], papszLayerIncludeItems[j]) == 0) break; } if (j < nIncludeItems || bIncludeAll) { if (papszLayerExcludeItems && nExcludeItems > 0) { for (k = 0; k < nExcludeItems; k++) { if (strcasecmp(currentLayer->items[i], papszLayerExcludeItems[k]) == 0) break; } } if (nExcludeItems == 0 || k == nExcludeItems) { dataNode = xmlNewNode(NULL, BAD_CAST "Data"); xmlNewProp(dataNode, BAD_CAST "name", BAD_CAST currentLayer->items[i]); pszAlias = getAliasName(currentLayer, currentLayer->items[i], "GO"); if (pszAlias) xmlNewChild(dataNode, NULL, BAD_CAST "displayName", BAD_CAST pszAlias); else xmlNewChild(dataNode, NULL, BAD_CAST "displayName", BAD_CAST currentLayer->items[i]); if (shape->values[i] && strlen(shape->values[i])) xmlNewChild(dataNode, NULL, BAD_CAST "value", BAD_CAST shape->values[i]); else xmlNewChild(dataNode, NULL, BAD_CAST "value", NULL); xmlAddChild(extendedDataNode, dataNode); } } } return extendedDataNode; } return NULL; } void KmlRenderer::addLineStyleToList(strokeStyleObj *style) { /*actually this is not necessary. kml only uses the last LineStyle so we should not bother keeping them all*/ int i = 0; for (i = 0; i < numLineStyle; i++) { if (style->width == LineStyle[i].width && LineStyle[i].color->alpha == style->color->alpha && LineStyle[i].color->red == style->color->red && LineStyle[i].color->green == style->color->green && LineStyle[i].color->blue == style->color->blue) break; } if (i == numLineStyle) { numLineStyle++; if (LineStyle == NULL) LineStyle = (strokeStyleObj *)msSmallMalloc(sizeof(strokeStyleObj)); else LineStyle = (strokeStyleObj *)msSmallRealloc( LineStyle, sizeof(strokeStyleObj) * numLineStyle); memcpy(&LineStyle[numLineStyle - 1], style, sizeof(strokeStyleObj)); } } #endif mapserver-8.4.0/src/mapkmlrenderer.h000066400000000000000000000150051474174441300175110ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Headers for mapkmlrenderer.cpp Google Earth KML output * Author: David Kana and the MapServer team * ****************************************************************************** * Copyright (c) 1996-2009 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #ifndef MAPKMLRENDERER_H #define MAPKMLRENDERER_H #include "mapserver-config.h" #if defined(USE_KML) #include "mapserver.h" #include "maplibxml2.h" class KmlRenderer { private: const char *pszLayerDescMetadata = nullptr; /*if the kml_description is set*/ char **papszLayerIncludeItems = nullptr; int nIncludeItems = 0; char **papszLayerExcludeItems = nullptr; int nExcludeItems = 0; const char *pszLayerNameAttributeMetadata = nullptr; protected: // map properties int Width = 0, Height = 0; rectObj MapExtent = {0, 0, 0, 0}; double MapCellsize = 0; colorObj BgColor = {0, 0, 0, 0}; char MapPath[MS_MAXPATHLEN] = {0}; // xml nodes pointers xmlDocPtr XmlDoc = nullptr; xmlNodePtr DocNode = nullptr; xmlNodePtr LayerNode = nullptr; xmlNodePtr GroundOverlayNode = nullptr; xmlNodePtr PlacemarkNode = nullptr; xmlNodePtr GeomNode = nullptr; xmlNodePtr DescriptionNode = nullptr; int CurrentShapeIndex = 0; int CurrentDrawnShapeIndex = 0; char *CurrentShapeName = nullptr; char **Items = nullptr; int NumItems = 0; int DumpAttributes = 0; // placemark symbology hashTableObj *StyleHashTable = nullptr; colorObj LabelColor = {0, 0, 0, 0}; strokeStyleObj *LineStyle = nullptr; int numLineStyle = 0; colorObj PolygonColor = {0, 0, 0, 0}; char SymbolName[128] = {0}; char SymbolUrl[128] = {0}; enum { NumSymbologyFlag = 4 }; char SymbologyFlag[NumSymbologyFlag] = {0, 0, 0, 0}; enum symbFlagsEnum { Label, Line, Polygon, Symbol }; int FirstLayer = 0; mapObj *map = nullptr; layerObj *currentLayer = nullptr; int AltitudeMode = 0; int Tessellate = 0; int Extrude = 0; enum altitudeModeEnum { undefined, clampToGround, relativeToGround, absolute }; /**True if elevation is taken from a feature attribute*/ bool mElevationFromAttribute = false; /**Attribute index of elevation (or -1 if elevation is not attribute driven*/ int mElevationAttributeIndex = 0; double mCurrentElevationValue = 0; outputFormatObj *aggFormat = nullptr; protected: imageObj *createInternalImage(); xmlNodePtr createPlacemarkNode(xmlNodePtr parentNode, char *styleUrl); xmlNodePtr createGroundOverlayNode(xmlNodePtr parentNode, char *imageHref, layerObj *layer); xmlNodePtr createDescriptionNode(shapeObj *shape); const char *lookupSymbolUrl(imageObj *img, symbolObj *symbol, symbolStyleObj *style); void addCoordsNode(xmlNodePtr parentNode, pointObj *pts, int numPts); void setupRenderingParams(hashTableObj *layerMetadata); void addAddRenderingSpecifications(xmlNodePtr node); int checkProjection(mapObj *map); int createIconImage(char *fileName, symbolObj *symbol, symbolStyleObj *style); void renderSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); ////////////////////////////////////////////////////////////////////////////// void renderLineVector(imageObj *img, shapeObj *p, strokeStyleObj *style); void renderPolygonVector(imageObj *img, shapeObj *p, colorObj *color); const char *lookupPlacemarkStyle(); void flushPlacemark(); xmlNodePtr getGeomParentNode(const char *geomName); char *getLayerName(layerObj *layer); void processLayer(layerObj *layer, outputFormatObj *format); void addLineStyleToList(strokeStyleObj *style); const char *getAliasName(layerObj *lp, char *pszItemName, const char *namespaces); public: KmlRenderer(int width, int height, outputFormatObj *format, colorObj *color = NULL); virtual ~KmlRenderer(); imageObj *createImage(int width, int height, outputFormatObj *format, colorObj *bg); int saveImage(imageObj *img, FILE *fp, outputFormatObj *format); int startNewLayer(imageObj *img, layerObj *layer); int closeNewLayer(imageObj *img, layerObj *layer); void startShape(imageObj *img, shapeObj *shape); void endShape(imageObj *img, shapeObj *shape); void renderLine(imageObj *img, shapeObj *p, strokeStyleObj *style); void renderPolygon(imageObj *img, shapeObj *p, colorObj *color); void renderGlyphs(imageObj *img, const textSymbolObj *ts, colorObj *c, colorObj *oc, int ow); // Symbols void renderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); void renderVectorSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); void renderEllipseSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); void renderTruetypeSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); int getTruetypeTextBBox(imageObj *img, char **fonts, int numfonts, double size, char *string, rectObj *rect, double **advances); int mergeRasterBuffer(imageObj *image, rasterBufferObj *rb); }; #endif /* USE_KML */ #endif mapserver-8.4.0/src/maplabel.c000066400000000000000000001251721474174441300162600ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Labeling Implementation. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* ** maplabel.c: Routines to enable text drawing, BITMAP or TRUETYPE. */ #include #include #include "mapserver.h" #include "fontcache.h" #include "cpl_vsi.h" #include "cpl_string.h" void initTextPath(textPathObj *ts) { memset(ts, 0, sizeof(*ts)); } int WARN_UNUSED msLayoutTextSymbol(mapObj *map, textSymbolObj *ts, textPathObj *tgret); #if defined(USE_EXTENDED_DEBUG) && 0 static void msDebugTextPath(textSymbolObj *ts) { int i; msDebug("text: %s\n", ts->annotext); if (ts->textpath) { for (i = 0; i < ts->textpath->numglyphs; i++) { glyphObj *g = &ts->textpath->glyphs[i]; msDebug("glyph %d: pos: %f %f\n", g->glyph->key.codepoint, g->pnt.x, g->pnt.y); } } else { msDebug("no glyphs\n"); } msDebug("\n=========================================\n"); } #endif int msComputeTextPath(mapObj *map, textSymbolObj *ts) { textPathObj *tgret = msSmallMalloc(sizeof(textPathObj)); assert(ts->annotext && *ts->annotext); initTextPath(tgret); ts->textpath = tgret; tgret->absolute = 0; tgret->glyph_size = ts->label->size * ts->scalefactor; tgret->glyph_size = MS_MAX(tgret->glyph_size, ts->label->minsize * ts->resolutionfactor); tgret->glyph_size = MS_NINT( MS_MIN(tgret->glyph_size, ts->label->maxsize * ts->resolutionfactor)); tgret->line_height = ceil(tgret->glyph_size * 1.33); return msLayoutTextSymbol(map, ts, tgret); } void initTextSymbol(textSymbolObj *ts) { memset(ts, 0, sizeof(*ts)); } void freeTextPath(textPathObj *tp) { free(tp->glyphs); if (tp->bounds.poly) { free(tp->bounds.poly->point); free(tp->bounds.poly); } } void freeTextSymbol(textSymbolObj *ts) { freeTextSymbolEx(ts, MS_TRUE); } void freeTextSymbolEx(textSymbolObj *ts, int doFreeLabel) { if (ts->textpath) { freeTextPath(ts->textpath); free(ts->textpath); } if (ts->label->numstyles) { if (ts->style_bounds) { int i; for (i = 0; i < ts->label->numstyles; i++) { if (ts->style_bounds[i]) { if (ts->style_bounds[i]->poly) { free(ts->style_bounds[i]->poly->point); free(ts->style_bounds[i]->poly); } free(ts->style_bounds[i]); } } free(ts->style_bounds); } } free(ts->annotext); if (doFreeLabel && freeLabel(ts->label) == MS_SUCCESS) { free(ts->label); } } void msCopyTextPath(textPathObj *dst, textPathObj *src) { int i; *dst = *src; if (src->bounds.poly) { dst->bounds.poly = msSmallMalloc(sizeof(lineObj)); dst->bounds.poly->numpoints = src->bounds.poly->numpoints; dst->bounds.poly->point = msSmallMalloc(src->bounds.poly->numpoints * sizeof(pointObj)); for (i = 0; i < src->bounds.poly->numpoints; i++) { dst->bounds.poly->point[i] = src->bounds.poly->point[i]; } } else { dst->bounds.poly = NULL; } if (dst->numglyphs > 0) { dst->glyphs = msSmallMalloc(dst->numglyphs * sizeof(glyphObj)); for (i = 0; i < dst->numglyphs; i++) dst->glyphs[i] = src->glyphs[i]; } } void msCopyTextSymbol(textSymbolObj *dst, textSymbolObj *src) { *dst = *src; MS_REFCNT_INCR(src->label); dst->annotext = msStrdup(src->annotext); if (src->textpath) { dst->textpath = msSmallMalloc(sizeof(textPathObj)); msCopyTextPath(dst->textpath, src->textpath); } if (src->style_bounds) { int i; dst->style_bounds = msSmallCalloc(src->label->numstyles, sizeof(label_bounds *)); for (i = 0; i < src->label->numstyles; i++) { if (src->style_bounds[i]) { dst->style_bounds[i] = msSmallMalloc(sizeof(label_bounds)); copyLabelBounds(dst->style_bounds[i], src->style_bounds[i]); } } } } static int labelNeedsDeepCopy(labelObj *label) { int i; if (label->numbindings > 0) return MS_TRUE; for (i = 0; i < label->numstyles; i++) { if (label->styles[i]->numbindings > 0) { return MS_TRUE; } } return MS_FALSE; } void msPopulateTextSymbolForLabelAndString(textSymbolObj *ts, labelObj *l, char *string, double scalefactor, double resolutionfactor, label_cache_mode cache) { if (cache == duplicate_always) { ts->label = msSmallMalloc(sizeof(labelObj)); initLabel(ts->label); msCopyLabel(ts->label, l); } else if (cache == duplicate_never) { ts->label = l; MS_REFCNT_INCR(l); } else if (cache == duplicate_if_needed && labelNeedsDeepCopy(l)) { ts->label = msSmallMalloc(sizeof(labelObj)); initLabel(ts->label); msCopyLabel(ts->label, l); } else { ts->label = l; MS_REFCNT_INCR(l); } ts->resolutionfactor = resolutionfactor; ts->scalefactor = scalefactor; ts->annotext = string; /* we take the ownership of the annotation text */ ts->rotation = l->angle * MS_DEG_TO_RAD; } int msAddLabelGroup(mapObj *map, imageObj *image, layerObj *layer, int classindex, shapeObj *shape, pointObj *point, double featuresize) { int l, s, priority; labelCacheSlotObj *cacheslot; labelCacheMemberObj *cachePtr = NULL; layerObj *layerPtr = NULL; classObj *classPtr = NULL; int numtextsymbols = 0; textSymbolObj **textsymbols, *ts; int layerindex = layer->index; // We cannot use GET_LAYER here because in drawQuery the drawing may happen // on a temp layer only. layerPtr = layer; classPtr = layer->class[classindex]; if (classPtr->numlabels == 0) return MS_SUCCESS; /* not an error just nothing to do */ /* check that the label intersects the layer mask */ if (layerPtr->mask) { int maskLayerIdx = msGetLayerIndex(map, layerPtr->mask); layerObj *maskLayer = GET_LAYER(map, maskLayerIdx); unsigned char *alphapixptr; if (maskLayer->maskimage && MS_IMAGE_RENDERER(maskLayer->maskimage)->supports_pixel_buffer) { rasterBufferObj rb; int x, y; memset(&rb, 0, sizeof(rasterBufferObj)); if (MS_UNLIKELY(MS_FAILURE == MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, &rb))) { return MS_FAILURE; } x = MS_NINT(point->x); y = MS_NINT(point->y); /* Using label repeatdistance, we might have a point with x/y below 0. See * #4764 */ if (x >= 0 && x < (int)rb.width && y >= 0 && y < (int)rb.height) { assert(rb.type == MS_BUFFER_BYTE_RGBA); alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step * x; if (!*alphapixptr) { /* label point does not intersect mask */ return MS_SUCCESS; } } else { return MS_SUCCESS; /* label point does not intersect image extent, we cannot know if it intersects mask, so we discard it (#5237)*/ } } else { msSetError(MS_MISCERR, "Layer (%s) references references a mask layer, but the " "selected renderer does not support them", "msAddLabelGroup()", layerPtr->name); return (MS_FAILURE); } } textsymbols = msSmallMalloc(classPtr->numlabels * sizeof(textSymbolObj *)); for (l = 0; l < classPtr->numlabels; l++) { labelObj *lbl = classPtr->labels[l]; char *annotext; if (msGetLabelStatus(map, layerPtr, shape, lbl) == MS_OFF) { continue; } annotext = msShapeGetLabelAnnotation(layerPtr, shape, lbl); if (!annotext) { for (s = 0; s < lbl->numstyles; s++) { if (lbl->styles[s]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) break; /* we have a "symbol only label, so we shouldn't skip this label */ } if (s == lbl->numstyles) { continue; /* no anno text, and no label symbols */ } } ts = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts); msPopulateTextSymbolForLabelAndString( ts, lbl, annotext, layerPtr->scalefactor, image->resolutionfactor, 1); if (annotext && *annotext && lbl->autominfeaturesize && featuresize > 0) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts))) { freeTextSymbol(ts); free(ts); return MS_FAILURE; } if (featuresize < (ts->textpath->bounds.bbox.maxx - ts->textpath->bounds.bbox.minx)) { /* feature is too big to be drawn, skip it */ freeTextSymbol(ts); free(ts); continue; } } textsymbols[numtextsymbols] = ts; numtextsymbols++; } if (numtextsymbols == 0) { free(textsymbols); return MS_SUCCESS; } /* Validate label priority value and get ref on label cache for it */ priority = classPtr->labels[0]->priority; /* take priority from the first label */ if (priority < 1) priority = 1; else if (priority > MS_MAX_LABEL_PRIORITY) priority = MS_MAX_LABEL_PRIORITY; cacheslot = &(map->labelcache.slots[priority - 1]); if (cacheslot->numlabels == cacheslot->cachesize) { /* just add it to the end */ cacheslot->labels = (labelCacheMemberObj *)realloc( cacheslot->labels, sizeof(labelCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT)); MS_CHECK_ALLOC(cacheslot->labels, sizeof(labelCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT), MS_FAILURE); cacheslot->cachesize += MS_LABELCACHEINCREMENT; } cachePtr = &(cacheslot->labels[cacheslot->numlabels]); cachePtr->layerindex = layerindex; /* so we can get back to this *raw* data if necessary */ cachePtr->classindex = classindex; cachePtr->point = *point; /* the actual label point */ cachePtr->leaderline = NULL; cachePtr->leaderbbox = NULL; cachePtr->markerid = -1; cachePtr->status = MS_FALSE; if (layerPtr->type == MS_LAYER_POINT && classPtr->numstyles > 0) { /* cache the marker placement, it's already on the map */ /* TO DO: at the moment only checks the bottom style, perhaps should check * all of them */ /* #2347: after RFC-24 classPtr->styles could be NULL so we check it */ double w, h; if (msGetMarkerSize(map, classPtr->styles[0], &w, &h, layerPtr->scalefactor) != MS_SUCCESS) return (MS_FAILURE); if (cacheslot->nummarkers == cacheslot->markercachesize) { /* just add it to the end */ cacheslot->markers = (markerCacheMemberObj *)realloc( cacheslot->markers, sizeof(markerCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT)); MS_CHECK_ALLOC(cacheslot->markers, sizeof(markerCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT), MS_FAILURE); cacheslot->markercachesize += MS_LABELCACHEINCREMENT; } cacheslot->markers[cacheslot->nummarkers].bounds.minx = (point->x - .5 * w); cacheslot->markers[cacheslot->nummarkers].bounds.miny = (point->y - .5 * h); cacheslot->markers[cacheslot->nummarkers].bounds.maxx = cacheslot->markers[cacheslot->nummarkers].bounds.minx + (w - 1); cacheslot->markers[cacheslot->nummarkers].bounds.maxy = cacheslot->markers[cacheslot->nummarkers].bounds.miny + (h - 1); cacheslot->markers[cacheslot->nummarkers].id = cacheslot->numlabels; cachePtr->markerid = cacheslot->nummarkers; cacheslot->nummarkers++; } cachePtr->textsymbols = textsymbols; cachePtr->numtextsymbols = numtextsymbols; cacheslot->numlabels++; return (MS_SUCCESS); } int msAddLabel(mapObj *map, imageObj *image, labelObj *label, int layerindex, int classindex, shapeObj *shape, pointObj *point, double featuresize, textSymbolObj *ts) { int i; labelCacheSlotObj *cacheslot; labelCacheMemberObj *cachePtr = NULL; const char *annotext = NULL; char *annotextToFree = NULL; layerObj *layerPtr; classObj *classPtr; layerPtr = GET_LAYER(map, layerindex); assert(layerPtr); assert(classindex < layerPtr->numclasses); classPtr = layerPtr->class[classindex]; assert(label); if (ts) annotext = ts->annotext; else if (shape) { annotextToFree = msShapeGetLabelAnnotation(layerPtr, shape, label); annotext = annotextToFree; } if (!annotext) { /* check if we have a labelpnt style */ for (i = 0; i < label->numstyles; i++) { if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) break; } if (i == label->numstyles) { /* label has no text or marker symbols */ if (ts) { freeTextSymbol(ts); free(ts); } return MS_SUCCESS; } } if (classPtr->leader) { if (ts && ts->textpath && ts->textpath->absolute) { msSetError(MS_MISCERR, "LEADERs are not supported on ANGLE FOLLOW labels", "msAddLabel()"); return MS_FAILURE; } } /* check that the label intersects the layer mask */ if (layerPtr->mask) { int maskLayerIdx = msGetLayerIndex(map, layerPtr->mask); layerObj *maskLayer = GET_LAYER(map, maskLayerIdx); unsigned char *alphapixptr; if (maskLayer->maskimage && MS_IMAGE_RENDERER(maskLayer->maskimage)->supports_pixel_buffer) { rasterBufferObj rb; memset(&rb, 0, sizeof(rasterBufferObj)); if (MS_UNLIKELY(MS_FAILURE == MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, &rb))) { msFree(annotextToFree); return MS_FAILURE; } assert(rb.type == MS_BUFFER_BYTE_RGBA); if (point) { int x = MS_NINT(point->x); int y = MS_NINT(point->y); /* Using label repeatdistance, we might have a point with x/y below 0. * See #4764 */ if (x >= 0 && x < (int)rb.width && y >= 0 && y < (int)rb.height) { alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step * x; if (!*alphapixptr) { /* label point does not intersect mask */ if (ts) { freeTextSymbol(ts); free(ts); } msFree(annotextToFree); return MS_SUCCESS; } } else { msFree(annotextToFree); return MS_SUCCESS; /* label point does not intersect image extent, we cannot know if it intersects mask, so we discard it (#5237)*/ } } else if (ts && ts->textpath) { int i = 0; for (i = 0; i < ts->textpath->numglyphs; i++) { int x = MS_NINT(ts->textpath->glyphs[i].pnt.x); int y = MS_NINT(ts->textpath->glyphs[i].pnt.y); if (x >= 0 && x < (int)rb.width && y >= 0 && y < (int)rb.height) { alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step * x; if (!*alphapixptr) { freeTextSymbol(ts); free(ts); msFree(annotextToFree); return MS_SUCCESS; } } else { freeTextSymbol(ts); free(ts); msFree(annotextToFree); return MS_SUCCESS; /* label point does not intersect image extent, we cannot know if it intersects mask, so we discard it (#5237)*/ } } } } else { msSetError(MS_MISCERR, "Layer (%s) references references a mask layer, but the " "selected renderer does not support them", "msAddLabel()", layerPtr->name); msFree(annotextToFree); return (MS_FAILURE); } } if (!ts) { ts = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts); msPopulateTextSymbolForLabelAndString(ts, label, annotextToFree, layerPtr->scalefactor, image->resolutionfactor, 1); // annotextToFree = NULL; } if (annotext && label->autominfeaturesize && featuresize > 0) { if (!ts->textpath) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts))) return MS_FAILURE; } if (!ts->textpath) { return MS_FAILURE; } if (featuresize > (ts->textpath->bounds.bbox.maxx - ts->textpath->bounds.bbox.minx)) { /* feature is too big to be drawn, skip it */ freeTextSymbol(ts); free(ts); return MS_SUCCESS; } } /* Validate label priority value and get ref on label cache for it */ if (label->priority < 1) label->priority = 1; else if (label->priority > MS_MAX_LABEL_PRIORITY) label->priority = MS_MAX_LABEL_PRIORITY; cacheslot = &(map->labelcache.slots[label->priority - 1]); if (cacheslot->numlabels == cacheslot->cachesize) { /* just add it to the end */ cacheslot->labels = (labelCacheMemberObj *)realloc( cacheslot->labels, sizeof(labelCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT)); MS_CHECK_ALLOC(cacheslot->labels, sizeof(labelCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT), MS_FAILURE); cacheslot->cachesize += MS_LABELCACHEINCREMENT; } cachePtr = &(cacheslot->labels[cacheslot->numlabels]); cachePtr->layerindex = layerindex; /* so we can get back to this *raw* data if necessary */ cachePtr->classindex = classindex; cachePtr->leaderline = NULL; cachePtr->leaderbbox = NULL; /* Store the label point or the label path (Bug #1620) */ if (point) { cachePtr->point = *point; /* the actual label point */ } else { assert(ts && ts->textpath && ts->textpath->absolute && ts->textpath->numglyphs > 0); /* Use the middle point of the labelpath for mindistance calculations */ cachePtr->point = ts->textpath->glyphs[ts->textpath->numglyphs / 2].pnt; } /* copy the label */ cachePtr->numtextsymbols = 1; cachePtr->textsymbols = (textSymbolObj **)msSmallMalloc(sizeof(textSymbolObj *)); cachePtr->textsymbols[0] = ts; cachePtr->markerid = -1; cachePtr->status = MS_FALSE; if (layerPtr->type == MS_LAYER_POINT && classPtr->numstyles > 0) { /* cache the marker placement, it's already on the map */ double w, h; if (cacheslot->nummarkers == cacheslot->markercachesize) { /* just add it to the end */ cacheslot->markers = (markerCacheMemberObj *)realloc( cacheslot->markers, sizeof(markerCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT)); MS_CHECK_ALLOC(cacheslot->markers, sizeof(markerCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT), MS_FAILURE); cacheslot->markercachesize += MS_LABELCACHEINCREMENT; } i = cacheslot->nummarkers; /* TO DO: at the moment only checks the bottom style, perhaps should check * all of them */ /* #2347: after RFC-24 classPtr->styles could be NULL so we check it */ if (classPtr->styles != NULL) { if (msGetMarkerSize(map, classPtr->styles[0], &w, &h, layerPtr->scalefactor) != MS_SUCCESS) return (MS_FAILURE); assert(point); cacheslot->markers[cacheslot->nummarkers].bounds.minx = (point->x - .5 * w); cacheslot->markers[cacheslot->nummarkers].bounds.miny = (point->y - .5 * h); cacheslot->markers[cacheslot->nummarkers].bounds.maxx = cacheslot->markers[cacheslot->nummarkers].bounds.minx + (w - 1); cacheslot->markers[cacheslot->nummarkers].bounds.maxy = cacheslot->markers[cacheslot->nummarkers].bounds.miny + (h - 1); cacheslot->markers[i].id = cacheslot->numlabels; cachePtr->markerid = i; cacheslot->nummarkers++; } } cacheslot->numlabels++; return (MS_SUCCESS); } /* ** Is a label completely in the image, reserving a gutter (in pixels) inside ** image for no labels (effectively making image larger. The gutter can be ** negative in cases where a label has a buffer around it. */ static int labelInImage(int width, int height, lineObj *lpoly, rectObj *bounds, int gutter) { int j; /* do a bbox test first */ if (bounds->minx >= gutter && bounds->miny >= gutter && bounds->maxx < width - gutter && bounds->maxy < height - gutter) { return MS_TRUE; } if (lpoly) { for (j = 1; j < lpoly->numpoints; j++) { if (lpoly->point[j].x < gutter) return (MS_FALSE); if (lpoly->point[j].x >= width - gutter) return (MS_FALSE); if (lpoly->point[j].y < gutter) return (MS_FALSE); if (lpoly->point[j].y >= height - gutter) return (MS_FALSE); } } else { /* if no poly, then return false as the boundong box intersected */ return MS_FALSE; } return (MS_TRUE); } void insertRenderedLabelMember(mapObj *map, labelCacheMemberObj *cachePtr) { if (map->labelcache.num_rendered_members == map->labelcache.num_allocated_rendered_members) { if (map->labelcache.num_rendered_members == 0) { map->labelcache.num_allocated_rendered_members = 50; } else { map->labelcache.num_allocated_rendered_members *= 2; } map->labelcache.rendered_text_symbols = msSmallRealloc(map->labelcache.rendered_text_symbols, map->labelcache.num_allocated_rendered_members * sizeof(labelCacheMemberObj *)); } map->labelcache .rendered_text_symbols[map->labelcache.num_rendered_members++] = cachePtr; } static inline int testSegmentLabelBBoxIntersection(const rectObj *leaderbbox, const pointObj *lp1, const pointObj *lp2, const label_bounds *test) { if (msRectOverlap(leaderbbox, &test->bbox)) { if (test->poly) { int pp; for (pp = 1; pp < test->poly->numpoints; pp++) { if (msIntersectSegments(&(test->poly->point[pp - 1]), &(test->poly->point[pp]), lp1, lp2) == MS_TRUE) { return (MS_FALSE); } } } else { pointObj tp1 = {0}, tp2 = {0}; tp1.x = test->bbox.minx; tp1.y = test->bbox.miny; tp2.x = test->bbox.minx; tp2.y = test->bbox.maxy; if (msIntersectSegments(lp1, lp2, &tp1, &tp2)) return MS_FALSE; tp2.x = test->bbox.maxx; tp2.y = test->bbox.miny; if (msIntersectSegments(lp1, lp2, &tp1, &tp2)) return MS_FALSE; tp1.x = test->bbox.maxx; tp1.y = test->bbox.maxy; tp2.x = test->bbox.minx; tp2.y = test->bbox.maxy; if (msIntersectSegments(lp1, lp2, &tp1, &tp2)) return MS_FALSE; tp2.x = test->bbox.maxx; tp2.y = test->bbox.miny; if (msIntersectSegments(lp1, lp2, &tp1, &tp2)) return MS_FALSE; } } return MS_TRUE; } int msTestLabelCacheLeaderCollision(mapObj *map, pointObj *lp1, pointObj *lp2) { int p; rectObj leaderbbox; leaderbbox.minx = MS_MIN(lp1->x, lp2->x); leaderbbox.maxx = MS_MAX(lp1->x, lp2->x); leaderbbox.miny = MS_MIN(lp1->y, lp2->y); leaderbbox.maxy = MS_MAX(lp1->y, lp2->y); for (p = 0; p < map->labelcache.num_rendered_members; p++) { labelCacheMemberObj *curCachePtr = map->labelcache.rendered_text_symbols[p]; if (msRectOverlap(&leaderbbox, &(curCachePtr->bbox))) { /* leaderbbox intersects with the curCachePtr's global bbox */ int t; for (t = 0; t < curCachePtr->numtextsymbols; t++) { int s; textSymbolObj *ts = curCachePtr->textsymbols[t]; /* check for intersect with textpath */ if (ts->textpath && testSegmentLabelBBoxIntersection( &leaderbbox, lp1, lp2, &ts->textpath->bounds) == MS_FALSE) { return MS_FALSE; } /* check for intersect with label's labelpnt styles */ if (ts->style_bounds) { for (s = 0; s < ts->label->numstyles; s++) { if (ts->label->styles[s]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { if (testSegmentLabelBBoxIntersection( &leaderbbox, lp1, lp2, ts->style_bounds[s]) == MS_FALSE) { return MS_FALSE; } } } } } if (curCachePtr->leaderbbox) { if (msIntersectSegments(lp1, lp2, &(curCachePtr->leaderline->point[0]), &(curCachePtr->leaderline->point[1])) == MS_TRUE) { return MS_FALSE; } } } } return MS_TRUE; } /* msTestLabelCacheCollisions() ** ** Compares label bounds (in *bounds) against labels already drawn and markers from cache and ** returns MS_FALSE if it collides with another label, or collides with a marker. ** ** This function is used by the various msDrawLabelCacheXX() implementations. int msTestLabelCacheCollisions(mapObj *map, labelCacheMemberObj *cachePtr, label_bounds *bounds, int current_priority, int current_label); */ int msTestLabelCacheCollisions(mapObj *map, labelCacheMemberObj *cachePtr, label_bounds *lb, int current_priority, int current_label) { labelCacheObj *labelcache = &(map->labelcache); int i, p, ll; /* * Check against image bounds first */ if (!cachePtr->textsymbols[0]->label->partials) { if (labelInImage(map->width, map->height, lb->poly, &lb->bbox, labelcache->gutter) == MS_FALSE) { return MS_FALSE; } } /* Compare against all rendered markers from this priority level and higher. ** Labels can overlap their own marker and markers from lower priority levels */ for (p = current_priority; p < MS_MAX_LABEL_PRIORITY; p++) { labelCacheSlotObj *markerslot; markerslot = &(labelcache->slots[p]); for (ll = 0; ll < markerslot->nummarkers; ll++) { if (!(p == current_priority && current_label == markerslot->markers[ll] .id)) { /* labels can overlap their own marker */ if (intersectLabelPolygons(NULL, &markerslot->markers[ll].bounds, lb->poly, &lb->bbox) == MS_TRUE) { return MS_FALSE; } } } } for (p = 0; p < labelcache->num_rendered_members; p++) { labelCacheMemberObj *curCachePtr = labelcache->rendered_text_symbols[p]; if (msRectOverlap(&curCachePtr->bbox, &lb->bbox)) { for (i = 0; i < curCachePtr->numtextsymbols; i++) { int j; textSymbolObj *ts = curCachePtr->textsymbols[i]; if (ts->textpath && intersectLabelPolygons(ts->textpath->bounds.poly, &ts->textpath->bounds.bbox, lb->poly, &lb->bbox) == MS_TRUE) { return MS_FALSE; } if (ts->style_bounds) { for (j = 0; j < ts->label->numstyles; j++) { if (ts->style_bounds[j] && ts->label->styles[j]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { if (intersectLabelPolygons(ts->style_bounds[j]->poly, &ts->style_bounds[j]->bbox, lb->poly, &lb->bbox)) { return MS_FALSE; } } } } } } if (curCachePtr->leaderline) { if (testSegmentLabelBBoxIntersection( curCachePtr->leaderbbox, &curCachePtr->leaderline->point[0], &curCachePtr->leaderline->point[1], lb) == MS_FALSE) { return MS_FALSE; } } } return MS_TRUE; } /* utility function to get the rect of a string outside of a rendering loop, i.e. without going through textpath layouts */ int msGetStringSize(mapObj *map, labelObj *label, int size, char *string, rectObj *r) { textSymbolObj ts; double lsize = label->size; initTextSymbol(&ts); label->size = size; msPopulateTextSymbolForLabelAndString(&ts, label, msStrdup(string), 1, 1, 0); if (MS_UNLIKELY(MS_FAILURE == msGetTextSymbolSize(map, &ts, r))) return MS_FAILURE; label->size = lsize; freeTextSymbol(&ts); return MS_SUCCESS; } int msInitFontSet(fontSetObj *fontset) { fontset->filename = NULL; /* fontset->fonts = NULL; */ initHashTable(&(fontset->fonts)); fontset->numfonts = 0; fontset->map = NULL; return (0); } int msFreeFontSet(fontSetObj *fontset) { if (fontset->filename) free(fontset->filename); fontset->filename = NULL; msFreeHashItems(&(fontset->fonts)); /* fontset->fonts = NULL; */ fontset->numfonts = 0; return (0); } int msLoadFontSet(fontSetObj *fontset, mapObj *map) { VSILFILE *stream; const char *line; char *path; char szPath[MS_MAXPATHLEN]; int i; int bFullPath = 0; const char *realpath; if (fontset->numfonts != 0) /* already initialized */ return (0); if (!fontset->filename) return (0); fontset->map = (mapObj *)map; path = msGetPath(fontset->filename); /* fontset->fonts = msCreateHashTable(); // create font hash */ /* if(!fontset->fonts) { */ /* msSetError(MS_HASHERR, "Error initializing font hash.", "msLoadFontSet()"); */ /* return(-1); */ /* } */ realpath = msBuildPath(szPath, fontset->map->mappath, fontset->filename); if (!realpath) { free(path); return -1; } stream = VSIFOpenL(realpath, "rb"); if (!stream) { msSetError(MS_IOERR, "Error opening fontset %s.", "msLoadFontset()", fontset->filename); free(path); return (-1); } i = 0; while ((line = CPLReadLineL(stream)) != NULL) { /* while there's something to load */ if (line[0] == '#' || line[0] == '\n' || line[0] == '\r' || line[0] == ' ') continue; /* skip comments and blank lines */ char alias[64]; snprintf(alias, sizeof(alias), "%s", line); char *ptr = strpbrk(alias, " \t"); if (!ptr) continue; *ptr = '\0'; const char *file1StartPtr = line + (ptr - alias); file1StartPtr++; /* Skip leading spaces */ while (isspace((int)*file1StartPtr)) file1StartPtr++; if (!(*file1StartPtr) || !(*alias)) continue; char file1[MS_PATH_LENGTH]; snprintf(file1, sizeof(file1), "%s", file1StartPtr); /* Remove trailing spaces */ ptr = file1 + strlen(file1) - 1; while (ptr >= file1 && isspace((int)*ptr)) { *ptr = '\0'; --ptr; } bFullPath = 0; #if defined(_WIN32) && !defined(__CYGWIN__) if (file1[0] == '\\' || (strlen(file1) > 1 && (file1[1] == ':'))) bFullPath = 1; #else if (file1[0] == '/') bFullPath = 1; #endif if (bFullPath) { /* already full path */ msInsertHashTable(&(fontset->fonts), alias, file1); } else { char file2[MS_PATH_LENGTH]; snprintf(file2, sizeof(file2), "%s%s", path, file1); /* msInsertHashTable(fontset->fonts, alias, file2); */ /* ** msBuildPath is use here, but if we have to save the fontset file ** the msBuildPath must be done everywhere the fonts are used and ** removed here. */ msInsertHashTable(&(fontset->fonts), alias, msBuildPath(szPath, fontset->map->mappath, file2)); } i++; } fontset->numfonts = i; VSIFCloseL(stream); /* close the file */ free(path); return (0); } int msGetTextSymbolSize(mapObj *map, textSymbolObj *ts, rectObj *r) { if (!ts->textpath) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts))) return MS_FAILURE; } if (!ts->textpath) return MS_FAILURE; *r = ts->textpath->bounds.bbox; return MS_SUCCESS; } /* ** Note: All these routines assume a reference point at the LL corner of the *text. GD's ** bitmapped fonts use UL and this is compensated for. Note the rect is relative *to the ** LL corner of the text to be rendered, this is first line for TrueType fonts. */ #define MARKER_SLOP 2 pointObj get_metrics(pointObj *p, int position, textPathObj *tp, int ox, int oy, double rotation, int buffer, label_bounds *bounds) { pointObj q = {0}; // initialize double x1 = 0, y1 = 0, x2 = 0, y2 = 0; double sin_a, cos_a; double w, h, x, y; w = tp->bounds.bbox.maxx - tp->bounds.bbox.minx; h = tp->bounds.bbox.maxy - tp->bounds.bbox.miny; switch (position) { case MS_UL: x1 = -w - ox; y1 = -oy; break; case MS_UC: x1 = -(w / 2.0); y1 = -oy - MARKER_SLOP; break; case MS_UR: x1 = ox; y1 = -oy; break; case MS_CL: x1 = -w - ox - MARKER_SLOP; if (oy > 0 && tp->numlines == 1) y1 = oy; else y1 = (h / 2.0); break; case MS_CC: x1 = -(w / 2.0) + ox; y1 = (h / 2.0) + oy; break; case MS_CR: x1 = ox + MARKER_SLOP; if (oy > 0 && tp->numlines == 1) y1 = oy; else y1 = (h / 2.0); break; case MS_LL: x1 = -w - ox; y1 = h + oy; break; case MS_LC: x1 = -(w / 2.0); y1 = h + oy + MARKER_SLOP; break; case MS_LR: x1 = ox; y1 = h + oy; break; } if (rotation) { sin_a = sin(rotation); cos_a = cos(rotation); x = x1 - tp->bounds.bbox.minx; y = tp->bounds.bbox.maxy - y1; q.x = p->x + (x * cos_a - (y)*sin_a); q.y = p->y - (x * sin_a + (y)*cos_a); if (bounds) { x2 = x1 - buffer; /* ll */ y2 = y1 + buffer; bounds->poly->point[0].x = p->x + (x2 * cos_a - (-y2) * sin_a); bounds->poly->point[0].y = p->y - (x2 * sin_a + (-y2) * cos_a); x2 = x1 - buffer; /* ul */ y2 = y1 - h - buffer; bounds->poly->point[1].x = p->x + (x2 * cos_a - (-y2) * sin_a); bounds->poly->point[1].y = p->y - (x2 * sin_a + (-y2) * cos_a); x2 = x1 + w + buffer; /* ur */ y2 = y1 - h - buffer; bounds->poly->point[2].x = p->x + (x2 * cos_a - (-y2) * sin_a); bounds->poly->point[2].y = p->y - (x2 * sin_a + (-y2) * cos_a); x2 = x1 + w + buffer; /* lr */ y2 = y1 + buffer; bounds->poly->point[3].x = p->x + (x2 * cos_a - (-y2) * sin_a); bounds->poly->point[3].y = p->y - (x2 * sin_a + (-y2) * cos_a); bounds->poly->point[4].x = bounds->poly->point[0].x; bounds->poly->point[4].y = bounds->poly->point[0].y; fastComputeBounds(bounds->poly, &bounds->bbox); } } else { q.x = p->x + x1 - tp->bounds.bbox.minx; q.y = p->y + y1 - tp->bounds.bbox.maxy; if (bounds) { /* no rotation, we only need to return a bbox */ bounds->poly = NULL; bounds->bbox.minx = q.x - buffer; bounds->bbox.maxy = q.y + buffer + tp->bounds.bbox.maxy; bounds->bbox.maxx = q.x + w + buffer; bounds->bbox.miny = bounds->bbox.maxy - h - buffer * 2; } } return (q); } int intersectTextSymbol(textSymbolObj *ts, label_bounds *lb) { if (ts->textpath && ts->textpath->absolute) { if (intersectLabelPolygons(lb->poly, &lb->bbox, ts->textpath->bounds.poly, &ts->textpath->bounds.bbox)) return MS_TRUE; } if (ts->style_bounds) { int s; for (s = 0; s < ts->label->numstyles; s++) { if (ts->style_bounds[s] && ts->label->styles[s]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT && intersectLabelPolygons(lb->poly, &lb->bbox, ts->style_bounds[s]->poly, &ts->style_bounds[s]->bbox)) return MS_TRUE; } } return MS_FALSE; } /* ** Variation on msIntersectPolygons. Label polygons aren't like shapefile *polygons. They ** have no holes, and often do have overlapping parts (i.e. road symbols). */ int intersectLabelPolygons(lineObj *l1, rectObj *r1, lineObj *l2, rectObj *r2) { int v1, v2; pointObj *point; lineObj *p1, *p2, sp1, sp2; pointObj pnts1[5], pnts2[5]; /* STEP 0: check bounding boxes */ if (!msRectOverlap(r1, r2)) { /* from alans@wunderground.com */ return (MS_FALSE); } if (!l1 && !l2) return MS_TRUE; if (!l1) { p1 = &sp1; p1->numpoints = 5; p1->point = pnts1; pnts1[0].x = pnts1[1].x = pnts1[4].x = r1->minx; pnts1[2].x = pnts1[3].x = r1->maxx; pnts1[0].y = pnts1[3].y = pnts1[4].y = r1->miny; pnts1[1].y = pnts1[2].y = r1->maxy; } else { p1 = l1; } if (!l2) { p2 = &sp2; p2->numpoints = 5; p2->point = pnts2; pnts2[0].x = pnts2[1].x = pnts2[4].x = r2->minx; pnts2[2].x = pnts2[3].x = r2->maxx; pnts2[0].y = pnts2[3].y = pnts2[4].y = r2->miny; pnts2[1].y = pnts2[2].y = r2->maxy; } else { p2 = l2; } (void)pnts1[0].x; (void)pnts1[0].y; (void)pnts1[1].x; (void)pnts1[1].y; (void)pnts1[2].x; (void)pnts1[2].y; (void)pnts1[3].x; (void)pnts1[3].y; (void)pnts1[4].x; (void)pnts1[4].y; (void)pnts2[0].x; (void)pnts2[0].y; (void)pnts2[1].x; (void)pnts2[1].y; (void)pnts2[2].x; (void)pnts2[2].y; (void)pnts2[3].x; (void)pnts2[3].y; (void)pnts2[4].x; (void)pnts2[4].y; /* STEP 1: look for intersecting line segments */ for (v1 = 1; v1 < p1->numpoints; v1++) for (v2 = 1; v2 < p2->numpoints; v2++) if (msIntersectSegments(&(p1->point[v1 - 1]), &(p1->point[v1]), &(p2->point[v2 - 1]), &(p2->point[v2])) == MS_TRUE) { return (MS_TRUE); } /* STEP 2: polygon one completely contains two (only need to check one point * from each part) */ point = &(p2->point[0]); if (msPointInPolygon(point, p1) == MS_TRUE) /* ok, the point is in a polygon */ return (MS_TRUE); /* STEP 3: polygon two completely contains one (only need to check one point * from each part) */ point = &(p1->point[0]); if (msPointInPolygon(point, p2) == MS_TRUE) /* ok, the point is in a polygon */ return (MS_TRUE); return (MS_FALSE); } /* For MapScript, exactly the same the msInsertStyle */ int msInsertLabelStyle(labelObj *label, styleObj *style, int nStyleIndex) { if (!style) { msSetError(MS_CHILDERR, "Can't insert a NULL Style", "msInsertLabelStyle()"); return -1; } /* Ensure there is room for a new style */ if (msGrowLabelStyles(label) == NULL) { return -1; } /* Catch attempt to insert past end of styles array */ else if (nStyleIndex >= label->numstyles) { msSetError(MS_CHILDERR, "Cannot insert style beyond index %d", "insertLabelStyle()", label->numstyles - 1); return -1; } else if (nStyleIndex < 0) { /* Insert at the end by default */ label->styles[label->numstyles] = style; MS_REFCNT_INCR(style); label->numstyles++; return label->numstyles - 1; } else { /* Move styles existing at the specified nStyleIndex or greater */ /* to a higher nStyleIndex */ for (int i = label->numstyles - 1; i >= nStyleIndex; i--) { label->styles[i + 1] = label->styles[i]; } label->styles[nStyleIndex] = style; MS_REFCNT_INCR(style); label->numstyles++; return nStyleIndex; } } /** * Move the style up inside the array of styles. */ int msMoveLabelStyleUp(labelObj *label, int nStyleIndex) { if (label && nStyleIndex < label->numstyles && nStyleIndex > 0) { styleObj *psTmpStyle = (styleObj *)malloc(sizeof(styleObj)); initStyle(psTmpStyle); msCopyStyle(psTmpStyle, label->styles[nStyleIndex]); msCopyStyle(label->styles[nStyleIndex], label->styles[nStyleIndex - 1]); msCopyStyle(label->styles[nStyleIndex - 1], psTmpStyle); return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveLabelStyleUp()", nStyleIndex); return (MS_FAILURE); } /** * Move the style down inside the array of styles. */ int msMoveLabelStyleDown(labelObj *label, int nStyleIndex) { styleObj *psTmpStyle = NULL; if (label && nStyleIndex < label->numstyles - 1 && nStyleIndex >= 0) { psTmpStyle = (styleObj *)malloc(sizeof(styleObj)); initStyle(psTmpStyle); msCopyStyle(psTmpStyle, label->styles[nStyleIndex]); msCopyStyle(label->styles[nStyleIndex], label->styles[nStyleIndex + 1]); msCopyStyle(label->styles[nStyleIndex + 1], psTmpStyle); return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveLabelStyleDown()", nStyleIndex); return (MS_FAILURE); } /** * Delete the style identified by the index and shift * styles that follows the deleted style. */ int msDeleteLabelStyle(labelObj *label, int nStyleIndex) { if (label && nStyleIndex < label->numstyles && nStyleIndex >= 0) { if (freeStyle(label->styles[nStyleIndex]) == MS_SUCCESS) msFree(label->styles[nStyleIndex]); for (int i = nStyleIndex; i < label->numstyles - 1; i++) { label->styles[i] = label->styles[i + 1]; } label->styles[label->numstyles - 1] = NULL; label->numstyles--; return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msDeleteLabelStyle()", nStyleIndex); return (MS_FAILURE); } styleObj *msRemoveLabelStyle(labelObj *label, int nStyleIndex) { int i; styleObj *style; if (nStyleIndex < 0 || nStyleIndex >= label->numstyles) { msSetError(MS_CHILDERR, "Cannot remove style, invalid nStyleIndex %d", "removeLabelStyle()", nStyleIndex); return NULL; } else { style = label->styles[nStyleIndex]; for (i = nStyleIndex; i < label->numstyles - 1; i++) { label->styles[i] = label->styles[i + 1]; } label->styles[label->numstyles - 1] = NULL; label->numstyles--; MS_REFCNT_DECR(style); return style; } } mapserver-8.4.0/src/maplayer.c000066400000000000000000002443511474174441300163160ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of most layerObj functions. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "maptime.h" #include "mapogcfilter.h" #include "mapthread.h" #include "mapfile.h" #include "mapows.h" #include "mapparser.h" #include "mapogcsld.h" #include "cpl_string.h" #include #ifndef cppcheck_assert #define cppcheck_assert(x) \ do { \ } while (0) #endif static int populateVirtualTable(layerVTableObj *vtable); /* ** Iteminfo is a layer parameter that holds information necessary to retrieve an *individual item for ** a particular source. It is an array built from a list of items. The type of *iteminfo will vary by ** source. For shapefiles and OGR it is simply an array of integers where each *value is an index for ** the item. For SDE it's a ESRI specific type that contains index and column *type information. Two ** helper functions below initialize and free that structure member which is *used locally by layer ** specific functions. */ int msLayerInitItemInfo(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerInitItemInfo(layer); } void msLayerFreeItemInfo(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return; } cppcheck_assert(layer->vtable); layer->vtable->LayerFreeItemInfo(layer); /* * Layer expressions with attribute binding hold a numeric index pointing * to an iteminfo (node->tokenval.bindval.index). If iteminfo changes, * an expression may be no longer valid. (#5161) */ msLayerFreeExpressions(layer); } int msLayerRestoreFromScaletokens(layerObj *layer) { if (!layer->scaletokens || !layer->orig_st) { return MS_SUCCESS; } if (layer->orig_st->data) { msFree(layer->data); layer->data = layer->orig_st->data; } if (layer->orig_st->tileindex) { msFree(layer->tileindex); layer->tileindex = layer->orig_st->tileindex; } if (layer->orig_st->tileitem) { msFree(layer->tileitem); layer->tileitem = layer->orig_st->tileitem; } if (layer->orig_st->filter) { msLoadExpressionString(&(layer->filter), layer->orig_st->filter); msFree(layer->orig_st->filter); } if (layer->orig_st->filteritem) { msFree(layer->filteritem); layer->filteritem = layer->orig_st->filteritem; } if (layer->orig_st->processing) { CSLDestroy(layer->processing); layer->processing = layer->orig_st->processing; layer->orig_st->processing = NULL; } msFree(layer->orig_st); layer->orig_st = NULL; return MS_SUCCESS; } #define check_st_alloc(l) \ if (!l->orig_st) \ l->orig_st = msSmallCalloc(1, sizeof(originalScaleTokenStrings)); int msLayerApplyScaletokens(layerObj *layer, double scale) { int i, p; if (!layer->scaletokens) { return MS_SUCCESS; } msLayerRestoreFromScaletokens(layer); for (i = 0; i < layer->numscaletokens; i++) { scaleTokenObj *st = &layer->scaletokens[i]; scaleTokenEntryObj *ste = NULL; if (scale <= 0) { ste = &(st->tokens[0]); /* no scale defined, use first entry */ } else { int tokenindex = 0; while (tokenindex < st->n_entries) { ste = &(st->tokens[tokenindex]); if (scale < ste->maxscale && scale >= ste->minscale) break; /* current token is the correct one */ tokenindex++; ste = NULL; } } assert(ste); if (layer->data && strstr(layer->data, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->data (%s) for " "scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->data = layer->data; layer->data = msStrdup(layer->data); layer->data = msReplaceSubstring(layer->data, st->name, ste->value); } if (layer->tileindex && strstr(layer->tileindex, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->tileindex (%s) " "for scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->tileindex = layer->tileindex; layer->tileindex = msStrdup(layer->tileindex); layer->tileindex = msReplaceSubstring(layer->tileindex, st->name, ste->value); } if (layer->tileitem && strstr(layer->tileitem, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->tileitem (%s) " "for scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->tileitem = layer->tileitem; layer->tileitem = msStrdup(layer->tileitem); layer->tileitem = msReplaceSubstring(layer->tileitem, st->name, ste->value); } if (layer->filteritem && strstr(layer->filteritem, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->filteritem (%s) " "for scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->filteritem = layer->filteritem; layer->filteritem = msStrdup(layer->filteritem); layer->filteritem = msReplaceSubstring(layer->filteritem, st->name, ste->value); } if (layer->filter.string && strstr(layer->filter.string, st->name)) { char *tmpval; if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->filter (%s) for " "scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->filter = msStrdup(layer->filter.string); tmpval = msStrdup(layer->filter.string); tmpval = msReplaceSubstring(tmpval, st->name, ste->value); if (msLoadExpressionString(&(layer->filter), tmpval) == -1) return (MS_FAILURE); /* msLoadExpressionString() cleans up previously allocated expression */ msFree(tmpval); } for (p = 0; layer->processing && layer->processing[p]; p++) { if (strstr(layer->processing[p], st->name)) { check_st_alloc(layer); if (!layer->orig_st->processing) { layer->orig_st->processing = CSLDuplicate(layer->processing); } char *newVal = msStrdup(layer->processing[p]); newVal = msReplaceSubstring(newVal, st->name, ste->value); CPLFree(layer->processing[p]); layer->processing[p] = CPLStrdup(newVal); msFree(newVal); } } } return MS_SUCCESS; } /* ** Does exactly what it implies, readies a layer for processing. */ int msLayerOpen(layerObj *layer) { int rv; /* RFC-86 Scale dependent token replacements*/ rv = msLayerApplyScaletokens(layer, (layer->map) ? layer->map->scaledenom : -1); if (rv != MS_SUCCESS) return rv; /* RFC-69 clustering support */ if (layer->cluster.region) return msClusterLayerOpen(layer); if (layer->features && layer->connectiontype != MS_GRATICULE) layer->connectiontype = MS_INLINE; if (layer->tileindex && layer->connectiontype == MS_SHAPEFILE) layer->connectiontype = MS_TILED_SHAPEFILE; if (layer->type == MS_LAYER_RASTER && layer->connectiontype != MS_WMS && layer->connectiontype != MS_KERNELDENSITY) layer->connectiontype = MS_RASTER; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerOpen(layer); } /* ** Returns MS_TRUE if layer has been opened using msLayerOpen(), MS_FALSE *otherwise */ int msLayerIsOpen(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerIsOpen(layer); } /* ** msLayerPropertyIsCharacter() ** ** Check if a field in a layer is a Character type */ bool msLayerPropertyIsCharacter(layerObj *layer, const char *property) { if (!property) { return false; } char md_item_name[256]; snprintf(md_item_name, sizeof(md_item_name), "gml_%s_type", property); const char *type = msLookupHashTable(&(layer->metadata), md_item_name); return (type != NULL && (EQUAL(type, "Character"))); } /* ** msLayerPropertyIsNumeric() ** ** Check if a field in a layer is numeric - an Integer, Long, or Real */ bool msLayerPropertyIsNumeric(layerObj *layer, const char *property) { if (!property) { return false; } char md_item_name[256]; snprintf(md_item_name, sizeof(md_item_name), "gml_%s_type", property); const char *type = msLookupHashTable(&(layer->metadata), md_item_name); return (type != NULL && (EQUAL(type, "Integer") || EQUAL(type, "Long") || EQUAL(type, "Real"))); } /* ** Returns MS_TRUE is a layer supports the common expression/filter syntax (RFC *64) and MS_FALSE otherwise. */ int msLayerSupportsCommonFilters(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerSupportsCommonFilters(layer); } int msLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerTranslateFilter(layer, filter, filteritem); } /* ** Performs a spatial, and optionally an attribute based feature search. The *function basically ** prepares things so that candidate features can be accessed by query or *drawing functions. For ** OGR and shapefiles this sets an internal bit vector that indicates whether a *particular feature ** is to processed. For SDE it executes an SQL statement on the SDE server. Once *run the msLayerNextShape ** function should be called to actually access the shapes. ** ** Note that for shapefiles we apply any maxfeatures constraint at this point. *That may be the only ** connection type where this is feasible. */ int msLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { if (!msLayerSupportsCommonFilters(layer)) msLayerTranslateFilter(layer, &layer->filter, layer->filteritem); if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerWhichShapes(layer, rect, isQuery); } /* ** Called after msWhichShapes has been called to actually retrieve shapes within *a given area ** and matching a vendor specific filter (i.e. layer FILTER attribute). ** ** Shapefiles: NULL shapes (shapes with attributes but NO vertices are skipped) */ int msLayerNextShape(layerObj *layer, shapeObj *shape) { int rv, filter_passed; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); #ifdef USE_V8_MAPSCRIPT /* we need to force the GetItems for the geomtransform attributes */ if (!layer->items && layer->_geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION && strstr(layer->_geomtransform.string, "javascript")) msLayerGetItems(layer); #endif /* At the end of switch case (default -> break; -> return MS_FAILURE), * was following TODO ITEM: * * TO DO! This is where dynamic joins will happen. Joined attributes will be * tagged on to the main attributes with the naming scheme [join name].[item * name]. We need to leverage the iteminfo (I think) at this point */ /* RFC 91: MapServer-based filtering is done at a more general level. */ do { rv = layer->vtable->LayerNextShape(layer, shape); if (rv != MS_SUCCESS) return rv; /* attributes need to be iconv'd to UTF-8 before any filter logic is applied */ if (layer->encoding) { rv = msLayerEncodeShapeAttributes(layer, shape); if (rv != MS_SUCCESS) return rv; } filter_passed = msEvalExpression(layer, shape, &(layer->filter), layer->filteritemindex); if (!filter_passed) msFreeShape(shape); } while (!filter_passed); /* RFC89 Apply Layer GeomTransform */ if (layer->_geomtransform.type != MS_GEOMTRANSFORM_NONE && rv == MS_SUCCESS) { rv = msGeomTransformShape(layer->map, layer, shape); if (rv != MS_SUCCESS) return rv; } return rv; } /* ** Used to retrieve a shape from a result set by index. Result sets are created *by the various ** msQueryBy...() functions. The index is assigned by the data source. */ /* int msLayerResultsGetShape(layerObj *layer, shapeObj *shape, int tile, long record) { if ( ! layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } return layer->vtable->LayerResultsGetShape(layer, shape, tile, record); } */ /* ** Used to retrieve a shape by index. All data sources must be capable of random *access using ** a record number(s) of some sort. */ int msLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { int rv; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); /* ** TODO: This is where dynamic joins could happen. Joined attributes would be ** tagged on to the main attributes with the naming scheme [join name].[item *name]. */ rv = layer->vtable->LayerGetShape(layer, shape, record); if (rv != MS_SUCCESS) return rv; /* RFC89 Apply Layer GeomTransform */ if (layer->_geomtransform.type != MS_GEOMTRANSFORM_NONE) { rv = msGeomTransformShape(layer->map, layer, shape); if (rv != MS_SUCCESS) return rv; } if (layer->encoding) { rv = msLayerEncodeShapeAttributes(layer, shape); if (rv != MS_SUCCESS) return rv; } return rv; } /* ** Returns the number of shapes that match the potential filter and extent. * rectProjection is the projection in which rect is expressed, or can be NULL if * rect should be considered in the layer projection. * This should be equivalent to calling msLayerWhichShapes() and counting the * number of shapes returned by msLayerNextShape(), honouring layer->maxfeatures * limitation if layer->maxfeatures>=0, and honouring layer->startindex if * layer->startindex >= 1 and paging is enabled. * Returns -1 in case of failure. */ int msLayerGetShapeCount(layerObj *layer, rectObj rect, projectionObj *rectProjection) { int rv; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return -1; } cppcheck_assert(layer->vtable); return layer->vtable->LayerGetShapeCount(layer, rect, rectProjection); } /* ** Closes resources used by a particular layer. */ void msLayerClose(layerObj *layer) { /* no need for items once the layer is closed */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } /* clear out items used as part of expressions (bug #2702) -- what about the * layer filter? */ msLayerFreeExpressions(layer); if (layer->vtable) { layer->vtable->LayerClose(layer); } msLayerRestoreFromScaletokens(layer); } /* ** Clear out items used as part of expressions. */ void msLayerFreeExpressions(layerObj *layer) { int i, j, k; msFreeExpressionTokens(&(layer->filter)); msFreeExpressionTokens(&(layer->cluster.group)); msFreeExpressionTokens(&(layer->cluster.filter)); for (i = 0; i < layer->numclasses; i++) { msFreeExpressionTokens(&(layer->class[i] -> expression)); msFreeExpressionTokens(&(layer->class[i] -> text)); for (j = 0; j < layer->class[i] -> numstyles; j++) msFreeExpressionTokens(&(layer->class[i] -> styles[j] -> _geomtransform)); for (k = 0; k < layer->class[i] -> numlabels; k++) { msFreeExpressionTokens(&(layer->class[i] -> labels[k] -> expression)); msFreeExpressionTokens(&(layer->class[i] -> labels[k] -> text)); } } } /* ** Retrieves a list of attributes available for this layer. Most sources also *set the iteminfo array ** at this point. This function is used when processing query results to expose *attributes to query ** templates. At that point all attributes are fair game. */ int msLayerGetItems(layerObj *layer) { const char *itemNames; /* clean up any previously allocated instances */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); /* At the end of switch case (default -> break; -> return MS_FAILURE), * was following TODO ITEM: */ /* TO DO! Need to add any joined itemd on to the core layer items, one long * list! */ itemNames = msLayerGetProcessingKey(layer, "ITEMS"); if (itemNames) { layer->items = msStringSplit(itemNames, ',', &layer->numitems); /* populate the iteminfo array */ return (msLayerInitItemInfo(layer)); } else return layer->vtable->LayerGetItems(layer); } /* ** Returns extent of spatial coverage for a layer. ** ** If layer->extent is set then this value is used, otherwise the ** driver-specific implementation is called (this can be expensive). ** ** If layer is not already opened then it is opened and closed (so this ** function can be called on both opened or closed layers). ** ** Returns MS_SUCCESS/MS_FAILURE. */ int msLayerGetExtent(layerObj *layer, rectObj *extent) { int need_to_close = MS_FALSE, status = MS_SUCCESS; if (MS_VALID_EXTENT(layer->extent)) { *extent = layer->extent; return MS_SUCCESS; } if (!msLayerIsOpen(layer)) { if (msLayerOpen(layer) != MS_SUCCESS) return MS_FAILURE; need_to_close = MS_TRUE; } if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) { if (need_to_close) msLayerClose(layer); return rv; } } cppcheck_assert(layer->vtable); status = layer->vtable->LayerGetExtent(layer, extent); if (status == MS_SUCCESS) { layer->extent = *extent; } if (need_to_close) msLayerClose(layer); return (status); } int msLayerGetItemIndex(layerObj *layer, char *item) { int i; for (i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], item) == 0) return (i); } return -1; /* item not found */ } static int string2list(char **list, int *listsize, char *string) { int i; for (i = 0; i < (*listsize); i++) { if (strcasecmp(list[i], string) == 0) { /* printf("string2list (duplicate): %s %d\n", string, i); */ return (i); } } list[i] = msStrdup(string); (*listsize)++; /* printf("string2list: %s %d\n", string, i); */ return (i); } extern int msyylex(void); extern int msyylex_destroy(void); extern int msyystate; extern char *msyystring; /* string to tokenize */ extern double msyynumber; /* token containers */ extern char *msyystring_buffer; const char *msExpressionTokenToString(int token) { switch (token) { case '(': return "("; case ')': return ")"; case ',': return ","; case '+': return "+"; case '-': return "-"; case '/': return "/"; case '*': return "*"; case '%': return "%"; case MS_TOKEN_LOGICAL_AND: return " and "; case MS_TOKEN_LOGICAL_OR: return " or "; case MS_TOKEN_LOGICAL_NOT: return " not "; case MS_TOKEN_COMPARISON_EQ: return " = "; case MS_TOKEN_COMPARISON_NE: return " != "; case MS_TOKEN_COMPARISON_GT: return " > "; case MS_TOKEN_COMPARISON_GE: return " >= "; case MS_TOKEN_COMPARISON_LT: return " < "; case MS_TOKEN_COMPARISON_LE: return " <= "; case MS_TOKEN_COMPARISON_IEQ: return ""; case MS_TOKEN_COMPARISON_RE: return " ~ "; case MS_TOKEN_COMPARISON_IRE: return " ~* "; case MS_TOKEN_COMPARISON_IN: return " in "; case MS_TOKEN_COMPARISON_INTERSECTS: return "intersects"; case MS_TOKEN_COMPARISON_DISJOINT: return "disjoint"; case MS_TOKEN_COMPARISON_TOUCHES: return "touches"; case MS_TOKEN_COMPARISON_OVERLAPS: return "overlaps"; case MS_TOKEN_COMPARISON_CROSSES: return "crosses"; case MS_TOKEN_COMPARISON_WITHIN: return "within"; case MS_TOKEN_COMPARISON_CONTAINS: return "contains"; case MS_TOKEN_COMPARISON_EQUALS: return "equals"; case MS_TOKEN_COMPARISON_BEYOND: return "beyond"; case MS_TOKEN_COMPARISON_DWITHIN: return "dwithin"; case MS_TOKEN_FUNCTION_LENGTH: return "length"; case MS_TOKEN_FUNCTION_TOSTRING: return "tostring"; case MS_TOKEN_FUNCTION_COMMIFY: return "commify"; case MS_TOKEN_FUNCTION_AREA: return "area"; case MS_TOKEN_FUNCTION_ROUND: return "round"; case MS_TOKEN_FUNCTION_BUFFER: return "buffer"; case MS_TOKEN_FUNCTION_DIFFERENCE: return "difference"; case MS_TOKEN_FUNCTION_SIMPLIFY: return "simplify"; // case MS_TOKEN_FUNCTION_SIMPLIFYPT: case MS_TOKEN_FUNCTION_GENERALIZE: return "generalize"; default: return NULL; } } int msTokenizeExpression(expressionObj *expression, char **list, int *listsize) { tokenListNodeObjPtr node; int token; /* TODO: make sure the constants can't somehow reference invalid expression * types */ /* if(expression->type != MS_EXPRESSION && expression->type != * MS_GEOMTRANSFORM_EXPRESSION) return MS_SUCCESS; */ msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_EXPRESSION; msyystring = expression->string; /* the thing we're tokenizing */ while ((token = msyylex()) != 0) { /* keep processing tokens until the end of the string (\0) */ if ((node = (tokenListNodeObjPtr)malloc(sizeof(tokenListNodeObj))) == NULL) { msSetError(MS_MEMERR, NULL, "msTokenizeExpression()"); goto parse_error; } node->tokensrc = NULL; node->tailifhead = NULL; node->next = NULL; switch (token) { case MS_TOKEN_LITERAL_BOOLEAN: case MS_TOKEN_LITERAL_NUMBER: node->token = token; node->tokenval.dblval = msyynumber; break; case MS_TOKEN_LITERAL_STRING: node->token = token; node->tokenval.strval = msStrdup(msyystring_buffer); break; case MS_TOKEN_LITERAL_TIME: node->tokensrc = msStrdup(msyystring_buffer); node->token = token; msTimeInit(&(node->tokenval.tmval)); if (msParseTime(msyystring_buffer, &(node->tokenval.tmval)) != MS_TRUE) { msSetError(MS_PARSEERR, "Parsing time value failed.", "msTokenizeExpression()"); free(node); goto parse_error; } break; case MS_TOKEN_BINDING_DOUBLE: /* we've encountered an attribute (binding) reference */ case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: case MS_TOKEN_BINDING_TIME: node->token = token; /* binding type */ node->tokenval.bindval.item = msStrdup(msyystring_buffer); if (list) node->tokenval.bindval.index = string2list(list, listsize, msyystring_buffer); break; case MS_TOKEN_BINDING_SHAPE: node->token = token; break; case MS_TOKEN_BINDING_MAP_CELLSIZE: node->token = token; break; case MS_TOKEN_BINDING_DATA_CELLSIZE: node->token = token; break; case MS_TOKEN_FUNCTION_FROMTEXT: /* we want to process a shape from WKT once and not for every feature being evaluated */ if ((token = msyylex()) != 40) { /* ( */ msSetError(MS_PARSEERR, "Parsing fromText function failed.", "msTokenizeExpression()"); free(node); goto parse_error; } if ((token = msyylex()) != MS_TOKEN_LITERAL_STRING) { msSetError(MS_PARSEERR, "Parsing fromText function failed.", "msTokenizeExpression()"); free(node); goto parse_error; } node->token = MS_TOKEN_LITERAL_SHAPE; node->tokenval.shpval = msShapeFromWKT(msyystring_buffer); if (!node->tokenval.shpval) { msSetError(MS_PARSEERR, "Parsing fromText function failed, WKT processing failed.", "msTokenizeExpression()"); free(node); goto parse_error; } /* todo: perhaps process optional args (e.g. projection) */ if ((token = msyylex()) != 41) { /* ) */ msSetError(MS_PARSEERR, "Parsing fromText function failed.", "msTokenizeExpression()"); msFreeShape(node->tokenval.shpval); free(node->tokenval.shpval); free(node); goto parse_error; } break; default: node->token = token; /* for everything else */ break; } /* add node to token list */ if (expression->tokens == NULL) { expression->tokens = node; } else { if (expression->tokens->tailifhead != NULL) /* this should never be NULL, but just in case */ expression->tokens->tailifhead->next = node; /* put the node at the end of the list */ } /* repoint the head of the list to the end - our new element this causes a loop if we are at the head, be careful not to walk in a loop */ expression->tokens->tailifhead = node; } expression->curtoken = expression->tokens; /* point at the first token */ msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; parse_error: msReleaseLock(TLOCK_PARSER); return MS_FAILURE; } static void buildLayerItemList(layerObj *layer) { int i, j, k, l; /* ** build layer item list, compute item indexes for explicitly item references *(e.g. classitem) or item bindings */ /* layer items */ if (layer->classitem) layer->classitemindex = string2list(layer->items, &(layer->numitems), layer->classitem); if (layer->filteritem) layer->filteritemindex = string2list(layer->items, &(layer->numitems), layer->filteritem); if (layer->styleitem && (strcasecmp(layer->styleitem, "AUTO") != 0) && !STARTS_WITH_CI(layer->styleitem, "javascript://") && !STARTS_WITH_CI(layer->styleitem, "sld://")) layer->styleitemindex = string2list(layer->items, &(layer->numitems), layer->styleitem); if (layer->labelitem) layer->labelitemindex = string2list(layer->items, &(layer->numitems), layer->labelitem); if (layer->utfitem) layer->utfitemindex = string2list(layer->items, &(layer->numitems), layer->utfitem); /* layer classes */ for (i = 0; i < layer->numclasses; i++) { // if classgroup has been set we can ignore any fields required // for rendering unused classes if (layer->class[i] -> group && layer -> classgroup &&strcasecmp( layer->class[i] -> group, layer -> classgroup) != 0) continue; if (layer->class[i] -> expression.type == MS_EXPRESSION) /* class expression */ msTokenizeExpression(&(layer->class[i] -> expression), layer->items, &(layer->numitems)); /* class styles (items, bindings, geomtransform) */ for (j = 0; j < layer->class[i] -> numstyles; j++) { if (layer->class[i] -> styles[j] -> rangeitem) layer->class[i]->styles[j]->rangeitemindex = string2list(layer->items, &(layer->numitems), layer->class[i] -> styles[j] -> rangeitem); for (k = 0; k < MS_STYLE_BINDING_LENGTH; k++) { if (layer->class[i] -> styles[j] -> bindings[k].item) layer->class[i]->styles[j]->bindings[k].index = string2list(layer->items, &(layer->numitems), layer->class[i] -> styles[j] -> bindings[k].item); if (layer->class[i] -> styles[j] -> exprBindings[k].type == MS_EXPRESSION) { msTokenizeExpression( &(layer->class[i] -> styles[j] -> exprBindings[k]), layer->items, &(layer->numitems)); } } if (layer->class[i] -> styles[j] -> _geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) msTokenizeExpression(&(layer->class[i] -> styles[j] -> _geomtransform), layer->items, &(layer->numitems)); } /* class labels and label styles (items, bindings, geomtransform) */ for (l = 0; l < layer->class[i] -> numlabels; l++) { for (j = 0; j < layer->class[i] -> labels[l] -> numstyles; j++) { if (layer->class[i] -> labels[l] -> styles[j] -> rangeitem) layer->class[i]->labels[l]->styles[j]->rangeitemindex = string2list( layer->items, &(layer->numitems), layer->class[i] -> labels[l] -> styles[j] -> rangeitem); for (k = 0; k < MS_STYLE_BINDING_LENGTH; k++) { if (layer->class[i] -> labels[l] -> styles[j] -> bindings[k].item) layer->class[i]->labels[l]->styles[j]->bindings[k].index = string2list(layer->items, &(layer->numitems), layer->class[i] -> labels[l] -> styles[j] -> bindings[k].item); if (layer->class[i] -> labels[l] -> styles[j] -> _geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) msTokenizeExpression( &(layer->class[i] -> labels[l] -> styles[j] -> _geomtransform), layer->items, &(layer->numitems)); } } for (k = 0; k < MS_LABEL_BINDING_LENGTH; k++) { if (layer->class[i] -> labels[l] -> bindings[k].item) layer->class[i]->labels[l]->bindings[k].index = string2list(layer->items, &(layer->numitems), layer->class[i] -> labels[l] -> bindings[k].item); if (layer->class[i] -> labels[l] -> exprBindings[k].type == MS_EXPRESSION) { msTokenizeExpression( &(layer->class[i] -> labels[l] -> exprBindings[k]), layer->items, &(layer->numitems)); } } /* label expression */ if (layer->class[i] -> labels[l] -> expression.type == MS_EXPRESSION) msTokenizeExpression(&(layer->class[i] -> labels[l] -> expression), layer->items, &(layer->numitems)); /* label text */ if (layer->class[i] -> labels[l] -> text.type == MS_EXPRESSION || (layer->class[i] -> labels[l] -> text.string &&strchr( layer->class[i] -> labels[l] -> text.string, '[') != NULL && strchr(layer->class[i] -> labels[l] -> text.string, ']') != NULL)) msTokenizeExpression(&(layer->class[i] -> labels[l] -> text), layer->items, &(layer->numitems)); } /* class text */ if (layer->class[i] -> text.type == MS_EXPRESSION || (layer->class[i] -> text.string &&strchr(layer->class[i] -> text.string, '[') != NULL && strchr(layer->class[i] -> text.string, ']') != NULL)) msTokenizeExpression(&(layer->class[i] -> text), layer->items, &(layer->numitems)); } /* layer filter */ if (layer->filter.type == MS_EXPRESSION) msTokenizeExpression(&(layer->filter), layer->items, &(layer->numitems)); /* cluster expressions */ if (layer->cluster.group.type == MS_EXPRESSION) msTokenizeExpression(&(layer->cluster.group), layer->items, &(layer->numitems)); if (layer->cluster.filter.type == MS_EXPRESSION) msTokenizeExpression(&(layer->cluster.filter), layer->items, &(layer->numitems)); /* utfdata */ if (layer->utfdata.type == MS_EXPRESSION || (layer->utfdata.string && strchr(layer->utfdata.string, '[') != NULL && strchr(layer->utfdata.string, ']') != NULL)) { msTokenizeExpression(&(layer->utfdata), layer->items, &(layer->numitems)); } } /* ** This function builds a list of items necessary to draw or query a particular *layer by ** examining the contents of the various xxxxitem parameters and expressions. *That list is ** then used to set the iteminfo variable. */ int msLayerWhichItems(layerObj *layer, int get_all, const char *metadata) { int i, j, k, l, rv; int nt = 0; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); /* Cleanup any previous item selection */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } /* ** need a count of potential items/attributes needed */ /* layer level counts */ layer->classitemindex = -1; layer->filteritemindex = -1; layer->styleitemindex = -1; layer->labelitemindex = -1; layer->utfitemindex = -1; if (layer->classitem) nt++; if (layer->filteritem) nt++; if (layer->styleitem && (strcasecmp(layer->styleitem, "AUTO") != 0) && !STARTS_WITH_CI(layer->styleitem, "javascript://") && !STARTS_WITH_CI(layer->styleitem, "sld://")) nt++; if (layer->filter.type == MS_EXPRESSION) nt += msCountChars(layer->filter.string, '['); if (layer->cluster.group.type == MS_EXPRESSION) nt += msCountChars(layer->cluster.group.string, '['); if (layer->cluster.filter.type == MS_EXPRESSION) nt += msCountChars(layer->cluster.filter.string, '['); if (layer->labelitem) nt++; if (layer->utfitem) nt++; if (layer->_geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) msTokenizeExpression(&layer->_geomtransform, layer->items, &(layer->numitems)); /* class level counts */ for (i = 0; i < layer->numclasses; i++) { for (j = 0; j < layer->class[i] -> numstyles; j++) { if (layer->class[i] -> styles[j] -> rangeitem) nt++; nt += layer->class[i]->styles[j]->numbindings; if (layer->class[i] -> styles[j] -> _geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) nt += msCountChars( layer->class[i] -> styles[j] -> _geomtransform.string, '['); for (k = 0; k < MS_STYLE_BINDING_LENGTH; k++) { if (layer->class[i] -> styles[j] -> exprBindings[k].type == MS_EXPRESSION) { nt += msCountChars( layer->class[i] -> styles[j] -> exprBindings[k].string, '['); } } } if (layer->class[i] -> expression.type == MS_EXPRESSION) nt += msCountChars(layer->class[i] -> expression.string, '['); for (l = 0; l < layer->class[i] -> numlabels; l++) { nt += layer->class[i]->labels[l]->numbindings; for (j = 0; j < layer->class[i] -> labels[l] -> numstyles; j++) { if (layer->class[i] -> labels[l] -> styles[j] -> rangeitem) nt++; nt += layer->class[i]->labels[l]->styles[j]->numbindings; if (layer->class[i] -> labels[l] -> styles[j] -> _geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) nt += msCountChars(layer->class[i] -> labels[l] -> styles[j] -> _geomtransform.string, '['); } for (k = 0; k < MS_LABEL_BINDING_LENGTH; k++) { if (layer->class[i] -> labels[l] -> exprBindings[k].type == MS_EXPRESSION) { nt += msCountChars( layer->class[i] -> labels[l] -> exprBindings[k].string, '['); } } if (layer->class[i] -> labels[l] -> expression.type == MS_EXPRESSION) nt += msCountChars(layer->class[i] -> labels[l] -> expression.string, '['); if (layer->class[i] -> labels[l] -> text.type == MS_EXPRESSION || (layer->class[i] -> labels[l] -> text.string &&strchr( layer->class[i] -> labels[l] -> text.string, '[') != NULL && strchr(layer->class[i] -> labels[l] -> text.string, ']') != NULL)) nt += msCountChars(layer->class[i] -> labels[l] -> text.string, '['); } if (layer->class[i] -> text.type == MS_EXPRESSION || (layer->class[i] -> text.string &&strchr(layer->class[i] -> text.string, '[') != NULL && strchr(layer->class[i] -> text.string, ']') != NULL)) nt += msCountChars(layer->class[i] -> text.string, '['); } /* utfgrid count */ if (layer->utfdata.type == MS_EXPRESSION || (layer->utfdata.string && strchr(layer->utfdata.string, '[') != NULL && strchr(layer->utfdata.string, ']') != NULL)) nt += msCountChars(layer->utfdata.string, '['); // if we are using a GetMap request with a WMS filter we don't need to return // all items if (msOWSLookupMetadata(&(layer->metadata), "G", "wmsfilter_flag") != NULL) { get_all = MS_FALSE; } if (metadata == NULL) { // check item set by mapwfs.cpp to restrict the number of columns selected metadata = msOWSLookupMetadata(&(layer->metadata), "G", "select_items"); if (metadata) { /* get only selected items */ get_all = MS_FALSE; } } /* always retrieve all items in some cases */ if (layer->connectiontype == MS_INLINE || (layer->map->outputformat && layer->map->outputformat->renderer == MS_RENDER_WITH_KML)) { get_all = MS_TRUE; } /* ** allocate space for the item list (worse case size) */ if (get_all) { rv = msLayerGetItems(layer); if (nt > 0) /* need to realloc the array to accept the possible new items*/ layer->items = (char **)msSmallRealloc( layer->items, sizeof(char *) * (layer->numitems + nt)); } else { rv = layer->vtable->LayerCreateItems(layer, nt); } if (rv != MS_SUCCESS) return rv; buildLayerItemList(layer); if (metadata) { char **tokens; int n = 0; int j; tokens = msStringSplit(metadata, ',', &n); if (tokens) { for (i = 0; i < n; i++) { int bFound = 0; for (j = 0; j < layer->numitems; j++) { if (strcasecmp(tokens[i], layer->items[j]) == 0) { bFound = 1; break; } } if (!bFound) { layer->numitems++; layer->items = (char **)msSmallRealloc( layer->items, sizeof(char *) * (layer->numitems)); layer->items[layer->numitems - 1] = msStrdup(tokens[i]); } } msFreeCharArray(tokens, n); } /* If we didn't retrieve all items of the layer, then do it, so that the */ /* order of the layer->items array is consistent with it. This is */ /* important so that WFS DescribeFeatureType and GetFeature requests */ /* return items in the same order */ if (!get_all && layer->numitems) { char **unsorted_items = layer->items; int numitems = layer->numitems; /* Retrieve all items */ layer->items = NULL; layer->numitems = 0; rv = msLayerGetItems(layer); if (rv != MS_SUCCESS) { msFreeCharArray(unsorted_items, numitems); return rv; } /* Sort unsorted_items in the order of layer->items */ char **sorted_items = (char **)msSmallMalloc(sizeof(char *) * numitems); int num_sorted_items = 0; for (i = 0; i < layer->numitems; i++) { if (layer->items[i]) { for (j = 0; j < numitems; j++) { if (unsorted_items[j] && strcasecmp(layer->items[i], unsorted_items[j]) == 0) { sorted_items[num_sorted_items] = layer->items[i]; num_sorted_items++; layer->items[i] = NULL; msFree(unsorted_items[j]); unsorted_items[j] = NULL; break; } } } } /* Add items that are not returned by msLayerGetItems() (not sure if that * can happen) */ for (j = 0; j < numitems; j++) { if (unsorted_items[j]) { sorted_items[num_sorted_items] = unsorted_items[j]; num_sorted_items++; } } if (layer->numitems > 0) { msFreeCharArray(layer->items, layer->numitems); } msFreeCharArray(unsorted_items, numitems); layer->items = sorted_items; layer->numitems = numitems; /* Re-run buildLayerItemList() with the now correctly sorted items */ buildLayerItemList(layer); } } /* populate the iteminfo array */ if (layer->numitems == 0) return (MS_SUCCESS); return (msLayerInitItemInfo(layer)); } /* ** A helper function to set the items to be retrieved with a particular shape. *Unused at the moment but will be used ** from within MapScript. Should not need modification. */ int msLayerSetItems(layerObj *layer, char **items, int numitems) { int i; /* Cleanup any previous item selection */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } /* now allocate and set the layer item parameters */ layer->items = (char **)malloc(sizeof(char *) * numitems); MS_CHECK_ALLOC(layer->items, sizeof(char *) * numitems, MS_FAILURE); for (i = 0; i < numitems; i++) layer->items[i] = msStrdup(items[i]); layer->numitems = numitems; /* populate the iteminfo array */ return (msLayerInitItemInfo(layer)); } /* ** Fills a classObj with style info from the specified shape. This is used ** with STYLEITEM AUTO when rendering shapes. ** For optimal results, this should be called immediately after ** GetNextShape() or GetShape() so that the shape doesn't have to be read ** twice. ** */ int msLayerGetAutoStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerGetAutoStyle(map, layer, c, shape); } /* ** Fills a classObj with style info from the specified attribute. This is used ** with STYLEITEM "attribute" when rendering shapes. ** */ int msLayerGetFeatureStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { char *stylestring = NULL; if (layer->styleitem && layer->styleitemindex >= 0) { stylestring = msStrdup(shape->values[layer->styleitemindex]); } else if (layer->styleitem && strncasecmp(layer->styleitem, "javascript://", 13) == 0) { #ifdef USE_V8_MAPSCRIPT char *filename = layer->styleitem + 13; if (!map->v8context) { msV8CreateContext(map); if (!map->v8context) { msSetError(MS_V8ERR, "Unable to create v8 context.", "msLayerGetFeatureStyle()"); return MS_FAILURE; } } if (*filename == '\0') { msSetError(MS_V8ERR, "Invalid javascript filename: \"%s\".", "msLayerGetFeatureStyle()", layer->styleitem); return MS_FAILURE; } stylestring = msV8GetFeatureStyle(map, filename, layer, shape); #else msSetError(MS_V8ERR, "V8 Javascript support is not available.", "msLayerGetFeatureStyle()"); return MS_FAILURE; #endif } else if (layer->styleitem && STARTS_WITH_CI(layer->styleitem, "sld://")) { // ignore the SLD styleitem return MS_SUCCESS; } else { /* unknown styleitem */ return MS_FAILURE; } /* try to find out the current style format */ if (!stylestring) return MS_FAILURE; if (strncasecmp(stylestring, "style", 5) == 0) { resetClassStyle(c); c->layer = layer; if (msMaybeAllocateClassStyle(c, 0)) { free(stylestring); return (MS_FAILURE); } msUpdateStyleFromString(c->styles[0], stylestring); double geo_cellsize = msGetGeoCellSize(map); msUpdateClassScaleFactor(geo_cellsize, map, layer, c); if (c->styles[0]->symbolname) { if ((c->styles[0]->symbol = msGetSymbolIndex( &(map->symbolset), c->styles[0]->symbolname, MS_TRUE)) == -1) { msSetError(MS_MISCERR, "Undefined symbol \"%s\" in class of layer %s.", "msLayerGetFeatureStyle()", c->styles[0]->symbolname, layer->name); free(stylestring); return MS_FAILURE; } } } else if (strncasecmp(stylestring, "class", 5) == 0) { if (strcasestr(stylestring, " style ") != NULL) { /* reset style if stylestring contains style definitions */ resetClassStyle(c); c->layer = layer; } msUpdateClassFromString(c, stylestring); double geo_cellsize = msGetGeoCellSize(map); msUpdateClassScaleFactor(geo_cellsize, map, layer, c); } else if (strncasecmp(stylestring, "pen", 3) == 0 || strncasecmp(stylestring, "brush", 5) == 0 || strncasecmp(stylestring, "symbol", 6) == 0 || strncasecmp(stylestring, "label", 5) == 0) { msOGRUpdateStyleFromString(map, layer, c, stylestring); } else if (strcasestr(stylestring, "StyledLayerDescriptor>") != NULL) { // check for the closing tag of an SLD document or // with a namespace e.g. msSLDApplySLD(map, stylestring, layer->index, NULL, NULL); } else { resetClassStyle(c); } free(stylestring); return MS_SUCCESS; } /* Returns the number of inline feature of a layer */ int msLayerGetNumFeatures(layerObj *layer) { int need_to_close = MS_FALSE, result = -1; if (!msLayerIsOpen(layer)) { if (msLayerOpen(layer) != MS_SUCCESS) return result; need_to_close = MS_TRUE; } if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return result; } cppcheck_assert(layer->vtable); result = layer->vtable->LayerGetNumFeatures(layer); if (need_to_close) msLayerClose(layer); return (result); } void msLayerSetProcessingKey(layerObj *layer, const char *key, const char *value) { layer->processing = CSLSetNameValue(layer->processing, key, value); } void msLayerSubstituteProcessing(layerObj *layer, const char *from, const char *to) { int i; for (i = 0; layer->processing && layer->processing[i]; i++) { char *newVal = msCaseReplaceSubstring(msStrdup(layer->processing[i]), from, to); CPLFree(layer->processing[i]); layer->processing[i] = CPLStrdup(newVal); msFree(newVal); } } void msLayerAddProcessing(layerObj *layer, const char *directive) { layer->processing = CSLAddString(layer->processing, directive); } int msLayerGetNumProcessing(const layerObj *layer) { return CSLCount(layer->processing); } const char *msLayerGetProcessing(const layerObj *layer, int proc_index) { if (proc_index < 0 || proc_index >= msLayerGetNumProcessing(layer)) { msSetError(MS_CHILDERR, "Invalid processing index.", "msLayerGetProcessing()"); return NULL; } else { return layer->processing[proc_index]; } } const char *msLayerGetProcessingKey(const layerObj *layer, const char *key) { return CSLFetchNameValue(layer->processing, key); } /************************************************************************/ /* msLayerGetMaxFeaturesToDraw */ /* */ /* Check to see if maxfeaturestodraw is set as a metadata or an */ /* output format option. Used for vector layers to limit the */ /* number of fatures rendered. */ /************************************************************************/ int msLayerGetMaxFeaturesToDraw(layerObj *layer, outputFormatObj *format) { int nMaxFeatures = -1; const char *pszTmp = NULL; if (layer) { nMaxFeatures = layer->maxfeatures; pszTmp = msLookupHashTable(&layer->metadata, "maxfeaturestodraw"); if (pszTmp) nMaxFeatures = atoi(pszTmp); else { pszTmp = msLookupHashTable(&layer->map->web.metadata, "maxfeaturestodraw"); if (pszTmp) nMaxFeatures = atoi(pszTmp); } } if (format) { if (nMaxFeatures < 0) nMaxFeatures = atoi(msGetOutputFormatOption(format, "maxfeaturestodraw", "-1")); } return nMaxFeatures; } int msLayerClearProcessing(layerObj *layer) { CSLDestroy(layer->processing); layer->processing = 0; return 0; } int makeTimeFilter(layerObj *lp, const char *timestring, const char *timefield, const int addtimebacktics) { char **atimes, **tokens = NULL; int numtimes, i, ntmp = 0; char *pszBuffer = NULL; int bOnlyExistingFilter = 0; if (!lp || !timestring || !timefield) return MS_FALSE; /* parse the time string. We support discrete times (eg 2004-09-21), */ /* multiple times (2004-09-21, 2004-09-22, ...) */ /* and range(s) (2004-09-21/2004-09-25, 2004-09-27/2004-09-29) */ if (strstr(timestring, ",") == NULL && strstr(timestring, "/") == NULL) { /* discrete time */ /* if(lp->filteritem) free(lp->filteritem); lp->filteritem = msStrdup(timefield); if (&lp->filter) msFreeExpression(&lp->filter); */ /* if the filter is set and it's a sting type, concatenate it with the time. If not just free it */ if (lp->filter.string && lp->filter.type == MS_STRING) { pszBuffer = msStringConcatenate(pszBuffer, "(("); pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") and "); } else if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { char *pszExpressionString = msGetExpressionString(&(lp->filter)); pszBuffer = msStringConcatenate(pszBuffer, "("); pszBuffer = msStringConcatenate(pszBuffer, pszExpressionString); pszBuffer = msStringConcatenate(pszBuffer, " and "); msFree(pszExpressionString); } else { msFreeExpression(&lp->filter); } pszBuffer = msStringConcatenate(pszBuffer, "("); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "["); pszBuffer = msStringConcatenate(pszBuffer, (char *)timefield); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "]"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); pszBuffer = msStringConcatenate(pszBuffer, " = "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, (char *)timestring); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, ")"); /* if there was a filter, It was concatenate with an And ans should be * closed*/ if (lp->filter.string && (lp->filter.type == MS_STRING || lp->filter.type == MS_EXPRESSION)) pszBuffer = msStringConcatenate(pszBuffer, ")"); msLoadExpressionString(&lp->filter, pszBuffer); if (pszBuffer) msFree(pszBuffer); return MS_TRUE; } atimes = msStringSplit(timestring, ',', &numtimes); if (atimes == NULL || numtimes < 1) { msFreeCharArray(atimes, numtimes); return MS_FALSE; } if (lp->filter.string && lp->filter.type == MS_STRING) { pszBuffer = msStringConcatenate(pszBuffer, "(("); pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") and "); /*this flag is used to indicate that the buffer contains only the existing filter. It is set to 0 when time filter parts are added to the buffer */ bOnlyExistingFilter = 1; } else if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { char *pszExpressionString = msGetExpressionString(&(lp->filter)); pszBuffer = msStringConcatenate(pszBuffer, "("); pszBuffer = msStringConcatenate(pszBuffer, pszExpressionString); pszBuffer = msStringConcatenate(pszBuffer, " and "); msFree(pszExpressionString); bOnlyExistingFilter = 1; } else msFreeExpression(&lp->filter); /* check to see if we have ranges by parsing the first entry */ tokens = msStringSplit(atimes[0], '/', &ntmp); if (ntmp == 2) { /* ranges */ msFreeCharArray(tokens, ntmp); for (i = 0; i < numtimes; i++) { tokens = msStringSplit(atimes[i], '/', &ntmp); if (ntmp == 2) { if (pszBuffer && strlen(pszBuffer) > 0 && bOnlyExistingFilter == 0) pszBuffer = msStringConcatenate(pszBuffer, " OR "); else pszBuffer = msStringConcatenate(pszBuffer, "("); bOnlyExistingFilter = 0; pszBuffer = msStringConcatenate(pszBuffer, "("); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "["); pszBuffer = msStringConcatenate(pszBuffer, (char *)timefield); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "]"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); pszBuffer = msStringConcatenate(pszBuffer, " >= "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, tokens[0]); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, " AND "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "["); pszBuffer = msStringConcatenate(pszBuffer, (char *)timefield); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "]"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); pszBuffer = msStringConcatenate(pszBuffer, " <= "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, tokens[1]); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, ")"); } msFreeCharArray(tokens, ntmp); } if (pszBuffer && strlen(pszBuffer) > 0 && bOnlyExistingFilter == 0) pszBuffer = msStringConcatenate(pszBuffer, ")"); } else if (ntmp == 1) { /* multiple times */ msFreeCharArray(tokens, ntmp); pszBuffer = msStringConcatenate(pszBuffer, "("); for (i = 0; i < numtimes; i++) { if (i > 0) pszBuffer = msStringConcatenate(pszBuffer, " OR "); pszBuffer = msStringConcatenate(pszBuffer, "("); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "["); pszBuffer = msStringConcatenate(pszBuffer, (char *)timefield); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "]"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); pszBuffer = msStringConcatenate(pszBuffer, " = "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, atimes[i]); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, ")"); } pszBuffer = msStringConcatenate(pszBuffer, ")"); } else { msFreeCharArray(tokens, ntmp); msFreeCharArray(atimes, numtimes); msFree(pszBuffer); return MS_FALSE; } msFreeCharArray(atimes, numtimes); /* load the string to the filter */ if (pszBuffer && strlen(pszBuffer) > 0) { if (lp->filter.string && (lp->filter.type == MS_STRING || lp->filter.type == MS_EXPRESSION)) pszBuffer = msStringConcatenate(pszBuffer, ")"); /* if(lp->filteritem) free(lp->filteritem); lp->filteritem = msStrdup(timefield); */ msLoadExpressionString(&lp->filter, pszBuffer); } msFree(pszBuffer); return MS_TRUE; } /** set the filter parameter for a time filter **/ int msLayerSetTimeFilter(layerObj *layer, const char *timestring, const char *timefield) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerSetTimeFilter(layer, timestring, timefield); } int msLayerMakeBackticsTimeFilter(layerObj *lp, const char *timestring, const char *timefield) { return makeTimeFilter(lp, timestring, timefield, MS_TRUE); } int msLayerMakePlainTimeFilter(layerObj *lp, const char *timestring, const char *timefield) { return makeTimeFilter(lp, timestring, timefield, MS_FALSE); } /* * Dummies / default actions for layers */ int LayerDefaultInitItemInfo(layerObj *layer) { (void)layer; return MS_SUCCESS; } void LayerDefaultFreeItemInfo(layerObj *layer) { (void)layer; } int LayerDefaultOpen(layerObj *layer) { (void)layer; return MS_FAILURE; } int LayerDefaultIsOpen(layerObj *layer) { (void)layer; return MS_FALSE; } int LayerDefaultWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)layer; (void)rect; (void)isQuery; return MS_SUCCESS; } int LayerDefaultNextShape(layerObj *layer, shapeObj *shape) { (void)layer; (void)shape; return MS_FAILURE; } int LayerDefaultGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { (void)layer; (void)shape; (void)record; return MS_FAILURE; } int LayerDefaultGetShapeCount(layerObj *layer, rectObj rect, projectionObj *rectProjection) { int status; shapeObj shape, searchshape; int nShapeCount = 0; rectObj searchrect = rect; reprojectionObj *reprojector = NULL; msInitShape(&searchshape); msRectToPolygon(searchrect, &searchshape); if (rectProjection != NULL) { if (layer->project && msProjectionsDiffer(&(layer->projection), rectProjection)) msProjectRect(rectProjection, &(layer->projection), &searchrect); /* project the searchrect to source coords */ else layer->project = MS_FALSE; } status = msLayerWhichShapes(layer, searchrect, MS_TRUE); if (status == MS_FAILURE) { msFreeShape(&searchshape); return -1; } else if (status == MS_DONE) { msFreeShape(&searchshape); return 0; } msInitShape(&shape); while ((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) { if (rectProjection != NULL) { if (layer->project && msProjectionsDiffer(&(layer->projection), rectProjection)) { if (reprojector == NULL) reprojector = msProjectCreateReprojector(&(layer->projection), rectProjection); if (reprojector) msProjectShapeEx(reprojector, &shape); } else layer->project = MS_FALSE; if (msRectContained(&shape.bounds, &rect) == MS_TRUE) { /* if the whole shape is in, don't intersect */ status = MS_TRUE; } else { switch (shape.type) { /* make sure shape actually intersects the qrect (ADD FUNCTIONS SPECIFIC TO RECTOBJ) */ case MS_SHAPE_POINT: status = msIntersectMultipointPolygon(&shape, &searchshape); break; case MS_SHAPE_LINE: status = msIntersectPolylinePolygon(&shape, &searchshape); break; case MS_SHAPE_POLYGON: status = msIntersectPolygons(&shape, &searchshape); break; default: break; } } } else status = MS_TRUE; if (status == MS_TRUE) nShapeCount++; msFreeShape(&shape); if (layer->maxfeatures > 0 && layer->maxfeatures == nShapeCount) break; } msFreeShape(&searchshape); msProjectDestroyReprojector(reprojector); return nShapeCount; } int LayerDefaultClose(layerObj *layer) { (void)layer; return MS_SUCCESS; } int LayerDefaultGetItems(layerObj *layer) { (void)layer; return MS_SUCCESS; /* returning no items is legit */ } int msLayerApplyCondSQLFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { return FLTLayerApplyCondSQLFilterToLayer(psNode, map, iLayerIndex); } int msLayerSupportsPaging(layerObj *layer) { if (layer && ((layer->connectiontype == MS_ORACLESPATIAL) || (layer->connectiontype == MS_POSTGIS))) return MS_TRUE; return MS_FALSE; } int msLayerApplyPlainFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); /* * msLayerSupportsSorting() * * Returns MS_TRUE if the layer supports sorting/ordering. */ int msLayerSupportsSorting(layerObj *layer) { if (layer && ((layer->connectiontype == MS_OGR) || (layer->connectiontype == MS_POSTGIS) || (layer->connectiontype == MS_ORACLESPATIAL) || ((layer->connectiontype == MS_PLUGIN) && (strstr(layer->plugin_library, "msplugin_oracle") != NULL)) || ((layer->connectiontype == MS_PLUGIN) && (strstr(layer->plugin_library, "msplugin_mssql2008") != NULL)))) return MS_TRUE; return MS_FALSE; } static void msLayerFreeSortBy(layerObj *layer) { for (int i = 0; i < layer->sortBy.nProperties; i++) msFree(layer->sortBy.properties[i].item); msFree(layer->sortBy.properties); layer->sortBy.properties = NULL; layer->sortBy.nProperties = 0; } /* * msLayerSetSort() * * Copy the sortBy clause passed as an argument into the layer sortBy member. */ void msLayerSetSort(layerObj *layer, const sortByClause *sortBy) { sortByProperties *newProperties = (sortByProperties *)msSmallMalloc( sortBy->nProperties * sizeof(sortByProperties)); for (int i = 0; i < sortBy->nProperties; i++) { newProperties[i].item = msStrdup(sortBy->properties[i].item); newProperties[i].sortOrder = sortBy->properties[i].sortOrder; } msLayerFreeSortBy(layer); layer->sortBy.nProperties = sortBy->nProperties; layer->sortBy.properties = newProperties; } /* * msLayerBuildSQLOrderBy() * * Returns the content of a SQL ORDER BY clause from the sortBy member of * the layer. The string does not contain the "ORDER BY" keywords itself. */ char *msLayerBuildSQLOrderBy(layerObj *layer) { char *strOrderBy = NULL; if (layer->sortBy.nProperties > 0) { int i; for (i = 0; i < layer->sortBy.nProperties; i++) { char *escaped = msLayerEscapePropertyName(layer, layer->sortBy.properties[i].item); if (i > 0) strOrderBy = msStringConcatenate(strOrderBy, ", "); strOrderBy = msStringConcatenate(strOrderBy, escaped); if (layer->sortBy.properties[i].sortOrder == SORT_DESC) strOrderBy = msStringConcatenate(strOrderBy, " DESC"); msFree(escaped); } } return strOrderBy; } int msLayerApplyPlainFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { return FLTLayerApplyPlainFilterToLayer(psNode, map, iLayerIndex); } int msLayerGetPaging(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) { msSetError(MS_MISCERR, "Unable to initialize virtual table", "msLayerGetPaging()"); return MS_FAILURE; } } cppcheck_assert(layer->vtable); return layer->vtable->LayerGetPaging(layer); } void msLayerEnablePaging(layerObj *layer, int value) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) { msSetError(MS_MISCERR, "Unable to initialize virtual table", "msLayerEnablePaging()"); return; } } cppcheck_assert(layer->vtable); layer->vtable->LayerEnablePaging(layer, value); } /** Returns a cached reprojector from the layer projection to the map projection */ reprojectionObj *msLayerGetReprojectorToMap(layerObj *layer, mapObj *map) { if (layer->reprojectorLayerToMap != NULL && !msProjectIsReprojectorStillValid(layer->reprojectorLayerToMap)) { msProjectDestroyReprojector(layer->reprojectorLayerToMap); layer->reprojectorLayerToMap = NULL; } if (layer->reprojectorLayerToMap == NULL) { layer->reprojectorLayerToMap = msProjectCreateReprojector(&layer->projection, &map->projection); } return layer->reprojectorLayerToMap; } int LayerDefaultGetExtent(layerObj *layer, rectObj *extent) { (void)layer; (void)extent; return MS_FAILURE; } int LayerDefaultGetAutoStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { (void)map; (void)layer; (void)c; (void)shape; msSetError(MS_MISCERR, "'STYLEITEM AUTO' not supported for this data source.", "msLayerGetAutoStyle()"); return MS_FAILURE; } int LayerDefaultCloseConnection(layerObj *layer) { (void)layer; return MS_SUCCESS; } int LayerDefaultCreateItems(layerObj *layer, const int nt) { if (nt > 0) { layer->items = (char **)calloc( nt, sizeof(char *)); /* should be more than enough space */ MS_CHECK_ALLOC(layer->items, sizeof(char *), MS_FAILURE); layer->numitems = 0; } return MS_SUCCESS; } int LayerDefaultGetNumFeatures(layerObj *layer) { rectObj extent; int status; int result; shapeObj shape; /* calculate layer extent */ if (!MS_VALID_EXTENT(layer->extent)) { if (msLayerGetExtent(layer, &extent) != MS_SUCCESS) { msSetError(MS_MISCERR, "Unable to get layer extent", "LayerDefaultGetNumFeatures()"); return -1; } } else extent = layer->extent; /* Cleanup any previous item selection */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } status = msLayerWhichShapes(layer, extent, MS_FALSE); if (status == MS_DONE) { /* no overlap */ return 0; } else if (status != MS_SUCCESS) { return -1; } result = 0; while ((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) { ++result; msFreeShape(&shape); } return result; } int LayerDefaultAutoProjection(layerObj *layer, projectionObj *projection) { (void)layer; (void)projection; msSetError(MS_MISCERR, "This data driver does not implement AUTO projection support", "LayerDefaultAutoProjection()"); return MS_FAILURE; } int LayerDefaultSupportsCommonFilters(layerObj *layer) { (void)layer; return MS_FALSE; } int LayerDefaultTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { (void)layer; (void)filteritem; if (!filter->string) return MS_SUCCESS; /* nothing to do, not an error */ msSetError(MS_MISCERR, "This data driver does not implement filter translation support", "LayerDefaultTranslateFilter()"); return MS_FAILURE; } int msLayerDefaultGetPaging(layerObj *layer) { (void)layer; return MS_FALSE; } void msLayerDefaultEnablePaging(layerObj *layer, int value) { (void)layer; (void)value; } /************************************************************************/ /* LayerDefaultEscapeSQLParam */ /* */ /* Default function used to escape strings and avoid sql */ /* injection. Specific drivers should redefine if an escaping */ /* function is available in the driver. */ /************************************************************************/ char *LayerDefaultEscapeSQLParam(layerObj *layer, const char *pszString) { (void)layer; char *pszEscapedStr = NULL; if (pszString) { int nSrcLen; char c; int i = 0, j = 0; nSrcLen = (int)strlen(pszString); pszEscapedStr = (char *)msSmallMalloc(2 * nSrcLen + 1); for (i = 0, j = 0; i < nSrcLen; i++) { c = pszString[i]; if (c == '\'') { pszEscapedStr[j++] = '\''; pszEscapedStr[j++] = '\''; } else if (c == '\\') { pszEscapedStr[j++] = '\\'; pszEscapedStr[j++] = '\\'; } else pszEscapedStr[j++] = c; } pszEscapedStr[j] = 0; } return pszEscapedStr; } /************************************************************************/ /* LayerDefaultEscapePropertyName */ /* */ /* Return the property name in a properly escaped and quoted form. */ /************************************************************************/ char *LayerDefaultEscapePropertyName(layerObj *layer, const char *pszString) { char *pszEscapedStr = NULL; int i, j = 0; if (layer && pszString && strlen(pszString) > 0) { int nLength = strlen(pszString); pszEscapedStr = (char *)msSmallMalloc(1 + 2 * nLength + 1 + 1); pszEscapedStr[j++] = '"'; for (i = 0; i < nLength; i++) { char c = pszString[i]; if (c == '"') { pszEscapedStr[j++] = '"'; pszEscapedStr[j++] = '"'; } else if (c == '\\') { pszEscapedStr[j++] = '\\'; pszEscapedStr[j++] = '\\'; } else pszEscapedStr[j++] = c; } pszEscapedStr[j++] = '"'; pszEscapedStr[j++] = 0; } return pszEscapedStr; } /* * msConnectLayer * * This will connect layer object to the new layer type. * Caller is responsible to close previous layer correctly. * For Internal types the library_str is ignored, for PLUGIN it's * define what plugin to use. Returns MS_FAILURE or MS_SUCCESS. */ int msConnectLayer(layerObj *layer, const int connectiontype, const char *library_str) { layer->connectiontype = connectiontype; /* For internal types, library_str is ignored */ if (connectiontype == MS_PLUGIN) { int rv; msFree(layer->plugin_library_original); layer->plugin_library_original = msStrdup(library_str); rv = msBuildPluginLibraryPath(&layer->plugin_library, layer->plugin_library_original, layer->map); if (rv != MS_SUCCESS) { return rv; } } return msInitializeVirtualTable(layer); } static int populateVirtualTable(layerVTableObj *vtable) { assert(vtable != NULL); vtable->LayerSupportsCommonFilters = LayerDefaultSupportsCommonFilters; vtable->LayerTranslateFilter = LayerDefaultTranslateFilter; vtable->LayerInitItemInfo = LayerDefaultInitItemInfo; vtable->LayerFreeItemInfo = LayerDefaultFreeItemInfo; vtable->LayerOpen = LayerDefaultOpen; vtable->LayerIsOpen = LayerDefaultIsOpen; vtable->LayerWhichShapes = LayerDefaultWhichShapes; vtable->LayerNextShape = LayerDefaultNextShape; /* vtable->LayerResultsGetShape = LayerDefaultResultsGetShape; */ vtable->LayerGetShape = LayerDefaultGetShape; vtable->LayerGetShapeCount = LayerDefaultGetShapeCount; vtable->LayerClose = LayerDefaultClose; vtable->LayerGetItems = LayerDefaultGetItems; vtable->LayerGetExtent = LayerDefaultGetExtent; vtable->LayerGetAutoStyle = LayerDefaultGetAutoStyle; vtable->LayerCloseConnection = LayerDefaultCloseConnection; vtable->LayerSetTimeFilter = msLayerMakePlainTimeFilter; vtable->LayerApplyFilterToLayer = msLayerApplyPlainFilterToLayer; vtable->LayerCreateItems = LayerDefaultCreateItems; vtable->LayerGetNumFeatures = LayerDefaultGetNumFeatures; vtable->LayerGetAutoProjection = LayerDefaultAutoProjection; vtable->LayerEscapeSQLParam = LayerDefaultEscapeSQLParam; vtable->LayerEscapePropertyName = LayerDefaultEscapePropertyName; vtable->LayerEnablePaging = msLayerDefaultEnablePaging; vtable->LayerGetPaging = msLayerDefaultGetPaging; return MS_SUCCESS; } static int createVirtualTable(layerVTableObj **vtable) { *vtable = malloc(sizeof(**vtable)); MS_CHECK_ALLOC(*vtable, sizeof(**vtable), MS_FAILURE); return populateVirtualTable(*vtable); } static int destroyVirtualTable(layerVTableObj **vtable) { memset(*vtable, 0, sizeof(**vtable)); msFree(*vtable); *vtable = NULL; return MS_SUCCESS; } int msInitializeVirtualTable(layerObj *layer) { if (layer->vtable) { destroyVirtualTable(&layer->vtable); } createVirtualTable(&layer->vtable); if (layer->features && layer->connectiontype != MS_GRATICULE) layer->connectiontype = MS_INLINE; if (layer->tileindex && layer->connectiontype == MS_SHAPEFILE) layer->connectiontype = MS_TILED_SHAPEFILE; if (layer->type == MS_LAYER_RASTER && layer->connectiontype != MS_WMS && layer->connectiontype != MS_KERNELDENSITY) layer->connectiontype = MS_RASTER; switch (layer->connectiontype) { case (MS_INLINE): return (msINLINELayerInitializeVirtualTable(layer)); break; case (MS_SHAPEFILE): return (msSHPLayerInitializeVirtualTable(layer)); break; case (MS_TILED_SHAPEFILE): return (msTiledSHPLayerInitializeVirtualTable(layer)); break; case (MS_OGR): return (msOGRLayerInitializeVirtualTable(layer)); break; case (MS_FLATGEOBUF): return (msFlatGeobufLayerInitializeVirtualTable(layer)); break; case (MS_POSTGIS): return (msPostGISLayerInitializeVirtualTable(layer)); break; case (MS_WMS): /* WMS should be treated as a raster layer */ return (msRASTERLayerInitializeVirtualTable(layer)); break; case (MS_KERNELDENSITY): /* KERNELDENSITY should be treated as a raster layer */ return (msRASTERLayerInitializeVirtualTable(layer)); break; case (MS_ORACLESPATIAL): return (msOracleSpatialLayerInitializeVirtualTable(layer)); break; case (MS_WFS): return (msWFSLayerInitializeVirtualTable(layer)); break; case (MS_GRATICULE): return (msGraticuleLayerInitializeVirtualTable(layer)); break; case (MS_RASTER): return (msRASTERLayerInitializeVirtualTable(layer)); break; case (MS_PLUGIN): return (msPluginLayerInitializeVirtualTable(layer)); break; case (MS_UNION): return (msUnionLayerInitializeVirtualTable(layer)); break; case (MS_UVRASTER): return (msUVRASTERLayerInitializeVirtualTable(layer)); break; case (MS_CONTOUR): return (msContourLayerInitializeVirtualTable(layer)); break; case (MS_RASTER_LABEL): return (msRasterLabelLayerInitializeVirtualTable(layer)); break; default: msSetError(MS_MISCERR, "Unknown connectiontype, it was %d", "msInitializeVirtualTable()", layer->connectiontype); return MS_FAILURE; break; } /* not reached */ return MS_FAILURE; } /* * INLINE: Virtual table functions */ typedef struct { rectObj searchrect; int is_relative; /* relative coordinates? */ } msINLINELayerInfo; int msINLINELayerIsOpen(layerObj *layer) { if (layer->layerinfo) return (MS_TRUE); else return (MS_FALSE); } msINLINELayerInfo *msINLINECreateLayerInfo(void) { msINLINELayerInfo *layerinfo = msSmallMalloc(sizeof(msINLINELayerInfo)); layerinfo->searchrect.minx = -1.0; layerinfo->searchrect.miny = -1.0; layerinfo->searchrect.maxx = -1.0; layerinfo->searchrect.maxy = -1.0; layerinfo->is_relative = MS_FALSE; return layerinfo; } int msINLINELayerOpen(layerObj *layer) { msINLINELayerInfo *layerinfo; if (layer->layerinfo) { if (layer->debug) { msDebug("msINLINELayerOpen: Layer is already open!\n"); } return MS_SUCCESS; /* already open */ } /* ** Initialize the layerinfo **/ layerinfo = msINLINECreateLayerInfo(); layer->currentfeature = layer->features; /* point to the beginning of the feature list */ layer->layerinfo = (void *)layerinfo; return (MS_SUCCESS); } int msINLINELayerClose(layerObj *layer) { if (layer->layerinfo) { free(layer->layerinfo); layer->layerinfo = NULL; } return MS_SUCCESS; } int msINLINELayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)isQuery; msINLINELayerInfo *layerinfo = NULL; layerinfo = (msINLINELayerInfo *)layer->layerinfo; layerinfo->searchrect = rect; layerinfo->is_relative = (layer->transform != MS_FALSE && layer->transform != MS_TRUE); return MS_SUCCESS; } /* Author: Cristoph Spoerri and Sean Gillies */ int msINLINELayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { int i = 0; featureListNodeObjPtr current; int shapeindex = record->shapeindex; /* only index necessary */ current = layer->features; while (current != NULL && i != shapeindex) { i++; current = current->next; } if (current == NULL) { msSetError(MS_SHPERR, "No inline feature with this index.", "msINLINELayerGetShape()"); return MS_FAILURE; } if (msCopyShape(&(current->shape), shape) != MS_SUCCESS) { msSetError( MS_SHPERR, "Cannot retrieve inline shape. There some problem with the shape", "msINLINELayerGetShape()"); return MS_FAILURE; } /* check for the expected size of the values array */ if (layer->numitems > shape->numvalues) { shape->values = (char **)msSmallRealloc(shape->values, sizeof(char *) * (layer->numitems)); for (i = shape->numvalues; i < layer->numitems; i++) shape->values[i] = msStrdup(""); } msComputeBounds(shape); return MS_SUCCESS; } int msINLINELayerNextShape(layerObj *layer, shapeObj *shape) { msINLINELayerInfo *layerinfo = NULL; shapeObj *s; layerinfo = (msINLINELayerInfo *)layer->layerinfo; while (1) { if (!(layer->currentfeature)) { /* out of features */ return (MS_DONE); } s = &(layer->currentfeature->shape); layer->currentfeature = layer->currentfeature->next; msComputeBounds(s); if (layerinfo->is_relative || msRectOverlap(&s->bounds, &layerinfo->searchrect)) { msCopyShape(s, shape); /* check for the expected size of the values array */ if (layer->numitems > shape->numvalues) { int i; shape->values = (char **)msSmallRealloc( shape->values, sizeof(char *) * (layer->numitems)); for (i = shape->numvalues; i < layer->numitems; i++) shape->values[i] = msStrdup(""); shape->numvalues = layer->numitems; } break; } } return (MS_SUCCESS); } int msINLINELayerGetNumFeatures(layerObj *layer) { int i = 0; featureListNodeObjPtr current; current = layer->features; while (current != NULL) { i++; current = current->next; } return i; } /* Returns an escaped string */ char *msLayerEscapeSQLParam(layerObj *layer, const char *pszString) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return ""; } cppcheck_assert(layer->vtable); return layer->vtable->LayerEscapeSQLParam(layer, pszString); } char *msLayerEscapePropertyName(layerObj *layer, const char *pszString) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return ""; } cppcheck_assert(layer->vtable); return layer->vtable->LayerEscapePropertyName(layer, pszString); } int msINLINELayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); /* layer->vtable->LayerInitItemInfo, use default */ /* layer->vtable->LayerFreeItemInfo, use default */ layer->vtable->LayerOpen = msINLINELayerOpen; layer->vtable->LayerIsOpen = msINLINELayerIsOpen; layer->vtable->LayerWhichShapes = msINLINELayerWhichShapes; layer->vtable->LayerNextShape = msINLINELayerNextShape; /* layer->vtable->LayerGetShapeCount, use default */ layer->vtable->LayerGetShape = msINLINELayerGetShape; layer->vtable->LayerClose = msINLINELayerClose; /* layer->vtable->LayerGetItems, use default */ /* * Original code contained following * TODO: need to compute extents */ /* layer->vtable->LayerGetExtent, use default */ /* layer->vtable->LayerGetAutoStyle, use default */ /* layer->vtable->LayerCloseConnection, use default */ layer->vtable->LayerSetTimeFilter = msLayerMakeBackticsTimeFilter; /* layer->vtable->LayerApplyFilterToLayer, use default */ /* layer->vtable->LayerCreateItems, use default */ layer->vtable->LayerGetNumFeatures = msINLINELayerGetNumFeatures; /*layer->vtable->LayerEscapeSQLParam, use default*/ /*layer->vtable->LayerEscapePropertyName, use default*/ /* layer->vtable->LayerEnablePaging, use default */ /* layer->vtable->LayerGetPaging, use default */ return MS_SUCCESS; } mapserver-8.4.0/src/maplegend.c000066400000000000000000001146451474174441300164420ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Legend generation. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #define PSF .8 #define VMARGIN 5 /* margin at top and bottom of legend graphic */ #define HMARGIN 5 /* margin at left and right of legend graphic */ static int msDrawGradientSymbol(rendererVTableObj *renderer, imageObj *image_draw, double x_center, double y_center, int width, int height, styleObj *style) { unsigned char *r, *g, *b, *a; symbolObj symbol; rasterBufferObj *rb; symbolStyleObj symbolStyle; int ret; initSymbol(&symbol); rb = (rasterBufferObj *)calloc(1, sizeof(rasterBufferObj)); symbol.pixmap_buffer = rb; rb->type = MS_BUFFER_BYTE_RGBA; rb->width = width; rb->height = height; rb->data.rgba.row_step = rb->width * 4; rb->data.rgba.pixel_step = 4; rb->data.rgba.pixels = (unsigned char *)malloc(sizeof(unsigned char) * rb->width * rb->height * 4); b = rb->data.rgba.b = &rb->data.rgba.pixels[0]; g = rb->data.rgba.g = &rb->data.rgba.pixels[1]; r = rb->data.rgba.r = &rb->data.rgba.pixels[2]; a = rb->data.rgba.a = &rb->data.rgba.pixels[3]; for (unsigned j = 0; j < rb->height; j++) { for (unsigned i = 0; i < rb->width; i++) { msValueToRange(style, style->minvalue + (double)i / rb->width * (style->maxvalue - style->minvalue), MS_COLORSPACE_RGB); b[4 * (j * rb->width + i)] = style->color.blue; g[4 * (j * rb->width + i)] = style->color.green; r[4 * (j * rb->width + i)] = style->color.red; a[4 * (j * rb->width + i)] = style->color.alpha; } } INIT_SYMBOL_STYLE(symbolStyle); ret = renderer->renderPixmapSymbol(image_draw, x_center, y_center, &symbol, &symbolStyle); msFreeSymbol(&symbol); return ret; } /* * generic function for drawing a legend icon. (added for bug #2348) * renderer specific drawing functions shouldn't be called directly, but through * this function */ int msDrawLegendIcon(mapObj *map, layerObj *lp, classObj *theclass, int width, int height, imageObj *image, int dstX, int dstY, int scale_independant, class_hittest *hittest) { int i, type, hasmarkersymbol, ret = MS_SUCCESS; double offset; double polygon_contraction = 0.5; /* used to account for the width of a polygon's outline */ shapeObj box, zigzag; lineObj box_line, zigzag_line; pointObj box_point[5], zigzag_point[4]; pointObj marker; char szPath[MS_MAXPATHLEN]; styleObj outline_style; imageObj *image_draw = image; rendererVTableObj *renderer; outputFormatObj *transFormat = NULL, *altFormat = NULL; const char *alternativeFormatString = NULL; if (!MS_RENDERER_PLUGIN(image->format)) { msSetError(MS_MISCERR, "unsupported image format", "msDrawLegendIcon()"); return MS_FAILURE; } alternativeFormatString = msLayerGetProcessingKey(lp, "RENDERER"); if (MS_RENDERER_PLUGIN(image_draw->format) && alternativeFormatString != NULL && (altFormat = msSelectOutputFormat(map, alternativeFormatString))) { msInitializeRendererVTable(altFormat); image_draw = msImageCreate( image->width, image->height, altFormat, image->imagepath, image->imageurl, map->resolution, map->defresolution, &map->imagecolor); image_draw->map = map; renderer = MS_IMAGE_RENDERER(image_draw); } else { renderer = MS_IMAGE_RENDERER(image_draw); if (lp->compositer && renderer->compositeRasterBuffer) { image_draw = msImageCreate(image->width, image->height, image->format, image->imagepath, image->imageurl, map->resolution, map->defresolution, NULL); if (!image_draw) { msSetError(MS_MISCERR, "Unable to initialize temporary transparent image.", "msDrawLegendIcon()"); return (MS_FAILURE); } image_draw->map = map; } } if (renderer->supports_clipping && MS_VALID_COLOR(map->legend.outlinecolor)) { /* keep GD specific code here for now as it supports clipping */ rectObj clip; clip.maxx = dstX + width - 1; clip.maxy = dstY + height - 1; clip.minx = dstX; clip.miny = dstY; renderer->setClip(image_draw, clip); } /* if the class has a keyimage, treat it as a point layer * (the keyimage will be treated there) */ if (theclass->keyimage != NULL) { type = MS_LAYER_POINT; } else { /* some polygon layers may be better drawn using zigzag if there is no fill */ type = lp->type; if (type == MS_LAYER_POLYGON) { type = MS_LAYER_LINE; for (i = 0; i < theclass->numstyles; i++) { if (MS_VALID_COLOR(theclass->styles[i]->color)) { /* there is a fill */ type = MS_LAYER_POLYGON; } if (MS_VALID_COLOR( theclass->styles[i]->outlinecolor)) { /* there is an outline */ polygon_contraction = MS_MAX(polygon_contraction, theclass->styles[i]->width / 2.0); } } } } /* initialize the box used for polygons and for outlines */ msInitShape(&box); box.line = &box_line; box.numlines = 1; box.line[0].point = box_point; box.line[0].numpoints = 5; box.type = MS_SHAPE_POLYGON; box.line[0].point[0].x = dstX + polygon_contraction; box.line[0].point[0].y = dstY + polygon_contraction; box.line[0].point[1].x = dstX + width - polygon_contraction; box.line[0].point[1].y = dstY + polygon_contraction; box.line[0].point[2].x = dstX + width - polygon_contraction; box.line[0].point[2].y = dstY + height - polygon_contraction; box.line[0].point[3].x = dstX + polygon_contraction; box.line[0].point[3].y = dstY + height - polygon_contraction; box.line[0].point[4].x = box.line[0].point[0].x; box.line[0].point[4].y = box.line[0].point[0].y; /* ** now draw the appropriate color/symbol/size combination */ /* Scalefactor will be infinity when SIZEUNITS is set in LAYER */ if (lp->sizeunits != MS_PIXELS) { lp->scalefactor = 1.0; } switch (type) { case MS_LAYER_POINT: marker.x = dstX + MS_NINT(width / 2.0); marker.y = dstY + MS_NINT(height / 2.0); if (theclass->keyimage != NULL) { int symbolNum; styleObj imgStyle; symbolObj *symbol = NULL; symbolNum = msAddImageSymbol(&(map->symbolset), msBuildPath(szPath, map->mappath, theclass->keyimage)); if (symbolNum == -1) { msSetError(MS_IMGERR, "Failed to open legend key image", "msCreateLegendIcon()"); return (MS_FAILURE); } symbol = map->symbolset.symbol[symbolNum]; initStyle(&imgStyle); /*set size so that symbol will be scaled properly #3296*/ if (width / symbol->sizex < height / symbol->sizey) imgStyle.size = symbol->sizey * (width / symbol->sizex); else imgStyle.size = symbol->sizey * (height / symbol->sizey); if (imgStyle.size > imgStyle.maxsize) imgStyle.maxsize = imgStyle.size; imgStyle.symbol = symbolNum; ret = msDrawMarkerSymbol(map, image_draw, &marker, &imgStyle, 1.0); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; /* TO DO: we may want to handle this differently depending on the relative * size of the keyimage */ } else { for (i = 0; i < theclass->numstyles; i++) { if (!scale_independant && map->scaledenom > 0) { styleObj *lp = theclass->styles[i]; if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } if (hittest && hittest->stylehits[i].status == 0) continue; ret = msDrawMarkerSymbol(map, image_draw, &marker, theclass->styles[i], lp->scalefactor * image->resolutionfactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } } break; case MS_LAYER_LINE: offset = 1; /* To set the offset, we only check the size/width parameter of the first * style */ if (theclass->numstyles > 0) { if (theclass->styles[0]->symbol > 0 && theclass->styles[0]->symbol < map->symbolset.numsymbols && map->symbolset.symbol[theclass->styles[0]->symbol]->type != MS_SYMBOL_SIMPLE) offset = theclass->styles[0]->size / 2; else offset = theclass->styles[0]->width / 2; } msInitShape(&zigzag); zigzag.line = &zigzag_line; zigzag.numlines = 1; zigzag.line[0].point = zigzag_point; zigzag.line[0].numpoints = 4; zigzag.type = MS_SHAPE_LINE; zigzag.line[0].point[0].x = dstX + offset; zigzag.line[0].point[0].y = dstY + height - offset; zigzag.line[0].point[1].x = dstX + MS_NINT(width / 3.0) - 1; zigzag.line[0].point[1].y = dstY + offset; zigzag.line[0].point[2].x = dstX + MS_NINT(2.0 * width / 3.0) - 1; zigzag.line[0].point[2].y = dstY + height - offset; zigzag.line[0].point[3].x = dstX + width - offset; zigzag.line[0].point[3].y = dstY + offset; for (i = 0; i < theclass->numstyles; i++) { if (!scale_independant && map->scaledenom > 0) { styleObj *lp = theclass->styles[i]; if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } if (hittest && hittest->stylehits[i].status == 0) continue; if (theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_NONE || theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT || theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (theclass->styles[i]->outlinewidth > 0) { /* Swap the style contents to render the outline first, * and then restore the style to render the interior of the line */ msOutlineRenderingPrepareStyle(theclass->styles[i], map, lp, image); ret = msDrawLineSymbol(map, image_draw, &zigzag, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); msOutlineRenderingRestoreStyle(theclass->styles[i], map, lp, image); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } ret = msDrawLineSymbol(map, image_draw, &zigzag, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } else { if (theclass->styles[i]->outlinewidth > 0) { /* Swap the style contents to render the outline first, * and then restore the style to render the interior of the line */ msOutlineRenderingPrepareStyle(theclass->styles[i], map, lp, image); ret = msDrawTransformedShape( map, image_draw, &zigzag, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); msOutlineRenderingRestoreStyle(theclass->styles[i], map, lp, image); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } ret = msDrawTransformedShape( map, image_draw, &zigzag, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } } break; case MS_LAYER_CIRCLE: case MS_LAYER_RASTER: case MS_LAYER_CHART: case MS_LAYER_POLYGON: for (i = 0; i < theclass->numstyles; i++) { if (!scale_independant && map->scaledenom > 0) { styleObj *lp = theclass->styles[i]; if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } if (hittest && hittest->stylehits[i].status == 0) continue; if (theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_NONE || theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT || theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (MS_VALID_COLOR(theclass->styles[i]->mincolor)) { ret = msDrawGradientSymbol( renderer, image_draw, dstX + width / 2., dstY + height / 2.0, width - 2 * polygon_contraction, height - 2 * polygon_contraction, theclass->styles[i]); } else { ret = msDrawShadeSymbol(map, image_draw, &box, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); } if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } else { ret = msDrawTransformedShape(map, image_draw, &box, theclass->styles[i], lp->scalefactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } } break; default: return MS_FAILURE; break; } /* end symbol drawing */ /* handle label styles */ for (i = 0; i < theclass->numlabels; i++) { labelObj *l = theclass->labels[i]; if (!scale_independant && map->scaledenom > 0) { if (msScaleInBounds(map->scaledenom, l->minscaledenom, l->maxscaledenom)) { int j; for (j = 0; j < l->numstyles; j++) { styleObj *s = l->styles[j]; marker.x = dstX + MS_NINT(width / 2.0); marker.y = dstY + MS_NINT(height / 2.0); if (s->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { ret = msDrawMarkerSymbol(map, image_draw, &marker, s, lp->scalefactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } } } } } /* handle "pure" text layers, i.e. layers with no symbology */ hasmarkersymbol = 0; if (theclass->numstyles == 0) { for (i = 0; i < theclass->numlabels; i++) { labelObj *l = theclass->labels[i]; if (!scale_independant && map->scaledenom > 0) { if (msScaleInBounds(map->scaledenom, l->minscaledenom, l->maxscaledenom)) { int j; for (j = 0; j < l->numstyles; j++) { styleObj *s = l->styles[j]; if (s->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { hasmarkersymbol = 1; } } } } } } else { hasmarkersymbol = 1; } if (!hasmarkersymbol && theclass->numlabels > 0) { textSymbolObj ts; pointObj textstartpt; marker.x = dstX + MS_NINT(width / 2.0); marker.y = dstY + MS_NINT(height / 2.0); initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString( &ts, theclass->labels[0], msStrdup("Az"), lp->scalefactor * image_draw->resolutionfactor, image_draw->resolutionfactor, duplicate_always); ts.label->size = height - 1; ts.rotation = 0; ret = msComputeTextPath(map, &ts); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; textstartpt = get_metrics(&marker, MS_CC, ts.textpath, 0, 0, 0, 0, NULL); ret = msDrawTextSymbol(map, image_draw, textstartpt, &ts); freeTextSymbol(&ts); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } /* handle an outline if necessary */ if (MS_VALID_COLOR(map->legend.outlinecolor)) { initStyle(&outline_style); outline_style.color = map->legend.outlinecolor; ret = msDrawLineSymbol(map, image_draw, &box, &outline_style, image_draw->resolutionfactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; /* reset clipping rectangle */ if (renderer->supports_clipping) renderer->resetClip(image_draw); } if (altFormat) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image); rendererVTableObj *altrenderer = MS_IMAGE_RENDERER(image_draw); rasterBufferObj rb; memset(&rb, 0, sizeof(rasterBufferObj)); ret = altrenderer->getRasterBufferHandle(image_draw, &rb); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; ret = renderer->mergeRasterBuffer( image, &rb, ((lp->compositer) ? lp->compositer->opacity * 0.01 : 1.0), 0, 0, 0, 0, rb.width, rb.height); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; /* * hack to work around bug #3834: if we have use an alternate renderer, the * symbolset may contain symbols that reference it. We want to remove those * references before the altFormat is destroyed to avoid a segfault and/or a * leak, and so the the main renderer doesn't pick the cache up thinking * it's for him. */ for (i = 0; i < map->symbolset.numsymbols; i++) { if (map->symbolset.symbol[i] != NULL) { symbolObj *s = map->symbolset.symbol[i]; if (s->renderer == altrenderer) { altrenderer->freeSymbol(s); s->renderer = NULL; } } } } else if (image != image_draw) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw); rasterBufferObj rb; memset(&rb, 0, sizeof(rasterBufferObj)); ret = renderer->getRasterBufferHandle(image_draw, &rb); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; ret = renderer->mergeRasterBuffer( image, &rb, ((lp->compositer) ? lp->compositer->opacity * 0.01 : 1.0), 0, 0, 0, 0, rb.width, rb.height); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; /* deref and possibly free temporary transparent output format. */ msApplyOutputFormat(&transFormat, NULL, MS_NOOVERRIDE); } legend_icon_cleanup: if (image != image_draw) { msFreeImage(image_draw); } return ret; } imageObj *msCreateLegendIcon(mapObj *map, layerObj *lp, classObj *class, int width, int height, int scale_independant) { imageObj *image; outputFormatObj *format = NULL; rendererVTableObj *renderer = MS_MAP_RENDERER(map); if (!renderer) { msSetError(MS_MISCERR, "invalid map outputformat", "msCreateLegendIcon()"); return (NULL); } /* ensure we have an image format representing the options for the legend */ msApplyOutputFormat(&format, map->outputformat, map->legend.transparent); image = msImageCreate(width, height, format, map->web.imagepath, map->web.imageurl, map->resolution, map->defresolution, &(map->legend.imagecolor)); /* drop this reference to output format */ msApplyOutputFormat(&format, NULL, MS_NOOVERRIDE); if (image == NULL) { msSetError(MS_IMGERR, "Unable to initialize image.", "msCreateLegendIcon()"); return (NULL); } image->map = map; /* Call drawLegendIcon with destination (0, 0) */ /* Return an empty image if lp==NULL || class=NULL */ /* (If class is NULL draw the legend for all classes. Modifications done */ /* Fev 2004 by AY) */ if (lp) { if (class) { if (MS_UNLIKELY(MS_FAILURE == msDrawLegendIcon(map, lp, class, width, height, image, 0, 0, scale_independant, NULL))) { msFreeImage(image); return NULL; } } else { for (int i = 0; i < lp->numclasses; i++) { if (MS_UNLIKELY(MS_FAILURE == msDrawLegendIcon(map, lp, lp->class[i], width, height, image, 0, 0, scale_independant, NULL))) { msFreeImage(image); return NULL; } } } } return image; } /* * Calculates the optimal size for the legend. If the optional layerObj * argument is given, the legend size will be calculated for only that * layer. Otherwise, the legend size is calculated for all layers that * are not MS_OFF or of MS_LAYER_QUERY type. * * Returns one of: * MS_SUCCESS * MS_FAILURE */ int msLegendCalcSize(mapObj *map, int scale_independent, int *size_x, int *size_y, int *layer_index, int num_layers, map_hittest *hittest, double resolutionfactor) { int i, j; int status, maxwidth = 0, nLegendItems = 0; char *text; layerObj *lp; rectObj rect; int current_layers = 0; /* reset sizes */ *size_x = 0; *size_y = 0; /* enable scale-dependent calculations */ if (!scale_independent) { map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); status = msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scaledenom); if (status != MS_SUCCESS) return MS_FAILURE; } /* * step through all map classes, and for each one that will be displayed * calculate the label size */ if (layer_index != NULL && num_layers > 0) current_layers = num_layers; else current_layers = map->numlayers; for (i = 0; i < current_layers; i++) { int layerindex; if (layer_index != NULL && num_layers > 0) layerindex = layer_index[i]; else layerindex = map->layerorder[i]; lp = (GET_LAYER(map, layerindex)); if ((lp->status == MS_OFF && (layer_index == NULL || num_layers <= 0)) || (lp->type == MS_LAYER_QUERY)) /* skip it */ continue; if (hittest && hittest->layerhits[layerindex].status == 0) continue; if (!scale_independent && map->scaledenom > 0) { if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } for (j = lp->numclasses - 1; j >= 0; j--) { textSymbolObj ts; text = lp->class[j]->title ? lp->class[j]->title : lp->class[j]->name; /* point to the right legend text, title takes precedence */ if (!text) continue; /* skip it */ /* skip the class if the classgroup is defined */ if (lp->classgroup && (lp->class[j] -> group == NULL || strcasecmp(lp->class[j] -> group, lp -> classgroup) != 0)) continue; /* verify class scale */ if (!scale_independent && map->scaledenom > 0) { if ((lp->class[j] -> maxscaledenom > 0) && (map->scaledenom > lp->class[j] -> maxscaledenom)) continue; if ((lp->class[j] -> minscaledenom > 0) && (map->scaledenom <= lp->class[j] -> minscaledenom)) continue; } if (hittest && hittest->layerhits[layerindex].classhits[j].status == 0) continue; if (*text) { initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString(&ts, &map->legend.label, msStrdup(text), resolutionfactor, resolutionfactor, 0); if (MS_UNLIKELY(MS_FAILURE == msGetTextSymbolSize(map, &ts, &rect))) { freeTextSymbol(&ts); return MS_FAILURE; } freeTextSymbol(&ts); maxwidth = MS_MAX(maxwidth, MS_NINT(rect.maxx - rect.minx)); *size_y += MS_MAX(MS_NINT(rect.maxy - rect.miny), map->legend.keysizey); } else { *size_y += map->legend.keysizey; } nLegendItems++; } } /* Calculate the size of the legend: */ /* - account for the Y keyspacing */ *size_y += (2 * VMARGIN) + ((nLegendItems - 1) * map->legend.keyspacingy); /* - determine the legend width */ *size_x = (2 * HMARGIN) + maxwidth + map->legend.keyspacingx + map->legend.keysizex; if (*size_y <= 0 || *size_x <= 0) return MS_FAILURE; return MS_SUCCESS; } /* ** Creates a GD image of a legend for a specific map. msDrawLegend() ** respects the current scale, and classes without a name are not ** added to the legend. ** ** scale_independent is used for WMS GetLegendGraphic. It should be set to ** MS_FALSE in most cases. If it is set to MS_TRUE then the layers' minscale ** and maxscale are ignored and layers that are currently out of scale still ** show up in the legend. */ imageObj *msDrawLegend(mapObj *map, int scale_independent, map_hittest *hittest) { int i, j, ret = MS_SUCCESS; /* loop counters */ pointObj pnt; int size_x, size_y = 0; layerObj *lp; rectObj rect; imageObj *image = NULL; outputFormatObj *format = NULL; char *text; struct legend_struct { int height; textSymbolObj ts; int layerindex, classindex; struct legend_struct *pred; }; typedef struct legend_struct legendlabel; legendlabel *head = NULL; if (!MS_RENDERER_PLUGIN(map->outputformat)) { msSetError(MS_MISCERR, "unsupported output format", "msDrawLegend()"); return NULL; } if (msValidateContexts(map) != MS_SUCCESS) return NULL; /* make sure there are no recursive REQUIRES or LABELREQUIRES expressions */ if (msLegendCalcSize(map, scale_independent, &size_x, &size_y, NULL, 0, hittest, map->resolution / map->defresolution) != MS_SUCCESS) return NULL; /* * step through all map classes, and for each one that will be displayed * keep a reference to its label size and text */ for (i = 0; i < map->numlayers; i++) { lp = (GET_LAYER(map, map->layerorder[i])); if ((lp->status == MS_OFF) || (lp->type == MS_LAYER_QUERY)) /* skip it */ continue; if (hittest && hittest->layerhits[map->layerorder[i]].status == 0) continue; if (!scale_independent && map->scaledenom > 0) { if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } if (!scale_independent && lp->maxscaledenom <= 0 && lp->minscaledenom <= 0) { if ((lp->maxgeowidth > 0) && ((map->extent.maxx - map->extent.minx) > lp->maxgeowidth)) continue; if ((lp->mingeowidth > 0) && ((map->extent.maxx - map->extent.minx) < lp->mingeowidth)) continue; } /* set the scale factor so that scale dependent symbols are drawn in the * legend with their default size */ if (lp->sizeunits != MS_PIXELS) { map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); lp->scalefactor = (msInchesPerUnit(lp->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / map->cellsize; } for (j = lp->numclasses - 1; j >= 0; j--) { text = lp->class[j]->title ? lp->class[j]->title : lp->class[j]->name; /* point to the right legend text, title takes precedence */ if (!text) continue; /* skip it */ /* skip the class if the classgroup is defined */ if (lp->classgroup && (lp->class[j] -> group == NULL || strcasecmp(lp->class[j] -> group, lp -> classgroup) != 0)) continue; if (!scale_independent && map->scaledenom > 0) { /* verify class scale here */ if ((lp->class[j] -> maxscaledenom > 0) && (map->scaledenom > lp->class[j] -> maxscaledenom)) continue; if ((lp->class[j] -> minscaledenom > 0) && (map->scaledenom <= lp->class[j] -> minscaledenom)) continue; } if (hittest && hittest->layerhits[map->layerorder[i]].classhits[j].status == 0) { continue; } legendlabel *cur = (legendlabel *)msSmallMalloc(sizeof(legendlabel)); initTextSymbol(&cur->ts); if (*text) { msPopulateTextSymbolForLabelAndString( &cur->ts, &map->legend.label, msStrdup(text), map->resolution / map->defresolution, map->resolution / map->defresolution, 0); if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, &cur->ts))) { ret = MS_FAILURE; goto cleanup; } if (MS_UNLIKELY(MS_FAILURE == msGetTextSymbolSize(map, &cur->ts, &rect))) { ret = MS_FAILURE; goto cleanup; } cur->height = MS_MAX(MS_NINT(rect.maxy - rect.miny), map->legend.keysizey); } else { cur->height = map->legend.keysizey; } cur->classindex = j; cur->layerindex = map->layerorder[i]; cur->pred = head; head = cur; } } /* ensure we have an image format representing the options for the legend. */ msApplyOutputFormat(&format, map->outputformat, map->legend.transparent); /* initialize the legend image */ image = msImageCreate(size_x, size_y, format, map->web.imagepath, map->web.imageurl, map->resolution, map->defresolution, &map->legend.imagecolor); if (!image) { msSetError(MS_MISCERR, "Unable to initialize image.", "msDrawLegend()"); return NULL; } image->map = map; /* image = * renderer->createImage(size_x,size_y,format,&(map->legend.imagecolor)); */ /* drop this reference to output format */ msApplyOutputFormat(&format, NULL, MS_NOOVERRIDE); pnt.y = VMARGIN; pnt.x = HMARGIN + map->legend.keysizex + map->legend.keyspacingx; while (head) { /* head initially points on the last legend item, i.e. the one that should be at the top */ legendlabel *cur = head; class_hittest *ch = NULL; /* set the scale factor so that scale dependent symbols are drawn in the * legend with their default size */ if (map->layers[cur->layerindex]->sizeunits != MS_PIXELS) { map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); map->layers[cur->layerindex]->scalefactor = (msInchesPerUnit(map->layers[cur->layerindex]->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / map->cellsize; } if (hittest) { ch = &hittest->layerhits[cur->layerindex].classhits[cur->classindex]; } ret = msDrawLegendIcon(map, map->layers[cur->layerindex], map->layers[cur->layerindex]->class[cur->classindex], map -> legend.keysizex, map->legend.keysizey, image, HMARGIN, (int)pnt.y, scale_independent, ch); if (MS_UNLIKELY(ret != MS_SUCCESS)) goto cleanup; pnt.y += cur->height; if (cur->ts.annotext) { pointObj textPnt = pnt; textPnt.y -= cur->ts.textpath->bounds.bbox.maxy; textPnt.y += map->legend.label.offsety; textPnt.x += map->legend.label.offsetx; ret = msDrawTextSymbol(map, image, textPnt, &cur->ts); if (MS_UNLIKELY(ret == MS_FAILURE)) goto cleanup; /* Coverity Scan is confused by label refcount, and wrongly believe we */ /* might free &map->legend.label, so make it clear we won't */ freeTextSymbolEx(&cur->ts, MS_FALSE); MS_REFCNT_DECR(cur->ts.label); } pnt.y += map->legend.keyspacingy; /* bump y for next label */ /* clean up */ head = cur->pred; free(cur); } /* next legend */ cleanup: while (head) { legendlabel *cur = head; /* Coverity Scan is confused by label refcount, and wrongly believe we */ /* might free &map->legend.label, so make it clear we won't */ freeTextSymbolEx(&cur->ts, MS_FALSE); MS_REFCNT_DECR(cur->ts.label); head = cur->pred; free(cur); } if (MS_UNLIKELY(ret != MS_SUCCESS)) { if (image) msFreeImage(image); return NULL; } return (image); } /* TODO */ int msEmbedLegend(mapObj *map, imageObj *img) { pointObj point; imageObj *image = NULL; symbolObj *legendSymbol; char *imageType = NULL; const char *const LEGEND_SYMBOL_NAME = "legend"; rendererVTableObj *renderer; int symbolIdx = msGetSymbolIndex(&(map->symbolset), LEGEND_SYMBOL_NAME, MS_FALSE); if (symbolIdx != -1) msRemoveSymbol(&(map->symbolset), symbolIdx); /* solves some caching issues in AGG with long-running processes */ if (msGrowSymbolSet(&map->symbolset) == NULL) return -1; symbolIdx = map->symbolset.numsymbols; legendSymbol = map->symbolset.symbol[symbolIdx]; map->symbolset.numsymbols++; initSymbol(legendSymbol); if (!MS_RENDERER_PLUGIN(map->outputformat) || !MS_MAP_RENDERER(map)->supports_pixel_buffer) { imageType = msStrdup(map->imagetype); /* save format */ if MS_DRIVER_CAIRO (map->outputformat) map->outputformat = msSelectOutputFormat(map, "cairopng"); else map->outputformat = msSelectOutputFormat(map, "png"); msInitializeRendererVTable(map->outputformat); } renderer = MS_MAP_RENDERER(map); /* render the legend. */ image = msDrawLegend(map, MS_FALSE, NULL); if (image == NULL) { msFree(imageType); return MS_FAILURE; } if (imageType) { map->outputformat = msSelectOutputFormat(map, imageType); /* restore format */ msFree(imageType); } /* copy renderered legend image into symbol */ legendSymbol->pixmap_buffer = calloc(1, sizeof(rasterBufferObj)); MS_CHECK_ALLOC(legendSymbol->pixmap_buffer, sizeof(rasterBufferObj), MS_FAILURE); if (MS_SUCCESS != renderer->getRasterBufferCopy(image, legendSymbol->pixmap_buffer)) return MS_FAILURE; legendSymbol->renderer = renderer; msFreeImage(image); if (!legendSymbol->pixmap_buffer) return (MS_FAILURE); /* something went wrong creating scalebar */ legendSymbol->type = MS_SYMBOL_PIXMAP; /* initialize a few things */ legendSymbol->name = msStrdup(LEGEND_SYMBOL_NAME); legendSymbol->sizex = legendSymbol->pixmap_buffer->width; legendSymbol->sizey = legendSymbol->pixmap_buffer->height; /* I'm not too sure this test is sufficient ... NFW. */ /* if(map->legend.transparent == MS_ON) */ /* gdImageColorTransparent(legendSymbol->img_deprecated, 0); */ switch (map->legend.position) { case (MS_LL): point.x = MS_NINT(legendSymbol->sizex / 2.0); point.y = map->height - MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_LR): point.x = map->width - MS_NINT(legendSymbol->sizex / 2.0); point.y = map->height - MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_LC): point.x = MS_NINT(map->width / 2.0); point.y = map->height - MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_UR): point.x = map->width - MS_NINT(legendSymbol->sizex / 2.0); point.y = MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_UL): point.x = MS_NINT(legendSymbol->sizex / 2.0); point.y = MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_UC): point.x = MS_NINT(map->width / 2.0); point.y = MS_NINT(legendSymbol->sizey / 2.0); break; } const char *const EMBED_LEGEND_LAYER_NAME = "__embed__legend"; int layerIdx = msGetLayerIndex(map, EMBED_LEGEND_LAYER_NAME); if (layerIdx == -1) { if (msGrowMapLayers(map) == NULL) return (-1); layerIdx = map->numlayers; map->numlayers++; layerObj *layer = GET_LAYER(map, layerIdx); if (initLayer(layer, map) == -1) return (-1); layer->name = msStrdup(EMBED_LEGEND_LAYER_NAME); layer->type = MS_LAYER_POINT; if (msGrowLayerClasses(layer) == NULL) return (-1); if (initClass(layer->class[0]) == -1) return (-1); layer->numclasses = 1; /* so we make sure to free it */ /* update the layer order list with the layer's index. */ map->layerorder[layerIdx] = layerIdx; } layerObj *layer = GET_LAYER(map, layerIdx); layer->status = MS_ON; classObj *klass = layer->class[0]; if (map->legend.postlabelcache) { /* add it directly to the image */ if (MS_UNLIKELY(msMaybeAllocateClassStyle(klass, 0) == MS_FAILURE)) return MS_FAILURE; klass->styles[0]->symbol = symbolIdx; if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, img, &point, klass->styles[0], 1.0))) return MS_FAILURE; } else { if (!klass->labels) { if (msGrowClassLabels(klass) == NULL) return MS_FAILURE; labelObj *label = klass->labels[0]; initLabel(label); klass->numlabels = 1; label->force = MS_TRUE; label->size = MS_MEDIUM; /* must set a size to have a valid label definition */ label->priority = MS_MAX_LABEL_PRIORITY; } labelObj *label = klass->labels[0]; if (label->numstyles == 0) { if (msGrowLabelStyles(label) == NULL) return (MS_FAILURE); label->numstyles = 1; initStyle(label->styles[0]); label->styles[0]->_geomtransform.type = MS_GEOMTRANSFORM_LABELPOINT; } label->styles[0]->symbol = symbolIdx; if (MS_UNLIKELY(MS_FAILURE == msAddLabel(map, img, label, layerIdx, 0, NULL, &point, -1, NULL))) return MS_FAILURE; } /* Mark layer as deleted so that it doesn't interfere with html legends or * with saving maps */ layer->status = MS_DELETE; return MS_SUCCESS; } mapserver-8.4.0/src/maplexer.c000066400000000000000000005566521474174441300163330ustar00rootroot00000000000000#line 2 "src/maplexer.c" #line 4 "src/maplexer.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define yy_create_buffer msyy_create_buffer #define yy_delete_buffer msyy_delete_buffer #define yy_scan_buffer msyy_scan_buffer #define yy_scan_string msyy_scan_string #define yy_scan_bytes msyy_scan_bytes #define yy_init_buffer msyy_init_buffer #define yy_flush_buffer msyy_flush_buffer #define yy_load_buffer_state msyy_load_buffer_state #define yy_switch_to_buffer msyy_switch_to_buffer #define yypush_buffer_state msyypush_buffer_state #define yypop_buffer_state msyypop_buffer_state #define yyensure_buffer_stack msyyensure_buffer_stack #define yy_flex_debug msyy_flex_debug #define yyin msyyin #define yyleng msyyleng #define yylex msyylex #define yylineno msyylineno #define yyout msyyout #define yyrestart msyyrestart #define yytext msyytext #define yywrap msyywrap #define yyalloc msyyalloc #define yyrealloc msyyrealloc #define yyfree msyyfree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif #ifdef yy_create_buffer #define msyy_create_buffer_ALREADY_DEFINED #else #define yy_create_buffer msyy_create_buffer #endif #ifdef yy_delete_buffer #define msyy_delete_buffer_ALREADY_DEFINED #else #define yy_delete_buffer msyy_delete_buffer #endif #ifdef yy_scan_buffer #define msyy_scan_buffer_ALREADY_DEFINED #else #define yy_scan_buffer msyy_scan_buffer #endif #ifdef yy_scan_string #define msyy_scan_string_ALREADY_DEFINED #else #define yy_scan_string msyy_scan_string #endif #ifdef yy_scan_bytes #define msyy_scan_bytes_ALREADY_DEFINED #else #define yy_scan_bytes msyy_scan_bytes #endif #ifdef yy_init_buffer #define msyy_init_buffer_ALREADY_DEFINED #else #define yy_init_buffer msyy_init_buffer #endif #ifdef yy_flush_buffer #define msyy_flush_buffer_ALREADY_DEFINED #else #define yy_flush_buffer msyy_flush_buffer #endif #ifdef yy_load_buffer_state #define msyy_load_buffer_state_ALREADY_DEFINED #else #define yy_load_buffer_state msyy_load_buffer_state #endif #ifdef yy_switch_to_buffer #define msyy_switch_to_buffer_ALREADY_DEFINED #else #define yy_switch_to_buffer msyy_switch_to_buffer #endif #ifdef yypush_buffer_state #define msyypush_buffer_state_ALREADY_DEFINED #else #define yypush_buffer_state msyypush_buffer_state #endif #ifdef yypop_buffer_state #define msyypop_buffer_state_ALREADY_DEFINED #else #define yypop_buffer_state msyypop_buffer_state #endif #ifdef yyensure_buffer_stack #define msyyensure_buffer_stack_ALREADY_DEFINED #else #define yyensure_buffer_stack msyyensure_buffer_stack #endif #ifdef yylex #define msyylex_ALREADY_DEFINED #else #define yylex msyylex #endif #ifdef yyrestart #define msyyrestart_ALREADY_DEFINED #else #define yyrestart msyyrestart #endif #ifdef yylex_init #define msyylex_init_ALREADY_DEFINED #else #define yylex_init msyylex_init #endif #ifdef yylex_init_extra #define msyylex_init_extra_ALREADY_DEFINED #else #define yylex_init_extra msyylex_init_extra #endif #ifdef yylex_destroy #define msyylex_destroy_ALREADY_DEFINED #else #define yylex_destroy msyylex_destroy #endif #ifdef yyget_debug #define msyyget_debug_ALREADY_DEFINED #else #define yyget_debug msyyget_debug #endif #ifdef yyset_debug #define msyyset_debug_ALREADY_DEFINED #else #define yyset_debug msyyset_debug #endif #ifdef yyget_extra #define msyyget_extra_ALREADY_DEFINED #else #define yyget_extra msyyget_extra #endif #ifdef yyset_extra #define msyyset_extra_ALREADY_DEFINED #else #define yyset_extra msyyset_extra #endif #ifdef yyget_in #define msyyget_in_ALREADY_DEFINED #else #define yyget_in msyyget_in #endif #ifdef yyset_in #define msyyset_in_ALREADY_DEFINED #else #define yyset_in msyyset_in #endif #ifdef yyget_out #define msyyget_out_ALREADY_DEFINED #else #define yyget_out msyyget_out #endif #ifdef yyset_out #define msyyset_out_ALREADY_DEFINED #else #define yyset_out msyyset_out #endif #ifdef yyget_leng #define msyyget_leng_ALREADY_DEFINED #else #define yyget_leng msyyget_leng #endif #ifdef yyget_text #define msyyget_text_ALREADY_DEFINED #else #define yyget_text msyyget_text #endif #ifdef yyget_lineno #define msyyget_lineno_ALREADY_DEFINED #else #define yyget_lineno msyyget_lineno #endif #ifdef yyset_lineno #define msyyset_lineno_ALREADY_DEFINED #else #define yyset_lineno msyyset_lineno #endif #ifdef yywrap #define msyywrap_ALREADY_DEFINED #else #define yywrap msyywrap #endif #ifdef yyalloc #define msyyalloc_ALREADY_DEFINED #else #define yyalloc msyyalloc #endif #ifdef yyrealloc #define msyyrealloc_ALREADY_DEFINED #else #define yyrealloc msyyrealloc #endif #ifdef yyfree #define msyyfree_ALREADY_DEFINED #else #define yyfree msyyfree #endif #ifdef yytext #define msyytext_ALREADY_DEFINED #else #define yytext msyytext #endif #ifdef yyleng #define msyyleng_ALREADY_DEFINED #else #define yyleng msyyleng #endif #ifdef yyin #define msyyin_ALREADY_DEFINED #else #define yyin msyyin #endif #ifdef yyout #define msyyout_ALREADY_DEFINED #else #define yyout msyyout #endif #ifdef yy_flex_debug #define msyy_flex_debug_ALREADY_DEFINED #else #define yy_flex_debug msyy_flex_debug #endif #ifdef yylineno #define msyylineno_ALREADY_DEFINED #else #define yylineno msyylineno #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart ( FILE *input_file ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); void yy_delete_buffer ( YY_BUFFER_STATE b ); void yy_flush_buffer ( YY_BUFFER_STATE b ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); void yypop_buffer_state ( void ); static void yyensure_buffer_stack ( void ); static void yy_load_buffer_state ( void ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); void *yyalloc ( yy_size_t ); void *yyrealloc ( void *, yy_size_t ); void yyfree ( void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ typedef flex_uint8_t YY_CHAR; FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #ifdef yytext_ptr #undef yytext_ptr #endif #define yytext_ptr yytext static yy_state_type yy_get_previous_state ( void ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); static int yy_get_next_buffer ( void ); static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 345 #define YY_END_OF_BUFFER 346 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static const flex_int16_t yy_accept[1737] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346, 343, 1, 341, 334, 2, 343, 343, 327, 340, 327, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 343, 343, 343, 344, 1, 342, 1, 14, 339, 344, 339, 344, 328, 328, 18, 15, 17, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 342, 21, 342, 345, 1, 345, 345, 337, 335, 335, 336, 5, 7, 6, 340, 340, 340, 340, 340, 1, 2, 0, 332, 327, 327, 340, 327, 340, 0, 3, 340, 2, 327, 0, 340, 340, 340, 340, 340, 340, 340, 340, 244, 340, 340, 340, 248, 340, 249, 340, 340, 254, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 268, 340, 340, 271, 272, 340, 340, 340, 340, 340, 340, 340, 340, 340, 284, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 223, 340, 340, 311, 312, 340, 313, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 0, 320, 0, 333, 0, 16, 0, 13, 0, 328, 328, 328, 0, 328, 0, 20, 22, 15, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 19, 17, 24, 0, 20, 0, 18, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 0, 0, 329, 23, 0, 338, 0, 337, 335, 335, 336, 5, 4, 2, 340, 340, 340, 340, 327, 0, 0, 340, 327, 0, 331, 340, 331, 2, 2, 2, 327, 0, 0, 327, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 250, 340, 340, 340, 340, 340, 340, 340, 340, 88, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 103, 340, 340, 340, 340, 340, 340, 340, 340, 263, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 142, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 281, 282, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 305, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 234, 318, 340, 236, 319, 340, 68, 0, 0, 0, 0, 0, 328, 328, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 340, 9, 340, 340, 327, 330, 330, 2, 2, 0, 327, 340, 340, 340, 340, 340, 239, 340, 340, 340, 340, 340, 340, 340, 243, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 83, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 258, 340, 340, 340, 340, 98, 340, 340, 340, 102, 340, 340, 340, 105, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 121, 340, 340, 340, 340, 340, 340, 340, 340, 340, 269, 340, 270, 340, 145, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 175, 340, 279, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 207, 340, 340, 340, 340, 340, 340, 340, 218, 340, 307, 340, 340, 340, 340, 309, 228, 340, 340, 340, 340, 340, 340, 340, 340, 340, 237, 325, 0, 328, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 326, 340, 10, 340, 2, 61, 340, 63, 340, 340, 240, 340, 340, 241, 340, 340, 340, 340, 340, 340, 246, 340, 72, 340, 76, 340, 340, 340, 340, 340, 340, 84, 340, 340, 340, 340, 256, 86, 340, 89, 340, 340, 257, 340, 340, 340, 340, 340, 340, 340, 100, 340, 340, 260, 340, 340, 108, 261, 340, 340, 110, 340, 340, 118, 340, 340, 186, 340, 340, 340, 340, 340, 125, 267, 340, 135, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 276, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 277, 340, 252, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 291, 340, 340, 340, 340, 340, 340, 340, 340, 295, 340, 340, 340, 340, 340, 340, 340, 340, 298, 299, 200, 340, 340, 340, 340, 340, 340, 303, 340, 340, 210, 340, 216, 340, 340, 340, 340, 222, 340, 340, 340, 340, 314, 229, 340, 340, 340, 340, 340, 340, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 43, 0, 0, 0, 31, 42, 0, 29, 0, 0, 0, 0, 30, 0, 0, 0, 0, 340, 340, 340, 340, 340, 340, 340, 340, 242, 340, 70, 245, 340, 247, 340, 340, 340, 340, 340, 79, 340, 80, 340, 340, 340, 340, 340, 85, 340, 340, 340, 340, 91, 340, 94, 95, 340, 259, 340, 97, 340, 340, 340, 340, 109, 264, 340, 340, 340, 340, 340, 265, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 134, 136, 137, 340, 340, 143, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 273, 340, 274, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 280, 176, 340, 340, 340, 340, 340, 340, 340, 340, 340, 290, 289, 294, 185, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 296, 340, 195, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 301, 302, 340, 304, 209, 340, 212, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 233, 317, 53, 34, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 50, 0, 0, 0, 8, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 75, 340, 340, 340, 340, 316, 340, 253, 340, 255, 340, 340, 340, 93, 340, 340, 99, 340, 340, 340, 340, 340, 340, 340, 340, 340, 117, 340, 340, 340, 340, 123, 340, 340, 340, 340, 340, 340, 340, 340, 340, 139, 340, 340, 146, 340, 340, 340, 340, 340, 340, 340, 340, 155, 340, 340, 340, 340, 340, 161, 340, 340, 340, 340, 340, 340, 171, 340, 340, 340, 340, 340, 177, 340, 178, 340, 340, 340, 340, 184, 340, 340, 292, 340, 293, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 221, 340, 340, 340, 340, 340, 230, 231, 340, 340, 0, 28, 0, 49, 41, 0, 0, 54, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 47, 0, 0, 321, 11, 340, 340, 340, 340, 340, 67, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 87, 340, 340, 340, 340, 340, 340, 340, 106, 340, 340, 340, 340, 116, 340, 340, 340, 122, 340, 340, 340, 340, 340, 340, 340, 340, 340, 140, 340, 340, 340, 340, 340, 340, 340, 340, 151, 340, 340, 158, 159, 160, 340, 340, 340, 340, 340, 168, 340, 340, 174, 278, 340, 340, 340, 340, 340, 340, 340, 183, 340, 340, 187, 340, 340, 189, 340, 340, 340, 193, 340, 340, 340, 340, 340, 197, 340, 202, 340, 340, 300, 340, 340, 340, 340, 340, 340, 340, 217, 115, 340, 220, 340, 340, 340, 308, 310, 315, 340, 0, 51, 0, 46, 33, 55, 0, 0, 0, 48, 36, 0, 27, 0, 0, 340, 340, 64, 340, 66, 340, 71, 340, 73, 340, 340, 78, 340, 59, 340, 340, 92, 340, 340, 340, 340, 107, 340, 113, 114, 112, 340, 120, 340, 340, 340, 340, 340, 128, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 154, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 60, 340, 194, 340, 340, 340, 340, 340, 340, 340, 206, 208, 211, 340, 215, 219, 224, 227, 340, 340, 0, 0, 0, 0, 0, 0, 39, 0, 0, 340, 238, 340, 340, 74, 58, 77, 81, 340, 90, 96, 283, 340, 340, 111, 119, 340, 124, 266, 126, 340, 340, 340, 340, 340, 340, 144, 147, 340, 340, 340, 340, 340, 340, 340, 340, 162, 340, 340, 340, 340, 340, 340, 340, 340, 340, 285, 340, 340, 340, 340, 340, 340, 251, 340, 190, 191, 340, 340, 196, 340, 198, 201, 203, 340, 205, 340, 340, 340, 232, 40, 35, 38, 45, 44, 37, 0, 0, 62, 340, 340, 340, 340, 340, 340, 340, 340, 127, 340, 340, 340, 340, 340, 148, 149, 153, 150, 340, 340, 340, 157, 163, 340, 170, 167, 340, 340, 173, 340, 286, 340, 340, 340, 340, 288, 306, 340, 192, 297, 340, 204, 213, 340, 226, 0, 0, 340, 69, 340, 340, 340, 101, 340, 340, 340, 340, 340, 138, 340, 340, 340, 156, 340, 340, 172, 340, 340, 180, 181, 182, 340, 340, 340, 340, 0, 0, 340, 340, 340, 199, 104, 262, 129, 131, 133, 340, 340, 152, 340, 169, 275, 287, 340, 340, 340, 340, 0, 0, 340, 340, 82, 340, 340, 340, 340, 166, 188, 164, 340, 225, 0, 322, 65, 340, 340, 340, 141, 165, 340, 323, 340, 340, 340, 214, 179, 340, 340, 130, 132, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 7, 1, 1, 8, 9, 10, 11, 12, 13, 1, 14, 15, 16, 17, 17, 18, 17, 17, 17, 17, 17, 17, 17, 1, 1, 19, 20, 21, 1, 1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 1, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 85, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[87] = { 0, 1, 1, 2, 1, 1, 3, 1, 1, 4, 1, 1, 5, 1, 6, 6, 6, 6, 6, 1, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 7, 1, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const flex_int16_t yy_base[1761] = { 0, 0, 0, 86, 0, 171, 172, 173, 177, 181, 182, 226, 0, 1082, 3985, 185, 3985, 3985, 0, 1013, 173, 296, 353, 310, 304, 353, 416, 359, 354, 421, 436, 356, 467, 156, 290, 474, 473, 354, 483, 532, 275, 533, 579, 585, 540, 374, 631, 0, 961, 907, 810, 3985, 193, 3985, 194, 820, 732, 751, 700, 184, 314, 611, 183, 188, 725, 424, 479, 521, 615, 280, 644, 575, 284, 299, 628, 624, 636, 306, 637, 355, 343, 367, 678, 157, 653, 687, 3985, 3985, 208, 687, 678, 0, 411, 418, 475, 0, 3985, 666, 661, 473, 477, 492, 484, 209, 0, 638, 616, 690, 704, 0, 706, 201, 603, 3985, 763, 849, 720, 203, 531, 759, 525, 649, 524, 645, 551, 686, 0, 685, 703, 687, 756, 755, 0, 686, 690, 0, 727, 725, 758, 769, 771, 754, 760, 766, 781, 769, 782, 836, 769, 771, 774, 841, 851, 823, 852, 843, 833, 856, 855, 856, 853, 845, 853, 897, 0, 897, 855, 0, 0, 900, 901, 913, 859, 901, 910, 914, 931, 920, 934, 939, 940, 922, 925, 926, 936, 940, 968, 969, 960, 967, 982, 959, 958, 981, 971, 984, 1008, 992, 974, 1003, 993, 989, 1003, 1014, 1025, 1011, 1039, 1025, 0, 0, 1033, 0, 1037, 1026, 1034, 1044, 1047, 1031, 1047, 1035, 1037, 1056, 534, 3985, 499, 493, 486, 3985, 487, 3985, 466, 1087, 1099, 1093, 316, 1103, 451, 3985, 3985, 3985, 3985, 1059, 1061, 1060, 1095, 1088, 1092, 1088, 1093, 1103, 1101, 1090, 1100, 1095, 1099, 1101, 3985, 1110, 1095, 1104, 1097, 3985, 1101, 3985, 1105, 1121, 1106, 1115, 1116, 1144, 1126, 1138, 1140, 420, 1163, 1168, 1159, 3985, 415, 274, 3985, 3985, 455, 3985, 444, 0, 3985, 3985, 3985, 0, 3985, 1221, 1154, 1210, 1156, 1163, 1184, 722, 189, 207, 326, 434, 1177, 1307, 1178, 627, 1393, 1479, 1226, 1178, 559, 724, 1186, 1208, 1213, 1211, 1218, 1213, 1218, 1226, 1228, 1230, 1222, 1213, 1231, 1218, 1219, 1222, 1238, 1223, 1224, 1229, 1230, 1294, 0, 1277, 1280, 1305, 1288, 1302, 1307, 1293, 1300, 0, 1301, 1299, 1313, 1300, 1300, 1301, 1310, 1304, 1313, 1306, 1307, 1383, 1315, 0, 1316, 1319, 1343, 1383, 1371, 1392, 1393, 1389, 0, 1392, 1392, 1396, 1382, 1398, 1392, 1392, 1393, 1400, 1393, 1405, 1404, 1400, 1408, 1410, 1395, 1411, 1444, 0, 1450, 1461, 1544, 1464, 1473, 1476, 1477, 1598, 1478, 1464, 1468, 1481, 1467, 1484, 1477, 1472, 0, 430, 1490, 1491, 1483, 1476, 1477, 1495, 1518, 1494, 1488, 1533, 1540, 1520, 1575, 1534, 1548, 1537, 1556, 1561, 1571, 1570, 1572, 1581, 1589, 1594, 1598, 1606, 1609, 1596, 1607, 1610, 1607, 1619, 1602, 1611, 0, 1624, 1617, 1616, 1614, 1632, 1615, 1635, 1650, 1644, 1658, 1656, 1657, 1649, 1663, 1665, 1661, 1653, 0, 0, 1654, 0, 0, 1659, 3985, 358, 522, 354, 573, 735, 799, 1680, 1687, 849, 871, 1680, 1672, 1682, 1671, 1681, 1676, 1680, 1683, 1701, 1698, 1689, 1709, 1692, 1695, 1702, 1712, 1700, 1716, 1718, 1723, 1719, 1723, 3985, 1724, 1713, 1718, 1718, 1720, 1716, 1734, 1738, 1739, 1739, 1729, 1740, 1752, 583, 1033, 1752, 1758, 0, 1751, 1764, 1010, 3985, 0, 1763, 1764, 1180, 1186, 1762, 1762, 1774, 1762, 1782, 327, 1778, 1767, 1776, 1767, 1789, 1772, 1788, 0, 1789, 1795, 1785, 1779, 1779, 1782, 1803, 1796, 1801, 1796, 1794, 1816, 1805, 1827, 1828, 1818, 1831, 1813, 1835, 1823, 1839, 1831, 1842, 1827, 0, 1845, 1846, 1845, 1838, 1836, 1851, 1853, 1858, 0, 1840, 1841, 1853, 1848, 1852, 1863, 1868, 1854, 1872, 1875, 1864, 1864, 1885, 1877, 1877, 0, 1892, 1887, 1894, 1888, 1894, 1902, 1894, 1894, 1908, 0, 1900, 1912, 1912, 0, 1900, 1905, 1912, 1918, 1919, 1915, 1925, 1911, 1947, 1930, 1927, 1918, 1938, 1929, 1938, 1938, 1941, 1947, 1954, 1960, 1964, 1957, 1971, 1967, 1966, 1958, 1968, 1967, 0, 1973, 0, 1982, 1986, 1964, 1976, 1974, 1988, 1977, 1992, 1999, 2004, 2000, 2017, 2010, 2000, 2003, 2017, 2005, 2024, 2009, 2025, 2028, 2009, 2032, 2033, 2021, 2026, 2022, 2043, 2036, 2034, 2027, 2044, 2048, 2051, 2042, 2054, 2048, 2051, 2045, 2059, 2056, 2059, 2076, 2067, 2078, 2077, 0, 2077, 0, 2082, 2074, 2076, 2084, 2079, 0, 2086, 2082, 2102, 2084, 2087, 2103, 2103, 2094, 2102, 0, 3985, 1257, 1307, 3985, 2101, 2111, 2114, 2112, 2121, 2106, 2119, 2128, 2121, 2134, 2131, 2139, 2125, 2128, 2131, 2148, 2136, 2137, 2138, 2138, 2142, 2143, 2150, 2159, 2153, 2146, 2150, 2161, 3985, 2152, 2162, 2176, 1360, 2174, 3985, 2169, 0, 2172, 0, 0, 2165, 0, 2183, 2175, 0, 2177, 2189, 0, 2203, 2190, 2202, 2192, 2193, 2210, 0, 2211, 2210, 2215, 2204, 2214, 2208, 2218, 2225, 2209, 2230, 0, 2220, 2214, 2216, 2217, 0, 0, 2230, 0, 2221, 2226, 0, 2225, 2245, 2234, 2252, 2237, 2261, 2250, 0, 2249, 2254, 0, 2270, 2255, 0, 0, 2260, 2274, 2292, 2265, 2281, 0, 2285, 2265, 0, 2277, 2289, 2266, 2292, 2289, 2324, 0, 2284, 0, 2283, 2303, 2313, 2304, 2304, 2325, 2307, 2315, 2334, 2325, 2321, 2332, 2342, 2347, 2323, 2349, 2339, 2350, 2342, 2355, 2338, 0, 2335, 2360, 2343, 2350, 2369, 2359, 2355, 2375, 2355, 2382, 2376, 2386, 0, 2376, 0, 2390, 2383, 2376, 2377, 2384, 2382, 2398, 2390, 2388, 2408, 2392, 2397, 2394, 2398, 2402, 2398, 2403, 2404, 2413, 2420, 2424, 2422, 2413, 2433, 2445, 2428, 2425, 2441, 2438, 2445, 2435, 2439, 2438, 0, 0, 2471, 2441, 2441, 2449, 2461, 2465, 2457, 0, 2467, 2457, 2469, 2467, 0, 2479, 2480, 2473, 2466, 0, 2493, 2492, 2492, 2475, 0, 0, 2485, 2508, 2494, 2515, 2498, 2501, 0, 2516, 2503, 2505, 2520, 2518, 2523, 2526, 2515, 2525, 2526, 2518, 3985, 2535, 2535, 2540, 2541, 3985, 2524, 2543, 2541, 3985, 3985, 2552, 3985, 2546, 2548, 2551, 2556, 3985, 2548, 1446, 2567, 2570, 2560, 2562, 2562, 2559, 2572, 2567, 2563, 2573, 0, 2582, 0, 0, 2569, 0, 2572, 2574, 2577, 2596, 2588, 0, 2593, 0, 2583, 2586, 2591, 2588, 2596, 0, 2610, 2603, 2599, 2613, 0, 2618, 0, 2615, 2612, 0, 2609, 0, 2615, 2631, 2616, 2633, 0, 0, 2625, 2626, 2642, 2619, 2627, 0, 2642, 2638, 2650, 2648, 2649, 2652, 2656, 2642, 2663, 2650, 2646, 2676, 2662, 0, 0, 2664, 2657, 2670, 2661, 2665, 2667, 2669, 2671, 2669, 2689, 2692, 2682, 2690, 2698, 2701, 2690, 2687, 0, 2689, 0, 2696, 2694, 2695, 2698, 2699, 2698, 2719, 2714, 2722, 2724, 2713, 2712, 2723, 2738, 0, 0, 2736, 327, 2717, 2727, 2742, 2742, 2739, 2739, 2734, 0, 0, 0, 0, 2750, 2747, 2747, 2745, 2760, 2765, 2748, 2750, 2751, 2759, 2774, 2756, 2768, 2767, 0, 2761, 2782, 2783, 2769, 2789, 2786, 2779, 2792, 2805, 2800, 0, 0, 2794, 0, 0, 2784, 2790, 2790, 2793, 2811, 2811, 2799, 2809, 2811, 2826, 2817, 2814, 2830, 2820, 2831, 2817, 0, 0, 3985, 3985, 2826, 2817, 2829, 2826, 2823, 2845, 2837, 2838, 3985, 2852, 2832, 2847, 2847, 2860, 2848, 3985, 2854, 2865, 2853, 2861, 2858, 3985, 2875, 2881, 288, 0, 2861, 2870, 2879, 2888, 2870, 2887, 2874, 2880, 2893, 2884, 2895, 0, 2891, 2887, 2892, 2904, 0, 2907, 0, 2903, 0, 2911, 2912, 2910, 0, 2907, 2926, 0, 2916, 2919, 2922, 2919, 2925, 2935, 2920, 2925, 2930, 0, 2940, 2936, 2945, 2946, 0, 2944, 2949, 2952, 2939, 2955, 2937, 2948, 2950, 2954, 0, 2960, 2966, 0, 2967, 2976, 2959, 2974, 2969, 2969, 2978, 2989, 0, 2986, 2984, 2989, 2998, 2996, 0, 2993, 3002, 2983, 3000, 2992, 3007, 0, 3004, 3003, 3008, 3012, 3007, 0, 3009, 0, 3007, 3026, 3016, 3017, 0, 3036, 3032, 0, 3025, 0, 3023, 3040, 3026, 3043, 3047, 3039, 3042, 3054, 3060, 3060, 3059, 3056, 3047, 3062, 3054, 3060, 3064, 3073, 3063, 3070, 3061, 3064, 3080, 3088, 3081, 3090, 3094, 3087, 0, 3098, 3086, 3089, 3106, 3108, 0, 0, 3096, 3109, 3110, 3985, 3101, 3985, 3985, 3107, 3103, 3985, 3109, 3106, 3118, 3985, 3125, 3124, 3115, 3111, 3128, 3132, 3985, 3142, 3131, 3985, 0, 3132, 3131, 3129, 3139, 3142, 0, 3143, 3144, 3142, 3153, 3162, 3168, 3170, 3161, 3175, 3160, 0, 3167, 3169, 3180, 3166, 3168, 3170, 3185, 0, 3176, 3190, 3188, 3193, 0, 3198, 3182, 3188, 0, 3189, 3187, 3200, 3196, 3197, 3196, 3198, 3202, 3206, 3212, 3202, 3205, 3221, 3219, 3234, 3220, 3235, 3243, 3241, 3225, 3248, 0, 0, 0, 3224, 3237, 3234, 3249, 3235, 3254, 3238, 3260, 0, 0, 3250, 3263, 3251, 3266, 3255, 3262, 3254, 0, 3270, 3260, 0, 3268, 3274, 0, 3273, 3275, 3280, 0, 3284, 3297, 3295, 3284, 3286, 0, 3291, 0, 3292, 3304, 0, 3299, 3286, 3305, 3295, 3302, 3318, 3300, 0, 0, 3298, 0, 3318, 3312, 3321, 0, 0, 0, 3312, 3315, 3985, 3329, 3985, 3985, 3985, 3307, 3314, 3323, 3985, 3325, 3346, 3985, 3337, 3340, 3334, 3341, 0, 3355, 0, 3348, 0, 3346, 0, 3362, 3350, 0, 3357, 0, 3353, 3360, 0, 3362, 3370, 3368, 3375, 0, 3364, 0, 0, 0, 3368, 0, 3366, 3380, 3369, 3384, 3390, 0, 3391, 3392, 3387, 3384, 3399, 3396, 3398, 3406, 3405, 3391, 3413, 0, 3401, 3416, 3414, 3404, 3424, 3427, 3428, 3415, 3435, 3432, 3429, 3419, 3434, 3430, 3441, 3427, 3437, 3446, 3438, 3448, 3451, 3445, 3455, 3452, 3448, 3462, 0, 3460, 0, 3456, 3452, 3459, 3463, 3465, 3468, 3480, 0, 0, 0, 3474, 0, 0, 3470, 0, 3478, 3481, 3492, 3493, 3494, 3481, 3481, 3485, 3985, 3496, 3490, 3486, 0, 3508, 3511, 0, 0, 0, 3498, 3506, 0, 0, 0, 3505, 3506, 0, 0, 3515, 0, 0, 0, 3507, 3532, 3533, 3517, 3537, 3517, 0, 0, 3540, 3528, 3540, 3538, 3552, 3540, 3552, 3552, 0, 3554, 3541, 3553, 3550, 3549, 3563, 3563, 3558, 3546, 0, 3564, 3559, 3555, 3576, 3561, 3562, 0, 3582, 0, 0, 3566, 3577, 0, 3594, 0, 0, 0, 3578, 0, 3592, 3586, 3583, 0, 3985, 3985, 3985, 3985, 3985, 3985, 3590, 3601, 0, 3592, 3592, 3599, 3591, 3603, 3607, 3604, 3603, 0, 3612, 3613, 3624, 3612, 3614, 0, 0, 0, 0, 3621, 3621, 3632, 0, 0, 3630, 0, 0, 3627, 3639, 0, 3640, 0, 3647, 3632, 3643, 3637, 0, 0, 3655, 0, 0, 3645, 0, 3657, 3653, 0, 3656, 3643, 3659, 0, 3654, 3661, 3664, 0, 3667, 3658, 3679, 3681, 3668, 0, 3682, 3687, 3682, 0, 3671, 3685, 0, 3680, 3689, 0, 0, 0, 3695, 3701, 3701, 3687, 3684, 3707, 3701, 3710, 3715, 0, 0, 0, 3717, 3719, 0, 3698, 3715, 0, 3726, 0, 0, 0, 3728, 3734, 3726, 3723, 3739, 285, 3727, 3731, 0, 3743, 3744, 3748, 3751, 0, 0, 0, 3742, 0, 273, 3985, 0, 3745, 3746, 3747, 0, 0, 3750, 3985, 3746, 3751, 3752, 0, 0, 3756, 3759, 0, 0, 3985, 3824, 3831, 3838, 3845, 3852, 309, 3859, 3866, 3873, 3880, 3887, 3894, 3901, 3908, 3914, 3921, 3928, 3935, 3942, 3949, 3956, 3963, 3970, 3977 } ; static const flex_int16_t yy_def[1761] = { 0, 1736, 1, 1736, 3, 1737, 1737, 1738, 1738, 1739, 1739, 1736, 11, 1736, 1736, 1736, 1736, 1736, 1740, 1741, 1736, 1742, 1743, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1744, 1745, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1747, 1736, 1736, 1736, 1736, 1736, 1748, 1749, 1750, 1736, 1736, 1736, 1751, 1736, 1736, 1742, 1742, 1742, 1742, 1742, 1736, 1740, 1741, 1741, 1736, 1736, 1742, 1742, 1742, 1752, 1736, 1753, 1754, 1736, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1744, 1736, 1745, 1745, 1736, 1736, 1755, 1736, 1756, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1746, 1736, 1747, 1757, 1736, 1736, 1748, 1736, 1749, 1750, 1736, 1736, 1736, 1751, 1736, 1758, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1742, 1742, 1752, 1736, 1753, 1742, 1759, 1754, 1758, 1736, 1736, 1736, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1755, 1755, 1756, 1756, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1757, 1757, 307, 1742, 1742, 1742, 1742, 1736, 1736, 1742, 1760, 307, 1736, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1736, 1742, 1742, 1742, 1760, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1746, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 0, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736 } ; static const flex_int16_t yy_nxt[4072] = { 0, 14, 15, 16, 15, 14, 17, 18, 14, 17, 19, 14, 14, 14, 20, 21, 22, 23, 23, 14, 14, 14, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 47, 48, 14, 14, 14, 14, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 47, 49, 14, 14, 14, 14, 14, 50, 14, 51, 52, 53, 54, 55, 56, 51, 57, 58, 51, 51, 51, 51, 59, 60, 51, 61, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 51, 72, 73, 51, 74, 51, 75, 76, 51, 51, 77, 78, 79, 80, 51, 81, 51, 51, 51, 82, 51, 51, 51, 83, 65, 66, 67, 68, 69, 70, 71, 51, 72, 73, 51, 74, 51, 75, 76, 51, 51, 77, 78, 79, 80, 51, 81, 51, 51, 51, 51, 84, 51, 85, 51, 51, 51, 86, 88, 88, 88, 88, 89, 89, 92, 90, 90, 93, 92, 96, 96, 93, 103, 107, 103, 108, 108, 160, 97, 97, 103, 103, 103, 103, 231, 238, 232, 232, 237, 227, 279, 516, 516, 239, 280, 103, 103, 103, 103, 298, 299, 310, 310, 300, 300, 311, 311, 94, 160, 300, 300, 94, 14, 15, 16, 15, 14, 17, 18, 14, 17, 14, 14, 14, 14, 14, 47, 98, 14, 14, 14, 14, 14, 47, 47, 99, 47, 100, 47, 47, 47, 47, 47, 47, 47, 101, 47, 47, 102, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 14, 14, 14, 14, 14, 47, 47, 99, 47, 100, 47, 47, 47, 47, 47, 47, 47, 101, 47, 47, 102, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 14, 14, 14, 14, 14, 14, 14, 14, 110, 110, 109, 161, 188, 251, 257, 162, 258, 111, 1726, 510, 116, 280, 108, 108, 467, 467, 233, 233, 468, 468, 1718, 117, 118, 1294, 119, 234, 1223, 266, 300, 300, 745, 120, 161, 188, 251, 257, 162, 258, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 112, 117, 118, 115, 119, 234, 112, 266, 112, 121, 174, 120, 153, 122, 271, 134, 154, 123, 135, 136, 155, 138, 139, 140, 175, 269, 124, 141, 270, 125, 214, 272, 137, 142, 215, 112, 112, 112, 466, 112, 121, 174, 464, 153, 122, 271, 134, 154, 123, 135, 136, 155, 138, 139, 140, 175, 269, 124, 141, 270, 125, 214, 272, 137, 142, 215, 112, 112, 112, 112, 112, 112, 112, 112, 126, 286, 127, 143, 634, 128, 129, 144, 287, 130, 302, 145, 131, 283, 146, 132, 133, 147, 149, 241, 148, 283, 150, 242, 471, 471, 151, 280, 472, 472, 277, 126, 286, 127, 143, 152, 128, 129, 144, 287, 130, 288, 145, 131, 288, 146, 132, 133, 147, 149, 241, 148, 156, 150, 242, 169, 163, 151, 164, 170, 165, 157, 158, 171, 166, 243, 152, 167, 159, 292, 176, 177, 293, 168, 294, 172, 466, 295, 178, 173, 179, 244, 180, 156, 288, 181, 169, 163, 697, 164, 170, 165, 157, 158, 171, 166, 243, 464, 167, 159, 292, 176, 177, 293, 168, 294, 172, 245, 295, 178, 173, 179, 244, 180, 182, 189, 181, 246, 183, 190, 247, 312, 184, 191, 208, 185, 317, 320, 186, 192, 462, 187, 464, 209, 225, 210, 311, 311, 245, 211, 225, 212, 697, 213, 223, 182, 189, 323, 246, 183, 190, 247, 312, 184, 191, 208, 185, 317, 320, 186, 192, 255, 187, 193, 209, 194, 210, 202, 195, 196, 211, 203, 212, 197, 213, 204, 256, 198, 323, 302, 199, 205, 200, 466, 206, 201, 235, 106, 232, 232, 301, 207, 255, 510, 193, 280, 194, 236, 202, 195, 196, 248, 203, 519, 197, 249, 204, 256, 198, 106, 227, 199, 205, 200, 259, 206, 201, 216, 217, 250, 262, 218, 207, 219, 260, 220, 252, 267, 236, 261, 221, 268, 248, 318, 253, 263, 249, 291, 264, 265, 321, 227, 290, 254, 319, 259, 322, 283, 216, 217, 250, 262, 218, 283, 219, 260, 220, 252, 267, 281, 261, 221, 268, 274, 318, 253, 263, 296, 296, 264, 265, 321, 275, 324, 254, 319, 297, 322, 276, 116, 326, 108, 108, 110, 110, 327, 328, 325, 277, 334, 117, 335, 111, 263, 274, 298, 298, 308, 308, 516, 516, 311, 311, 275, 324, 240, 309, 297, 230, 276, 336, 326, 468, 468, 337, 338, 327, 328, 325, 229, 334, 117, 335, 111, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 309, 329, 304, 228, 336, 301, 313, 301, 337, 338, 314, 331, 332, 333, 339, 340, 344, 315, 342, 343, 345, 330, 347, 316, 346, 350, 348, 351, 356, 341, 349, 357, 329, 358, 301, 301, 301, 313, 301, 468, 468, 314, 331, 332, 333, 339, 340, 344, 315, 342, 343, 345, 330, 347, 316, 346, 350, 348, 351, 356, 341, 349, 357, 227, 358, 301, 301, 301, 301, 301, 301, 301, 301, 305, 305, 301, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 359, 363, 307, 472, 472, 305, 352, 305, 353, 354, 360, 364, 355, 365, 366, 367, 368, 369, 361, 372, 373, 374, 370, 376, 362, 472, 472, 384, 375, 395, 226, 359, 363, 371, 305, 305, 305, 352, 305, 353, 354, 360, 364, 355, 365, 366, 367, 368, 369, 361, 372, 373, 374, 370, 376, 362, 381, 377, 384, 375, 395, 382, 383, 389, 371, 305, 305, 305, 305, 305, 305, 305, 305, 378, 385, 379, 386, 387, 396, 390, 380, 397, 388, 391, 392, 393, 399, 381, 377, 398, 400, 394, 382, 383, 389, 401, 402, 403, 404, 405, 406, 407, 409, 408, 378, 385, 379, 386, 387, 396, 390, 380, 397, 388, 391, 392, 393, 399, 410, 411, 398, 400, 394, 417, 426, 225, 401, 402, 403, 404, 405, 406, 407, 409, 408, 412, 415, 427, 413, 418, 428, 429, 416, 430, 419, 414, 420, 421, 223, 410, 411, 434, 422, 435, 417, 426, 423, 424, 438, 425, 439, 106, 436, 440, 516, 516, 412, 415, 427, 413, 418, 428, 429, 416, 430, 419, 414, 420, 421, 431, 432, 446, 434, 422, 435, 441, 437, 423, 424, 438, 425, 439, 433, 436, 440, 443, 442, 444, 447, 450, 451, 452, 453, 445, 454, 455, 448, 456, 457, 458, 431, 432, 446, 459, 460, 461, 441, 437, 449, 1736, 510, 229, 735, 433, 473, 1736, 443, 442, 444, 447, 450, 451, 452, 453, 445, 454, 455, 448, 456, 457, 458, 233, 233, 474, 459, 460, 461, 233, 233, 449, 234, 235, 229, 232, 232, 473, 234, 469, 469, 475, 476, 479, 236, 477, 478, 480, 470, 481, 483, 484, 485, 486, 487, 488, 474, 492, 493, 489, 494, 495, 482, 234, 490, 496, 497, 498, 499, 234, 491, 500, 475, 476, 479, 236, 477, 478, 480, 470, 481, 483, 484, 485, 486, 487, 488, 503, 492, 493, 489, 494, 495, 482, 504, 490, 496, 497, 498, 499, 505, 491, 500, 501, 506, 502, 1736, 508, 512, 507, 521, 521, 514, 1736, 522, 522, 522, 522, 503, 1736, 296, 296, 522, 522, 515, 504, 517, 518, 277, 297, 1736, 505, 277, 523, 501, 506, 502, 277, 508, 512, 507, 104, 104, 514, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 343, 515, 524, 517, 518, 104, 297, 104, 308, 308, 523, 525, 526, 527, 528, 529, 530, 309, 513, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 343, 543, 524, 104, 104, 104, 1736, 104, 699, 699, 1736, 525, 526, 527, 528, 529, 530, 309, 513, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 1736, 543, 547, 104, 104, 104, 104, 104, 104, 104, 104, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 544, 548, 304, 699, 699, 301, 549, 301, 545, 547, 551, 552, 553, 554, 546, 555, 556, 557, 558, 559, 560, 561, 562, 550, 564, 565, 566, 567, 570, 571, 563, 544, 548, 572, 301, 301, 301, 549, 301, 545, 1736, 551, 552, 553, 554, 546, 555, 556, 557, 558, 559, 560, 561, 562, 550, 564, 565, 566, 567, 570, 571, 563, 1736, 573, 572, 301, 301, 301, 301, 301, 301, 301, 301, 305, 305, 301, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 568, 574, 307, 277, 945, 305, 575, 305, 573, 576, 569, 577, 578, 579, 580, 582, 583, 584, 581, 585, 586, 587, 590, 588, 591, 592, 593, 594, 595, 596, 597, 568, 574, 589, 305, 305, 305, 575, 305, 1736, 576, 569, 577, 578, 579, 580, 582, 583, 584, 581, 585, 586, 587, 590, 588, 591, 592, 593, 594, 595, 596, 597, 1736, 598, 589, 305, 305, 305, 305, 305, 305, 305, 305, 104, 104, 599, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 600, 612, 613, 277, 1135, 104, 614, 104, 598, 615, 616, 626, 627, 628, 629, 630, 520, 631, 632, 633, 599, 635, 636, 637, 639, 640, 641, 638, 1736, 644, 645, 600, 612, 613, 104, 104, 104, 614, 104, 1736, 615, 616, 626, 627, 628, 629, 630, 520, 631, 632, 633, 642, 635, 636, 637, 639, 640, 641, 638, 643, 644, 645, 646, 650, 1736, 104, 104, 104, 104, 104, 104, 104, 104, 601, 602, 1736, 603, 648, 604, 605, 653, 606, 642, 654, 607, 655, 647, 608, 649, 656, 643, 609, 610, 646, 650, 611, 1736, 1736, 657, 1736, 658, 1736, 1736, 659, 601, 602, 651, 603, 648, 604, 605, 653, 606, 652, 654, 607, 655, 647, 608, 649, 656, 660, 609, 610, 661, 662, 611, 617, 618, 657, 619, 658, 620, 621, 659, 622, 663, 651, 664, 665, 668, 666, 669, 670, 652, 623, 624, 671, 672, 625, 673, 674, 660, 667, 675, 661, 662, 676, 617, 618, 677, 619, 678, 620, 621, 679, 622, 663, 680, 664, 665, 668, 666, 669, 670, 681, 623, 624, 671, 672, 625, 673, 674, 682, 667, 675, 683, 684, 676, 685, 686, 677, 687, 678, 691, 689, 679, 688, 692, 680, 690, 694, 695, 696, 469, 469, 681, 698, 698, 700, 693, 699, 699, 470, 682, 701, 702, 683, 684, 703, 685, 686, 704, 687, 705, 691, 689, 706, 688, 692, 707, 690, 694, 695, 696, 708, 709, 710, 711, 712, 700, 693, 713, 714, 470, 715, 701, 702, 716, 717, 703, 718, 719, 704, 720, 705, 721, 722, 706, 723, 724, 707, 725, 726, 727, 728, 708, 709, 710, 711, 712, 729, 730, 713, 714, 731, 715, 732, 1736, 716, 717, 734, 718, 719, 733, 720, 277, 721, 722, 511, 723, 724, 736, 725, 726, 727, 728, 277, 737, 738, 739, 511, 729, 730, 740, 741, 731, 742, 732, 277, 743, 744, 734, 746, 747, 733, 748, 749, 750, 751, 511, 752, 753, 736, 754, 756, 757, 758, 759, 737, 738, 739, 511, 762, 763, 740, 741, 760, 742, 764, 765, 743, 744, 755, 746, 747, 761, 748, 749, 750, 751, 766, 752, 753, 767, 754, 756, 757, 758, 759, 768, 769, 770, 771, 762, 763, 772, 773, 760, 774, 764, 765, 775, 776, 755, 777, 778, 761, 779, 780, 781, 782, 766, 783, 784, 767, 785, 786, 787, 788, 789, 768, 769, 770, 771, 790, 791, 772, 773, 792, 774, 793, 794, 775, 776, 795, 777, 778, 796, 779, 780, 781, 782, 797, 783, 784, 798, 785, 786, 787, 788, 789, 799, 800, 801, 802, 790, 791, 803, 806, 792, 804, 793, 794, 807, 808, 795, 809, 805, 796, 810, 811, 812, 813, 797, 815, 816, 798, 817, 818, 814, 819, 820, 799, 800, 801, 802, 821, 822, 803, 806, 823, 804, 827, 828, 807, 808, 829, 809, 805, 830, 810, 811, 812, 813, 831, 815, 816, 824, 817, 818, 814, 819, 820, 825, 832, 833, 834, 821, 822, 835, 836, 823, 837, 827, 828, 826, 838, 829, 839, 843, 830, 840, 844, 845, 846, 831, 847, 841, 824, 848, 849, 852, 853, 854, 825, 832, 833, 834, 850, 842, 835, 836, 851, 837, 855, 856, 826, 838, 857, 839, 843, 858, 840, 844, 845, 846, 859, 847, 841, 860, 848, 849, 852, 853, 854, 861, 862, 863, 864, 850, 842, 865, 866, 851, 869, 855, 856, 870, 867, 857, 871, 872, 858, 868, 873, 874, 875, 859, 876, 877, 860, 878, 879, 880, 881, 882, 861, 862, 863, 864, 883, 884, 865, 866, 885, 869, 886, 887, 870, 867, 888, 871, 872, 889, 868, 873, 874, 875, 890, 876, 877, 891, 878, 879, 880, 881, 882, 892, 893, 894, 895, 883, 884, 898, 900, 885, 896, 886, 887, 901, 897, 888, 902, 899, 889, 903, 904, 905, 906, 890, 907, 908, 891, 909, 910, 911, 912, 913, 892, 893, 894, 895, 914, 915, 898, 900, 916, 896, 917, 918, 901, 897, 919, 902, 899, 920, 903, 904, 905, 906, 921, 907, 908, 922, 909, 910, 911, 912, 913, 923, 924, 925, 926, 914, 915, 927, 928, 916, 929, 917, 918, 930, 931, 919, 932, 933, 920, 934, 935, 936, 937, 921, 938, 939, 922, 940, 941, 942, 943, 1736, 923, 924, 925, 926, 944, 947, 927, 928, 948, 929, 949, 950, 930, 931, 951, 932, 933, 946, 934, 935, 936, 937, 952, 938, 939, 953, 940, 941, 942, 943, 277, 954, 277, 955, 956, 944, 947, 957, 958, 948, 959, 949, 950, 960, 961, 951, 962, 963, 946, 964, 965, 966, 968, 952, 967, 969, 953, 970, 971, 972, 973, 974, 954, 975, 955, 956, 976, 977, 957, 958, 980, 959, 978, 979, 960, 961, 981, 962, 963, 982, 964, 965, 966, 968, 983, 967, 969, 984, 970, 971, 972, 973, 974, 985, 975, 986, 987, 976, 977, 988, 989, 980, 990, 978, 979, 991, 992, 981, 1736, 1736, 982, 998, 999, 1000, 1001, 983, 1002, 1003, 984, 1004, 1005, 1006, 993, 1736, 985, 1012, 986, 987, 1013, 1736, 988, 989, 994, 990, 1014, 995, 991, 992, 1736, 996, 997, 1015, 998, 999, 1000, 1001, 1016, 1002, 1003, 1017, 1004, 1005, 1006, 993, 1007, 1018, 1012, 1008, 1019, 1013, 1009, 1020, 1021, 994, 1010, 1014, 995, 1022, 1023, 1011, 996, 997, 1015, 1024, 1025, 1026, 1027, 1016, 1028, 1029, 1017, 1030, 1031, 1032, 1033, 1007, 1018, 1034, 1008, 1019, 1035, 1009, 1020, 1021, 1036, 1010, 1037, 1038, 1022, 1023, 1011, 1039, 1040, 1041, 1024, 1025, 1026, 1027, 1042, 1028, 1029, 1043, 1030, 1031, 1032, 1033, 1044, 1045, 1034, 1046, 1047, 1035, 1048, 1049, 1050, 1036, 1051, 1037, 1038, 1052, 1053, 1054, 1039, 1040, 1041, 1055, 1056, 1057, 1058, 1042, 1059, 1060, 1043, 1061, 1062, 1063, 1064, 1044, 1045, 1065, 1046, 1047, 1068, 1048, 1049, 1050, 1066, 1051, 1069, 1070, 1052, 1053, 1054, 1071, 1074, 1067, 1055, 1056, 1057, 1058, 1075, 1059, 1060, 1076, 1061, 1062, 1063, 1064, 1072, 1077, 1065, 1078, 1079, 1068, 1080, 1073, 1081, 1066, 1085, 1069, 1070, 1086, 1087, 1088, 1071, 1074, 1067, 1089, 1090, 1091, 1082, 1075, 1083, 1092, 1076, 1093, 1094, 1095, 1096, 1072, 1077, 1099, 1078, 1079, 1097, 1080, 1073, 1081, 1084, 1085, 1098, 1100, 1086, 1087, 1088, 1101, 1103, 1104, 1089, 1090, 1091, 1082, 1105, 1083, 1092, 1102, 1093, 1094, 1095, 1096, 1106, 1107, 1099, 1108, 1109, 1097, 1110, 1111, 1112, 1084, 1113, 1098, 1100, 1114, 1115, 1116, 1101, 1103, 1104, 1117, 1118, 1119, 1120, 1105, 1121, 1122, 1102, 1123, 1124, 1125, 1126, 1106, 1107, 1127, 1108, 1109, 1128, 1110, 1111, 1112, 1129, 1113, 1130, 1131, 1114, 1115, 1116, 1132, 1133, 1134, 1117, 1118, 1119, 1120, 1138, 1121, 1122, 1136, 1123, 1124, 1125, 1126, 1137, 1139, 1127, 1140, 1141, 1128, 1142, 1143, 1144, 1129, 1145, 1130, 1131, 1146, 1147, 1148, 1132, 1133, 1134, 1149, 1150, 277, 1151, 1138, 277, 1152, 1136, 1153, 1154, 1155, 1156, 1137, 1139, 1157, 1140, 1141, 1158, 1142, 1143, 1144, 1159, 1145, 1160, 1161, 1146, 1147, 1148, 1162, 1163, 1164, 1149, 1150, 1165, 1151, 1166, 1167, 1152, 1168, 1153, 1154, 1155, 1156, 1169, 1170, 1157, 1171, 1172, 1158, 1173, 1174, 1175, 1159, 1176, 1160, 1161, 1177, 1178, 1179, 1162, 1163, 1164, 1180, 1181, 1165, 1182, 1166, 1167, 1183, 1168, 1184, 1185, 1186, 1189, 1169, 1170, 1190, 1171, 1172, 1191, 1173, 1174, 1175, 1187, 1176, 1192, 1193, 1177, 1178, 1179, 1194, 1188, 1195, 1180, 1181, 1196, 1182, 1197, 1198, 1183, 1199, 1184, 1185, 1186, 1189, 1200, 1201, 1190, 1202, 1203, 1191, 1204, 1205, 1206, 1187, 1207, 1192, 1193, 1208, 1209, 1210, 1194, 1188, 1195, 1211, 1212, 1196, 1213, 1197, 1198, 1214, 1199, 1215, 1216, 1217, 1218, 1200, 1201, 1219, 1202, 1203, 1220, 1204, 1205, 1206, 1221, 1207, 1222, 1224, 1208, 1209, 1210, 1225, 1226, 1227, 1211, 1212, 1228, 1213, 1229, 1230, 1214, 1231, 1215, 1216, 1217, 1218, 1232, 1233, 1219, 1234, 1235, 1220, 1236, 1237, 1238, 1221, 1239, 1222, 1224, 1240, 1241, 1242, 1225, 1226, 1227, 1243, 1244, 1228, 1245, 1229, 1230, 1246, 1231, 1247, 1248, 1249, 1250, 1232, 1233, 1251, 1234, 1235, 1252, 1236, 1237, 1238, 1255, 1239, 1256, 1257, 1240, 1241, 1242, 1253, 1258, 1259, 1243, 1244, 1260, 1245, 1261, 1262, 1246, 1263, 1247, 1248, 1249, 1250, 1264, 1254, 1251, 1265, 1266, 1252, 1267, 1268, 1269, 1255, 1270, 1256, 1257, 1271, 1272, 1273, 1253, 1258, 1259, 1274, 1275, 1260, 1276, 1261, 1262, 1277, 1263, 1278, 1279, 1280, 1281, 1264, 1254, 1282, 1265, 1266, 1283, 1267, 1268, 1269, 1284, 1270, 1285, 1286, 1271, 1272, 1273, 1287, 1288, 1289, 1274, 1275, 1290, 1276, 1291, 1292, 1277, 1295, 1278, 1279, 1280, 1281, 1296, 1293, 1282, 1297, 1298, 1283, 1299, 1300, 1301, 1284, 1302, 1285, 1286, 1303, 1304, 1305, 1287, 1288, 1289, 277, 1306, 1290, 1307, 1291, 1292, 277, 1295, 1308, 1309, 1310, 1311, 1296, 1293, 1312, 1297, 1298, 1313, 1299, 1300, 1301, 1314, 1302, 1315, 1316, 1303, 1304, 1305, 1317, 1318, 1319, 1320, 1306, 1321, 1307, 1322, 1323, 1324, 1325, 1308, 1309, 1310, 1311, 1326, 1327, 1312, 1328, 1329, 1313, 1330, 1331, 1332, 1314, 1333, 1315, 1316, 1334, 1335, 1336, 1317, 1318, 1319, 1320, 1337, 1321, 1338, 1322, 1323, 1324, 1325, 1339, 1340, 1341, 1342, 1326, 1327, 1343, 1328, 1329, 1344, 1330, 1331, 1332, 1345, 1333, 1346, 1347, 1334, 1335, 1336, 1348, 1349, 1350, 1351, 1337, 1352, 1338, 1353, 1354, 1355, 1356, 1339, 1340, 1341, 1342, 1357, 1358, 1343, 1359, 1360, 1344, 1361, 1362, 1363, 1345, 1364, 1346, 1347, 1365, 1367, 1366, 1348, 1349, 1350, 1351, 1368, 1352, 1370, 1353, 1354, 1355, 1356, 1371, 1372, 1373, 1374, 1357, 1358, 1375, 1359, 1360, 1376, 1361, 1362, 1363, 1369, 1364, 1377, 1378, 1365, 1367, 1366, 1379, 1380, 1381, 1382, 1368, 1383, 1370, 1384, 1385, 1386, 1387, 1371, 1372, 1373, 1374, 1388, 1389, 1375, 1390, 1391, 1376, 1392, 1393, 1394, 1369, 1395, 1377, 1378, 1396, 1397, 1400, 1379, 1380, 1381, 1382, 1398, 1383, 1399, 1384, 1385, 1386, 1387, 1401, 1402, 1403, 1404, 1388, 1389, 1405, 1390, 1391, 1406, 1392, 1393, 1394, 1407, 1395, 1408, 1409, 1396, 1397, 1400, 1410, 1411, 1412, 1413, 1398, 1414, 1399, 1415, 1416, 1417, 1418, 1401, 1402, 1403, 1404, 1419, 1420, 1405, 1421, 1422, 1406, 1423, 1736, 1426, 1407, 1425, 1408, 1409, 1427, 1424, 1428, 1410, 1411, 1412, 1413, 1429, 1414, 1430, 1415, 1416, 1417, 1418, 277, 1431, 1432, 1433, 1419, 1420, 1434, 1421, 1422, 1435, 1423, 277, 1426, 1436, 1425, 1437, 1438, 1427, 1424, 1428, 1439, 1440, 1441, 1442, 1429, 1443, 1430, 1444, 1445, 1446, 1447, 1448, 1431, 1432, 1433, 1449, 1450, 1434, 1451, 1452, 1435, 1453, 1454, 1455, 1436, 1456, 1437, 1438, 1457, 1458, 1459, 1439, 1440, 1441, 1442, 1460, 1443, 1461, 1444, 1445, 1446, 1447, 1448, 1462, 1463, 1464, 1449, 1450, 1465, 1451, 1452, 1466, 1453, 1454, 1455, 1467, 1456, 1468, 1469, 1457, 1458, 1459, 1470, 1471, 1472, 1473, 1460, 1474, 1461, 1475, 1476, 1477, 1478, 1479, 1462, 1463, 1464, 1480, 1481, 1465, 1482, 1483, 1466, 1484, 1485, 1486, 1467, 1487, 1468, 1469, 1488, 1489, 1490, 1470, 1471, 1472, 1473, 1491, 1474, 1492, 1475, 1476, 1477, 1478, 1479, 1493, 1494, 1495, 1480, 1481, 1496, 1482, 1483, 1497, 1484, 1485, 1486, 1498, 1487, 1499, 1500, 1488, 1489, 1490, 1501, 1502, 1503, 1504, 1491, 1505, 1492, 1506, 1507, 1508, 1509, 1510, 1493, 1494, 1495, 1511, 1512, 1496, 1513, 1514, 1497, 1515, 1516, 1517, 1498, 1518, 1499, 1500, 1519, 1520, 1521, 1501, 1502, 1503, 1504, 1522, 1505, 1523, 1506, 1507, 1508, 1509, 1510, 1524, 1527, 1525, 1511, 1512, 1526, 1513, 1514, 1528, 1515, 1516, 1517, 1529, 1518, 1530, 1531, 1519, 1520, 1521, 277, 1532, 1533, 277, 1522, 1534, 1523, 1535, 1536, 1537, 1538, 1539, 1524, 1527, 1525, 1540, 1541, 1526, 1542, 1543, 1528, 1544, 1545, 1546, 1529, 1547, 1530, 1531, 1548, 1549, 1550, 1551, 1532, 1533, 1552, 1553, 1534, 1554, 1535, 1536, 1537, 1538, 1539, 1555, 1556, 1557, 1540, 1541, 1558, 1542, 1543, 1559, 1544, 1545, 1546, 1560, 1547, 1561, 1562, 1548, 1549, 1550, 1551, 1563, 1564, 1552, 1553, 1565, 1554, 1566, 1567, 1568, 1569, 1570, 1555, 1556, 1557, 1571, 1572, 1558, 1573, 1574, 1559, 1575, 1576, 1577, 1560, 1578, 1561, 1562, 1579, 1580, 1581, 1582, 1563, 1564, 1583, 1584, 1565, 1585, 1566, 1567, 1568, 1569, 1570, 1586, 1587, 1588, 1571, 1572, 1589, 1573, 1574, 1590, 1575, 1576, 1577, 1591, 1578, 1592, 1593, 1579, 1580, 1581, 1582, 1594, 1595, 1583, 1584, 1596, 1585, 1597, 1598, 1599, 1600, 1601, 1586, 1587, 1588, 1602, 1605, 1589, 1603, 1604, 1590, 1606, 1607, 1608, 1591, 1610, 1592, 1593, 1609, 277, 1611, 1612, 1594, 1595, 1613, 277, 1596, 1614, 1597, 1598, 1599, 1600, 1601, 1615, 1616, 1617, 1602, 1605, 1618, 1603, 1604, 1619, 1606, 1607, 1608, 1620, 1610, 1621, 1622, 1609, 1623, 1611, 1612, 1624, 1625, 1613, 1626, 1627, 1614, 1628, 1629, 1630, 1631, 1632, 1615, 1616, 1617, 1633, 1634, 1618, 1635, 1636, 1619, 1637, 1638, 1639, 1620, 1640, 1621, 1622, 1641, 1623, 1642, 1643, 1624, 1625, 1644, 1626, 1627, 1645, 1628, 1629, 1630, 1631, 1632, 1646, 1647, 1648, 1633, 1634, 1649, 1635, 1636, 1650, 1637, 1638, 1639, 1653, 1640, 1651, 1652, 1641, 1654, 1642, 1643, 1655, 1656, 1644, 1657, 277, 1645, 1658, 1659, 1660, 1661, 1662, 1646, 1647, 1648, 1663, 277, 1649, 1664, 1665, 1650, 1666, 1667, 1668, 1653, 1669, 1651, 1652, 1670, 1654, 1671, 1672, 1655, 1656, 1673, 1657, 1674, 1675, 1658, 1659, 1660, 1661, 1662, 1676, 1677, 1678, 1663, 1679, 1680, 1664, 1665, 1681, 1666, 1667, 1668, 1682, 1669, 1683, 277, 1670, 1684, 1671, 1672, 1685, 1686, 1673, 1687, 1674, 1675, 1688, 1689, 277, 1690, 1691, 1676, 1677, 1678, 1692, 1679, 1680, 1693, 1694, 1681, 1695, 1696, 1697, 1682, 1698, 1683, 1699, 1700, 1684, 1701, 1702, 1685, 1686, 1703, 1687, 1704, 277, 1688, 1689, 1705, 1690, 1691, 1706, 1707, 1708, 1692, 1709, 1710, 1693, 1694, 1711, 1695, 1696, 1697, 1712, 1698, 1713, 1699, 1700, 277, 1701, 1702, 1714, 1715, 1703, 1716, 1704, 1717, 1719, 1720, 1705, 1721, 1722, 1706, 1707, 1708, 1723, 1709, 1710, 1724, 1725, 1711, 1727, 1728, 1729, 1712, 1730, 1713, 1731, 1732, 1733, 277, 1734, 1714, 1715, 1735, 1716, 1736, 1717, 1719, 1720, 1736, 1721, 1722, 1736, 1736, 1736, 1723, 1736, 1736, 1724, 1725, 1736, 1727, 1728, 1729, 1736, 1730, 1736, 1731, 1732, 1733, 1736, 1734, 1736, 1736, 1735, 87, 87, 87, 87, 87, 87, 87, 91, 91, 91, 91, 91, 91, 91, 95, 95, 95, 95, 95, 95, 95, 104, 1736, 104, 104, 104, 104, 104, 105, 1736, 105, 105, 105, 105, 105, 114, 114, 114, 114, 114, 114, 114, 222, 222, 222, 222, 222, 222, 222, 224, 1736, 224, 224, 224, 224, 224, 273, 273, 273, 273, 273, 273, 273, 278, 278, 278, 278, 278, 278, 278, 282, 282, 282, 282, 282, 282, 282, 284, 284, 284, 284, 284, 284, 284, 285, 285, 1736, 1736, 285, 285, 289, 1736, 289, 289, 1736, 289, 289, 301, 301, 301, 301, 301, 301, 301, 303, 303, 303, 303, 303, 303, 303, 306, 306, 306, 306, 306, 306, 306, 463, 463, 1736, 463, 463, 463, 463, 465, 465, 465, 1736, 465, 465, 465, 509, 509, 509, 509, 509, 509, 509, 511, 1736, 511, 511, 511, 511, 511, 305, 305, 305, 305, 305, 305, 305, 104, 1736, 104, 104, 104, 104, 104, 13, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736 } ; static const flex_int16_t yy_chk[4072] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 5, 6, 5, 6, 7, 5, 6, 7, 8, 9, 10, 8, 15, 20, 15, 20, 20, 33, 9, 10, 52, 54, 52, 54, 59, 63, 59, 59, 62, 62, 83, 298, 298, 63, 83, 88, 103, 88, 103, 111, 111, 117, 117, 111, 111, 117, 117, 7, 33, 299, 299, 8, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 21, 21, 1742, 34, 40, 69, 72, 34, 73, 21, 1717, 279, 23, 279, 23, 23, 234, 234, 60, 60, 234, 234, 1704, 23, 24, 1137, 24, 60, 1051, 77, 300, 300, 528, 24, 34, 40, 69, 72, 34, 73, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 22, 24, 60, 22, 77, 22, 25, 37, 24, 31, 25, 80, 27, 31, 25, 27, 27, 31, 28, 28, 28, 37, 79, 25, 28, 79, 25, 45, 81, 27, 28, 45, 22, 22, 22, 465, 22, 25, 37, 463, 31, 25, 80, 27, 31, 25, 27, 27, 31, 28, 28, 28, 37, 79, 25, 28, 79, 25, 45, 81, 27, 28, 45, 22, 22, 22, 22, 22, 22, 22, 22, 26, 92, 26, 29, 403, 26, 26, 29, 93, 26, 301, 29, 26, 284, 29, 26, 26, 29, 30, 65, 29, 282, 30, 65, 236, 236, 30, 278, 236, 236, 273, 26, 92, 26, 29, 30, 26, 26, 29, 93, 26, 94, 29, 26, 94, 29, 26, 26, 29, 30, 65, 29, 32, 30, 65, 36, 35, 30, 35, 36, 35, 32, 32, 36, 35, 66, 30, 35, 32, 99, 38, 38, 100, 35, 101, 36, 230, 102, 38, 36, 38, 66, 38, 32, 94, 38, 36, 35, 464, 35, 36, 35, 32, 32, 36, 35, 66, 228, 35, 32, 99, 38, 38, 100, 35, 101, 36, 67, 102, 38, 36, 38, 66, 38, 39, 41, 38, 67, 39, 41, 67, 118, 39, 41, 44, 39, 120, 122, 39, 41, 226, 39, 464, 44, 225, 44, 310, 310, 67, 44, 224, 44, 466, 44, 222, 39, 41, 124, 67, 39, 41, 67, 118, 39, 41, 44, 39, 120, 122, 39, 41, 71, 39, 42, 44, 42, 44, 43, 42, 42, 44, 43, 44, 42, 44, 43, 71, 42, 124, 112, 42, 43, 42, 466, 43, 42, 61, 106, 61, 61, 305, 43, 71, 509, 42, 509, 42, 61, 43, 42, 42, 68, 43, 305, 42, 68, 43, 71, 42, 105, 75, 42, 43, 42, 74, 43, 42, 46, 46, 68, 75, 46, 43, 46, 74, 46, 70, 78, 61, 74, 46, 78, 68, 121, 70, 76, 68, 98, 76, 76, 123, 75, 97, 70, 121, 74, 123, 90, 46, 46, 68, 75, 46, 89, 46, 74, 46, 70, 78, 85, 74, 46, 78, 82, 121, 70, 76, 107, 107, 76, 76, 123, 82, 125, 70, 121, 107, 123, 82, 108, 127, 108, 108, 110, 110, 128, 129, 125, 82, 133, 108, 134, 110, 84, 82, 297, 297, 116, 116, 297, 297, 311, 311, 82, 125, 64, 116, 107, 58, 82, 136, 127, 467, 467, 136, 137, 128, 129, 125, 57, 133, 108, 134, 110, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 116, 130, 114, 56, 136, 114, 119, 114, 136, 137, 119, 131, 131, 131, 138, 139, 141, 119, 140, 140, 142, 130, 143, 119, 142, 145, 144, 146, 148, 139, 144, 149, 130, 150, 114, 114, 114, 119, 114, 468, 468, 119, 131, 131, 131, 138, 139, 141, 119, 140, 140, 142, 130, 143, 119, 142, 145, 144, 146, 148, 139, 144, 149, 55, 150, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 151, 153, 115, 471, 471, 115, 147, 115, 147, 147, 152, 154, 147, 155, 156, 157, 158, 158, 152, 159, 160, 161, 158, 162, 152, 472, 472, 166, 161, 172, 50, 151, 153, 158, 115, 115, 115, 147, 115, 147, 147, 152, 154, 147, 155, 156, 157, 158, 158, 152, 159, 160, 161, 158, 162, 152, 165, 163, 166, 161, 172, 165, 165, 170, 158, 115, 115, 115, 115, 115, 115, 115, 115, 163, 169, 163, 169, 169, 173, 170, 163, 174, 169, 171, 171, 171, 175, 165, 163, 174, 175, 171, 165, 165, 170, 176, 177, 178, 179, 180, 181, 182, 183, 182, 163, 169, 163, 169, 169, 173, 170, 163, 174, 169, 171, 171, 171, 175, 184, 185, 174, 175, 171, 188, 191, 49, 176, 177, 178, 179, 180, 181, 182, 183, 182, 186, 187, 192, 186, 189, 193, 194, 187, 195, 189, 186, 190, 190, 48, 184, 185, 197, 190, 198, 188, 191, 190, 190, 200, 190, 201, 19, 199, 202, 516, 516, 186, 187, 192, 186, 189, 193, 194, 187, 195, 189, 186, 190, 190, 196, 196, 205, 197, 190, 198, 203, 199, 190, 190, 200, 190, 201, 196, 199, 202, 204, 203, 204, 206, 207, 210, 212, 213, 204, 214, 215, 206, 216, 217, 218, 196, 196, 205, 219, 220, 221, 203, 199, 206, 13, 510, 241, 510, 196, 242, 0, 204, 203, 204, 206, 207, 210, 212, 213, 204, 214, 215, 206, 216, 217, 218, 231, 231, 243, 219, 220, 221, 233, 233, 206, 231, 232, 241, 232, 232, 242, 233, 235, 235, 244, 245, 247, 232, 246, 246, 248, 235, 249, 250, 251, 252, 253, 254, 255, 243, 258, 259, 257, 260, 262, 249, 231, 257, 264, 265, 266, 267, 233, 257, 268, 244, 245, 247, 232, 246, 246, 248, 235, 249, 250, 251, 252, 253, 254, 255, 270, 258, 259, 257, 260, 262, 249, 271, 257, 264, 265, 266, 267, 272, 257, 268, 269, 274, 269, 0, 276, 292, 275, 309, 309, 294, 0, 309, 309, 521, 521, 270, 0, 296, 296, 522, 522, 295, 271, 302, 304, 276, 296, 0, 272, 274, 312, 269, 274, 269, 275, 276, 292, 275, 291, 291, 294, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 293, 295, 313, 302, 304, 291, 296, 291, 308, 308, 312, 314, 315, 316, 317, 318, 319, 308, 293, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 293, 332, 313, 291, 291, 291, 0, 291, 698, 698, 0, 314, 315, 316, 317, 318, 319, 308, 293, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, 335, 291, 291, 291, 291, 291, 291, 291, 291, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 333, 336, 303, 699, 699, 303, 337, 303, 333, 335, 338, 339, 340, 341, 333, 342, 344, 345, 346, 347, 348, 349, 350, 337, 351, 352, 353, 354, 356, 358, 350, 333, 336, 359, 303, 303, 303, 337, 303, 333, 0, 338, 339, 340, 341, 333, 342, 344, 345, 346, 347, 348, 349, 350, 337, 351, 352, 353, 354, 356, 358, 350, 0, 360, 359, 303, 303, 303, 303, 303, 303, 303, 303, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 355, 361, 306, 733, 733, 306, 362, 306, 360, 363, 355, 364, 365, 367, 368, 369, 370, 371, 368, 372, 373, 374, 376, 375, 377, 378, 379, 380, 381, 382, 383, 355, 361, 375, 306, 306, 306, 362, 306, 0, 363, 355, 364, 365, 367, 368, 369, 370, 371, 368, 372, 373, 374, 376, 375, 377, 378, 379, 380, 381, 382, 383, 0, 384, 375, 306, 306, 306, 306, 306, 306, 306, 306, 307, 307, 386, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 387, 389, 390, 944, 944, 307, 390, 307, 384, 391, 392, 394, 395, 396, 397, 398, 307, 399, 400, 401, 386, 404, 405, 406, 407, 408, 409, 406, 0, 411, 412, 387, 389, 390, 307, 307, 307, 390, 307, 0, 391, 392, 394, 395, 396, 397, 398, 307, 399, 400, 401, 410, 404, 405, 406, 407, 408, 409, 406, 410, 411, 412, 413, 415, 0, 307, 307, 307, 307, 307, 307, 307, 307, 388, 388, 0, 388, 414, 388, 388, 417, 388, 410, 418, 388, 419, 413, 388, 414, 420, 410, 388, 388, 413, 415, 388, 0, 0, 421, 0, 422, 0, 0, 423, 388, 388, 416, 388, 414, 388, 388, 417, 388, 416, 418, 388, 419, 413, 388, 414, 420, 424, 388, 388, 425, 426, 388, 393, 393, 421, 393, 422, 393, 393, 423, 393, 427, 416, 428, 429, 431, 430, 432, 433, 416, 393, 393, 434, 435, 393, 436, 437, 424, 430, 439, 425, 426, 440, 393, 393, 441, 393, 442, 393, 393, 443, 393, 427, 444, 428, 429, 431, 430, 432, 433, 445, 393, 393, 434, 435, 393, 436, 437, 446, 430, 439, 447, 448, 440, 449, 450, 441, 451, 442, 453, 452, 443, 451, 454, 444, 452, 455, 458, 461, 469, 469, 445, 470, 470, 473, 454, 470, 470, 469, 446, 474, 475, 447, 448, 476, 449, 450, 477, 451, 478, 453, 452, 479, 451, 454, 480, 452, 455, 458, 461, 481, 482, 483, 484, 485, 473, 454, 486, 487, 469, 488, 474, 475, 489, 490, 476, 491, 492, 477, 493, 478, 494, 496, 479, 497, 498, 480, 499, 500, 501, 502, 481, 482, 483, 484, 485, 503, 504, 486, 487, 505, 488, 506, 0, 489, 490, 508, 491, 492, 507, 493, 506, 494, 496, 511, 497, 498, 512, 499, 500, 501, 502, 507, 514, 515, 519, 520, 503, 504, 523, 524, 505, 525, 506, 508, 526, 527, 508, 529, 530, 507, 531, 532, 533, 534, 511, 535, 537, 512, 538, 539, 540, 541, 542, 514, 515, 519, 520, 544, 545, 523, 524, 543, 525, 546, 547, 526, 527, 538, 529, 530, 543, 531, 532, 533, 534, 548, 535, 537, 549, 538, 539, 540, 541, 542, 550, 551, 552, 553, 544, 545, 554, 555, 543, 556, 546, 547, 557, 558, 538, 559, 560, 543, 562, 563, 564, 565, 548, 566, 567, 549, 568, 569, 571, 572, 573, 550, 551, 552, 553, 574, 575, 554, 555, 576, 556, 577, 578, 557, 558, 579, 559, 560, 580, 562, 563, 564, 565, 581, 566, 567, 582, 568, 569, 571, 572, 573, 583, 584, 585, 587, 574, 575, 588, 590, 576, 589, 577, 578, 591, 592, 579, 593, 589, 580, 594, 595, 597, 598, 581, 599, 601, 582, 602, 603, 598, 604, 605, 583, 584, 585, 587, 606, 607, 588, 590, 608, 589, 610, 611, 591, 592, 612, 593, 589, 613, 594, 595, 597, 598, 614, 599, 601, 609, 602, 603, 598, 604, 605, 609, 615, 616, 617, 606, 607, 618, 619, 608, 620, 610, 611, 609, 621, 612, 622, 624, 613, 623, 625, 626, 627, 614, 628, 623, 609, 630, 632, 634, 635, 636, 609, 615, 616, 617, 633, 623, 618, 619, 633, 620, 637, 638, 609, 621, 639, 622, 624, 640, 623, 625, 626, 627, 641, 628, 623, 642, 630, 632, 634, 635, 636, 643, 644, 645, 646, 633, 623, 647, 648, 633, 650, 637, 638, 651, 649, 639, 652, 653, 640, 649, 654, 655, 656, 641, 657, 658, 642, 659, 660, 661, 662, 663, 643, 644, 645, 646, 664, 665, 647, 648, 666, 650, 667, 668, 651, 649, 669, 652, 653, 670, 649, 654, 655, 656, 671, 657, 658, 672, 659, 660, 661, 662, 663, 673, 674, 675, 676, 664, 665, 679, 681, 666, 677, 667, 668, 682, 677, 669, 683, 679, 670, 684, 685, 687, 688, 671, 689, 690, 672, 691, 692, 693, 694, 695, 673, 674, 675, 676, 701, 702, 679, 681, 703, 677, 704, 705, 682, 677, 706, 683, 679, 707, 684, 685, 687, 688, 708, 689, 690, 709, 691, 692, 693, 694, 695, 710, 711, 712, 713, 701, 702, 714, 715, 703, 716, 704, 705, 717, 718, 706, 719, 720, 707, 721, 722, 723, 724, 708, 725, 726, 709, 727, 728, 730, 731, 0, 710, 711, 712, 713, 732, 736, 714, 715, 738, 716, 741, 743, 717, 718, 744, 719, 720, 734, 721, 722, 723, 724, 746, 725, 726, 747, 727, 728, 730, 731, 734, 749, 732, 750, 751, 732, 736, 752, 753, 738, 754, 741, 743, 756, 757, 744, 757, 758, 734, 759, 760, 761, 762, 746, 761, 763, 747, 764, 765, 767, 768, 769, 749, 770, 750, 751, 773, 775, 752, 753, 778, 754, 776, 776, 756, 757, 779, 757, 758, 780, 759, 760, 761, 762, 781, 761, 763, 782, 764, 765, 767, 768, 769, 783, 770, 784, 786, 773, 775, 787, 789, 778, 790, 776, 776, 793, 794, 779, 0, 0, 780, 796, 797, 799, 800, 781, 802, 803, 782, 804, 805, 806, 795, 0, 783, 809, 784, 786, 811, 0, 787, 789, 795, 790, 812, 795, 793, 794, 0, 795, 795, 813, 796, 797, 799, 800, 814, 802, 803, 815, 804, 805, 806, 795, 807, 816, 809, 807, 817, 811, 807, 818, 819, 795, 807, 812, 795, 820, 821, 807, 795, 795, 813, 822, 823, 824, 825, 814, 826, 827, 815, 828, 829, 830, 831, 807, 816, 833, 807, 817, 834, 807, 818, 819, 835, 807, 836, 837, 820, 821, 807, 838, 839, 840, 822, 823, 824, 825, 841, 826, 827, 842, 828, 829, 830, 831, 843, 844, 833, 846, 848, 834, 849, 850, 851, 835, 852, 836, 837, 853, 854, 855, 838, 839, 840, 856, 857, 858, 859, 841, 860, 861, 842, 862, 863, 864, 865, 843, 844, 866, 846, 848, 868, 849, 850, 851, 867, 852, 869, 870, 853, 854, 855, 871, 873, 867, 856, 857, 858, 859, 874, 860, 861, 875, 862, 863, 864, 865, 872, 876, 866, 877, 878, 868, 879, 872, 880, 867, 884, 869, 870, 885, 886, 887, 871, 873, 867, 888, 889, 891, 883, 874, 883, 892, 875, 893, 894, 896, 897, 872, 876, 899, 877, 878, 898, 879, 872, 880, 883, 884, 898, 901, 885, 886, 887, 902, 903, 904, 888, 889, 891, 883, 907, 883, 892, 902, 893, 894, 896, 897, 908, 909, 899, 910, 911, 898, 912, 914, 915, 883, 916, 898, 901, 917, 918, 919, 902, 903, 904, 920, 921, 922, 923, 907, 924, 926, 902, 927, 928, 929, 931, 908, 909, 932, 910, 911, 933, 912, 914, 915, 936, 916, 938, 939, 917, 918, 919, 940, 941, 943, 920, 921, 922, 923, 947, 924, 926, 945, 927, 928, 929, 931, 946, 948, 932, 949, 950, 933, 951, 952, 953, 936, 954, 938, 939, 956, 959, 961, 940, 941, 943, 962, 963, 945, 964, 947, 946, 965, 945, 967, 969, 970, 971, 946, 948, 972, 949, 950, 973, 951, 952, 953, 975, 954, 976, 977, 956, 959, 961, 978, 980, 982, 962, 963, 983, 964, 985, 987, 965, 988, 967, 969, 970, 971, 989, 990, 972, 993, 994, 973, 995, 996, 997, 975, 999, 976, 977, 1000, 1001, 1002, 978, 980, 982, 1003, 1004, 983, 1005, 985, 987, 1006, 988, 1007, 1008, 1009, 1011, 989, 990, 1014, 993, 994, 1015, 995, 996, 997, 1010, 999, 1016, 1017, 1000, 1001, 1002, 1018, 1010, 1019, 1003, 1004, 1020, 1005, 1021, 1022, 1006, 1023, 1007, 1008, 1009, 1011, 1024, 1025, 1014, 1026, 1027, 1015, 1028, 1029, 1030, 1010, 1032, 1016, 1017, 1034, 1035, 1036, 1018, 1010, 1019, 1037, 1038, 1020, 1039, 1021, 1022, 1040, 1023, 1041, 1042, 1043, 1044, 1024, 1025, 1045, 1026, 1027, 1046, 1028, 1029, 1030, 1047, 1032, 1050, 1052, 1034, 1035, 1036, 1053, 1054, 1055, 1037, 1038, 1056, 1039, 1057, 1058, 1040, 1063, 1041, 1042, 1043, 1044, 1064, 1065, 1045, 1066, 1067, 1046, 1068, 1069, 1070, 1047, 1071, 1050, 1052, 1072, 1073, 1074, 1053, 1054, 1055, 1075, 1076, 1056, 1078, 1057, 1058, 1079, 1063, 1080, 1081, 1082, 1083, 1064, 1065, 1084, 1066, 1067, 1085, 1068, 1069, 1070, 1087, 1071, 1090, 1093, 1072, 1073, 1074, 1086, 1094, 1095, 1075, 1076, 1096, 1078, 1097, 1098, 1079, 1099, 1080, 1081, 1082, 1083, 1100, 1086, 1084, 1101, 1102, 1085, 1103, 1104, 1105, 1087, 1106, 1090, 1093, 1107, 1108, 1113, 1086, 1094, 1095, 1114, 1115, 1096, 1116, 1097, 1098, 1117, 1099, 1118, 1119, 1120, 1122, 1100, 1086, 1123, 1101, 1102, 1124, 1103, 1104, 1105, 1125, 1106, 1126, 1127, 1107, 1108, 1113, 1129, 1130, 1131, 1114, 1115, 1132, 1116, 1133, 1135, 1117, 1139, 1118, 1119, 1120, 1122, 1140, 1136, 1123, 1141, 1142, 1124, 1143, 1144, 1145, 1125, 1146, 1126, 1127, 1147, 1148, 1149, 1129, 1130, 1131, 1135, 1151, 1132, 1152, 1133, 1135, 1136, 1139, 1153, 1154, 1156, 1158, 1140, 1136, 1160, 1141, 1142, 1161, 1143, 1144, 1145, 1162, 1146, 1164, 1165, 1147, 1148, 1149, 1167, 1168, 1169, 1170, 1151, 1171, 1152, 1172, 1173, 1174, 1175, 1153, 1154, 1156, 1158, 1177, 1178, 1160, 1179, 1180, 1161, 1182, 1183, 1184, 1162, 1185, 1164, 1165, 1186, 1187, 1188, 1167, 1168, 1169, 1170, 1189, 1171, 1190, 1172, 1173, 1174, 1175, 1192, 1193, 1195, 1196, 1177, 1178, 1197, 1179, 1180, 1198, 1182, 1183, 1184, 1199, 1185, 1200, 1201, 1186, 1187, 1188, 1202, 1204, 1205, 1206, 1189, 1207, 1190, 1208, 1210, 1211, 1212, 1192, 1193, 1195, 1196, 1213, 1214, 1197, 1215, 1217, 1198, 1218, 1219, 1220, 1199, 1221, 1200, 1201, 1223, 1225, 1223, 1202, 1204, 1205, 1206, 1226, 1207, 1227, 1208, 1210, 1211, 1212, 1228, 1230, 1231, 1233, 1213, 1214, 1235, 1215, 1217, 1236, 1218, 1219, 1220, 1226, 1221, 1237, 1238, 1223, 1225, 1223, 1239, 1240, 1241, 1242, 1226, 1243, 1227, 1244, 1245, 1246, 1247, 1228, 1230, 1231, 1233, 1248, 1249, 1235, 1250, 1251, 1236, 1252, 1253, 1254, 1226, 1255, 1237, 1238, 1256, 1257, 1259, 1239, 1240, 1241, 1242, 1258, 1243, 1258, 1244, 1245, 1246, 1247, 1260, 1261, 1262, 1264, 1248, 1249, 1265, 1250, 1251, 1266, 1252, 1253, 1254, 1267, 1255, 1268, 1271, 1256, 1257, 1259, 1272, 1273, 1275, 1278, 1258, 1279, 1258, 1281, 1282, 1283, 1285, 1260, 1261, 1262, 1264, 1286, 1287, 1265, 1288, 1289, 1266, 1290, 0, 1296, 1267, 1293, 1268, 1271, 1297, 1292, 1298, 1272, 1273, 1275, 1278, 1299, 1279, 1300, 1281, 1282, 1283, 1285, 1293, 1302, 1303, 1304, 1286, 1287, 1305, 1288, 1289, 1306, 1290, 1292, 1296, 1307, 1293, 1308, 1309, 1297, 1292, 1298, 1310, 1311, 1313, 1314, 1299, 1315, 1300, 1316, 1317, 1318, 1319, 1321, 1302, 1303, 1304, 1322, 1323, 1305, 1324, 1326, 1306, 1327, 1328, 1330, 1307, 1331, 1308, 1309, 1332, 1333, 1334, 1310, 1311, 1313, 1314, 1335, 1315, 1336, 1316, 1317, 1318, 1319, 1321, 1337, 1338, 1339, 1322, 1323, 1340, 1324, 1326, 1341, 1327, 1328, 1330, 1342, 1331, 1343, 1344, 1332, 1333, 1334, 1345, 1346, 1347, 1348, 1335, 1349, 1336, 1350, 1354, 1355, 1356, 1357, 1337, 1338, 1339, 1358, 1359, 1340, 1360, 1361, 1341, 1364, 1365, 1366, 1342, 1367, 1343, 1344, 1368, 1369, 1370, 1345, 1346, 1347, 1348, 1372, 1349, 1373, 1350, 1354, 1355, 1356, 1357, 1375, 1376, 1378, 1358, 1359, 1379, 1360, 1361, 1380, 1364, 1365, 1366, 1382, 1367, 1383, 1384, 1368, 1369, 1370, 1385, 1386, 1388, 1390, 1372, 1391, 1373, 1393, 1394, 1395, 1396, 1397, 1375, 1376, 1378, 1398, 1399, 1379, 1402, 1404, 1380, 1405, 1406, 1410, 1382, 1411, 1383, 1384, 1413, 1417, 1418, 1385, 1386, 1388, 1390, 1419, 1391, 1421, 1393, 1394, 1395, 1396, 1397, 1422, 1426, 1424, 1398, 1399, 1425, 1402, 1404, 1427, 1405, 1406, 1410, 1429, 1411, 1431, 1433, 1413, 1417, 1418, 1424, 1435, 1436, 1425, 1419, 1438, 1421, 1440, 1441, 1443, 1444, 1445, 1422, 1426, 1424, 1446, 1448, 1425, 1452, 1454, 1427, 1455, 1456, 1457, 1429, 1458, 1431, 1433, 1460, 1461, 1462, 1463, 1435, 1436, 1464, 1465, 1438, 1466, 1440, 1441, 1443, 1444, 1445, 1467, 1468, 1469, 1446, 1448, 1470, 1452, 1454, 1472, 1455, 1456, 1457, 1473, 1458, 1474, 1475, 1460, 1461, 1462, 1463, 1476, 1477, 1464, 1465, 1478, 1466, 1479, 1480, 1481, 1482, 1483, 1467, 1468, 1469, 1484, 1485, 1470, 1486, 1487, 1472, 1488, 1489, 1490, 1473, 1491, 1474, 1475, 1492, 1493, 1494, 1495, 1476, 1477, 1496, 1497, 1478, 1499, 1479, 1480, 1481, 1482, 1483, 1501, 1502, 1503, 1484, 1485, 1504, 1486, 1487, 1505, 1488, 1489, 1490, 1506, 1491, 1507, 1511, 1492, 1493, 1494, 1495, 1514, 1516, 1496, 1497, 1517, 1499, 1518, 1519, 1520, 1521, 1522, 1501, 1502, 1503, 1523, 1527, 1504, 1525, 1526, 1505, 1529, 1530, 1534, 1506, 1535, 1507, 1511, 1534, 1526, 1539, 1540, 1514, 1516, 1543, 1525, 1517, 1547, 1518, 1519, 1520, 1521, 1522, 1548, 1549, 1550, 1523, 1527, 1551, 1525, 1526, 1552, 1529, 1530, 1534, 1555, 1535, 1556, 1557, 1534, 1558, 1539, 1540, 1559, 1560, 1543, 1561, 1562, 1547, 1564, 1565, 1566, 1567, 1568, 1548, 1549, 1550, 1569, 1570, 1551, 1571, 1572, 1552, 1574, 1575, 1576, 1555, 1577, 1556, 1557, 1578, 1558, 1579, 1581, 1559, 1560, 1584, 1561, 1562, 1585, 1564, 1565, 1566, 1567, 1568, 1587, 1591, 1593, 1569, 1570, 1594, 1571, 1572, 1595, 1574, 1575, 1576, 1606, 1577, 1603, 1604, 1578, 1607, 1579, 1581, 1608, 1609, 1584, 1610, 1603, 1585, 1611, 1612, 1613, 1615, 1616, 1587, 1591, 1593, 1617, 1604, 1594, 1618, 1619, 1595, 1624, 1625, 1626, 1606, 1629, 1603, 1604, 1632, 1607, 1633, 1635, 1608, 1609, 1637, 1610, 1638, 1639, 1611, 1612, 1613, 1615, 1616, 1640, 1643, 1646, 1617, 1648, 1649, 1618, 1619, 1651, 1624, 1625, 1626, 1652, 1629, 1653, 1652, 1632, 1655, 1633, 1635, 1656, 1657, 1637, 1659, 1638, 1639, 1660, 1661, 1651, 1662, 1663, 1640, 1643, 1646, 1665, 1648, 1649, 1666, 1667, 1651, 1669, 1670, 1672, 1652, 1673, 1653, 1677, 1678, 1655, 1679, 1680, 1656, 1657, 1681, 1659, 1682, 1681, 1660, 1661, 1683, 1662, 1663, 1684, 1685, 1689, 1665, 1690, 1692, 1666, 1667, 1693, 1669, 1670, 1672, 1695, 1673, 1699, 1677, 1678, 1682, 1679, 1680, 1700, 1701, 1681, 1702, 1682, 1703, 1705, 1706, 1683, 1708, 1709, 1684, 1685, 1689, 1710, 1690, 1692, 1711, 1715, 1693, 1720, 1721, 1722, 1695, 1725, 1699, 1727, 1728, 1729, 1703, 1732, 1700, 1701, 1733, 1702, 0, 1703, 1705, 1706, 0, 1708, 1709, 0, 0, 0, 1710, 0, 0, 1711, 1715, 0, 1720, 1721, 1722, 0, 1725, 0, 1727, 1728, 1729, 0, 1732, 0, 0, 1733, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1740, 0, 1740, 1740, 1740, 1740, 1740, 1741, 0, 1741, 1741, 1741, 1741, 1741, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1745, 0, 1745, 1745, 1745, 1745, 1745, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1750, 1750, 0, 0, 1750, 1750, 1751, 0, 1751, 1751, 0, 1751, 1751, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1755, 1755, 0, 1755, 1755, 1755, 1755, 1756, 1756, 1756, 0, 1756, 1756, 1756, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1758, 0, 1758, 1758, 1758, 1758, 1758, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1760, 0, 1760, 1760, 1760, 1760, 1760, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "src/maplexer.l" #line 4 "src/maplexer.l" /* ** READ ME FIRST! ** ** When this file is altered, it is necessary to do "make lexer". Due to ** problems detailed in #2310 the lexer is no longer automatically rebuilt ** when maplexer.l is altered. */ #define YY_NO_INPUT /* C declarations */ #include #include #include #include #include #include "mapserver.h" #include "maperror.h" #include "mapfile.h" #include "maptime.h" #include "mapsymbol.h" #include "mapparser.h" #include "mapprimitive.h" /* msyylineno is required for flex 2.5.4 and older, but is already defined by * flex 2.5.31 (bug 975). * Unfortunately there is no clean way to differentiate the two versions, * so we use the symbol YY_CURRENT_BUFFER_LVALUE to base our test since it * was not present in 2.5.4 and is present in 2.5.31. Hopefully that won't * put us in trouble with other versions. If that happens then we can * switch to using autoconf to detect the version. */ #ifndef YY_CURRENT_BUFFER_LVALUE int msyylineno = 1; #endif #define YY_NO_INPUT /* Below is a redefinition of the default YY_INPUT() macro but replacing the * YY_FATAL_ERROR() macro with a call to msSetError(). */ /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ msSetError(MS_PARSEERR, "%s", "msyyparse()", "input in flex scanner failed"); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ msSetError(MS_PARSEERR, "%s", "msyyparse()", "input in flex scanner failed"); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ } int msyysource=MS_STRING_TOKENS; double msyynumber; int msyystate=MS_TOKENIZE_DEFAULT; const char *msyystring=NULL; char *msyybasepath=NULL; int msyystring_buffer_size = 0; int msyystring_size; char msyystring_begin; char *msyystring_buffer = NULL; int msyystring_icase = MS_FALSE; int msyystring_return_state; int msyystring_begin_state; int msyyreturncomments = 0; #define MS_LEXER_STRING_REALLOC(string, string_size, max_size) \ do { \ const int string_size_macro = (int)(string_size); \ if (string_size_macro >= (int)(max_size)) { \ max_size = (((int)(max_size)*2) > string_size_macro) ? ((int)(max_size))*2 : string_size_macro+1; \ string = (char *) msSmallRealloc(string, sizeof(char *) * (max_size)); \ } \ } while(0) #define MS_LEXER_RETURN_TOKEN(token) \ MS_LEXER_STRING_REALLOC(msyystring_buffer, strlen(msyytext), \ msyystring_buffer_size); \ strcpy(msyystring_buffer, msyytext); \ return(token); #define MAX_INCLUDE_DEPTH 5 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_lineno[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; char path[MS_MAXPATHLEN]; #line 2289 "src/maplexer.c" #line 2291 "src/maplexer.c" #define INITIAL 0 #define EXPRESSION_STRING 1 #define INCLUDE 2 #define MSSTRING 3 #define MULTILINE_COMMENT 4 #define CONFIG_FILE 5 #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals ( void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( void ); int yyget_debug ( void ); void yyset_debug ( int debug_flag ); YY_EXTRA_TYPE yyget_extra ( void ); void yyset_extra ( YY_EXTRA_TYPE user_defined ); FILE *yyget_in ( void ); void yyset_in ( FILE * _in_str ); FILE *yyget_out ( void ); void yyset_out ( FILE * _out_str ); int yyget_leng ( void ); char *yyget_text ( void ); int yyget_lineno ( void ); void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( void ); #else extern int yywrap ( void ); #endif #endif #ifndef YY_NO_UNPUT static void yyunput ( int c, char *buf_ptr ); #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput ( void ); #else static int input ( void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } { #line 123 "src/maplexer.l" #line 125 "src/maplexer.l" if (msyystring_buffer == NULL) { msyystring_buffer_size = 256; msyystring_buffer = (char*) msSmallMalloc(sizeof(char) * msyystring_buffer_size); } msyystring_buffer[0] = '\0'; switch(msyystate) { case(MS_TOKENIZE_DEFAULT): (void) yyunput; /* just to avoid warning about it being unrefed */ break; case(MS_TOKENIZE_FILE): BEGIN(INITIAL); msyystring_begin_state = INITIAL; msyysource=MS_FILE_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; include_stack_ptr=0; return(0); break; case(MS_TOKENIZE_STRING): BEGIN(INITIAL); msyystring_begin_state = INITIAL; msyy_delete_buffer(YY_CURRENT_BUFFER); msyy_scan_string(msyystring); msyysource=MS_STRING_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyyin=NULL; msyyreturncomments=0; include_stack_ptr=0; return(0); break; case(MS_TOKENIZE_EXPRESSION): BEGIN(EXPRESSION_STRING); msyystring_begin_state = EXPRESSION_STRING; msyy_delete_buffer(YY_CURRENT_BUFFER); msyy_scan_string(msyystring); msyystate=MS_TOKENIZE_DEFAULT; msyyreturncomments=0; break; case(MS_TOKENIZE_CONFIG): BEGIN(CONFIG_FILE); msyystring_begin_state = CONFIG_FILE; msyysource=MS_FILE_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; return(0); break; case(99): BEGIN(INITIAL); /* may not need this one */ msyystring_begin_state = INITIAL; msyy_delete_buffer(YY_CURRENT_BUFFER); msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; return(0); break; default: break; } #line 2571 "src/maplexer.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1737 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_current_state != 1736 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 188 "src/maplexer.l" ; YY_BREAK case 2: YY_RULE_SETUP #line 190 "src/maplexer.l" { if (msyyreturncomments) return(MS_COMMENT); } YY_BREAK case 3: YY_RULE_SETUP #line 192 "src/maplexer.l" { BEGIN(MULTILINE_COMMENT); } YY_BREAK case 4: YY_RULE_SETUP #line 193 "src/maplexer.l" { BEGIN(INITIAL); } YY_BREAK case 5: YY_RULE_SETUP #line 194 "src/maplexer.l" ; YY_BREAK case 6: YY_RULE_SETUP #line 195 "src/maplexer.l" ; YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 196 "src/maplexer.l" { msyylineno++; } YY_BREAK case 8: YY_RULE_SETUP #line 198 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION); } YY_BREAK case 9: YY_RULE_SETUP #line 199 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_ENV); } YY_BREAK case 10: YY_RULE_SETUP #line 200 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_MAPS); } YY_BREAK case 11: YY_RULE_SETUP #line 201 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_PLUGINS) } YY_BREAK case 12: YY_RULE_SETUP #line 203 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_OR); } YY_BREAK case 13: YY_RULE_SETUP #line 204 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_AND); } YY_BREAK case 14: YY_RULE_SETUP #line 205 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_NOT); } YY_BREAK case 15: YY_RULE_SETUP #line 206 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_EQ); } YY_BREAK case 16: YY_RULE_SETUP #line 207 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_NE); } YY_BREAK case 17: YY_RULE_SETUP #line 208 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_GT); } YY_BREAK case 18: YY_RULE_SETUP #line 209 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_LT); } YY_BREAK case 19: YY_RULE_SETUP #line 210 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_GE); } YY_BREAK case 20: YY_RULE_SETUP #line 211 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_LE); } YY_BREAK case 21: YY_RULE_SETUP #line 212 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_RE); } YY_BREAK case 22: YY_RULE_SETUP #line 214 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IEQ); } YY_BREAK case 23: YY_RULE_SETUP #line 215 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IRE); } YY_BREAK case 24: YY_RULE_SETUP #line 217 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IN); /* was IN */ } YY_BREAK case 25: YY_RULE_SETUP #line 219 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_AREA); } YY_BREAK case 26: YY_RULE_SETUP #line 220 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_LENGTH); } YY_BREAK case 27: YY_RULE_SETUP #line 221 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_TOSTRING); } YY_BREAK case 28: YY_RULE_SETUP #line 222 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_COMMIFY); } YY_BREAK case 29: YY_RULE_SETUP #line 223 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_ROUND); } YY_BREAK case 30: YY_RULE_SETUP #line 224 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_UPPER); } YY_BREAK case 31: YY_RULE_SETUP #line 225 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_LOWER); } YY_BREAK case 32: YY_RULE_SETUP #line 226 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_INITCAP); } YY_BREAK case 33: YY_RULE_SETUP #line 227 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_FIRSTCAP); } YY_BREAK case 34: YY_RULE_SETUP #line 229 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_BUFFER); } YY_BREAK case 35: YY_RULE_SETUP #line 230 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_DIFFERENCE); } YY_BREAK case 36: YY_RULE_SETUP #line 231 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SIMPLIFY); } YY_BREAK case 37: YY_RULE_SETUP #line 232 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SIMPLIFYPT); } YY_BREAK case 38: YY_RULE_SETUP #line 233 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_GENERALIZE); } YY_BREAK case 39: YY_RULE_SETUP #line 234 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SMOOTHSIA); } YY_BREAK case 40: YY_RULE_SETUP #line 235 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_CENTERLINE); } YY_BREAK case 41: YY_RULE_SETUP #line 236 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_DENSIFY); } YY_BREAK case 42: YY_RULE_SETUP #line 237 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_OUTER); } YY_BREAK case 43: YY_RULE_SETUP #line 238 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_INNER); } YY_BREAK case 44: YY_RULE_SETUP #line 239 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_JAVASCRIPT); } YY_BREAK case 45: YY_RULE_SETUP #line 241 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_INTERSECTS); } YY_BREAK case 46: YY_RULE_SETUP #line 242 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_DISJOINT); } YY_BREAK case 47: YY_RULE_SETUP #line 243 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_TOUCHES); } YY_BREAK case 48: YY_RULE_SETUP #line 244 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_OVERLAPS); } YY_BREAK case 49: YY_RULE_SETUP #line 245 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_CROSSES); } YY_BREAK case 50: YY_RULE_SETUP #line 246 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_WITHIN); } YY_BREAK case 51: YY_RULE_SETUP #line 247 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_CONTAINS); } YY_BREAK case 52: YY_RULE_SETUP #line 248 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_EQUALS); } YY_BREAK case 53: YY_RULE_SETUP #line 249 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_BEYOND); } YY_BREAK case 54: YY_RULE_SETUP #line 250 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_DWITHIN); } YY_BREAK case 55: YY_RULE_SETUP #line 252 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_FROMTEXT); } YY_BREAK case 56: YY_RULE_SETUP #line 254 "src/maplexer.l" { msyynumber=MS_TRUE; return(MS_TOKEN_LITERAL_BOOLEAN); } YY_BREAK case 57: YY_RULE_SETUP #line 255 "src/maplexer.l" { msyynumber=MS_FALSE; return(MS_TOKEN_LITERAL_BOOLEAN); } YY_BREAK case 58: YY_RULE_SETUP #line 257 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COLORRANGE); } YY_BREAK case 59: YY_RULE_SETUP #line 258 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DATARANGE); } YY_BREAK case 60: YY_RULE_SETUP #line 259 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(RANGEITEM); } YY_BREAK case 61: YY_RULE_SETUP #line 261 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ALIGN); } YY_BREAK case 62: YY_RULE_SETUP #line 262 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ANCHORPOINT); } YY_BREAK case 63: YY_RULE_SETUP #line 263 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ANGLE); } YY_BREAK case 64: YY_RULE_SETUP #line 264 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ANTIALIAS); } YY_BREAK case 65: YY_RULE_SETUP #line 265 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BACKGROUNDCOLOR); } YY_BREAK case 66: YY_RULE_SETUP #line 266 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BANDSITEM); } YY_BREAK case 67: YY_RULE_SETUP #line 267 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BINDVALS); } YY_BREAK case 68: YY_RULE_SETUP #line 268 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BOM); } YY_BREAK case 69: YY_RULE_SETUP #line 269 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BROWSEFORMAT); } YY_BREAK case 70: YY_RULE_SETUP #line 270 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BUFFER); } YY_BREAK case 71: YY_RULE_SETUP #line 271 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CHARACTER); } YY_BREAK case 72: YY_RULE_SETUP #line 272 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLASS); } YY_BREAK case 73: YY_RULE_SETUP #line 273 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLASSITEM); } YY_BREAK case 74: YY_RULE_SETUP #line 274 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLASSGROUP); } YY_BREAK case 75: YY_RULE_SETUP #line 275 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLUSTER); } YY_BREAK case 76: YY_RULE_SETUP #line 276 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COLOR); } YY_BREAK case 77: YY_RULE_SETUP #line 277 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COMPFILTER); } YY_BREAK case 78: YY_RULE_SETUP #line 278 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COMPOSITE); } YY_BREAK case 79: YY_RULE_SETUP #line 279 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COMPOP); } YY_BREAK case 80: YY_RULE_SETUP #line 280 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CONFIG); } YY_BREAK case 81: YY_RULE_SETUP #line 281 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CONNECTION); } YY_BREAK case 82: YY_RULE_SETUP #line 282 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CONNECTIONTYPE); } YY_BREAK case 83: YY_RULE_SETUP #line 283 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DATA); } YY_BREAK case 84: YY_RULE_SETUP #line 284 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DEBUG); } YY_BREAK case 85: YY_RULE_SETUP #line 285 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DRIVER); } YY_BREAK case 86: YY_RULE_SETUP #line 286 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(EMPTY); } YY_BREAK case 87: YY_RULE_SETUP #line 287 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ENCODING); } YY_BREAK case 88: YY_RULE_SETUP #line 288 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(END); } YY_BREAK case 89: YY_RULE_SETUP #line 289 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ERROR); } YY_BREAK case 90: YY_RULE_SETUP #line 290 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(EXPRESSION); } YY_BREAK case 91: YY_RULE_SETUP #line 291 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(EXTENT); } YY_BREAK case 92: YY_RULE_SETUP #line 292 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(EXTENSION); } YY_BREAK case 93: YY_RULE_SETUP #line 293 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FEATURE); } YY_BREAK case 94: YY_RULE_SETUP #line 294 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FILLED); } YY_BREAK case 95: YY_RULE_SETUP #line 295 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FILTER); } YY_BREAK case 96: YY_RULE_SETUP #line 296 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FILTERITEM); } YY_BREAK case 97: YY_RULE_SETUP #line 297 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FOOTER); } YY_BREAK case 98: YY_RULE_SETUP #line 298 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FONT); } YY_BREAK case 99: YY_RULE_SETUP #line 299 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FONTSET); } YY_BREAK case 100: YY_RULE_SETUP #line 300 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FORCE); } YY_BREAK case 101: YY_RULE_SETUP #line 301 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FORMATOPTION); } YY_BREAK case 102: YY_RULE_SETUP #line 302 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FROM); } YY_BREAK case 103: YY_RULE_SETUP #line 303 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GAP); } YY_BREAK case 104: YY_RULE_SETUP #line 304 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GEOMTRANSFORM); } YY_BREAK case 105: YY_RULE_SETUP #line 305 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GRID); } YY_BREAK case 106: YY_RULE_SETUP #line 306 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GRIDSTEP); } YY_BREAK case 107: YY_RULE_SETUP #line 307 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GRATICULE); } YY_BREAK case 108: YY_RULE_SETUP #line 308 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GROUP); } YY_BREAK case 109: YY_RULE_SETUP #line 309 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(HEADER); } YY_BREAK case 110: YY_RULE_SETUP #line 310 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGE); } YY_BREAK case 111: YY_RULE_SETUP #line 311 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGECOLOR); } YY_BREAK case 112: YY_RULE_SETUP #line 312 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGETYPE); } YY_BREAK case 113: YY_RULE_SETUP #line 313 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGEMODE); } YY_BREAK case 114: YY_RULE_SETUP #line 314 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGEPATH); } YY_BREAK case 115: YY_RULE_SETUP #line 315 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TEMPPATH); } YY_BREAK case 116: YY_RULE_SETUP #line 316 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGEURL); } YY_BREAK case 117: YY_RULE_SETUP #line 317 "src/maplexer.l" { BEGIN(INCLUDE); } YY_BREAK case 118: YY_RULE_SETUP #line 318 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(INDEX); } YY_BREAK case 119: YY_RULE_SETUP #line 319 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(INITIALGAP); } YY_BREAK case 120: YY_RULE_SETUP #line 320 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(INTERVALS); } YY_BREAK case 121: YY_RULE_SETUP #line 321 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(JOIN); } YY_BREAK case 122: YY_RULE_SETUP #line 322 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(KEYIMAGE); } YY_BREAK case 123: YY_RULE_SETUP #line 323 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(KEYSIZE); } YY_BREAK case 124: YY_RULE_SETUP #line 324 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(KEYSPACING); } YY_BREAK case 125: YY_RULE_SETUP #line 325 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABEL); } YY_BREAK case 126: YY_RULE_SETUP #line 326 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELCACHE); } YY_BREAK case 127: YY_RULE_SETUP #line 327 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELFORMAT); } YY_BREAK case 128: YY_RULE_SETUP #line 328 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELITEM); } YY_BREAK case 129: YY_RULE_SETUP #line 329 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELMAXSCALE); } YY_BREAK case 130: YY_RULE_SETUP #line 330 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELMAXSCALEDENOM); } YY_BREAK case 131: YY_RULE_SETUP #line 331 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELMINSCALE); } YY_BREAK case 132: YY_RULE_SETUP #line 332 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELMINSCALEDENOM); } YY_BREAK case 133: YY_RULE_SETUP #line 333 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELREQUIRES); } YY_BREAK case 134: YY_RULE_SETUP #line 334 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LATLON); } YY_BREAK case 135: YY_RULE_SETUP #line 335 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LAYER); } YY_BREAK case 136: YY_RULE_SETUP #line 336 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LEADER); } YY_BREAK case 137: YY_RULE_SETUP #line 337 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LEGEND); } YY_BREAK case 138: YY_RULE_SETUP #line 338 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LEGENDFORMAT); } YY_BREAK case 139: YY_RULE_SETUP #line 339 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LINECAP); } YY_BREAK case 140: YY_RULE_SETUP #line 340 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LINEJOIN); } YY_BREAK case 141: YY_RULE_SETUP #line 341 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LINEJOINMAXSIZE); } YY_BREAK case 142: YY_RULE_SETUP #line 342 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAP); } YY_BREAK case 143: YY_RULE_SETUP #line 343 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MARKER); } YY_BREAK case 144: YY_RULE_SETUP #line 344 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MARKERSIZE); } YY_BREAK case 145: YY_RULE_SETUP #line 345 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MASK); } YY_BREAK case 146: YY_RULE_SETUP #line 346 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXARCS); } YY_BREAK case 147: YY_RULE_SETUP #line 347 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXBOXSIZE); } YY_BREAK case 148: YY_RULE_SETUP #line 348 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXDISTANCE); } YY_BREAK case 149: YY_RULE_SETUP #line 349 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXFEATURES); } YY_BREAK case 150: YY_RULE_SETUP #line 350 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXINTERVAL); } YY_BREAK case 151: YY_RULE_SETUP #line 351 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXSCALE); } YY_BREAK case 152: YY_RULE_SETUP #line 352 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXSCALEDENOM); } YY_BREAK case 153: YY_RULE_SETUP #line 353 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXGEOWIDTH); } YY_BREAK case 154: YY_RULE_SETUP #line 354 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXLENGTH); } YY_BREAK case 155: YY_RULE_SETUP #line 355 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXSIZE); } YY_BREAK case 156: YY_RULE_SETUP #line 356 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXSUBDIVIDE); } YY_BREAK case 157: YY_RULE_SETUP #line 357 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXTEMPLATE); } YY_BREAK case 158: YY_RULE_SETUP #line 358 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXWIDTH); } YY_BREAK case 159: YY_RULE_SETUP #line 359 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(METADATA); } YY_BREAK case 160: YY_RULE_SETUP #line 360 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MIMETYPE); } YY_BREAK case 161: YY_RULE_SETUP #line 361 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINARCS); } YY_BREAK case 162: YY_RULE_SETUP #line 362 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINBOXSIZE); } YY_BREAK case 163: YY_RULE_SETUP #line 363 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINDISTANCE); } YY_BREAK case 164: YY_RULE_SETUP #line 364 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(REPEATDISTANCE); } YY_BREAK case 165: YY_RULE_SETUP #line 365 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXOVERLAPANGLE); } YY_BREAK case 166: YY_RULE_SETUP #line 366 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINFEATURESIZE); } YY_BREAK case 167: YY_RULE_SETUP #line 367 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MININTERVAL); } YY_BREAK case 168: YY_RULE_SETUP #line 368 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINSCALE); } YY_BREAK case 169: YY_RULE_SETUP #line 369 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINSCALEDENOM); } YY_BREAK case 170: YY_RULE_SETUP #line 370 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINGEOWIDTH); } YY_BREAK case 171: YY_RULE_SETUP #line 371 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINSIZE); } YY_BREAK case 172: YY_RULE_SETUP #line 372 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINSUBDIVIDE); } YY_BREAK case 173: YY_RULE_SETUP #line 373 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINTEMPLATE); } YY_BREAK case 174: YY_RULE_SETUP #line 374 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINWIDTH); } YY_BREAK case 175: YY_RULE_SETUP #line 375 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(NAME); } YY_BREAK case 176: YY_RULE_SETUP #line 376 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OFFSET); } YY_BREAK case 177: YY_RULE_SETUP #line 377 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OFFSITE); } YY_BREAK case 178: YY_RULE_SETUP #line 378 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OPACITY); } YY_BREAK case 179: YY_RULE_SETUP #line 379 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CONNECTIONOPTIONS); } YY_BREAK case 180: YY_RULE_SETUP #line 380 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OUTLINECOLOR); } YY_BREAK case 181: YY_RULE_SETUP #line 381 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OUTLINEWIDTH); } YY_BREAK case 182: YY_RULE_SETUP #line 382 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OUTPUTFORMAT); } YY_BREAK case 183: YY_RULE_SETUP #line 383 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PARTIALS); } YY_BREAK case 184: YY_RULE_SETUP #line 384 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PATTERN); } YY_BREAK case 185: YY_RULE_SETUP #line 385 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(POINTS); } YY_BREAK case 186: YY_RULE_SETUP #line 386 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ITEMS); } YY_BREAK case 187: YY_RULE_SETUP #line 387 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(POSITION); } YY_BREAK case 188: YY_RULE_SETUP #line 388 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(POSTLABELCACHE); } YY_BREAK case 189: YY_RULE_SETUP #line 389 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PRIORITY); } YY_BREAK case 190: YY_RULE_SETUP #line 390 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PROCESSING); } YY_BREAK case 191: YY_RULE_SETUP #line 391 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PROJECTION); } YY_BREAK case 192: YY_RULE_SETUP #line 392 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(QUERYFORMAT); } YY_BREAK case 193: YY_RULE_SETUP #line 393 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(QUERYMAP); } YY_BREAK case 194: YY_RULE_SETUP #line 394 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(REFERENCE); } YY_BREAK case 195: YY_RULE_SETUP #line 395 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(REGION); } YY_BREAK case 196: YY_RULE_SETUP #line 396 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(RELATIVETO); } YY_BREAK case 197: YY_RULE_SETUP #line 397 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(REQUIRES); } YY_BREAK case 198: YY_RULE_SETUP #line 398 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(RESOLUTION); } YY_BREAK case 199: YY_RULE_SETUP #line 399 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DEFRESOLUTION); } YY_BREAK case 200: YY_RULE_SETUP #line 400 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SCALE); } YY_BREAK case 201: YY_RULE_SETUP #line 401 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SCALEDENOM); } YY_BREAK case 202: YY_RULE_SETUP #line 402 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SCALEBAR); } YY_BREAK case 203: YY_RULE_SETUP #line 403 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SCALETOKEN); } YY_BREAK case 204: YY_RULE_SETUP #line 404 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SHADOWCOLOR); } YY_BREAK case 205: YY_RULE_SETUP #line 405 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SHADOWSIZE); } YY_BREAK case 206: YY_RULE_SETUP #line 406 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SHAPEPATH); } YY_BREAK case 207: YY_RULE_SETUP #line 407 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SIZE); } YY_BREAK case 208: YY_RULE_SETUP #line 408 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SIZEUNITS); } YY_BREAK case 209: YY_RULE_SETUP #line 409 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(STATUS); } YY_BREAK case 210: YY_RULE_SETUP #line 410 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(STYLE); } YY_BREAK case 211: YY_RULE_SETUP #line 411 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(STYLEITEM); } YY_BREAK case 212: YY_RULE_SETUP #line 412 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SYMBOL); } YY_BREAK case 213: YY_RULE_SETUP #line 413 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SYMBOLSCALE); } YY_BREAK case 214: YY_RULE_SETUP #line 414 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SYMBOLSCALEDENOM); } YY_BREAK case 215: YY_RULE_SETUP #line 415 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SYMBOLSET); } YY_BREAK case 216: YY_RULE_SETUP #line 416 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TABLE); } YY_BREAK case 217: YY_RULE_SETUP #line 417 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TEMPLATE); } YY_BREAK case 218: YY_RULE_SETUP #line 418 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TEXT); } YY_BREAK case 219: YY_RULE_SETUP #line 419 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TILEINDEX); } YY_BREAK case 220: YY_RULE_SETUP #line 420 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TILEITEM); } YY_BREAK case 221: YY_RULE_SETUP #line 421 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TILESRS); } YY_BREAK case 222: YY_RULE_SETUP #line 422 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TITLE); } YY_BREAK case 223: YY_RULE_SETUP #line 423 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TO); } YY_BREAK case 224: YY_RULE_SETUP #line 424 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TOLERANCE); } YY_BREAK case 225: YY_RULE_SETUP #line 425 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TOLERANCEUNITS); } YY_BREAK case 226: YY_RULE_SETUP #line 426 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TRANSPARENT); } YY_BREAK case 227: YY_RULE_SETUP #line 427 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TRANSFORM); } YY_BREAK case 228: YY_RULE_SETUP #line 428 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TYPE); } YY_BREAK case 229: YY_RULE_SETUP #line 429 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(UNITS); } YY_BREAK case 230: YY_RULE_SETUP #line 430 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(UTFDATA); } YY_BREAK case 231: YY_RULE_SETUP #line 431 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(UTFITEM); } YY_BREAK case 232: YY_RULE_SETUP #line 432 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(VALIDATION); } YY_BREAK case 233: YY_RULE_SETUP #line 433 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(VALUES); } YY_BREAK case 234: YY_RULE_SETUP #line 434 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(WEB); } YY_BREAK case 235: YY_RULE_SETUP #line 435 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(WIDTH); } YY_BREAK case 236: YY_RULE_SETUP #line 436 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(WKT); } YY_BREAK case 237: YY_RULE_SETUP #line 437 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(WRAP); } YY_BREAK case 238: YY_RULE_SETUP #line 439 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_ANNOTATION); } YY_BREAK case 239: YY_RULE_SETUP #line 440 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_AUTO); } YY_BREAK case 240: YY_RULE_SETUP #line 441 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_AUTO2); } YY_BREAK case 241: YY_RULE_SETUP #line 442 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_BEVEL); } YY_BREAK case 242: YY_RULE_SETUP #line 443 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_BITMAP); } YY_BREAK case 243: YY_RULE_SETUP #line 444 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_BUTT); } YY_BREAK case 244: YY_RULE_SETUP #line 445 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CC); } YY_BREAK case 245: YY_RULE_SETUP #line 446 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ALIGN_CENTER); } YY_BREAK case 246: YY_RULE_SETUP #line 447 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_CHART); } YY_BREAK case 247: YY_RULE_SETUP #line 448 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_CIRCLE); } YY_BREAK case 248: YY_RULE_SETUP #line 449 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CL); } YY_BREAK case 249: YY_RULE_SETUP #line 450 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CR); } YY_BREAK case 250: YY_RULE_SETUP #line 451 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DB_CSV); } YY_BREAK case 251: YY_RULE_SETUP #line 452 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DB_POSTGRES); } YY_BREAK case 252: YY_RULE_SETUP #line 453 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DB_MYSQL); } YY_BREAK case 253: YY_RULE_SETUP #line 454 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DEFAULT); } YY_BREAK case 254: YY_RULE_SETUP #line 455 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DD); } YY_BREAK case 255: YY_RULE_SETUP #line 456 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_ELLIPSE); } YY_BREAK case 256: YY_RULE_SETUP #line 457 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_EMBED); } YY_BREAK case 257: YY_RULE_SETUP #line 458 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_FALSE); } YY_BREAK case 258: YY_RULE_SETUP #line 459 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_FEET); } YY_BREAK case 259: YY_RULE_SETUP #line 460 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_FOLLOW); } YY_BREAK case 260: YY_RULE_SETUP #line 461 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_GIANT); } YY_BREAK case 261: YY_RULE_SETUP #line 462 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_HATCH); } YY_BREAK case 262: YY_RULE_SETUP #line 463 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_KERNELDENSITY); } YY_BREAK case 263: YY_RULE_SETUP #line 464 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_IDW); } YY_BREAK case 264: YY_RULE_SETUP #line 465 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_HILITE); } YY_BREAK case 265: YY_RULE_SETUP #line 466 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_INCHES); } YY_BREAK case 266: YY_RULE_SETUP #line 467 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_KILOMETERS); } YY_BREAK case 267: YY_RULE_SETUP #line 468 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LARGE); } YY_BREAK case 268: YY_RULE_SETUP #line 469 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LC); } YY_BREAK case 269: YY_RULE_SETUP #line 470 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ALIGN_LEFT); } YY_BREAK case 270: YY_RULE_SETUP #line 471 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_LINE); } YY_BREAK case 271: YY_RULE_SETUP #line 472 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LL); } YY_BREAK case 272: YY_RULE_SETUP #line 473 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LR); } YY_BREAK case 273: YY_RULE_SETUP #line 474 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_MEDIUM); } YY_BREAK case 274: YY_RULE_SETUP #line 475 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_METERS); } YY_BREAK case 275: YY_RULE_SETUP #line 476 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_NAUTICALMILES); } YY_BREAK case 276: YY_RULE_SETUP #line 477 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_MILES); } YY_BREAK case 277: YY_RULE_SETUP #line 478 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_MITER); } YY_BREAK case 278: YY_RULE_SETUP #line 479 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_MULTIPLE); } YY_BREAK case 279: YY_RULE_SETUP #line 480 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_NONE); } YY_BREAK case 280: YY_RULE_SETUP #line 481 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_NORMAL); } YY_BREAK case 281: YY_RULE_SETUP #line 482 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_OFF); } YY_BREAK case 282: YY_RULE_SETUP #line 483 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_OGR); } YY_BREAK case 283: YY_RULE_SETUP #line 484 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_FLATGEOBUF); } YY_BREAK case 284: YY_RULE_SETUP #line 485 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ON); } YY_BREAK case 285: YY_RULE_SETUP #line 486 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_JOIN_ONE_TO_ONE); } YY_BREAK case 286: YY_RULE_SETUP #line 487 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_JOIN_ONE_TO_MANY); } YY_BREAK case 287: YY_RULE_SETUP #line 488 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ORACLESPATIAL); } YY_BREAK case 288: YY_RULE_SETUP #line 489 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_PERCENTAGES); } YY_BREAK case 289: YY_RULE_SETUP #line 490 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_PIXMAP); } YY_BREAK case 290: YY_RULE_SETUP #line 491 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_PIXELS); } YY_BREAK case 291: YY_RULE_SETUP #line 492 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_POINT); } YY_BREAK case 292: YY_RULE_SETUP #line 493 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_POLYGON); } YY_BREAK case 293: YY_RULE_SETUP #line 494 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_POSTGIS); } YY_BREAK case 294: YY_RULE_SETUP #line 495 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_PLUGIN); } YY_BREAK case 295: YY_RULE_SETUP #line 496 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_QUERY); } YY_BREAK case 296: YY_RULE_SETUP #line 497 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_RASTER); } YY_BREAK case 297: YY_RULE_SETUP #line 498 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_RASTER_LABEL); } YY_BREAK case 298: YY_RULE_SETUP #line 499 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ALIGN_RIGHT); } YY_BREAK case 299: YY_RULE_SETUP #line 500 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_ROUND); } YY_BREAK case 300: YY_RULE_SETUP #line 501 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SELECTED); } YY_BREAK case 301: YY_RULE_SETUP #line 502 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_SIMPLE); } YY_BREAK case 302: YY_RULE_SETUP #line 503 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SINGLE); } YY_BREAK case 303: YY_RULE_SETUP #line 504 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SMALL); } YY_BREAK case 304: YY_RULE_SETUP #line 505 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_SQUARE); } YY_BREAK case 305: YY_RULE_SETUP #line 506 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_SVG); } YY_BREAK case 306: YY_RULE_SETUP #line 507 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(POLAROFFSET); } YY_BREAK case 307: YY_RULE_SETUP #line 508 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TINY); } YY_BREAK case 308: YY_RULE_SETUP #line 509 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_TRIANGLE); } YY_BREAK case 309: YY_RULE_SETUP #line 510 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TRUE); } YY_BREAK case 310: YY_RULE_SETUP #line 511 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TRUETYPE); } YY_BREAK case 311: YY_RULE_SETUP #line 512 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UC); } YY_BREAK case 312: YY_RULE_SETUP #line 513 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UL); } YY_BREAK case 313: YY_RULE_SETUP #line 514 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UR); } YY_BREAK case 314: YY_RULE_SETUP #line 515 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UNION); } YY_BREAK case 315: YY_RULE_SETUP #line 516 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UVRASTER); } YY_BREAK case 316: YY_RULE_SETUP #line 517 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONTOUR); } YY_BREAK case 317: YY_RULE_SETUP #line 518 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_VECTOR); } YY_BREAK case 318: YY_RULE_SETUP #line 519 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_WFS); } YY_BREAK case 319: YY_RULE_SETUP #line 520 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_WMS); } YY_BREAK case 320: /* rule 320 can match eol */ YY_RULE_SETUP #line 522 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); return(MS_BINDING); } YY_BREAK case 321: YY_RULE_SETUP #line 531 "src/maplexer.l" { /* attribute binding - shape (fixed value) */ return(MS_TOKEN_BINDING_SHAPE); } YY_BREAK case 322: YY_RULE_SETUP #line 535 "src/maplexer.l" { /* attribute binding - map cellsize */ return(MS_TOKEN_BINDING_MAP_CELLSIZE); } YY_BREAK case 323: YY_RULE_SETUP #line 539 "src/maplexer.l" { /* attribute binding - data cellsize */ return(MS_TOKEN_BINDING_DATA_CELLSIZE); } YY_BREAK case 324: /* rule 324 can match eol */ YY_RULE_SETUP #line 543 "src/maplexer.l" { /* attribute binding - numeric (no quotes) */ msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_BINDING_DOUBLE); } YY_BREAK case 325: /* rule 325 can match eol */ YY_RULE_SETUP #line 552 "src/maplexer.l" { /* attribute binding - string (single or double quotes) */ msyytext+=2; msyytext[msyyleng-2-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_BINDING_STRING); } YY_BREAK case 326: /* rule 326 can match eol */ YY_RULE_SETUP #line 561 "src/maplexer.l" { /* attribute binding - time */ msyytext+=2; msyytext[msyyleng-2-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_BINDING_TIME); } YY_BREAK case 327: YY_RULE_SETUP #line 571 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); msyynumber = atof(msyytext); return(MS_NUMBER); } YY_BREAK case 328: YY_RULE_SETUP #line 579 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); msyynumber = atof(msyytext); return(MS_TOKEN_LITERAL_NUMBER); } YY_BREAK case 329: /* rule 329 can match eol */ YY_RULE_SETUP #line 587 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_LITERAL_TIME); } YY_BREAK case 330: /* rule 330 can match eol */ YY_RULE_SETUP #line 596 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_IREGEX); } YY_BREAK case 331: /* rule 331 can match eol */ YY_RULE_SETUP #line 605 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_REGEX); } YY_BREAK case 332: YY_RULE_SETUP #line 614 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_EXPRESSION); } YY_BREAK case 333: YY_RULE_SETUP #line 623 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_LIST); } YY_BREAK case 334: YY_RULE_SETUP #line 632 "src/maplexer.l" { msyystring_return_state = MS_STRING; msyystring_begin = msyytext[0]; msyystring_size = 0; msyystring_buffer[0] = '\0'; BEGIN(MSSTRING); } YY_BREAK case 335: YY_RULE_SETUP #line 640 "src/maplexer.l" { if (msyystring_begin == msyytext[0]) { BEGIN(msyystring_begin_state); if (msyystring_return_state == MS_STRING) { if (msyystring_icase && msyyleng==2) { msyystring_icase = MS_FALSE; // reset return MS_ISTRING; } else return MS_STRING; } return msyystring_return_state; } else { int old_size = msyystring_size; msyystring_size += (msyyleng==2) ? 2 : 1; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); msyystring_buffer[old_size] = *msyytext; if (msyyleng==2) { msyystring_buffer[old_size+1] = msyytext[1]; } msyystring_buffer[msyystring_size] = '\0'; } } YY_BREAK case 336: YY_RULE_SETUP #line 666 "src/maplexer.l" { ++msyystring_size; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); if (msyyleng == 2) msyystring_buffer[msyystring_size-1] = msyytext[1]; else msyystring_buffer[msyystring_size-1] = msyytext[0]; msyystring_buffer[msyystring_size] = '\0'; } YY_BREAK case 337: /* rule 337 can match eol */ YY_RULE_SETUP #line 678 "src/maplexer.l" { int old_size = msyystring_size; msyystring_size += msyyleng; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); memcpy(msyystring_buffer + old_size, msyytext, msyyleng + 1); } YY_BREAK case 338: /* rule 338 can match eol */ YY_RULE_SETUP #line 686 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { msSetError(MS_IOERR, "Includes nested to deeply.", "msyylex()"); return(-1); } msyyin = fopen(msBuildPath(path, msyybasepath, msyytext), "r"); if(!msyyin) { msSetError(MS_IOERR, "Error opening included file \"%s\".", "msyylex()", msyytext); msyyin = YY_CURRENT_BUFFER->yy_input_file; return(-1); } include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; /* save state */ include_lineno[include_stack_ptr] = msyylineno; include_stack_ptr++; msyy_switch_to_buffer( msyy_create_buffer(msyyin, YY_BUF_SIZE) ); msyylineno = 1; BEGIN(INITIAL); } YY_BREAK case 339: YY_RULE_SETUP #line 712 "src/maplexer.l" { msyystring_return_state = MS_TOKEN_LITERAL_STRING; msyystring_begin = msyytext[0]; msyystring_size = 0; msyystring_buffer[0] = '\0'; BEGIN(MSSTRING); } YY_BREAK case 340: YY_RULE_SETUP #line 720 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_STRING); } YY_BREAK case 341: /* rule 341 can match eol */ YY_RULE_SETUP #line 727 "src/maplexer.l" { msyylineno++; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(CONFIG_FILE): #line 729 "src/maplexer.l" { if( --include_stack_ptr < 0 ) return(EOF); /* end of main file */ else { fclose(YY_CURRENT_BUFFER->yy_input_file); msyy_delete_buffer( YY_CURRENT_BUFFER ); msyy_switch_to_buffer(include_stack[include_stack_ptr]); msyylineno = include_lineno[include_stack_ptr]; } } YY_BREAK case 342: /* rule 342 can match eol */ YY_RULE_SETUP #line 740 "src/maplexer.l" { return(0); } YY_BREAK case 343: YY_RULE_SETUP #line 744 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(0); } YY_BREAK case 344: YY_RULE_SETUP #line 750 "src/maplexer.l" { return(msyytext[0]); } YY_BREAK case 345: YY_RULE_SETUP #line 751 "src/maplexer.l" ECHO; YY_BREAK #line 4550 "src/maplexer.c" case YY_STATE_EOF(EXPRESSION_STRING): case YY_STATE_EOF(INCLUDE): case YY_STATE_EOF(MSSTRING): case YY_STATE_EOF(MULTILINE_COMMENT): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc( (void *) b->yy_ch_buf, (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { yy_state_type yy_current_state; char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 86); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1737 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { int yy_is_jam; char *yy_cp = (yy_c_buf_p); YY_CHAR yy_c = 86; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1737 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 1736); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT static void yyunput (int c, char * yy_bp ) { char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ int number_to_move = (yy_n_chars) + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree( (void *) b->yy_ch_buf ); yyfree( (void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return NULL; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (const char * yystr ) { return yy_scan_bytes( yystr, (int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yynoreturn yy_fatal_error (const char* msg ) { fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param _line_number line number * */ void yyset_lineno (int _line_number ) { yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str ) { yyin = _in_str ; } void yyset_out (FILE * _out_str ) { yyout = _out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int _bdebug ) { yy_flex_debug = _bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, const char * s2, int n ) { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s ) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 751 "src/maplexer.l" /* ** Any extra C functions */ int msyywrap() /* override */ { return(1); } int msyyerror(char *s) { msSetError(MS_PARSEERR, "%s", "msyyparse()", s); return(0); } /* cleanup any open includes */ void msyycleanup_includes() { while( --include_stack_ptr >= 0 ) { fclose(YY_CURRENT_BUFFER->yy_input_file); msyy_delete_buffer( YY_CURRENT_BUFFER ); msyy_switch_to_buffer(include_stack[include_stack_ptr]); } } mapserver-8.4.0/src/maplexer.l000066400000000000000000001325211474174441300163250ustar00rootroot00000000000000%option never-interactive %{ /* ** READ ME FIRST! ** ** When this file is altered, it is necessary to do "make lexer". Due to ** problems detailed in #2310 the lexer is no longer automatically rebuilt ** when maplexer.l is altered. */ #define YY_NO_INPUT /* C declarations */ #include #include #include #include #include #include "mapserver.h" #include "maperror.h" #include "mapfile.h" #include "maptime.h" #include "mapsymbol.h" #include "mapparser.h" #include "mapprimitive.h" /* msyylineno is required for flex 2.5.4 and older, but is already defined by * flex 2.5.31 (bug 975). * Unfortunately there is no clean way to differentiate the two versions, * so we use the symbol YY_CURRENT_BUFFER_LVALUE to base our test since it * was not present in 2.5.4 and is present in 2.5.31. Hopefully that won't * put us in trouble with other versions. If that happens then we can * switch to using autoconf to detect the version. */ #ifndef YY_CURRENT_BUFFER_LVALUE int msyylineno = 1; #endif #define YY_NO_INPUT /* Below is a redefinition of the default YY_INPUT() macro but replacing the * YY_FATAL_ERROR() macro with a call to msSetError(). */ /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ msSetError(MS_PARSEERR, "%s", "msyyparse()", "input in flex scanner failed"); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ msSetError(MS_PARSEERR, "%s", "msyyparse()", "input in flex scanner failed"); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ } int msyysource=MS_STRING_TOKENS; double msyynumber; int msyystate=MS_TOKENIZE_DEFAULT; const char *msyystring=NULL; char *msyybasepath=NULL; int msyystring_buffer_size = 0; int msyystring_size; char msyystring_begin; char *msyystring_buffer = NULL; int msyystring_icase = MS_FALSE; int msyystring_return_state; int msyystring_begin_state; int msyyreturncomments = 0; #define MS_LEXER_STRING_REALLOC(string, string_size, max_size) \ do { \ const int string_size_macro = (int)(string_size); \ if (string_size_macro >= (int)(max_size)) { \ max_size = (((int)(max_size)*2) > string_size_macro) ? ((int)(max_size))*2 : string_size_macro+1; \ string = (char *) msSmallRealloc(string, sizeof(char *) * (max_size)); \ } \ } while(0) #define MS_LEXER_RETURN_TOKEN(token) \ MS_LEXER_STRING_REALLOC(msyystring_buffer, strlen(msyytext), \ msyystring_buffer_size); \ strcpy(msyystring_buffer, msyytext); \ return(token); #define MAX_INCLUDE_DEPTH 5 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_lineno[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; char path[MS_MAXPATHLEN]; %} %s EXPRESSION_STRING %s INCLUDE %s MSSTRING %s MULTILINE_COMMENT %s CONFIG_FILE %% if (msyystring_buffer == NULL) { msyystring_buffer_size = 256; msyystring_buffer = (char*) msSmallMalloc(sizeof(char) * msyystring_buffer_size); } msyystring_buffer[0] = '\0'; switch(msyystate) { case(MS_TOKENIZE_DEFAULT): (void) yyunput; /* just to avoid warning about it being unrefed */ break; case(MS_TOKENIZE_FILE): BEGIN(INITIAL); msyystring_begin_state = INITIAL; msyysource=MS_FILE_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; include_stack_ptr=0; return(0); break; case(MS_TOKENIZE_STRING): BEGIN(INITIAL); msyystring_begin_state = INITIAL; msyy_delete_buffer(YY_CURRENT_BUFFER); msyy_scan_string(msyystring); msyysource=MS_STRING_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyyin=NULL; msyyreturncomments=0; include_stack_ptr=0; return(0); break; case(MS_TOKENIZE_EXPRESSION): BEGIN(EXPRESSION_STRING); msyystring_begin_state = EXPRESSION_STRING; msyy_delete_buffer(YY_CURRENT_BUFFER); msyy_scan_string(msyystring); msyystate=MS_TOKENIZE_DEFAULT; msyyreturncomments=0; break; case(MS_TOKENIZE_CONFIG): BEGIN(CONFIG_FILE); msyystring_begin_state = CONFIG_FILE; msyysource=MS_FILE_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; return(0); break; case(99): BEGIN(INITIAL); /* may not need this one */ msyystring_begin_state = INITIAL; msyy_delete_buffer(YY_CURRENT_BUFFER); msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; return(0); break; default: break; } [ \t\r]+ ; (\/\/|#).* { if (msyyreturncomments) return(MS_COMMENT); } \/\* { BEGIN(MULTILINE_COMMENT); } \*\/ { BEGIN(INITIAL); } [^*\n]+ ; \* ; \n { msyylineno++; } config { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION); } env { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_ENV); } maps { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_MAPS); } plugins { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_PLUGINS) } or|\|\| { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_OR); } and|&& { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_AND); } not|! { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_NOT); } eq|=|== { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_EQ); } ne|!=|<> { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_NE); } gt|> { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_GT); } lt|< { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_LT); } ge|>= { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_GE); } le|<= { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_LE); } ~ { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_RE); } =\* { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IEQ); } ~\* { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IRE); } in { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IN); /* was IN */ } area { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_AREA); } length { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_LENGTH); } tostring { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_TOSTRING); } commify { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_COMMIFY); } round { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_ROUND); } upper { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_UPPER); } lower { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_LOWER); } initcap { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_INITCAP); } firstcap { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_FIRSTCAP); } buffer { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_BUFFER); } difference { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_DIFFERENCE); } simplify { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SIMPLIFY); } simplifypt { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SIMPLIFYPT); } generalize { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_GENERALIZE); } smoothsia { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SMOOTHSIA); } centerline { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_CENTERLINE); } densify { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_DENSIFY); } outer { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_OUTER); } inner { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_INNER); } javascript { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_JAVASCRIPT); } intersects { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_INTERSECTS); } disjoint { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_DISJOINT); } touches { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_TOUCHES); } overlaps { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_OVERLAPS); } crosses { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_CROSSES); } within { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_WITHIN); } contains { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_CONTAINS); } equals { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_EQUALS); } beyond { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_BEYOND); } dwithin { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_DWITHIN); } fromtext { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_FROMTEXT); } true { msyynumber=MS_TRUE; return(MS_TOKEN_LITERAL_BOOLEAN); } false { msyynumber=MS_FALSE; return(MS_TOKEN_LITERAL_BOOLEAN); } colorrange { MS_LEXER_RETURN_TOKEN(COLORRANGE); } datarange { MS_LEXER_RETURN_TOKEN(DATARANGE); } rangeitem { MS_LEXER_RETURN_TOKEN(RANGEITEM); } align { MS_LEXER_RETURN_TOKEN(ALIGN); } anchorpoint { MS_LEXER_RETURN_TOKEN(ANCHORPOINT); } angle { MS_LEXER_RETURN_TOKEN(ANGLE); } antialias { MS_LEXER_RETURN_TOKEN(ANTIALIAS); } backgroundcolor { MS_LEXER_RETURN_TOKEN(BACKGROUNDCOLOR); } bandsitem { MS_LEXER_RETURN_TOKEN(BANDSITEM); } bindvals { MS_LEXER_RETURN_TOKEN(BINDVALS); } \xEF\xBB\xBF { MS_LEXER_RETURN_TOKEN(BOM); } browseformat { MS_LEXER_RETURN_TOKEN(BROWSEFORMAT); } buffer { MS_LEXER_RETURN_TOKEN(BUFFER); } character { MS_LEXER_RETURN_TOKEN(CHARACTER); } class { MS_LEXER_RETURN_TOKEN(CLASS); } classitem { MS_LEXER_RETURN_TOKEN(CLASSITEM); } classgroup { MS_LEXER_RETURN_TOKEN(CLASSGROUP); } cluster { MS_LEXER_RETURN_TOKEN(CLUSTER); } color { MS_LEXER_RETURN_TOKEN(COLOR); } compfilter { MS_LEXER_RETURN_TOKEN(COMPFILTER); } composite { MS_LEXER_RETURN_TOKEN(COMPOSITE); } compop { MS_LEXER_RETURN_TOKEN(COMPOP); } config { MS_LEXER_RETURN_TOKEN(CONFIG); } connection { MS_LEXER_RETURN_TOKEN(CONNECTION); } connectiontype { MS_LEXER_RETURN_TOKEN(CONNECTIONTYPE); } data { MS_LEXER_RETURN_TOKEN(DATA); } debug { MS_LEXER_RETURN_TOKEN(DEBUG); } driver { MS_LEXER_RETURN_TOKEN(DRIVER); } empty { MS_LEXER_RETURN_TOKEN(EMPTY); } encoding { MS_LEXER_RETURN_TOKEN(ENCODING); } end { MS_LEXER_RETURN_TOKEN(END); } error { MS_LEXER_RETURN_TOKEN(ERROR); } expression { MS_LEXER_RETURN_TOKEN(EXPRESSION); } extent { MS_LEXER_RETURN_TOKEN(EXTENT); } extension { MS_LEXER_RETURN_TOKEN(EXTENSION); } feature { MS_LEXER_RETURN_TOKEN(FEATURE); } filled { MS_LEXER_RETURN_TOKEN(FILLED); } filter { MS_LEXER_RETURN_TOKEN(FILTER); } filteritem { MS_LEXER_RETURN_TOKEN(FILTERITEM); } footer { MS_LEXER_RETURN_TOKEN(FOOTER); } font { MS_LEXER_RETURN_TOKEN(FONT); } fontset { MS_LEXER_RETURN_TOKEN(FONTSET); } force { MS_LEXER_RETURN_TOKEN(FORCE); } formatoption { MS_LEXER_RETURN_TOKEN(FORMATOPTION); } from { MS_LEXER_RETURN_TOKEN(FROM); } gap { MS_LEXER_RETURN_TOKEN(GAP); } geomtransform { MS_LEXER_RETURN_TOKEN(GEOMTRANSFORM); } grid { MS_LEXER_RETURN_TOKEN(GRID); } gridstep { MS_LEXER_RETURN_TOKEN(GRIDSTEP); } graticule { MS_LEXER_RETURN_TOKEN(GRATICULE); } group { MS_LEXER_RETURN_TOKEN(GROUP); } header { MS_LEXER_RETURN_TOKEN(HEADER); } image { MS_LEXER_RETURN_TOKEN(IMAGE); } imagecolor { MS_LEXER_RETURN_TOKEN(IMAGECOLOR); } imagetype { MS_LEXER_RETURN_TOKEN(IMAGETYPE); } imagemode { MS_LEXER_RETURN_TOKEN(IMAGEMODE); } imagepath { MS_LEXER_RETURN_TOKEN(IMAGEPATH); } temppath { MS_LEXER_RETURN_TOKEN(TEMPPATH); } imageurl { MS_LEXER_RETURN_TOKEN(IMAGEURL); } include { BEGIN(INCLUDE); } index { MS_LEXER_RETURN_TOKEN(INDEX); } initialgap { MS_LEXER_RETURN_TOKEN(INITIALGAP); } intervals { MS_LEXER_RETURN_TOKEN(INTERVALS); } join { MS_LEXER_RETURN_TOKEN(JOIN); } keyimage { MS_LEXER_RETURN_TOKEN(KEYIMAGE); } keysize { MS_LEXER_RETURN_TOKEN(KEYSIZE); } keyspacing { MS_LEXER_RETURN_TOKEN(KEYSPACING); } label { MS_LEXER_RETURN_TOKEN(LABEL); } labelcache { MS_LEXER_RETURN_TOKEN(LABELCACHE); } labelformat { MS_LEXER_RETURN_TOKEN(LABELFORMAT); } labelitem { MS_LEXER_RETURN_TOKEN(LABELITEM); } labelmaxscale { MS_LEXER_RETURN_TOKEN(LABELMAXSCALE); } labelmaxscaledenom { MS_LEXER_RETURN_TOKEN(LABELMAXSCALEDENOM); } labelminscale { MS_LEXER_RETURN_TOKEN(LABELMINSCALE); } labelminscaledenom { MS_LEXER_RETURN_TOKEN(LABELMINSCALEDENOM); } labelrequires { MS_LEXER_RETURN_TOKEN(LABELREQUIRES); } latlon { MS_LEXER_RETURN_TOKEN(LATLON); } layer { MS_LEXER_RETURN_TOKEN(LAYER); } leader { MS_LEXER_RETURN_TOKEN(LEADER); } legend { MS_LEXER_RETURN_TOKEN(LEGEND); } legendformat { MS_LEXER_RETURN_TOKEN(LEGENDFORMAT); } linecap { MS_LEXER_RETURN_TOKEN(LINECAP); } linejoin { MS_LEXER_RETURN_TOKEN(LINEJOIN); } linejoinmaxsize { MS_LEXER_RETURN_TOKEN(LINEJOINMAXSIZE); } map { MS_LEXER_RETURN_TOKEN(MAP); } marker { MS_LEXER_RETURN_TOKEN(MARKER); } markersize { MS_LEXER_RETURN_TOKEN(MARKERSIZE); } mask { MS_LEXER_RETURN_TOKEN(MASK); } maxarcs { MS_LEXER_RETURN_TOKEN(MAXARCS); } maxboxsize { MS_LEXER_RETURN_TOKEN(MAXBOXSIZE); } maxdistance { MS_LEXER_RETURN_TOKEN(MAXDISTANCE); } maxfeatures { MS_LEXER_RETURN_TOKEN(MAXFEATURES); } maxinterval { MS_LEXER_RETURN_TOKEN(MAXINTERVAL); } maxscale { MS_LEXER_RETURN_TOKEN(MAXSCALE); } maxscaledenom { MS_LEXER_RETURN_TOKEN(MAXSCALEDENOM); } maxgeowidth { MS_LEXER_RETURN_TOKEN(MAXGEOWIDTH); } maxlength { MS_LEXER_RETURN_TOKEN(MAXLENGTH); } maxsize { MS_LEXER_RETURN_TOKEN(MAXSIZE); } maxsubdivide { MS_LEXER_RETURN_TOKEN(MAXSUBDIVIDE); } maxtemplate { MS_LEXER_RETURN_TOKEN(MAXTEMPLATE); } maxwidth { MS_LEXER_RETURN_TOKEN(MAXWIDTH); } metadata { MS_LEXER_RETURN_TOKEN(METADATA); } mimetype { MS_LEXER_RETURN_TOKEN(MIMETYPE); } minarcs { MS_LEXER_RETURN_TOKEN(MINARCS); } minboxsize { MS_LEXER_RETURN_TOKEN(MINBOXSIZE); } mindistance { MS_LEXER_RETURN_TOKEN(MINDISTANCE); } repeatdistance { MS_LEXER_RETURN_TOKEN(REPEATDISTANCE); } maxoverlapangle { MS_LEXER_RETURN_TOKEN(MAXOVERLAPANGLE); } minfeaturesize { MS_LEXER_RETURN_TOKEN(MINFEATURESIZE); } mininterval { MS_LEXER_RETURN_TOKEN(MININTERVAL); } minscale { MS_LEXER_RETURN_TOKEN(MINSCALE); } minscaledenom { MS_LEXER_RETURN_TOKEN(MINSCALEDENOM); } mingeowidth { MS_LEXER_RETURN_TOKEN(MINGEOWIDTH); } minsize { MS_LEXER_RETURN_TOKEN(MINSIZE); } minsubdivide { MS_LEXER_RETURN_TOKEN(MINSUBDIVIDE); } mintemplate { MS_LEXER_RETURN_TOKEN(MINTEMPLATE); } minwidth { MS_LEXER_RETURN_TOKEN(MINWIDTH); } name { MS_LEXER_RETURN_TOKEN(NAME); } offset { MS_LEXER_RETURN_TOKEN(OFFSET); } offsite { MS_LEXER_RETURN_TOKEN(OFFSITE); } opacity { MS_LEXER_RETURN_TOKEN(OPACITY); } connectionoptions { MS_LEXER_RETURN_TOKEN(CONNECTIONOPTIONS); } outlinecolor { MS_LEXER_RETURN_TOKEN(OUTLINECOLOR); } outlinewidth { MS_LEXER_RETURN_TOKEN(OUTLINEWIDTH); } outputformat { MS_LEXER_RETURN_TOKEN(OUTPUTFORMAT); } partials { MS_LEXER_RETURN_TOKEN(PARTIALS); } pattern { MS_LEXER_RETURN_TOKEN(PATTERN); } points { MS_LEXER_RETURN_TOKEN(POINTS); } items { MS_LEXER_RETURN_TOKEN(ITEMS); } position { MS_LEXER_RETURN_TOKEN(POSITION); } postlabelcache { MS_LEXER_RETURN_TOKEN(POSTLABELCACHE); } priority { MS_LEXER_RETURN_TOKEN(PRIORITY); } processing { MS_LEXER_RETURN_TOKEN(PROCESSING); } projection { MS_LEXER_RETURN_TOKEN(PROJECTION); } queryformat { MS_LEXER_RETURN_TOKEN(QUERYFORMAT); } querymap { MS_LEXER_RETURN_TOKEN(QUERYMAP); } reference { MS_LEXER_RETURN_TOKEN(REFERENCE); } region { MS_LEXER_RETURN_TOKEN(REGION); } relativeto { MS_LEXER_RETURN_TOKEN(RELATIVETO); } requires { MS_LEXER_RETURN_TOKEN(REQUIRES); } resolution { MS_LEXER_RETURN_TOKEN(RESOLUTION); } defresolution { MS_LEXER_RETURN_TOKEN(DEFRESOLUTION); } scale { MS_LEXER_RETURN_TOKEN(SCALE); } scaledenom { MS_LEXER_RETURN_TOKEN(SCALEDENOM); } scalebar { MS_LEXER_RETURN_TOKEN(SCALEBAR); } scaletoken { MS_LEXER_RETURN_TOKEN(SCALETOKEN); } shadowcolor { MS_LEXER_RETURN_TOKEN(SHADOWCOLOR); } shadowsize { MS_LEXER_RETURN_TOKEN(SHADOWSIZE); } shapepath { MS_LEXER_RETURN_TOKEN(SHAPEPATH); } size { MS_LEXER_RETURN_TOKEN(SIZE); } sizeunits { MS_LEXER_RETURN_TOKEN(SIZEUNITS); } status { MS_LEXER_RETURN_TOKEN(STATUS); } style { MS_LEXER_RETURN_TOKEN(STYLE); } styleitem { MS_LEXER_RETURN_TOKEN(STYLEITEM); } symbol { MS_LEXER_RETURN_TOKEN(SYMBOL); } symbolscale { MS_LEXER_RETURN_TOKEN(SYMBOLSCALE); } symbolscaledenom { MS_LEXER_RETURN_TOKEN(SYMBOLSCALEDENOM); } symbolset { MS_LEXER_RETURN_TOKEN(SYMBOLSET); } table { MS_LEXER_RETURN_TOKEN(TABLE); } template { MS_LEXER_RETURN_TOKEN(TEMPLATE); } text { MS_LEXER_RETURN_TOKEN(TEXT); } tileindex { MS_LEXER_RETURN_TOKEN(TILEINDEX); } tileitem { MS_LEXER_RETURN_TOKEN(TILEITEM); } tilesrs { MS_LEXER_RETURN_TOKEN(TILESRS); } title { MS_LEXER_RETURN_TOKEN(TITLE); } to { MS_LEXER_RETURN_TOKEN(TO); } tolerance { MS_LEXER_RETURN_TOKEN(TOLERANCE); } toleranceunits { MS_LEXER_RETURN_TOKEN(TOLERANCEUNITS); } transparent { MS_LEXER_RETURN_TOKEN(TRANSPARENT); } transform { MS_LEXER_RETURN_TOKEN(TRANSFORM); } type { MS_LEXER_RETURN_TOKEN(TYPE); } units { MS_LEXER_RETURN_TOKEN(UNITS); } utfdata { MS_LEXER_RETURN_TOKEN(UTFDATA); } utfitem { MS_LEXER_RETURN_TOKEN(UTFITEM); } validation { MS_LEXER_RETURN_TOKEN(VALIDATION); } values { MS_LEXER_RETURN_TOKEN(VALUES); } web { MS_LEXER_RETURN_TOKEN(WEB); } width { MS_LEXER_RETURN_TOKEN(WIDTH); } wkt { MS_LEXER_RETURN_TOKEN(WKT); } wrap { MS_LEXER_RETURN_TOKEN(WRAP); } annotation { MS_LEXER_RETURN_TOKEN(MS_LAYER_ANNOTATION); } auto { MS_LEXER_RETURN_TOKEN(MS_AUTO); } auto2 { MS_LEXER_RETURN_TOKEN(MS_AUTO2); } bevel { MS_LEXER_RETURN_TOKEN(MS_CJC_BEVEL); } bitmap { MS_LEXER_RETURN_TOKEN(MS_BITMAP); } butt { MS_LEXER_RETURN_TOKEN(MS_CJC_BUTT); } cc { MS_LEXER_RETURN_TOKEN(MS_CC); } center { MS_LEXER_RETURN_TOKEN(MS_ALIGN_CENTER); } chart { MS_LEXER_RETURN_TOKEN(MS_LAYER_CHART); } circle { MS_LEXER_RETURN_TOKEN(MS_LAYER_CIRCLE); } cl { MS_LEXER_RETURN_TOKEN(MS_CL); } cr { MS_LEXER_RETURN_TOKEN(MS_CR); } csv { MS_LEXER_RETURN_TOKEN(MS_DB_CSV); } postgresql { MS_LEXER_RETURN_TOKEN(MS_DB_POSTGRES); } mysql { MS_LEXER_RETURN_TOKEN(MS_DB_MYSQL); } default { MS_LEXER_RETURN_TOKEN(MS_DEFAULT); } dd { MS_LEXER_RETURN_TOKEN(MS_DD); } ellipse { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_ELLIPSE); } embed { MS_LEXER_RETURN_TOKEN(MS_EMBED); } false { MS_LEXER_RETURN_TOKEN(MS_FALSE); } feet { MS_LEXER_RETURN_TOKEN(MS_FEET); } follow { MS_LEXER_RETURN_TOKEN(MS_FOLLOW); } giant { MS_LEXER_RETURN_TOKEN(MS_GIANT); } hatch { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_HATCH); } kerneldensity { MS_LEXER_RETURN_TOKEN(MS_KERNELDENSITY); } idw { MS_LEXER_RETURN_TOKEN(MS_IDW); } hilite { MS_LEXER_RETURN_TOKEN(MS_HILITE); } inches { MS_LEXER_RETURN_TOKEN(MS_INCHES); } kilometers { MS_LEXER_RETURN_TOKEN(MS_KILOMETERS); } large { MS_LEXER_RETURN_TOKEN(MS_LARGE); } lc { MS_LEXER_RETURN_TOKEN(MS_LC); } left { MS_LEXER_RETURN_TOKEN(MS_ALIGN_LEFT); } line { MS_LEXER_RETURN_TOKEN(MS_LAYER_LINE); } ll { MS_LEXER_RETURN_TOKEN(MS_LL); } lr { MS_LEXER_RETURN_TOKEN(MS_LR); } medium { MS_LEXER_RETURN_TOKEN(MS_MEDIUM); } meters { MS_LEXER_RETURN_TOKEN(MS_METERS); } nauticalmiles { MS_LEXER_RETURN_TOKEN(MS_NAUTICALMILES); } miles { MS_LEXER_RETURN_TOKEN(MS_MILES); } miter { MS_LEXER_RETURN_TOKEN(MS_CJC_MITER); } multiple { MS_LEXER_RETURN_TOKEN(MS_MULTIPLE); } none { MS_LEXER_RETURN_TOKEN(MS_CJC_NONE); } normal { MS_LEXER_RETURN_TOKEN(MS_NORMAL); } off { MS_LEXER_RETURN_TOKEN(MS_OFF); } ogr { MS_LEXER_RETURN_TOKEN(MS_OGR); } flatgeobuf { MS_LEXER_RETURN_TOKEN(MS_FLATGEOBUF); } on { MS_LEXER_RETURN_TOKEN(MS_ON); } one-to-one { MS_LEXER_RETURN_TOKEN(MS_JOIN_ONE_TO_ONE); } one-to-many { MS_LEXER_RETURN_TOKEN(MS_JOIN_ONE_TO_MANY); } oraclespatial { MS_LEXER_RETURN_TOKEN(MS_ORACLESPATIAL); } percentages { MS_LEXER_RETURN_TOKEN(MS_PERCENTAGES); } pixmap { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_PIXMAP); } pixels { MS_LEXER_RETURN_TOKEN(MS_PIXELS); } point { MS_LEXER_RETURN_TOKEN(MS_LAYER_POINT); } polygon { MS_LEXER_RETURN_TOKEN(MS_LAYER_POLYGON); } postgis { MS_LEXER_RETURN_TOKEN(MS_POSTGIS); } plugin { MS_LEXER_RETURN_TOKEN(MS_PLUGIN); } query { MS_LEXER_RETURN_TOKEN(MS_LAYER_QUERY); } raster { MS_LEXER_RETURN_TOKEN(MS_LAYER_RASTER); } rasterlabel { MS_LEXER_RETURN_TOKEN(MS_RASTER_LABEL); } right { MS_LEXER_RETURN_TOKEN(MS_ALIGN_RIGHT); } round { MS_LEXER_RETURN_TOKEN(MS_CJC_ROUND); } selected { MS_LEXER_RETURN_TOKEN(MS_SELECTED); } simple { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_SIMPLE); } single { MS_LEXER_RETURN_TOKEN(MS_SINGLE); } small { MS_LEXER_RETURN_TOKEN(MS_SMALL); } square { MS_LEXER_RETURN_TOKEN(MS_CJC_SQUARE); } svg { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_SVG); } polaroffset { MS_LEXER_RETURN_TOKEN(POLAROFFSET); } tiny { MS_LEXER_RETURN_TOKEN(MS_TINY); } triangle { MS_LEXER_RETURN_TOKEN(MS_CJC_TRIANGLE); } true { MS_LEXER_RETURN_TOKEN(MS_TRUE); } truetype { MS_LEXER_RETURN_TOKEN(MS_TRUETYPE); } uc { MS_LEXER_RETURN_TOKEN(MS_UC); } ul { MS_LEXER_RETURN_TOKEN(MS_UL); } ur { MS_LEXER_RETURN_TOKEN(MS_UR); } union { MS_LEXER_RETURN_TOKEN(MS_UNION); } uvraster { MS_LEXER_RETURN_TOKEN(MS_UVRASTER); } contour { MS_LEXER_RETURN_TOKEN(MS_CONTOUR); } vector { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_VECTOR); } wfs { MS_LEXER_RETURN_TOKEN(MS_WFS); } wms { MS_LEXER_RETURN_TOKEN(MS_WMS); } \[[^\]]*\] { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); return(MS_BINDING); } \[shape\] { /* attribute binding - shape (fixed value) */ return(MS_TOKEN_BINDING_SHAPE); } \[map_cellsize\] { /* attribute binding - map cellsize */ return(MS_TOKEN_BINDING_MAP_CELLSIZE); } \[data_cellsize\] { /* attribute binding - data cellsize */ return(MS_TOKEN_BINDING_DATA_CELLSIZE); } \[[^\]]*\] { /* attribute binding - numeric (no quotes) */ msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_BINDING_DOUBLE); } \"\[[^\"]*\]\"|\'\[[^\']*\]\' { /* attribute binding - string (single or double quotes) */ msyytext+=2; msyytext[msyyleng-2-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_BINDING_STRING); } \`\[[^\`]*\]\` { /* attribute binding - time */ msyytext+=2; msyytext[msyyleng-2-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_BINDING_TIME); } -?[0-9]+|-?[0-9]+\.[0-9]*|-?\.[0-9]*|-?[0-9]+[eE][+-]?[0-9]+|-?[0-9]+\.[0-9]*[eE][+-]?[0-9]+|-?\.[0-9]*[eE][+-]?[0-9]+ { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); msyynumber = atof(msyytext); return(MS_NUMBER); } -?[0-9]+|-?[0-9]+\.[0-9]*|-?\.[0-9]*|-?[0-9]+[eE][+-]?[0-9]+|-?[0-9]+\.[0-9]*[eE][+-]?[0-9]+|-?\.[0-9]*[eE][+-]?[0-9]+ { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); msyynumber = atof(msyytext); return(MS_TOKEN_LITERAL_NUMBER); } \`[^\`]*\` { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_LITERAL_TIME); } \/[^*]{1}[^\/]*\/i { msyytext++; msyytext[msyyleng-1-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_IREGEX); } \/[^*]{1}[^\/]*\/ { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_REGEX); } \(.*\) { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_EXPRESSION); } \{.*\} { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_LIST); } \'|\" { msyystring_return_state = MS_STRING; msyystring_begin = msyytext[0]; msyystring_size = 0; msyystring_buffer[0] = '\0'; BEGIN(MSSTRING); } \'|\"|\"i|\'i { if (msyystring_begin == msyytext[0]) { BEGIN(msyystring_begin_state); if (msyystring_return_state == MS_STRING) { if (msyystring_icase && msyyleng==2) { msyystring_icase = MS_FALSE; // reset return MS_ISTRING; } else return MS_STRING; } return msyystring_return_state; } else { int old_size = msyystring_size; msyystring_size += (msyyleng==2) ? 2 : 1; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); msyystring_buffer[old_size] = *msyytext; if (msyyleng==2) { msyystring_buffer[old_size+1] = msyytext[1]; } msyystring_buffer[msyystring_size] = '\0'; } } \\\'|\\\"|\\\\|\\ { ++msyystring_size; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); if (msyyleng == 2) msyystring_buffer[msyystring_size-1] = msyytext[1]; else msyystring_buffer[msyystring_size-1] = msyytext[0]; msyystring_buffer[msyystring_size] = '\0'; } [^\\\'\\\"]+ { int old_size = msyystring_size; msyystring_size += msyyleng; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); memcpy(msyystring_buffer + old_size, msyytext, msyyleng + 1); } \"[^\"]*\"|\'[^\']*\' { msyytext++; msyytext[msyyleng-1-1] = '\0'; if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { msSetError(MS_IOERR, "Includes nested to deeply.", "msyylex()"); return(-1); } msyyin = fopen(msBuildPath(path, msyybasepath, msyytext), "r"); if(!msyyin) { msSetError(MS_IOERR, "Error opening included file \"%s\".", "msyylex()", msyytext); msyyin = YY_CURRENT_BUFFER->yy_input_file; return(-1); } include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; /* save state */ include_lineno[include_stack_ptr] = msyylineno; include_stack_ptr++; msyy_switch_to_buffer( msyy_create_buffer(msyyin, YY_BUF_SIZE) ); msyylineno = 1; BEGIN(INITIAL); } \'|\" { msyystring_return_state = MS_TOKEN_LITERAL_STRING; msyystring_begin = msyytext[0]; msyystring_size = 0; msyystring_buffer[0] = '\0'; BEGIN(MSSTRING); } [a-z/\.][a-z0-9/\._\-\=]* { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_STRING); } \n { msyylineno++; } <> { if( --include_stack_ptr < 0 ) return(EOF); /* end of main file */ else { fclose(YY_CURRENT_BUFFER->yy_input_file); msyy_delete_buffer( YY_CURRENT_BUFFER ); msyy_switch_to_buffer(include_stack[include_stack_ptr]); msyylineno = include_lineno[include_stack_ptr]; } } [\r|\n|\0] { return(0); } . { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(0); } . { return(msyytext[0]); } %% /* ** Any extra C functions */ int msyywrap() /* override */ { return(1); } int msyyerror(char *s) { msSetError(MS_PARSEERR, "%s", "msyyparse()", s); return(0); } /* cleanup any open includes */ void msyycleanup_includes() { while( --include_stack_ptr >= 0 ) { fclose(YY_CURRENT_BUFFER->yy_input_file); msyy_delete_buffer( YY_CURRENT_BUFFER ); msyy_switch_to_buffer(include_stack[include_stack_ptr]); } } mapserver-8.4.0/src/maplibxml2.c000066400000000000000000000076031474174441300165500ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: libxml2 convenience wrapper functions * Author: Tom Kralidis (tomkralidis@gmail.com) * ****************************************************************************** * Copyright (c) 2007, Tom Kralidis * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #ifdef USE_LIBXML2 #include #include #include #include /** * msLibXml2GenerateList() * * Convenience function to produce a series of XML elements from a delimited * list * * @param xmlNodePtr psParent the encompassing node * @param xmlNsPtr psNs the namespace object * @param const char *elname the list member element name * @param const char *values the list member element values * @param char delim the delimiter * */ void msLibXml2GenerateList(xmlNodePtr psParent, xmlNsPtr psNs, const char *elname, const char *values, char delim) { char **tokens = NULL; int n = 0; int i = 0; tokens = msStringSplit(values, delim, &n); for (i = 0; i < n; i++) { // Not sure we really need to distinguish empty vs non-empty case, but // this does change the result of // msautotest/wxs/expected/wcs_empty_cap111.xml otherwise if (tokens[i] && tokens[i][0] != '\0') xmlNewTextChild(psParent, psNs, BAD_CAST elname, BAD_CAST tokens[i]); else xmlNewChild(psParent, psNs, BAD_CAST elname, BAD_CAST tokens[i]); } msFreeCharArray(tokens, n); } /** * msLibXml2GetXPath() * * Convenience function to fetch an XPath * * @param xmlDocPtr doc the XML doc pointer * @param xmlXPathContextPtr the context pointer * @param xmlChar *xpath the xpath value * * @return result xmlXPathObjectPtr pointer * */ xmlXPathObjectPtr msLibXml2GetXPath(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath) { (void)doc; xmlXPathObjectPtr result; result = xmlXPathEval(xpath, context); if (result == NULL) { return NULL; } if (xmlXPathNodeSetIsEmpty(result->nodesetval)) { xmlXPathFreeObject(result); return NULL; } return result; } /** * msLibXml2GetXPathTree * * Convenience function to fetch an XPath and children * * @param xmlDocPtr doc the XML doc pointer * @param xmlXPathObjectPtr the xpath object * * @return result string * */ char *msLibXml2GetXPathTree(xmlDocPtr doc, xmlXPathObjectPtr xpath) { xmlBufferPtr xbuf; char *result = NULL; xbuf = xmlBufferCreate(); if (xpath) { if (xmlNodeDump(xbuf, doc, xpath->nodesetval->nodeTab[0], 0, 0) == -1) { return NULL; } result = msStrdup((char *)xbuf->content); } xmlBufferFree(xbuf); return result; } #endif /* defined(USE_LIBXML2) */ mapserver-8.4.0/src/maplibxml2.h000066400000000000000000000043131474174441300165500ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: libxml2 convenience wrapper functions include file * Author: Tom Kralidis (tomkralidis@gmail.com) * ****************************************************************************** * Copyright (c) 2007, Tom Kralidis * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPLIBXML2_H #define MAPLIBXML2_H #ifdef USE_LIBXML2 #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif xmlXPathObjectPtr msLibXml2GetXPath(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath); void msLibXml2GenerateList(xmlNodePtr psParent, xmlNsPtr psNs, const char *elname, const char *values, char delim); char *msLibXml2GetXPathTree(xmlDocPtr doc, xmlXPathObjectPtr xpath); #ifdef __cplusplus } /* extern C */ #endif #endif /* defined(USE_LIBXML2) */ #endif /* MAPLIBXML2_H */ mapserver-8.4.0/src/mapmetadata.c000066400000000000000000001220071474174441300167530ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: Metadata implementation * Author: Tom Kralidis (tomkralidis@gmail.com) * ********************************************************************** * Copyright (c) 2017, Tom Kralidis * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver.h" #include "mapows.h" #include "mapowscommon.h" #include "maplibxml2.h" #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) || defined(USE_WMS_LYR) || defined(USE_WFS_LYR) #ifdef USE_LIBXML2 static int msMetadataParseRequest(cgiRequestObj *request, metadataParamsObj *metadataparams); /************************************************************************/ /* _msMetadataGetCharacterString */ /* */ /* Create a gmd:name/gmd:CharacterString element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetCharacterString(xmlNsPtr namespace, const char *name, const char *value, xmlNsPtr *ppsNsGco) { if (*ppsNsGco == NULL) *ppsNsGco = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gco"); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST name); if (!value) xmlNewNsProp(psNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); else xmlNewChild(psNode, *ppsNsGco, BAD_CAST "CharacterString", BAD_CAST value); return psNode; } /************************************************************************/ /* _msMetadataGetURL */ /* */ /* Create a gmd:name/gmd:URL element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetURL(xmlNsPtr namespace, const char *name, const char *value, xmlNsPtr *ppsNsGco) { if (*ppsNsGco == NULL) *ppsNsGco = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gco"); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST name); if (!value) xmlNewNsProp(psNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); else xmlNewChild(psNode, namespace, BAD_CAST "URL", BAD_CAST value); return psNode; } /************************************************************************/ /* _msMetadataGetOnline */ /* */ /* Create a gmd:onLine element pattern */ /************************************************************************/ static char *_stringConcatenateAndEncodeHTML(char *str, const char *appendStr) { char *pszTmp = msEncodeHTMLEntities(appendStr); str = msStringConcatenate(str, pszTmp); msFree(pszTmp); return str; } static xmlNodePtr _msMetadataGetOnline(xmlNsPtr namespace, layerObj *layer, const char *service, const char *format, const char *desc, const char *url_in, xmlNsPtr *ppsNsGco) { int status; const char *link_protocol = "unknown protocol"; xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "onLine"); xmlNodePtr psORNode = xmlNewChild(psNode, namespace, BAD_CAST "CI_OnlineResource", NULL); char *url = msStrdup(url_in); if (strcasecmp(service, "M") == 0) { url = _stringConcatenateAndEncodeHTML( url, "service=WMS&version=1.3.0&request=GetMap&width=500&height=300&" "styles=&layers="); url = _stringConcatenateAndEncodeHTML(url, layer->name); url = _stringConcatenateAndEncodeHTML(url, "&format="); url = _stringConcatenateAndEncodeHTML(url, format); url = _stringConcatenateAndEncodeHTML(url, "&crs="); { char *epsg_str = NULL; msOWSGetEPSGProj(&(layer->projection), &(layer->metadata), "MFCSGO", MS_TRUE, &epsg_str); url = _stringConcatenateAndEncodeHTML(url, epsg_str); msFree(epsg_str); } link_protocol = "WWW:DOWNLOAD-1.0-http-get-map"; rectObj rect; status = msLayerGetExtent(layer, &rect); if (status == 0) { char buffer[32]; url = _stringConcatenateAndEncodeHTML(url, "&bbox="); sprintf(buffer, "%f", rect.miny); url = msStringConcatenate(url, buffer); url = msStringConcatenate(url, ","); sprintf(buffer, "%f", rect.minx); url = msStringConcatenate(url, buffer); url = msStringConcatenate(url, ","); sprintf(buffer, "%f", rect.maxy); url = msStringConcatenate(url, buffer); url = msStringConcatenate(url, ","); sprintf(buffer, "%f", rect.maxx); url = msStringConcatenate(url, buffer); } } else if (strcasecmp(service, "F") == 0) { link_protocol = "WWW:DOWNLOAD-1.0-http--download"; url = _stringConcatenateAndEncodeHTML( url, "service=WFS&version=1.1.0&request=GetFeature&typename="); url = _stringConcatenateAndEncodeHTML(url, layer->name); url = _stringConcatenateAndEncodeHTML(url, "&outputformat="); url = _stringConcatenateAndEncodeHTML(url, format); } else if (strcasecmp(service, "C") == 0) { link_protocol = "WWW:DOWNLOAD-1.0-http--download"; url = _stringConcatenateAndEncodeHTML( url, "service=WCS&version=2.0.1&request=GetCoverage&coverageid="); url = _stringConcatenateAndEncodeHTML(url, layer->name); url = _stringConcatenateAndEncodeHTML(url, "&format="); url = _stringConcatenateAndEncodeHTML(url, format); } xmlAddChild(psORNode, _msMetadataGetURL(namespace, "linkage", url, ppsNsGco)); msFree(url); xmlAddChild(psORNode, _msMetadataGetCharacterString(namespace, "protocol", link_protocol, ppsNsGco)); xmlAddChild(psORNode, _msMetadataGetCharacterString(namespace, "name", layer->name, ppsNsGco)); xmlAddChild(psORNode, _msMetadataGetCharacterString(namespace, "description", desc, ppsNsGco)); return psNode; } /************************************************************************/ /* _msMetadataGetInteger */ /* */ /* Create a gmd:name/gmd:Integer element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetInteger(xmlNsPtr namespace, const char *name, int value, xmlNsPtr *ppsNsGco) { char buffer[8]; sprintf(buffer, "%d", value); if (*ppsNsGco == NULL) *ppsNsGco = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gco"); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST name); if (!value) xmlNewNsProp(psNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); else xmlNewChild(psNode, *ppsNsGco, BAD_CAST "Integer", BAD_CAST buffer); return psNode; } /************************************************************************/ /* _msMetadataGetDecimal */ /* */ /* Create a gmd:name/gmd:Decimal element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetDecimal(xmlNsPtr namespace, const char *name, double value, xmlNsPtr *ppsNsGco) { char buffer[32]; snprintf(buffer, sizeof(buffer), "%.6f", value); if (*ppsNsGco == NULL) *ppsNsGco = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gco"); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST name); if (!value) xmlNewNsProp(psNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); else xmlNewChild(psNode, *ppsNsGco, BAD_CAST "Decimal", BAD_CAST buffer); return psNode; } /************************************************************************/ /* _msMetadataGetCodeList */ /* */ /* Create a gmd:name/gmd:* code list element pattern */ /************************************************************************/ xmlNodePtr _msMetadataGetCodeList(xmlNsPtr namespace, const char *parent_element, const char *name, const char *value) { char *codelist = NULL; codelist = msStrdup( "http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#"); codelist = msStringConcatenate(codelist, name); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST parent_element); xmlNodePtr psCodeNode = xmlNewChild(psNode, namespace, BAD_CAST name, BAD_CAST value); xmlNewProp(psCodeNode, BAD_CAST "codeSpace", BAD_CAST "ISOTC211/19115"); xmlNewProp(psCodeNode, BAD_CAST "codeList", BAD_CAST codelist); xmlNewProp(psCodeNode, BAD_CAST "codeListValue", BAD_CAST value); msFree(codelist); return psNode; } /************************************************************************/ /* _msMetadataGetGMLTimePeriod */ /* */ /* Create a gml:TimePeriod element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetGMLTimePeriod(char **temporal) { xmlNsPtr psNsGml = xmlNewNs(NULL, BAD_CAST "http://www.opengis.net/gml", BAD_CAST "gml"); xmlNodePtr psNode = xmlNewNode(psNsGml, BAD_CAST "TimePeriod"); xmlNewNsProp(psNode, psNsGml, BAD_CAST "id", BAD_CAST "T001"); xmlNewNs(psNode, BAD_CAST "http://www.opengis.net/gml", BAD_CAST "gml"); xmlSetNs(psNode, psNsGml); xmlNewChild(psNode, psNsGml, BAD_CAST "beginPosition", BAD_CAST temporal[0]); xmlNewChild(psNode, psNsGml, BAD_CAST "endPosition", BAD_CAST temporal[1]); return psNode; } /************************************************************************/ /* _msMetadataGetExtent */ /* */ /* Create a gmd:extent element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetExtent(xmlNsPtr namespace, layerObj *layer, xmlNsPtr *ppsNsGco) { int n = 0; int status; char **temporal = NULL; rectObj rect; xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "extent"); xmlNodePtr psEXNode = xmlNewChild(psNode, namespace, BAD_CAST "EX_Extent", NULL); /* scan for geospatial extent */ status = msLayerGetExtent(layer, &rect); if (status == 0) { /* always project to lat long */ msOWSProjectToWGS84(&layer->projection, &rect); xmlNodePtr psGNode = xmlNewChild(psEXNode, namespace, BAD_CAST "geographicElement", NULL); xmlNodePtr psGNode2 = xmlNewChild( psGNode, namespace, BAD_CAST "EX_GeographicBoundingBox", NULL); xmlAddChild(psGNode2, _msMetadataGetDecimal(namespace, "westBoundLongitude", rect.minx, ppsNsGco)); xmlAddChild(psGNode2, _msMetadataGetDecimal(namespace, "eastBoundLongitude", rect.maxx, ppsNsGco)); xmlAddChild(psGNode2, _msMetadataGetDecimal(namespace, "southBoundLatitude", rect.miny, ppsNsGco)); xmlAddChild(psGNode2, _msMetadataGetDecimal(namespace, "northBoundLatitude", rect.maxy, ppsNsGco)); } /* scan for temporal extent */ const char *value = msOWSLookupMetadata(&(layer->metadata), "MO", "timeextent"); if (value) { /* WMS */ temporal = msStringSplit(value, '/', &n); } else { /* WCS */ value = msOWSLookupMetadata(&(layer->metadata), "CO", "timeposition"); if (value) { /* split extent */ temporal = msStringSplit(value, ',', &n); } } if (!value) { /* SOS */ value = msOWSLookupMetadata(&(layer->metadata), "SO", "offering_timeextent"); if (value) temporal = msStringSplit(value, '/', &n); } if (value) { if (temporal && n > 0) { xmlNodePtr psTNode = xmlNewChild(psEXNode, namespace, BAD_CAST "temporalElement", NULL); xmlNodePtr psTNode2 = xmlNewChild(psTNode, namespace, BAD_CAST "EX_TemporalExtent", NULL); xmlNodePtr psENode = xmlNewChild(psTNode2, namespace, BAD_CAST "extent", NULL); xmlAddChild(psENode, _msMetadataGetGMLTimePeriod(temporal)); } } msFreeCharArray(temporal, n); return psNode; } /************************************************************************/ /* _msMetadataGetReferenceSystemInfo */ /* */ /* Create a gmd:referenceSystemInfo element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetReferenceSystemInfo(xmlNsPtr namespace, layerObj *layer, xmlNsPtr *ppsNsGco) { xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "referenceSystemInfo"); xmlNodePtr psRSNode = xmlNewChild(psNode, namespace, BAD_CAST "MD_ReferenceSystem", NULL); xmlNodePtr psRSINode = xmlNewChild( psRSNode, namespace, BAD_CAST "referenceSystemIdentifier", NULL); xmlNodePtr psRSINode2 = xmlNewChild(psRSINode, namespace, BAD_CAST "RS_Identifier", NULL); char *epsg_str = NULL; msOWSGetEPSGProj(&(layer->projection), &(layer->metadata), "MFCSGO", MS_TRUE, &epsg_str); xmlAddChild(psRSINode2, _msMetadataGetCharacterString(namespace, "code", epsg_str, ppsNsGco)); xmlAddChild(psRSINode2, _msMetadataGetCharacterString( namespace, "codeSpace", "http://www.epsg-registry.org", ppsNsGco)); xmlAddChild(psRSINode2, _msMetadataGetCharacterString(namespace, "version", "6.14", ppsNsGco)); msFree(epsg_str); return psNode; } /************************************************************************/ /* _msMetadataGetContact */ /* */ /* Create a gmd:contact element pattern */ /************************************************************************/ xmlNodePtr _msMetadataGetContact(xmlNsPtr namespace, char *contact_element, mapObj *map, xmlNsPtr *ppsNsGco) { xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST contact_element); xmlNodePtr psCNode = xmlNewChild(psNode, namespace, BAD_CAST "CI_ResponsibleParty", NULL); xmlNewProp(psCNode, BAD_CAST "id", BAD_CAST contact_element); const char *value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactperson"); if (value) xmlAddChild(psCNode, _msMetadataGetCharacterString( namespace, "individualName", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactorganization"); if (value) xmlAddChild(psCNode, _msMetadataGetCharacterString( namespace, "organisationName", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactposition"); if (value) xmlAddChild(psCNode, _msMetadataGetCharacterString( namespace, "positionName", value, ppsNsGco)); xmlNodePtr psCINode = xmlNewChild(psCNode, namespace, BAD_CAST "contactInfo", NULL); xmlNodePtr psCINode2 = xmlNewChild(psCINode, namespace, BAD_CAST "CI_Contact", NULL); xmlNodePtr psPhoneNode = xmlNewChild(psCINode2, namespace, BAD_CAST "phone", NULL); xmlNodePtr psCIPhoneNode = xmlNewChild(psPhoneNode, namespace, BAD_CAST "CI_Telephone", NULL); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactvoicetelephone"); if (value) xmlAddChild(psCIPhoneNode, _msMetadataGetCharacterString(namespace, "voice", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactfacsimiletelephone"); if (value) xmlAddChild(psCIPhoneNode, _msMetadataGetCharacterString( namespace, "facsimile", value, ppsNsGco)); xmlNodePtr psAddressNode = xmlNewChild(psCINode2, namespace, BAD_CAST "address", NULL); xmlNodePtr psCIAddressNode = xmlNewChild(psAddressNode, namespace, BAD_CAST "CI_Address", NULL); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "address"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString(namespace, "deliveryPoint", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "city"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString( namespace, "city", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "stateorprovince"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString(namespace, "administrativeArea", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "postcode"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString( namespace, "postalCode", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "country"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString( namespace, "country", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactelectronicmailaddress"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString( namespace, "electronicMailAddress", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "onlineresource"); if (value) { xmlNodePtr psORNode = xmlNewChild(psCINode2, namespace, BAD_CAST "onlineResource", NULL); xmlNodePtr psORNode2 = xmlNewChild(psORNode, namespace, BAD_CAST "CI_OnlineResource", NULL); xmlAddChild(psORNode2, _msMetadataGetURL(namespace, "linkage", value, ppsNsGco)); } xmlAddChild(psCNode, _msMetadataGetCodeList(namespace, "role", "CI_RoleCode", "pointOfContact")); return psNode; } /************************************************************************/ /* _msMetadataGetIdentificationInfo */ /* */ /* Create a gmd:identificationInfo element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetIdentificationInfo(xmlNsPtr namespace, mapObj *map, layerObj *layer, xmlNsPtr *ppsNsGco) { xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "identificationInfo"); xmlNodePtr psDINode = xmlNewChild(psNode, namespace, BAD_CAST "MD_DataIdentification", NULL); xmlNewProp(psDINode, BAD_CAST "id", BAD_CAST layer->name); xmlNodePtr psCNode = xmlNewChild(psDINode, namespace, BAD_CAST "citation", NULL); xmlNodePtr psCINode = xmlNewChild(psCNode, namespace, BAD_CAST "CI_Citation", NULL); const char *value = msOWSLookupMetadata(&(layer->metadata), "MCFGO", "title"); if (!value) value = msOWSLookupMetadata(&(layer->metadata), "S", "offering_name"); xmlAddChild(psCINode, _msMetadataGetCharacterString(namespace, "title", value, ppsNsGco)); xmlNodePtr psDNode = xmlNewChild(psCINode, namespace, BAD_CAST "date", NULL); xmlNewNsProp(psDNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); value = msOWSLookupMetadata(&(layer->metadata), "MCFGO", "attribution_title"); if (value) { xmlAddChild(psCINode, _msMetadataGetCharacterString(namespace, "otherCitationDetails", value, ppsNsGco)); } value = msOWSLookupMetadata(&(layer->metadata), "MCFGO", "abstract"); if (!value) value = msOWSLookupMetadata(&(layer->metadata), "S", "offering_description"); xmlAddChild(psDINode, _msMetadataGetCharacterString(namespace, "abstract", value, ppsNsGco)); value = msOWSLookupMetadata(&(layer->metadata), "MCFSGO", "keywordlist"); if (value) { xmlNodePtr psKWNode = xmlNewChild(psDINode, namespace, BAD_CAST "descriptiveKeywords", NULL); xmlNodePtr psMDKNode = xmlNewChild(psKWNode, namespace, BAD_CAST "MD_Keywords", NULL); int n = 0; char **tokens = msStringSplit(value, ',', &n); if (tokens && n > 0) { for (int i = 0; i < n; i++) { xmlAddChild(psMDKNode, _msMetadataGetCharacterString( namespace, "keyword", tokens[i], ppsNsGco)); } } msFreeCharArray(tokens, n); } xmlAddChild(psDINode, _msMetadataGetCharacterString( namespace, "language", (char *)msOWSGetLanguage(map, "exception"), ppsNsGco)); xmlAddChild(psDINode, _msMetadataGetExtent(namespace, layer, ppsNsGco)); return psNode; } /************************************************************************/ /* _msMetadataGetSpatialRepresentationInfo */ /* */ /* Create a gmd:spatialRepresentationInfo element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetSpatialRepresentationInfo(xmlNsPtr namespace, layerObj *layer, xmlNsPtr *ppsNsGco) { xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "spatialRepresentationInfo"); if (layer->type == MS_LAYER_RASTER) { xmlNodePtr psSRNode = xmlNewChild( psNode, namespace, BAD_CAST "MD_GridSpatialRepresentation", NULL); xmlAddChild(psSRNode, _msMetadataGetInteger(namespace, "numberOfDimensions", 2, ppsNsGco)); xmlAddChild(psSRNode, _msMetadataGetCodeList(namespace, "cellGeometry", "MD_CellGeometryCode", "area")); } else { xmlNodePtr psSRNode = xmlNewChild( psNode, namespace, BAD_CAST "MD_VectorSpatialRepresentation", NULL); xmlAddChild(psSRNode, _msMetadataGetCodeList(namespace, "topologyLevel", "MD_TopologyLevelCode", "geometryOnly")); xmlNodePtr psGONode = xmlNewChild(psSRNode, namespace, BAD_CAST "geometricObjects", NULL); xmlNodePtr psGONode2 = xmlNewChild(psGONode, namespace, BAD_CAST "MD_GeometricObjects", NULL); const char *value; if (layer->type == MS_LAYER_POINT) value = "point"; else if (layer->type == MS_LAYER_LINE) value = "curve"; else if (layer->type == MS_LAYER_POLYGON) value = "surface"; else value = "complex"; xmlAddChild(psGONode2, _msMetadataGetCodeList(namespace, "geometricObjectType", "MD_GeometricObjectTypeCode", value)); // TODO: find way to get feature count in a fast way /* xmlAddChild(psGONode2, _msMetadataGetInteger(namespace, * "geometricObjectCount", msLayerGetNumFeatures(layer))); */ } return psNode; } /************************************************************************/ /* _msMetadataGetDistributionInfo */ /* */ /* Create a gmd:identificationInfo element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetDistributionInfo(xmlNsPtr namespace, mapObj *map, layerObj *layer, cgiRequestObj *cgi_request, xmlNsPtr *ppsNsGco) { char *url = NULL; xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "distributionInfo"); xmlNodePtr psMDNode = xmlNewChild(psNode, namespace, BAD_CAST "MD_Distribution", NULL); { char *pszTmp = msOWSGetOnlineResource(map, "MFCSGO", "onlineresource", cgi_request); url = msEncodeHTMLEntities(pszTmp); msFree(pszTmp); } /* gmd:distributor */ xmlNodePtr psDNode = xmlNewChild(psMDNode, namespace, BAD_CAST "distributor", NULL); xmlNodePtr psDNode2 = xmlNewChild(psDNode, namespace, BAD_CAST "MD_Distributor", NULL); xmlAddChild(psDNode2, _msMetadataGetContact(namespace, "distributorContact", map, ppsNsGco)); /* gmd:transferOptions */ xmlNodePtr psTONode = xmlNewChild(psMDNode, namespace, BAD_CAST "transferOptions", NULL); xmlNodePtr psDTONode = xmlNewChild( psTONode, namespace, BAD_CAST "MD_DigitalTransferOptions", NULL); xmlAddChild(psDTONode, _msMetadataGetCharacterString( namespace, "unitsOfDistribution", "KB", ppsNsGco)); /* links */ /* WMS */ xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "M", "image/png", "PNG Format", url, ppsNsGco)); xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "M", "image/jpeg", "JPEG Format", url, ppsNsGco)); /* WCS */ if (layer->type == MS_LAYER_RASTER) { xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "C", "image/tiff", "GeoTIFF Format", url, ppsNsGco)); } /* WFS */ else { xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "F", "GML2", "GML2 Format", url, ppsNsGco)); xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "F", "GML3", "GML3 Format", url, ppsNsGco)); } msFree(url); return psNode; } /************************************************************************/ /* msMetadataGetExceptionReport */ /* */ /* Generate an OWS Common Exception Report */ /************************************************************************/ static xmlNodePtr msMetadataGetExceptionReport(mapObj *map, char *code, char *locator, char *message, xmlNsPtr *ppsNsOws) { char *schemas_location = NULL; xmlNodePtr psRootNode = NULL; schemas_location = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); *ppsNsOws = xmlNewNs(NULL, BAD_CAST "http://www.opengis.net/ows/1.1", BAD_CAST "ows"); psRootNode = msOWSCommonExceptionReport( *ppsNsOws, OWS_1_1_0, schemas_location, "1.1.0", msOWSGetLanguage(map, "exception"), code, locator, message); msFree(schemas_location); xmlNewNs(psRootNode, BAD_CAST "http://www.opengis.net/ows/1.1", BAD_CAST "ows"); return psRootNode; } /************************************************************************/ /* msMetadataGetLayerMetadata */ /* */ /* Generate an ISO 19139-1:2019 representation of layer metadata */ /************************************************************************/ static xmlNodePtr msMetadataGetLayerMetadata(mapObj *map, metadataParamsObj *paramsObj, cgiRequestObj *cgi_request, xmlNsPtr *ppsNsOws, xmlNsPtr *ppsNsXsi, xmlNsPtr *ppsNsGmd, xmlNsPtr *ppsNsGco) { int i; int layer_found = MS_FALSE; xmlNodePtr psRootNode = NULL; layerObj *layer = NULL; /* Check that layer requested exists in mapfile */ for (i = 0; i < map->numlayers; i++) { if (strcasecmp(GET_LAYER(map, i)->name, paramsObj->pszLayer) == 0) { layer_found = MS_TRUE; layer = GET_LAYER(map, i); // when checking a layer with clustering msLayerGetExtent does not have // access to the source layer, so remove clustering first if (layer->cluster.region) { layer->cluster.region = NULL; } break; } } if (layer_found == MS_FALSE) { psRootNode = msMetadataGetExceptionReport( map, "InvalidParameterValue", "layer", "Layer not found", ppsNsOws); } /* Check that outputschema is valid */ else if (paramsObj->pszOutputSchema && strcasecmp(paramsObj->pszOutputSchema, "http://www.isotc211.org/2005/gmd") != 0) { psRootNode = msMetadataGetExceptionReport( map, "InvalidParameterValue", "outputschema", "OUTPUTSCHEMA must be \"http://www.isotc211.org/2005/gmd\"", ppsNsOws); } else { *ppsNsXsi = xmlNewNs(NULL, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); *ppsNsGmd = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gmd"); /* root element */ psRootNode = xmlNewNode(NULL, BAD_CAST "MD_Metadata"); xmlNewNs(psRootNode, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gmd"); xmlNewNs(psRootNode, BAD_CAST "http://www.isotc211.org/2005/gco", BAD_CAST "gco"); xmlNewNs(psRootNode, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlSetNs(psRootNode, *ppsNsGmd); xmlNewNsProp(psRootNode, *ppsNsXsi, BAD_CAST "schemaLocation", BAD_CAST "http://www.isotc211.org/2005/gmd " "http://www.isotc211.org/2005/gmd/gmd.xsd"); /* gmd:identifier */ xmlAddChild(psRootNode, _msMetadataGetCharacterString(*ppsNsGmd, "fileIdentifier", layer->name, ppsNsGco)); /* gmd:language */ xmlAddChild(psRootNode, _msMetadataGetCharacterString( *ppsNsGmd, "language", (char *)msOWSGetLanguage(map, "exception"), ppsNsGco)); /* gmd:hierarchyLevel */ xmlAddChild(psRootNode, _msMetadataGetCodeList(*ppsNsGmd, "hierarchyLevel", "MD_ScopeCode", "dataset")); /* gmd:contact */ xmlAddChild(psRootNode, _msMetadataGetContact(*ppsNsGmd, "contact", map, ppsNsGco)); /* gmd:dateStamp */ /* TODO: nil for now, find way to derive this automagically */ xmlAddChild(psRootNode, _msMetadataGetCharacterString( *ppsNsGmd, "dateStamp", NULL, ppsNsGco)); /* gmd:metadataStandardName */ xmlAddChild(psRootNode, _msMetadataGetCharacterString( *ppsNsGmd, "metadataStandardName", "ISO 19115:2003 - Geographic information - Metadata", ppsNsGco)); /* gmd:metadataStandardVersion */ xmlAddChild(psRootNode, _msMetadataGetCharacterString( *ppsNsGmd, "metadataStandardVersion", "ISO 19115:2003", ppsNsGco)); /* gmd:spatialRepresentationInfo */ xmlAddChild(psRootNode, _msMetadataGetSpatialRepresentationInfo( *ppsNsGmd, layer, ppsNsGco)); /* gmd:referenceSystemInfo */ xmlAddChild(psRootNode, _msMetadataGetReferenceSystemInfo(*ppsNsGmd, layer, ppsNsGco)); /* gmd:identificationInfo */ xmlAddChild(psRootNode, _msMetadataGetIdentificationInfo(*ppsNsGmd, map, layer, ppsNsGco)); /* gmd:distributionInfo */ xmlAddChild(psRootNode, _msMetadataGetDistributionInfo( *ppsNsGmd, map, layer, cgi_request, ppsNsGco)); } return psRootNode; } /************************************************************************/ /* msMetadataDispatch */ /* */ /* Entry point for metadata requests. */ /* */ /* - If this is a valid request then it is processed and MS_SUCCESS */ /* is returned on success, or MS_FAILURE on failure. */ /* */ /* - If this does not appear to be a valid WFS request then MS_DONE */ /* is returned and MapServer is expected to process this as a regular */ /* MapServer request. */ /************************************************************************/ int msMetadataDispatch(mapObj *map, cgiRequestObj *cgi_request) { int i; int status = MS_SUCCESS; xmlNodePtr psRootNode = NULL; xmlDocPtr xml_document; metadataParamsObj *paramsObj; layerObj *layer = NULL; xmlNsPtr psNsOws = NULL; xmlNsPtr psNsXsi = NULL; xmlNsPtr psNsGmd = NULL; xmlNsPtr psNsGco = NULL; /* Populate the Params object based on the request */ paramsObj = msMetadataCreateParamsObj(); xml_document = xmlNewDoc(BAD_CAST "1.0"); if (msMetadataParseRequest(cgi_request, paramsObj) == MS_FAILURE) { psRootNode = msMetadataGetExceptionReport( map, "InvalidRequest", "layer", "Request parsing failed", &psNsOws); status = MS_FAILURE; } /* if layer= is not specified, */ if (paramsObj->pszLayer == NULL || strlen(paramsObj->pszLayer) == 0) { psRootNode = msMetadataGetExceptionReport(map, "MissingParameterValue", "layer", "Missing layer parameter", &psNsOws); status = MS_FAILURE; } if (status == MS_SUCCESS) { /* Start dispatching request */ /* Check that layer requested exists in mapfile */ for (i = 0; i < map->numlayers; i++) { if (strcasecmp(GET_LAYER(map, i)->name, paramsObj->pszLayer) == 0) { layer = GET_LAYER(map, i); break; } } if (layer != NULL && msOWSLookupMetadata(&(layer->metadata), "MFCO", "metadataurl_href")) { msIO_setHeader("Status", "301 Moved Permanently"); msIO_setHeader( "Location", "%s", msOWSLookupMetadata(&(layer->metadata), "MFCO", "metadataurl_href")); msIO_sendHeaders(); } else { psRootNode = msMetadataGetLayerMetadata( map, paramsObj, cgi_request, &psNsOws, &psNsXsi, &psNsGmd, &psNsGco); } } if (psRootNode != NULL) { xmlChar *xml_buffer = NULL; int buffersize = 0; xmlDocSetRootElement(xml_document, psRootNode); msIO_setHeader("Content-type", "text/xml; charset=UTF-8"); msIO_sendHeaders(); msIOContext *context = NULL; context = msIO_getHandler(stdout); xmlDocDumpFormatMemoryEnc(xml_document, &xml_buffer, &buffersize, "UTF-8", 1); msIO_contextWrite(context, xml_buffer, buffersize); xmlFree(xml_buffer); } xmlFreeDoc(xml_document); if (psNsOws) xmlFreeNs(psNsOws); if (psNsXsi) xmlFreeNs(psNsXsi); if (psNsGmd) xmlFreeNs(psNsGmd); if (psNsGco) xmlFreeNs(psNsGco); msMetadataFreeParamsObj(paramsObj); return status; } #endif /* USE_LIBXML2 */ /************************************************************************/ /* msMetadataCreateParamsObj */ /* */ /* Create a parameter object, initialize it. */ /* The caller should free the object using msMetadataFreeParamsObj. */ /************************************************************************/ metadataParamsObj *msMetadataCreateParamsObj() { metadataParamsObj *paramsObj = (metadataParamsObj *)calloc(1, sizeof(metadataParamsObj)); MS_CHECK_ALLOC(paramsObj, sizeof(metadataParamsObj), NULL); paramsObj->pszLayer = NULL; paramsObj->pszOutputSchema = NULL; return paramsObj; } /************************************************************************/ /* msMetadataFreeParmsObj */ /* */ /* Free params object. */ /************************************************************************/ void msMetadataFreeParamsObj(metadataParamsObj *metadataparams) { if (metadataparams) { free(metadataparams->pszRequest); free(metadataparams->pszLayer); free(metadataparams->pszOutputSchema); free(metadataparams); } } /************************************************************************/ /* msMetadataParseRequest */ /* */ /* Parse request into the params object. */ /************************************************************************/ static int msMetadataParseRequest(cgiRequestObj *request, metadataParamsObj *metadataparams) { if (!request || !metadataparams) return MS_FAILURE; if (request->NumParams > 0) { for (int i = 0; i < request->NumParams; i++) { if (request->ParamNames[i] && request->ParamValues[i]) { if (strcasecmp(request->ParamNames[i], "LAYER") == 0) metadataparams->pszLayer = msStrdup(request->ParamValues[i]); if (strcasecmp(request->ParamNames[i], "OUTPUTSCHEMA") == 0) metadataparams->pszOutputSchema = msStrdup(request->ParamValues[i]); } } } return MS_SUCCESS; } /************************************************************************/ /* msMetadataSetGetMetadataURL */ /* */ /* Parse request into the params object. */ /************************************************************************/ void msMetadataSetGetMetadataURL(layerObj *lp, const char *url) { char *pszMetadataURL = NULL; pszMetadataURL = msStrdup(url); msDecodeHTMLEntities(pszMetadataURL); pszMetadataURL = msStringConcatenate(pszMetadataURL, "request=GetMetadata&layer="); pszMetadataURL = msStringConcatenate(pszMetadataURL, lp->name); msInsertHashTable(&(lp->metadata), "ows_metadataurl_href", pszMetadataURL); msInsertHashTable(&(lp->metadata), "ows_metadataurl_type", "TC211"); msInsertHashTable(&(lp->metadata), "ows_metadataurl_format", "text/xml"); msInsertHashTable(&(lp->metadata), "ows_metadatalink_href", pszMetadataURL); msInsertHashTable(&(lp->metadata), "ows_metadatalink_type", "TC211"); msInsertHashTable(&(lp->metadata), "ows_metadatalink_format", "text/xml"); msFree(pszMetadataURL); } #endif mapserver-8.4.0/src/mapmssql2008.c000066400000000000000000004014361474174441300166520ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MS SQL Server Layer Connector * Author: Richard Hillman - based on PostGIS and SpatialDB connectors * Tamas Szekeres - maintenance * ****************************************************************************** * Copyright (c) 2007 IS Consulting (www.mapdotnet.com) * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * Revision 1.0 2007/7/1 * Created. * */ #ifndef _WIN32 #define _GNU_SOURCE #endif #define _CRT_SECURE_NO_WARNINGS 1 /* $Id$ */ #include #include "mapserver.h" #include "maptime.h" #include "mapows.h" #ifdef USE_MSSQL2008 #ifdef _WIN32 #include #endif #include #include #include #include #include /* tolower() */ /* SqlGeometry/SqlGeography serialization format Simple Point (SerializationProps & IsSinglePoint) [SRID][0x01][SerializationProps][Point][z][m] Simple Line Segment (SerializationProps & IsSingleLineSegment) [SRID][0x01][SerializationProps][Point1][Point2][z1][z2][m1][m2] Complex Geometries [SRID][VersionAttribute][SerializationProps][NumPoints][Point1]..[PointN][z1]..[zN][m1]..[mN] [NumFigures][Figure]..[Figure][NumShapes][Shape]..[Shape] Complex Geometries (FigureAttribute == Curve) [SRID][VersionAttribute][SerializationProps][NumPoints][Point1]..[PointN][z1]..[zN][m1]..[mN] [NumFigures][Figure]..[Figure][NumShapes][Shape]..[Shape][NumSegments][SegmentType]..[SegmentType] VersionAttribute (1 byte) 0x01 = Katmai (MSSQL2008+) 0x02 = Denali (MSSQL2012+) SRID Spatial Reference Id (4 bytes) SerializationProps (bitmask) 1 byte 0x01 = HasZValues 0x02 = HasMValues 0x04 = IsValid 0x08 = IsSinglePoint 0x10 = IsSingleLineSegment 0x20 = IsLargerThanAHemisphere Point (2-4)x8 bytes, size depends on SerializationProps & HasZValues & HasMValues [x][y] - SqlGeometry [latitude][longitude] - SqlGeography Figure [FigureAttribute][PointOffset] FigureAttribute - Katmai (1 byte) 0x00 = Interior Ring 0x01 = Stroke 0x02 = Exterior Ring FigureAttribute - Denali (1 byte) 0x00 = None 0x01 = Line 0x02 = Arc 0x03 = Curve Shape [ParentFigureOffset][FigureOffset][ShapeType] ShapeType (1 byte) 0x00 = Unknown 0x01 = Point 0x02 = LineString 0x03 = Polygon 0x04 = MultiPoint 0x05 = MultiLineString 0x06 = MultiPolygon 0x07 = GeometryCollection -- Denali 0x08 = CircularString 0x09 = CompoundCurve 0x0A = CurvePolygon 0x0B = FullGlobe SegmentType (1 byte) 0x00 = Line 0x01 = Arc 0x02 = FirstLine 0x03 = FirstArc */ /* Native geometry parser macros */ /* parser error codes */ #define NOERROR 0 #define NOT_ENOUGH_DATA 1 #define CORRUPT_DATA 2 #define UNSUPPORTED_GEOMETRY_TYPE 3 /* geometry format to transfer geometry column */ #define MSSQLGEOMETRY_NATIVE 0 #define MSSQLGEOMETRY_WKB 1 #define MSSQLGEOMETRY_WKT 2 /* geometry column types */ #define MSSQLCOLTYPE_GEOMETRY 0 #define MSSQLCOLTYPE_GEOGRAPHY 1 #define MSSQLCOLTYPE_BINARY 2 #define MSSQLCOLTYPE_TEXT 3 #define SP_NONE 0 #define SP_HASZVALUES 1 #define SP_HASMVALUES 2 #define SP_ISVALID 4 #define SP_ISSINGLEPOINT 8 #define SP_ISSINGLELINESEGMENT 0x10 #define SP_ISLARGERTHANAHEMISPHERE 0x20 #define ST_UNKNOWN 0 #define ST_POINT 1 #define ST_LINESTRING 2 #define ST_POLYGON 3 #define ST_MULTIPOINT 4 #define ST_MULTILINESTRING 5 #define ST_MULTIPOLYGON 6 #define ST_GEOMETRYCOLLECTION 7 #define ST_CIRCULARSTRING 8 #define ST_COMPOUNDCURVE 9 #define ST_CURVEPOLYGON 10 #define ST_FULLGLOBE 11 #define SMT_LINE 0 #define SMT_ARC 1 #define SMT_FIRSTLINE 2 #define SMT_FIRSTARC 3 #define ReadInt32(nPos) (*((unsigned int *)(gpi->pszData + (nPos)))) #define ReadByte(nPos) (gpi->pszData[nPos]) #define ReadDouble(nPos) (*((double *)(gpi->pszData + (nPos)))) #define ParentOffset(iShape) (ReadInt32(gpi->nShapePos + (iShape)*9)) #define FigureOffset(iShape) (ReadInt32(gpi->nShapePos + (iShape)*9 + 4)) #define ShapeType(iShape) (ReadByte(gpi->nShapePos + (iShape)*9 + 8)) #define SegmentType(iSegment) (ReadByte(gpi->nSegmentPos + (iSegment))) #define NextFigureOffset(iShape) \ (iShape + 1 < gpi->nNumShapes ? FigureOffset((iShape) + 1) : gpi->nNumFigures) #define FigureAttribute(iFigure) (ReadByte(gpi->nFigurePos + (iFigure)*5)) #define PointOffset(iFigure) (ReadInt32(gpi->nFigurePos + (iFigure)*5 + 1)) #define NextPointOffset(iFigure) \ (iFigure + 1 < gpi->nNumFigures ? PointOffset((iFigure) + 1) \ : (unsigned)gpi->nNumPoints) #define ReadX(iPoint) (ReadDouble(gpi->nPointPos + 16 * (iPoint))) #define ReadY(iPoint) (ReadDouble(gpi->nPointPos + 16 * (iPoint) + 8)) #define ReadZ(iPoint) \ (ReadDouble(gpi->nPointPos + 16 * gpi->nNumPoints + 8 * (iPoint))) #define ReadM(iPoint) \ (ReadDouble(gpi->nPointPos + 24 * gpi->nNumPoints + 8 * (iPoint))) #define FP_EPSILON 1e-12 #define SEGMENT_ANGLE 5.0 #define SEGMENT_MINPOINTS 10 /* Native geometry parser struct */ typedef struct msGeometryParserInfo_t { unsigned char *pszData; int nLen; /* version */ char chVersion; /* serialization properties */ char chProps; /* point array */ int nPointSize; int nPointPos; int nNumPoints; int nNumPointsRead; /* figure array */ int nFigurePos; int nNumFigures; /* shape array */ int nShapePos; int nNumShapes; int nSRSId; /* segment array */ int nSegmentPos; int nNumSegments; /* geometry or geography */ int nColType; /* bounds */ double minx; double miny; double maxx; double maxy; } msGeometryParserInfo; /* Structure for connection to an ODBC database (Microsoft preferred way to * connect to SQL Server 2005 from c/c++) */ typedef struct msODBCconn_t { SQLHENV henv; /* ODBC HENV */ SQLHDBC hdbc; /* ODBC HDBC */ SQLHSTMT hstmt; /* ODBC HSTMNT */ char errorMessage[1024]; /* Last error message if any */ } msODBCconn; typedef struct ms_MSSQL2008_layer_info_t { char *sql; /* sql query to send to DB */ long row_num; /* what row is the NEXT to be read (for random access) */ char *geom_column; /* name of the actual geometry column parsed from the LAYER's DATA field */ char *geom_column_type; /* the type of the geometry column */ char *geom_table; /* the table name or sub-select decalred in the LAYER's DATA field */ char *urid_name; /* name of user-specified unique identifier or OID */ char * user_srid; /* zero length = calculate, non-zero means using this value! */ char *index_name; /* hopefully this isn't necessary - but if the optimizer ain't cuttin' it... */ char *sort_spec; /* the sort by specification which should be applied to the generated select statement */ int mssqlversion_major; /* the sql server major version number */ int paging; /* Driver handling of pagination, enabled by default */ SQLSMALLINT *itemtypes; /* storing the sql field types for further reference */ msODBCconn *conn; /* Connection to db */ msGeometryParserInfo gpi; /* struct for the geometry parser */ int geometry_format; /* Geometry format to be retrieved from the database */ tokenListNodeObjPtr current_node; /* filter expression translation */ } msMSSQL2008LayerInfo; #define SQL_COLUMN_NAME_MAX_LENGTH 128 #define SQL_TABLE_NAME_MAX_LENGTH 128 #define DATA_ERROR_MESSAGE \ "%s" \ "Error with MSSQL2008 data variable. You specified '%s'.
\n" \ "Standard ways of specifying are :
\n(1) 'geometry_column from " \ "geometry_table'
\n(2) 'geometry_column from (<sub query>) as " \ "foo using unique <column name> using SRID=<srid#>' " \ "

\n\n" \ "Make sure you utilize the 'using unique <column name>' and 'using " \ "with <index name>' clauses in.\n\n

" \ "For more help, please see http://www.mapdotnet.com \n\n

" \ "mapmssql2008.c - version of 2007/7/1.\n" /* Native geometry parser code */ void ReadPoint(msGeometryParserInfo *gpi, pointObj *p, int iPoint) { if (gpi->nColType == MSSQLCOLTYPE_GEOGRAPHY) { p->x = ReadY(iPoint); p->y = ReadX(iPoint); } else { p->x = ReadX(iPoint); p->y = ReadY(iPoint); } /* calculate bounds */ if (gpi->nNumPointsRead++ == 0) { gpi->minx = gpi->maxx = p->x; gpi->miny = gpi->maxy = p->y; } else { if (gpi->minx > p->x) gpi->minx = p->x; else if (gpi->maxx < p->x) gpi->maxx = p->x; if (gpi->miny > p->y) gpi->miny = p->y; else if (gpi->maxy < p->y) gpi->maxy = p->y; } if ((gpi->chProps & SP_HASZVALUES) && (gpi->chProps & SP_HASMVALUES)) { p->z = ReadZ(iPoint); p->m = ReadM(iPoint); } else if (gpi->chProps & SP_HASZVALUES) { p->z = ReadZ(iPoint); p->m = 0.0; } else if (gpi->chProps & SP_HASMVALUES) { p->z = 0.0; p->m = ReadZ(iPoint); } else { p->z = 0.0; p->m = 0.0; } } int StrokeArcToLine(msGeometryParserInfo *gpi, lineObj *line, int index) { if (index > 1) { double x, y, x1, y1, x2, y2, x3, y3, dxa, dya, sxa, sya, dxb, dyb; double d, sxb, syb, ox, oy, a1, a3, sa, da, a, radius; int numpoints; double z; z = line->point[index].z; /* must be equal for arc segments */ /* first point */ x1 = line->point[index - 2].x; y1 = line->point[index - 2].y; /* second point */ x2 = line->point[index - 1].x; y2 = line->point[index - 1].y; /* third point */ x3 = line->point[index].x; y3 = line->point[index].y; sxa = (x1 + x2); sya = (y1 + y2); dxa = x2 - x1; dya = y2 - y1; sxb = (x2 + x3); syb = (y2 + y3); dxb = x3 - x2; dyb = y3 - y2; d = (dxa * dyb - dya * dxb) * 2; if (fabs(d) < FP_EPSILON) { /* points are colinear, nothing to do here */ return index; } /* calculating the center of circle */ ox = ((sya - syb) * dya * dyb + sxa * dyb * dxa - sxb * dya * dxb) / d; oy = ((sxb - sxa) * dxa * dxb + syb * dyb * dxa - sya * dya * dxb) / d; radius = sqrt((x1 - ox) * (x1 - ox) + (y1 - oy) * (y1 - oy)); /* calculating the angle to be used */ a1 = atan2(y1 - oy, x1 - ox); a3 = atan2(y3 - oy, x3 - ox); if (d > 0) { /* draw counterclockwise */ if (a3 > a1) /* Wrapping past 180? */ sa = a3 - a1; else sa = a3 - a1 + 2.0 * M_PI; } else { if (a3 > a1) /* Wrapping past 180? */ sa = a3 - a1 + 2.0 * M_PI; else sa = a3 - a1; } numpoints = (int)floor(fabs(sa) * 180 / SEGMENT_ANGLE / M_PI); if (numpoints < SEGMENT_MINPOINTS) numpoints = SEGMENT_MINPOINTS; da = sa / numpoints; /* extend the point array */ line->numpoints += numpoints - 2; line->point = msSmallRealloc(line->point, sizeof(pointObj) * line->numpoints); --index; a = a1 + da; while (numpoints > 1) { line->point[index].x = x = ox + radius * cos(a); line->point[index].y = y = oy + radius * sin(a); line->point[index].z = z; /* calculate bounds */ if (gpi->minx > x) gpi->minx = x; else if (gpi->maxx < x) gpi->maxx = x; if (gpi->miny > y) gpi->miny = y; else if (gpi->maxy < y) gpi->maxy = y; a += da; ++index; --numpoints; } /* set last point */ line->point[index].x = x3; line->point[index].y = y3; line->point[index].z = z; } return index; } int ParseSqlGeometry(msMSSQL2008LayerInfo *layerinfo, shapeObj *shape) { msGeometryParserInfo *gpi = &layerinfo->gpi; gpi->nNumPointsRead = 0; if (gpi->nLen < 10) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } /* store the SRS id for further use */ gpi->nSRSId = ReadInt32(0); gpi->chVersion = ReadByte(4); if (gpi->chVersion > 2) { msDebug("ParseSqlGeometry CORRUPT_DATA\n"); return CORRUPT_DATA; } gpi->chProps = ReadByte(5); gpi->nPointSize = 16; if (gpi->chProps & SP_HASMVALUES) gpi->nPointSize += 8; if (gpi->chProps & SP_HASZVALUES) gpi->nPointSize += 8; if (gpi->chProps & SP_ISSINGLEPOINT) { // single point geometry gpi->nNumPoints = 1; if (gpi->nLen < 6 + gpi->nPointSize) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } shape->type = MS_SHAPE_POINT; shape->line = (lineObj *)msSmallMalloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)msSmallMalloc(sizeof(pointObj)); shape->line[0].numpoints = 1; gpi->nPointPos = 6; ReadPoint(gpi, &shape->line[0].point[0], 0); } else if (gpi->chProps & SP_ISSINGLELINESEGMENT) { // single line segment with 2 points gpi->nNumPoints = 2; if (gpi->nLen < 6 + 2 * gpi->nPointSize) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } shape->type = MS_SHAPE_LINE; shape->line = (lineObj *)msSmallMalloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line[0].numpoints = 2; gpi->nPointPos = 6; ReadPoint(gpi, &shape->line[0].point[0], 0); ReadPoint(gpi, &shape->line[0].point[1], 1); } else { int iShape, iFigure, iSegment = 0; // complex geometries gpi->nNumPoints = ReadInt32(6); if (gpi->nNumPoints <= 0) { return NOERROR; } // position of the point array gpi->nPointPos = 10; // position of the figures gpi->nFigurePos = gpi->nPointPos + gpi->nPointSize * gpi->nNumPoints + 4; if (gpi->nLen < gpi->nFigurePos) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } gpi->nNumFigures = ReadInt32(gpi->nFigurePos - 4); if (gpi->nNumFigures <= 0) { return NOERROR; } // position of the shapes gpi->nShapePos = gpi->nFigurePos + 5 * gpi->nNumFigures + 4; if (gpi->nLen < gpi->nShapePos) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } gpi->nNumShapes = ReadInt32(gpi->nShapePos - 4); if (gpi->nLen < gpi->nShapePos + 9 * gpi->nNumShapes) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } if (gpi->nNumShapes <= 0) { return NOERROR; } // pick up the root shape if (ParentOffset(0) != 0xFFFFFFFF) { msDebug("ParseSqlGeometry CORRUPT_DATA\n"); return CORRUPT_DATA; } // determine the shape type for (iShape = 0; iShape < gpi->nNumShapes; iShape++) { unsigned char shapeType = ShapeType(iShape); if (shapeType == ST_POINT || shapeType == ST_MULTIPOINT) { shape->type = MS_SHAPE_POINT; break; } else if (shapeType == ST_LINESTRING || shapeType == ST_MULTILINESTRING || shapeType == ST_CIRCULARSTRING || shapeType == ST_COMPOUNDCURVE) { shape->type = MS_SHAPE_LINE; break; } else if (shapeType == ST_POLYGON || shapeType == ST_MULTIPOLYGON || shapeType == ST_CURVEPOLYGON) { shape->type = MS_SHAPE_POLYGON; break; } } shape->line = (lineObj *)msSmallMalloc(sizeof(lineObj) * gpi->nNumFigures); shape->numlines = gpi->nNumFigures; gpi->nNumSegments = 0; // read figures for (iFigure = 0; iFigure < gpi->nNumFigures; iFigure++) { int iPoint, iNextPoint, i; iPoint = PointOffset(iFigure); iNextPoint = NextPointOffset(iFigure); shape->line[iFigure].point = (pointObj *)msSmallMalloc(sizeof(pointObj) * (iNextPoint - iPoint)); shape->line[iFigure].numpoints = iNextPoint - iPoint; i = 0; if (gpi->chVersion == 0x02 && FigureAttribute(iFigure) >= 0x02) { int nPointPrepared = 0; lineObj *line = &shape->line[iFigure]; if (FigureAttribute(iFigure) == 0x03) { if (gpi->nNumSegments == 0) { /* position of the segment types */ gpi->nSegmentPos = gpi->nShapePos + 9 * gpi->nNumShapes + 4; gpi->nNumSegments = ReadInt32(gpi->nSegmentPos - 4); if (gpi->nLen < gpi->nSegmentPos + gpi->nNumSegments) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } iSegment = 0; } while (iPoint < iNextPoint && iSegment < gpi->nNumSegments) { ReadPoint(gpi, &line->point[i], iPoint); ++iPoint; ++nPointPrepared; if (nPointPrepared == 2 && (SegmentType(iSegment) == SMT_FIRSTLINE || SegmentType(iSegment) == SMT_LINE)) { ++iSegment; nPointPrepared = 1; } else if (nPointPrepared == 3 && (SegmentType(iSegment) == SMT_FIRSTARC || SegmentType(iSegment) == SMT_ARC)) { i = StrokeArcToLine(gpi, line, i); ++iSegment; nPointPrepared = 1; } ++i; } } else { while (iPoint < iNextPoint) { ReadPoint(gpi, &line->point[i], iPoint); ++iPoint; ++nPointPrepared; if (nPointPrepared == 3) { i = StrokeArcToLine(gpi, line, i); nPointPrepared = 1; } ++i; } } } else { while (iPoint < iNextPoint) { ReadPoint(gpi, &shape->line[iFigure].point[i], iPoint); ++iPoint; ++i; } } } } /* set bounds */ shape->bounds.minx = gpi->minx; shape->bounds.miny = gpi->miny; shape->bounds.maxx = gpi->maxx; shape->bounds.maxy = gpi->maxy; return NOERROR; } /* MS SQL driver code*/ msMSSQL2008LayerInfo *getMSSQL2008LayerInfo(const layerObj *layer) { return layer->layerinfo; } void setMSSQL2008LayerInfo(layerObj *layer, msMSSQL2008LayerInfo *MSSQL2008layerinfo) { layer->layerinfo = (void *)MSSQL2008layerinfo; } void handleSQLError(layerObj *layer) { SQLCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER NativeError; SQLSMALLINT i, MsgLen; SQLRETURN rc; msMSSQL2008LayerInfo *layerinfo = getMSSQL2008LayerInfo(layer); if (layerinfo == NULL) return; // Get the status records. i = 1; while ((rc = SQLGetDiagRec(SQL_HANDLE_STMT, layerinfo->conn->hstmt, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) { if (layer->debug) { msDebug("SQLError: %s\n", Msg); } i++; } } /* TODO Take a look at glibc's strcasestr */ static char *strstrIgnoreCase(const char *haystack, const char *needle) { char *hay_lower; char *needle_lower; size_t len_hay, len_need, match; int found = MS_FALSE; char *loc; len_hay = strlen(haystack); len_need = strlen(needle); hay_lower = (char *)msSmallMalloc(len_hay + 1); needle_lower = (char *)msSmallMalloc(len_need + 1); size_t t; for (t = 0; t < len_hay; t++) { hay_lower[t] = (char)tolower(haystack[t]); } hay_lower[t] = 0; for (t = 0; t < len_need; t++) { needle_lower[t] = (char)tolower(needle[t]); } needle_lower[t] = 0; loc = strstr(hay_lower, needle_lower); if (loc) { match = loc - hay_lower; found = MS_TRUE; } msFree(hay_lower); msFree(needle_lower); return (char *)(found == MS_FALSE ? NULL : haystack + match); } static int msMSSQL2008LayerParseData(layerObj *layer, char **geom_column_name, char **geom_column_type, char **table_name, char **urid_name, char **user_srid, char **index_name, char **sort_spec, int debug); /* Close connection and handles */ static void msMSSQL2008CloseConnection(void *conn_handle) { msODBCconn *conn = (msODBCconn *)conn_handle; if (!conn) { return; } if (conn->hstmt) { SQLFreeHandle(SQL_HANDLE_STMT, conn->hstmt); } if (conn->hdbc) { SQLDisconnect(conn->hdbc); SQLFreeHandle(SQL_HANDLE_DBC, conn->hdbc); } if (conn->henv) { SQLFreeHandle(SQL_HANDLE_ENV, conn->henv); } msFree(conn); } /* Set the error string for the connection */ static void setConnError(msODBCconn *conn) { SQLSMALLINT len; SQLGetDiagField(SQL_HANDLE_DBC, conn->hdbc, 1, SQL_DIAG_MESSAGE_TEXT, (SQLPOINTER)conn->errorMessage, sizeof(conn->errorMessage), &len); conn->errorMessage[len] = 0; } #ifdef USE_ICONV static SQLWCHAR *convertCwchartToSQLWCHAR(const wchar_t *inStr) { SQLWCHAR *outStr; int i, len; for (len = 0; inStr[len] != 0; ++len) { /* do nothing */ } outStr = (SQLWCHAR *)msSmallMalloc(sizeof(SQLWCHAR) * (len + 1)); for (i = 0; i <= len; i++) { outStr[i] = (SQLWCHAR)inStr[i]; } return outStr; } #endif /* Connect to db */ static msODBCconn *mssql2008Connect(const char *connString) { SQLSMALLINT outConnStringLen; SQLRETURN rc; msODBCconn *conn = msSmallMalloc(sizeof(msODBCconn)); char fullConnString[1024]; memset(conn, 0, sizeof(*conn)); SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &conn->henv); SQLSetEnvAttr(conn->henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, conn->henv, &conn->hdbc); if (strcasestr(connString, "DRIVER=") == 0) { snprintf(fullConnString, sizeof(fullConnString), "DRIVER={SQL Server};%s", connString); connString = fullConnString; } { #ifdef USE_ICONV wchar_t *decodedConnString = msConvertWideStringFromUTF8(connString, "UCS-2LE"); SQLWCHAR outConnString[1024]; SQLWCHAR *decodedConnStringSQLWCHAR = convertCwchartToSQLWCHAR(decodedConnString); rc = SQLDriverConnectW(conn->hdbc, NULL, decodedConnStringSQLWCHAR, SQL_NTS, outConnString, 1024, &outConnStringLen, SQL_DRIVER_NOPROMPT); msFree(decodedConnString); msFree(decodedConnStringSQLWCHAR); #else SQLCHAR outConnString[1024]; rc = SQLDriverConnect(conn->hdbc, NULL, (SQLCHAR *)connString, SQL_NTS, outConnString, 1024, &outConnStringLen, SQL_DRIVER_NOPROMPT); #endif } if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { setConnError(conn); return conn; } SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &conn->hstmt); return conn; } /* Set the error string for the statement execution */ static void setStmntError(msODBCconn *conn) { SQLSMALLINT len; SQLGetDiagField(SQL_HANDLE_STMT, conn->hstmt, 1, SQL_DIAG_MESSAGE_TEXT, (SQLPOINTER)conn->errorMessage, sizeof(conn->errorMessage), &len); conn->errorMessage[len] = 0; } /* Execute SQL against connection. Set error string if failed */ static int executeSQL(msODBCconn *conn, const char *sql) { SQLRETURN rc; SQLCloseCursor(conn->hstmt); #ifdef USE_ICONV { wchar_t *decodedSql = msConvertWideStringFromUTF8(sql, "UCS-2LE"); SQLWCHAR *decodedSqlSQLWCHAR = convertCwchartToSQLWCHAR(decodedSql); rc = SQLExecDirectW(conn->hstmt, decodedSqlSQLWCHAR, SQL_NTS); msFree(decodedSql); msFree(decodedSqlSQLWCHAR); } #else rc = SQLExecDirect(conn->hstmt, (SQLCHAR *)sql, SQL_NTS); #endif if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { return 1; } else { setStmntError(conn); return 0; } } /* Get columns name from query results */ static int columnName(msODBCconn *conn, int index, char *buffer, int bufferLength, layerObj *layer, char pass_field_def, SQLSMALLINT *itemType) { SQLRETURN rc; SQLCHAR columnName[SQL_COLUMN_NAME_MAX_LENGTH + 1]; SQLSMALLINT columnNameLen; SQLSMALLINT dataType; SQLULEN columnSize; SQLSMALLINT decimalDigits; SQLSMALLINT nullable; rc = SQLDescribeCol(conn->hstmt, (SQLUSMALLINT)index, columnName, SQL_COLUMN_NAME_MAX_LENGTH, &columnNameLen, &dataType, &columnSize, &decimalDigits, &nullable); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { if (bufferLength < SQL_COLUMN_NAME_MAX_LENGTH + 1) strlcpy(buffer, (const char *)columnName, bufferLength); else strlcpy(buffer, (const char *)columnName, SQL_COLUMN_NAME_MAX_LENGTH + 1); *itemType = dataType; if (pass_field_def) { char gml_width[32], gml_precision[32]; const char *gml_type = NULL; gml_width[0] = '\0'; gml_precision[0] = '\0'; switch (dataType) { case SQL_INTEGER: case SQL_SMALLINT: case SQL_TINYINT: gml_type = "Integer"; break; case SQL_BIGINT: gml_type = "Long"; break; case SQL_REAL: case SQL_FLOAT: case SQL_DOUBLE: case SQL_DECIMAL: case SQL_NUMERIC: gml_type = "Real"; if (decimalDigits > 0) sprintf(gml_precision, "%d", decimalDigits); break; case SQL_TYPE_DATE: gml_type = "Date"; break; case SQL_TYPE_TIME: gml_type = "Time"; break; case SQL_TYPE_TIMESTAMP: gml_type = "DateTime"; break; case SQL_BIT: gml_type = "Boolean"; break; default: gml_type = "Character"; break; } if (columnSize > 0) sprintf(gml_width, "%u", (unsigned int)columnSize); msUpdateGMLFieldMetadata(layer, buffer, gml_type, gml_width, gml_precision, (const short)nullable); } return 1; } else { setStmntError(conn); return 0; } } /* open up a connection to the MS SQL 2008 database using the connection string * in layer->connection */ /* ie. "driver=;server=;database=;integrated * security=?;user id=;password=" */ int msMSSQL2008LayerOpen(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo; char *conn_decrypted = NULL; if (layer->debug) { msDebug("msMSSQL2008LayerOpen called datastatement: %s\n", layer->data); } if (getMSSQL2008LayerInfo(layer)) { if (layer->debug) { msDebug("msMSSQL2008LayerOpen :: layer is already open!!\n"); } return MS_SUCCESS; /* already open */ } if (!layer->data) { msSetError(MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerOpen()", "", "Error parsing MSSQL2008 data variable: nothing specified in " "DATA statement.

\n\nMore Help:

\n\n"); return MS_FAILURE; } if (!layer->connection) { msSetError(MS_QUERYERR, "MSSQL connection parameter not specified.", "msMSSQL2008LayerOpen()"); return MS_FAILURE; } /* have to setup a connection to the database */ layerinfo = (msMSSQL2008LayerInfo *)msSmallMalloc(sizeof(msMSSQL2008LayerInfo)); layerinfo->sql = NULL; /* calc later */ layerinfo->row_num = 0; layerinfo->geom_column = NULL; layerinfo->geom_column_type = NULL; layerinfo->geom_table = NULL; layerinfo->urid_name = NULL; layerinfo->user_srid = NULL; layerinfo->index_name = NULL; layerinfo->sort_spec = NULL; layerinfo->conn = NULL; layerinfo->itemtypes = NULL; layerinfo->mssqlversion_major = 0; layerinfo->paging = MS_TRUE; layerinfo->conn = (msODBCconn *)msConnPoolRequest(layer); if (!layerinfo->conn) { if (layer->debug) { msDebug("MSMSSQL2008LayerOpen -- shared connection not available.\n"); } /* Decrypt any encrypted token in connection and attempt to connect */ conn_decrypted = msDecryptStringTokens(layer->map, layer->connection); if (conn_decrypted == NULL) { return (MS_FAILURE); /* An error should already have been produced */ } layerinfo->conn = mssql2008Connect(conn_decrypted); msFree(conn_decrypted); conn_decrypted = NULL; if (!layerinfo->conn || layerinfo->conn->errorMessage[0]) { char *errMess = "Out of memory"; if (layer->debug) msDebug("MSMSSQL2008LayerOpen: Connection failure.\n"); if (layerinfo->conn) { errMess = layerinfo->conn->errorMessage; } msDebug( "Couldn't make connection to MS SQL Server with connect string " "'%s'.\n" "Error reported was '%s'.\n\n" "This error occurred when trying to make a connection to the " "specified SQL server.\n" "Most commonly this is caused by: \n" "(1) incorrect connection string \n" "(2) you didn't specify a 'user id=...' in your connection string \n" "(3) SQL server isn't running \n" "(4) TCPIP not enabled for SQL Client or server \n\n", layer->connection, errMess); msSetError(MS_QUERYERR, "Database connection failed. Check server logs for more " "details. Is SQL Server running? Is it allowing connections? " "Does the specified user exist? Is the password valid? Is the " "database on the standard port?", "MSMSSQL2008LayerOpen()"); msMSSQL2008CloseConnection(layerinfo->conn); msFree(layerinfo); return MS_FAILURE; } msConnPoolRegister(layer, layerinfo->conn, msMSSQL2008CloseConnection); } setMSSQL2008LayerInfo(layer, layerinfo); if (msMSSQL2008LayerParseData( layer, &layerinfo->geom_column, &layerinfo->geom_column_type, &layerinfo->geom_table, &layerinfo->urid_name, &layerinfo->user_srid, &layerinfo->index_name, &layerinfo->sort_spec, layer->debug) != MS_SUCCESS) { msSetError(MS_QUERYERR, "Could not parse the layer data", "msMSSQL2008LayerOpen()"); return MS_FAILURE; } /* identify the geometry transfer type */ if (msLayerGetProcessingKey(layer, "MSSQL_READ_WKB") != NULL) layerinfo->geometry_format = MSSQLGEOMETRY_WKB; else { layerinfo->geometry_format = MSSQLGEOMETRY_NATIVE; if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) layerinfo->gpi.nColType = MSSQLCOLTYPE_GEOGRAPHY; else layerinfo->gpi.nColType = MSSQLCOLTYPE_GEOMETRY; } return MS_SUCCESS; } /* Return MS_TRUE if layer is open, MS_FALSE otherwise. */ int msMSSQL2008LayerIsOpen(layerObj *layer) { return getMSSQL2008LayerInfo(layer) ? MS_TRUE : MS_FALSE; } /* Free the itemindexes array in a layer. */ void msMSSQL2008LayerFreeItemInfo(layerObj *layer) { if (layer->debug) { msDebug("msMSSQL2008LayerFreeItemInfo called\n"); } if (layer->iteminfo) { msFree(layer->iteminfo); } layer->iteminfo = NULL; } /* allocate the iteminfo index array - same order as the item list */ int msMSSQL2008LayerInitItemInfo(layerObj *layer) { int i; int *itemindexes; if (layer->debug) { msDebug("msMSSQL2008LayerInitItemInfo called\n"); } if (layer->numitems == 0) { return MS_SUCCESS; } msFree(layer->iteminfo); layer->iteminfo = (int *)msSmallMalloc(sizeof(int) * layer->numitems); itemindexes = (int *)layer->iteminfo; for (i = 0; i < layer->numitems; i++) { itemindexes[i] = i; /* last one is always the geometry one - the rest are non-geom */ } return MS_SUCCESS; } static int getMSSQLMajorVersion(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo = getMSSQL2008LayerInfo(layer); if (layerinfo == NULL) return 0; if (layerinfo->mssqlversion_major == 0) { const char *mssqlversion_major = msLayerGetProcessingKey(layer, "MSSQL_VERSION_MAJOR"); if (mssqlversion_major != NULL) { layerinfo->mssqlversion_major = atoi(mssqlversion_major); } else { /* need to query from database */ if (executeSQL(layerinfo->conn, "SELECT SERVERPROPERTY('ProductVersion')")) { SQLRETURN rc = SQLFetch(layerinfo->conn->hstmt); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { /* process results */ char result_data[256]; SQLLEN retLen = 0; rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc != SQL_ERROR) { result_data[retLen] = 0; layerinfo->mssqlversion_major = atoi(result_data); } } } } } return layerinfo->mssqlversion_major; } static int addFilter(layerObj *layer, char **query) { if (layer->filter.native_string) { (*query) = msStringConcatenate(*query, " WHERE ("); (*query) = msStringConcatenate(*query, layer->filter.native_string); (*query) = msStringConcatenate(*query, ")"); return MS_TRUE; } else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) { (*query) = msStringConcatenate(*query, " WHERE ("); (*query) = msStringConcatenate( *query, msLayerGetProcessingKey(layer, "NATIVE_FILTER")); (*query) = msStringConcatenate(*query, ")"); return MS_TRUE; } return MS_FALSE; } /* Get the layer extent as specified in the mapfile or a largest area */ /* covering all features */ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent) { msMSSQL2008LayerInfo *layerinfo; char *query = 0; char result_data[256]; SQLLEN retLen; SQLRETURN rc; if (layer->debug) { msDebug("msMSSQL2008LayerGetExtent called\n"); } if (!(layer->extent.minx == -1.0 && layer->extent.miny == -1.0 && layer->extent.maxx == -1.0 && layer->extent.maxy == -1.0)) { /* extent was already set */ extent->minx = layer->extent.minx; extent->miny = layer->extent.miny; extent->maxx = layer->extent.maxx; extent->maxy = layer->extent.maxy; } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { msSetError(MS_QUERYERR, "GetExtent called with layerinfo = NULL", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } /* set up statement */ if (getMSSQLMajorVersion(layer) >= 11) { if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) { query = msStringConcatenate( query, "WITH extent(extentcol) AS (SELECT " "geometry::EnvelopeAggregate(geometry::STGeomFromWKB("); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STAsBinary(), "); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STSrid)"); } else { query = msStringConcatenate( query, "WITH extent(extentcol) AS (SELECT geometry::EnvelopeAggregate("); query = msStringConcatenate(query, layerinfo->geom_column); } query = msStringConcatenate(query, ") AS extentcol FROM "); query = msStringConcatenate(query, layerinfo->geom_table); /* adding attribute filter */ addFilter(layer, &query); query = msStringConcatenate( query, ") SELECT extentcol.STPointN(1).STX, extentcol.STPointN(1).STY, " "extentcol.STPointN(3).STX, extentcol.STPointN(3).STY FROM extent"); } else { if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) { query = msStringConcatenate( query, "WITH ENVELOPE as (SELECT geometry::STGeomFromWKB("); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STAsBinary(), "); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STSrid)"); } else { query = msStringConcatenate(query, "WITH ENVELOPE as (SELECT "); query = msStringConcatenate(query, layerinfo->geom_column); } query = msStringConcatenate(query, ".STEnvelope() as envelope from "); query = msStringConcatenate(query, layerinfo->geom_table); /* adding attribute filter */ addFilter(layer, &query); query = msStringConcatenate( query, "), CORNERS as (SELECT envelope.STPointN(1) as point from " "ENVELOPE UNION ALL select envelope.STPointN(3) from ENVELOPE) " "SELECT MIN(point.STX), MIN(point.STY), MAX(point.STX), " "MAX(point.STY) FROM CORNERS"); } if (!executeSQL(layerinfo->conn, query)) { msFree(query); return MS_FAILURE; } msFree(query); /* process results */ rc = SQLFetch(layerinfo->conn->hstmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (layer->debug) { msDebug("msMSSQL2008LayerGetExtent: No results found.\n"); } return MS_FAILURE; } rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR || retLen < 0) { msSetError(MS_QUERYERR, "Failed to get MinX value", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } result_data[retLen] = 0; extent->minx = atof(result_data); rc = SQLGetData(layerinfo->conn->hstmt, 2, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR || retLen < 0) { msSetError(MS_QUERYERR, "Failed to get MinY value", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } result_data[retLen] = 0; extent->miny = atof(result_data); rc = SQLGetData(layerinfo->conn->hstmt, 3, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR || retLen < 0) { msSetError(MS_QUERYERR, "Failed to get MaxX value", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } result_data[retLen] = 0; extent->maxx = atof(result_data); rc = SQLGetData(layerinfo->conn->hstmt, 4, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR || retLen < 0) { msSetError(MS_QUERYERR, "Failed to get MaxY value", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } result_data[retLen] = 0; extent->maxy = atof(result_data); return MS_SUCCESS; } /* Get the layer feature count */ int msMSSQL2008LayerGetNumFeatures(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo; char *query = 0; char result_data[256]; SQLLEN retLen; SQLRETURN rc; if (layer->debug) { msDebug("msMSSQL2008LayerGetNumFeatures called\n"); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { msSetError(MS_QUERYERR, "GetNumFeatures called with layerinfo = NULL", "msMSSQL2008LayerGetNumFeatures()"); return -1; } /* set up statement */ query = msStringConcatenate(query, "SELECT count(*) FROM "); query = msStringConcatenate(query, layerinfo->geom_table); /* adding attribute filter */ addFilter(layer, &query); if (!executeSQL(layerinfo->conn, query)) { msFree(query); return -1; } msFree(query); rc = SQLFetch(layerinfo->conn->hstmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (layer->debug) { msDebug("msMSSQL2008LayerGetNumFeatures: No results found.\n"); } return -1; } rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR) { msSetError(MS_QUERYERR, "Failed to get feature count", "msMSSQL2008LayerGetNumFeatures()"); return -1; } result_data[retLen] = 0; return atoi(result_data); } /* Prepare and execute the SQL statement for this layer */ static int prepare_database(layerObj *layer, rectObj rect, char **query_string, int isQuery) { msMSSQL2008LayerInfo *layerinfo; char *query = 0; char *data_source = 0; char *f_table_name = 0; char *geom_table = 0; char *tmp = 0; char *paging_query = 0; /* "Geometry::STGeomFromText('POLYGON(())',)" + terminator = 40 chars Plus 10 formatted doubles (15 digits of precision, a decimal point, a space/comma delimiter each = 17 chars each) Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars or for geography columns "Geography::STGeomFromText('CURVEPOLYGON(())',)" + terminator = 46 chars Plus 18 formatted doubles (15 digits of precision, a decimal point, a space/comma delimiter each = 17 chars each) Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars */ char box3d[46 + 18 * 22 + 11]; int t; char *pos_from, *pos_ftab, *pos_space, *pos_paren; int hasFilter = MS_FALSE; const rectObj rectInvalid = MS_INIT_INVALID_RECT; const int bIsValidRect = memcmp(&rect, &rectInvalid, sizeof(rect)) != 0; layerinfo = getMSSQL2008LayerInfo(layer); /* Extract the proper f_table_name from the geom_table string. * We are expecting the geom_table to be either a single word * or a sub-select clause that possibly includes a join -- * * (select column[,column[,...]] from ftab[ natural join table2]) as foo * * We are expecting whitespace or a ')' after the ftab name. * */ geom_table = msStrdup(layerinfo->geom_table); pos_from = strstrIgnoreCase(geom_table, " from "); if (!pos_from) { f_table_name = (char *)msSmallMalloc(strlen(geom_table) + 1); strcpy(f_table_name, geom_table); } else { /* geom_table is a sub-select clause */ pos_ftab = pos_from + 6; /* This should be the start of the ftab name */ pos_space = strstr(pos_ftab, " "); /* First space */ /* TODO strrchr is POSIX and C99, rindex is neither */ #if defined(_WIN32) && !defined(__CYGWIN__) pos_paren = strrchr(pos_ftab, ')'); #else pos_paren = rindex(pos_ftab, ')'); #endif if (!pos_space || !pos_paren) { msSetError( MS_QUERYERR, DATA_ERROR_MESSAGE, "prepare_database()", geom_table, "Error parsing MSSQL2008 data variable: Something is wrong with your " "subselect statement.

\n\nMore Help:

\n\n"); return MS_FAILURE; } if (pos_paren < pos_space) { /* closing parenthesis precedes any space */ f_table_name = (char *)msSmallMalloc(pos_paren - pos_ftab + 1); strlcpy(f_table_name, pos_ftab, pos_paren - pos_ftab + 1); } else { f_table_name = (char *)msSmallMalloc(pos_space - pos_ftab + 1); strlcpy(f_table_name, pos_ftab, pos_space - pos_ftab + 1); } } if (rect.minx == rect.maxx || rect.miny == rect.maxy) { /* create point shape for rectangles with zero area */ sprintf(box3d, "%s::STGeomFromText('POINT(%.15g %.15g)',%s)", /* %s.STSrid)", */ layerinfo->geom_column_type, rect.minx, rect.miny, layerinfo->user_srid); } else if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) { /* SQL Server has a problem when x is -180 or 180 */ double minx = rect.minx <= -180 ? -179.999 : rect.minx; double maxx = rect.maxx >= 180 ? 179.999 : rect.maxx; double miny = rect.miny < -90 ? -90 : rect.miny; double maxy = rect.maxy > 90 ? 90 : rect.maxy; sprintf(box3d, "Geography::STGeomFromText('CURVEPOLYGON((%.15g %.15g,%.15g " "%.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g " "%.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */ minx, miny, minx + (maxx - minx) / 2, miny, maxx, miny, maxx, miny + (maxy - miny) / 2, maxx, maxy, minx + (maxx - minx) / 2, maxy, minx, maxy, minx, miny + (maxy - miny) / 2, minx, miny, layerinfo->user_srid); } else { sprintf(box3d, "Geometry::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g " "%.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */ rect.minx, rect.miny, rect.maxx, rect.miny, rect.maxx, rect.maxy, rect.minx, rect.maxy, rect.minx, rect.miny, layerinfo->user_srid); } /* substitute token '!BOX!' in geom_table with the box3d - do an unlimited # * of subs */ /* to not undo the work here, we need to make sure that data_source is * malloc'd here */ if (!strstr(geom_table, "!BOX!")) { data_source = (char *)msSmallMalloc(strlen(geom_table) + 1); strcpy(data_source, geom_table); } else { char *result = NULL; while (strstr(geom_table, "!BOX!")) { /* need to do a substitution */ char *start, *end; char *oldresult = result; start = strstr(geom_table, "!BOX!"); end = start + 5; result = (char *)msSmallMalloc((start - geom_table) + strlen(box3d) + strlen(end) + 1); strlcpy(result, geom_table, start - geom_table + 1); strcpy(result + (start - geom_table), box3d); strcat(result, end); geom_table = result; msFree(oldresult); } /* if we're here, this will be a malloc'd string, so no need to copy it */ data_source = (char *)geom_table; } /* start creating the query */ query = msStringConcatenate(query, "SELECT "); if (layerinfo->paging && (layer->maxfeatures >= 0 || layer->startindex > 0)) paging_query = msStringConcatenate(paging_query, "SELECT "); /* adding items to the select list */ for (t = 0; t < layer->numitems; t++) { #ifdef USE_ICONV query = msStringConcatenate(query, "convert(nvarchar(max), ["); #else query = msStringConcatenate(query, "convert(varchar(max), ["); #endif query = msStringConcatenate(query, layer->items[t]); query = msStringConcatenate(query, "]) '"); tmp = msIntToString(t); query = msStringConcatenate(query, tmp); if (paging_query) { paging_query = msStringConcatenate(paging_query, "["); paging_query = msStringConcatenate(paging_query, tmp); paging_query = msStringConcatenate(paging_query, "], "); } msFree(tmp); query = msStringConcatenate(query, "',"); } /* adding geometry column */ query = msStringConcatenate(query, "["); query = msStringConcatenate(query, layerinfo->geom_column); if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE) query = msStringConcatenate(query, "] 'geom',"); else { query = msStringConcatenate(query, "].STAsBinary() 'geom',"); } /* adding id column */ query = msStringConcatenate(query, "convert(varchar(36), ["); query = msStringConcatenate(query, layerinfo->urid_name); if (paging_query) { paging_query = msStringConcatenate(paging_query, "[geom], [id] FROM ("); query = msStringConcatenate(query, "]) 'id', row_number() over ("); if (layerinfo->sort_spec) { query = msStringConcatenate(query, layerinfo->sort_spec); } if (layer->sortBy.nProperties > 0) { tmp = msLayerBuildSQLOrderBy(layer); if (layerinfo->sort_spec) { query = msStringConcatenate(query, ", "); } else { query = msStringConcatenate(query, " ORDER BY "); } query = msStringConcatenate(query, tmp); msFree(tmp); } else { if (!layerinfo->sort_spec) { // use the unique Id as the default sort for paging query = msStringConcatenate(query, "ORDER BY "); query = msStringConcatenate(query, layerinfo->urid_name); } } query = msStringConcatenate(query, ") 'rownum' FROM "); } else { query = msStringConcatenate(query, "]) 'id' FROM "); } /* adding the source */ query = msStringConcatenate(query, data_source); msFree(data_source); msFree(f_table_name); /* use the index hint if provided */ if (layerinfo->index_name) { query = msStringConcatenate(query, " WITH (INDEX("); query = msStringConcatenate(query, layerinfo->index_name); query = msStringConcatenate(query, "))"); } /* adding attribute filter */ hasFilter = addFilter(layer, &query); if (bIsValidRect) { /* adding spatial filter */ if (hasFilter == MS_FALSE) query = msStringConcatenate(query, " WHERE "); else query = msStringConcatenate(query, " AND "); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STIntersects("); query = msStringConcatenate(query, box3d); query = msStringConcatenate(query, ") = 1 "); } if (paging_query) { paging_query = msStringConcatenate(paging_query, query); paging_query = msStringConcatenate(paging_query, ") tbl where [rownum] "); if (layer->startindex > 0) { tmp = msIntToString(layer->startindex); paging_query = msStringConcatenate(paging_query, ">= "); paging_query = msStringConcatenate(paging_query, tmp); if (layer->maxfeatures >= 0) { msFree(tmp); tmp = msIntToString(layer->startindex + layer->maxfeatures); paging_query = msStringConcatenate(paging_query, " and [rownum] < "); paging_query = msStringConcatenate(paging_query, tmp); } } else { tmp = msIntToString(layer->maxfeatures); paging_query = msStringConcatenate(paging_query, "< "); paging_query = msStringConcatenate(paging_query, tmp); } msFree(tmp); msFree(query); query = paging_query; } else { if (layerinfo->sort_spec) { query = msStringConcatenate(query, layerinfo->sort_spec); } /* Add extra sort by */ if (layer->sortBy.nProperties > 0) { char *pszTmp = msLayerBuildSQLOrderBy(layer); if (layerinfo->sort_spec) query = msStringConcatenate(query, ", "); else query = msStringConcatenate(query, " ORDER BY "); query = msStringConcatenate(query, pszTmp); msFree(pszTmp); } else if (isQuery && !layerinfo->sort_spec) { /* Add orderby to make the result set order deterministic */ query = msStringConcatenate(query, " ORDER BY ["); query = msStringConcatenate(query, layerinfo->urid_name); query = msStringConcatenate(query, "]"); } } if (layer->debug) { msDebug("query:%s\n", query); } if (executeSQL(layerinfo->conn, query)) { char pass_field_def = 0; int t; const char *value; *query_string = query; /* collect result information */ if ((value = msOWSLookupMetadata(&(layer->metadata), "G", "types")) != NULL && strcasecmp(value, "auto") == 0) pass_field_def = 1; msFree(layerinfo->itemtypes); layerinfo->itemtypes = msSmallMalloc(sizeof(SQLSMALLINT) * (layer->numitems + 1)); for (t = 0; t < layer->numitems; t++) { char colBuff[256]; SQLSMALLINT itemType = 0; columnName(layerinfo->conn, t + 1, colBuff, sizeof(colBuff), layer, pass_field_def, &itemType); layerinfo->itemtypes[t] = itemType; } return MS_SUCCESS; } else { msSetError( MS_QUERYERR, "Error executing MSSQL2008 SQL statement: %s\n-%s\n", "msMSSQL2008LayerGetShape()", query, layerinfo->conn->errorMessage); msFree(query); return MS_FAILURE; } } /* Execute SQL query for this layer */ int msMSSQL2008LayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)isQuery; msMSSQL2008LayerInfo *layerinfo = 0; char *query_str = 0; int set_up_result; if (layer->debug) { msDebug("msMSSQL2008LayerWhichShapes called\n"); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { /* layer not opened yet */ msSetError(MS_QUERYERR, "msMSSQL2008LayerWhichShapes called on unopened layer " "(layerinfo = NULL)", "msMSSQL2008LayerWhichShapes()"); return MS_FAILURE; } if (!layer->data) { msSetError(MS_QUERYERR, "Missing DATA clause in MSSQL2008 Layer definition. DATA " "statement must contain 'geometry_column from table_name' or " "'geometry_column from (sub-query) as foo'.", "msMSSQL2008LayerWhichShapes()"); return MS_FAILURE; } set_up_result = prepare_database(layer, rect, &query_str, isQuery); if (set_up_result != MS_SUCCESS) { msFree(query_str); return set_up_result; /* relay error */ } msFree(layerinfo->sql); layerinfo->sql = query_str; layerinfo->row_num = 0; return MS_SUCCESS; } /* Close the MSSQL2008 record set and connection */ int msMSSQL2008LayerClose(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo; layerinfo = getMSSQL2008LayerInfo(layer); if (layer->debug) { char *data = ""; if (layer->data) { data = layer->data; } msDebug("msMSSQL2008LayerClose datastatement: %s\n", data); } if (layer->debug && !layerinfo) { msDebug("msMSSQL2008LayerClose -- layerinfo is NULL\n"); } if (layerinfo) { msConnPoolRelease(layer, layerinfo->conn); layerinfo->conn = NULL; if (layerinfo->user_srid) { msFree(layerinfo->user_srid); layerinfo->user_srid = NULL; } if (layerinfo->urid_name) { msFree(layerinfo->urid_name); layerinfo->urid_name = NULL; } if (layerinfo->index_name) { msFree(layerinfo->index_name); layerinfo->index_name = NULL; } if (layerinfo->sort_spec) { msFree(layerinfo->sort_spec); layerinfo->sort_spec = NULL; } if (layerinfo->sql) { msFree(layerinfo->sql); layerinfo->sql = NULL; } if (layerinfo->geom_column) { msFree(layerinfo->geom_column); layerinfo->geom_column = NULL; } if (layerinfo->geom_column_type) { msFree(layerinfo->geom_column_type); layerinfo->geom_column_type = NULL; } if (layerinfo->geom_table) { msFree(layerinfo->geom_table); layerinfo->geom_table = NULL; } if (layerinfo->itemtypes) { msFree(layerinfo->itemtypes); layerinfo->itemtypes = NULL; } setMSSQL2008LayerInfo(layer, NULL); msFree(layerinfo); } return MS_SUCCESS; } /* ******************************************************* */ /* wkb is assumed to be 2d (force_2d) */ /* and wkb is a GEOMETRYCOLLECTION (force_collection) */ /* and wkb is in the endian of this computer (asbinary(...,'[XN]DR')) */ /* each of the sub-geom inside the collection are point,linestring, or polygon */ /* */ /* also, int is 32bits long */ /* double is 64bits long */ /* ******************************************************* */ /* convert the wkb into points */ /* points -> pass through */ /* lines-> constituent points */ /* polys-> treat ring like line and pull out the constituent points */ static int force_to_points(char *wkb, shapeObj *shape) { /* we're going to make a 'line' for each entity (point, line or ring) in the * geom collection */ int offset = 0; int ngeoms; int t, u, v; int type, nrings, npoints; lineObj line = {0, NULL}; shape->type = MS_SHAPE_NULL; /* nothing in it */ memcpy(&ngeoms, &wkb[5], 4); offset = 9; /* were the first geometry is */ for (t = 0; t < ngeoms; t++) { memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ if (type == 1) { /* Point */ shape->type = MS_SHAPE_POINT; line.numpoints = 1; line.point = (pointObj *)msSmallMalloc(sizeof(pointObj)); memcpy(&line.point[0].x, &wkb[offset + 5], 8); memcpy(&line.point[0].y, &wkb[offset + 5 + 8], 8); offset += 5 + 16; msAddLine(shape, &line); msFree(line.point); } else if (type == 2) { /* Linestring */ shape->type = MS_SHAPE_POINT; memcpy(&line.numpoints, &wkb[offset + 5], 4); /* num points */ line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * line.numpoints); for (u = 0; u < line.numpoints; u++) { memcpy(&line.point[u].x, &wkb[offset + 9 + (16 * u)], 8); memcpy(&line.point[u].y, &wkb[offset + 9 + (16 * u) + 8], 8); } offset += 9 + 16 * line.numpoints; /* length of object */ msAddLine(shape, &line); msFree(line.point); } else if (type == 3) { /* Polygon */ shape->type = MS_SHAPE_POINT; memcpy(&nrings, &wkb[offset + 5], 4); /* num rings */ /* add a line for each polygon ring */ offset += 9; /* now points at 1st linear ring */ for (u = 0; u < nrings; u++) { /* for each ring, make a line */ memcpy(&npoints, &wkb[offset], 4); /* num points */ line.numpoints = npoints; line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * npoints); /* point struct */ for (v = 0; v < npoints; v++) { memcpy(&line.point[v].x, &wkb[offset + 4 + (16 * v)], 8); memcpy(&line.point[v].y, &wkb[offset + 4 + (16 * v) + 8], 8); } /* make offset point to next linear ring */ msAddLine(shape, &line); msFree(line.point); offset += 4 + 16 * npoints; } } } return MS_SUCCESS; } /* convert the wkb into lines */ /* points-> remove */ /* lines -> pass through */ /* polys -> treat rings as lines */ static int force_to_lines(char *wkb, shapeObj *shape) { int offset = 0; int ngeoms; int t, u, v; int type, nrings, npoints; lineObj line = {0, NULL}; shape->type = MS_SHAPE_NULL; /* nothing in it */ memcpy(&ngeoms, &wkb[5], 4); offset = 9; /* were the first geometry is */ for (t = 0; t < ngeoms; t++) { memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ /* cannot do anything with a point */ if (type == 2) { /* Linestring */ shape->type = MS_SHAPE_LINE; memcpy(&line.numpoints, &wkb[offset + 5], 4); line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * line.numpoints); for (u = 0; u < line.numpoints; u++) { memcpy(&line.point[u].x, &wkb[offset + 9 + (16 * u)], 8); memcpy(&line.point[u].y, &wkb[offset + 9 + (16 * u) + 8], 8); } offset += 9 + 16 * line.numpoints; /* length of object */ msAddLine(shape, &line); msFree(line.point); } else if (type == 3) { /* polygon */ shape->type = MS_SHAPE_LINE; memcpy(&nrings, &wkb[offset + 5], 4); /* num rings */ /* add a line for each polygon ring */ offset += 9; /* now points at 1st linear ring */ for (u = 0; u < nrings; u++) { /* for each ring, make a line */ memcpy(&npoints, &wkb[offset], 4); line.numpoints = npoints; line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * npoints); /* point struct */ for (v = 0; v < npoints; v++) { memcpy(&line.point[v].x, &wkb[offset + 4 + (16 * v)], 8); memcpy(&line.point[v].y, &wkb[offset + 4 + (16 * v) + 8], 8); } /* make offset point to next linear ring */ msAddLine(shape, &line); msFree(line.point); offset += 4 + 16 * npoints; } } } return MS_SUCCESS; } /* point -> reject */ /* line -> reject */ /* polygon -> lines of linear rings */ static int force_to_polygons(char *wkb, shapeObj *shape) { int offset = 0; int ngeoms; int t, u, v; int type, nrings, npoints; lineObj line = {0, NULL}; shape->type = MS_SHAPE_NULL; /* nothing in it */ memcpy(&ngeoms, &wkb[5], 4); offset = 9; /* were the first geometry is */ for (t = 0; t < ngeoms; t++) { memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ if (type == 3) { /* polygon */ shape->type = MS_SHAPE_POLYGON; memcpy(&nrings, &wkb[offset + 5], 4); /* num rings */ /* add a line for each polygon ring */ offset += 9; /* now points at 1st linear ring */ for (u = 0; u < nrings; u++) { /* for each ring, make a line */ memcpy(&npoints, &wkb[offset], 4); /* num points */ line.numpoints = npoints; line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * npoints); for (v = 0; v < npoints; v++) { memcpy(&line.point[v].x, &wkb[offset + 4 + (16 * v)], 8); memcpy(&line.point[v].y, &wkb[offset + 4 + (16 * v) + 8], 8); } /* make offset point to next linear ring */ msAddLine(shape, &line); msFree(line.point); offset += 4 + 16 * npoints; } } } return MS_SUCCESS; } /* if there is any polygon in wkb, return force_polygon */ /* if there is any line in wkb, return force_line */ /* otherwise return force_point */ static int dont_force(char *wkb, shapeObj *shape) { int offset = 0; int ngeoms; int type, t; int best_type; best_type = MS_SHAPE_NULL; /* nothing in it */ memcpy(&ngeoms, &wkb[5], 4); offset = 9; /* were the first geometry is */ for (t = 0; t < ngeoms; t++) { memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ if (type == 3) { best_type = MS_SHAPE_POLYGON; } else if (type == 2 && best_type != MS_SHAPE_POLYGON) { best_type = MS_SHAPE_LINE; } else if (type == 1 && best_type == MS_SHAPE_NULL) { best_type = MS_SHAPE_POINT; } } if (best_type == MS_SHAPE_POINT) { return force_to_points(wkb, shape); } if (best_type == MS_SHAPE_LINE) { return force_to_lines(wkb, shape); } if (best_type == MS_SHAPE_POLYGON) { return force_to_polygons(wkb, shape); } return MS_FAILURE; /* unknown type */ } #if 0 /* ******************************************************* */ /* wkb assumed to be same endian as this machine. */ /* Should be in little endian (default if created by Microsoft platforms) */ /* ******************************************************* */ /* convert the wkb into points */ /* points -> pass through */ /* lines-> constituent points */ /* polys-> treat ring like line and pull out the constituent points */ static int force_to_shapeType(char *wkb, shapeObj *shape, int msShapeType) { int offset = 0; int ngeoms = 1; int u, v; int type, nrings, npoints; lineObj line = {0, NULL}; shape->type = MS_SHAPE_NULL; /* nothing in it */ do { ngeoms--; memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ if (type == 1) { /* Point */ shape->type = msShapeType; line.numpoints = 1; line.point = (pointObj *) msSmallMalloc(sizeof(pointObj)); memcpy(&line.point[0].x, &wkb[offset + 5], 8); memcpy(&line.point[0].y, &wkb[offset + 5 + 8], 8); offset += 5 + 16; if (msShapeType == MS_SHAPE_POINT) { msAddLine(shape, &line); } msFree(line.point); } else if(type == 2) { /* Linestring */ shape->type = msShapeType; memcpy(&line.numpoints, &wkb[offset+5], 4); /* num points */ line.point = (pointObj *) msSmallMalloc(sizeof(pointObj) * line.numpoints); for(u = 0; u < line.numpoints; u++) { memcpy( &line.point[u].x, &wkb[offset+9 + (16 * u)], 8); memcpy( &line.point[u].y, &wkb[offset+9 + (16 * u)+8], 8); } offset += 9 + 16 * line.numpoints; /* length of object */ if ((msShapeType == MS_SHAPE_POINT) || (msShapeType == MS_SHAPE_LINE)) { msAddLine(shape, &line); } msFree(line.point); } else if(type == 3) { /* Polygon */ shape->type = msShapeType; memcpy(&nrings, &wkb[offset+5],4); /* num rings */ /* add a line for each polygon ring */ offset += 9; /* now points at 1st linear ring */ for(u = 0; u < nrings; u++) { /* for each ring, make a line */ memcpy(&npoints, &wkb[offset], 4); /* num points */ line.numpoints = npoints; line.point = (pointObj *) msSmallMalloc(sizeof(pointObj)* npoints); /* point struct */ for(v = 0; v < npoints; v++) { memcpy(&line.point[v].x, &wkb[offset + 4 + (16 * v)], 8); memcpy(&line.point[v].y, &wkb[offset + 4 + (16 * v) + 8], 8); } /* make offset point to next linear ring */ msAddLine(shape, &line); msFree(line.point); offset += 4 + 16 *npoints; } } else if(type >= 4 && type <= 7) { int cnt = 0; offset += 5; memcpy(&cnt, &wkb[offset], 4); offset += 4; /* were the first geometry is */ ngeoms += cnt; } } while (ngeoms > 0); return MS_SUCCESS; } #endif ///* if there is any polygon in wkb, return force_polygon */ ///* if there is any line in wkb, return force_line */ ///* otherwise return force_point */ // static int dont_force(char *wkb, shapeObj *shape) //{ // int offset =0; // int ngeoms = 1; // int type; // int best_type; // int u; // int nrings, npoints; // // best_type = MS_SHAPE_NULL; /* nothing in it */ // // do // { // ngeoms--; // // memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ // // if(type == 3) { // best_type = MS_SHAPE_POLYGON; // } else if(type ==2 && best_type != MS_SHAPE_POLYGON) { // best_type = MS_SHAPE_LINE; // } else if(type == 1 && best_type == MS_SHAPE_NULL) { // best_type = MS_SHAPE_POINT; // } // // if (type == 1) // { // /* Point */ // offset += 5 + 16; // } // else if(type == 2) // { // int numPoints; // // memcpy(&numPoints, &wkb[offset+5], 4); /* num points */ // /* Linestring */ // offset += 9 + 16 * numPoints; /* length of object */ // } // else if(type == 3) // { // /* Polygon */ // memcpy(&nrings, &wkb[offset+5],4); /* num rings */ // offset += 9; /* now points at 1st linear ring */ // for(u = 0; u < nrings; u++) { // /* for each ring, make a line */ // memcpy(&npoints, &wkb[offset], 4); /* num points */ // offset += 4 + 16 *npoints; // } // } // else if(type >= 4 && type <= 7) // { // int cnt = 0; // // offset += 5; // // memcpy(&cnt, &wkb[offset], 4); // offset += 4; /* were the first geometry is */ // // ngeoms += cnt; // } // } // while (ngeoms > 0); // // return force_to_shapeType(wkb, shape, best_type); // } // /* find the bounds of the shape */ static void find_bounds(shapeObj *shape) { int t, u; int first_one = 1; for (t = 0; t < shape->numlines; t++) { for (u = 0; u < shape->line[t].numpoints; u++) { if (first_one) { shape->bounds.minx = shape->line[t].point[u].x; shape->bounds.maxx = shape->line[t].point[u].x; shape->bounds.miny = shape->line[t].point[u].y; shape->bounds.maxy = shape->line[t].point[u].y; first_one = 0; } else { if (shape->line[t].point[u].x < shape->bounds.minx) { shape->bounds.minx = shape->line[t].point[u].x; } if (shape->line[t].point[u].x > shape->bounds.maxx) { shape->bounds.maxx = shape->line[t].point[u].x; } if (shape->line[t].point[u].y < shape->bounds.miny) { shape->bounds.miny = shape->line[t].point[u].y; } if (shape->line[t].point[u].y > shape->bounds.maxy) { shape->bounds.maxy = shape->line[t].point[u].y; } } } } } /* Used by NextShape() to access a shape in the query set */ int msMSSQL2008LayerGetShapeRandom(layerObj *layer, shapeObj *shape, long *record) { msMSSQL2008LayerInfo *layerinfo; SQLLEN needLen = 0; SQLLEN retLen = 0; char dummyBuffer[1]; char *wkbBuffer; char *valueBuffer; char oidBuffer[16]; /* assuming the OID will always be a long this should be enough */ long record_oid; int t; /* for coercing single types into geometry collections */ char *wkbTemp; int geomType; layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { msSetError(MS_QUERYERR, "GetShape called with layerinfo = NULL", "msMSSQL2008LayerGetShape()"); return MS_FAILURE; } if (!layerinfo->conn) { msSetError(MS_QUERYERR, "NextShape called on MSSQL2008 layer with no connection to DB.", "msMSSQL2008LayerGetShape()"); return MS_FAILURE; } shape->type = MS_SHAPE_NULL; while (shape->type == MS_SHAPE_NULL) { /* SQLRETURN rc = SQLFetchScroll(layerinfo->conn->hstmt, SQL_FETCH_ABSOLUTE, * (SQLLEN) (*record) + 1); */ /* We only do forward fetches. the parameter 'record' is ignored, but is * incremented */ SQLRETURN rc = SQLFetch(layerinfo->conn->hstmt); /* Any error assume out of recordset bounds */ if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { handleSQLError(layer); return MS_DONE; } /* retrieve an item */ { /* have to retrieve shape attributes */ shape->values = (char **)msSmallMalloc(sizeof(char *) * layer->numitems); shape->numvalues = layer->numitems; for (t = 0; t < layer->numitems; t++) { /* Startwith a 64 character long buffer. This may need to be increased * after calling SQLGetData. */ SQLLEN emptyLen = 64; valueBuffer = (char *)msSmallMalloc(emptyLen); if (valueBuffer == NULL) { msSetError(MS_QUERYERR, "Could not allocate value buffer.", "msMSSQL2008LayerGetShapeRandom()"); return MS_FAILURE; } #ifdef USE_ICONV SQLSMALLINT targetType = SQL_WCHAR; #else SQLSMALLINT targetType = SQL_CHAR; #endif SQLLEN totalLen = 0; char *bufferLocation = valueBuffer; int r = 0; while (r < 20) { rc = SQLGetData(layerinfo->conn->hstmt, (SQLUSMALLINT)(t + 1), targetType, bufferLocation, emptyLen, &retLen); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) totalLen += retLen > emptyLen || retLen == SQL_NO_TOTAL ? emptyLen : retLen; if (rc == SQL_SUCCESS_WITH_INFO && rc != SQL_NO_DATA) { /* We must compensate for the last null termination that SQLGetData * include */ /* If we get SQL_NO_TOTAL we do not know how big buffer we need so * we increase it with 512. */ #ifdef USE_ICONV totalLen -= sizeof(wchar_t); emptyLen = retLen != SQL_NO_TOTAL ? retLen - emptyLen + 2 * sizeof(wchar_t) : 512; #else totalLen -= sizeof(char); emptyLen = retLen != SQL_NO_TOTAL ? retLen - emptyLen + 2 * sizeof(char) : 512; #endif valueBuffer = (char *)msSmallRealloc(valueBuffer, totalLen + emptyLen); bufferLocation = valueBuffer + totalLen; } else break; r++; } if (rc == SQL_ERROR) handleSQLError(layer); if (totalLen > 0) { /* Pop the value into the shape's value array */ #ifdef USE_ICONV shape->values[t] = msConvertWideStringToUTF8((wchar_t *)valueBuffer, "UCS-2LE"); msFree(valueBuffer); #else shape->values[t] = valueBuffer; #endif } else { /* Copy empty sting for NULL values */ shape->values[t] = msStrdup(""); msFree(valueBuffer); } } /* Get shape geometry */ { /* Set up to request the size of the buffer needed */ rc = SQLGetData(layerinfo->conn->hstmt, (SQLUSMALLINT)(layer->numitems + 1), SQL_C_BINARY, dummyBuffer, 0, &needLen); if (rc == SQL_ERROR) handleSQLError(layer); /* allow space for coercion to geometry collection if needed*/ wkbTemp = (char *)msSmallMalloc(needLen + 9); /* write data above space allocated for geometry collection coercion */ wkbBuffer = wkbTemp + 9; if (wkbBuffer == NULL) { msSetError(MS_QUERYERR, "Could not allocate value buffer.", "msMSSQL2008LayerGetShapeRandom()"); return MS_FAILURE; } /* Grab the WKB */ rc = SQLGetData(layerinfo->conn->hstmt, (SQLUSMALLINT)(layer->numitems + 1), SQL_C_BINARY, wkbBuffer, needLen, &retLen); if (rc == SQL_ERROR || rc == SQL_SUCCESS_WITH_INFO) handleSQLError(layer); if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE) { layerinfo->gpi.pszData = (unsigned char *)wkbBuffer; layerinfo->gpi.nLen = (int)retLen; if (!ParseSqlGeometry(layerinfo, shape)) { switch (layer->type) { case MS_LAYER_POINT: shape->type = MS_SHAPE_POINT; break; case MS_LAYER_LINE: shape->type = MS_SHAPE_LINE; break; case MS_LAYER_POLYGON: shape->type = MS_SHAPE_POLYGON; break; default: break; } } } else { memcpy(&geomType, wkbBuffer + 1, 4); /* is this a single type? */ if (geomType < 4) { /* copy byte order marker (although we don't check it) */ wkbTemp[0] = wkbBuffer[0]; wkbBuffer = wkbTemp; /* indicate type is geometry collection (although geomType + 3 would * also work) */ wkbBuffer[1] = (char)7; wkbBuffer[2] = (char)0; wkbBuffer[3] = (char)0; wkbBuffer[4] = (char)0; /* indicate 1 shape */ wkbBuffer[5] = (char)1; wkbBuffer[6] = (char)0; wkbBuffer[7] = (char)0; wkbBuffer[8] = (char)0; } switch (layer->type) { case MS_LAYER_POINT: /*result =*/force_to_points(wkbBuffer, shape); break; case MS_LAYER_LINE: /*result =*/force_to_lines(wkbBuffer, shape); break; case MS_LAYER_POLYGON: /*result =*/force_to_polygons(wkbBuffer, shape); break; case MS_LAYER_QUERY: case MS_LAYER_CHART: /*result =*/dont_force(wkbBuffer, shape); break; case MS_LAYER_RASTER: msDebug("Ignoring MS_LAYER_RASTER in mapMSSQL2008.c\n"); break; case MS_LAYER_CIRCLE: msDebug("Ignoring MS_LAYER_CIRCLE in mapMSSQL2008.c\n"); break; default: msDebug("Unsupported layer type in msMSSQL2008LayerNextShape()!"); break; } find_bounds(shape); } // free(wkbBuffer); msFree(wkbTemp); } /* Next get unique id for row - since the OID shouldn't be larger than a * long we'll assume billions as a limit */ rc = SQLGetData(layerinfo->conn->hstmt, (SQLUSMALLINT)(layer->numitems + 2), SQL_C_BINARY, oidBuffer, sizeof(oidBuffer) - 1, &retLen); if (rc == SQL_ERROR || rc == SQL_SUCCESS_WITH_INFO) handleSQLError(layer); if (retLen < (int)sizeof(oidBuffer)) { oidBuffer[retLen] = 0; record_oid = strtol(oidBuffer, NULL, 10); shape->index = record_oid; } else { /* non integer fid column, use single pass */ shape->index = -1; } shape->resultindex = (*record); (*record)++; /* move to next shape */ if (shape->type != MS_SHAPE_NULL) { return MS_SUCCESS; } else { msDebug("msMSSQL2008LayerGetShapeRandom bad shape: %ld\n", *record); } /* if (layer->type == MS_LAYER_POINT) {return MS_DONE;} */ } } msFreeShape(shape); return MS_FAILURE; } /* find the next shape with the appropriate shape type (convert it if necessary) */ /* also, load in the attribute data */ /* MS_DONE => no more data */ int msMSSQL2008LayerNextShape(layerObj *layer, shapeObj *shape) { int result; msMSSQL2008LayerInfo *layerinfo; layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { msSetError(MS_QUERYERR, "NextShape called with layerinfo = NULL", "msMSSQL2008LayerNextShape()"); return MS_FAILURE; } result = msMSSQL2008LayerGetShapeRandom(layer, shape, &(layerinfo->row_num)); /* getshaperandom will increment the row_num */ /* layerinfo->row_num ++; */ return result; } /* Execute a query on the DB based on the query result. */ int msMSSQL2008LayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { char *query_str; char *columns_wanted = 0; msMSSQL2008LayerInfo *layerinfo; int t; char buffer[32000] = ""; long shapeindex = record->shapeindex; long resultindex = record->resultindex; if (layer->debug) { msDebug("msMSSQL2008LayerGetShape called for shapeindex = %ld\n", shapeindex); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { /* Layer not open */ msSetError( MS_QUERYERR, "msMSSQL2008LayerGetShape called on unopened layer (layerinfo = NULL)", "msMSSQL2008LayerGetShape()"); return MS_FAILURE; } if (resultindex >= 0 && layerinfo->sql) { /* trying to provide the result from the current resultset (single-pass * query) */ if (resultindex < layerinfo->row_num) { /* re-issue the query */ if (!executeSQL(layerinfo->conn, layerinfo->sql)) { msSetError(MS_QUERYERR, "Error executing MSSQL2008 SQL statement: %s\n-%s\n", "msMSSQL2008LayerGetShape()", layerinfo->sql, layerinfo->conn->errorMessage); return MS_FAILURE; } layerinfo->row_num = 0; } while (layerinfo->row_num < resultindex) { /* move forward until we reach the desired index */ if (msMSSQL2008LayerGetShapeRandom(layer, shape, &(layerinfo->row_num)) != MS_SUCCESS) return MS_FAILURE; } return msMSSQL2008LayerGetShapeRandom(layer, shape, &(layerinfo->row_num)); } /* non single-pass case, fetch the record from the database */ if (layer->numitems == 0) { if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE) snprintf(buffer, sizeof(buffer), "%s, convert(varchar(36), %s)", layerinfo->geom_column, layerinfo->urid_name); else snprintf(buffer, sizeof(buffer), "%s.STAsBinary(), convert(varchar(36), %s)", layerinfo->geom_column, layerinfo->urid_name); columns_wanted = msStrdup(buffer); } else { for (t = 0; t < layer->numitems; t++) { snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "convert(varchar(max), %s),", layer->items[t]); } if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE) snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "%s, convert(varchar(36), %s)", layerinfo->geom_column, layerinfo->urid_name); else snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "%s.STAsBinary(), convert(varchar(36), %s)", layerinfo->geom_column, layerinfo->urid_name); columns_wanted = msStrdup(buffer); } /* index_name is ignored here since the hint should be for the spatial index, * not the PK index */ snprintf(buffer, sizeof(buffer), "select %s from %s where %s = %ld", columns_wanted, layerinfo->geom_table, layerinfo->urid_name, shapeindex); query_str = msStrdup(buffer); if (layer->debug) { msDebug("msMSSQL2008LayerGetShape: %s \n", query_str); } msFree(columns_wanted); if (!executeSQL(layerinfo->conn, query_str)) { msSetError( MS_QUERYERR, "Error executing MSSQL2008 SQL statement: %s\n-%s\n", "msMSSQL2008LayerGetShape()", query_str, layerinfo->conn->errorMessage); msFree(query_str); return MS_FAILURE; } /* we don't preserve the query string in this case (cannot be re-used) */ msFree(query_str); layerinfo->row_num = 0; return msMSSQL2008LayerGetShapeRandom(layer, shape, &(layerinfo->row_num)); } /* ** Returns the number of shapes that match the potential filter and extent. * rectProjection is the projection in which rect is expressed, or can be NULL if * rect should be considered in the layer projection. * This should be equivalent to calling msLayerWhichShapes() and counting the * number of shapes returned by msLayerNextShape(), honouring layer->maxfeatures * limitation if layer->maxfeatures>=0, and honouring layer->startindex if * layer->startindex >= 1 and paging is enabled. * Returns -1 in case of failure. */ int msMSSQL2008LayerGetShapeCount(layerObj *layer, rectObj rect, projectionObj *rectProjection) { msMSSQL2008LayerInfo *layerinfo; char *query = 0; char result_data[256]; char box3d[40 + 10 * 22 + 11]; SQLLEN retLen; SQLRETURN rc; int hasFilter = MS_FALSE; const rectObj rectInvalid = MS_INIT_INVALID_RECT; const int bIsValidRect = memcmp(&rect, &rectInvalid, sizeof(rect)) != 0; rectObj searchrectInLayerProj = rect; if (layer->debug) { msDebug("msMSSQL2008LayerGetShapeCount called.\n"); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { /* Layer not open */ msSetError(MS_QUERYERR, "msMSSQL2008LayerGetShapeCount called on unopened layer " "(layerinfo = NULL)", "msMSSQL2008LayerGetShapeCount()"); return MS_FAILURE; } // Special processing if the specified projection for the rect is different // from the layer projection We want to issue a WHERE that includes // ((the_geom && rect_reprojected_in_layer_SRID) AND NOT // ST_Disjoint(ST_Transform(the_geom, rect_SRID), rect)) if (rectProjection != NULL && layer->project && msProjectionsDiffer(&(layer->projection), rectProjection)) { // If we cannot guess the EPSG code of the rectProjection, fallback on slow // implementation if (rectProjection->numargs < 1 || strncasecmp(rectProjection->args[0], "init=epsg:", (int)strlen("init=epsg:")) != 0) { if (layer->debug) { msDebug("msMSSQL2008LayerGetShapeCount(): cannot find EPSG code of " "rectProjection. Falling back on client-side feature count.\n"); } return LayerDefaultGetShapeCount(layer, rect, rectProjection); } // Reproject the passed rect into the layer projection and get // the SRID from the rectProjection msProjectRect( rectProjection, &(layer->projection), &searchrectInLayerProj); /* project the searchrect to source coords */ } if (searchrectInLayerProj.minx == searchrectInLayerProj.maxx || searchrectInLayerProj.miny == searchrectInLayerProj.maxy) { /* create point shape for rectangles with zero area */ snprintf(box3d, sizeof(box3d), "%s::STGeomFromText('POINT(%.15g %.15g)',%s)", /* %s.STSrid)", */ layerinfo->geom_column_type, searchrectInLayerProj.minx, searchrectInLayerProj.miny, layerinfo->user_srid); } else { snprintf(box3d, sizeof(box3d), "%s::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g " "%.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */ layerinfo->geom_column_type, searchrectInLayerProj.minx, searchrectInLayerProj.miny, searchrectInLayerProj.maxx, searchrectInLayerProj.miny, searchrectInLayerProj.maxx, searchrectInLayerProj.maxy, searchrectInLayerProj.minx, searchrectInLayerProj.maxy, searchrectInLayerProj.minx, searchrectInLayerProj.miny, layerinfo->user_srid); } msLayerTranslateFilter(layer, &layer->filter, layer->filteritem); /* set up statement */ query = msStringConcatenate(query, "SELECT count(*) FROM "); query = msStringConcatenate(query, layerinfo->geom_table); /* adding attribute filter */ hasFilter = addFilter(layer, &query); if (bIsValidRect) { /* adding spatial filter */ if (hasFilter == MS_FALSE) query = msStringConcatenate(query, " WHERE "); else query = msStringConcatenate(query, " AND "); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STIntersects("); query = msStringConcatenate(query, box3d); query = msStringConcatenate(query, ") = 1 "); } if (layer->debug) { msDebug("query:%s\n", query); } if (!executeSQL(layerinfo->conn, query)) { msFree(query); return -1; } msFree(query); rc = SQLFetch(layerinfo->conn->hstmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (layer->debug) { msDebug("msMSSQL2008LayerGetShapeCount: No results found.\n"); } return -1; } rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR) { msSetError(MS_QUERYERR, "Failed to get feature count", "msMSSQL2008LayerGetShapeCount()"); return -1; } result_data[retLen] = 0; return atoi(result_data); } /* Query the DB for info about the requested table */ int msMSSQL2008LayerGetItems(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo; char *sql = NULL; size_t sqlSize; char found_geom = 0; int t, item_num; SQLSMALLINT cols = 0; const char *value; /* * Pass the field definitions through to the layer metadata in the * "gml_[item]_{type,width,precision}" set of metadata items for * defining fields. */ char pass_field_def = 0; if (layer->debug) { msDebug("in msMSSQL2008LayerGetItems (find column names)\n"); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { /* layer not opened yet */ msSetError(MS_QUERYERR, "msMSSQL2008LayerGetItems called on unopened layer", "msMSSQL2008LayerGetItems()"); return MS_FAILURE; } if (!layerinfo->conn) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetItems called on MSSQL2008 layer with no " "connection to DB.", "msMSSQL2008LayerGetItems()"); return MS_FAILURE; } sqlSize = strlen(layerinfo->geom_table) + 30; sql = msSmallMalloc(sizeof(char *) * sqlSize); snprintf(sql, sqlSize, "SELECT top 0 * FROM %s", layerinfo->geom_table); if (!executeSQL(layerinfo->conn, sql)) { msFree(sql); return MS_FAILURE; } msFree(sql); SQLNumResultCols(layerinfo->conn->hstmt, &cols); layer->numitems = cols - 1; /* don't include the geometry column */ layer->items = msSmallMalloc( sizeof(char *) * (layer->numitems + 1)); /* +1 in case there is a problem finding goeometry column */ layerinfo->itemtypes = msSmallMalloc(sizeof(SQLSMALLINT) * (layer->numitems + 1)); /* it will return an error if there is no geometry column found, */ /* so this isn't a problem */ found_geom = 0; /* haven't found the geom field */ item_num = 0; /* consider populating the field definitions in metadata */ if ((value = msOWSLookupMetadata(&(layer->metadata), "G", "types")) != NULL && strcasecmp(value, "auto") == 0) pass_field_def = 1; for (t = 0; t < cols; t++) { char colBuff[256]; SQLSMALLINT itemType = 0; columnName(layerinfo->conn, t + 1, colBuff, sizeof(colBuff), layer, pass_field_def, &itemType); if (strcmp(colBuff, layerinfo->geom_column) != 0) { /* this isn't the geometry column */ layer->items[item_num] = (char *)msSmallMalloc(strlen(colBuff) + 1); strcpy(layer->items[item_num], colBuff); layerinfo->itemtypes[item_num] = itemType; item_num++; } else { found_geom = 1; } } if (!found_geom) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetItems: tried to find the geometry column in " "the results from the database, but couldn't find it. Is it " "miss-capitialized? '%s'", "msMSSQL2008LayerGetItems()", layerinfo->geom_column); return MS_FAILURE; } return msMSSQL2008LayerInitItemInfo(layer); } /* Get primary key column of table */ int msMSSQL2008LayerRetrievePK(layerObj *layer, char **urid_name, char *table_name, int debug) { char sql[1024]; msMSSQL2008LayerInfo *layerinfo = 0; SQLRETURN rc; snprintf(sql, sizeof(sql), "SELECT convert(varchar(50), sys.columns.name) AS ColumnName, " "sys.indexes.name " "FROM sys.columns INNER JOIN " " sys.indexes INNER JOIN " " sys.tables ON sys.indexes.object_id = " "sys.tables.object_id INNER JOIN " " sys.index_columns ON sys.indexes.object_id = " "sys.index_columns.object_id AND sys.indexes.index_id = " "sys.index_columns.index_id ON " " sys.columns.object_id = " "sys.index_columns.object_id AND sys.columns.column_id = " "sys.index_columns.column_id " "WHERE (sys.indexes.is_primary_key = 1) AND (sys.tables.name = " "N'%s') ", table_name); if (debug) { msDebug("msMSSQL2008LayerRetrievePK: query = %s\n", sql); } layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; if (layerinfo->conn == NULL) { msSetError(MS_QUERYERR, "Layer does not have a MSSQL2008 connection.", "msMSSQL2008LayerRetrievePK()"); return (MS_FAILURE); } /* error somewhere above here in this method */ if (!executeSQL(layerinfo->conn, sql)) { char *tmp1; char *tmp2 = NULL; tmp1 = "Error executing MSSQL2008 statement (msMSSQL2008LayerRetrievePK():"; tmp2 = (char *)msSmallMalloc(sizeof(char) * (strlen(tmp1) + strlen(sql) + 1)); strcpy(tmp2, tmp1); strcat(tmp2, sql); msSetError(MS_QUERYERR, "%s", "msMSSQL2008LayerRetrievePK()", tmp2); msFree(tmp2); return (MS_FAILURE); } rc = SQLFetch(layerinfo->conn->hstmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (debug) { msDebug("msMSSQL2008LayerRetrievePK: No results found.\n"); } return MS_FAILURE; } { char buff[100]; SQLLEN retLen; rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_BINARY, buff, sizeof(buff), &retLen); rc = SQLFetch(layerinfo->conn->hstmt); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { if (debug) { msDebug("msMSSQL2008LayerRetrievePK: Multiple primary key columns are " "not supported in MapServer\n"); } return MS_FAILURE; } buff[retLen] = 0; *urid_name = msStrdup(buff); } return MS_SUCCESS; } /* Function to parse the Mapserver DATA parameter for geometry * column name, table name and name of a column to serve as a * unique record id */ static int msMSSQL2008LayerParseData(layerObj *layer, char **geom_column_name, char **geom_column_type, char **table_name, char **urid_name, char **user_srid, char **index_name, char **sort_spec, int debug) { char *pos_opt, *pos_scn, *tmp, *pos_srid, *pos_urid, *pos_geomtype, *pos_geomtype2, *pos_indexHint, *data, *pos_order; size_t slength; data = msStrdup(layer->data); /* replace tabs with spaces */ msReplaceChar(data, '\t', ' '); /* given a string of the from 'geom from ctivalues' or 'geom from () as foo' * return geom_column_name as 'geom' * and table name as 'ctivalues' or 'geom from () as foo' */ /* First look for the optional ' using unique ID' string */ pos_urid = strstrIgnoreCase(data, " using unique "); if (pos_urid) { /* CHANGE - protect the trailing edge for thing like 'using unique ftab_id * using srid=33' */ tmp = strstr(pos_urid + 14, " "); if (!tmp) { tmp = pos_urid + strlen(pos_urid); } *urid_name = (char *)msSmallMalloc((tmp - (pos_urid + 14)) + 1); strlcpy(*urid_name, pos_urid + 14, (tmp - (pos_urid + 14)) + 1); } /* Find the srid */ pos_srid = strstrIgnoreCase(data, " using SRID="); if (!pos_srid) { *user_srid = (char *)msSmallMalloc(2); (*user_srid)[0] = '0'; (*user_srid)[1] = 0; } else { slength = strspn(pos_srid + 12, "-0123456789"); if (!slength) { msSetError( MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "Error parsing MSSQL2008 data variable: You specified 'using SRID=#' " "but didn't have any numbers!

\n\nMore Help:

\n\n", data); msFree(data); return MS_FAILURE; } else { *user_srid = (char *)msSmallMalloc(slength + 1); strlcpy(*user_srid, pos_srid + 12, slength + 1); } } pos_indexHint = strstrIgnoreCase(data, " using index "); if (pos_indexHint) { /* CHANGE - protect the trailing edge for thing like 'using unique ftab_id * using srid=33' */ tmp = strstr(pos_indexHint + 13, " "); if (!tmp) { tmp = pos_indexHint + strlen(pos_indexHint); } *index_name = (char *)msSmallMalloc((tmp - (pos_indexHint + 13)) + 1); strlcpy(*index_name, pos_indexHint + 13, tmp - (pos_indexHint + 13) + 1); } /* this is a little hack so the rest of the code works. If the ' using SRID=' * comes before */ /* the ' using unique ', then make sure pos_opt points to where the ' using * SRID' starts! */ pos_opt = pos_urid; if (!pos_opt || (pos_srid && pos_srid < pos_opt)) pos_opt = pos_srid; if (!pos_opt || (pos_indexHint && pos_indexHint < pos_opt)) pos_opt = pos_indexHint; if (!pos_opt) pos_opt = data + strlen(data); /* Scan for the table or sub-select clause */ pos_scn = strstrIgnoreCase(data, " from "); if (!pos_scn) { msSetError(MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "Error parsing MSSQL2008 data variable. Must contain " "'geometry_column from table_name' or 'geom from (subselect) as " "foo' (couldn't find ' from '). More help:

\n\n", data); msFree(data); return MS_FAILURE; } /* Scanning the geometry column type */ pos_geomtype = data; while (pos_geomtype < pos_scn && *pos_geomtype != '(' && *pos_geomtype != 0) ++pos_geomtype; if (*pos_geomtype == '(') { pos_geomtype2 = pos_geomtype; while (pos_geomtype2 < pos_scn && *pos_geomtype2 != ')' && *pos_geomtype2 != 0) ++pos_geomtype2; if (*pos_geomtype2 != ')' || pos_geomtype2 == pos_geomtype) { msSetError(MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "Error parsing MSSQL2008 data variable. Invalid syntax near " "geometry column type.", data); msFree(data); return MS_FAILURE; } *geom_column_name = (char *)msSmallMalloc((pos_geomtype - data) + 1); strlcpy(*geom_column_name, data, pos_geomtype - data + 1); *geom_column_type = (char *)msSmallMalloc(pos_geomtype2 - pos_geomtype); strlcpy(*geom_column_type, pos_geomtype + 1, pos_geomtype2 - pos_geomtype); } else { /* Copy the geometry column name */ *geom_column_name = (char *)msSmallMalloc((pos_scn - data) + 1); strlcpy(*geom_column_name, data, pos_scn - data + 1); *geom_column_type = msStrdup("geometry"); } /* Copy out the table name or sub-select clause */ *table_name = (char *)msSmallMalloc((pos_opt - (pos_scn + 6)) + 1); strlcpy(*table_name, pos_scn + 6, pos_opt - (pos_scn + 6) + 1); if (strlen(*table_name) < 1 || strlen(*geom_column_name) < 1) { msSetError( MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "Error parsing MSSQL2008 data variable. Must contain 'geometry_column " "from table_name' or 'geom from (subselect) as foo' (couldn't find a " "geometry_column or table/subselect). More help:

\n\n", data); msFree(data); return MS_FAILURE; } if (!pos_urid) { if (msMSSQL2008LayerRetrievePK(layer, urid_name, *table_name, debug) != MS_SUCCESS) { msSetError(MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "No primary key defined for table, or primary key contains " "more that one column\n\n", *table_name); msFree(data); return MS_FAILURE; } } /* Find the order by */ pos_order = strstrIgnoreCase(pos_opt, " order by "); if (pos_order) { *sort_spec = msStrdup(pos_order); } if (debug) { msDebug("msMSSQL2008LayerParseData: unique column = %s, srid='%s', " "geom_column_name = %s, table_name=%s\n", *urid_name, *user_srid, *geom_column_name, *table_name); } msFree(data); return MS_SUCCESS; } char *msMSSQL2008LayerEscapePropertyName(layerObj *layer, const char *pszString) { (void)layer; char *pszEscapedStr = NULL; int j = 0; if (pszString && strlen(pszString) > 0) { size_t nLength = strlen(pszString); pszEscapedStr = (char *)msSmallMalloc(1 + nLength + 1 + 1); pszEscapedStr[j++] = '['; for (size_t i = 0; i < nLength; i++) pszEscapedStr[j++] = pszString[i]; pszEscapedStr[j++] = ']'; pszEscapedStr[j++] = 0; } return pszEscapedStr; } char *msMSSQL2008LayerEscapeSQLParam(layerObj *layer, const char *pszString) { (void)layer; char *pszEscapedStr = NULL; if (pszString) { int nSrcLen; char c; int i = 0, j = 0; nSrcLen = (int)strlen(pszString); pszEscapedStr = (char *)msSmallMalloc(2 * nSrcLen + 1); for (i = 0, j = 0; i < nSrcLen; i++) { c = pszString[i]; if (c == '\'') { pszEscapedStr[j++] = '\''; pszEscapedStr[j++] = '\''; } else pszEscapedStr[j++] = c; } pszEscapedStr[j] = 0; } return pszEscapedStr; } int msMSSQL2008GetPaging(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo = NULL; if (!msMSSQL2008LayerIsOpen(layer)) return MS_TRUE; assert(layer->layerinfo != NULL); layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; return layerinfo->paging; } void msMSSQL2008EnablePaging(layerObj *layer, int value) { msMSSQL2008LayerInfo *layerinfo = NULL; if (!msMSSQL2008LayerIsOpen(layer)) { if (msMSSQL2008LayerOpen(layer) != MS_SUCCESS) { return; } } assert(layer->layerinfo != NULL); layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; layerinfo->paging = value; } int process_node(layerObj *layer, expressionObj *filter) { char *snippet = NULL; char *strtmpl = NULL; char *stresc = NULL; msMSSQL2008LayerInfo *layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; if (!layerinfo->current_node) { msSetError(MS_MISCERR, "Unecpected end of expression", "msMSSQL2008LayerTranslateFilter()"); return 0; } switch (layerinfo->current_node->token) { case '(': filter->native_string = msStringConcatenate(filter->native_string, "("); /* process subexpression */ layerinfo->current_node = layerinfo->current_node->next; while (layerinfo->current_node != NULL) { if (!process_node(layer, filter)) return 0; if (!layerinfo->current_node) break; if (layerinfo->current_node->token == ')') break; layerinfo->current_node = layerinfo->current_node->next; } break; case ')': filter->native_string = msStringConcatenate(filter->native_string, ")"); break; /* argument separator */ case ',': break; /* literal tokens */ case MS_TOKEN_LITERAL_BOOLEAN: if (layerinfo->current_node->tokenval.dblval == MS_TRUE) filter->native_string = msStringConcatenate(filter->native_string, "1"); else filter->native_string = msStringConcatenate(filter->native_string, "0"); break; case MS_TOKEN_LITERAL_NUMBER: { char buffer[32]; snprintf(buffer, sizeof(buffer), "%.18g", layerinfo->current_node->tokenval.dblval); filter->native_string = msStringConcatenate(filter->native_string, buffer); break; } case MS_TOKEN_LITERAL_STRING: strtmpl = "'%s'"; stresc = msMSSQL2008LayerEscapeSQLParam( layer, layerinfo->current_node->tokenval.strval); snippet = (char *)msSmallMalloc(strlen(strtmpl) + strlen(stresc)); sprintf(snippet, strtmpl, stresc); filter->native_string = msStringConcatenate(filter->native_string, snippet); msFree(snippet); msFree(stresc); break; case MS_TOKEN_LITERAL_TIME: { int resolution = msTimeGetResolution(layerinfo->current_node->tokensrc); snippet = (char *)msSmallMalloc(128); switch (resolution) { case TIME_RESOLUTION_YEAR: sprintf(snippet, "'%d'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900)); break; case TIME_RESOLUTION_MONTH: sprintf(snippet, "'%d-%02d-01'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1)); break; case TIME_RESOLUTION_DAY: sprintf(snippet, "'%d-%02d-%02d'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1), layerinfo->current_node->tokenval.tmval.tm_mday); break; case TIME_RESOLUTION_HOUR: sprintf(snippet, "'%d-%02d-%02d %02d:00'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1), layerinfo->current_node->tokenval.tmval.tm_mday, layerinfo->current_node->tokenval.tmval.tm_hour); break; case TIME_RESOLUTION_MINUTE: sprintf(snippet, "%d-%02d-%02d %02d:%02d'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1), layerinfo->current_node->tokenval.tmval.tm_mday, layerinfo->current_node->tokenval.tmval.tm_hour, layerinfo->current_node->tokenval.tmval.tm_min); break; case TIME_RESOLUTION_SECOND: sprintf(snippet, "'%d-%02d-%02d %02d:%02d:%02d'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1), layerinfo->current_node->tokenval.tmval.tm_mday, layerinfo->current_node->tokenval.tmval.tm_hour, layerinfo->current_node->tokenval.tmval.tm_min, layerinfo->current_node->tokenval.tmval.tm_sec); break; } filter->native_string = msStringConcatenate(filter->native_string, snippet); msFree(snippet); } break; case MS_TOKEN_LITERAL_SHAPE: if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) filter->native_string = msStringConcatenate( filter->native_string, "geography::STGeomFromText('"); else filter->native_string = msStringConcatenate(filter->native_string, "geometry::STGeomFromText('"); filter->native_string = msStringConcatenate( filter->native_string, msShapeToWKT(layerinfo->current_node->tokenval.shpval)); filter->native_string = msStringConcatenate(filter->native_string, "'"); if (layerinfo->user_srid && strcmp(layerinfo->user_srid, "") != 0) { filter->native_string = msStringConcatenate(filter->native_string, ", "); filter->native_string = msStringConcatenate(filter->native_string, layerinfo->user_srid); } filter->native_string = msStringConcatenate(filter->native_string, ")"); break; case MS_TOKEN_BINDING_TIME: case MS_TOKEN_BINDING_DOUBLE: case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: if (layerinfo->current_node->next->token == MS_TOKEN_COMPARISON_IRE) strtmpl = "LOWER(%s)"; else strtmpl = "%s"; stresc = msMSSQL2008LayerEscapePropertyName( layer, layerinfo->current_node->tokenval.bindval.item); snippet = (char *)msSmallMalloc(strlen(strtmpl) + strlen(stresc)); sprintf(snippet, strtmpl, stresc); filter->native_string = msStringConcatenate(filter->native_string, snippet); msFree(snippet); msFree(stresc); break; case MS_TOKEN_BINDING_SHAPE: filter->native_string = msStringConcatenate(filter->native_string, layerinfo->geom_column); break; case MS_TOKEN_BINDING_MAP_CELLSIZE: { char buffer[32]; snprintf(buffer, sizeof(buffer), "%.18g", layer->map->cellsize); filter->native_string = msStringConcatenate(filter->native_string, buffer); break; } /* comparisons */ case MS_TOKEN_COMPARISON_IN: filter->native_string = msStringConcatenate(filter->native_string, " IN "); break; case MS_TOKEN_COMPARISON_RE: case MS_TOKEN_COMPARISON_IRE: { /* process regexp */ size_t i = 0, j = 0; char c; char c_next; int bCaseInsensitive = (layerinfo->current_node->token == MS_TOKEN_COMPARISON_IRE); int nEscapeLen = 0; if (bCaseInsensitive) filter->native_string = msStringConcatenate(filter->native_string, " LIKE LOWER("); else filter->native_string = msStringConcatenate(filter->native_string, " LIKE "); layerinfo->current_node = layerinfo->current_node->next; if (layerinfo->current_node->token != MS_TOKEN_LITERAL_STRING) return 0; strtmpl = msStrdup(layerinfo->current_node->tokenval.strval); if (strtmpl[0] == '/') { stresc = strtmpl + 1; strtmpl[strlen(strtmpl) - 1] = '\0'; } else if (strtmpl[0] == '^') stresc = strtmpl + 1; else stresc = strtmpl; while (*stresc) { c = stresc[i]; if (c == '%' || c == '_' || c == '[' || c == ']' || c == '^') { nEscapeLen++; } stresc++; } snippet = (char *)msSmallMalloc(strlen(strtmpl) + nEscapeLen + 3); snippet[j++] = '\''; while (i < strlen(strtmpl)) { c = strtmpl[i]; c_next = strtmpl[i + 1]; if (i == 0 && c == '^') { i++; continue; } if (c == '$' && c_next == 0 && strtmpl[0] == '^') break; if (c == '\\') { i++; c = c_next; } if (c == '%' || c == '_' || c == '[' || c == ']' || c == '^') { snippet[j++] = '\\'; } if (c == '.' && c_next == '*') { i++; c = '%'; } else if (c == '.') c = '_'; snippet[j++] = c; i++; } snippet[j++] = '\''; snippet[j] = '\0'; filter->native_string = msStringConcatenate(filter->native_string, snippet); msFree(strtmpl); msFree(snippet); if (bCaseInsensitive) filter->native_string = msStringConcatenate(filter->native_string, ")"); if (nEscapeLen > 0) filter->native_string = msStringConcatenate(filter->native_string, " ESCAPE '\\'"); } break; case MS_TOKEN_COMPARISON_EQ: filter->native_string = msStringConcatenate(filter->native_string, " = "); break; case MS_TOKEN_COMPARISON_NE: filter->native_string = msStringConcatenate(filter->native_string, " != "); break; case MS_TOKEN_COMPARISON_GT: filter->native_string = msStringConcatenate(filter->native_string, " > "); break; case MS_TOKEN_COMPARISON_GE: filter->native_string = msStringConcatenate(filter->native_string, " >= "); break; case MS_TOKEN_COMPARISON_LT: filter->native_string = msStringConcatenate(filter->native_string, " < "); break; case MS_TOKEN_COMPARISON_LE: filter->native_string = msStringConcatenate(filter->native_string, " <= "); break; /* logical ops */ case MS_TOKEN_LOGICAL_AND: filter->native_string = msStringConcatenate(filter->native_string, " AND "); break; case MS_TOKEN_LOGICAL_OR: filter->native_string = msStringConcatenate(filter->native_string, " OR "); break; case MS_TOKEN_LOGICAL_NOT: filter->native_string = msStringConcatenate(filter->native_string, " NOT "); break; /* spatial comparison tokens */ case MS_TOKEN_COMPARISON_INTERSECTS: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STIntersects("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_DISJOINT: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STDisjoint("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_TOUCHES: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STTouches("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_OVERLAPS: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STOverlaps("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_CROSSES: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STCrosses("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_WITHIN: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STWithin("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_CONTAINS: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STContains("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_EQUALS: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STEquals("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_BEYOND: msSetError(MS_MISCERR, "Beyond operator is unsupported.", "msMSSQL2008LayerTranslateFilter()"); return 0; case MS_TOKEN_COMPARISON_DWITHIN: msSetError(MS_MISCERR, "DWithin operator is unsupported.", "msMSSQL2008LayerTranslateFilter()"); return 0; /* spatial functions */ case MS_TOKEN_FUNCTION_AREA: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STArea()"); break; case MS_TOKEN_FUNCTION_BUFFER: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STBuffer("); if (!process_node(layer, filter)) return 0; filter->native_string = msStringConcatenate(filter->native_string, ")"); break; case MS_TOKEN_FUNCTION_DIFFERENCE: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STDifference("); if (!process_node(layer, filter)) return 0; filter->native_string = msStringConcatenate(filter->native_string, ")"); break; case MS_TOKEN_FUNCTION_FROMTEXT: if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) filter->native_string = msStringConcatenate(filter->native_string, "geography::STGeomFromText"); else filter->native_string = msStringConcatenate(filter->native_string, "geometry::STGeomFromText"); break; case MS_TOKEN_FUNCTION_LENGTH: filter->native_string = msStringConcatenate(filter->native_string, "len"); break; case MS_TOKEN_FUNCTION_ROUND: filter->native_string = msStringConcatenate(filter->native_string, "round"); break; case MS_TOKEN_FUNCTION_TOSTRING: break; case MS_TOKEN_FUNCTION_COMMIFY: break; case MS_TOKEN_FUNCTION_SIMPLIFY: filter->native_string = msStringConcatenate(filter->native_string, ".Reduce"); break; case MS_TOKEN_FUNCTION_SIMPLIFYPT: break; case MS_TOKEN_FUNCTION_GENERALIZE: filter->native_string = msStringConcatenate(filter->native_string, ".Reduce"); break; default: msSetError(MS_MISCERR, "Translation to native SQL failed.", "msMSSQL2008LayerTranslateFilter()"); if (layer->debug) { msDebug("Token not caught, exiting: Token is %i\n", layerinfo->current_node->token); } return 0; } return 1; } /* Translate filter expression to native msssql filter */ int msMSSQL2008LayerTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { char *snippet = NULL; char *strtmpl = NULL; char *stresc = NULL; msMSSQL2008LayerInfo *layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; if (!filter->string) return MS_SUCCESS; msFree(filter->native_string); filter->native_string = NULL; if (filter->type == MS_STRING && filter->string && filteritem) { /* item/value pair */ stresc = msMSSQL2008LayerEscapePropertyName(layer, filteritem); if (filter->flags & MS_EXP_INSENSITIVE) { filter->native_string = msStringConcatenate(filter->native_string, "upper("); filter->native_string = msStringConcatenate(filter->native_string, stresc); filter->native_string = msStringConcatenate(filter->native_string, ") = upper("); } else { filter->native_string = msStringConcatenate(filter->native_string, stresc); filter->native_string = msStringConcatenate(filter->native_string, " = "); } msFree(stresc); strtmpl = "'%s'"; /* don't have a type for the righthand literal so assume it's a string and we quote */ snippet = (char *)msSmallMalloc(strlen(strtmpl) + strlen(filter->string)); sprintf(snippet, strtmpl, filter->string); // TODO: escape filter->string filter->native_string = msStringConcatenate(filter->native_string, snippet); free(snippet); if (filter->flags & MS_EXP_INSENSITIVE) filter->native_string = msStringConcatenate(filter->native_string, ")"); } else if (filter->type == MS_REGEX && filter->string && filteritem) { /* item/regex pair */ /* NOTE: regex is not supported by MSSQL natively. We should install it in CLR UDF according to https://msdn.microsoft.com/en-us/magazine/cc163473.aspx*/ filter->native_string = msStringConcatenate(filter->native_string, "dbo.RegexMatch("); if (filter->flags & MS_EXP_INSENSITIVE) { filter->native_string = msStringConcatenate(filter->native_string, "'(?i)"); } filter->native_string = msStrdup(filteritem); filter->native_string = msStringConcatenate(filter->native_string, ", "); strtmpl = "'%s'"; snippet = (char *)msSmallMalloc(strlen(strtmpl) + strlen(filter->string)); sprintf(snippet, strtmpl, filter->string); // TODO: escape filter->string filter->native_string = msStringConcatenate(filter->native_string, snippet); filter->native_string = msStringConcatenate(filter->native_string, "')"); free(snippet); } else if (filter->type == MS_EXPRESSION) { if (layer->debug >= 2) msDebug("msMSSQL2008LayerTranslateFilter. String: %s.\n", filter->string); if (!filter->tokens) { if (layer->debug >= 2) msDebug("msMSSQL2008LayerTranslateFilter. There are tokens to " "process... \n"); return MS_SUCCESS; } /* start processing nodes */ layerinfo->current_node = filter->tokens; while (layerinfo->current_node != NULL) { if (!process_node(layer, filter)) { msFree(filter->native_string); filter->native_string = 0; return MS_FAILURE; } if (!layerinfo->current_node) break; layerinfo->current_node = layerinfo->current_node->next; } } return MS_SUCCESS; } #else /* prototypes if MSSQL2008 isn't supposed to be compiled */ int msMSSQL2008LayerOpen(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerOpen called but unimplemented! (mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerOpen()"); return MS_FAILURE; } int msMSSQL2008LayerIsOpen(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008IsLayerOpen called but unimplemented! (mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerIsOpen()"); return MS_FALSE; } void msMSSQL2008LayerFreeItemInfo(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerFreeItemInfo called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerFreeItemInfo()"); } int msMSSQL2008LayerInitItemInfo(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerInitItemInfo called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerInitItemInfo()"); return MS_FAILURE; } int msMSSQL2008LayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { msSetError(MS_QUERYERR, "msMSSQL2008LayerWhichShapes called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerWhichShapes()"); return MS_FAILURE; } int msMSSQL2008LayerClose(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerClose called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerClose()"); return MS_FAILURE; } int msMSSQL2008LayerNextShape(layerObj *layer, shapeObj *shape) { msSetError(MS_QUERYERR, "msMSSQL2008LayerNextShape called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerNextShape()"); return MS_FAILURE; } int msMSSQL2008LayerGetShape(layerObj *layer, shapeObj *shape, long record) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetShape called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerGetShape()"); return MS_FAILURE; } int msMSSQL2008LayerGetShapeCount(layerObj *layer, rectObj rect, projectionObj *rectProjection) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetShapeCount called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerGetShapeCount()"); return MS_FAILURE; } int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetExtent called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } int msMSSQL2008LayerGetNumFeatures(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetNumFeatures called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerGetNumFeatures()"); return -1; } int msMSSQL2008LayerGetShapeRandom(layerObj *layer, shapeObj *shape, long *record) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetShapeRandom called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerGetShapeRandom()"); return MS_FAILURE; } int msMSSQL2008LayerGetItems(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetItems called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerGetItems()"); return MS_FAILURE; } void msMSSQL2008EnablePaging(layerObj *layer, int value) { msSetError(MS_QUERYERR, "msMSSQL2008EnablePaging called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008EnablePaging()"); return; } int msMSSQL2008GetPaging(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008GetPaging called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008GetPaging()"); return MS_FAILURE; } int msMSSQL2008LayerTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { msSetError(MS_QUERYERR, "msMSSQL2008LayerTranslateFilter called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerTranslateFilter()"); return MS_FAILURE; } char *msMSSQL2008LayerEscapeSQLParam(layerObj *layer, const char *pszString) { msSetError(MS_QUERYERR, "msMSSQL2008EscapeSQLParam called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerEscapeSQLParam()"); return NULL; } char *msMSSQL2008LayerEscapePropertyName(layerObj *layer, const char *pszString) { msSetError(MS_QUERYERR, "msMSSQL2008LayerEscapePropertyName called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerEscapePropertyName()"); return NULL; } /* end above's #ifdef USE_MSSQL2008 */ #endif #ifdef USE_MSSQL2008_PLUGIN MS_DLL_EXPORT int PluginInitializeVirtualTable(layerVTableObj *vtable, layerObj *layer) { assert(layer != NULL); assert(vtable != NULL); vtable->LayerEnablePaging = msMSSQL2008EnablePaging; vtable->LayerGetPaging = msMSSQL2008GetPaging; vtable->LayerTranslateFilter = msMSSQL2008LayerTranslateFilter; vtable->LayerEscapeSQLParam = msMSSQL2008LayerEscapeSQLParam; vtable->LayerEscapePropertyName = msMSSQL2008LayerEscapePropertyName; vtable->LayerInitItemInfo = msMSSQL2008LayerInitItemInfo; vtable->LayerFreeItemInfo = msMSSQL2008LayerFreeItemInfo; vtable->LayerOpen = msMSSQL2008LayerOpen; vtable->LayerIsOpen = msMSSQL2008LayerIsOpen; vtable->LayerWhichShapes = msMSSQL2008LayerWhichShapes; vtable->LayerNextShape = msMSSQL2008LayerNextShape; vtable->LayerGetShape = msMSSQL2008LayerGetShape; vtable->LayerGetShapeCount = msMSSQL2008LayerGetShapeCount; vtable->LayerClose = msMSSQL2008LayerClose; vtable->LayerGetItems = msMSSQL2008LayerGetItems; vtable->LayerGetExtent = msMSSQL2008LayerGetExtent; vtable->LayerApplyFilterToLayer = msLayerApplyCondSQLFilterToLayer; /* vtable->LayerGetAutoStyle, not supported for this layer */ vtable->LayerCloseConnection = msMSSQL2008LayerClose; vtable->LayerSetTimeFilter = msLayerMakeBackticsTimeFilter; /* vtable->LayerCreateItems, use default */ vtable->LayerGetNumFeatures = msMSSQL2008LayerGetNumFeatures; /* layer->vtable->LayerGetAutoProjection, use default*/ return MS_SUCCESS; } #endif int msMSSQL2008LayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); layer->vtable->LayerEnablePaging = msMSSQL2008EnablePaging; layer->vtable->LayerGetPaging = msMSSQL2008GetPaging; layer->vtable->LayerTranslateFilter = msMSSQL2008LayerTranslateFilter; layer->vtable->LayerEscapeSQLParam = msMSSQL2008LayerEscapeSQLParam; layer->vtable->LayerEscapePropertyName = msMSSQL2008LayerEscapePropertyName; layer->vtable->LayerInitItemInfo = msMSSQL2008LayerInitItemInfo; layer->vtable->LayerFreeItemInfo = msMSSQL2008LayerFreeItemInfo; layer->vtable->LayerOpen = msMSSQL2008LayerOpen; layer->vtable->LayerIsOpen = msMSSQL2008LayerIsOpen; layer->vtable->LayerWhichShapes = msMSSQL2008LayerWhichShapes; layer->vtable->LayerNextShape = msMSSQL2008LayerNextShape; layer->vtable->LayerGetShape = msMSSQL2008LayerGetShape; layer->vtable->LayerGetShapeCount = msMSSQL2008LayerGetShapeCount; layer->vtable->LayerClose = msMSSQL2008LayerClose; layer->vtable->LayerGetItems = msMSSQL2008LayerGetItems; layer->vtable->LayerGetExtent = msMSSQL2008LayerGetExtent; layer->vtable->LayerApplyFilterToLayer = msLayerApplyCondSQLFilterToLayer; /* layer->vtable->LayerGetAutoStyle, not supported for this layer */ layer->vtable->LayerCloseConnection = msMSSQL2008LayerClose; layer->vtable->LayerSetTimeFilter = msLayerMakeBackticsTimeFilter; /* layer->vtable->LayerCreateItems, use default */ layer->vtable->LayerGetNumFeatures = msMSSQL2008LayerGetNumFeatures; return MS_SUCCESS; } mapserver-8.4.0/src/mapmvt.c000066400000000000000000000551521474174441300160070ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapBox Vector Tile rendering. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2015 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "maptile.h" #ifdef USE_PBF #include "vector_tile.pb-c.h" #include "mapows.h" #include "uthash.h" #include #define MOVETO 1 #define LINETO 2 #define CLOSEPATH 7 #define FEATURES_INCREMENT_SIZE 5 enum MS_RING_DIRECTION { MS_DIRECTION_INVALID_RING, MS_DIRECTION_CLOCKWISE, MS_DIRECTION_COUNTERCLOCKWISE }; typedef struct { char *value; unsigned int index; UT_hash_handle hh; } value_lookup; typedef struct { value_lookup *cache; } value_lookup_table; #define COMMAND(id, count) (((id)&0x7) | ((count) << 3)) #define PARAMETER(n) (((n) << 1) ^ ((n) >> 31)) static double getTriangleHeight(lineObj *ring) { int i; double s = 0, b = 0; if (ring->numpoints != 4) return -1; /* not a triangle */ for (i = 0; i < ring->numpoints - 1; i++) { s += (ring->point[i].x * ring->point[i + 1].y - ring->point[i + 1].x * ring->point[i].y); b = MS_MAX(b, msDistancePointToPoint(&ring->point[i], &ring->point[i + 1])); } return (MS_ABS(s / b)); } static enum MS_RING_DIRECTION mvtGetRingDirection(lineObj *ring) { int i, sum = 0; if (ring->numpoints < 4) return MS_DIRECTION_INVALID_RING; /* step through the edges */ for (i = 0; i < ring->numpoints - 1; i++) { sum += ring->point[i].x * ring->point[i + 1].y - ring->point[i + 1].x * ring->point[i].y; } return sum > 0 ? MS_DIRECTION_CLOCKWISE : sum < 0 ? MS_DIRECTION_COUNTERCLOCKWISE : MS_DIRECTION_INVALID_RING; } static void mvtReverseRingDirection(lineObj *ring) { pointObj temp; int start = 1, end = ring->numpoints - 2; /* first and last points are the same so skip 'em */ while (start < end) { temp.x = ring->point[start].x; temp.y = ring->point[start].y; ring->point[start].x = ring->point[end].x; ring->point[start].y = ring->point[end].y; ring->point[end].x = temp.x; ring->point[end].y = temp.y; start++; end--; } } static void mvtReorderRings(shapeObj *shape, int *outers) { int i, j; int t1; lineObj t2; for (i = 0; i < (shape->numlines - 1); i++) { for (j = 0; j < (shape->numlines - i - 1); j++) { if (outers[j] < outers[j + 1]) { /* swap */ t1 = outers[j]; outers[j] = outers[j + 1]; outers[j + 1] = t1; t2 = shape->line[j]; shape->line[j] = shape->line[j + 1]; shape->line[j + 1] = t2; } } } } static int mvtTransformShape(shapeObj *shape, rectObj *extent, int layer_type, int mvt_layer_extent) { double scale_x, scale_y; int i, j, outj; int *outers = NULL, ring_direction; scale_x = (double)mvt_layer_extent / (extent->maxx - extent->minx); scale_y = (double)mvt_layer_extent / (extent->maxy - extent->miny); if (layer_type == MS_LAYER_POLYGON) { outers = msGetOuterList(shape); /* compute before we muck with the shape */ if (outers[0] == 0) /* first ring must be an outer */ mvtReorderRings(shape, outers); } for (i = 0; i < shape->numlines; i++) { for (j = 0, outj = 0; j < shape->line[i].numpoints; j++) { shape->line[i].point[outj].x = (int)((shape->line[i].point[j].x - extent->minx) * scale_x); shape->line[i].point[outj].y = mvt_layer_extent - (int)((shape->line[i].point[j].y - extent->miny) * scale_y); if (!outj || shape->line[i].point[outj].x != shape->line[i].point[outj - 1].x || shape->line[i].point[outj].y != shape->line[i].point[outj - 1].y) outj++; /* add the point to the shape only if it's the first one or if it's different than the previous one */ } shape->line[i].numpoints = outj; if (layer_type == MS_LAYER_POLYGON) { if (shape->line[i].numpoints == 4 && getTriangleHeight(&shape->line[i]) < 1) { shape->line[i].numpoints = 0; /* so it's not considered anymore */ continue; /* next ring */ } ring_direction = mvtGetRingDirection(&shape->line[i]); if (ring_direction == MS_DIRECTION_INVALID_RING) shape->line[i].numpoints = 0; /* so it's not considered anymore */ else if ((outers[i] && ring_direction != MS_DIRECTION_CLOCKWISE) || (!outers[i] && ring_direction != MS_DIRECTION_COUNTERCLOCKWISE)) mvtReverseRingDirection(&shape->line[i]); } } msComputeBounds( shape); /* TODO: might need to limit this to just valid parts... */ msFree(outers); return (shape->numlines == 0) ? MS_FAILURE : MS_SUCCESS; /* success if at least one line */ } static int mvtClipShape(shapeObj *shape, int layer_type, int buffer, int mvt_layer_extent) { rectObj tile_rect; tile_rect.minx = tile_rect.miny = -buffer * 16; tile_rect.maxx = tile_rect.maxy = mvt_layer_extent + buffer * 16; if (layer_type == MS_LAYER_POLYGON) { msClipPolygonRect(shape, tile_rect); } else if (layer_type == MS_LAYER_LINE) { msClipPolylineRect(shape, tile_rect); } /* success if at least one line and not a degenerate bounding box */ if (shape->numlines > 0 && (layer_type == MS_LAYER_POINT || (shape->bounds.minx != shape->bounds.maxx || shape->bounds.miny != shape->bounds.maxy))) return MS_SUCCESS; else return MS_FAILURE; } static void freeMvtFeature(VectorTile__Tile__Feature *mvt_feature) { if (mvt_feature->tags) msFree(mvt_feature->tags); if (mvt_feature->geometry) msFree(mvt_feature->geometry); } static void freeMvtValue(VectorTile__Tile__Value *mvt_value) { if (mvt_value->string_value) msFree(mvt_value->string_value); } static void freeMvtLayer(VectorTile__Tile__Layer *mvt_layer) { if (mvt_layer->keys) { for (unsigned i = 0; i < mvt_layer->n_keys; i++) { msFree(mvt_layer->keys[i]); } msFree(mvt_layer->keys); } if (mvt_layer->values) { for (unsigned i = 0; i < mvt_layer->n_values; i++) { freeMvtValue(mvt_layer->values[i]); msFree(mvt_layer->values[i]); } msFree(mvt_layer->values); } if (mvt_layer->features) { for (unsigned i = 0; i < mvt_layer->n_features; i++) { freeMvtFeature(mvt_layer->features[i]); msFree(mvt_layer->features[i]); } msFree(mvt_layer->features); } } int mvtWriteShape(layerObj *layer, shapeObj *shape, VectorTile__Tile__Layer *mvt_layer, gmlItemListObj *item_list, value_lookup_table *value_lookup_cache, rectObj *unbuffered_bbox, int buffer) { VectorTile__Tile__Feature *mvt_feature; int i, j, iout; value_lookup *value; long int n_geometry; /* could consider an intersection test here */ if (mvtTransformShape(shape, unbuffered_bbox, layer->type, mvt_layer->extent) != MS_SUCCESS) { return MS_SUCCESS; /* degenerate shape */ } if (mvtClipShape(shape, layer->type, buffer, mvt_layer->extent) != MS_SUCCESS) { return MS_SUCCESS; /* no features left after clipping */ } n_geometry = 0; if (layer->type == MS_LAYER_POINT) { for (i = 0; i < shape->numlines; i++) n_geometry += shape->line[i].numpoints * 2; if (n_geometry) n_geometry++; /* one MOVETO */ } else if (layer->type == MS_LAYER_LINE) { for (i = 0; i < shape->numlines; i++) if (shape->line[i].numpoints >= 2) n_geometry += 2 + shape->line[i].numpoints * 2; /* one MOVETO, one LINETO */ } else { /* MS_LAYER_POLYGON */ for (i = 0; i < shape->numlines; i++) if (shape->line[i].numpoints >= 4) n_geometry += 3 + (shape->line[i].numpoints - 1) * 2; /* one MOVETO, one LINETO, one CLOSEPATH (don't consider last duplicate point) */ } if (n_geometry == 0) return MS_SUCCESS; mvt_layer->features[mvt_layer->n_features++] = msSmallMalloc(sizeof(VectorTile__Tile__Feature)); mvt_feature = mvt_layer->features[mvt_layer->n_features - 1]; vector_tile__tile__feature__init(mvt_feature); mvt_feature->n_tags = mvt_layer->n_keys * 2; mvt_feature->tags = msSmallMalloc(mvt_feature->n_tags * sizeof(uint32_t)); mvt_feature->id = shape->index; mvt_feature->has_id = 1; if (layer->type == MS_LAYER_POLYGON) mvt_feature->type = VECTOR_TILE__TILE__GEOM_TYPE__POLYGON; else if (layer->type == MS_LAYER_LINE) mvt_feature->type = VECTOR_TILE__TILE__GEOM_TYPE__LINESTRING; else mvt_feature->type = VECTOR_TILE__TILE__GEOM_TYPE__POINT; mvt_feature->has_type = 1; /* output values */ for (i = 0, iout = 0; i < item_list->numitems; i++) { gmlItemObj *item = item_list->items + i; if (!item->visible) continue; UT_HASH_FIND_STR(value_lookup_cache->cache, shape->values[i], value); if (!value) { VectorTile__Tile__Value *mvt_value; value = msSmallMalloc(sizeof(value_lookup)); value->value = msStrdup(shape->values[i]); value->index = mvt_layer->n_values; mvt_layer->values = msSmallRealloc(mvt_layer->values, (++mvt_layer->n_values) * sizeof(VectorTile__Tile__Value *)); mvt_layer->values[mvt_layer->n_values - 1] = msSmallMalloc(sizeof(VectorTile__Tile__Value)); mvt_value = mvt_layer->values[mvt_layer->n_values - 1]; vector_tile__tile__value__init(mvt_value); if (item->type && EQUAL(item->type, "Integer")) { mvt_value->int_value = atoi(value->value); mvt_value->has_int_value = 1; } else if (item->type && EQUAL(item->type, "Long")) { /* signed */ mvt_value->sint_value = atol(value->value); mvt_value->has_sint_value = 1; } else if (item->type && EQUAL(item->type, "Real")) { mvt_value->float_value = atof(value->value); mvt_value->has_float_value = 1; } else if (item->type && EQUAL(item->type, "Boolean")) { if (EQUAL(value->value, "0") || EQUAL(value->value, "false")) mvt_value->bool_value = 0; else mvt_value->bool_value = 1; mvt_value->has_bool_value = 1; } else { mvt_value->string_value = msStrdup(value->value); } UT_HASH_ADD_KEYPTR(hh, value_lookup_cache->cache, value->value, strlen(value->value), value); } mvt_feature->tags[iout * 2] = iout; mvt_feature->tags[iout * 2 + 1] = value->index; iout++; } /* output geom */ mvt_feature->n_geometry = n_geometry; mvt_feature->geometry = msSmallMalloc(mvt_feature->n_geometry * sizeof(uint32_t)); if (layer->type == MS_LAYER_POINT) { int idx = 0, lastx = 0, lasty = 0; mvt_feature->geometry[idx++] = COMMAND(MOVETO, (mvt_feature->n_geometry - 1) / 2); for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { mvt_feature->geometry[idx++] = PARAMETER(MS_NINT(shape->line[i].point[j].x) - lastx); mvt_feature->geometry[idx++] = PARAMETER(MS_NINT(shape->line[i].point[j].y) - lasty); lastx = MS_NINT(shape->line[i].point[j].x); lasty = MS_NINT(shape->line[i].point[j].y); } } } else { /* MS_LAYER_LINE or MS_LAYER_POLYGON */ int numpoints; int idx = 0, lastx = 0, lasty = 0; for (i = 0; i < shape->numlines; i++) { if ((layer->type == MS_LAYER_LINE && !(shape->line[i].numpoints >= 2)) || (layer->type == MS_LAYER_POLYGON && !(shape->line[i].numpoints >= 4))) { continue; /* skip malformed parts */ } numpoints = (layer->type == MS_LAYER_LINE) ? shape->line[i].numpoints : (shape->line[i].numpoints - 1); /* don't consider last point for polygons */ for (j = 0; j < numpoints; j++) { if (j == 0) { mvt_feature->geometry[idx++] = COMMAND(MOVETO, 1); } else if (j == 1) { mvt_feature->geometry[idx++] = COMMAND(LINETO, numpoints - 1); } mvt_feature->geometry[idx++] = PARAMETER(MS_NINT(shape->line[i].point[j].x) - lastx); mvt_feature->geometry[idx++] = PARAMETER(MS_NINT(shape->line[i].point[j].y) - lasty); lastx = MS_NINT(shape->line[i].point[j].x); lasty = MS_NINT(shape->line[i].point[j].y); } if (layer->type == MS_LAYER_POLYGON) { mvt_feature->geometry[idx++] = COMMAND(CLOSEPATH, 1); } } } return MS_SUCCESS; } static void freeMvtTile(VectorTile__Tile *mvt_tile) { for (unsigned iLayer = 0; iLayer < mvt_tile->n_layers; iLayer++) { freeMvtLayer(mvt_tile->layers[iLayer]); msFree(mvt_tile->layers[iLayer]); } msFree(mvt_tile->layers); } int msMVTWriteTile(mapObj *map, int sendheaders) { int iLayer, retcode = MS_SUCCESS; unsigned len; void *buf; const char *mvt_extent = msGetOutputFormatOption(map->outputformat, "EXTENT", "4096"); const char *mvt_buffer = msGetOutputFormatOption(map->outputformat, "EDGE_BUFFER", "10"); int buffer = MS_ABS(atoi(mvt_buffer)); VectorTile__Tile mvt_tile = VECTOR_TILE__TILE__INIT; mvt_tile.layers = msSmallCalloc(map->numlayers, sizeof(VectorTile__Tile__Layer *)); /* make sure we have a scale and cellsize computed */ map->cellsize = MS_CELLSIZE(map->extent.minx, map->extent.maxx, map->width); msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scaledenom); /* expand the map->extent so it goes from pixel center (MapServer) to pixel * edge (OWS) */ map->extent.minx -= map->cellsize * 0.5; map->extent.maxx += map->cellsize * 0.5; map->extent.miny -= map->cellsize * 0.5; map->extent.maxy += map->cellsize * 0.5; for (iLayer = 0; iLayer < map->numlayers; iLayer++) { int status = MS_SUCCESS; layerObj *layer = GET_LAYER(map, iLayer); int i; shapeObj shape; gmlItemListObj *item_list = NULL; VectorTile__Tile__Layer *mvt_layer; value_lookup_table value_lookup_cache = {NULL}; value_lookup *cur_value_lookup, *tmp_value_lookup; rectObj rect; int nclasses = 0; int *classgroup = NULL; unsigned features_size = 0; if (!msLayerIsVisible(map, layer)) continue; if (layer->type != MS_LAYER_POINT && layer->type != MS_LAYER_POLYGON && layer->type != MS_LAYER_LINE) continue; status = msLayerOpen(layer); if (status != MS_SUCCESS) { retcode = status; goto layer_cleanup; } status = msLayerWhichItems( layer, MS_TRUE, NULL); /* we want all items - behaves like a query in that sense */ if (status != MS_SUCCESS) { retcode = status; goto layer_cleanup; } /* -------------------------------------------------------------------- */ /* Will we need to reproject? */ /* -------------------------------------------------------------------- */ layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); rect = map->extent; if (layer->project) msProjectRect(&(map->projection), &(layer->projection), &rect); status = msLayerWhichShapes(layer, rect, MS_TRUE); if (status == MS_DONE) { /* no overlap - that's ok */ retcode = MS_SUCCESS; goto layer_cleanup; } else if (status != MS_SUCCESS) { retcode = status; goto layer_cleanup; } mvt_tile.layers[mvt_tile.n_layers++] = msSmallMalloc(sizeof(VectorTile__Tile__Layer)); mvt_layer = mvt_tile.layers[mvt_tile.n_layers - 1]; vector_tile__tile__layer__init(mvt_layer); mvt_layer->version = 2; mvt_layer->name = layer->name; mvt_layer->extent = MS_ABS(atoi(mvt_extent)); mvt_layer->has_extent = 1; /* -------------------------------------------------------------------- */ /* Create appropriate attributes on this layer. */ /* -------------------------------------------------------------------- */ item_list = msGMLGetItems(layer, "G"); assert(item_list->numitems == layer->numitems); mvt_layer->keys = msSmallMalloc(layer->numitems * sizeof(char *)); for (i = 0; i < layer->numitems; i++) { gmlItemObj *item = item_list->items + i; if (!item->visible) continue; if (item->alias) mvt_layer->keys[mvt_layer->n_keys++] = msStrdup(item->alias); else mvt_layer->keys[mvt_layer->n_keys++] = msStrdup(item->name); } /* -------------------------------------------------------------------- */ /* Setup joins if needed. This is likely untested. */ /* -------------------------------------------------------------------- */ if (layer->numjoins > 0) { int j; for (j = 0; j < layer->numjoins; j++) { status = msJoinConnect(layer, &(layer->joins[j])); if (status != MS_SUCCESS) { retcode = status; goto layer_cleanup; } } } /* -------------------------------------------------------------------- */ /* Setup classgroup if needed. */ /* -------------------------------------------------------------------- */ if (layer->classgroup && layer->numclasses > 0) classgroup = msAllocateValidClassGroups(layer, &nclasses); mvt_layer->features = msSmallCalloc(FEATURES_INCREMENT_SIZE, sizeof(VectorTile__Tile__Feature *)); features_size = FEATURES_INCREMENT_SIZE; msInitShape(&shape); i = 0; for (;;) { if (layer->resultcache) { status = (i < layer->resultcache->numresults) ? msLayerGetShape(layer, &shape, &(layer->resultcache->results[i])) : MS_DONE; i++; } else { status = msLayerNextShape(layer, &shape); } if (status != MS_SUCCESS) goto feature_cleanup; if (layer->numclasses > 0) { /* Should be equivalent to shape.classindex = * layer->resultcache->results[i].classindex; */ shape.classindex = msShapeGetClass(layer, map, &shape, classgroup, nclasses); /* Perform classification, and some annotation related magic. */ if (shape.classindex < 0) goto feature_cleanup; /* no matching CLASS found, skip this feature */ } /* ** prepare any necessary JOINs here (one-to-one only) */ if (layer->numjoins > 0) { int j; for (j = 0; j < layer->numjoins; j++) { if (layer->joins[j].type == MS_JOIN_ONE_TO_ONE) { msJoinPrepare(&(layer->joins[j]), &shape); msJoinNext(&(layer->joins[j])); /* fetch the first row */ } } } if (mvt_layer->n_features == features_size) { /* need to allocate more space */ features_size += FEATURES_INCREMENT_SIZE; mvt_layer->features = msSmallRealloc( mvt_layer->features, sizeof(VectorTile__Tile__Feature *) * (features_size)); } if (layer->project) { if (layer->reprojectorLayerToMap == NULL) { layer->reprojectorLayerToMap = msProjectCreateReprojector(&layer->projection, &map->projection); } if (layer->reprojectorLayerToMap) status = msProjectShapeEx(layer->reprojectorLayerToMap, &shape); else status = MS_FAILURE; } if (status == MS_SUCCESS) { status = mvtWriteShape(layer, &shape, mvt_layer, item_list, &value_lookup_cache, &map->extent, buffer); } feature_cleanup: msFreeShape(&shape); if (status != MS_SUCCESS) goto layer_cleanup; } /* next shape */ layer_cleanup: if (classgroup) msFree(classgroup); msLayerClose(layer); msGMLFreeItems(item_list); UT_HASH_ITER(hh, value_lookup_cache.cache, cur_value_lookup, tmp_value_lookup) { msFree(cur_value_lookup->value); UT_HASH_DEL(value_lookup_cache.cache, cur_value_lookup); msFree(cur_value_lookup); } if (retcode != MS_SUCCESS) goto cleanup; } /* next layer */ len = vector_tile__tile__get_packed_size( &mvt_tile); // This is the calculated packing length buf = msSmallMalloc(len); // Allocate memory vector_tile__tile__pack(&mvt_tile, buf); if (sendheaders) { msIO_fprintf(stdout, "Content-Length: %d\r\n" "Content-Type: %s\r\n\r\n", len, MS_IMAGE_MIME_TYPE(map->outputformat)); } msIO_fwrite(buf, len, 1, stdout); msFree(buf); cleanup: freeMvtTile(&mvt_tile); return retcode; } int msPopulateRendererVTableMVT(rendererVTableObj *renderer) { (void)renderer; return MS_SUCCESS; } #else int msPopulateRendererVTableMVT(rendererVTableObj *renderer) { (void)renderer; msSetError(MS_MISCERR, "Vector Tile Driver requested but support is not compiled in", "msPopulateRendererVTableMVT()"); return MS_FAILURE; } int msMVTWriteTile(mapObj *map, int sendheaders) { (void)map; (void)sendheaders; msSetError(MS_MISCERR, "Vector Tile support is not available.", "msMVTWriteTile()"); return MS_FAILURE; } #endif mapserver-8.4.0/src/mapobject.c000066400000000000000000000637731474174441300164570ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions for operating on a mapObj that don't belong in a * more specific file such as mapfile.c, or mapdraw.c. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2004, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "mapows.h" #include "gdal.h" #include "cpl_conv.h" void freeWeb(webObj *web); void freeScalebar(scalebarObj *scalebar); void freeReferenceMap(referenceMapObj *ref); void freeLegend(legendObj *legend); /************************************************************************/ /* msNewMapObj() */ /* */ /* Create a new initialized map object. */ /************************************************************************/ mapObj *msNewMapObj() { mapObj *map = NULL; /* create an empty map, no layers etc... */ map = (mapObj *)calloc(1, sizeof(mapObj)); if (!map) { msSetError(MS_MEMERR, NULL, "msCreateMap()"); return NULL; } if (initMap(map) == -1) { msFreeMap(map); return NULL; } if (msPostMapParseOutputFormatSetup(map) == MS_FAILURE) { msFreeMap(map); return NULL; } return map; } /************************************************************************/ /* msFreeMap() */ /************************************************************************/ void msFreeMap(mapObj *map) { int i; if (!map) return; /* printf("msFreeMap(): maybe freeing map at %p count=%d.\n",map, * map->refcount); */ if (MS_REFCNT_DECR_IS_NOT_ZERO(map)) { return; } if (map->debug >= MS_DEBUGLEVEL_VV) msDebug("msFreeMap(): freeing map at %p.\n", map); msCloseConnections(map); msFree(map->name); msFree(map->shapepath); msFree(map->mappath); msFreeProjection(&(map->projection)); msFreeProjection(&(map->latlon)); msProjectionContextReleaseToPool(map->projContext); msFreeLabelCache(&(map->labelcache)); msFree(map->imagetype); msFreeFontSet(&(map->fontset)); msFreeSymbolSet(&map->symbolset); /* free symbols */ msFree(map->symbolset.filename); freeWeb(&(map->web)); freeScalebar(&(map->scalebar)); freeReferenceMap(&(map->reference)); freeLegend(&(map->legend)); for (i = 0; i < map->maxlayers; i++) { if (GET_LAYER(map, i) != NULL) { GET_LAYER(map, i)->map = NULL; if (freeLayer((GET_LAYER(map, i))) == MS_SUCCESS) free(GET_LAYER(map, i)); } } msFree(map->layers); if (map->layerorder) free(map->layerorder); msFree(map->templatepattern); msFree(map->datapattern); msFreeHashItems(&(map->configoptions)); if (map->outputformat && map->outputformat->refcount > 0 && --map->outputformat->refcount < 1) msFreeOutputFormat(map->outputformat); for (i = 0; i < map->numoutputformats; i++) { if (map->outputformatlist[i]->refcount > 0 && --map->outputformatlist[i]->refcount < 1) msFreeOutputFormat(map->outputformatlist[i]); } if (map->outputformatlist != NULL) msFree(map->outputformatlist); msFreeQuery(&(map->query)); #ifdef USE_V8_MAPSCRIPT if (map->v8context) msV8FreeContext(map); #endif msFree(map); } /************************************************************************/ /* msGetConfigOption() */ /************************************************************************/ const char *msGetConfigOption(mapObj *map, const char *key) { return msLookupHashTable(&(map->configoptions), key); } /************************************************************************/ /* msSetConfigOption() */ /************************************************************************/ int msSetConfigOption(mapObj *map, const char *key, const char *value) { /* We have special "early" handling of this so that it will be */ /* in effect when the projection blocks are parsed and pj_init is called. */ if (strcasecmp(key, "PROJ_DATA") == 0 || strcasecmp(key, "PROJ_LIB") == 0) { /* value may be relative to map path */ msSetPROJ_DATA(value, map->mappath); } /* Same for MS_ERRORFILE, we want it to kick in as early as possible * to catch parsing errors. * Value can be relative to mapfile, unless it's already absolute */ if (strcasecmp(key, "MS_ERRORFILE") == 0) { if (msSetErrorFile(value, map->mappath) != MS_SUCCESS) return MS_FAILURE; } if (msLookupHashTable(&(map->configoptions), key) != NULL) msRemoveHashTable(&(map->configoptions), key); msInsertHashTable(&(map->configoptions), key, value); return MS_SUCCESS; } /************************************************************************/ /* msTestConfigOption() */ /************************************************************************/ int msTestConfigOption(mapObj *map, const char *key, int default_result) { const char *result = msGetConfigOption(map, key); if (result == NULL) return default_result; if (strcasecmp(result, "YES") == 0 || strcasecmp(result, "ON") == 0 || strcasecmp(result, "TRUE") == 0) return MS_TRUE; else return MS_FALSE; } /************************************************************************/ /* msApplyMapConfigOptions() */ /************************************************************************/ void msApplyMapConfigOptions(mapObj *map) { const char *key; for (key = msFirstKeyFromHashTable(&(map->configoptions)); key != NULL; key = msNextKeyFromHashTable(&(map->configoptions), key)) { const char *value = msLookupHashTable(&(map->configoptions), key); if (strcasecmp(key, "PROJ_DATA") == 0 || strcasecmp(key, "PROJ_LIB") == 0) { msSetPROJ_DATA(value, map->mappath); } else if (strcasecmp(key, "MS_ERRORFILE") == 0) { msSetErrorFile(value, map->mappath); } else { CPLSetConfigOption(key, value); } } } /************************************************************************/ /* msMapIgnoreMissingData() */ /************************************************************************/ int msMapIgnoreMissingData(mapObj *map) { const char *result = msGetConfigOption(map, "ON_MISSING_DATA"); const int default_result = #ifndef IGNORE_MISSING_DATA MS_MISSING_DATA_FAIL; #else MS_MISSING_DATA_LOG; #endif if (result == NULL) return default_result; if (strcasecmp(result, "FAIL") == 0) return MS_MISSING_DATA_FAIL; else if (strcasecmp(result, "LOG") == 0) return MS_MISSING_DATA_LOG; else if (strcasecmp(result, "IGNORE") == 0) return MS_MISSING_DATA_IGNORE; return default_result; } /************************************************************************/ /* msMapSetExtent() */ /************************************************************************/ int msMapSetExtent(mapObj *map, double minx, double miny, double maxx, double maxy) { map->extent.minx = minx; map->extent.miny = miny; map->extent.maxx = maxx; map->extent.maxy = maxy; if (!MS_VALID_EXTENT(map->extent)) { msSetError(MS_MISCERR, "Given map extent is invalid. Check that it " "is in the form: minx, miny, maxx, maxy", "setExtent()"); return MS_FAILURE; } map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); /* if the map size is also set, recompute scale, ignore errors? */ if (map->width != -1 || map->height != -1) msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &(map->scaledenom)); return msMapComputeGeotransform(map); } /************************************************************************/ /* msMapOffsetExtent() */ /************************************************************************/ int msMapOffsetExtent(mapObj *map, double x, double y) { return msMapSetExtent(map, map->extent.minx + x, map->extent.miny + y, map->extent.maxx + x, map->extent.maxy + y); } /************************************************************************/ /* msMapScaleExtent() */ /************************************************************************/ int msMapScaleExtent(mapObj *map, double zoomfactor, double minscaledenom, double maxscaledenom) { double geo_width, geo_height, center_x, center_y, md; if (zoomfactor <= 0.0) { msSetError(MS_MISCERR, "The given zoomfactor is invalid", "msMapScaleExtent()"); } geo_width = map->extent.maxx - map->extent.minx; geo_height = map->extent.maxy - map->extent.miny; center_x = map->extent.minx + geo_width * 0.5; center_y = map->extent.miny + geo_height * 0.5; geo_width *= zoomfactor; if (minscaledenom > 0 || maxscaledenom > 0) { /* ensure we are within the valid scale domain */ md = (map->width - 1) / (map->resolution * msInchesPerUnit(map->units, center_y)); if (minscaledenom > 0 && geo_width < minscaledenom * md) geo_width = minscaledenom * md; if (maxscaledenom > 0 && geo_width > maxscaledenom * md) geo_width = maxscaledenom * md; } geo_width *= 0.5; geo_height = geo_width * map->height / map->width; return msMapSetExtent(map, center_x - geo_width, center_y - geo_height, center_x + geo_width, center_y + geo_height); } /************************************************************************/ /* msMapSetCenter() */ /************************************************************************/ int msMapSetCenter(mapObj *map, pointObj *center) { return msMapOffsetExtent( map, center->x - (map->extent.minx + map->extent.maxx) * 0.5, center->y - (map->extent.miny + map->extent.maxy) * 0.5); } /************************************************************************/ /* msMapSetRotation() */ /************************************************************************/ int msMapSetRotation(mapObj *map, double rotation_angle) { map->gt.rotation_angle = rotation_angle; if (map->gt.rotation_angle != 0.0) map->gt.need_geotransform = MS_TRUE; else map->gt.need_geotransform = MS_FALSE; return msMapComputeGeotransform(map); } /************************************************************************/ /* msMapSetSize() */ /************************************************************************/ int msMapSetSize(mapObj *map, int width, int height) { map->width = width; map->height = height; return msMapComputeGeotransform(map); /* like SetRotation -- sean */ } /************************************************************************/ /* msMapComputeGeotransform() */ /************************************************************************/ extern int InvGeoTransform(double *gt_in, double *gt_out); int msMapComputeGeotransformEx(mapObj *map, double resolutionX, double resolutionY) { double rot_angle; double geo_width, geo_height, center_x, center_y; map->saved_extent = map->extent; rot_angle = map->gt.rotation_angle * MS_PI / 180.0; geo_width = map->extent.maxx - map->extent.minx; geo_height = map->extent.maxy - map->extent.miny; center_x = map->extent.minx + geo_width * 0.5; center_y = map->extent.miny + geo_height * 0.5; /* ** Per bug 1916 we have to adjust for the fact that map extents ** are based on the center of the edge pixels, not the outer ** edges as is expected in a geotransform. */ map->gt.geotransform[1] = cos(rot_angle) * resolutionX; map->gt.geotransform[2] = sin(rot_angle) * resolutionY; map->gt.geotransform[0] = center_x - (map->width * 0.5) * map->gt.geotransform[1] - (map->height * 0.5) * map->gt.geotransform[2]; map->gt.geotransform[4] = sin(rot_angle) * resolutionX; map->gt.geotransform[5] = -cos(rot_angle) * resolutionY; map->gt.geotransform[3] = center_y - (map->width * 0.5) * map->gt.geotransform[4] - (map->height * 0.5) * map->gt.geotransform[5]; if (InvGeoTransform(map->gt.geotransform, map->gt.invgeotransform)) return MS_SUCCESS; else return MS_FAILURE; } int msMapComputeGeotransform(mapObj *map) { /* Do we have all required parameters? */ if (map->extent.minx == map->extent.maxx || map->width <= 1 || map->height <= 1) return MS_FAILURE; const double geo_width = map->extent.maxx - map->extent.minx; const double geo_height = map->extent.maxy - map->extent.miny; return msMapComputeGeotransformEx(map, geo_width / (map->width - 1), geo_height / (map->height - 1)); } /************************************************************************/ /* msMapPixelToGeoref() */ /************************************************************************/ void msMapPixelToGeoref(mapObj *map, double *x, double *y) { (void)map; (void)x; (void)y; msSetError(MS_MISCERR, NULL, "msMapPixelToGeoref() not yet implemented"); } /************************************************************************/ /* msMapGeorefToPixel() */ /************************************************************************/ void msMapGeorefToPixel(mapObj *map, double *x, double *y) { (void)map; (void)x; (void)y; msSetError(MS_MISCERR, NULL, "msMapGeorefToPixel() not yet implemented"); } /************************************************************************/ /* msMapSetFakedExtent() */ /************************************************************************/ int msMapSetFakedExtent(mapObj *map) { int i; /* -------------------------------------------------------------------- */ /* Remember the original map extents so we can restore them */ /* later. */ /* -------------------------------------------------------------------- */ map->saved_extent = map->extent; /* -------------------------------------------------------------------- */ /* Set extents such that the bottom left corner is 0,0 and the */ /* top right is width,height. Note this is upside down from */ /* the normal sense of pixel/line coordinates, but we do this */ /* so that the normal "extent" concept of coordinates */ /* increasing to the right, and up is maintained (like in */ /* georeferenced coordinate systems). */ /* -------------------------------------------------------------------- */ map->extent.minx = 0; map->extent.maxx = map->width; map->extent.miny = 0; map->extent.maxy = map->height; map->cellsize = 1.0; /* -------------------------------------------------------------------- */ /* When we copy the geotransform into the projection object we */ /* have to flip it to account for the preceding upside-down */ /* coordinate system. */ /* -------------------------------------------------------------------- */ map->projection.gt = map->gt; map->projection.gt.geotransform[0] += map->height * map->gt.geotransform[2]; map->projection.gt.geotransform[3] += map->height * map->gt.geotransform[5]; map->projection.gt.geotransform[2] *= -1; map->projection.gt.geotransform[5] *= -1; for (i = 0; i < map->numlayers; i++) GET_LAYER(map, i)->project = MS_TRUE; return InvGeoTransform(map->projection.gt.geotransform, map->projection.gt.invgeotransform); } /************************************************************************/ /* msMapRestoreRealExtent() */ /************************************************************************/ int msMapRestoreRealExtent(mapObj *map) { map->projection.gt.need_geotransform = MS_FALSE; map->extent = map->saved_extent; map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); return MS_SUCCESS; } /************************************************************************/ /* msInsertLayer() */ /************************************************************************/ /* Returns the index at which the layer was inserted */ int msInsertLayer(mapObj *map, layerObj *layer, int nIndex) { if (!layer) { msSetError(MS_CHILDERR, "Can't insert a NULL Layer", "msInsertLayer()"); return -1; } /* Ensure there is room for a new layer */ if (map->numlayers == map->maxlayers) { if (msGrowMapLayers(map) == NULL) return -1; } /* msGrowMapLayers allocates the new layer which we don't need to do since we have 1 that we are inserting not sure if it is possible for this to be non null otherwise, but better to check since this function replaces the value */ if (map->layers[map->numlayers] != NULL) free(map->layers[map->numlayers]); /* Catch attempt to insert past end of layers array */ if (nIndex >= map->numlayers) { msSetError(MS_CHILDERR, "Cannot insert layer beyond index %d", "msInsertLayer()", map->numlayers - 1); return -1; } else if (nIndex < 0) { /* Insert at the end by default */ map->layerorder[map->numlayers] = map->numlayers; GET_LAYER(map, map->numlayers) = layer; GET_LAYER(map, map->numlayers)->index = map->numlayers; GET_LAYER(map, map->numlayers)->map = map; MS_REFCNT_INCR(layer); map->numlayers++; return map->numlayers - 1; } else { /* Move existing layers at the specified nIndex or greater */ /* to an index one higher */ int i; for (i = map->numlayers; i > nIndex; i--) { GET_LAYER(map, i) = GET_LAYER(map, i - 1); GET_LAYER(map, i)->index = i; } /* assign new layer to specified index */ GET_LAYER(map, nIndex) = layer; GET_LAYER(map, nIndex)->index = nIndex; GET_LAYER(map, nIndex)->map = map; /* adjust layers drawing order */ for (i = map->numlayers; i > nIndex; i--) { map->layerorder[i] = map->layerorder[i - 1]; if (map->layerorder[i] >= nIndex) map->layerorder[i]++; } for (i = 0; i < nIndex; i++) { if (map->layerorder[i] >= nIndex) map->layerorder[i]++; } map->layerorder[nIndex] = nIndex; /* increment number of layers and return */ MS_REFCNT_INCR(layer); map->numlayers++; return nIndex; } } /************************************************************************/ /* msRemoveLayer() */ /************************************************************************/ layerObj *msRemoveLayer(mapObj *map, int nIndex) { int i; int order_index; layerObj *layer; if (nIndex < 0 || nIndex >= map->numlayers) { msSetError(MS_CHILDERR, "Cannot remove Layer, invalid index %d", "msRemoveLayer()", nIndex); return NULL; } else { layer = GET_LAYER(map, nIndex); /* msCopyLayer(layer, (GET_LAYER(map, nIndex))); */ /* Iteratively copy the higher index layers down one index */ for (i = nIndex; i < map->numlayers - 1; i++) { /* freeLayer((GET_LAYER(map, i))); */ /* initLayer((GET_LAYER(map, i)), map); */ /* msCopyLayer(GET_LAYER(map, i), GET_LAYER(map, i+1)); */ GET_LAYER(map, i) = GET_LAYER(map, i + 1); GET_LAYER(map, i)->index = i; } /* Free the extra layer at the end */ /* freeLayer((GET_LAYER(map, map->numlayers-1))); */ GET_LAYER(map, map->numlayers - 1) = NULL; /* Adjust drawing order */ order_index = 0; for (i = 0; i < map->numlayers; i++) { if (map->layerorder[i] > nIndex) map->layerorder[i]--; if (map->layerorder[i] == nIndex) { order_index = i; break; } } for (i = order_index; i < map->numlayers - 1; i++) { map->layerorder[i] = map->layerorder[i + 1]; if (map->layerorder[i] > nIndex) map->layerorder[i]--; } /* decrement number of layers and return copy of removed layer */ map->numlayers--; layer->map = NULL; MS_REFCNT_DECR(layer); return layer; } } /* ** Move the layer's order for drawing purpose. Moving it up here ** will have the effect of drawing the layer earlier. */ int msMoveLayerUp(mapObj *map, int nLayerIndex) { int iCurrentIndex = -1; if (map && nLayerIndex < map->numlayers && nLayerIndex >= 0) { for (int i = 0; i < map->numlayers; i++) { if (map->layerorder[i] == nLayerIndex) { iCurrentIndex = i; break; } } if (iCurrentIndex >= 0) { /* we do not need to promote if it is the first one. */ if (iCurrentIndex == 0) return MS_FAILURE; map->layerorder[iCurrentIndex] = map->layerorder[iCurrentIndex - 1]; map->layerorder[iCurrentIndex - 1] = nLayerIndex; return MS_SUCCESS; } } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveLayerUp()", nLayerIndex); return MS_FAILURE; } /* ** Move the layer's order for drawing purpose. Moving it down here ** will have the effect of drawing the layer later. */ int msMoveLayerDown(mapObj *map, int nLayerIndex) { int iCurrentIndex = -1; if (map && nLayerIndex < map->numlayers && nLayerIndex >= 0) { for (int i = 0; i < map->numlayers; i++) { if (map->layerorder[i] == nLayerIndex) { iCurrentIndex = i; break; } } if (iCurrentIndex >= 0) { /* we do not need to demote if it is the last one. */ if (iCurrentIndex == map->numlayers - 1) return MS_FAILURE; map->layerorder[iCurrentIndex] = map->layerorder[iCurrentIndex + 1]; map->layerorder[iCurrentIndex + 1] = nLayerIndex; return MS_SUCCESS; } } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveLayerDown()", nLayerIndex); return MS_FAILURE; } /* ** Set the array used for the drawing order. The array passed must contain ** all the layer's index ordered by the drawing priority. ** Ex : for 3 layers in the map file, if ** panIndexes[0] = 2 ** panIndexes[1] = 0 ** panIndexes[2] = 1 ** will set the darwing order to layer 2, layer 0, ** and then layer 1. ** ** Note : It is assumed that the index panIndexes has the same number of ** of elements as the number of layers in the map. ** Return TRUE on success else FALSE. */ int msSetLayersdrawingOrder(mapObj *self, int *panIndexes) { if (self && panIndexes) { const int nElements = self->numlayers; for (int i = 0; i < nElements; i++) { int bFound = 0; for (int j = 0; j < nElements; j++) { if (panIndexes[j] == i) { bFound = 1; break; } } if (!bFound) return 0; } /* -------------------------------------------------------------------- */ /* At this point the array is valid so update the layers order array.*/ /* -------------------------------------------------------------------- */ for (int i = 0; i < nElements; i++) { self->layerorder[i] = panIndexes[i]; } return 1; } return 0; } /* ========================================================================= msMapLoadOWSParameters Function to support mapscript mapObj::loadOWSParameters ========================================================================= */ int msMapLoadOWSParameters(mapObj *map, cgiRequestObj *request, const char *wmtver) { #ifdef USE_WMS_SVR int version; char *wms_exception_format = NULL; const char *wms_request = NULL; int result, i = 0; owsRequestObj ows_request; msOWSInitRequestObj(&ows_request); version = msOWSParseVersionString(wmtver); for (i = 0; i < request->NumParams; i++) { if (strcasecmp(request->ParamNames[i], "EXCEPTIONS") == 0) wms_exception_format = request->ParamValues[i]; else if (strcasecmp(request->ParamNames[i], "REQUEST") == 0) wms_request = request->ParamValues[i]; } msOWSRequestLayersEnabled(map, "M", wms_request, &ows_request); result = msWMSLoadGetMapParams( map, version, request->ParamNames, request->ParamValues, request->NumParams, wms_exception_format, wms_request, &ows_request); msOWSClearRequestObj(&ows_request); return result; #else msSetError(MS_WMSERR, "WMS server support is not available.", "msMapLoadOWSParameters()"); return MS_FAILURE; #endif } mapserver-8.4.0/src/mapogcapi.cpp000066400000000000000000002062041474174441300167770ustar00rootroot00000000000000/********************************************************************** * $id$ * * Project: MapServer * Purpose: OGCAPI Implementation * Author: Steve Lime and the MapServer team. * ********************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver.h" #include "mapogcapi.h" #include "mapows.h" #include "mapgml.h" #include "maptime.h" #include "mapogcfilter.h" #include "cpl_conv.h" #include "third-party/include_nlohmann_json.hpp" #include "third-party/include_pantor_inja.hpp" #include #include #include #include #include using namespace inja; using json = nlohmann::json; #define OGCAPI_DEFAULT_TITLE "MapServer OGC API" /* ** HTML Templates */ #define OGCAPI_TEMPLATE_HTML_LANDING "landing.html" #define OGCAPI_TEMPLATE_HTML_CONFORMANCE "conformance.html" #define OGCAPI_TEMPLATE_HTML_COLLECTION "collection.html" #define OGCAPI_TEMPLATE_HTML_COLLECTIONS "collections.html" #define OGCAPI_TEMPLATE_HTML_COLLECTION_ITEMS "collection-items.html" #define OGCAPI_TEMPLATE_HTML_COLLECTION_ITEM "collection-item.html" #define OGCAPI_TEMPLATE_HTML_OPENAPI "openapi.html" enum class OGCAPIFormat { JSON, GeoJSON, OpenAPI_V3, HTML }; #define OGCAPI_MIMETYPE_JSON "application/json" #define OGCAPI_MIMETYPE_GEOJSON "application/geo+json" #define OGCAPI_MIMETYPE_OPENAPI_V3 \ "application/vnd.oai.openapi+json;version=3.0" #define OGCAPI_MIMETYPE_HTML "text/html" #define OGCAPI_DEFAULT_LIMIT 10 // by specification #define OGCAPI_MAX_LIMIT 10000 #define OGCAPI_DEFAULT_GEOMETRY_PRECISION 6 constexpr const char *EPSG_PREFIX_URL = "http://www.opengis.net/def/crs/EPSG/0/"; constexpr const char *CRS84_URL = "http://www.opengis.net/def/crs/OGC/1.3/CRS84"; #ifdef USE_OGCAPI_SVR // Error types typedef enum { OGCAPI_SERVER_ERROR = 0, OGCAPI_CONFIG_ERROR = 1, OGCAPI_PARAM_ERROR = 2, OGCAPI_NOT_FOUND_ERROR = 3, } OGCAPIErrorType; /* ** Returns a JSON object using and a description. */ static void outputError(OGCAPIErrorType errorType, const std::string &description) { const char *code = ""; const char *status = ""; switch (errorType) { case OGCAPI_SERVER_ERROR: { code = "ServerError"; status = "500"; break; } case OGCAPI_CONFIG_ERROR: { code = "ConfigError"; status = "500"; break; } case OGCAPI_PARAM_ERROR: { code = "InvalidParameterValue"; status = "400"; break; } case OGCAPI_NOT_FOUND_ERROR: { code = "NotFound"; status = "404"; break; } } json j = {{"code", code}, {"description", description}}; msIO_setHeader("Content-Type", "%s", OGCAPI_MIMETYPE_JSON); msIO_setHeader("Status", "%s", status); msIO_sendHeaders(); msIO_printf("%s\n", j.dump().c_str()); } static int includeLayer(mapObj *map, layerObj *layer) { if (!msOWSRequestIsEnabled(map, layer, "AO", "OGCAPI", MS_FALSE) || !msIsLayerSupportedForWFSOrOAPIF(layer) || !msIsLayerQueryable(layer)) { return MS_FALSE; } else { return MS_TRUE; } } /* ** Get stuff... */ /* ** Returns the value associated with an item from the request's query string and *NULL if the item was not found. */ static const char *getRequestParameter(cgiRequestObj *request, const char *item) { int i; for (i = 0; i < request->NumParams; i++) { if (strcmp(item, request->ParamNames[i]) == 0) return request->ParamValues[i]; } return NULL; } static int getMaxLimit(mapObj *map, layerObj *layer) { int max_limit = OGCAPI_MAX_LIMIT; const char *value; // check metadata, layer then map value = msOWSLookupMetadata(&(layer->metadata), "A", "max_limit"); if (value == NULL) value = msOWSLookupMetadata(&(map->web.metadata), "A", "max_limit"); if (value != NULL) { int status = msStringToInt(value, &max_limit, 10); if (status != MS_SUCCESS) max_limit = OGCAPI_MAX_LIMIT; // conversion failed } return max_limit; } static int getDefaultLimit(mapObj *map, layerObj *layer) { int default_limit = OGCAPI_DEFAULT_LIMIT; // check metadata, layer then map const char *value = msOWSLookupMetadata(&(layer->metadata), "A", "default_limit"); if (value == NULL) value = msOWSLookupMetadata(&(map->web.metadata), "A", "default_limit"); if (value != NULL) { int status = msStringToInt(value, &default_limit, 10); if (status != MS_SUCCESS) default_limit = OGCAPI_DEFAULT_LIMIT; // conversion failed } return default_limit; } /* ** Returns the limit as an int - between 1 and getMaxLimit(). We always return a *valid value... */ static int getLimit(mapObj *map, cgiRequestObj *request, layerObj *layer, int *limit) { int status; const char *p; int max_limit; max_limit = getMaxLimit(map, layer); p = getRequestParameter(request, "limit"); if (!p || (p && strlen(p) == 0)) { // missing or empty *limit = MS_MIN(getDefaultLimit(map, layer), max_limit); // max could be smaller than the default } else { status = msStringToInt(p, limit, 10); if (status != MS_SUCCESS) return MS_FAILURE; if (*limit <= 0) { *limit = MS_MIN(getDefaultLimit(map, layer), max_limit); // max could be smaller than the default } else { *limit = MS_MIN(*limit, max_limit); } } return MS_SUCCESS; } // Return the content of the "crs" member of the /collections/{name} response static json getCrsList(mapObj *map, layerObj *layer) { char *pszSRSList = NULL; msOWSGetEPSGProj(&(layer->projection), &(layer->metadata), "AOF", MS_FALSE, &pszSRSList); if (!pszSRSList) msOWSGetEPSGProj(&(map->projection), &(map->web.metadata), "AOF", MS_FALSE, &pszSRSList); json jCrsList; if (pszSRSList) { const auto tokens = msStringSplit(pszSRSList, ' '); for (const auto &crs : tokens) { if (crs.find("EPSG:") == 0) { if (jCrsList.empty()) { jCrsList.push_back(CRS84_URL); } const std::string url = std::string(EPSG_PREFIX_URL) + crs.substr(strlen("EPSG:")); jCrsList.push_back(url); } } msFree(pszSRSList); } return jCrsList; } // Return the content of the "storageCrs" member of the /collections/{name} // response static std::string getStorageCrs(layerObj *layer) { std::string storageCrs; char *pszFirstSRS = nullptr; msOWSGetEPSGProj(&(layer->projection), &(layer->metadata), "AOF", MS_TRUE, &pszFirstSRS); if (pszFirstSRS) { if (std::string(pszFirstSRS).find("EPSG:") == 0) { storageCrs = std::string(EPSG_PREFIX_URL) + (pszFirstSRS + strlen("EPSG:")); } msFree(pszFirstSRS); } return storageCrs; } /* ** Returns the bbox in output CRS (CRS84 by default, or "crs" request parameter *when specified) */ static bool getBbox(mapObj *map, layerObj *layer, cgiRequestObj *request, rectObj *bbox, projectionObj *outputProj) { int status; const char *bboxParam = getRequestParameter(request, "bbox"); if (!bboxParam || strlen(bboxParam) == 0) { // missing or empty extent rectObj rect; if (FLTLayerSetInvalidRectIfSupported(layer, &rect, "AO")) { bbox->minx = rect.minx; bbox->miny = rect.miny; bbox->maxx = rect.maxx; bbox->maxy = rect.maxy; } else { // assign map->extent (no projection necessary) bbox->minx = map->extent.minx; bbox->miny = map->extent.miny; bbox->maxx = map->extent.maxx; bbox->maxy = map->extent.maxy; } } else { const auto tokens = msStringSplit(bboxParam, ','); if (tokens.size() != 4) { outputError(OGCAPI_PARAM_ERROR, "Bad value for bbox."); return false; } double values[4]; for (int i = 0; i < 4; i++) { status = msStringToDouble(tokens[i].c_str(), &values[i]); if (status != MS_SUCCESS) { outputError(OGCAPI_PARAM_ERROR, "Bad value for bbox."); return false; } } bbox->minx = values[0]; // assign bbox->miny = values[1]; bbox->maxx = values[2]; bbox->maxy = values[3]; // validate bbox is well-formed (degenerate is ok) if (MS_VALID_SEARCH_EXTENT(*bbox) != MS_TRUE) { outputError(OGCAPI_PARAM_ERROR, "Bad value for bbox."); return false; } std::string bboxCrs = "EPSG:4326"; bool axisInverted = false; // because above EPSG:4326 is meant to be OGC:CRS84 actually const char *bboxCrsParam = getRequestParameter(request, "bbox-crs"); if (bboxCrsParam) { bool isExpectedCrs = false; for (const auto &crsItem : getCrsList(map, layer)) { if (bboxCrsParam == crsItem.get()) { isExpectedCrs = true; break; } } if (!isExpectedCrs) { outputError(OGCAPI_PARAM_ERROR, "Bad value for bbox-crs."); return false; } if (std::string(bboxCrsParam) != CRS84_URL) { if (std::string(bboxCrsParam).find(EPSG_PREFIX_URL) == 0) { const char *code = bboxCrsParam + strlen(EPSG_PREFIX_URL); bboxCrs = std::string("EPSG:") + code; axisInverted = msIsAxisInverted(atoi(code)); } } } if (axisInverted) { std::swap(bbox->minx, bbox->miny); std::swap(bbox->maxx, bbox->maxy); } projectionObj bboxProj; msInitProjection(&bboxProj); msProjectionInheritContextFrom(&bboxProj, &(map->projection)); if (msLoadProjectionString(&bboxProj, bboxCrs.c_str()) != 0) { msFreeProjection(&bboxProj); outputError(OGCAPI_SERVER_ERROR, "Cannot process bbox-crs."); return false; } status = msProjectRect(&bboxProj, outputProj, bbox); msFreeProjection(&bboxProj); if (status != MS_SUCCESS) { outputError(OGCAPI_SERVER_ERROR, "Cannot reproject bbox from bbox-crs to output CRS."); return false; } } return true; } /* ** Returns the template directory location or NULL if it isn't set. */ static std::string getTemplateDirectory(mapObj *map, const char *key, const char *envvar) { const char *directory; directory = msOWSLookupMetadata(&(map->web.metadata), "A", key); if (directory == NULL) { directory = CPLGetConfigOption(envvar, NULL); } std::string s; if (directory != NULL) { s = directory; if (!s.empty() && (s.back() != '/' && s.back() != '\\')) { // add a trailing slash if missing std::string slash = "/"; #ifdef _WIN32 slash = "\\"; #endif s += slash; } } return s; } /* ** Returns the service title from oga_{key} and/or ows_{key} or a default value *if not set. */ static const char *getWebMetadata(mapObj *map, const char *domain, const char *key, const char *defaultVal) { const char *value; if ((value = msOWSLookupMetadata(&(map->web.metadata), domain, key)) != NULL) return value; else return defaultVal; } /* ** Returns the service title from oga|ows_title or a default value if not set. */ static const char *getTitle(mapObj *map) { return getWebMetadata(map, "OA", "title", OGCAPI_DEFAULT_TITLE); } /* ** Returns the API root URL from oga_onlineresource or builds a value if not *set. */ static std::string getApiRootUrl(mapObj *map) { const char *root; if ((root = msOWSLookupMetadata(&(map->web.metadata), "A", "onlineresource")) != NULL) return std::string(root); else return "http://" + std::string(getenv("SERVER_NAME")) + ":" + std::string(getenv("SERVER_PORT")) + std::string(getenv("SCRIPT_NAME")) + std::string(getenv("PATH_INFO")); } static json getFeatureConstant(const gmlConstantObj *constant) { json j; // empty (null) if (!constant) throw std::runtime_error("Null constant metadata."); if (!constant->value) return j; // initialize j = {{constant->name, constant->value}}; return j; } static json getFeatureItem(const gmlItemObj *item, const char *value) { json j; // empty (null) const char *key; if (!item) throw std::runtime_error("Null item metadata."); if (!item->visible) return j; if (item->alias) key = item->alias; else key = item->name; // initialize j = {{key, value}}; if (item->type && (EQUAL(item->type, "Date") || EQUAL(item->type, "DateTime") || EQUAL(item->type, "Time"))) { struct tm tm; if (msParseTime(value, &tm) == MS_TRUE) { char tmpValue[64]; if (EQUAL(item->type, "Date")) snprintf(tmpValue, sizeof(tmpValue), "%04d-%02d-%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); else if (EQUAL(item->type, "Time")) snprintf(tmpValue, sizeof(tmpValue), "%02d:%02d:%02dZ", tm.tm_hour, tm.tm_min, tm.tm_sec); else snprintf(tmpValue, sizeof(tmpValue), "%04d-%02d-%02dT%02d:%02d:%02dZ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); j = {{key, tmpValue}}; } } else if (item->type && (EQUAL(item->type, "Integer") || EQUAL(item->type, "Long"))) { try { j = {{key, std::stoll(value)}}; } catch (const std::exception &) { } } else if (item->type && EQUAL(item->type, "Real")) { try { j = {{key, std::stod(value)}}; } catch (const std::exception &) { } } else if (item->type && EQUAL(item->type, "Boolean")) { if (EQUAL(value, "0") || EQUAL(value, "false")) { j = {{key, false}}; } else { j = {{key, true}}; } } return j; } static double round_down(double value, int decimal_places) { const double multiplier = std::pow(10.0, decimal_places); return std::floor(value * multiplier) / multiplier; } // https://stackoverflow.com/questions/25925290/c-round-a-double-up-to-2-decimal-places static double round_up(double value, int decimal_places) { const double multiplier = std::pow(10.0, decimal_places); return std::ceil(value * multiplier) / multiplier; } static json getFeatureGeometry(shapeObj *shape, int precision, bool outputCrsAxisInverted) { json geometry; // empty (null) int *outerList = NULL, numOuterRings = 0; if (!shape) throw std::runtime_error("Null shape."); switch (shape->type) { case (MS_SHAPE_POINT): if (shape->numlines == 0 || shape->line[0].numpoints == 0) // not enough info for a point return geometry; if (shape->line[0].numpoints == 1) { geometry["type"] = "Point"; double x = shape->line[0].point[0].x; double y = shape->line[0].point[0].y; if (outputCrsAxisInverted) std::swap(x, y); geometry["coordinates"] = {round_up(x, precision), round_up(y, precision)}; } else { geometry["type"] = "MultiPoint"; geometry["coordinates"] = json::array(); for (int j = 0; j < shape->line[0].numpoints; j++) { double x = shape->line[0].point[j].x; double y = shape->line[0].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); geometry["coordinates"].push_back( {round_up(x, precision), round_up(y, precision)}); } } break; case (MS_SHAPE_LINE): if (shape->numlines == 0 || shape->line[0].numpoints < 2) // not enough info for a line return geometry; if (shape->numlines == 1) { geometry["type"] = "LineString"; geometry["coordinates"] = json::array(); for (int j = 0; j < shape->line[0].numpoints; j++) { double x = shape->line[0].point[j].x; double y = shape->line[0].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); geometry["coordinates"].push_back( {round_up(x, precision), round_up(y, precision)}); } } else { geometry["type"] = "MultiLineString"; geometry["coordinates"] = json::array(); for (int i = 0; i < shape->numlines; i++) { json part = json::array(); for (int j = 0; j < shape->line[i].numpoints; j++) { double x = shape->line[i].point[j].x; double y = shape->line[i].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); part.push_back({round_up(x, precision), round_up(y, precision)}); } geometry["coordinates"].push_back(part); } } break; case (MS_SHAPE_POLYGON): if (shape->numlines == 0 || shape->line[0].numpoints < 4) // not enough info for a polygon (first=last) return geometry; outerList = msGetOuterList(shape); if (outerList == NULL) throw std::runtime_error("Unable to allocate list of outer rings."); for (int k = 0; k < shape->numlines; k++) { if (outerList[k] == MS_TRUE) numOuterRings++; } if (numOuterRings == 1) { geometry["type"] = "Polygon"; geometry["coordinates"] = json::array(); for (int i = 0; i < shape->numlines; i++) { json part = json::array(); for (int j = 0; j < shape->line[i].numpoints; j++) { double x = shape->line[i].point[j].x; double y = shape->line[i].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); part.push_back({round_up(x, precision), round_up(y, precision)}); } geometry["coordinates"].push_back(part); } } else { geometry["type"] = "MultiPolygon"; geometry["coordinates"] = json::array(); for (int k = 0; k < shape->numlines; k++) { if (outerList[k] == MS_TRUE) { // outer ring: generate polygon and add to coordinates int *innerList = msGetInnerList(shape, k, outerList); if (innerList == NULL) { msFree(outerList); throw std::runtime_error("Unable to allocate list of inner rings."); } json polygon = json::array(); for (int i = 0; i < shape->numlines; i++) { if (i == k || outerList[i] == MS_TRUE) { // add outer ring (k) and any inner rings json part = json::array(); for (int j = 0; j < shape->line[i].numpoints; j++) { double x = shape->line[i].point[j].x; double y = shape->line[i].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); part.push_back( {round_up(x, precision), round_up(y, precision)}); } polygon.push_back(part); } } msFree(innerList); geometry["coordinates"].push_back(polygon); } } } msFree(outerList); break; default: throw std::runtime_error("Invalid shape type."); break; } return geometry; } /* ** Return a GeoJSON representation of a shape. */ static json getFeature(layerObj *layer, shapeObj *shape, gmlItemListObj *items, gmlConstantListObj *constants, int geometry_precision, bool outputCrsAxisInverted) { int i; json feature; // empty (null) if (!layer || !shape) throw std::runtime_error("Null arguments."); // initialize feature = {{"type", "Feature"}, {"properties", json::object()}}; // id const char *featureIdItem = msOWSLookupMetadata(&(layer->metadata), "AGFO", "featureid"); if (featureIdItem == NULL) throw std::runtime_error( "Missing required featureid metadata."); // should have been trapped // earlier for (i = 0; i < items->numitems; i++) { if (strcasecmp(featureIdItem, items->items[i].name) == 0) { feature["id"] = shape->values[i]; break; } } if (i == items->numitems) throw std::runtime_error("Feature id not found."); // properties - build from items and constants, no group support for now for (int i = 0; i < items->numitems; i++) { try { json item = getFeatureItem(&(items->items[i]), shape->values[i]); if (!item.is_null()) feature["properties"].insert(item.begin(), item.end()); } catch (const std::runtime_error &) { throw std::runtime_error("Error fetching item."); } } for (int i = 0; i < constants->numconstants; i++) { try { json constant = getFeatureConstant(&(constants->constants[i])); if (!constant.is_null()) feature["properties"].insert(constant.begin(), constant.end()); } catch (const std::runtime_error &) { throw std::runtime_error("Error fetching constant."); } } // geometry try { json geometry = getFeatureGeometry(shape, geometry_precision, outputCrsAxisInverted); if (!geometry.is_null()) feature["geometry"] = std::move(geometry); } catch (const std::runtime_error &) { throw std::runtime_error("Error fetching geometry."); } return feature; } static json getLink(hashTableObj *metadata, const std::string &name) { json link; const char *href = msOWSLookupMetadata(metadata, "A", (name + "_href").c_str()); if (!href) throw std::runtime_error("Missing required link href property."); const char *title = msOWSLookupMetadata(metadata, "A", (name + "_title").c_str()); const char *type = msOWSLookupMetadata(metadata, "A", (name + "_type").c_str()); link = {{"href", href}, {"title", title ? title : href}, {"type", type ? type : "text/html"}}; return link; } static const char *getCollectionDescription(layerObj *layer) { const char *description = msOWSLookupMetadata(&(layer->metadata), "A", "description"); if (!description) description = msOWSLookupMetadata(&(layer->metadata), "OF", "abstract"); // fallback on abstract if (!description) description = ""; // finally // a // warning... return description; } static const char *getCollectionTitle(layerObj *layer) { const char *title = msOWSLookupMetadata(&(layer->metadata), "AOF", "title"); if (!title) title = layer->name; // revert to layer name if no title found return title; } static int getGeometryPrecision(mapObj *map, layerObj *layer) { int geometry_precision = OGCAPI_DEFAULT_GEOMETRY_PRECISION; if (msOWSLookupMetadata(&(layer->metadata), "AF", "geometry_precision")) { geometry_precision = atoi( msOWSLookupMetadata(&(layer->metadata), "AF", "geometry_precision")); } else if (msOWSLookupMetadata(&map->web.metadata, "AF", "geometry_precision")) { geometry_precision = atoi( msOWSLookupMetadata(&map->web.metadata, "AF", "geometry_precision")); } return geometry_precision; } static json getCollection(mapObj *map, layerObj *layer, OGCAPIFormat format) { json collection; // empty (null) rectObj bbox; if (!map || !layer) return collection; if (!includeLayer(map, layer)) return collection; // initialize some things std::string api_root = getApiRootUrl(map); if (msOWSGetLayerExtent(map, layer, "AOF", &bbox) == MS_SUCCESS) { if (layer->projection.numargs > 0) msOWSProjectToWGS84(&layer->projection, &bbox); else if (map->projection.numargs > 0) msOWSProjectToWGS84(&map->projection, &bbox); else throw std::runtime_error( "Unable to transform bounding box, no projection defined."); } else { throw std::runtime_error( "Unable to get collection bounding box."); // might be too harsh since // extent is optional } const char *description = getCollectionDescription(layer); const char *title = getCollectionTitle(layer); const char *id = layer->name; char *id_encoded = msEncodeUrl(id); // free after use const int geometry_precision = getGeometryPrecision(map, layer); // build collection object collection = {{"id", id}, {"description", description}, {"title", title}, {"extent", {{"spatial", {{"bbox", {{round_down(bbox.minx, geometry_precision), round_down(bbox.miny, geometry_precision), round_up(bbox.maxx, geometry_precision), round_up(bbox.maxy, geometry_precision)}}}, {"crs", CRS84_URL}}}}}, {"links", {{{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "This collection as JSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "?f=json"}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This collection as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "?f=html"}}, {{"rel", "items"}, {"type", OGCAPI_MIMETYPE_GEOJSON}, {"title", "Items for this collection as GeoJSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=json"}}, {{"rel", "items"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "Items for this collection as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=html"}} }}, {"itemType", "feature"}}; msFree(id_encoded); // done // handle optional configuration (keywords and links) const char *value = msOWSLookupMetadata(&(layer->metadata), "A", "keywords"); if (!value) value = msOWSLookupMetadata(&(layer->metadata), "OF", "keywordlist"); // fallback on keywordlist if (value) { std::vector keywords = msStringSplit(value, ','); for (const std::string &keyword : keywords) { collection["keywords"].push_back(keyword); } } value = msOWSLookupMetadata(&(layer->metadata), "A", "links"); if (value) { std::vector names = msStringSplit(value, ','); for (const std::string &name : names) { try { json link = getLink(&(layer->metadata), name); collection["links"].push_back(link); } catch (const std::runtime_error &e) { throw e; } } } // Part 2 - CRS support // Inspect metadata to set the "crs": [] member and "storageCrs" member json jCrsList = getCrsList(map, layer); if (!jCrsList.empty()) { collection["crs"] = std::move(jCrsList); std::string storageCrs = getStorageCrs(layer); if (!storageCrs.empty()) { collection["storageCrs"] = std::move(storageCrs); } } return collection; } /* ** Output stuff... */ static void outputJson(const json &j, const char *mimetype, const std::map &extraHeaders) { std::string js; try { js = j.dump(); } catch (...) { outputError(OGCAPI_CONFIG_ERROR, "Invalid UTF-8 data, check encoding."); return; } msIO_setHeader("Content-Type", "%s", mimetype); for (const auto &kvp : extraHeaders) { msIO_setHeader(kvp.first.c_str(), "%s", kvp.second.c_str()); } msIO_sendHeaders(); msIO_printf("%s\n", js.c_str()); } static void outputTemplate(const char *directory, const char *filename, const json &j, const char *mimetype) { std::string _directory(directory); std::string _filename(filename); Environment env{_directory}; // catch // ERB-style instead of Mustache (we'll see) // env.set_expression("<%=", "%>"); // env.set_statement("<%", "%>"); // callbacks, need: // - match (regex) // - contains (substring) // - URL encode try { std::string js = j.dump(); } catch (...) { outputError(OGCAPI_CONFIG_ERROR, "Invalid UTF-8 data, check encoding."); return; } try { Template t = env.parse_template(_filename); // catch std::string result = env.render(t, j); msIO_setHeader("Content-Type", "%s", mimetype); msIO_sendHeaders(); msIO_printf("%s\n", result.c_str()); } catch (const inja::RenderError &e) { outputError(OGCAPI_CONFIG_ERROR, "Template rendering error. " + std::string(e.what()) + " (" + std::string(filename) + ")."); return; } catch (const inja::InjaError &e) { outputError(OGCAPI_CONFIG_ERROR, "InjaError error. " + std::string(e.what()) + " (" + std::string(filename) + ")." + " (" + std::string(directory) + ")."); return; } catch (...) { outputError(OGCAPI_SERVER_ERROR, "General template handling error."); return; } } /* ** Generic response output. */ static void outputResponse(mapObj *map, cgiRequestObj *request, OGCAPIFormat format, const char *filename, const json &response, const std::map &extraHeaders = std::map()) { std::string path; char fullpath[MS_MAXPATHLEN]; if (format == OGCAPIFormat::JSON) { outputJson(response, OGCAPI_MIMETYPE_JSON, extraHeaders); } else if (format == OGCAPIFormat::GeoJSON) { outputJson(response, OGCAPI_MIMETYPE_GEOJSON, extraHeaders); } else if (format == OGCAPIFormat::OpenAPI_V3) { outputJson(response, OGCAPI_MIMETYPE_OPENAPI_V3, extraHeaders); } else if (format == OGCAPIFormat::HTML) { path = getTemplateDirectory(map, "html_template_directory", "OGCAPI_HTML_TEMPLATE_DIRECTORY"); if (path.empty()) { outputError(OGCAPI_CONFIG_ERROR, "Template directory not set."); return; // bail } msBuildPath(fullpath, map->mappath, path.c_str()); json j; j["response"] = response; // nest the response so we could write the whole // object in the template // extend the JSON with a few things that we need for templating j["template"] = {{"path", json::array()}, {"params", json::object()}, {"api_root", getApiRootUrl(map)}, {"title", getTitle(map)}, {"tags", json::object()}}; // api path for (int i = 0; i < request->api_path_length; i++) j["template"]["path"].push_back(request->api_path[i]); // parameters (optional) for (int i = 0; i < request->NumParams; i++) { if (request->ParamValues[i] && strlen(request->ParamValues[i]) > 0) { // skip empty params j["template"]["params"].update( {{request->ParamNames[i], request->ParamValues[i]}}); } } // add custom tags (optional) const char *tags = msOWSLookupMetadata(&(map->web.metadata), "A", "html_tags"); if (tags) { std::vector names = msStringSplit(tags, ','); for (std::string name : names) { const char *value = msOWSLookupMetadata(&(map->web.metadata), "A", ("tag_" + name).c_str()); if (value) { j["template"]["tags"].update({{name, value}}); // add object } } } outputTemplate(fullpath, filename, j, OGCAPI_MIMETYPE_HTML); } else { outputError(OGCAPI_PARAM_ERROR, "Unsupported format requested."); } } /* ** Process stuff... */ static int processLandingRequest(mapObj *map, cgiRequestObj *request, OGCAPIFormat format) { json response; // define ambiguous elements const char *description = msOWSLookupMetadata(&(map->web.metadata), "A", "description"); if (!description) description = msOWSLookupMetadata(&(map->web.metadata), "OF", "abstract"); // fallback on abstract if necessary // define api root url std::string api_root = getApiRootUrl(map); // build response object // - consider conditionally excluding links for HTML format response = { {"title", getTitle(map)}, {"description", description ? description : ""}, {"links", {{{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "This document as JSON"}, {"href", api_root + "?f=json"}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This document as HTML"}, {"href", api_root + "?f=html"}}, {{"rel", "conformance"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "OCG API conformance classes implemented by this server (JSON)"}, {"href", api_root + "/conformance?f=json"}}, {{"rel", "conformance"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "OCG API conformance classes implemented by this server"}, {"href", api_root + "/conformance?f=html"}}, {{"rel", "data"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "Information about feature collections available from this " "server (JSON)"}, {"href", api_root + "/collections?f=json"}}, {{"rel", "data"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "Information about feature collections available from this server"}, {"href", api_root + "/collections?f=html"}}, {{"rel", "service-desc"}, {"type", OGCAPI_MIMETYPE_OPENAPI_V3}, {"title", "OpenAPI document"}, {"href", api_root + "/api?f=json"}}, {{"rel", "service-doc"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "API documentation"}, {"href", api_root + "/api?f=html"}}}}}; // handle custom links (optional) const char *links = msOWSLookupMetadata(&(map->web.metadata), "A", "links"); if (links) { std::vector names = msStringSplit(links, ','); for (std::string name : names) { try { json link = getLink(&(map->web.metadata), name); response["links"].push_back(link); } catch (const std::runtime_error &e) { outputError(OGCAPI_CONFIG_ERROR, std::string(e.what())); return MS_SUCCESS; } } } outputResponse(map, request, format, OGCAPI_TEMPLATE_HTML_LANDING, response); return MS_SUCCESS; } static int processConformanceRequest(mapObj *map, cgiRequestObj *request, OGCAPIFormat format) { json response; // build response object response = { {"conformsTo", { "http://www.opengis.net/spec/ogcapi-common-1/1.0/conf/core", "http://www.opengis.net/spec/ogcapi-common-2/1.0/conf/collections", "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/core", "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/oas30", "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/html", "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/geojson", "http://www.opengis.net/spec/ogcapi-features-2/1.0/conf/crs", }}}; outputResponse(map, request, format, OGCAPI_TEMPLATE_HTML_CONFORMANCE, response); return MS_SUCCESS; } static int processCollectionItemsRequest(mapObj *map, cgiRequestObj *request, const char *collectionId, const char *featureId, OGCAPIFormat format) { json response; int i; layerObj *layer; int limit; rectObj bbox; int numberMatched = 0; // find the right layer for (i = 0; i < map->numlayers; i++) { if (strcmp(map->layers[i]->name, collectionId) == 0) break; // match } if (i == map->numlayers) { // invalid collectionId outputError(OGCAPI_NOT_FOUND_ERROR, "Invalid collection."); return MS_SUCCESS; } layer = map->layers[i]; // for convenience layer->status = MS_ON; // force on (do we need to save and reset?) if (!includeLayer(map, layer)) { outputError(OGCAPI_NOT_FOUND_ERROR, "Invalid collection."); return MS_SUCCESS; } // // handle parameters specific to this endpoint // if (getLimit(map, request, layer, &limit) != MS_SUCCESS) { outputError(OGCAPI_PARAM_ERROR, "Bad value for limit."); return MS_SUCCESS; } const char *crs = getRequestParameter(request, "crs"); std::string outputCrs = "EPSG:4326"; bool outputCrsAxisInverted = false; // because above EPSG:4326 is meant to be OGC:CRS84 actually std::map extraHeaders; if (crs) { bool isExpectedCrs = false; for (const auto &crsItem : getCrsList(map, layer)) { if (crs == crsItem.get()) { isExpectedCrs = true; break; } } if (!isExpectedCrs) { outputError(OGCAPI_PARAM_ERROR, "Bad value for crs."); return MS_SUCCESS; } extraHeaders["Content-Crs"] = '<' + std::string(crs) + '>'; if (std::string(crs) != CRS84_URL) { if (std::string(crs).find(EPSG_PREFIX_URL) == 0) { const char *code = crs + strlen(EPSG_PREFIX_URL); outputCrs = std::string("EPSG:") + code; outputCrsAxisInverted = msIsAxisInverted(atoi(code)); } } } else { extraHeaders["Content-Crs"] = '<' + std::string(CRS84_URL) + '>'; } struct ReprojectionObjects { reprojectionObj *reprojector = NULL; projectionObj proj; ReprojectionObjects() { msInitProjection(&proj); } ~ReprojectionObjects() { msProjectDestroyReprojector(reprojector); msFreeProjection(&proj); } int executeQuery(mapObj *map) { projectionObj backupMapProjection = map->projection; map->projection = proj; int ret = msExecuteQuery(map); map->projection = backupMapProjection; return ret; } }; ReprojectionObjects reprObjs; msProjectionInheritContextFrom(&reprObjs.proj, &(map->projection)); if (msLoadProjectionString(&reprObjs.proj, outputCrs.c_str()) != 0) { outputError(OGCAPI_SERVER_ERROR, "Cannot instantiate output CRS."); return MS_SUCCESS; } if (layer->projection.numargs > 0) { if (msProjectionsDiffer(&(layer->projection), &reprObjs.proj)) { reprObjs.reprojector = msProjectCreateReprojector(&(layer->projection), &reprObjs.proj); if (reprObjs.reprojector == NULL) { outputError(OGCAPI_SERVER_ERROR, "Error creating re-projector."); return MS_SUCCESS; } } } else if (map->projection.numargs > 0) { if (msProjectionsDiffer(&(map->projection), &reprObjs.proj)) { reprObjs.reprojector = msProjectCreateReprojector(&(map->projection), &reprObjs.proj); if (reprObjs.reprojector == NULL) { outputError(OGCAPI_SERVER_ERROR, "Error creating re-projector."); return MS_SUCCESS; } } } else { outputError(OGCAPI_CONFIG_ERROR, "Unable to transform geometries, no projection defined."); return MS_SUCCESS; } if (map->projection.numargs > 0) { msProjectRect(&(map->projection), &reprObjs.proj, &map->extent); } if (!getBbox(map, layer, request, &bbox, &reprObjs.proj)) { return MS_SUCCESS; } int offset = 0; if (featureId) { const char *featureIdItem = msOWSLookupMetadata(&(layer->metadata), "AGFO", "featureid"); if (featureIdItem == NULL) { outputError(OGCAPI_CONFIG_ERROR, "Missing required featureid metadata."); return MS_SUCCESS; } // TODO: does featureIdItem exist in the data? // optional validation const char *featureIdValidation = msLookupHashTable(&(layer->validation), featureIdItem); if (featureIdValidation && msValidateParameter(featureId, featureIdValidation, NULL, NULL, NULL) != MS_SUCCESS) { outputError(OGCAPI_NOT_FOUND_ERROR, "Invalid feature id."); return MS_SUCCESS; } map->query.type = MS_QUERY_BY_FILTER; map->query.mode = MS_QUERY_SINGLE; map->query.layer = i; map->query.rect = bbox; map->query.filteritem = strdup(featureIdItem); msInitExpression(&map->query.filter); map->query.filter.type = MS_STRING; map->query.filter.string = strdup(featureId); if (reprObjs.executeQuery(map) != MS_SUCCESS) { outputError(OGCAPI_NOT_FOUND_ERROR, "Collection items id query failed."); return MS_SUCCESS; } if (!layer->resultcache || layer->resultcache->numresults != 1) { outputError(OGCAPI_NOT_FOUND_ERROR, "Collection items id query failed."); return MS_SUCCESS; } } else { // bbox query const char *compliance_mode = msOWSLookupMetadata(&(map->web.metadata), "A", "compliance_mode"); if (compliance_mode != NULL && strcasecmp(compliance_mode, "true") == 0) { for (int j = 0; j < request->NumParams; j++) { const char *paramName = request->ParamNames[j]; if (strcmp(paramName, "f") == 0 || strcmp(paramName, "bbox") == 0 || strcmp(paramName, "bbox-crs") == 0 || strcmp(paramName, "datetime") == 0 || strcmp(paramName, "limit") == 0 || strcmp(paramName, "offset") == 0 || strcmp(paramName, "crs") == 0) { // ok } else { outputError( OGCAPI_PARAM_ERROR, (std::string("Unknown query parameter: ") + paramName).c_str()); return MS_SUCCESS; } } } map->query.type = MS_QUERY_BY_RECT; map->query.mode = MS_QUERY_MULTIPLE; map->query.layer = i; map->query.rect = bbox; map->query.only_cache_result_count = MS_TRUE; // get number matched if (reprObjs.executeQuery(map) != MS_SUCCESS) { outputError(OGCAPI_NOT_FOUND_ERROR, "Collection items query failed."); return MS_SUCCESS; } if (!layer->resultcache) { outputError(OGCAPI_NOT_FOUND_ERROR, "Collection items query failed."); return MS_SUCCESS; } numberMatched = layer->resultcache->numresults; if (numberMatched > 0) { map->query.only_cache_result_count = MS_FALSE; map->query.maxfeatures = limit; const char *offsetStr = getRequestParameter(request, "offset"); if (offsetStr) { if (msStringToInt(offsetStr, &offset, 10) != MS_SUCCESS) { outputError(OGCAPI_PARAM_ERROR, "Bad value for offset."); return MS_SUCCESS; } if (offset < 0 || offset >= numberMatched) { outputError(OGCAPI_PARAM_ERROR, "Offset out of range."); return MS_SUCCESS; } // msExecuteQuery() use a 1-based offset convention, whereas the API // uses a 0-based offset convention. map->query.startindex = 1 + offset; layer->startindex = 1 + offset; } if (reprObjs.executeQuery(map) != MS_SUCCESS || !layer->resultcache) { outputError(OGCAPI_NOT_FOUND_ERROR, "Collection items query failed."); return MS_SUCCESS; } } } // build response object if (!featureId) { std::string api_root = getApiRootUrl(map); const char *id = layer->name; char *id_encoded = msEncodeUrl(id); // free after use std::string extra_kvp = "&limit=" + std::to_string(limit); extra_kvp += "&offset=" + std::to_string(offset); std::string other_extra_kvp; if (crs) other_extra_kvp += "&crs=" + std::string(crs); const char *bbox = getRequestParameter(request, "bbox"); if (bbox) other_extra_kvp += "&bbox=" + std::string(bbox); const char *bboxCrs = getRequestParameter(request, "bbox-crs"); if (bboxCrs) other_extra_kvp += "&bbox-crs=" + std::string(bboxCrs); response = { {"type", "FeatureCollection"}, {"numberMatched", numberMatched}, {"numberReturned", layer->resultcache->numresults}, {"features", json::array()}, {"links", {{{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_GEOJSON}, {"title", "Items for this collection as GeoJSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=json" + extra_kvp + other_extra_kvp}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "Items for this collection as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=html" + extra_kvp + other_extra_kvp}}}}}; if (offset + layer->resultcache->numresults < numberMatched) { response["links"].push_back( {{"rel", "next"}, {"type", format == OGCAPIFormat::JSON ? OGCAPI_MIMETYPE_GEOJSON : OGCAPI_MIMETYPE_HTML}, {"title", "next page"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=" + (format == OGCAPIFormat::JSON ? "json" : "html") + "&limit=" + std::to_string(limit) + "&offset=" + std::to_string(offset + limit) + other_extra_kvp}}); } if (offset > 0) { response["links"].push_back( {{"rel", "prev"}, {"type", format == OGCAPIFormat::JSON ? OGCAPI_MIMETYPE_GEOJSON : OGCAPI_MIMETYPE_HTML}, {"title", "previous page"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=" + (format == OGCAPIFormat::JSON ? "json" : "html") + "&limit=" + std::to_string(limit) + "&offset=" + std::to_string(MS_MAX(0, (offset - limit))) + other_extra_kvp}}); } msFree(id_encoded); // done } // features (items) { shapeObj shape; msInitShape(&shape); // we piggyback on GML configuration gmlItemListObj *items = msGMLGetItems(layer, "AG"); gmlConstantListObj *constants = msGMLGetConstants(layer, "AG"); if (!items || !constants) { msGMLFreeItems(items); msGMLFreeConstants(constants); outputError(OGCAPI_SERVER_ERROR, "Error fetching layer attribute metadata."); return MS_SUCCESS; } const int geometry_precision = getGeometryPrecision(map, layer); for (i = 0; i < layer->resultcache->numresults; i++) { int status = msLayerGetShape(layer, &shape, &(layer->resultcache->results[i])); if (status != MS_SUCCESS) { msGMLFreeItems(items); msGMLFreeConstants(constants); outputError(OGCAPI_SERVER_ERROR, "Error fetching feature."); return MS_SUCCESS; } if (reprObjs.reprojector) { status = msProjectShapeEx(reprObjs.reprojector, &shape); if (status != MS_SUCCESS) { msGMLFreeItems(items); msGMLFreeConstants(constants); msFreeShape(&shape); outputError(OGCAPI_SERVER_ERROR, "Error reprojecting feature."); return MS_SUCCESS; } } try { json feature = getFeature(layer, &shape, items, constants, geometry_precision, outputCrsAxisInverted); if (featureId) { response = std::move(feature); } else { response["features"].emplace_back(std::move(feature)); } } catch (const std::runtime_error &e) { msGMLFreeItems(items); msGMLFreeConstants(constants); msFreeShape(&shape); outputError(OGCAPI_SERVER_ERROR, "Error getting feature. " + std::string(e.what())); return MS_SUCCESS; } msFreeShape(&shape); // next } msGMLFreeItems(items); // clean up msGMLFreeConstants(constants); } // extend the response a bit for templating (HERE) if (format == OGCAPIFormat::HTML) { const char *title = getCollectionTitle(layer); const char *id = layer->name; response["collection"] = {{"id", id}, {"title", title ? title : ""}}; } if (featureId) { std::string api_root = getApiRootUrl(map); const char *id = layer->name; char *id_encoded = msEncodeUrl(id); // free after use response["links"] = { {{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_GEOJSON}, {"title", "This document as GeoJSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items/" + featureId + "?f=json"}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This document as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items/" + featureId + "?f=html"}}, {{"rel", "collection"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "This collection as JSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "?f=json"}}, {{"rel", "collection"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This collection as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "?f=html"}}}; msFree(id_encoded); outputResponse( map, request, format == OGCAPIFormat::JSON ? OGCAPIFormat::GeoJSON : format, OGCAPI_TEMPLATE_HTML_COLLECTION_ITEM, response, extraHeaders); } else { outputResponse( map, request, format == OGCAPIFormat::JSON ? OGCAPIFormat::GeoJSON : format, OGCAPI_TEMPLATE_HTML_COLLECTION_ITEMS, response, extraHeaders); } return MS_SUCCESS; } static int processCollectionRequest(mapObj *map, cgiRequestObj *request, const char *collectionId, OGCAPIFormat format) { json response; int l; for (l = 0; l < map->numlayers; l++) { if (strcmp(map->layers[l]->name, collectionId) == 0) break; // match } if (l == map->numlayers) { // invalid collectionId outputError(OGCAPI_NOT_FOUND_ERROR, "Invalid collection."); return MS_SUCCESS; } try { response = getCollection(map, map->layers[l], format); if (response.is_null()) { // same as not found outputError(OGCAPI_NOT_FOUND_ERROR, "Invalid collection."); return MS_SUCCESS; } } catch (const std::runtime_error &e) { outputError(OGCAPI_CONFIG_ERROR, "Error getting collection. " + std::string(e.what())); return MS_SUCCESS; } outputResponse(map, request, format, OGCAPI_TEMPLATE_HTML_COLLECTION, response); return MS_SUCCESS; } static int processCollectionsRequest(mapObj *map, cgiRequestObj *request, OGCAPIFormat format) { json response; int i; // define api root url std::string api_root = getApiRootUrl(map); // build response object response = {{"links", {{{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "This document as JSON"}, {"href", api_root + "/collections?f=json"}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This document as HTML"}, {"href", api_root + "/collections?f=html"}}}}, {"collections", json::array()}}; for (i = 0; i < map->numlayers; i++) { try { json collection = getCollection(map, map->layers[i], format); if (!collection.is_null()) response["collections"].push_back(collection); } catch (const std::runtime_error &e) { outputError(OGCAPI_CONFIG_ERROR, "Error getting collection." + std::string(e.what())); return MS_SUCCESS; } } outputResponse(map, request, format, OGCAPI_TEMPLATE_HTML_COLLECTIONS, response); return MS_SUCCESS; } static int processApiRequest(mapObj *map, cgiRequestObj *request, OGCAPIFormat format) { // Strongly inspired from // https://github.com/geopython/pygeoapi/blob/master/pygeoapi/openapi.py json response; response = { {"openapi", "3.0.2"}, {"tags", json::array()}, }; response["info"] = { {"title", getTitle(map)}, {"version", getWebMetadata(map, "A", "version", "1.0.0")}, }; for (const char *item : {"description", "termsOfService"}) { const char *value = getWebMetadata(map, "AO", item, nullptr); if (value) { response["info"][item] = value; } } for (const auto &pair : { std::make_pair("name", "contactperson"), std::make_pair("url", "contacturl"), std::make_pair("email", "contactelectronicmailaddress"), }) { const char *value = getWebMetadata(map, "AO", pair.second, nullptr); if (value) { response["info"]["contact"][pair.first] = value; } } for (const auto &pair : { std::make_pair("name", "licensename"), std::make_pair("url", "licenseurl"), }) { const char *value = getWebMetadata(map, "AO", pair.second, nullptr); if (value) { response["info"]["license"][pair.first] = value; } } { const char *value = getWebMetadata(map, "AO", "keywords", nullptr); if (value) { response["info"]["x-keywords"] = value; } } json server; server["url"] = getApiRootUrl(map); { const char *value = getWebMetadata(map, "AO", "server_description", nullptr); if (value) { server["description"] = value; } } response["servers"].push_back(server); const std::string oapif_schema_base_url = msOWSGetSchemasLocation(map); const std::string oapif_yaml_url = oapif_schema_base_url + "/ogcapi/features/part1/1.0/openapi/" "ogcapi-features-1.yaml"; const std::string oapif_part2_yaml_url = oapif_schema_base_url + "/ogcapi/features/part2/1.0/openapi/" "ogcapi-features-2.yaml"; json paths; paths["/"]["get"] = { {"summary", "Landing page"}, {"description", "Landing page"}, {"tags", {"server"}}, {"operationId", "getLandingPage"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/LandingPage"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; paths["/api"]["get"] = { {"summary", "API documentation"}, {"description", "API documentation"}, {"tags", {"server"}}, {"operationId", "getOpenapi"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", "#/components/responses/200"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"default", {{"$ref", "#/components/responses/default"}}}}}}; paths["/conformance"]["get"] = { {"summary", "API conformance definition"}, {"description", "API conformance definition"}, {"tags", {"server"}}, {"operationId", "getConformanceDeclaration"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/ConformanceDeclaration"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; paths["/collections"]["get"] = { {"summary", "Collections"}, {"description", "Collections"}, {"tags", {"server"}}, {"operationId", "getCollections"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/Collections"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; for (int i = 0; i < map->numlayers; i++) { layerObj *layer = map->layers[i]; if (!includeLayer(map, layer)) { continue; } json collection_get = { {"summary", std::string("Get ") + getCollectionTitle(layer) + " metadata"}, {"description", getCollectionDescription(layer)}, {"tags", {layer->name}}, {"operationId", "describe" + std::string(layer->name) + "Collection"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/Collection"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; std::string collectionNamePath("/collections/"); collectionNamePath += layer->name; paths[collectionNamePath]["get"] = std::move(collection_get); // check metadata, layer then map const char *max_limit_str = msOWSLookupMetadata(&(layer->metadata), "A", "max_limit"); if (max_limit_str == nullptr) max_limit_str = msOWSLookupMetadata(&(map->web.metadata), "A", "max_limit"); const int max_limit = max_limit_str ? atoi(max_limit_str) : OGCAPI_MAX_LIMIT; const int default_limit = getDefaultLimit(map, layer); json items_get = { {"summary", std::string("Get ") + getCollectionTitle(layer) + " items"}, {"description", getCollectionDescription(layer)}, {"tags", {layer->name}}, {"operationId", "get" + std::string(layer->name) + "Features"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, {{"$ref", oapif_yaml_url + "#/components/parameters/bbox"}}, {{"$ref", oapif_yaml_url + "#/components/parameters/datetime"}}, {{"$ref", oapif_part2_yaml_url + "#/components/parameters/bbox-crs"}}, {{"$ref", oapif_part2_yaml_url + "#/components/parameters/crs"}}, {{"$ref", "#/components/parameters/offset"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/Features"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; json param_limit = { {"name", "limit"}, {"in", "query"}, {"description", "The optional limit parameter limits the number of " "items that are presented in the response document."}, {"required", false}, {"schema", { {"type", "integer"}, {"minimum", 1}, {"maximum", max_limit}, {"default", default_limit}, }}, {"style", "form"}, {"explode", false}, }; items_get["parameters"].emplace_back(param_limit); std::string itemsPath(collectionNamePath + "/items"); paths[itemsPath]["get"] = std::move(items_get); json feature_id_get = { {"summary", std::string("Get ") + getCollectionTitle(layer) + " item by id"}, {"description", getCollectionDescription(layer)}, {"tags", {layer->name}}, {"operationId", "get" + std::string(layer->name) + "Feature"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, {{"$ref", oapif_yaml_url + "#/components/parameters/featureId"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/Feature"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"404", {{"$ref", oapif_yaml_url + "#/components/responses/NotFound"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; std::string itemsFeatureIdPath(collectionNamePath + "/items/{featureId}"); paths[itemsFeatureIdPath]["get"] = std::move(feature_id_get); } response["paths"] = std::move(paths); json components; components["responses"]["200"] = {{"description", "successful operation"}}; components["responses"]["default"] = { {"description", "unexpected error"}, {"content", {{"application/json", {{"schema", {{"$ref", "https://raw.githubusercontent.com/opengeospatial/" "ogcapi-processes/master/core/openapi/schemas/" "exception.yaml"}}}}}}}}; json parameters; parameters["f"] = { {"name", "f"}, {"in", "query"}, {"description", "The optional f parameter indicates the output format " "which the server shall provide as part of the response " "document. The default format is GeoJSON."}, {"required", false}, {"schema", {{"type", "string"}, {"enum", {"json", "html"}}, {"default", "json"}}}, {"style", "form"}, {"explode", false}, }; parameters["offset"] = { {"name", "offset"}, {"in", "query"}, {"description", "The optional offset parameter indicates the index within the result " "set from which the server shall begin presenting results in the " "response document. The first element has an index of 0 (default)."}, {"required", false}, {"schema", { {"type", "integer"}, {"minimum", 0}, {"default", 0}, }}, {"style", "form"}, {"explode", false}, }; components["parameters"] = std::move(parameters); response["components"] = std::move(components); // TODO: "tags" array ? outputResponse(map, request, format == OGCAPIFormat::JSON ? OGCAPIFormat::OpenAPI_V3 : format, OGCAPI_TEMPLATE_HTML_OPENAPI, response); return MS_SUCCESS; } #endif int msOGCAPIDispatchRequest(mapObj *map, cgiRequestObj *request) { #ifdef USE_OGCAPI_SVR // make sure ogcapi requests are enabled for this map int status = msOWSRequestIsEnabled(map, NULL, "AO", "OGCAPI", MS_FALSE); if (status != MS_TRUE) { msSetError(MS_OGCAPIERR, "OGC API requests are not enabled.", "msCGIDispatchAPIRequest()"); return MS_FAILURE; // let normal error handling take over } for (int i = 0; i < request->NumParams; i++) { for (int j = i + 1; j < request->NumParams; j++) { if (strcmp(request->ParamNames[i], request->ParamNames[j]) == 0) { std::string errorMsg("Query parameter "); errorMsg += request->ParamNames[i]; errorMsg += " is repeated"; outputError(OGCAPI_PARAM_ERROR, errorMsg.c_str()); return MS_SUCCESS; } } } OGCAPIFormat format; // all endpoints need a format const char *p = getRequestParameter(request, "f"); // if f= query parameter is not specified, use HTTP Accept header if available if (p == nullptr) { const char *accept = getenv("HTTP_ACCEPT"); if (accept) { if (strcmp(accept, "*/*") == 0) p = OGCAPI_MIMETYPE_JSON; else p = accept; } } if (p && (strcmp(p, "json") == 0 || strstr(p, OGCAPI_MIMETYPE_JSON) != nullptr || strstr(p, OGCAPI_MIMETYPE_GEOJSON) != nullptr || strstr(p, OGCAPI_MIMETYPE_OPENAPI_V3) != nullptr)) { format = OGCAPIFormat::JSON; } else if (p && (strcmp(p, "html") == 0 || strstr(p, OGCAPI_MIMETYPE_HTML) != nullptr)) { format = OGCAPIFormat::HTML; } else if (p) { std::string errorMsg("Unsupported format requested: "); errorMsg += p; outputError(OGCAPI_PARAM_ERROR, errorMsg.c_str()); return MS_SUCCESS; // avoid any downstream MapServer processing } else { format = OGCAPIFormat::HTML; // default for now } if (request->api_path_length == 2) { return processLandingRequest(map, request, format); } else if (request->api_path_length == 3) { if (strcmp(request->api_path[2], "conformance") == 0) { return processConformanceRequest(map, request, format); } else if (strcmp(request->api_path[2], "conformance.html") == 0) { return processConformanceRequest(map, request, OGCAPIFormat::HTML); } else if (strcmp(request->api_path[2], "collections") == 0) { return processCollectionsRequest(map, request, format); } else if (strcmp(request->api_path[2], "collections.html") == 0) { return processCollectionsRequest(map, request, OGCAPIFormat::HTML); } else if (strcmp(request->api_path[2], "api") == 0) { return processApiRequest(map, request, format); } } else if (request->api_path_length == 4) { if (strcmp(request->api_path[2], "collections") == 0) { // next argument (3) is collectionId return processCollectionRequest(map, request, request->api_path[3], format); } } else if (request->api_path_length == 5) { if (strcmp(request->api_path[2], "collections") == 0 && strcmp(request->api_path[4], "items") == 0) { // middle argument (3) is the collectionId return processCollectionItemsRequest(map, request, request->api_path[3], NULL, format); } } else if (request->api_path_length == 6) { if (strcmp(request->api_path[2], "collections") == 0 && strcmp(request->api_path[4], "items") == 0) { // middle argument (3) is the collectionId, last argument (5) // is featureId return processCollectionItemsRequest(map, request, request->api_path[3], request->api_path[5], format); } } outputError(OGCAPI_NOT_FOUND_ERROR, "Invalid API path."); return MS_SUCCESS; // avoid any downstream MapServer processing #else msSetError(MS_OGCAPIERR, "OGC API server support is not enabled.", "msOGCAPIDispatchRequest()"); return MS_FAILURE; #endif } mapserver-8.4.0/src/mapogcapi.h000066400000000000000000000031671474174441300164470ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGCAPI Implementation * Author: Steve Lime and the MapServer team. * ********************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #ifndef MAPOGCAPI_H #define MAPOGCAPI_H #ifdef __cplusplus extern "C" { #endif int msOGCAPIDispatchRequest(mapObj *map, cgiRequestObj *request); #ifdef __cplusplus } #endif #endif mapserver-8.4.0/src/mapogcfilter.cpp000066400000000000000000004166311474174441300175220ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC Filter Encoding implementation * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2003, Y. Assefa, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver-config.h" #include "cpl_minixml.h" #include "cpl_string.h" #include "mapogcfilter.h" #include "mapserver.h" #include "mapowscommon.h" #include "maptime.h" #include "mapows.h" #include #if 0 static int FLTHasUniqueTopLevelDuringFilter(FilterEncodingNode *psFilterNode); #endif #if !(defined(_WIN32) && !defined(__CYGWIN__)) static inline void IGUR_double(double ignored) { (void)ignored; } /* Ignore GCC Unused Result */ #endif int FLTIsNumeric(const char *pszValue) { if (pszValue != NULL && *pszValue != '\0' && !isspace(*pszValue)) { /*the regex seems to have a problem on windows when mapserver is built using PHP regex*/ #if defined(_WIN32) && !defined(__CYGWIN__) int i = 0, nLength = 0, bString = 0; nLength = strlen(pszValue); for (i = 0; i < nLength; i++) { if (i == 0) { if (!isdigit(pszValue[i]) && pszValue[i] != '-') { bString = 1; break; } } else if (!isdigit(pszValue[i]) && pszValue[i] != '.') { bString = 1; break; } } if (!bString) return MS_TRUE; #else char *p; IGUR_double(strtod(pszValue, &p)); if (p != pszValue && *p == '\0') return MS_TRUE; #endif } return MS_FALSE; } /* ** Apply an expression to the layer's filter element. ** */ int FLTApplyExpressionToLayer(layerObj *lp, const char *pszExpression) { char *pszFinalExpression = NULL, *pszBuffer = NULL; /*char *escapedTextString=NULL;*/ int bConcatWhere = 0, bHasAWhere = 0; if (lp && pszExpression) { if (lp->connectiontype == MS_POSTGIS || lp->connectiontype == MS_ORACLESPATIAL || lp->connectiontype == MS_PLUGIN) { pszFinalExpression = msStrdup("("); pszFinalExpression = msStringConcatenate(pszFinalExpression, pszExpression); pszFinalExpression = msStringConcatenate(pszFinalExpression, ")"); } else if (lp->connectiontype == MS_OGR) { pszFinalExpression = msStrdup(pszExpression); if (lp->filter.type != MS_EXPRESSION) { bConcatWhere = 1; } else { if (lp->filter.string && EQUALN(lp->filter.string, "WHERE ", 6)) { bHasAWhere = 1; bConcatWhere = 1; } } } else pszFinalExpression = msStrdup(pszExpression); if (bConcatWhere) pszBuffer = msStringConcatenate(pszBuffer, "WHERE "); /* if the filter is set and it's an expression type, concatenate it with this filter. If not just free it */ if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { pszBuffer = msStringConcatenate(pszBuffer, "(("); if (bHasAWhere) pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string + 6); else pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") and "); } else if (lp->filter.string) msFreeExpression(&lp->filter); pszBuffer = msStringConcatenate(pszBuffer, pszFinalExpression); if (lp->filter.string && lp->filter.type == MS_EXPRESSION) pszBuffer = msStringConcatenate(pszBuffer, ")"); /*assuming that expression was properly escaped escapedTextString = msStringEscape(pszBuffer); msLoadExpressionString(&lp->filter, (char*)CPLSPrintf("%s", escapedTextString)); msFree(escapedTextString); */ msLoadExpressionString(&lp->filter, pszBuffer); msFree(pszFinalExpression); if (pszBuffer) msFree(pszBuffer); return MS_TRUE; } return MS_FALSE; } char *FLTGetExpressionForValuesRanges(layerObj *lp, const char *item, const char *value, int forcecharcter) { int bIscharacter; char *pszExpression = NULL, *pszTmpExpression = NULL; char **paszElements = NULL, **papszRangeElements = NULL; int numelements, i, nrangeelements; /* double minval, maxval; */ if (lp && item && value) { if (strstr(value, "/") == NULL) { /*value(s)*/ paszElements = msStringSplit(value, ',', &numelements); if (paszElements && numelements > 0) { if (forcecharcter) bIscharacter = MS_TRUE; else bIscharacter = !FLTIsNumeric(paszElements[0]); pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); for (i = 0; i < numelements; i++) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); { if (bIscharacter) pszTmpExpression = msStringConcatenate(pszTmpExpression, "\""); pszTmpExpression = msStringConcatenate(pszTmpExpression, "["); pszTmpExpression = msStringConcatenate(pszTmpExpression, item); pszTmpExpression = msStringConcatenate(pszTmpExpression, "]"); if (bIscharacter) pszTmpExpression = msStringConcatenate(pszTmpExpression, "\""); } if (bIscharacter) { pszTmpExpression = msStringConcatenate(pszTmpExpression, " = \""); } else pszTmpExpression = msStringConcatenate(pszTmpExpression, " = "); { char *pszEscapedStr = msLayerEscapeSQLParam(lp, paszElements[i]); pszTmpExpression = msStringConcatenate(pszTmpExpression, pszEscapedStr); msFree(pszEscapedStr); } if (bIscharacter) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "\""); } pszTmpExpression = msStringConcatenate(pszTmpExpression, ")"); if (pszExpression != NULL) pszExpression = msStringConcatenate(pszExpression, " OR "); pszExpression = msStringConcatenate(pszExpression, pszTmpExpression); msFree(pszTmpExpression); pszTmpExpression = NULL; } pszExpression = msStringConcatenate(pszExpression, ")"); } msFreeCharArray(paszElements, numelements); } else { /*range(s)*/ paszElements = msStringSplit(value, ',', &numelements); if (paszElements && numelements > 0) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); for (i = 0; i < numelements; i++) { papszRangeElements = msStringSplit(paszElements[i], '/', &nrangeelements); if (papszRangeElements && nrangeelements > 0) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); if (nrangeelements == 2 || nrangeelements == 3) { /* minval = atof(papszRangeElements[0]); maxval = atof(papszRangeElements[1]); */ { pszTmpExpression = msStringConcatenate(pszTmpExpression, "["); pszTmpExpression = msStringConcatenate(pszTmpExpression, item); pszTmpExpression = msStringConcatenate(pszTmpExpression, "]"); } pszTmpExpression = msStringConcatenate(pszTmpExpression, " >= "); { char *pszEscapedStr = msLayerEscapeSQLParam(lp, papszRangeElements[0]); pszTmpExpression = msStringConcatenate(pszTmpExpression, pszEscapedStr); msFree(pszEscapedStr); } pszTmpExpression = msStringConcatenate(pszTmpExpression, " AND "); { pszTmpExpression = msStringConcatenate(pszTmpExpression, "["); pszTmpExpression = msStringConcatenate(pszTmpExpression, item); pszTmpExpression = msStringConcatenate(pszTmpExpression, "]"); } pszTmpExpression = msStringConcatenate(pszTmpExpression, " <= "); { char *pszEscapedStr = msLayerEscapeSQLParam(lp, papszRangeElements[1]); pszTmpExpression = msStringConcatenate(pszTmpExpression, pszEscapedStr); msFree(pszEscapedStr); } pszTmpExpression = msStringConcatenate(pszTmpExpression, ")"); } else if (nrangeelements == 1) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); { pszTmpExpression = msStringConcatenate(pszTmpExpression, "["); pszTmpExpression = msStringConcatenate(pszTmpExpression, item); pszTmpExpression = msStringConcatenate(pszTmpExpression, "]"); } pszTmpExpression = msStringConcatenate(pszTmpExpression, " = "); { char *pszEscapedStr = msLayerEscapeSQLParam(lp, papszRangeElements[0]); pszTmpExpression = msStringConcatenate(pszTmpExpression, pszEscapedStr); msFree(pszEscapedStr); } pszTmpExpression = msStringConcatenate(pszTmpExpression, ")"); } if (pszExpression != NULL) pszExpression = msStringConcatenate(pszExpression, " OR "); pszExpression = msStringConcatenate(pszExpression, pszTmpExpression); msFree(pszTmpExpression); pszTmpExpression = NULL; } msFreeCharArray(papszRangeElements, nrangeelements); } pszExpression = msStringConcatenate(pszExpression, ")"); } msFreeCharArray(paszElements, numelements); } } msFree(pszTmpExpression); return pszExpression; } int FLTogrConvertGeometry(OGRGeometryH hGeometry, shapeObj *psShape, OGRwkbGeometryType nType) { return msOGRGeometryToShape(hGeometry, psShape, nType); } static int FLTShapeFromGMLTree(CPLXMLNode *psTree, shapeObj *psShape, char **ppszSRS) { const char *pszSRS = NULL; if (psTree && psShape) { CPLXMLNode *psNext = psTree->psNext; OGRGeometryH hGeometry = NULL; psTree->psNext = NULL; hGeometry = OGR_G_CreateFromGMLTree(psTree); psTree->psNext = psNext; if (hGeometry) { OGRwkbGeometryType nType; nType = OGR_G_GetGeometryType(hGeometry); if (nType == wkbPolygon25D || nType == wkbMultiPolygon25D) nType = wkbPolygon; else if (nType == wkbLineString25D || nType == wkbMultiLineString25D) nType = wkbLineString; else if (nType == wkbPoint25D || nType == wkbMultiPoint25D) nType = wkbPoint; FLTogrConvertGeometry(hGeometry, psShape, nType); OGR_G_DestroyGeometry(hGeometry); pszSRS = CPLGetXMLValue(psTree, "srsName", NULL); if (ppszSRS && pszSRS) *ppszSRS = msStrdup(pszSRS); return MS_TRUE; } } return MS_FALSE; } int FLTGetGeosOperator(char *pszValue) { if (!pszValue) return -1; if (strcasecmp(pszValue, "Equals") == 0) return MS_GEOS_EQUALS; else if (strcasecmp(pszValue, "Intersect") == 0 || strcasecmp(pszValue, "Intersects") == 0) return MS_GEOS_INTERSECTS; else if (strcasecmp(pszValue, "Disjoint") == 0) return MS_GEOS_DISJOINT; else if (strcasecmp(pszValue, "Touches") == 0) return MS_GEOS_TOUCHES; else if (strcasecmp(pszValue, "Crosses") == 0) return MS_GEOS_CROSSES; else if (strcasecmp(pszValue, "Within") == 0) return MS_GEOS_WITHIN; else if (strcasecmp(pszValue, "Contains") == 0) return MS_GEOS_CONTAINS; else if (strcasecmp(pszValue, "Overlaps") == 0) return MS_GEOS_OVERLAPS; else if (strcasecmp(pszValue, "Beyond") == 0) return MS_GEOS_BEYOND; else if (strcasecmp(pszValue, "DWithin") == 0) return MS_GEOS_DWITHIN; return -1; } int FLTIsGeosNode(char *pszValue) { if (FLTGetGeosOperator(pszValue) == -1) return MS_FALSE; return MS_TRUE; } /************************************************************************/ /* FLTIsSimpleFilterNoSpatial */ /* */ /* Filter encoding with only attribute queries */ /************************************************************************/ int FLTIsSimpleFilterNoSpatial(FilterEncodingNode *psNode) { if (FLTIsSimpleFilter(psNode) && FLTNumberOfFilterType(psNode, "BBOX") == 0) return MS_TRUE; return MS_FALSE; } /************************************************************************/ /* FLTApplySimpleSQLFilter() */ /************************************************************************/ int FLTApplySimpleSQLFilter(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { layerObj *lp = NULL; char *szExpression = NULL; rectObj sQueryRect = map->extent; const char *szEPSG = NULL; projectionObj sProjTmp; char *pszBuffer = NULL; int bConcatWhere = 0; int bHasAWhere = 0; char *pszTmp = NULL, *pszTmp2 = NULL; char *tmpfilename = NULL; const char *pszTimeField = NULL; const char *pszTimeValue = NULL; lp = (GET_LAYER(map, iLayerIndex)); /* if there is a bbox use it */ szEPSG = FLTGetBBOX(psNode, &sQueryRect); if (szEPSG && map->projection.numargs > 0) { msInitProjection(&sProjTmp); msProjectionInheritContextFrom(&sProjTmp, &map->projection); /* Use the non EPSG variant since axis swapping is done in * FLTDoAxisSwappingIfNecessary */ if (msLoadProjectionString(&sProjTmp, szEPSG) == 0) { msProjectRect(&sProjTmp, &map->projection, &sQueryRect); } msFreeProjection(&sProjTmp); } if (lp->connectiontype == MS_OGR) { pszTimeValue = FLTGetDuring(psNode, &pszTimeField); } /* make sure that the layer can be queried*/ if (!lp->_template) lp->_template = msStrdup("ttt.html"); /* if there is no class, create at least one, so that query by rect would work */ if (lp->numclasses == 0) { if (msGrowLayerClasses(lp) == NULL) return MS_FAILURE; initClass(lp->_class[0]); } bConcatWhere = 0; bHasAWhere = 0; if (lp->connectiontype == MS_POSTGIS || lp->connectiontype == MS_ORACLESPATIAL || lp->connectiontype == MS_PLUGIN) { szExpression = FLTGetSQLExpression(psNode, lp); if (szExpression) { pszTmp = msStrdup("("); pszTmp = msStringConcatenate(pszTmp, szExpression); pszTmp = msStringConcatenate(pszTmp, ")"); msFree(szExpression); szExpression = pszTmp; } } /* concatenates the WHERE clause for OGR layers. This only applies if the expression was empty or not of an expression string. If there is an sql type expression, it is assumed to have the WHERE clause. If it is an expression and does not have a WHERE it is assumed to be a mapserver type expression*/ else if (lp->connectiontype == MS_OGR) { if (lp->filter.type != MS_EXPRESSION) { szExpression = FLTGetSQLExpression(psNode, lp); bConcatWhere = 1; } else { if (lp->filter.string && EQUALN(lp->filter.string, "WHERE ", 6)) { szExpression = FLTGetSQLExpression(psNode, lp); bHasAWhere = 1; bConcatWhere = 1; } else { szExpression = FLTGetCommonExpression(psNode, lp); } } } else { szExpression = FLTGetCommonExpression(psNode, lp); } if (szExpression) { if (bConcatWhere) pszBuffer = msStringConcatenate(pszBuffer, "WHERE "); /* if the filter is set and it's an expression type, concatenate it with this filter. If not just free it */ if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { pszBuffer = msStringConcatenate(pszBuffer, "(("); if (bHasAWhere) pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string + 6); else pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") and "); } else if (lp->filter.string) msFreeExpression(&lp->filter); pszBuffer = msStringConcatenate(pszBuffer, szExpression); if (lp->filter.string && lp->filter.type == MS_EXPRESSION) pszBuffer = msStringConcatenate(pszBuffer, ")"); msLoadExpressionString(&lp->filter, pszBuffer); free(szExpression); } if (pszTimeField && pszTimeValue) msLayerSetTimeFilter(lp, pszTimeValue, pszTimeField); if (pszBuffer) free(pszBuffer); map->query.type = MS_QUERY_BY_RECT; map->query.mode = MS_QUERY_MULTIPLE; map->query.layer = lp->index; map->query.rect = sQueryRect; if (map->debug == MS_DEBUGLEVEL_VVV) { tmpfilename = msTmpFile(map, map->mappath, NULL, "_filter.map"); if (tmpfilename == NULL) { tmpfilename = msTmpFile(map, NULL, NULL, "_filter.map"); } if (tmpfilename) { msSaveMap(map, tmpfilename); msDebug( "FLTApplySimpleSQLFilter(): Map file after Filter was applied %s\n", tmpfilename); msFree(tmpfilename); } } /*for oracle connection, if we have a simple filter with no spatial constraints we should set the connection function to NONE to have a better performance (#2725)*/ if (lp->connectiontype == MS_ORACLESPATIAL && FLTIsSimpleFilterNoSpatial(psNode)) { if (strcasestr(lp->data, "USING") == 0) lp->data = msStringConcatenate(lp->data, " USING NONE"); else if (strcasestr(lp->data, "NONE") == 0) { /*if one of the functions is used, just replace it with NONE*/ if (strcasestr(lp->data, "FILTER")) lp->data = msCaseReplaceSubstring(lp->data, "FILTER", "NONE"); else if (strcasestr(lp->data, "GEOMRELATE")) lp->data = msCaseReplaceSubstring(lp->data, "GEOMRELATE", "NONE"); else if (strcasestr(lp->data, "RELATE")) lp->data = msCaseReplaceSubstring(lp->data, "RELATE", "NONE"); else if (strcasestr(lp->data, "VERSION")) { /*should add NONE just before the VERSION. Cases are: DATA "ORA_GEOMETRY FROM data USING VERSION 10g DATA "ORA_GEOMETRY FROM data USING UNIQUE FID VERSION 10g" */ pszTmp = (char *)strcasestr(lp->data, "VERSION"); pszTmp2 = msStringConcatenate(pszTmp2, " NONE "); pszTmp2 = msStringConcatenate(pszTmp2, pszTmp); lp->data = msCaseReplaceSubstring(lp->data, pszTmp, pszTmp2); msFree(pszTmp2); } else if (strcasestr(lp->data, "SRID")) { lp->data = msStringConcatenate(lp->data, " NONE"); } } } return msQueryByRect(map); /* return MS_SUCCESS; */ } /************************************************************************/ /* FLTSplitFilters */ /* */ /* Split filters separated by parentheses into an array of strings. */ /************************************************************************/ char **FLTSplitFilters(const char *pszStr, int *pnTokens) { const char *pszTokenBegin; char **papszRet = NULL; int nTokens = 0; char chStringQuote = '\0'; int nXMLIndent = 0; int bInBracket = FALSE; if (*pszStr != '(') { *pnTokens = 0; return NULL; } pszStr++; pszTokenBegin = pszStr; while (*pszStr != '\0') { /* Ignore any character until end of quoted string */ if (chStringQuote != '\0') { if (*pszStr == chStringQuote) chStringQuote = 0; } /* Detect begin of quoted string only for an XML attribute, i.e. between < and > */ else if (bInBracket && (*pszStr == '\'' || *pszStr == '"')) { chStringQuote = *pszStr; } /* Begin of XML element */ else if (*pszStr == '<') { bInBracket = TRUE; if (pszStr[1] == '/') nXMLIndent--; else if (pszStr[1] != '!') nXMLIndent++; } /* case */ else if (*pszStr == '/' && pszStr[1] == '>') { bInBracket = FALSE; nXMLIndent--; pszStr++; } /* End of XML element */ else if (*pszStr == '>') { bInBracket = FALSE; } /* Only detect and of filter when XML indentation goes back to zero */ else if (nXMLIndent == 0 && *pszStr == ')') { papszRet = (char **)msSmallRealloc(papszRet, sizeof(char *) * (nTokens + 1)); papszRet[nTokens] = msStrdup(pszTokenBegin); papszRet[nTokens][pszStr - pszTokenBegin] = '\0'; nTokens++; if (pszStr[1] != '(') { break; } pszStr++; pszTokenBegin = pszStr + 1; } pszStr++; } *pnTokens = nTokens; return papszRet; } /************************************************************************/ /* FLTIsSimpleFilter */ /* */ /* Filter encoding with only attribute queries and only one bbox. */ /************************************************************************/ int FLTIsSimpleFilter(FilterEncodingNode *psNode) { if (FLTValidForBBoxFilter(psNode)) { if (FLTNumberOfFilterType(psNode, "DWithin") == 0 && FLTNumberOfFilterType(psNode, "Intersect") == 0 && FLTNumberOfFilterType(psNode, "Intersects") == 0 && FLTNumberOfFilterType(psNode, "Equals") == 0 && FLTNumberOfFilterType(psNode, "Disjoint") == 0 && FLTNumberOfFilterType(psNode, "Touches") == 0 && FLTNumberOfFilterType(psNode, "Crosses") == 0 && FLTNumberOfFilterType(psNode, "Within") == 0 && FLTNumberOfFilterType(psNode, "Contains") == 0 && FLTNumberOfFilterType(psNode, "Overlaps") == 0 && FLTNumberOfFilterType(psNode, "Beyond") == 0) return TRUE; } return FALSE; } /************************************************************************/ /* FLTApplyFilterToLayer */ /* */ /* Use the filter encoding node to create mapserver expressions */ /* and apply it to the layer. */ /************************************************************************/ int FLTApplyFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { layerObj *layer = GET_LAYER(map, iLayerIndex); if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } if (!layer->vtable) return MS_FAILURE; return layer->vtable->LayerApplyFilterToLayer(psNode, map, iLayerIndex); } /************************************************************************/ /* FLTLayerApplyCondSQLFilterToLayer */ /* */ /* Helper function for layer virtual table architecture */ /************************************************************************/ int FLTLayerApplyCondSQLFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { return FLTLayerApplyPlainFilterToLayer(psNode, map, iLayerIndex); } /************************************************************************/ /* FLTGetTopBBOX */ /* */ /* Return the "top" BBOX if there's a unique one. */ /************************************************************************/ static int FLTGetTopBBOXInternal(FilterEncodingNode *psNode, FilterEncodingNode **ppsTopBBOX, int *pnCount) { if (psNode->pszValue && strcasecmp(psNode->pszValue, "BBOX") == 0) { (*pnCount)++; if (*pnCount == 1) { *ppsTopBBOX = psNode; return TRUE; } *ppsTopBBOX = NULL; return FALSE; } else if (psNode->pszValue && strcasecmp(psNode->pszValue, "AND") == 0) { return FLTGetTopBBOXInternal(psNode->psLeftNode, ppsTopBBOX, pnCount) && FLTGetTopBBOXInternal(psNode->psRightNode, ppsTopBBOX, pnCount); } else { return TRUE; } } static FilterEncodingNode *FLTGetTopBBOX(FilterEncodingNode *psNode) { int nCount = 0; FilterEncodingNode *psTopBBOX = NULL; FLTGetTopBBOXInternal(psNode, &psTopBBOX, &nCount); return psTopBBOX; } /************************************************************************/ /* FLTLayerSetInvalidRectIfSupported */ /* */ /* This function will set in *rect a very huge extent if the layer */ /* wfs_use_default_extent_for_getfeature metadata item is set to false */ /* and the layer supports such degenerate rectangle, as a hint that */ /* they should not issue a spatial filter. */ /************************************************************************/ int FLTLayerSetInvalidRectIfSupported(layerObj *lp, rectObj *rect, const char *metadata_namespaces) { const char *pszUseDefaultExtent = msOWSLookupMetadata(&(lp->metadata), metadata_namespaces, "use_default_extent_for_getfeature"); if (pszUseDefaultExtent && !CSLTestBoolean(pszUseDefaultExtent) && (lp->connectiontype == MS_OGR || lp->connectiontype == MS_POSTGIS || ((lp->connectiontype == MS_PLUGIN) && (strstr(lp->plugin_library, "msplugin_mssql2008") != NULL)))) { const rectObj rectInvalid = MS_INIT_INVALID_RECT; *rect = rectInvalid; return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* FLTLayerApplyPlainFilterToLayer */ /* */ /* Helper function for layer virtual table architecture */ /************************************************************************/ int FLTLayerApplyPlainFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { char *pszExpression = NULL; int status = MS_FALSE; layerObj *lp = GET_LAYER(map, iLayerIndex); pszExpression = FLTGetCommonExpression(psNode, lp); if (pszExpression) { FilterEncodingNode *psTopBBOX; rectObj rect = map->extent; FLTLayerSetInvalidRectIfSupported(lp, &rect, "OF"); psTopBBOX = FLTGetTopBBOX(psNode); if (psTopBBOX) { int can_remove_expression = MS_TRUE; const char *pszEPSG = FLTGetBBOX(psNode, &rect); if (pszEPSG && map->projection.numargs > 0) { projectionObj sProjTmp; msInitProjection(&sProjTmp); msProjectionInheritContextFrom(&sProjTmp, &map->projection); /* Use the non EPSG variant since axis swapping is done in * FLTDoAxisSwappingIfNecessary */ if (msLoadProjectionString(&sProjTmp, pszEPSG) == 0) { rectObj oldRect = rect; msProjectRect(&sProjTmp, &map->projection, &rect); /* If reprojection is involved, do not remove the expression */ if (rect.minx != oldRect.minx || rect.miny != oldRect.miny || rect.maxx != oldRect.maxx || rect.maxy != oldRect.maxy) { can_remove_expression = MS_FALSE; } } msFreeProjection(&sProjTmp); } /* Small optimization: if the query is just a BBOX, then do a */ /* msQueryByRect() */ if (psTopBBOX == psNode && can_remove_expression) { msFree(pszExpression); pszExpression = NULL; } } if (map->debug == MS_DEBUGLEVEL_VVV) { if (pszExpression) msDebug("FLTLayerApplyPlainFilterToLayer(): %s, " "rect=%.15g,%.15g,%.15g,%.15g\n", pszExpression, rect.minx, rect.miny, rect.maxx, rect.maxy); else msDebug( "FLTLayerApplyPlainFilterToLayer(): rect=%.15g,%.15g,%.15g,%.15g\n", rect.minx, rect.miny, rect.maxx, rect.maxy); } status = FLTApplyFilterToLayerCommonExpressionWithRect(map, iLayerIndex, pszExpression, rect); msFree(pszExpression); } return status; } /************************************************************************/ /* FilterNode *FLTPaserFilterEncoding(char *szXMLString) */ /* */ /* Parses an Filter Encoding XML string and creates a */ /* FilterEncodingNodes corresponding to the string. */ /* Returns a pointer to the first node or NULL if */ /* unsuccessful. */ /* Calling function should use FreeFilterEncodingNode function */ /* to free memory. */ /************************************************************************/ FilterEncodingNode *FLTParseFilterEncoding(const char *szXMLString) { CPLXMLNode *psRoot = NULL, *psChild = NULL, *psFilter = NULL; FilterEncodingNode *psFilterNode = NULL; if (szXMLString == NULL || strlen(szXMLString) == 0 || (strstr(szXMLString, "Filter") == NULL)) return NULL; psRoot = CPLParseXMLString(szXMLString); if (psRoot == NULL) return NULL; /* strip namespaces. We srtip all name spaces (#1350)*/ CPLStripXMLNamespace(psRoot, NULL, 1); /* -------------------------------------------------------------------- */ /* get the root element (Filter). */ /* -------------------------------------------------------------------- */ psFilter = CPLGetXMLNode(psRoot, "=Filter"); if (!psFilter) { CPLDestroyXMLNode(psRoot); return NULL; } psChild = psFilter->psChild; while (psChild) { if (FLTIsSupportedFilterType(psChild)) { psFilterNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psFilterNode, psChild); break; } else psChild = psChild->psNext; } CPLDestroyXMLNode(psRoot); /* -------------------------------------------------------------------- */ /* validate the node tree to make sure that all the nodes are valid.*/ /* -------------------------------------------------------------------- */ if (!FLTValidFilterNode(psFilterNode)) { FLTFreeFilterEncodingNode(psFilterNode); return NULL; } return psFilterNode; } /************************************************************************/ /* int FLTValidFilterNode(FilterEncodingNode *psFilterNode) */ /* */ /* Validate that all the nodes are filled properly. We could */ /* have parts of the nodes that are correct and part which */ /* could be incorrect if the filter string sent is corrupted */ /* (eg missing a value :) */ /************************************************************************/ int FLTValidFilterNode(FilterEncodingNode *psFilterNode) { if (!psFilterNode) return 0; if (psFilterNode->eType == FILTER_NODE_TYPE_UNDEFINED) return 0; if (psFilterNode->psLeftNode) { const int bReturn = FLTValidFilterNode(psFilterNode->psLeftNode); if (bReturn == 0) return 0; else if (psFilterNode->psRightNode) return FLTValidFilterNode(psFilterNode->psRightNode); } return 1; } /************************************************************************/ /* FLTIsGeometryFilterNodeType */ /************************************************************************/ static int FLTIsGeometryFilterNodeType(int eType) { return (eType == FILTER_NODE_TYPE_GEOMETRY_POINT || eType == FILTER_NODE_TYPE_GEOMETRY_LINE || eType == FILTER_NODE_TYPE_GEOMETRY_POLYGON); } /************************************************************************/ /* FLTFreeFilterEncodingNode */ /* */ /* recursive freeing of Filter Encoding nodes. */ /************************************************************************/ void FLTFreeFilterEncodingNode(FilterEncodingNode *psFilterNode) { if (psFilterNode) { if (psFilterNode->psLeftNode) { FLTFreeFilterEncodingNode(psFilterNode->psLeftNode); psFilterNode->psLeftNode = NULL; } if (psFilterNode->psRightNode) { FLTFreeFilterEncodingNode(psFilterNode->psRightNode); psFilterNode->psRightNode = NULL; } if (psFilterNode->pszSRS) free(psFilterNode->pszSRS); if (psFilterNode->pOther) { if (psFilterNode->pszValue != NULL && strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) { FEPropertyIsLike *propIsLike = (FEPropertyIsLike *)psFilterNode->pOther; if (propIsLike->pszWildCard) free(propIsLike->pszWildCard); if (propIsLike->pszSingleChar) free(propIsLike->pszSingleChar); if (propIsLike->pszEscapeChar) free(propIsLike->pszEscapeChar); } else if (FLTIsGeometryFilterNodeType(psFilterNode->eType)) { msFreeShape((shapeObj *)(psFilterNode->pOther)); } /* else */ /* TODO free pOther special fields */ free(psFilterNode->pOther); } /* Cannot free pszValue before, 'cause we are testing it above */ if (psFilterNode->pszValue) free(psFilterNode->pszValue); free(psFilterNode); } } /************************************************************************/ /* FLTCreateFilterEncodingNode */ /* */ /* return a FilterEncoding node. */ /************************************************************************/ FilterEncodingNode *FLTCreateFilterEncodingNode(void) { FilterEncodingNode *psFilterNode = NULL; psFilterNode = (FilterEncodingNode *)malloc(sizeof(FilterEncodingNode)); psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; psFilterNode->pszValue = NULL; psFilterNode->pOther = NULL; psFilterNode->pszSRS = NULL; psFilterNode->psLeftNode = NULL; psFilterNode->psRightNode = NULL; return psFilterNode; } FilterEncodingNode *FLTCreateBinaryCompFilterEncodingNode(void) { FilterEncodingNode *psFilterNode = NULL; psFilterNode = FLTCreateFilterEncodingNode(); /* used to store case sensitivity flag. Default is 0 meaning the comparing is case sensititive */ psFilterNode->pOther = (int *)malloc(sizeof(int)); (*(int *)(psFilterNode->pOther)) = 0; return psFilterNode; } /************************************************************************/ /* FLTFindGeometryNode */ /* */ /************************************************************************/ static CPLXMLNode *FLTFindGeometryNode(CPLXMLNode *psXMLNode, int *pbPoint, int *pbLine, int *pbPolygon) { CPLXMLNode *psGMLElement = NULL; psGMLElement = CPLGetXMLNode(psXMLNode, "Point"); if (!psGMLElement) psGMLElement = CPLGetXMLNode(psXMLNode, "PointType"); if (psGMLElement) *pbPoint = 1; else { psGMLElement = CPLGetXMLNode(psXMLNode, "Polygon"); if (psGMLElement) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiPolygon"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "Surface"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiSurface"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "Box"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "Envelope"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "LineString"))) *pbLine = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiLineString"))) *pbLine = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "Curve"))) *pbLine = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiCurve"))) *pbLine = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiPoint"))) *pbPoint = 1; } return psGMLElement; } /************************************************************************/ /* FLTGetPropertyName */ /************************************************************************/ static const char *FLTGetPropertyName(CPLXMLNode *psXMLNode) { const char *pszPropertyName; pszPropertyName = CPLGetXMLValue(psXMLNode, "PropertyName", NULL); if (pszPropertyName == NULL) /* FE 2.0 ? */ pszPropertyName = CPLGetXMLValue(psXMLNode, "ValueReference", NULL); return pszPropertyName; } /************************************************************************/ /* FLTGetFirstChildNode */ /************************************************************************/ static CPLXMLNode *FLTGetFirstChildNode(CPLXMLNode *psXMLNode) { if (psXMLNode == NULL) return NULL; psXMLNode = psXMLNode->psChild; while (psXMLNode != NULL) { if (psXMLNode->eType == CXT_Element) return psXMLNode; psXMLNode = psXMLNode->psNext; } return NULL; } /************************************************************************/ /* FLTGetNextSibblingNode */ /************************************************************************/ static CPLXMLNode *FLTGetNextSibblingNode(CPLXMLNode *psXMLNode) { if (psXMLNode == NULL) return NULL; psXMLNode = psXMLNode->psNext; while (psXMLNode != NULL) { if (psXMLNode->eType == CXT_Element) return psXMLNode; psXMLNode = psXMLNode->psNext; } return NULL; } /************************************************************************/ /* FLTInsertElementInNode */ /* */ /* Utility function to parse an XML node and transfer the */ /* contents into the Filter Encoding node structure. */ /************************************************************************/ void FLTInsertElementInNode(FilterEncodingNode *psFilterNode, CPLXMLNode *psXMLNode) { char *pszTmp = NULL; FilterEncodingNode *psCurFilNode = NULL; CPLXMLNode *psCurXMLNode = NULL; CPLXMLNode *psTmpNode = NULL; CPLXMLNode *psFeatureIdNode = NULL; const char *pszFeatureId = NULL; char *pszFeatureIdList = NULL; if (psFilterNode && psXMLNode && psXMLNode->pszValue) { psFilterNode->pszValue = msStrdup(psXMLNode->pszValue); psFilterNode->psLeftNode = NULL; psFilterNode->psRightNode = NULL; /* -------------------------------------------------------------------- */ /* Logical filter. AND, OR and NOT are supported. Example of */ /* filer using logical filters : */ /* */ /* */ /* */ /* Person/Age */ /* 50 */ /* */ /* */ /* Person/Address/City */ /* Toronto */ /* */ /* */ /* */ /* -------------------------------------------------------------------- */ if (FLTIsLogicalFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_LOGICAL; if (strcasecmp(psFilterNode->pszValue, "AND") == 0 || strcasecmp(psFilterNode->pszValue, "OR") == 0) { CPLXMLNode *psFirstNode = FLTGetFirstChildNode(psXMLNode); CPLXMLNode *psSecondNode = FLTGetNextSibblingNode(psFirstNode); if (psFirstNode && psSecondNode) { /*2 operators */ CPLXMLNode *psNextNode = FLTGetNextSibblingNode(psSecondNode); if (psNextNode == NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psFilterNode->psLeftNode, psFirstNode); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psFilterNode->psRightNode, psSecondNode); } else { psCurXMLNode = psFirstNode; psCurFilNode = psFilterNode; while (psCurXMLNode) { psNextNode = FLTGetNextSibblingNode(psCurXMLNode); if (FLTGetNextSibblingNode(psNextNode)) { psCurFilNode->psLeftNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psCurFilNode->psLeftNode, psCurXMLNode); psCurFilNode->psRightNode = FLTCreateFilterEncodingNode(); psCurFilNode->psRightNode->eType = FILTER_NODE_TYPE_LOGICAL; psCurFilNode->psRightNode->pszValue = msStrdup(psFilterNode->pszValue); psCurFilNode = psCurFilNode->psRightNode; psCurXMLNode = psNextNode; } else { /*last 2 operators*/ psCurFilNode->psLeftNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psCurFilNode->psLeftNode, psCurXMLNode); psCurFilNode->psRightNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psCurFilNode->psRightNode, psNextNode); break; } } } } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else if (strcasecmp(psFilterNode->pszValue, "NOT") == 0) { CPLXMLNode *psFirstNode = FLTGetFirstChildNode(psXMLNode); if (psFirstNode) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psFilterNode->psLeftNode, psFirstNode); } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } /* end if is logical */ /* -------------------------------------------------------------------- */ /* Spatial Filter. */ /* BBOX : */ /* */ /* */ /* Geometry */ /* */ /* 13.0983,31.5899 35.5472,42.8143*/ /* */ /* */ /* */ /* */ /* DWithin */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Geometry */ /* */ /* 13.0983,31.5899 */ /* */ /* 10 */ /* */ /* */ /* */ /* Intersect */ /* */ /* type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>*/ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* -------------------------------------------------------------------- */ else if (FLTIsSpatialFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_SPATIAL; if (strcasecmp(psXMLNode->pszValue, "BBOX") == 0) { char *pszSRS = NULL; const char *pszPropertyName = NULL; CPLXMLNode *psBox = NULL, *psEnvelope = NULL; rectObj sBox = {0, 0, 0, 0}; int bCoordinatesValid = 0; pszPropertyName = FLTGetPropertyName(psXMLNode); psBox = CPLGetXMLNode(psXMLNode, "Box"); if (!psBox) psBox = CPLGetXMLNode(psXMLNode, "BoxType"); /*FE 1.0 used box FE1.1 uses envelop*/ if (psBox) bCoordinatesValid = FLTParseGMLBox(psBox, &sBox, &pszSRS); else if ((psEnvelope = CPLGetXMLNode(psXMLNode, "Envelope"))) bCoordinatesValid = FLTParseGMLEnvelope(psEnvelope, &sBox, &pszSRS); if (bCoordinatesValid) { /*set the srs if available*/ if (pszSRS) psFilterNode->pszSRS = pszSRS; psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; /* PropertyName is optional since FE 1.1.0, in which case */ /* the BBOX must apply to all geometry fields. As we support */ /* currently only one geometry field, this doesn't make much */ /* difference to further processing. */ if (pszPropertyName != NULL) { psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); } /* coordinates */ psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_BBOX; psFilterNode->psRightNode->pOther = (rectObj *)msSmallMalloc(sizeof(rectObj)); ((rectObj *)psFilterNode->psRightNode->pOther)->minx = sBox.minx; ((rectObj *)psFilterNode->psRightNode->pOther)->miny = sBox.miny; ((rectObj *)psFilterNode->psRightNode->pOther)->maxx = sBox.maxx; ((rectObj *)psFilterNode->psRightNode->pOther)->maxy = sBox.maxy; } else { msFree(pszSRS); psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } else if (strcasecmp(psXMLNode->pszValue, "DWithin") == 0 || strcasecmp(psXMLNode->pszValue, "Beyond") == 0) { shapeObj *psShape = NULL; int bPoint = 0, bLine = 0, bPolygon = 0; const char *pszUnits = NULL; const char *pszDistance = NULL; const char *pszPropertyName; char *pszSRS = NULL; CPLXMLNode *psGMLElement = NULL, *psDistance = NULL; pszPropertyName = FLTGetPropertyName(psXMLNode); psGMLElement = FLTFindGeometryNode(psXMLNode, &bPoint, &bLine, &bPolygon); psDistance = CPLGetXMLNode(psXMLNode, "Distance"); if (psDistance != NULL) pszDistance = CPLGetXMLValue(psDistance, NULL, NULL); if (pszPropertyName != NULL && psGMLElement && psDistance != NULL) { pszUnits = CPLGetXMLValue(psDistance, "units", NULL); if (pszUnits == NULL) /* FE 2.0 */ pszUnits = CPLGetXMLValue(psDistance, "uom", NULL); psShape = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(psShape); if (FLTShapeFromGMLTree(psGMLElement, psShape, &pszSRS)) { /*set the srs if available*/ if (pszSRS) psFilterNode->pszSRS = pszSRS; psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); if (bPoint) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_POINT; else if (bLine) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_LINE; else if (bPolygon) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_POLYGON; psFilterNode->psRightNode->pOther = (shapeObj *)psShape; /*the value will be distance;units*/ psFilterNode->psRightNode->pszValue = msStrdup(pszDistance); if (pszUnits) { psFilterNode->psRightNode->pszValue = msStringConcatenate(psFilterNode->psRightNode->pszValue, ";"); psFilterNode->psRightNode->pszValue = msStringConcatenate( psFilterNode->psRightNode->pszValue, pszUnits); } } else { free(psShape); msFree(pszSRS); psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else if (strcasecmp(psXMLNode->pszValue, "Intersect") == 0 || strcasecmp(psXMLNode->pszValue, "Intersects") == 0 || strcasecmp(psXMLNode->pszValue, "Equals") == 0 || strcasecmp(psXMLNode->pszValue, "Disjoint") == 0 || strcasecmp(psXMLNode->pszValue, "Touches") == 0 || strcasecmp(psXMLNode->pszValue, "Crosses") == 0 || strcasecmp(psXMLNode->pszValue, "Within") == 0 || strcasecmp(psXMLNode->pszValue, "Contains") == 0 || strcasecmp(psXMLNode->pszValue, "Overlaps") == 0) { shapeObj *psShape = NULL; int bLine = 0, bPolygon = 0, bPoint = 0; char *pszSRS = NULL; const char *pszPropertyName; CPLXMLNode *psGMLElement = NULL; pszPropertyName = FLTGetPropertyName(psXMLNode); psGMLElement = FLTFindGeometryNode(psXMLNode, &bPoint, &bLine, &bPolygon); if (pszPropertyName != NULL && psGMLElement) { psShape = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(psShape); if (FLTShapeFromGMLTree(psGMLElement, psShape, &pszSRS)) { /*set the srs if available*/ if (pszSRS) psFilterNode->pszSRS = pszSRS; psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); if (bPoint) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_POINT; else if (bLine) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_LINE; else if (bPolygon) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_POLYGON; psFilterNode->psRightNode->pOther = (shapeObj *)psShape; } else { free(psShape); msFree(pszSRS); psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } /* end of is spatial */ /* -------------------------------------------------------------------- */ /* Comparison Filter */ /* -------------------------------------------------------------------- */ else if (FLTIsComparisonFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_COMPARISON; /* -------------------------------------------------------------------- */ /* binary comaparison types. Example : */ /* */ /* */ /* */ /* SomeProperty */ /* 100 */ /* */ /* */ /* -------------------------------------------------------------------- */ if (FLTIsBinaryComparisonFilterType(psXMLNode->pszValue)) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); if (pszPropertyName != NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psTmpNode = CPLSearchXMLNode(psXMLNode, "Literal"); if (psTmpNode) { const char *pszLiteral = CPLGetXMLValue(psTmpNode, NULL, NULL); psFilterNode->psRightNode = FLTCreateBinaryCompFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_LITERAL; if (pszLiteral != NULL) { const char *pszMatchCase; psFilterNode->psRightNode->pszValue = msStrdup(pszLiteral); pszMatchCase = CPLGetXMLValue(psXMLNode, "matchCase", NULL); /*check if the matchCase attribute is set*/ if (pszMatchCase != NULL && strcasecmp(pszMatchCase, "false") == 0) { (*(int *)psFilterNode->psRightNode->pOther) = 1; } } /* special case where the user puts an empty value */ /* for the Literal so it can end up as an empty */ /* string query in the expression */ else psFilterNode->psRightNode->pszValue = NULL; } } if (psFilterNode->psLeftNode == NULL || psFilterNode->psRightNode == NULL) psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } /* -------------------------------------------------------------------- */ /* PropertyIsBetween filter : extract property name and boundary */ /* values. The boundary values are stored in the right */ /* node. The values are separated by a semi-column (;) */ /* Eg of Filter : */ /* */ /* DEPTH */ /* 400 */ /* 800 */ /* */ /* */ /* Or */ /* */ /* DEPTH */ /* 400 */ /* 800 */ /* */ /* -------------------------------------------------------------------- */ else if (strcasecmp(psXMLNode->pszValue, "PropertyIsBetween") == 0) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); CPLXMLNode *psLowerBoundary = CPLGetXMLNode(psXMLNode, "LowerBoundary"); CPLXMLNode *psUpperBoundary = CPLGetXMLNode(psXMLNode, "UpperBoundary"); const char *pszLowerNode = NULL; const char *pszUpperNode = NULL; if (psLowerBoundary != NULL) { /* check if the is there */ if (CPLGetXMLNode(psLowerBoundary, "Literal") != NULL) pszLowerNode = CPLGetXMLValue(psLowerBoundary, "Literal", NULL); else pszLowerNode = CPLGetXMLValue(psLowerBoundary, NULL, NULL); } if (psUpperBoundary != NULL) { if (CPLGetXMLNode(psUpperBoundary, "Literal") != NULL) pszUpperNode = CPLGetXMLValue(psUpperBoundary, "Literal", NULL); else pszUpperNode = CPLGetXMLValue(psUpperBoundary, NULL, NULL); } if (pszPropertyName != NULL && pszLowerNode != NULL && pszUpperNode != NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_BOUNDARY; /* adding a ; between boundary values */ const int nStrLength = strlen(pszLowerNode) + strlen(pszUpperNode) + 2; psFilterNode->psRightNode->pszValue = (char *)malloc(sizeof(char) * (nStrLength)); strcpy(psFilterNode->psRightNode->pszValue, pszLowerNode); strlcat(psFilterNode->psRightNode->pszValue, ";", nStrLength); strlcat(psFilterNode->psRightNode->pszValue, pszUpperNode, nStrLength); } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } /* end of PropertyIsBetween */ /* -------------------------------------------------------------------- */ /* PropertyIsLike */ /* */ /* */ /* */ /* LAST_NAME */ /* JOHN* */ /* */ /* */ /* -------------------------------------------------------------------- */ else if (strcasecmp(psXMLNode->pszValue, "PropertyIsLike") == 0) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); const char *pszLiteral = CPLGetXMLValue(psXMLNode, "Literal", NULL); const char *pszWildCard = CPLGetXMLValue(psXMLNode, "wildCard", NULL); const char *pszSingleChar = CPLGetXMLValue(psXMLNode, "singleChar", NULL); const char *pszEscapeChar = CPLGetXMLValue(psXMLNode, "escape", NULL); if (pszEscapeChar == NULL) pszEscapeChar = CPLGetXMLValue(psXMLNode, "escapeChar", NULL); if (pszPropertyName != NULL && pszLiteral != NULL && pszWildCard != NULL && pszSingleChar != NULL && pszEscapeChar != NULL) { FEPropertyIsLike *propIsLike; propIsLike = (FEPropertyIsLike *)malloc(sizeof(FEPropertyIsLike)); psFilterNode->pOther = propIsLike; propIsLike->bCaseInsensitive = 0; propIsLike->pszWildCard = msStrdup(pszWildCard); propIsLike->pszSingleChar = msStrdup(pszSingleChar); propIsLike->pszEscapeChar = msStrdup(pszEscapeChar); pszTmp = (char *)CPLGetXMLValue(psXMLNode, "matchCase", NULL); if (pszTmp && strcasecmp(pszTmp, "false") == 0) { propIsLike->bCaseInsensitive = 1; } /* -------------------------------------------------------------------- */ /* Create left and right node for the attribute and the value. */ /* -------------------------------------------------------------------- */ psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); psFilterNode->psRightNode->pszValue = msStrdup(pszLiteral); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_LITERAL; } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else if (strcasecmp(psXMLNode->pszValue, "PropertyIsNull") == 0) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); if (pszPropertyName != NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else if (strcasecmp(psXMLNode->pszValue, "PropertyIsNil") == 0) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); if (pszPropertyName != NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } /* -------------------------------------------------------------------- */ /* FeatureId Filter */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Note that for FES1.1.0 the featureid has been deprecated in */ /* favor of GmlObjectId */ /* */ /* */ /* And in FES 2.0, in favor of */ /* -------------------------------------------------------------------- */ else if (FLTIsFeatureIdFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_FEATUREID; pszFeatureIdList = NULL; psFeatureIdNode = psXMLNode; while (psFeatureIdNode) { pszFeatureId = CPLGetXMLValue(psFeatureIdNode, "fid", NULL); if (!pszFeatureId) pszFeatureId = CPLGetXMLValue(psFeatureIdNode, "id", NULL); if (!pszFeatureId) pszFeatureId = CPLGetXMLValue(psFeatureIdNode, "rid", NULL); if (pszFeatureId) { if (pszFeatureIdList) pszFeatureIdList = msStringConcatenate(pszFeatureIdList, ","); pszFeatureIdList = msStringConcatenate(pszFeatureIdList, pszFeatureId); } psFeatureIdNode = psFeatureIdNode->psNext; } if (pszFeatureIdList) { msFree(psFilterNode->pszValue); psFilterNode->pszValue = msStrdup(pszFeatureIdList); msFree(pszFeatureIdList); } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } /* -------------------------------------------------------------------- */ /* Temporal Filter. */ /* gml:TimeInstant 2005-05-17T00:00:00Z 2005-05-23T00:00:00Z */ /* -------------------------------------------------------------------- */ else if (FLTIsTemporalFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_TEMPORAL; if (strcasecmp(psXMLNode->pszValue, "During") == 0) { const char *pszPropertyName = NULL; const char *pszBeginTime; const char *pszEndTime; pszPropertyName = FLTGetPropertyName(psXMLNode); pszBeginTime = CPLGetXMLValue( psXMLNode, "TimePeriod.begin.TimeInstant.timePosition", NULL); if (pszBeginTime == NULL) pszBeginTime = CPLGetXMLValue(psXMLNode, "TimePeriod.beginPosition", NULL); pszEndTime = CPLGetXMLValue( psXMLNode, "TimePeriod.end.TimeInstant.timePosition", NULL); if (pszEndTime == NULL) pszEndTime = CPLGetXMLValue(psXMLNode, "TimePeriod.endPosition", NULL); if (pszPropertyName && pszBeginTime && pszEndTime && strchr(pszBeginTime, '\'') == NULL && strchr(pszBeginTime, '\\') == NULL && strchr(pszEndTime, '\'') == NULL && strchr(pszEndTime, '\\') == NULL && msTimeGetResolution(pszBeginTime) >= 0 && msTimeGetResolution(pszEndTime) >= 0) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_TIME_PERIOD; const size_t nSize = strlen(pszBeginTime) + strlen(pszEndTime) + 2; psFilterNode->psRightNode->pszValue = static_cast(msSmallMalloc(nSize)); snprintf(psFilterNode->psRightNode->pszValue, nSize, "%s/%s", pszBeginTime, pszEndTime); } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else { psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } /* end of is temporal */ } } /************************************************************************/ /* int FLTIsLogicalFilterType((char *pszValue) */ /* */ /* return TRUE if the value of the node is of logical filter */ /* encoding type. */ /************************************************************************/ int FLTIsLogicalFilterType(const char *pszValue) { if (pszValue) { if (strcasecmp(pszValue, "AND") == 0 || strcasecmp(pszValue, "OR") == 0 || strcasecmp(pszValue, "NOT") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsBinaryComparisonFilterType(char *pszValue) */ /* */ /* Binary comparison filter type. */ /************************************************************************/ int FLTIsBinaryComparisonFilterType(const char *pszValue) { if (pszValue) { if (strcasecmp(pszValue, "PropertyIsEqualTo") == 0 || strcasecmp(pszValue, "PropertyIsNotEqualTo") == 0 || strcasecmp(pszValue, "PropertyIsLessThan") == 0 || strcasecmp(pszValue, "PropertyIsGreaterThan") == 0 || strcasecmp(pszValue, "PropertyIsLessThanOrEqualTo") == 0 || strcasecmp(pszValue, "PropertyIsGreaterThanOrEqualTo") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsComparisonFilterType(char *pszValue) */ /* */ /* return TRUE if the value of the node is of comparison filter */ /* encoding type. */ /************************************************************************/ int FLTIsComparisonFilterType(const char *pszValue) { if (pszValue) { if (FLTIsBinaryComparisonFilterType(pszValue) || strcasecmp(pszValue, "PropertyIsLike") == 0 || strcasecmp(pszValue, "PropertyIsBetween") == 0 || strcasecmp(pszValue, "PropertyIsNull") == 0 || strcasecmp(pszValue, "PropertyIsNil") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsFeatureIdFilterType(char *pszValue) */ /* */ /* return TRUE if the value of the node is of featureid filter */ /* encoding type. */ /************************************************************************/ int FLTIsFeatureIdFilterType(const char *pszValue) { if (pszValue && (strcasecmp(pszValue, "FeatureId") == 0 || strcasecmp(pszValue, "GmlObjectId") == 0 || strcasecmp(pszValue, "ResourceId") == 0)) return MS_TRUE; return MS_FALSE; } /************************************************************************/ /* int FLTIsSpatialFilterType(char *pszValue) */ /* */ /* return TRUE if the value of the node is of spatial filter */ /* encoding type. */ /************************************************************************/ int FLTIsSpatialFilterType(const char *pszValue) { if (pszValue) { if (strcasecmp(pszValue, "BBOX") == 0 || strcasecmp(pszValue, "DWithin") == 0 || strcasecmp(pszValue, "Intersect") == 0 || strcasecmp(pszValue, "Intersects") == 0 || strcasecmp(pszValue, "Equals") == 0 || strcasecmp(pszValue, "Disjoint") == 0 || strcasecmp(pszValue, "Touches") == 0 || strcasecmp(pszValue, "Crosses") == 0 || strcasecmp(pszValue, "Within") == 0 || strcasecmp(pszValue, "Contains") == 0 || strcasecmp(pszValue, "Overlaps") == 0 || strcasecmp(pszValue, "Beyond") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsTemportalFilterType(char *pszValue) */ /* */ /* return TRUE if the value of the node is of temporal filter */ /* encoding type. */ /************************************************************************/ int FLTIsTemporalFilterType(const char *pszValue) { if (pszValue) { if (strcasecmp(pszValue, "During") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsSupportedFilterType(CPLXMLNode *psXMLNode) */ /* */ /* Verify if the value of the node is one of the supported */ /* filter type. */ /************************************************************************/ int FLTIsSupportedFilterType(CPLXMLNode *psXMLNode) { if (psXMLNode) { if (FLTIsLogicalFilterType(psXMLNode->pszValue) || FLTIsSpatialFilterType(psXMLNode->pszValue) || FLTIsComparisonFilterType(psXMLNode->pszValue) || FLTIsFeatureIdFilterType(psXMLNode->pszValue) || FLTIsTemporalFilterType(psXMLNode->pszValue)) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* FLTNumberOfFilterType */ /* */ /* Loop trhough the nodes and return the number of nodes of */ /* specified value. */ /************************************************************************/ int FLTNumberOfFilterType(FilterEncodingNode *psFilterNode, const char *szType) { int nCount = 0; int nLeftNode = 0, nRightNode = 0; if (!psFilterNode || !szType || !psFilterNode->pszValue) return 0; if (strcasecmp(psFilterNode->pszValue, (char *)szType) == 0) nCount++; if (psFilterNode->psLeftNode) nLeftNode = FLTNumberOfFilterType(psFilterNode->psLeftNode, szType); nCount += nLeftNode; if (psFilterNode->psRightNode) nRightNode = FLTNumberOfFilterType(psFilterNode->psRightNode, szType); nCount += nRightNode; return nCount; } /************************************************************************/ /* FLTValidForBBoxFilter */ /* */ /* Validate if there is only one BBOX filter node. Here is what */ /* is supported (is valid) : */ /* - one node which is a BBOX */ /* - a logical AND with a valid BBOX */ /* */ /* eg 1: */ /* */ /* Geometry */ /* */ /* 13.0983,31.5899 35.5472,42.8143*/ /* */ /* */ /* */ /* */ /* eg 2 : */ /* */ /* */ /* Geometry */ /* */ /* 13.0983,31.5899 35.5472,42.8143*/ /* */ /* */ /* */ /* SomeProperty */ /* 100 */ /* */ /* */ /* */ /* */ /************************************************************************/ int FLTValidForBBoxFilter(FilterEncodingNode *psFilterNode) { int nCount = 0; if (!psFilterNode || !psFilterNode->pszValue) return 1; nCount = FLTNumberOfFilterType(psFilterNode, "BBOX"); if (nCount > 1) return 0; else if (nCount == 0) return 1; /* nCount ==1 */ if (strcasecmp(psFilterNode->pszValue, "BBOX") == 0) return 1; if (strcasecmp(psFilterNode->pszValue, "AND") == 0) { return FLTValidForBBoxFilter(psFilterNode->psLeftNode) && FLTValidForBBoxFilter(psFilterNode->psRightNode); } return 0; } #if 0 static int FLTHasUniqueTopLevelDuringFilter(FilterEncodingNode *psFilterNode) { int nCount = 0; if (!psFilterNode || !psFilterNode->pszValue) return 1; nCount = FLTNumberOfFilterType(psFilterNode, "During"); if (nCount > 1) return 0; else if (nCount == 0) return 1; /* nCount ==1 */ if (strcasecmp(psFilterNode->pszValue, "During") == 0) return 1; if (strcasecmp(psFilterNode->pszValue, "AND") == 0) { return FLTHasUniqueTopLevelDuringFilter(psFilterNode->psLeftNode) && FLTHasUniqueTopLevelDuringFilter(psFilterNode->psRightNode); } return 0; } #endif int FLTIsLineFilter(FilterEncodingNode *psFilterNode) { if (!psFilterNode || !psFilterNode->pszValue) return 0; if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && psFilterNode->psRightNode && psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_GEOMETRY_LINE) return 1; return 0; } int FLTIsPolygonFilter(FilterEncodingNode *psFilterNode) { if (!psFilterNode || !psFilterNode->pszValue) return 0; if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && psFilterNode->psRightNode && psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_GEOMETRY_POLYGON) return 1; return 0; } int FLTIsPointFilter(FilterEncodingNode *psFilterNode) { if (!psFilterNode || !psFilterNode->pszValue) return 0; if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && psFilterNode->psRightNode && psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_GEOMETRY_POINT) return 1; return 0; } int FLTIsBBoxFilter(FilterEncodingNode *psFilterNode) { if (!psFilterNode || !psFilterNode->pszValue) return 0; if (strcasecmp(psFilterNode->pszValue, "BBOX") == 0) return 1; return 0; } shapeObj *FLTGetShape(FilterEncodingNode *psFilterNode, double *pdfDistance, int *pnUnit) { char **tokens = NULL; int nTokens = 0; FilterEncodingNode *psNode = psFilterNode; char *szUnitStr = NULL; char *szUnit = NULL; if (psNode) { if (psNode->eType == FILTER_NODE_TYPE_SPATIAL && psNode->psRightNode) psNode = psNode->psRightNode; if (FLTIsGeometryFilterNodeType(psNode->eType)) { if (psNode->pszValue && pdfDistance) { /* syntax expected is "distance;unit" or just "distance" if unit is there syntax is "URI#unit" (eg http://..../#m) or just "unit" */ tokens = msStringSplit(psNode->pszValue, ';', &nTokens); if (tokens && nTokens >= 1) { *pdfDistance = atof(tokens[0]); if (nTokens == 2 && pnUnit) { szUnitStr = msStrdup(tokens[1]); msFreeCharArray(tokens, nTokens); nTokens = 0; tokens = msStringSplit(szUnitStr, '#', &nTokens); msFree(szUnitStr); if (tokens && nTokens >= 1) { if (nTokens == 1) szUnit = tokens[0]; else szUnit = tokens[1]; if (strcasecmp(szUnit, "m") == 0 || strcasecmp(szUnit, "meters") == 0) *pnUnit = MS_METERS; else if (strcasecmp(szUnit, "km") == 0 || strcasecmp(szUnit, "kilometers") == 0) *pnUnit = MS_KILOMETERS; else if (strcasecmp(szUnit, "NM") == 0 || strcasecmp(szUnit, "nauticalmiles") == 0) *pnUnit = MS_NAUTICALMILES; else if (strcasecmp(szUnit, "mi") == 0 || strcasecmp(szUnit, "miles") == 0) *pnUnit = MS_MILES; else if (strcasecmp(szUnit, "in") == 0 || strcasecmp(szUnit, "inches") == 0) *pnUnit = MS_INCHES; else if (strcasecmp(szUnit, "ft") == 0 || strcasecmp(szUnit, "feet") == 0) *pnUnit = MS_FEET; else if (strcasecmp(szUnit, "deg") == 0 || strcasecmp(szUnit, "dd") == 0) *pnUnit = MS_DD; else if (strcasecmp(szUnit, "px") == 0) *pnUnit = MS_PIXELS; } } } msFreeCharArray(tokens, nTokens); } return (shapeObj *)psNode->pOther; } } return NULL; } /************************************************************************/ /* FLTGetBBOX */ /* */ /* Loop through the nodes are return the coordinates of the */ /* first bbox node found. The return value is the epsg code of */ /* the bbox. */ /************************************************************************/ const char *FLTGetBBOX(FilterEncodingNode *psFilterNode, rectObj *psRect) { const char *pszReturn = NULL; if (!psFilterNode || !psRect) return NULL; if (psFilterNode->pszValue && strcasecmp(psFilterNode->pszValue, "BBOX") == 0) { if (psFilterNode->psRightNode && psFilterNode->psRightNode->pOther) { rectObj *pRect = (rectObj *)psFilterNode->psRightNode->pOther; psRect->minx = pRect->minx; psRect->miny = pRect->miny; psRect->maxx = pRect->maxx; psRect->maxy = pRect->maxy; return psFilterNode->pszSRS; } } else { pszReturn = FLTGetBBOX(psFilterNode->psLeftNode, psRect); if (pszReturn) return pszReturn; else return FLTGetBBOX(psFilterNode->psRightNode, psRect); } return pszReturn; } const char *FLTGetDuring(FilterEncodingNode *psFilterNode, const char **ppszTimeField) { const char *pszReturn = NULL; if (!psFilterNode || !ppszTimeField) return NULL; if (psFilterNode->pszValue && strcasecmp(psFilterNode->pszValue, "During") == 0) { *ppszTimeField = psFilterNode->psLeftNode->pszValue; return psFilterNode->psRightNode->pszValue; } else { pszReturn = FLTGetDuring(psFilterNode->psLeftNode, ppszTimeField); if (pszReturn) return pszReturn; else return FLTGetDuring(psFilterNode->psRightNode, ppszTimeField); } return pszReturn; } /************************************************************************/ /* FLTGetSQLExpression */ /* */ /* Build SQL expressions from the mapserver nodes. */ /************************************************************************/ char *FLTGetSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { char *pszExpression = NULL; if (psFilterNode == NULL || lp == NULL) return NULL; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON) { if (psFilterNode->psLeftNode && psFilterNode->psRightNode) { if (FLTIsBinaryComparisonFilterType(psFilterNode->pszValue)) { pszExpression = FLTGetBinaryComparisonSQLExpresssion(psFilterNode, lp); } else if (strcasecmp(psFilterNode->pszValue, "PropertyIsBetween") == 0) { pszExpression = FLTGetIsBetweenComparisonSQLExpresssion(psFilterNode, lp); } else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) { pszExpression = FLTGetIsLikeComparisonSQLExpression(psFilterNode, lp); } } } else if (psFilterNode->eType == FILTER_NODE_TYPE_LOGICAL) { if (strcasecmp(psFilterNode->pszValue, "AND") == 0 || strcasecmp(psFilterNode->pszValue, "OR") == 0) { pszExpression = FLTGetLogicalComparisonSQLExpresssion(psFilterNode, lp); } else if (strcasecmp(psFilterNode->pszValue, "NOT") == 0) { pszExpression = FLTGetLogicalComparisonSQLExpresssion(psFilterNode, lp); } } else if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL) { /* TODO */ } else if (psFilterNode->eType == FILTER_NODE_TYPE_FEATUREID) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) if (psFilterNode->pszValue) { const char *pszAttribute = msOWSLookupMetadata(&(lp->metadata), "OFG", "featureid"); if (pszAttribute) { int nTokens = 0; char **tokens = msStringSplit(psFilterNode->pszValue, ',', &nTokens); int bString = 0; if (tokens && nTokens > 0) { for (int i = 0; i < nTokens; i++) { char *pszEscapedStr = NULL; const char *pszId = tokens[i]; const char *pszDot = strchr(pszId, '.'); if (pszDot) pszId = pszDot + 1; if (strlen(pszId) <= 0) continue; if (FLTIsNumeric(pszId) == MS_FALSE) bString = 1; pszEscapedStr = msLayerEscapeSQLParam(lp, pszId); char szTmp[256]; if (bString) { if (lp->connectiontype == MS_OGR || lp->connectiontype == MS_POSTGIS) snprintf(szTmp, sizeof(szTmp), "(CAST(%s AS CHARACTER(255)) = '%s')", pszAttribute, pszEscapedStr); else snprintf(szTmp, sizeof(szTmp), "(%s = '%s')", pszAttribute, pszEscapedStr); } else snprintf(szTmp, sizeof(szTmp), "(%s = %s)", pszAttribute, pszEscapedStr); msFree(pszEscapedStr); pszEscapedStr = NULL; if (pszExpression != NULL) pszExpression = msStringConcatenate(pszExpression, " OR "); else /*opening and closing brackets*/ pszExpression = msStringConcatenate(pszExpression, "("); pszExpression = msStringConcatenate(pszExpression, szTmp); } } msFreeCharArray(tokens, nTokens); } /*opening and closing brackets*/ if (pszExpression) pszExpression = msStringConcatenate(pszExpression, ")"); } #else msSetError(MS_MISCERR, "OWS support is not available.", "FLTGetSQLExpression()"); return NULL; #endif } else if (lp->connectiontype != MS_OGR && psFilterNode->eType == FILTER_NODE_TYPE_TEMPORAL) pszExpression = msStrdup(FLTGetTimeExpression(psFilterNode, lp).c_str()); return pszExpression; } /************************************************************************/ /* FLTGetLogicalComparisonSQLExpresssion */ /* */ /* Return the expression for logical comparison expression. */ /************************************************************************/ char *FLTGetLogicalComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp) { char *pszBuffer = NULL; char *pszTmp = NULL; if (lp == NULL) return NULL; /* ==================================================================== */ /* special case for BBOX node. */ /* ==================================================================== */ if (psFilterNode->psLeftNode && psFilterNode->psRightNode && ((strcasecmp(psFilterNode->psLeftNode->pszValue, "BBOX") == 0) || (strcasecmp(psFilterNode->psRightNode->pszValue, "BBOX") == 0))) { if (strcasecmp(psFilterNode->psLeftNode->pszValue, "BBOX") != 0) pszTmp = FLTGetSQLExpression(psFilterNode->psLeftNode, lp); else pszTmp = FLTGetSQLExpression(psFilterNode->psRightNode, lp); if (!pszTmp) return NULL; const size_t nSize = strlen(pszTmp) + 1; pszBuffer = (char *)malloc(nSize); snprintf(pszBuffer, nSize, "%s", pszTmp); } /* ==================================================================== */ /* special case for temporal filter node (OGR layer only) */ /* ==================================================================== */ else if (lp->connectiontype == MS_OGR && psFilterNode->psLeftNode && psFilterNode->psRightNode && (psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_TEMPORAL || psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_TEMPORAL)) { if (psFilterNode->psLeftNode->eType != FILTER_NODE_TYPE_TEMPORAL) pszTmp = FLTGetSQLExpression(psFilterNode->psLeftNode, lp); else pszTmp = FLTGetSQLExpression(psFilterNode->psRightNode, lp); if (!pszTmp) return NULL; const size_t nSize = strlen(pszTmp) + 1; pszBuffer = (char *)malloc(nSize); snprintf(pszBuffer, nSize, "%s", pszTmp); } /* -------------------------------------------------------------------- */ /* OR and AND */ /* -------------------------------------------------------------------- */ else if (psFilterNode->psLeftNode && psFilterNode->psRightNode) { pszTmp = FLTGetSQLExpression(psFilterNode->psLeftNode, lp); if (!pszTmp) return NULL; pszBuffer = (char *)malloc( sizeof(char) * (strlen(pszTmp) + strlen(psFilterNode->pszValue) + 5)); pszBuffer[0] = '\0'; strcat(pszBuffer, " ("); strcat(pszBuffer, pszTmp); strcat(pszBuffer, " "); strcat(pszBuffer, psFilterNode->pszValue); strcat(pszBuffer, " "); free(pszTmp); const size_t nTmp = strlen(pszBuffer); pszTmp = FLTGetSQLExpression(psFilterNode->psRightNode, lp); if (!pszTmp) { free(pszBuffer); return NULL; } pszBuffer = (char *)msSmallRealloc( pszBuffer, sizeof(char) * (strlen(pszTmp) + nTmp + 3)); strcat(pszBuffer, pszTmp); strcat(pszBuffer, ") "); } /* -------------------------------------------------------------------- */ /* NOT */ /* -------------------------------------------------------------------- */ else if (psFilterNode->psLeftNode && strcasecmp(psFilterNode->pszValue, "NOT") == 0) { pszTmp = FLTGetSQLExpression(psFilterNode->psLeftNode, lp); if (!pszTmp) return NULL; pszBuffer = (char *)malloc(sizeof(char) * (strlen(pszTmp) + 9)); pszBuffer[0] = '\0'; strcat(pszBuffer, " (NOT "); strcat(pszBuffer, pszTmp); strcat(pszBuffer, ") "); } else return NULL; /* -------------------------------------------------------------------- */ /* Cleanup. */ /* -------------------------------------------------------------------- */ if (pszTmp != NULL) free(pszTmp); return pszBuffer; } /************************************************************************/ /* FLTGetBinaryComparisonSQLExpresssion */ /* */ /* Return the expression for a binary comparison filter node. */ /************************************************************************/ char *FLTGetBinaryComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp) { const size_t bufferSize = 1024; char szBuffer[1024]; int bString = 0; char szTmp[256]; char *pszEscapedStr = NULL; szBuffer[0] = '\0'; if (!psFilterNode || !FLTIsBinaryComparisonFilterType(psFilterNode->pszValue)) return NULL; /* -------------------------------------------------------------------- */ /* check if the value is a numeric value or alphanumeric. If it */ /* is alphanumeric, add quotes around attribute and values. */ /* -------------------------------------------------------------------- */ bString = 0; if (psFilterNode->psRightNode->pszValue) { const char *pszOFGType; snprintf(szTmp, sizeof(szTmp), "%s_type", psFilterNode->psLeftNode->pszValue); pszOFGType = msOWSLookupMetadata(&(lp->metadata), "OFG", szTmp); if (pszOFGType != NULL && strcasecmp(pszOFGType, "Character") == 0) bString = 1; else if (FLTIsNumeric(psFilterNode->psRightNode->pszValue) == MS_FALSE) bString = 1; } /* special case to be able to have empty strings in the expression. */ if (psFilterNode->psRightNode->pszValue == NULL) bString = 1; /*opening bracket*/ strlcat(szBuffer, " (", bufferSize); pszEscapedStr = msLayerEscapePropertyName(lp, psFilterNode->psLeftNode->pszValue); /* attribute */ /*case insensitive set ? */ if (bString && strcasecmp(psFilterNode->pszValue, "PropertyIsEqualTo") == 0 && psFilterNode->psRightNode->pOther && (*(int *)psFilterNode->psRightNode->pOther) == 1) { snprintf(szTmp, sizeof(szTmp), "lower(%s) ", pszEscapedStr); strlcat(szBuffer, szTmp, bufferSize); } else strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; /* logical operator */ if (strcasecmp(psFilterNode->pszValue, "PropertyIsEqualTo") == 0) strlcat(szBuffer, "=", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsNotEqualTo") == 0) strlcat(szBuffer, "<>", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLessThan") == 0) strlcat(szBuffer, "<", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsGreaterThan") == 0) strlcat(szBuffer, ">", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLessThanOrEqualTo") == 0) strlcat(szBuffer, "<=", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsGreaterThanOrEqualTo") == 0) strlcat(szBuffer, ">=", bufferSize); strlcat(szBuffer, " ", bufferSize); /* value */ if (bString && psFilterNode->psRightNode->pszValue && strcasecmp(psFilterNode->pszValue, "PropertyIsEqualTo") == 0 && psFilterNode->psRightNode->pOther && (*(int *)psFilterNode->psRightNode->pOther) == 1) { char *pszEscapedStr; pszEscapedStr = msLayerEscapeSQLParam(lp, psFilterNode->psRightNode->pszValue); snprintf(szTmp, sizeof(szTmp), "lower('%s') ", pszEscapedStr); msFree(pszEscapedStr); strlcat(szBuffer, szTmp, bufferSize); } else { if (bString) strlcat(szBuffer, "'", bufferSize); if (psFilterNode->psRightNode->pszValue) { if (bString) { char *pszEscapedStr; pszEscapedStr = msLayerEscapeSQLParam(lp, psFilterNode->psRightNode->pszValue); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; } else strlcat(szBuffer, psFilterNode->psRightNode->pszValue, bufferSize); } if (bString) strlcat(szBuffer, "'", bufferSize); } /*closing bracket*/ strlcat(szBuffer, ") ", bufferSize); return msStrdup(szBuffer); } /************************************************************************/ /* FLTGetIsBetweenComparisonSQLExpresssion */ /* */ /* Build an SQL expression for IsBteween Filter. */ /************************************************************************/ char *FLTGetIsBetweenComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp) { const size_t bufferSize = 1024; char szBuffer[1024]; char **aszBounds = NULL; int nBounds = 0; int bString = 0; char szTmp[256]; char *pszEscapedStr; szBuffer[0] = '\0'; if (!psFilterNode || !(strcasecmp(psFilterNode->pszValue, "PropertyIsBetween") == 0)) return NULL; if (!psFilterNode->psLeftNode || !psFilterNode->psRightNode) return NULL; /* -------------------------------------------------------------------- */ /* Get the bounds value which are stored like boundmin;boundmax */ /* -------------------------------------------------------------------- */ aszBounds = msStringSplit(psFilterNode->psRightNode->pszValue, ';', &nBounds); if (nBounds != 2) { msFreeCharArray(aszBounds, nBounds); return NULL; } /* -------------------------------------------------------------------- */ /* check if the value is a numeric value or alphanumeric. If it */ /* is alphanumeric, add quotes around attribute and values. */ /* -------------------------------------------------------------------- */ bString = 0; if (aszBounds[0]) { const char *pszOFGType; snprintf(szTmp, sizeof(szTmp), "%s_type", psFilterNode->psLeftNode->pszValue); pszOFGType = msOWSLookupMetadata(&(lp->metadata), "OFG", szTmp); if (pszOFGType != NULL && strcasecmp(pszOFGType, "Character") == 0) bString = 1; else if (FLTIsNumeric(aszBounds[0]) == MS_FALSE) bString = 1; } if (!bString) { if (aszBounds[1]) { if (FLTIsNumeric(aszBounds[1]) == MS_FALSE) bString = 1; } } /* -------------------------------------------------------------------- */ /* build expression. */ /* -------------------------------------------------------------------- */ /*opening parenthesis */ strlcat(szBuffer, " (", bufferSize); /* attribute */ pszEscapedStr = msLayerEscapePropertyName(lp, psFilterNode->psLeftNode->pszValue); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; /*between*/ strlcat(szBuffer, " BETWEEN ", bufferSize); /*bound 1*/ if (bString) strlcat(szBuffer, "'", bufferSize); pszEscapedStr = msLayerEscapeSQLParam(lp, aszBounds[0]); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; if (bString) strlcat(szBuffer, "'", bufferSize); strlcat(szBuffer, " AND ", bufferSize); /*bound 2*/ if (bString) strlcat(szBuffer, "'", bufferSize); pszEscapedStr = msLayerEscapeSQLParam(lp, aszBounds[1]); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; if (bString) strlcat(szBuffer, "'", bufferSize); /*closing parenthesis*/ strlcat(szBuffer, ")", bufferSize); msFreeCharArray(aszBounds, nBounds); return msStrdup(szBuffer); } /************************************************************************/ /* FLTGetIsLikeComparisonSQLExpression */ /* */ /* Build an sql expression for IsLike filter. */ /************************************************************************/ char *FLTGetIsLikeComparisonSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { const size_t bufferSize = 1024; char szBuffer[1024]; char *pszValue = NULL; const char *pszWild = NULL; const char *pszSingle = NULL; const char *pszEscape = NULL; char szTmp[4]; int nLength = 0, i = 0, j = 0; int bCaseInsensitive = 0; char *pszEscapedStr = NULL; FEPropertyIsLike *propIsLike; if (!psFilterNode || !psFilterNode->pOther || !psFilterNode->psLeftNode || !psFilterNode->psRightNode || !psFilterNode->psRightNode->pszValue) return NULL; propIsLike = (FEPropertyIsLike *)psFilterNode->pOther; pszWild = propIsLike->pszWildCard; pszSingle = propIsLike->pszSingleChar; pszEscape = propIsLike->pszEscapeChar; bCaseInsensitive = propIsLike->bCaseInsensitive; if (!pszWild || strlen(pszWild) == 0 || !pszSingle || strlen(pszSingle) == 0 || !pszEscape || strlen(pszEscape) == 0) return NULL; if (pszEscape[0] == '\'') { /* This might be valid, but the risk of SQL injection is too high */ /* and the below code is not ready for that */ /* Someone who does this has clearly suspect intentions ! */ msSetError( MS_MISCERR, "Single quote character is not allowed as an escaping character.", "FLTGetIsLikeComparisonSQLExpression()"); return NULL; } szBuffer[0] = '\0'; /*opening bracket*/ strlcat(szBuffer, " (", bufferSize); /* attribute name */ pszEscapedStr = msLayerEscapePropertyName(lp, psFilterNode->psLeftNode->pszValue); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; if (lp->connectiontype == MS_POSTGIS) { if (bCaseInsensitive == 1) strlcat(szBuffer, "::text ilike '", bufferSize); else strlcat(szBuffer, "::text like '", bufferSize); } else strlcat(szBuffer, " like '", bufferSize); pszValue = psFilterNode->psRightNode->pszValue; nLength = strlen(pszValue); pszEscapedStr = (char *)msSmallMalloc(3 * nLength + 1); for (i = 0, j = 0; i < nLength; i++) { char c = pszValue[i]; if (c != pszWild[0] && c != pszSingle[0] && c != pszEscape[0]) { if (c == '\'') { pszEscapedStr[j++] = '\''; pszEscapedStr[j++] = '\''; } else if (c == '\\') { pszEscapedStr[j++] = '\\'; pszEscapedStr[j++] = '\\'; } else pszEscapedStr[j++] = c; } else if (c == pszSingle[0]) { pszEscapedStr[j++] = '_'; } else if (c == pszEscape[0]) { pszEscapedStr[j++] = pszEscape[0]; if (i + 1 < nLength) { char nextC = pszValue[i + 1]; i++; if (nextC == '\'') { pszEscapedStr[j++] = '\''; pszEscapedStr[j++] = '\''; } else pszEscapedStr[j++] = nextC; } } else if (c == pszWild[0]) { pszEscapedStr[j++] = '%'; } } pszEscapedStr[j++] = 0; strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); strlcat(szBuffer, "'", bufferSize); if (lp->connectiontype != MS_OGR) { if (lp->connectiontype == MS_POSTGIS && pszEscape[0] == '\\') strlcat(szBuffer, " escape E'", bufferSize); else strlcat(szBuffer, " escape '", bufferSize); szTmp[0] = pszEscape[0]; if (pszEscape[0] == '\\') { szTmp[1] = '\\'; szTmp[2] = '\''; szTmp[3] = '\0'; } else { szTmp[1] = '\''; szTmp[2] = '\0'; } strlcat(szBuffer, szTmp, bufferSize); } strlcat(szBuffer, ") ", bufferSize); return msStrdup(szBuffer); } /************************************************************************/ /* FLTHasSpatialFilter */ /* */ /* Utility function to see if a spatial filter is included in */ /* the node. */ /************************************************************************/ int FLTHasSpatialFilter(FilterEncodingNode *psNode) { int bResult = MS_FALSE; if (!psNode) return MS_FALSE; if (psNode->eType == FILTER_NODE_TYPE_LOGICAL) { if (psNode->psLeftNode) bResult = FLTHasSpatialFilter(psNode->psLeftNode); if (bResult) return MS_TRUE; if (psNode->psRightNode) bResult = FLTHasSpatialFilter(psNode->psRightNode); if (bResult) return MS_TRUE; } else if (FLTIsBBoxFilter(psNode) || FLTIsPointFilter(psNode) || FLTIsLineFilter(psNode) || FLTIsPolygonFilter(psNode)) return MS_TRUE; return MS_FALSE; } /************************************************************************/ /* FLTCreateFeatureIdFilterEncoding */ /* */ /* Utility function to create a filter node of FeatureId type. */ /************************************************************************/ FilterEncodingNode *FLTCreateFeatureIdFilterEncoding(const char *pszString) { FilterEncodingNode *psFilterNode = NULL; if (pszString) { psFilterNode = FLTCreateFilterEncodingNode(); psFilterNode->eType = FILTER_NODE_TYPE_FEATUREID; psFilterNode->pszValue = msStrdup(pszString); return psFilterNode; } return NULL; } /************************************************************************/ /* FLTParseGMLBox */ /* */ /* Parse gml box. Used for FE 1.0 */ /************************************************************************/ int FLTParseGMLBox(CPLXMLNode *psBox, rectObj *psBbox, char **ppszSRS) { int bCoordinatesValid = 0; CPLXMLNode *psCoordinates = NULL; CPLXMLNode *psCoord1 = NULL, *psCoord2 = NULL; char **papszCoords = NULL, **papszMin = NULL, **papszMax = NULL; int nCoords = 0, nCoordsMin = 0, nCoordsMax = 0; const char *pszTmpCoord = NULL; const char *pszSRS = NULL; const char *pszTS = NULL; const char *pszCS = NULL; double minx = 0.0, miny = 0.0, maxx = 0.0, maxy = 0.0; if (psBox) { pszSRS = CPLGetXMLValue(psBox, "srsName", NULL); if (ppszSRS && pszSRS) *ppszSRS = msStrdup(pszSRS); psCoordinates = CPLGetXMLNode(psBox, "coordinates"); pszTS = CPLGetXMLValue(psCoordinates, "ts", NULL); if (pszTS == NULL) pszTS = " "; pszCS = CPLGetXMLValue(psCoordinates, "cs", NULL); if (pszCS == NULL) pszCS = ","; pszTmpCoord = CPLGetXMLValue(psCoordinates, NULL, NULL); if (pszTmpCoord) { papszCoords = msStringSplit(pszTmpCoord, pszTS[0], &nCoords); if (papszCoords && nCoords == 2) { papszMin = msStringSplit(papszCoords[0], pszCS[0], &nCoordsMin); if (papszMin && nCoordsMin == 2) { papszMax = msStringSplit(papszCoords[1], pszCS[0], &nCoordsMax); } if (papszMax && nCoordsMax == 2) { bCoordinatesValid = 1; minx = atof(papszMin[0]); miny = atof(papszMin[1]); maxx = atof(papszMax[0]); maxy = atof(papszMax[1]); } msFreeCharArray(papszMin, nCoordsMin); msFreeCharArray(papszMax, nCoordsMax); } msFreeCharArray(papszCoords, nCoords); } else { psCoord1 = CPLGetXMLNode(psBox, "coord"); psCoord2 = FLTGetNextSibblingNode(psCoord1); if (psCoord1 && psCoord2 && strcmp(psCoord2->pszValue, "coord") == 0) { const char *pszX = CPLGetXMLValue(psCoord1, "X", NULL); const char *pszY = CPLGetXMLValue(psCoord1, "Y", NULL); if (pszX && pszY) { minx = atof(pszX); miny = atof(pszY); pszX = CPLGetXMLValue(psCoord2, "X", NULL); pszY = CPLGetXMLValue(psCoord2, "Y", NULL); if (pszX && pszY) { maxx = atof(pszX); maxy = atof(pszY); bCoordinatesValid = 1; } } } } } if (bCoordinatesValid) { psBbox->minx = minx; psBbox->miny = miny; psBbox->maxx = maxx; psBbox->maxy = maxy; } return bCoordinatesValid; } /************************************************************************/ /* FLTParseGMLEnvelope */ /* */ /* Utility function to parse a gml:Envelope (used for SOS and FE1.1)*/ /************************************************************************/ int FLTParseGMLEnvelope(CPLXMLNode *psRoot, rectObj *psBbox, char **ppszSRS) { CPLXMLNode *psUpperCorner = NULL, *psLowerCorner = NULL; const char *pszLowerCorner = NULL, *pszUpperCorner = NULL; int bValid = 0; char **tokens; int n; if (psRoot && psBbox && psRoot->eType == CXT_Element && EQUAL(psRoot->pszValue, "Envelope")) { /*Get the srs if available*/ if (ppszSRS) { const char *pszSRS = CPLGetXMLValue(psRoot, "srsName", NULL); if (pszSRS != NULL) *ppszSRS = msStrdup(pszSRS); } psLowerCorner = CPLSearchXMLNode(psRoot, "lowerCorner"); psUpperCorner = CPLSearchXMLNode(psRoot, "upperCorner"); if (psLowerCorner && psUpperCorner) { pszLowerCorner = CPLGetXMLValue(psLowerCorner, NULL, NULL); pszUpperCorner = CPLGetXMLValue(psUpperCorner, NULL, NULL); if (pszLowerCorner && pszUpperCorner) { tokens = msStringSplit(pszLowerCorner, ' ', &n); if (tokens && n >= 2) { psBbox->minx = atof(tokens[0]); psBbox->miny = atof(tokens[1]); msFreeCharArray(tokens, n); tokens = msStringSplit(pszUpperCorner, ' ', &n); if (tokens && n >= 2) { psBbox->maxx = atof(tokens[0]); psBbox->maxy = atof(tokens[1]); bValid = 1; } } msFreeCharArray(tokens, n); } } } return bValid; } /************************************************************************/ /* FLTNeedSRSSwapping */ /************************************************************************/ static int FLTNeedSRSSwapping(mapObj *map, const char *pszSRS) { int bNeedSwapping = MS_FALSE; projectionObj sProjTmp; msInitProjection(&sProjTmp); if (map) { msProjectionInheritContextFrom(&sProjTmp, &map->projection); } if (msLoadProjectionStringEPSG(&sProjTmp, pszSRS) == 0) { bNeedSwapping = msIsAxisInvertedProj(&sProjTmp); } msFreeProjection(&sProjTmp); return bNeedSwapping; } /************************************************************************/ /* FLTDoAxisSwappingIfNecessary */ /* */ /* Explore all geometries and BBOX to do axis swapping when the */ /* SRS requires it. If no explicit SRS is attached to the geometry */ /* the bDefaultSRSNeedsAxisSwapping is taken into account. The */ /* caller will have to determine its value from a more general */ /* context. */ /************************************************************************/ void FLTDoAxisSwappingIfNecessary(mapObj *map, FilterEncodingNode *psFilterNode, int bDefaultSRSNeedsAxisSwapping) { if (psFilterNode == NULL) return; if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_BBOX) { rectObj *rect = (rectObj *)psFilterNode->psRightNode->pOther; const char *pszSRS = psFilterNode->pszSRS; if ((pszSRS != NULL && FLTNeedSRSSwapping(map, pszSRS)) || (pszSRS == NULL && bDefaultSRSNeedsAxisSwapping)) { double tmp; tmp = rect->minx; rect->minx = rect->miny; rect->miny = tmp; tmp = rect->maxx; rect->maxx = rect->maxy; rect->maxy = tmp; } } else if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && FLTIsGeometryFilterNodeType(psFilterNode->psRightNode->eType)) { shapeObj *shape = (shapeObj *)(psFilterNode->psRightNode->pOther); const char *pszSRS = psFilterNode->pszSRS; if ((pszSRS != NULL && FLTNeedSRSSwapping(map, pszSRS)) || (pszSRS == NULL && bDefaultSRSNeedsAxisSwapping)) { msAxisSwapShape(shape); } } else { FLTDoAxisSwappingIfNecessary(map, psFilterNode->psLeftNode, bDefaultSRSNeedsAxisSwapping); FLTDoAxisSwappingIfNecessary(map, psFilterNode->psRightNode, bDefaultSRSNeedsAxisSwapping); } } static void FLTReplacePropertyName(FilterEncodingNode *psFilterNode, const char *pszOldName, const char *pszNewName) { if (psFilterNode && pszOldName && pszNewName) { if (psFilterNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (psFilterNode->pszValue && strcasecmp(psFilterNode->pszValue, pszOldName) == 0) { msFree(psFilterNode->pszValue); psFilterNode->pszValue = msStrdup(pszNewName); } } if (psFilterNode->psLeftNode) FLTReplacePropertyName(psFilterNode->psLeftNode, pszOldName, pszNewName); if (psFilterNode->psRightNode) FLTReplacePropertyName(psFilterNode->psRightNode, pszOldName, pszNewName); } } static int FLTIsGMLDefaultProperty(const char *pszName) { return (strcmp(pszName, "gml:name") == 0 || strcmp(pszName, "gml:description") == 0 || strcmp(pszName, "gml:descriptionReference") == 0 || strcmp(pszName, "gml:identifier") == 0 || strcmp(pszName, "gml:boundedBy") == 0 || strcmp(pszName, "@gml:id") == 0); } static void FLTStripNameSpacesFromPropertyName(FilterEncodingNode *psFilterNode) { char **tokens = NULL; int n = 0; if (psFilterNode) { if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME && FLTIsGMLDefaultProperty(psFilterNode->psLeftNode->pszValue)) { return; } if (psFilterNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (psFilterNode->pszValue && strstr(psFilterNode->pszValue, ":")) { tokens = msStringSplit(psFilterNode->pszValue, ':', &n); if (tokens && n == 2) { msFree(psFilterNode->pszValue); psFilterNode->pszValue = msStrdup(tokens[1]); } msFreeCharArray(tokens, n); } } if (psFilterNode->psLeftNode) FLTStripNameSpacesFromPropertyName(psFilterNode->psLeftNode); if (psFilterNode->psRightNode) FLTStripNameSpacesFromPropertyName(psFilterNode->psRightNode); } } static void FLTRemoveGroupName(FilterEncodingNode *psFilterNode, gmlGroupListObj *groupList) { int i; if (psFilterNode) { if (psFilterNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (psFilterNode->pszValue != NULL) { const char *pszPropertyName = psFilterNode->pszValue; const char *pszSlash = strchr(pszPropertyName, '/'); if (pszSlash != NULL) { const char *pszColon = strchr(pszPropertyName, ':'); if (pszColon != NULL && pszColon < pszSlash) pszPropertyName = pszColon + 1; for (i = 0; i < groupList->numgroups; i++) { const char *pszGroupName = groupList->groups[i].name; size_t nGroupNameLen = strlen(pszGroupName); if (strncasecmp(pszPropertyName, pszGroupName, nGroupNameLen) == 0 && pszPropertyName[nGroupNameLen] == '/') { char *pszTmp; pszPropertyName = pszPropertyName + nGroupNameLen + 1; pszColon = strchr(pszPropertyName, ':'); if (pszColon != NULL) pszPropertyName = pszColon + 1; pszTmp = msStrdup(pszPropertyName); msFree(psFilterNode->pszValue); psFilterNode->pszValue = pszTmp; break; } } } } } if (psFilterNode->psLeftNode) FLTRemoveGroupName(psFilterNode->psLeftNode, groupList); if (psFilterNode->psRightNode) FLTRemoveGroupName(psFilterNode->psRightNode, groupList); } } /************************************************************************/ /* FLTPreParseFilterForAliasAndGroup */ /* */ /* Utility function to replace aliased' and grouped attributes */ /* with their internal name. */ /************************************************************************/ void FLTPreParseFilterForAliasAndGroup(FilterEncodingNode *psFilterNode, mapObj *map, int i, const char *namespaces) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) if (psFilterNode && map && i >= 0 && i < map->numlayers) { /*strip name spaces before hand*/ FLTStripNameSpacesFromPropertyName(psFilterNode); layerObj *lp = GET_LAYER(map, i); int layerWasOpened = msLayerIsOpen(lp); if (msLayerOpen(lp) == MS_SUCCESS && msLayerGetItems(lp) == MS_SUCCESS) { /* Remove group names from property names if using groupname/itemname * syntax */ gmlGroupListObj *groupList = msGMLGetGroups(lp, namespaces); if (groupList && groupList->numgroups > 0) FLTRemoveGroupName(psFilterNode, groupList); msGMLFreeGroups(groupList); for (i = 0; i < lp->numitems; i++) { if (!lp->items[i] || strlen(lp->items[i]) <= 0) continue; char szTmp[256]; snprintf(szTmp, sizeof(szTmp), "%s_alias", lp->items[i]); const char *pszFullName = msOWSLookupMetadata(&(lp->metadata), namespaces, szTmp); if (pszFullName) { FLTReplacePropertyName(psFilterNode, pszFullName, lp->items[i]); } } if (!layerWasOpened) /* do not close the layer if it has been opened somewhere else (paging?) */ msLayerClose(lp); } } #else msSetError(MS_MISCERR, "OWS support is not available.", "FLTPreParseFilterForAlias()"); #endif } /************************************************************************/ /* FLTCheckFeatureIdFilters */ /* */ /* Check that FeatureId filters match features in the active */ /* layer. */ /************************************************************************/ int FLTCheckFeatureIdFilters(FilterEncodingNode *psFilterNode, mapObj *map, int i) { int status = MS_SUCCESS; if (psFilterNode->eType == FILTER_NODE_TYPE_FEATUREID) { char **tokens; int nTokens = 0; layerObj *lp; int j; lp = GET_LAYER(map, i); tokens = msStringSplit(psFilterNode->pszValue, ',', &nTokens); for (j = 0; j < nTokens; j++) { const char *pszId = tokens[j]; const char *pszDot = strrchr(pszId, '.'); if (pszDot) { if (static_cast(pszDot - pszId) != strlen(lp->name) || strncasecmp(pszId, lp->name, strlen(lp->name)) != 0) { msSetError(MS_MISCERR, "Feature id %s not consistent with feature type name %s.", "FLTPreParseFilterForAlias()", pszId, lp->name); status = MS_FAILURE; break; } } } msFreeCharArray(tokens, nTokens); } if (psFilterNode->psLeftNode) { status = FLTCheckFeatureIdFilters(psFilterNode->psLeftNode, map, i); if (status == MS_SUCCESS) { if (psFilterNode->psRightNode) status = FLTCheckFeatureIdFilters(psFilterNode->psRightNode, map, i); } } return status; } /************************************************************************/ /* FLTCheckInvalidOperand */ /* */ /* Check that the operand of a comparison operator is valid */ /* Currently only detects use of boundedBy in a binary comparison */ /************************************************************************/ int FLTCheckInvalidOperand(FilterEncodingNode *psFilterNode) { int status = MS_SUCCESS; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (strcmp(psFilterNode->psLeftNode->pszValue, "gml:boundedBy") == 0 && strcmp(psFilterNode->pszValue, "PropertyIsNull") != 0 && strcmp(psFilterNode->pszValue, "PropertyIsNil") != 0) { msSetError(MS_MISCERR, "Operand '%s' is invalid in comparison.", "FLTCheckInvalidOperand()", psFilterNode->psLeftNode->pszValue); return MS_FAILURE; } } if (psFilterNode->psLeftNode) { status = FLTCheckInvalidOperand(psFilterNode->psLeftNode); if (status == MS_SUCCESS) { if (psFilterNode->psRightNode) status = FLTCheckInvalidOperand(psFilterNode->psRightNode); } } return status; } /************************************************************************/ /* FLTProcessPropertyIsNull */ /* */ /* HACK for PropertyIsNull processing. PostGIS & Spatialite only */ /* for now. */ /************************************************************************/ int FLTProcessPropertyIsNull(FilterEncodingNode *psFilterNode, mapObj *map, int i) { int status = MS_SUCCESS; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME && strcmp(psFilterNode->pszValue, "PropertyIsNull") == 0 && !FLTIsGMLDefaultProperty(psFilterNode->psLeftNode->pszValue)) { layerObj *lp; int layerWasOpened; lp = GET_LAYER(map, i); layerWasOpened = msLayerIsOpen(lp); /* Horrible HACK to compensate for the lack of null testing in MapServer */ if (lp->connectiontype == MS_POSTGIS || (lp->connectiontype == MS_OGR && msOGRSupportsIsNull(lp))) { msFree(psFilterNode->pszValue); psFilterNode->pszValue = msStrdup("PropertyIsEqualTo"); psFilterNode->psRightNode = FLTCreateBinaryCompFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_LITERAL; psFilterNode->psRightNode->pszValue = msStrdup("_MAPSERVER_NULL_"); } if (!layerWasOpened) /* do not close the layer if it has been opened somewhere else (paging?) */ msLayerClose(lp); } if (psFilterNode->psLeftNode) { status = FLTProcessPropertyIsNull(psFilterNode->psLeftNode, map, i); if (status == MS_SUCCESS) { if (psFilterNode->psRightNode) status = FLTProcessPropertyIsNull(psFilterNode->psRightNode, map, i); } } return status; } /************************************************************************/ /* FLTCheckInvalidProperty */ /* */ /* Check that property names are known */ /************************************************************************/ int FLTCheckInvalidProperty(FilterEncodingNode *psFilterNode, mapObj *map, int i) { int status = MS_SUCCESS; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { layerObj *lp; int layerWasOpened; int bFound = MS_FALSE; if ((strcmp(psFilterNode->pszValue, "PropertyIsNull") == 0 || strcmp(psFilterNode->pszValue, "PropertyIsNil") == 0) && FLTIsGMLDefaultProperty(psFilterNode->psLeftNode->pszValue)) { return MS_SUCCESS; } lp = GET_LAYER(map, i); layerWasOpened = msLayerIsOpen(lp); if ((layerWasOpened || msLayerOpen(lp) == MS_SUCCESS) && msLayerGetItems(lp) == MS_SUCCESS) { int i; gmlItemListObj *items = msGMLGetItems(lp, "G"); for (i = 0; i < items->numitems; i++) { if (!items->items[i].name || strlen(items->items[i].name) == 0 || !items->items[i].visible) continue; if (strcasecmp(items->items[i].name, psFilterNode->psLeftNode->pszValue) == 0) { bFound = MS_TRUE; break; } } msGMLFreeItems(items); } if (!layerWasOpened) /* do not close the layer if it has been opened somewhere else (paging?) */ msLayerClose(lp); if (!bFound) { msSetError(MS_MISCERR, "Property '%s' is unknown.", "FLTCheckInvalidProperty()", psFilterNode->psLeftNode->pszValue); return MS_FAILURE; } } if (psFilterNode->psLeftNode) { status = FLTCheckInvalidProperty(psFilterNode->psLeftNode, map, i); if (status == MS_SUCCESS) { if (psFilterNode->psRightNode) status = FLTCheckInvalidProperty(psFilterNode->psRightNode, map, i); } } return status; } /************************************************************************/ /* FLTSimplify */ /* */ /* Simplify the expression by removing parts that evaluate to */ /* constants. */ /* The passed psFilterNode is potentially consumed by the function */ /* and replaced by the returned value. */ /* If the function returns NULL, *pnEvaluation = MS_FALSE means */ /* that the filter evaluates to FALSE, or MS_TRUE that it */ /* evaluates to TRUE */ /************************************************************************/ FilterEncodingNode *FLTSimplify(FilterEncodingNode *psFilterNode, int *pnEvaluation) { *pnEvaluation = -1; /* There are no nullable or nillable property in WFS currently */ /* except gml:name or gml:description that are null */ if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && (strcmp(psFilterNode->pszValue, "PropertyIsNull") == 0 || strcmp(psFilterNode->pszValue, "PropertyIsNil") == 0) && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (strcmp(psFilterNode->pszValue, "PropertyIsNull") == 0 && FLTIsGMLDefaultProperty(psFilterNode->psLeftNode->pszValue) && strcmp(psFilterNode->psLeftNode->pszValue, "@gml:id") != 0 && strcmp(psFilterNode->psLeftNode->pszValue, "gml:boundedBy") != 0) *pnEvaluation = MS_TRUE; else *pnEvaluation = MS_FALSE; FLTFreeFilterEncodingNode(psFilterNode); return NULL; } if (psFilterNode->eType == FILTER_NODE_TYPE_LOGICAL && strcasecmp(psFilterNode->pszValue, "NOT") == 0 && psFilterNode->psLeftNode != NULL) { int nEvaluation; psFilterNode->psLeftNode = FLTSimplify(psFilterNode->psLeftNode, &nEvaluation); if (psFilterNode->psLeftNode == NULL) { *pnEvaluation = 1 - nEvaluation; FLTFreeFilterEncodingNode(psFilterNode); return NULL; } } if (psFilterNode->eType == FILTER_NODE_TYPE_LOGICAL && (strcasecmp(psFilterNode->pszValue, "AND") == 0 || strcasecmp(psFilterNode->pszValue, "OR") == 0) && psFilterNode->psLeftNode != NULL && psFilterNode->psRightNode != NULL) { FilterEncodingNode *psOtherNode; int nEvaluation; int nExpectedValForFastExit; psFilterNode->psLeftNode = FLTSimplify(psFilterNode->psLeftNode, &nEvaluation); if (strcasecmp(psFilterNode->pszValue, "AND") == 0) nExpectedValForFastExit = MS_FALSE; else nExpectedValForFastExit = MS_TRUE; if (psFilterNode->psLeftNode == NULL) { if (nEvaluation == nExpectedValForFastExit) { *pnEvaluation = nEvaluation; FLTFreeFilterEncodingNode(psFilterNode); return NULL; } psOtherNode = psFilterNode->psRightNode; psFilterNode->psRightNode = NULL; FLTFreeFilterEncodingNode(psFilterNode); return FLTSimplify(psOtherNode, pnEvaluation); } psFilterNode->psRightNode = FLTSimplify(psFilterNode->psRightNode, &nEvaluation); if (psFilterNode->psRightNode == NULL) { if (nEvaluation == nExpectedValForFastExit) { *pnEvaluation = nEvaluation; FLTFreeFilterEncodingNode(psFilterNode); return NULL; } psOtherNode = psFilterNode->psLeftNode; psFilterNode->psLeftNode = NULL; FLTFreeFilterEncodingNode(psFilterNode); return FLTSimplify(psOtherNode, pnEvaluation); } } return psFilterNode; } #ifdef USE_LIBXML2 xmlNodePtr FLTGetCapabilities(xmlNsPtr psNsParent, xmlNsPtr psNsOgc, int bTemporal) { xmlNodePtr psRootNode = NULL, psNode = NULL, psSubNode = NULL, psSubSubNode = NULL; psRootNode = xmlNewNode(psNsParent, BAD_CAST "Filter_Capabilities"); psNode = xmlNewChild(psRootNode, psNsOgc, BAD_CAST "Spatial_Capabilities", NULL); psSubNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "GeometryOperands", NULL); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "GeometryOperand", BAD_CAST "gml:Point"); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "GeometryOperand", BAD_CAST "gml:LineString"); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "GeometryOperand", BAD_CAST "gml:Polygon"); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "GeometryOperand", BAD_CAST "gml:Envelope"); psSubNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "SpatialOperators", NULL); #ifdef USE_GEOS psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Equals"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Disjoint"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Touches"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Within"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Overlaps"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Crosses"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Intersects"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Contains"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "DWithin"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Beyond"); #endif psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "BBOX"); if (bTemporal) { psNode = xmlNewChild(psRootNode, psNsOgc, BAD_CAST "Temporal_Capabilities", NULL); psSubNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "TemporalOperands", NULL); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "TemporalOperand", BAD_CAST "gml:TimePeriod"); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "TemporalOperand", BAD_CAST "gml:TimeInstant"); psSubNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "TemporalOperators", NULL); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "TemporalOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "TM_Equals"); } psNode = xmlNewChild(psRootNode, psNsOgc, BAD_CAST "Scalar_Capabilities", NULL); xmlNewChild(psNode, psNsOgc, BAD_CAST "LogicalOperators", NULL); psNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperators", NULL); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "LessThan"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "GreaterThan"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "LessThanEqualTo"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "GreaterThanEqualTo"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "EqualTo"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "NotEqualTo"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "Like"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "Between"); psNode = xmlNewChild(psRootNode, psNsOgc, BAD_CAST "Id_Capabilities", NULL); xmlNewChild(psNode, psNsOgc, BAD_CAST "EID", NULL); xmlNewChild(psNode, psNsOgc, BAD_CAST "FID", NULL); return psRootNode; } #endif mapserver-8.4.0/src/mapogcfilter.h000066400000000000000000000202601474174441300171540ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC Filter Encoding implementation * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2003, Y. Assefa, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #ifndef MAPOGCFILTER_H #define MAPOGCFILTER_H #include "mapserver.h" /* There is a dependency to OGR for the MiniXML parser */ #include "cpl_minixml.h" #ifdef USE_LIBXML2 #include #include #endif #ifdef __cplusplus extern "C" { #endif typedef struct { char *pszWildCard; char *pszSingleChar; char *pszEscapeChar; int bCaseInsensitive; } FEPropertyIsLike; /* -------------------------------------------------------------------- */ /* prototypes. */ /* -------------------------------------------------------------------- */ MS_DLL_EXPORT int FLTIsNumeric(const char *pszValue); MS_DLL_EXPORT int FLTApplyExpressionToLayer(layerObj *lp, const char *pszExpression); MS_DLL_EXPORT char *FLTGetExpressionForValuesRanges(layerObj *lp, const char *item, const char *value, int forcecharcter); MS_DLL_EXPORT FilterEncodingNode * FLTParseFilterEncoding(const char *szXMLString); MS_DLL_EXPORT FilterEncodingNode *FLTCreateFilterEncodingNode(void); MS_DLL_EXPORT char **FLTSplitFilters(const char *pszStr, int *pnTokens); MS_DLL_EXPORT int FLTApplyFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); MS_DLL_EXPORT int FLTLayerApplyCondSQLFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); MS_DLL_EXPORT int FLTLayerApplyPlainFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); MS_DLL_EXPORT void FLTFreeFilterEncodingNode(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTValidFilterNode(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTValidForBBoxFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTNumberOfFilterType(FilterEncodingNode *psFilterNode, const char *szType); MS_DLL_EXPORT int FLTIsBBoxFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTIsPointFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTIsLineFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTIsPolygonFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTValidForPropertyIsLikeFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTIsOnlyPropertyIsLike(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT void FLTInsertElementInNode(FilterEncodingNode *psFilterNode, CPLXMLNode *psXMLNode); MS_DLL_EXPORT int FLTIsLogicalFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsBinaryComparisonFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsComparisonFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsFeatureIdFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsSpatialFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsTemporalFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsSupportedFilterType(CPLXMLNode *psXMLNode); MS_DLL_EXPORT const char *FLTGetBBOX(FilterEncodingNode *psFilterNode, rectObj *psRect); const char *FLTGetDuring(FilterEncodingNode *psFilterNode, const char **ppszTimeField); MS_DLL_EXPORT shapeObj *FLTGetShape(FilterEncodingNode *psFilterNode, double *pdfDistance, int *pnUnit); MS_DLL_EXPORT int FLTHasSpatialFilter(FilterEncodingNode *psFilterNode); /*SQL expressions related functions.*/ MS_DLL_EXPORT int FLTApplySimpleSQLFilter(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); MS_DLL_EXPORT char *FLTGetSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT char * FLTGetBinaryComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT char * FLTGetIsBetweenComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT char * FLTGetIsLikeComparisonSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT char * FLTGetLogicalComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT int FLTIsSimpleFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT FilterEncodingNode * FLTCreateFeatureIdFilterEncoding(const char *pszString); MS_DLL_EXPORT int FLTParseGMLEnvelope(CPLXMLNode *psRoot, rectObj *psBbox, char **ppszSRS); MS_DLL_EXPORT int FLTParseGMLBox(CPLXMLNode *psBox, rectObj *psBbox, char **ppszSRS); /*common-expressions*/ MS_DLL_EXPORT char *FLTGetCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT int FLTApplyFilterToLayerCommonExpression(mapObj *map, int iLayerIndex, const char *pszExpression); #ifdef USE_LIBXML2 MS_DLL_EXPORT xmlNodePtr FLTGetCapabilities(xmlNsPtr psNsParent, xmlNsPtr psNsOgc, int bTemporal); #endif void FLTDoAxisSwappingIfNecessary(mapObj *map, FilterEncodingNode *psFilterNode, int bDefaultSRSNeedsAxisSwapping); void FLTPreParseFilterForAliasAndGroup(FilterEncodingNode *psFilterNode, mapObj *map, int i, const char *namespaces); int FLTCheckFeatureIdFilters(FilterEncodingNode *psFilterNode, mapObj *map, int i); int FLTCheckInvalidOperand(FilterEncodingNode *psFilterNode); int FLTCheckInvalidProperty(FilterEncodingNode *psFilterNode, mapObj *map, int i); FilterEncodingNode *FLTSimplify(FilterEncodingNode *psFilterNode, int *pnEvaluation); int FLTApplyFilterToLayerCommonExpressionWithRect(mapObj *map, int iLayerIndex, const char *pszExpression, rectObj rect); int FLTProcessPropertyIsNull(FilterEncodingNode *psFilterNode, mapObj *map, int i); int FLTLayerSetInvalidRectIfSupported(layerObj *lp, rectObj *rect, const char *metadata_namespaces); #ifdef __cplusplus } std::string FLTGetTimeExpression(FilterEncodingNode *psFilterNode, layerObj *lp); #endif #endif mapserver-8.4.0/src/mapogcfiltercommon.cpp000066400000000000000000000537731474174441300207370ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC Filter Encoding implementation * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2003, Y. Assefa, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapogcfilter.h" #include "mapserver.h" #include "mapows.h" #include "mapowscommon.h" #include "cpl_minixml.h" #include static std::string FLTGetIsLikeComparisonCommonExpression(FilterEncodingNode *psFilterNode) { /* From * http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_04 */ /* also add double quote because we are within a string */ const char *pszRegexSpecialCharsAndDoubleQuote = "\\^${[().*+?|\""; if (!psFilterNode || !psFilterNode->pOther || !psFilterNode->psLeftNode || !psFilterNode->psRightNode || !psFilterNode->psRightNode->pszValue) return std::string(); const FEPropertyIsLike *propIsLike = (const FEPropertyIsLike *)psFilterNode->pOther; const char *pszWild = propIsLike->pszWildCard; const char *pszSingle = propIsLike->pszSingleChar; const char *pszEscape = propIsLike->pszEscapeChar; const bool bCaseInsensitive = propIsLike->bCaseInsensitive != 0; if (!pszWild || strlen(pszWild) == 0 || !pszSingle || strlen(pszSingle) == 0 || !pszEscape || strlen(pszEscape) == 0) return std::string(); /* -------------------------------------------------------------------- */ /* Use operand with regular expressions. */ /* -------------------------------------------------------------------- */ std::string expr("(\"["); /* attribute */ expr += psFilterNode->psLeftNode->pszValue; /* #3521 */ if (bCaseInsensitive) expr += "]\" ~* \""; else expr += "]\" ~ \""; const char *pszValue = psFilterNode->psRightNode->pszValue; const size_t nLength = strlen(pszValue); if (nLength > 0) { expr += '^'; } for (size_t i = 0; i < nLength; i++) { if (pszValue[i] == pszSingle[0]) { expr += '.'; /* The Filter escape character is supposed to only escape the single, * wildcard and escape character */ } else if (pszValue[i] == pszEscape[0] && (pszValue[i + 1] == pszSingle[0] || pszValue[i + 1] == pszWild[0] || pszValue[i + 1] == pszEscape[0])) { if (pszValue[i + 1] == '\\') { /* Tricky case: \ must be escaped ncce in the regular expression context so that the regexp matches it as an ordinary character. But as \ is also the escape character for MapServer string, we must escape it again. */ expr += "\\" "\\" "\\" "\\"; } else { /* If the escaped character is itself a regular expression special * character */ /* we need to regular-expression-escape-it ! */ if (strchr(pszRegexSpecialCharsAndDoubleQuote, pszValue[i + 1])) { expr += '\\'; } expr += pszValue[i + 1]; } i++; } else if (pszValue[i] == pszWild[0]) { expr += ".*"; } /* Escape regular expressions special characters and double quote */ else if (strchr(pszRegexSpecialCharsAndDoubleQuote, pszValue[i])) { if (pszValue[i] == '\\') { /* See above explantation */ expr += "\\" "\\" "\\" "\\"; } else { expr += '\\'; expr += pszValue[i]; } } else { expr += pszValue[i]; } } if (nLength > 0) { expr += '$'; } expr += "\")"; return expr; } static std::string FLTGetIsBetweenComparisonCommonExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp) { if (psFilterNode->psLeftNode == NULL || psFilterNode->psRightNode == NULL) return std::string(); /* -------------------------------------------------------------------- */ /* Get the bounds value which are stored like boundmin;boundmax */ /* -------------------------------------------------------------------- */ const auto bounds = msStringSplit(psFilterNode->psRightNode->pszValue, ';'); if (bounds.size() != 2) { return std::string(); } /* -------------------------------------------------------------------- */ /* check if the value is a numeric value or alphanumeric. If it */ /* is alphanumeric, add quotes around attribute and values. */ /* -------------------------------------------------------------------- */ bool bString = false; bool bDateTime = false; const char *pszType = msOWSLookupMetadata( &(lp->metadata), "OFG", (std::string(psFilterNode->psLeftNode->pszValue) + "_type").c_str()); if (pszType != NULL && (strcasecmp(pszType, "Character") == 0)) bString = true; else if (pszType != NULL && (strcasecmp(pszType, "Date") == 0)) bDateTime = true; else if (FLTIsNumeric(bounds[0].c_str()) == MS_FALSE) bString = true; if (!bString && !bDateTime) { if (FLTIsNumeric(bounds[1].c_str()) == MS_FALSE) bString = true; } std::string expr; /* -------------------------------------------------------------------- */ /* build expression. */ /* -------------------------------------------------------------------- */ /* attribute */ if (bString) expr += "(\"["; else expr += "(["; expr += psFilterNode->psLeftNode->pszValue; if (bString) expr += "]\" "; else expr += "] "; expr += " >= "; if (bString) { expr += '\"'; } else if (bDateTime) { expr += '`'; } expr += msStdStringEscape(bounds[0].c_str()); if (bString) { expr += '\"'; } else if (bDateTime) { expr += '`'; } expr += " AND "; if (bString) expr += " \"["; else expr += " ["; /* attribute */ expr += psFilterNode->psLeftNode->pszValue; if (bString) expr += "]\" "; else expr += "] "; expr += " <= "; if (bString) { expr += '\"'; } else if (bDateTime) { expr += '`'; } expr += msStdStringEscape(bounds[1].c_str()); if (bString) { expr += '\"'; } else if (bDateTime) { expr += '`'; } expr += ')'; return expr; } static std::string FLTGetBinaryComparisonCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { /* -------------------------------------------------------------------- */ /* check if the value is a numeric value or alphanumeric. If it */ /* is alphanumeric, add quotes around attribute and values. */ /* -------------------------------------------------------------------- */ bool bString = false; bool bDateTime = false; if (psFilterNode->psRightNode->pszValue) { const char *pszType = msOWSLookupMetadata( &(lp->metadata), "OFG", (std::string(psFilterNode->psLeftNode->pszValue) + "_type").c_str()); if (pszType != NULL && (strcasecmp(pszType, "Character") == 0)) bString = true; else if (pszType != NULL && (strcasecmp(pszType, "Date") == 0)) bDateTime = true; else if (FLTIsNumeric(psFilterNode->psRightNode->pszValue) == MS_FALSE) bString = true; } /* special case to be able to have empty strings in the expression. */ /* propertyislike is always treated as string */ if (psFilterNode->psRightNode->pszValue == NULL || strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) bString = true; /* attribute */ std::string expr; if (bString) expr = "(\"["; else expr = "(["; expr += psFilterNode->psLeftNode->pszValue; if (bString) expr += "]\" "; else expr += "] "; if (strcasecmp(psFilterNode->pszValue, "PropertyIsEqualTo") == 0) { /* case insensitive set ? */ if (psFilterNode->psRightNode->pOther && (*(int *)psFilterNode->psRightNode->pOther) == 1) expr += "=*"; else expr += "="; } else if (strcasecmp(psFilterNode->pszValue, "PropertyIsNotEqualTo") == 0) expr += "!="; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLessThan") == 0) expr += "<"; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsGreaterThan") == 0) expr += ">"; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLessThanOrEqualTo") == 0) expr += "<="; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsGreaterThanOrEqualTo") == 0) expr += ">="; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) expr += "~"; expr += ' '; /* value */ if (bString) { expr += "\""; } else if (bDateTime) { expr += "`"; } if (psFilterNode->psRightNode->pszValue) { expr += msStdStringEscape(psFilterNode->psRightNode->pszValue); } if (bString) { expr += "\""; } else if (bDateTime) { expr += "`"; } expr += ")"; return expr; } static std::string FLTGetLogicalComparisonCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { std::string expr; /* -------------------------------------------------------------------- */ /* OR and AND */ /* -------------------------------------------------------------------- */ if (psFilterNode->psLeftNode && psFilterNode->psRightNode) { char *pszTmp = FLTGetCommonExpression(psFilterNode->psLeftNode, lp); if (!pszTmp) return std::string(); expr = '('; expr += pszTmp; msFree(pszTmp); expr += ' '; expr += psFilterNode->pszValue; expr += ' '; pszTmp = FLTGetCommonExpression(psFilterNode->psRightNode, lp); if (!pszTmp) { return std::string(); } expr += pszTmp; msFree(pszTmp); expr += ')'; } /* -------------------------------------------------------------------- */ /* NOT */ /* -------------------------------------------------------------------- */ else if (psFilterNode->psLeftNode && strcasecmp(psFilterNode->pszValue, "NOT") == 0) { char *pszTmp = FLTGetCommonExpression(psFilterNode->psLeftNode, lp); if (!pszTmp) return std::string(); expr = "(NOT "; expr += pszTmp; msFree(pszTmp); expr += ')'; } return expr; } static std::string FLTGetSpatialComparisonCommonExpression(FilterEncodingNode *psNode, layerObj *lp) { std::string expr; double dfDistance = -1; shapeObj *psTmpShape = NULL; bool bBBoxQuery = false; bool bAlreadyReprojected = false; if (lp == NULL) return std::string(); /* get the shape */ if (FLTIsBBoxFilter(psNode)) { rectObj sQueryRect; FLTGetBBOX(psNode, &sQueryRect); char szPolygon[512]; snprintf(szPolygon, sizeof(szPolygon), "POLYGON((%.18f %.18f,%.18f %.18f,%.18f %.18f,%.18f %.18f,%.18f " "%.18f))", sQueryRect.minx, sQueryRect.miny, sQueryRect.minx, sQueryRect.maxy, sQueryRect.maxx, sQueryRect.maxy, sQueryRect.maxx, sQueryRect.miny, sQueryRect.minx, sQueryRect.miny); psTmpShape = msShapeFromWKT(szPolygon); /* ** This is a horrible hack to deal with world-extent requests and ** reprojection. msProjectRect() detects if reprojection from longlat to ** projected SRS, and in that case it transforms the bbox to *-1e-15,-1e-15,1e15,1e15 ** to ensure that all features are returned. ** ** Make wfs_200_cite_filter_bbox_world.xml and *wfs_200_cite_postgis_bbox_world.xml pass */ if (fabs(sQueryRect.minx - -180.0) < 1e-5 && fabs(sQueryRect.miny - -90.0) < 1e-5 && fabs(sQueryRect.maxx - 180.0) < 1e-5 && fabs(sQueryRect.maxy - 90.0) < 1e-5) { if (lp->projection.numargs > 0) { projectionObj sProjTmp; if (psNode->pszSRS) { msInitProjection(&sProjTmp); msProjectionInheritContextFrom(&sProjTmp, &lp->projection); } if (psNode->pszSRS) { /* Use the non EPSG variant since axis swapping is done in * FLTDoAxisSwappingIfNecessary */ if (msLoadProjectionString(&sProjTmp, psNode->pszSRS) == 0) { msProjectRect(&sProjTmp, &lp->projection, &sQueryRect); } } else if (lp->map->projection.numargs > 0) msProjectRect(&lp->map->projection, &lp->projection, &sQueryRect); if (psNode->pszSRS) msFreeProjection(&sProjTmp); } if (sQueryRect.minx <= -1e14) { msFreeShape(psTmpShape); msFree(psTmpShape); psTmpShape = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(psTmpShape); msRectToPolygon(sQueryRect, psTmpShape); bAlreadyReprojected = true; } } bBBoxQuery = true; } else { /* other geos type operations */ /* project shape to layer projection. If the proj is not part of the filter query, assume that the cooredinates are in the map projection */ int nUnit = -1; shapeObj *psQueryShape = FLTGetShape(psNode, &dfDistance, &nUnit); if ((strcasecmp(psNode->pszValue, "DWithin") == 0 || strcasecmp(psNode->pszValue, "Beyond") == 0) && dfDistance > 0) { int nLayerUnit = lp->units; if (nLayerUnit == -1) nLayerUnit = GetMapserverUnitUsingProj(&lp->projection); if (nLayerUnit == -1) nLayerUnit = lp->map->units; if (nLayerUnit == -1) nLayerUnit = GetMapserverUnitUsingProj(&lp->map->projection); if (nUnit >= 0 && nUnit != nLayerUnit) dfDistance *= msInchesPerUnit(nUnit, 0) / msInchesPerUnit(nLayerUnit, 0); /* target is layer units */ } psTmpShape = psQueryShape; } if (psTmpShape) { /* ** target is layer projection */ if (!bAlreadyReprojected && lp->projection.numargs > 0) { projectionObj sProjTmp; if (psNode->pszSRS) { msInitProjection(&sProjTmp); msProjectionInheritContextFrom(&sProjTmp, &lp->projection); } if (psNode->pszSRS) { /* Use the non EPSG variant since axis swapping is done in * FLTDoAxisSwappingIfNecessary */ if (msLoadProjectionString(&sProjTmp, psNode->pszSRS) == 0) { msProjectShape(&sProjTmp, &lp->projection, psTmpShape); } } else if (lp->map->projection.numargs > 0) msProjectShape(&lp->map->projection, &lp->projection, psTmpShape); if (psNode->pszSRS) msFreeProjection(&sProjTmp); } /* function name */ if (bBBoxQuery) { expr = "intersects"; } else { if (strncasecmp(psNode->pszValue, "intersect", 9) == 0) expr = "intersects"; else { expr = msStringToLower(std::string(psNode->pszValue)); } } /* geometry binding */ expr += "([shape],fromText('"; /* filter geometry */ char *pszWktText = msGEOSShapeToWKT(psTmpShape); expr += pszWktText ? pszWktText : "Cannot translate shape to WKT"; expr += "')"; msGEOSFreeWKT(pszWktText); /* (optional) beyond/dwithin distance, always 0.0 since we apply the * distance as a buffer earlier */ if ((strcasecmp(psNode->pszValue, "DWithin") == 0 || strcasecmp(psNode->pszValue, "Beyond") == 0)) { char szBuffer[32]; snprintf(szBuffer, sizeof(szBuffer), ",%g", dfDistance); expr += szBuffer; } /* terminate the function */ expr += ") = TRUE"; } /* ** Cleanup */ if (bBBoxQuery) { msFreeShape(psTmpShape); msFree(psTmpShape); } return expr; } static std::string FLTGetFeatureIdCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { std::string expr; #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) if (psFilterNode->pszValue) { const char *pszAttribute = msOWSLookupMetadata(&(lp->metadata), "OFG", "featureid"); if (pszAttribute) { const auto tokens = msStringSplit(psFilterNode->pszValue, ','); if (!tokens.empty()) { for (size_t i = 0; i < tokens.size(); i++) { const char *pszId = tokens[i].c_str(); const char *pszDot = strrchr(pszId, '.'); if (pszDot) pszId = pszDot + 1; bool bString = false; if (i == 0) { if (FLTIsNumeric(pszId) == MS_FALSE) bString = true; } if (!expr.empty()) expr += " OR "; else expr = '('; if (bString) { expr += "(\"["; expr += pszAttribute; expr += "]\" == \""; expr += pszId; expr += "\")"; } else { expr += "(["; expr += pszAttribute; expr += "] == "; expr += pszId; expr += ")"; } } } } /* opening and closing brackets are needed for mapserver expressions */ if (!expr.empty()) expr += ')'; } #endif return expr; } std::string FLTGetTimeExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { if (lp == NULL) return std::string(); std::string expr; const char *pszTimeField = nullptr; const char *pszTimeValue = FLTGetDuring(psFilterNode, &pszTimeField); if (pszTimeField && pszTimeValue) { expressionObj old_filter; msInitExpression(&old_filter); msCopyExpression(&old_filter, &lp->filter); /* save existing filter */ msFreeExpression(&lp->filter); if (msLayerSetTimeFilter(lp, pszTimeValue, pszTimeField) == MS_TRUE && lp->filter.string) { expr = lp->filter.string; } msCopyExpression(&lp->filter, &old_filter); /* restore old filter */ msFreeExpression(&old_filter); } return expr; } char *FLTGetCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { char *pszExpression = NULL; if (!psFilterNode) return NULL; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON) { if (psFilterNode->psLeftNode && psFilterNode->psRightNode) { if (FLTIsBinaryComparisonFilterType(psFilterNode->pszValue)) pszExpression = msStrdup( FLTGetBinaryComparisonCommonExpression(psFilterNode, lp).c_str()); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) pszExpression = msStrdup( FLTGetIsLikeComparisonCommonExpression(psFilterNode).c_str()); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsBetween") == 0) pszExpression = msStrdup( FLTGetIsBetweenComparisonCommonExpresssion(psFilterNode, lp) .c_str()); } } else if (psFilterNode->eType == FILTER_NODE_TYPE_LOGICAL) { pszExpression = msStrdup( FLTGetLogicalComparisonCommonExpression(psFilterNode, lp).c_str()); } else if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL) { pszExpression = msStrdup( FLTGetSpatialComparisonCommonExpression(psFilterNode, lp).c_str()); } else if (psFilterNode->eType == FILTER_NODE_TYPE_FEATUREID) { pszExpression = msStrdup(FLTGetFeatureIdCommonExpression(psFilterNode, lp).c_str()); } else if (psFilterNode->eType == FILTER_NODE_TYPE_TEMPORAL) { pszExpression = msStrdup(FLTGetTimeExpression(psFilterNode, lp).c_str()); } return pszExpression; } int FLTApplyFilterToLayerCommonExpression(mapObj *map, int iLayerIndex, const char *pszExpression) { return FLTApplyFilterToLayerCommonExpressionWithRect( map, iLayerIndex, pszExpression, map->extent); } /* rect must be in map->projection */ int FLTApplyFilterToLayerCommonExpressionWithRect(mapObj *map, int iLayerIndex, const char *pszExpression, rectObj rect) { int retval; const int save_startindex = map->query.startindex; const int save_maxfeatures = map->query.maxfeatures; const int save_only_cache_result_count = map->query.only_cache_result_count; const int save_cache_shapes = map->query.cache_shapes; const int save_max_cached_shape_count = map->query.max_cached_shape_count; const int save_max_cached_shape_ram_amount = map->query.max_cached_shape_ram_amount; msInitQuery(&(map->query)); map->query.startindex = save_startindex; map->query.maxfeatures = save_maxfeatures; map->query.only_cache_result_count = save_only_cache_result_count; map->query.cache_shapes = save_cache_shapes; map->query.max_cached_shape_count = save_max_cached_shape_count; map->query.max_cached_shape_ram_amount = save_max_cached_shape_ram_amount; map->query.mode = MS_QUERY_MULTIPLE; map->query.layer = iLayerIndex; map->query.rect = rect; if (pszExpression) { map->query.type = MS_QUERY_BY_FILTER; msInitExpression(&map->query.filter); map->query.filter.string = msStrdup(pszExpression); map->query.filter.type = MS_EXPRESSION; /* a logical expression */ retval = msQueryByFilter(map); } else { map->query.type = MS_QUERY_BY_RECT; retval = msQueryByRect(map); } return retval; } mapserver-8.4.0/src/mapogcsld.cpp000066400000000000000000006736361474174441300170310ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC SLD implementation * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2003, Y. Assefa, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapogcsld.h" #include "mapogcfilter.h" #include "mapserver.h" #include "mapows.h" #include "mapcopy.h" #include "cpl_string.h" extern "C" { extern int yyparse(parseObj *); } static inline void IGUR_sizet(size_t ignored) { (void)ignored; } /* Ignore GCC Unused Result */ #define SLD_LINE_SYMBOL_NAME "sld_line_symbol" #define SLD_LINE_SYMBOL_DASH_NAME "sld_line_symbol_dash" #define SLD_MARK_SYMBOL_SQUARE "sld_mark_symbol_square" #define SLD_MARK_SYMBOL_SQUARE_FILLED "sld_mark_symbol_square_filled" #define SLD_MARK_SYMBOL_CIRCLE "sld_mark_symbol_circle" #define SLD_MARK_SYMBOL_CIRCLE_FILLED "sld_mark_symbol_circle_filled" #define SLD_MARK_SYMBOL_TRIANGLE "sld_mark_symbol_triangle" #define SLD_MARK_SYMBOL_TRIANGLE_FILLED "sld_mark_symbol_triangle_filled" #define SLD_MARK_SYMBOL_STAR "sld_mark_symbol_star" #define SLD_MARK_SYMBOL_STAR_FILLED "sld_mark_symbol_star_filled" #define SLD_MARK_SYMBOL_CROSS "sld_mark_symbol_cross" #define SLD_MARK_SYMBOL_CROSS_FILLED "sld_mark_symbol_cross_filled" #define SLD_MARK_SYMBOL_X "sld_mark_symbol_x" #define SLD_MARK_SYMBOL_X_FILLED "sld_mark_symbol_x_filled" /************************************************************************/ /* msSLDApplySLDURL */ /* */ /* Use the SLD document given through a URL and apply the SLD */ /* on the map. Layer name and Named Layer's name parameter are */ /* used to do the match. */ /************************************************************************/ int msSLDApplySLDURL(mapObj *map, const char *szURL, int iLayer, const char *pszStyleLayerName, char **ppszLayerNames) { /* needed for libcurl function msHTTPGetFile in maphttp.c */ #if defined(USE_CURL) char *pszSLDTmpFile = NULL; int status = 0; char *pszSLDbuf = NULL; FILE *fp = NULL; int nStatus = MS_FAILURE; if (map && szURL) { map->sldurl = (char *)szURL; pszSLDTmpFile = msTmpFile(map, map->mappath, NULL, "sld.xml"); if (pszSLDTmpFile == NULL) { pszSLDTmpFile = msTmpFile(map, NULL, NULL, "sld.xml"); } if (pszSLDTmpFile == NULL) { msSetError( MS_WMSERR, "Could not determine temporary file. Please make sure that the " "temporary path is set. The temporary path can be defined for " "example by setting TEMPPATH in the map file. Please check the " "MapServer documentation on temporary path settings.", "msSLDApplySLDURL()"); } else { int nMaxRemoteSLDBytes; const char *pszMaxRemoteSLDBytes = msOWSLookupMetadata( &(map->web.metadata), "MO", "remote_sld_max_bytes"); if (!pszMaxRemoteSLDBytes) { nMaxRemoteSLDBytes = 1024 * 1024; /* 1 megaByte */ } else { nMaxRemoteSLDBytes = atoi(pszMaxRemoteSLDBytes); } if (msHTTPGetFile(szURL, pszSLDTmpFile, &status, -1, 0, 0, nMaxRemoteSLDBytes) == MS_SUCCESS) { if ((fp = fopen(pszSLDTmpFile, "rb")) != NULL) { int nBufsize = 0; fseek(fp, 0, SEEK_END); nBufsize = ftell(fp); if (nBufsize > 0) { rewind(fp); pszSLDbuf = (char *)malloc((nBufsize + 1) * sizeof(char)); if (pszSLDbuf == NULL) { msSetError(MS_MEMERR, "Failed to open SLD file.", "msSLDApplySLDURL()"); } else { IGUR_sizet(fread(pszSLDbuf, 1, nBufsize, fp)); pszSLDbuf[nBufsize] = '\0'; } } else { msSetError(MS_WMSERR, "Could not open SLD %s as it appears empty", "msSLDApplySLDURL", szURL); } fclose(fp); unlink(pszSLDTmpFile); } } else { unlink(pszSLDTmpFile); msSetError( MS_WMSERR, "Could not open SLD %s and save it in a temporary file. Please " "make sure that the sld url is valid and that the temporary path " "is set. The temporary path can be defined for example by setting " "TEMPPATH in the map file. Please check the MapServer " "documentation on temporary path settings.", "msSLDApplySLDURL", szURL); } msFree(pszSLDTmpFile); if (pszSLDbuf) nStatus = msSLDApplySLD(map, pszSLDbuf, iLayer, pszStyleLayerName, ppszLayerNames); } map->sldurl = NULL; } msFree(pszSLDbuf); return nStatus; #else msSetError(MS_MISCERR, "WMS/WFS client support is not enabled .", "msSLDApplySLDURL()"); return (MS_FAILURE); #endif } /************************************************************************/ /* msSLDApplyFromFile */ /* */ /* Apply SLD from a file on disk to the layerObj */ /************************************************************************/ int msSLDApplyFromFile(mapObj *map, layerObj *layer, const char *filename) { FILE *fp = NULL; int nStatus = MS_FAILURE; /* open SLD file */ char szPath[MS_MAXPATHLEN]; char *pszSLDbuf = NULL; const char *realpath = msBuildPath(szPath, map->mappath, filename); if ((fp = fopen(realpath, "rb")) != NULL) { int nBufsize = 0; fseek(fp, 0, SEEK_END); nBufsize = ftell(fp); if (nBufsize > 0) { rewind(fp); pszSLDbuf = (char *)malloc((nBufsize + 1) * sizeof(char)); if (pszSLDbuf == NULL) { msSetError(MS_MEMERR, "Failed to read SLD file.", "msSLDApplyFromFile()"); } else { IGUR_sizet(fread(pszSLDbuf, 1, nBufsize, fp)); pszSLDbuf[nBufsize] = '\0'; } } else { msSetError(MS_IOERR, "Could not open SLD %s as it appears empty", "msSLDApplyFromFile", realpath); } fclose(fp); } if (pszSLDbuf) { // if not set, then use the first NamedStyle in the SLD file // even if the names don't match const char *pszMetadataName = "SLD_USE_FIRST_NAMEDLAYER"; const char *pszValue = msLookupHashTable(&(layer->metadata), pszMetadataName); if (pszValue == NULL) { msInsertHashTable(&(layer->metadata), pszMetadataName, "true"); } nStatus = msSLDApplySLD(map, pszSLDbuf, layer->index, NULL, NULL); } else { msSetError(MS_IOERR, "Invalid SLD filename: \"%s\".", "msSLDApplyFromFile()", realpath); } msFree(pszSLDbuf); return nStatus; } #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) /* -------------------------------------------------------------------- */ /* If the same layer is given more that once, we need to */ /* duplicate it. */ /* -------------------------------------------------------------------- */ static void msSLDApplySLD_DuplicateLayers(mapObj *map, int nSLDLayers, layerObj *pasSLDLayers) { int m; for (m = 0; m < nSLDLayers; m++) { int l; int nIndex = msGetLayerIndex(map, pasSLDLayers[m].name); if (pasSLDLayers[m].name == NULL) continue; if (nIndex < 0) continue; for (l = m + 1; l < nSLDLayers; l++) { if (pasSLDLayers[l].name == NULL) continue; if (strcasecmp(pasSLDLayers[m].name, pasSLDLayers[l].name) == 0) { layerObj *psTmpLayer = (layerObj *)malloc(sizeof(layerObj)); char tmpId[128]; initLayer(psTmpLayer, map); msCopyLayer(psTmpLayer, GET_LAYER(map, nIndex)); /* open the source layer */ if (!psTmpLayer->vtable) { if (msInitializeVirtualTable(psTmpLayer) != MS_SUCCESS) { MS_REFCNT_DECR(psTmpLayer); continue; } } /*make the name unique*/ snprintf(tmpId, sizeof(tmpId), "%lx_%x_%d", (long)time(NULL), (int)getpid(), map->numlayers); if (psTmpLayer->name) msFree(psTmpLayer->name); psTmpLayer->name = msStrdup(tmpId); msFree(pasSLDLayers[l].name); pasSLDLayers[l].name = msStrdup(tmpId); msInsertLayer(map, psTmpLayer, -1); MS_REFCNT_DECR(psTmpLayer); } } } } #endif static int msApplySldLayerToMapLayer(layerObj *sldLayer, layerObj *lp) { if (sldLayer->numclasses > 0) { int iClass = 0; bool bSLDHasNamedClass = false; lp->type = sldLayer->type; lp->rendermode = MS_ALL_MATCHING_CLASSES; for (int k = 0; k < sldLayer->numclasses; k++) { if (sldLayer->_class[k]->group) { bSLDHasNamedClass = true; break; } } for (int k = 0; k < lp->numclasses; k++) { if (lp->_class[k] != NULL) { lp->_class[k]->layer = NULL; if (freeClass(lp->_class[k]) == MS_SUCCESS) { msFree(lp->_class[k]); lp->_class[k] = NULL; } } } lp->numclasses = 0; if (bSLDHasNamedClass && sldLayer->classgroup) { /* Set the class group to the class that has UserStyle.IsDefaultf */ msFree(lp->classgroup); lp->classgroup = msStrdup(sldLayer->classgroup); } else { /*unset the classgroup on the layer if it was set. This allows the layer to render with all the classes defined in the SLD*/ msFree(lp->classgroup); lp->classgroup = NULL; } for (int k = 0; k < sldLayer->numclasses; k++) { if (msGrowLayerClasses(lp) == NULL) return MS_FAILURE; initClass(lp->_class[iClass]); msCopyClass(lp->_class[iClass], sldLayer->_class[k], NULL); lp->_class[iClass]->layer = lp; lp->numclasses++; /*aliases may have been used as part of the sld text symbolizer for label element. Try to process it if that is the case #3114*/ const int layerWasOpened = msLayerIsOpen(lp); if (layerWasOpened || (msLayerOpen(lp) == MS_SUCCESS && msLayerGetItems(lp) == MS_SUCCESS)) { if (lp->_class[iClass]->text.string) { for (int z = 0; z < lp->numitems; z++) { if (!lp->items[z] || strlen(lp->items[z]) == 0) continue; char *pszTmp1 = msStrdup(lp->_class[iClass]->text.string); const char *pszFullName = msOWSLookupMetadata( &(lp->metadata), "G", std::string(lp->items[z]).append("_alias").c_str()); if (pszFullName != NULL && (strstr(pszTmp1, pszFullName) != NULL)) { pszTmp1 = msReplaceSubstring(pszTmp1, pszFullName, lp->items[z]); std::string osTmp("("); osTmp.append(pszTmp1).append(")"); // Silence false positive Coverity Scan warnings which wrongly // believes that osTmp.c_str() might be used by // msLoadExpressionString() after osTmp is destroyed. // coverity[escape] msLoadExpressionString(&(lp->_class[iClass]->text), osTmp.c_str()); } msFree(pszTmp1); } } if (!layerWasOpened) { // don't close the layer if already // open msLayerClose(lp); } } iClass++; } } else { /*this is probably an SLD that uses Named styles*/ if (sldLayer->classgroup) { int k; for (k = 0; k < lp->numclasses; k++) { if (lp->_class[k]->group && strcasecmp(lp->_class[k]->group, sldLayer->classgroup) == 0) break; } if (k < lp->numclasses) { msFree(lp->classgroup); lp->classgroup = msStrdup(sldLayer->classgroup); } else { /* TODO we throw an exception ?*/ } } } if (sldLayer->labelitem) { if (lp->labelitem) free(lp->labelitem); lp->labelitem = msStrdup(sldLayer->labelitem); } if (sldLayer->classitem) { if (lp->classitem) free(lp->classitem); lp->classitem = msStrdup(sldLayer->classitem); } /* opacity for sld raster */ if (lp->type == MS_LAYER_RASTER && sldLayer->compositer && sldLayer->compositer->opacity != 100) msSetLayerOpacity(lp, sldLayer->compositer->opacity); /* mark as auto-generate SLD */ if (lp->connectiontype == MS_WMS) msInsertHashTable(&(lp->metadata), "wms_sld_body", "auto"); /* The SLD might have a FeatureTypeConstraint */ if (sldLayer->filter.type == MS_EXPRESSION) { if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { char *pszBuffer = msStringConcatenate(NULL, "(("); pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") AND ("); pszBuffer = msStringConcatenate(pszBuffer, sldLayer->filter.string); pszBuffer = msStringConcatenate(pszBuffer, "))"); msFreeExpression(&lp->filter); msInitExpression(&lp->filter); lp->filter.string = pszBuffer; lp->filter.type = MS_EXPRESSION; } else { msFreeExpression(&lp->filter); msInitExpression(&lp->filter); lp->filter.string = msStrdup(sldLayer->filter.string); lp->filter.type = MS_EXPRESSION; } } /*in some cases it would make sense to concatenate all the class expressions and use it to set the filter on the layer. This could increase performance. Will do it for db types layers #2840*/ if (lp->filter.string == NULL || (lp->filter.string && lp->filter.type == MS_STRING && !lp->filteritem)) { if (lp->connectiontype == MS_POSTGIS || lp->connectiontype == MS_ORACLESPATIAL || lp->connectiontype == MS_PLUGIN) { if (lp->numclasses > 0) { /* check first that all classes have an expression type. That is the only way we can concatenate them and set the filter expression */ int k; for (k = 0; k < lp->numclasses; k++) { if (lp->_class[k]->expression.type != MS_EXPRESSION) break; } if (k == lp->numclasses) { char szTmp[512]; char *pszBuffer = NULL; for (k = 0; k < lp->numclasses; k++) { if (pszBuffer == NULL) snprintf(szTmp, sizeof(szTmp), "%s", "(("); /* we a building a string expression, explicitly set type below */ else snprintf(szTmp, sizeof(szTmp), "%s", " OR "); pszBuffer = msStringConcatenate(pszBuffer, szTmp); pszBuffer = msStringConcatenate(pszBuffer, lp->_class[k]->expression.string); } snprintf(szTmp, sizeof(szTmp), "%s", "))"); pszBuffer = msStringConcatenate(pszBuffer, szTmp); msFreeExpression(&lp->filter); msInitExpression(&lp->filter); lp->filter.string = msStrdup(pszBuffer); lp->filter.type = MS_EXPRESSION; msFree(pszBuffer); } } } } return MS_SUCCESS; } /************************************************************************/ /* msSLDApplySLD */ /* */ /* Parses the SLD into array of layers. Go through the map and */ /* compare the SLD layers and the map layers using the name. If */ /* they have the same name, copy the classes associated with */ /* the SLD layers onto the map layers. */ /************************************************************************/ int msSLDApplySLD(mapObj *map, const char *psSLDXML, int iLayer, const char *pszStyleLayerName, char **ppszLayerNames) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) int nSLDLayers = 0; layerObj *pasSLDLayers = NULL; int nStatus = MS_SUCCESS; /*const char *pszSLDNotSupported = NULL;*/ pasSLDLayers = msSLDParseSLD(map, psSLDXML, &nSLDLayers); if (pasSLDLayers == NULL) { errorObj *psError = msGetErrorObj(); if (psError && psError->code != MS_NOERR) return MS_FAILURE; } if (pasSLDLayers && nSLDLayers > 0) { int i; msSLDApplySLD_DuplicateLayers(map, nSLDLayers, pasSLDLayers); for (i = 0; i < map->numlayers; i++) { layerObj *lp = NULL; const char *pszWMSLayerName = NULL; int j; int bUseSpecificLayer = 0; if (iLayer >= 0 && iLayer < map->numlayers) { i = iLayer; bUseSpecificLayer = 1; } lp = GET_LAYER(map, i); /* compare layer name to wms_name as well */ pszWMSLayerName = msOWSLookupMetadata(&(lp->metadata), "MO", "name"); bool bSldApplied = false; for (j = 0; j < nSLDLayers; j++) { layerObj *sldLayer = &pasSLDLayers[j]; /* -------------------------------------------------------------------- */ /* copy : - class */ /* - layer's labelitem */ /* -------------------------------------------------------------------- */ if ((sldLayer->name && pszStyleLayerName == NULL && ((strcasecmp(lp->name, sldLayer->name) == 0 || (pszWMSLayerName && strcasecmp(pszWMSLayerName, sldLayer->name) == 0)) || (lp->group && strcasecmp(lp->group, sldLayer->name) == 0))) || (bUseSpecificLayer && pszStyleLayerName && sldLayer->name && strcasecmp(sldLayer->name, pszStyleLayerName) == 0)) { #ifdef notdef /*this is a test code if we decide to flag some layers as not * supporting SLD*/ pszSLDNotSupported = msOWSLookupMetadata(&(lp->metadata), "M", "SLD_NOT_SUPPORTED"); if (pszSLDNotSupported) { msSetError(MS_WMSERR, "Layer %s does not support SLD", "msSLDApplySLD", sldLayer->name); nsStatus = MS_FAILURE; goto sld_cleanup; } #endif if (msApplySldLayerToMapLayer(sldLayer, lp) == MS_FAILURE) { nStatus = MS_FAILURE; goto sld_cleanup; }; bSldApplied = true; break; } } if (bUseSpecificLayer) { if (!bSldApplied) { // there was no name match between the map layer and the SLD named // layer - check if we should apply the first SLD layer anyway const char *pszSLDUseFirstNamedLayer = msLookupHashTable(&(lp->metadata), "SLD_USE_FIRST_NAMEDLAYER"); if (pszSLDUseFirstNamedLayer) { if (strcasecmp(pszSLDUseFirstNamedLayer, "true") == 0) { layerObj *firstSldLayer = &pasSLDLayers[0]; if (msApplySldLayerToMapLayer(firstSldLayer, lp) == MS_FAILURE) { nStatus = MS_FAILURE; goto sld_cleanup; }; } } } break; } } /* -------------------------------------------------------------------- */ /* if needed return a comma separated list of the layers found */ /* in the sld. */ /* -------------------------------------------------------------------- */ if (ppszLayerNames) { char *pszTmp = NULL; for (i = 0; i < nSLDLayers; i++) { if (pasSLDLayers[i].name) { if (pszTmp != NULL) pszTmp = msStringConcatenate(pszTmp, ","); pszTmp = msStringConcatenate(pszTmp, pasSLDLayers[i].name); } } *ppszLayerNames = pszTmp; } } nStatus = MS_SUCCESS; sld_cleanup: if (pasSLDLayers) { for (int i = 0; i < nSLDLayers; i++) freeLayer(&pasSLDLayers[i]); msFree(pasSLDLayers); } if (map->debug == MS_DEBUGLEVEL_VVV) { char *tmpfilename = msTmpFile(map, map->mappath, NULL, "_sld.map"); if (tmpfilename == NULL) { tmpfilename = msTmpFile(map, NULL, NULL, "_sld.map"); } if (tmpfilename) { msSaveMap(map, tmpfilename); msDebug("msApplySLD(): Map file after SLD was applied %s\n", tmpfilename); msFree(tmpfilename); } } return nStatus; #else msSetError(MS_MISCERR, "OWS support is not available.", "msSLDApplySLD()"); return (MS_FAILURE); #endif } static CPLXMLNode *FindNextChild(CPLXMLNode *psNode, const char *pszChildName) { while (psNode) { if (psNode->eType == CXT_Element && strcasecmp(psNode->pszValue, pszChildName) == 0) { return psNode; } psNode = psNode->psNext; } return NULL; } #define LOOP_ON_CHILD_ELEMENT(psParent_, psChild_, pszChildName_) \ for (psChild_ = FindNextChild(psParent_->psChild, pszChildName_); \ psChild_ != NULL; \ psChild_ = FindNextChild(psChild_->psNext, pszChildName_)) /************************************************************************/ /* msSLDParseSLD */ /* */ /* Parse the sld document into layers : for each named layer */ /* there is one mapserver layer created with appropriate */ /* classes and styles. */ /* Returns an array of mapserver layers. The pnLayres if */ /* provided will indicate the size of the returned array. */ /************************************************************************/ layerObj *msSLDParseSLD(mapObj *map, const char *psSLDXML, int *pnLayers) { CPLXMLNode *psRoot = NULL; CPLXMLNode *psSLD, *psNamedLayer; layerObj *pasLayers = NULL; int iLayer = 0; int nLayers = 0; if (map == NULL || psSLDXML == NULL || strlen(psSLDXML) == 0 || (strstr(psSLDXML, "StyledLayerDescriptor") == NULL)) { msSetError(MS_WMSERR, "Invalid SLD document", ""); return NULL; } psRoot = CPLParseXMLString(psSLDXML); if (psRoot == NULL) { msSetError(MS_WMSERR, "Invalid SLD document : %s", "", psSLDXML); return NULL; } /* strip namespaces ogc and sld and gml */ CPLStripXMLNamespace(psRoot, "ogc", 1); CPLStripXMLNamespace(psRoot, "sld", 1); CPLStripXMLNamespace(psRoot, "gml", 1); CPLStripXMLNamespace(psRoot, "se", 1); /* -------------------------------------------------------------------- */ /* get the root element (StyledLayerDescriptor). */ /* -------------------------------------------------------------------- */ psSLD = CPLGetXMLNode(psRoot, "=StyledLayerDescriptor"); if (!psSLD) { msSetError(MS_WMSERR, "Invalid SLD document : %s", "", psSLDXML); return NULL; } /* -------------------------------------------------------------------- */ /* Parse the named layers. */ /* -------------------------------------------------------------------- */ LOOP_ON_CHILD_ELEMENT(psSLD, psNamedLayer, "NamedLayer") { nLayers++; } if (nLayers > 0) pasLayers = (layerObj *)malloc(sizeof(layerObj) * nLayers); else return NULL; LOOP_ON_CHILD_ELEMENT(psSLD, psNamedLayer, "NamedLayer") { CPLXMLNode *psName = CPLGetXMLNode(psNamedLayer, "Name"); initLayer(&pasLayers[iLayer], map); if (psName && psName->psChild && psName->psChild->pszValue) pasLayers[iLayer].name = msStrdup(psName->psChild->pszValue); if (msSLDParseNamedLayer(psNamedLayer, &pasLayers[iLayer]) != MS_SUCCESS) { int i; for (i = 0; i <= iLayer; i++) freeLayer(&pasLayers[i]); msFree(pasLayers); nLayers = 0; pasLayers = NULL; break; } iLayer++; } if (pnLayers) *pnLayers = nLayers; if (psRoot) CPLDestroyXMLNode(psRoot); return pasLayers; } /************************************************************************/ /* _SLDApplyRuleValues */ /* */ /* Utility function to set the scale, title/name for the */ /* classes created by a Rule. */ /************************************************************************/ void _SLDApplyRuleValues(CPLXMLNode *psRule, layerObj *psLayer, int nNewClasses) { CPLXMLNode *psMinScale = NULL, *psMaxScale = NULL; CPLXMLNode *psName = NULL, *psTitle = NULL; double dfMinScale = 0, dfMaxScale = 0; char *pszName = NULL, *pszTitle = NULL; if (psRule && psLayer && nNewClasses > 0) { /* -------------------------------------------------------------------- */ /* parse minscale and maxscale. */ /* -------------------------------------------------------------------- */ psMinScale = CPLGetXMLNode(psRule, "MinScaleDenominator"); if (psMinScale && psMinScale->psChild && psMinScale->psChild->pszValue) dfMinScale = atof(psMinScale->psChild->pszValue); psMaxScale = CPLGetXMLNode(psRule, "MaxScaleDenominator"); if (psMaxScale && psMaxScale->psChild && psMaxScale->psChild->pszValue) dfMaxScale = atof(psMaxScale->psChild->pszValue); /* -------------------------------------------------------------------- */ /* parse name and title. */ /* -------------------------------------------------------------------- */ psName = CPLGetXMLNode(psRule, "Name"); if (psName && psName->psChild && psName->psChild->pszValue) pszName = psName->psChild->pszValue; psTitle = CPLGetXMLNode(psRule, "Title"); if (psTitle && psTitle->psChild && psTitle->psChild->pszValue) pszTitle = psTitle->psChild->pszValue; /* -------------------------------------------------------------------- */ /* set the scale to all the classes created by the rule. */ /* -------------------------------------------------------------------- */ if (dfMinScale > 0 || dfMaxScale > 0) { for (int i = 0; i < nNewClasses; i++) { if (dfMinScale > 0) psLayer->_class[psLayer->numclasses - 1 - i]->minscaledenom = dfMinScale; if (dfMaxScale) psLayer->_class[psLayer->numclasses - 1 - i]->maxscaledenom = dfMaxScale; } } /* -------------------------------------------------------------------- */ /* set name and title to the classes created by the rule. */ /* -------------------------------------------------------------------- */ for (int i = 0; i < nNewClasses; i++) { if (!psLayer->_class[psLayer->numclasses - 1 - i]->name) { if (pszName) psLayer->_class[psLayer->numclasses - 1 - i]->name = msStrdup(pszName); else if (pszTitle) psLayer->_class[psLayer->numclasses - 1 - i]->name = msStrdup(pszTitle); else { // Build a name from layer and class info char szTmp[256]; snprintf(szTmp, sizeof(szTmp), "%s#%d", psLayer->name, psLayer->numclasses - 1 - i); psLayer->_class[psLayer->numclasses - 1 - i]->name = msStrdup(szTmp); } } } if (pszTitle) { for (int i = 0; i < nNewClasses; i++) { psLayer->_class[psLayer->numclasses - 1 - i]->title = msStrdup(pszTitle); } } } } /************************************************************************/ /* msSLDGetCommonExpressionFromFilter */ /* */ /* Get a common expression valid from the filter valid for the */ /* temporary layer. */ /************************************************************************/ static char *msSLDGetCommonExpressionFromFilter(CPLXMLNode *psFilter, layerObj *psLayer) { char *pszExpression = NULL; CPLXMLNode *psTmpNextNode = NULL; CPLXMLNode *psTmpNode = NULL; FilterEncodingNode *psNode = NULL; char *pszTmpFilter = NULL; layerObj *psCurrentLayer = NULL; const char *pszWmsName = NULL; const char *key = NULL; /* clone the tree and set the next node to null */ /* so we only have the Filter node */ psTmpNode = CPLCloneXMLTree(psFilter); psTmpNextNode = psTmpNode->psNext; psTmpNode->psNext = NULL; pszTmpFilter = CPLSerializeXMLTree(psTmpNode); psTmpNode->psNext = psTmpNextNode; CPLDestroyXMLNode(psTmpNode); if (pszTmpFilter) { psNode = FLTParseFilterEncoding(pszTmpFilter); CPLFree(pszTmpFilter); } if (psNode) { int j; /*preparse the filter for possible gml aliases set on the layer's metadata: "gml_NA3DESC_alias" "alias_name" and filter could be alias_name #3079*/ for (j = 0; j < psLayer->map->numlayers; j++) { psCurrentLayer = GET_LAYER(psLayer->map, j); pszWmsName = msOWSLookupMetadata(&(psCurrentLayer->metadata), "MO", "name"); if ((psCurrentLayer->name && psLayer->name && strcasecmp(psCurrentLayer->name, psLayer->name) == 0) || (psCurrentLayer->group && psLayer->name && strcasecmp(psCurrentLayer->group, psLayer->name) == 0) || (psLayer->name && pszWmsName && strcasecmp(pszWmsName, psLayer->name) == 0)) break; } if (j < psLayer->map->numlayers) { /*make sure that the tmp layer has all the metadata that the original layer has, allowing to do parsing for such things as gml_attribute_type #3052*/ while (1) { key = msNextKeyFromHashTable(&psCurrentLayer->metadata, key); if (!key) break; else msInsertHashTable(&psLayer->metadata, key, msLookupHashTable(&psCurrentLayer->metadata, key)); } FLTPreParseFilterForAliasAndGroup(psNode, psLayer->map, j, "G"); } pszExpression = FLTGetCommonExpression(psNode, psLayer); FLTFreeFilterEncodingNode(psNode); } return pszExpression; } /************************************************************************/ /* msSLDParseUserStyle */ /* */ /* Parse UserStyle node. */ /************************************************************************/ static void msSLDParseUserStyle(CPLXMLNode *psUserStyle, layerObj *psLayer) { CPLXMLNode *psFeatureTypeStyle; const char *pszUserStyleName = CPLGetXMLValue(psUserStyle, "Name", NULL); if (pszUserStyleName) { const char *pszIsDefault = CPLGetXMLValue(psUserStyle, "IsDefault", "0"); if (EQUAL(pszIsDefault, "true") || EQUAL(pszIsDefault, "1")) { msFree(psLayer->classgroup); psLayer->classgroup = msStrdup(pszUserStyleName); } } LOOP_ON_CHILD_ELEMENT(psUserStyle, psFeatureTypeStyle, "FeatureTypeStyle") { CPLXMLNode *psRule; /* -------------------------------------------------------------------- */ /* Parse rules with no Else filter. */ /* -------------------------------------------------------------------- */ LOOP_ON_CHILD_ELEMENT(psFeatureTypeStyle, psRule, "Rule") { CPLXMLNode *psFilter = NULL; CPLXMLNode *psElseFilter = NULL; int nNewClasses = 0, nClassBeforeFilter = 0, nClassAfterFilter = 0; int nClassAfterRule = 0, nClassBeforeRule = 0; /* used for scale setting */ nClassBeforeRule = psLayer->numclasses; psElseFilter = CPLGetXMLNode(psRule, "ElseFilter"); nClassBeforeFilter = psLayer->numclasses; if (psElseFilter == NULL) msSLDParseRule(psRule, psLayer, pszUserStyleName); nClassAfterFilter = psLayer->numclasses; /* -------------------------------------------------------------------- */ /* Parse the filter and apply it to the latest class created by */ /* the rule. */ /* NOTE : Spatial Filter is not supported. */ /* -------------------------------------------------------------------- */ psFilter = CPLGetXMLNode(psRule, "Filter"); if (psFilter && psFilter->psChild && psFilter->psChild->pszValue) { char *pszExpression = msSLDGetCommonExpressionFromFilter(psFilter, psLayer); if (pszExpression) { int i; nNewClasses = nClassAfterFilter - nClassBeforeFilter; for (i = 0; i < nNewClasses; i++) { expressionObj *exp = &(psLayer->_class[psLayer->numclasses - 1 - i]->expression); msFreeExpression(exp); msInitExpression(exp); exp->string = msStrdup(pszExpression); exp->type = MS_EXPRESSION; } msFree(pszExpression); pszExpression = NULL; } } nClassAfterRule = psLayer->numclasses; nNewClasses = nClassAfterRule - nClassBeforeRule; /* apply scale and title to newly created classes */ _SLDApplyRuleValues(psRule, psLayer, nNewClasses); /* TODO : parse legendgraphic */ } /* -------------------------------------------------------------------- */ /* First parse rules with the else filter. These rules will */ /* create the classes that are placed at the end of class */ /* list. (See how classes are applied to layers in function */ /* msSLDApplySLD). */ /* -------------------------------------------------------------------- */ LOOP_ON_CHILD_ELEMENT(psFeatureTypeStyle, psRule, "Rule") { CPLXMLNode *psElseFilter = CPLGetXMLNode(psRule, "ElseFilter"); if (psElseFilter) { msSLDParseRule(psRule, psLayer, pszUserStyleName); _SLDApplyRuleValues(psRule, psLayer, 1); psLayer->_class[psLayer->numclasses - 1]->isfallback = TRUE; } } } } /************************************************************************/ /* msSLDParseNamedLayer */ /* */ /* Parse NamedLayer root. */ /************************************************************************/ int msSLDParseNamedLayer(CPLXMLNode *psRoot, layerObj *psLayer) { CPLXMLNode *psLayerFeatureConstraints = NULL; if (!psRoot || !psLayer) return MS_FAILURE; if (CPLGetXMLNode(psRoot, "UserStyle")) { CPLXMLNode *psUserStyle; LOOP_ON_CHILD_ELEMENT(psRoot, psUserStyle, "UserStyle") { msSLDParseUserStyle(psUserStyle, psLayer); } } /* check for Named styles*/ else { CPLXMLNode *psNamedStyle = CPLGetXMLNode(psRoot, "NamedStyle"); if (psNamedStyle) { CPLXMLNode *psSLDName = CPLGetXMLNode(psNamedStyle, "Name"); if (psSLDName && psSLDName->psChild && psSLDName->psChild->pszValue) { msFree(psLayer->classgroup); psLayer->classgroup = msStrdup(psSLDName->psChild->pszValue); } } } /* Deal with LayerFeatureConstraints */ psLayerFeatureConstraints = CPLGetXMLNode(psRoot, "LayerFeatureConstraints"); if (psLayerFeatureConstraints != NULL) { CPLXMLNode *psIter = psLayerFeatureConstraints->psChild; CPLXMLNode *psFeatureTypeConstraint = NULL; for (; psIter != NULL; psIter = psIter->psNext) { if (psIter->eType == CXT_Element && strcmp(psIter->pszValue, "FeatureTypeConstraint") == 0) { if (psFeatureTypeConstraint == NULL) { psFeatureTypeConstraint = psIter; } else { msSetError(MS_WMSERR, "Only one single FeatureTypeConstraint element " "per LayerFeatureConstraints is supported", ""); return MS_FAILURE; } } } if (psFeatureTypeConstraint != NULL) { CPLXMLNode *psFilter; if (CPLGetXMLNode(psFeatureTypeConstraint, "FeatureTypeName") != NULL) { msSetError(MS_WMSERR, "FeatureTypeName element is not " "supported in FeatureTypeConstraint", ""); return MS_FAILURE; } if (CPLGetXMLNode(psFeatureTypeConstraint, "Extent") != NULL) { msSetError(MS_WMSERR, "Extent element is not " "supported in FeatureTypeConstraint", ""); return MS_FAILURE; } psFilter = CPLGetXMLNode(psFeatureTypeConstraint, "Filter"); if (psFilter && psFilter->psChild && psFilter->psChild->pszValue) { char *pszExpression = msSLDGetCommonExpressionFromFilter(psFilter, psLayer); if (pszExpression) { msFreeExpression(&psLayer->filter); msInitExpression(&psLayer->filter); psLayer->filter.string = pszExpression; psLayer->filter.type = MS_EXPRESSION; } } } } return MS_SUCCESS; } /************************************************************************/ /* msSLDParseRule() */ /* */ /* Parse a Rule node into classes for a specific layer. */ /************************************************************************/ int msSLDParseRule(CPLXMLNode *psRoot, layerObj *psLayer, const char *pszUserStyleName) { CPLXMLNode *psLineSymbolizer = NULL; CPLXMLNode *psPolygonSymbolizer = NULL; CPLXMLNode *psPointSymbolizer = NULL; CPLXMLNode *psTextSymbolizer = NULL; CPLXMLNode *psRasterSymbolizer = NULL; int nSymbolizer = 0; if (!psRoot || !psLayer) return MS_FAILURE; /* TODO : parse name of the rule */ /* ==================================================================== */ /* For each rule a new class is created. If there are more than */ /* one symbolizer, a style is added in the same class. */ /* ==================================================================== */ /* Raster symbolizer */ LOOP_ON_CHILD_ELEMENT(psRoot, psRasterSymbolizer, "RasterSymbolizer") { msSLDParseRasterSymbolizer(psRasterSymbolizer, psLayer, pszUserStyleName); /* cppcheck-suppress knownConditionTrueFalse */ if (nSymbolizer == 0) { psLayer->type = MS_LAYER_RASTER; } } /* Polygon symbolizer */ LOOP_ON_CHILD_ELEMENT(psRoot, psPolygonSymbolizer, "PolygonSymbolizer") { /* cppcheck-suppress knownConditionTrueFalse */ const int bNewClass = (nSymbolizer == 0); msSLDParsePolygonSymbolizer(psPolygonSymbolizer, psLayer, bNewClass, pszUserStyleName); psLayer->type = MS_LAYER_POLYGON; nSymbolizer++; } /* line symbolizer */ LOOP_ON_CHILD_ELEMENT(psRoot, psLineSymbolizer, "LineSymbolizer") { const int bNewClass = (nSymbolizer == 0); msSLDParseLineSymbolizer(psLineSymbolizer, psLayer, bNewClass, pszUserStyleName); if (bNewClass) { psLayer->type = MS_LAYER_LINE; } if (psLayer->type == MS_LAYER_POLYGON) { const int nClassId = psLayer->numclasses - 1; if (nClassId >= 0) { const int nStyleId = psLayer->_class[nClassId]->numstyles - 1; if (nStyleId >= 0) { styleObj *psStyle = psLayer->_class[nClassId]->styles[nStyleId]; psStyle->outlinecolor = psStyle->color; MS_INIT_COLOR(psStyle->color, -1, -1, -1, 255); MS_COPYSTRING( psStyle->exprBindings[MS_STYLE_BINDING_OUTLINECOLOR].string, psStyle->exprBindings[MS_STYLE_BINDING_COLOR].string); psStyle->exprBindings[MS_STYLE_BINDING_OUTLINECOLOR].type = psStyle->exprBindings[MS_STYLE_BINDING_COLOR].type; msFreeExpression(&(psStyle->exprBindings[MS_STYLE_BINDING_COLOR])); msInitExpression(&(psStyle->exprBindings[MS_STYLE_BINDING_COLOR])); } } } nSymbolizer++; } /* Point Symbolizer */ LOOP_ON_CHILD_ELEMENT(psRoot, psPointSymbolizer, "PointSymbolizer") { const int bNewClass = (nSymbolizer == 0); msSLDParsePointSymbolizer(psPointSymbolizer, psLayer, bNewClass, pszUserStyleName); if (bNewClass) { psLayer->type = MS_LAYER_POINT; } if (psLayer->type == MS_LAYER_POLYGON || psLayer->type == MS_LAYER_LINE || psLayer->type == MS_LAYER_RASTER) { const int nClassId = psLayer->numclasses - 1; if (nClassId >= 0) { const int nStyleId = psLayer->_class[nClassId]->numstyles - 1; if (nStyleId >= 0) { styleObj *psStyle = psLayer->_class[nClassId]->styles[nStyleId]; msStyleSetGeomTransform(psStyle, "centroid"); } } } nSymbolizer++; } /* Text symbolizer */ /* ==================================================================== */ /* For text symbolizer, here is how it is translated into */ /* mapserver classes : */ /* - If there are other symbolizers(line, polygon, symbol), */ /* the label object created will be created in the same class */ /* (the last class) as the symbolizer. This allows to have for */ /* example of point layer with labels. */ /* - If there are no other symbolizers, a new class will be */ /* created to contain the label object. */ /* ==================================================================== */ if (psLayer->type == MS_LAYER_LINE || psLayer->type == MS_LAYER_POLYGON) nSymbolizer++; LOOP_ON_CHILD_ELEMENT(psRoot, psTextSymbolizer, "TextSymbolizer") { if (nSymbolizer == 0) psLayer->type = MS_LAYER_POINT; msSLDParseTextSymbolizer(psTextSymbolizer, psLayer, nSymbolizer > 0, pszUserStyleName); } return MS_SUCCESS; } /************************************************************************/ /* getClassId() */ /************************************************************************/ static int getClassId(layerObj *psLayer, int bNewClass, const char *pszUserStyleName) { int nClassId; if (bNewClass || psLayer->numclasses <= 0) { if (msGrowLayerClasses(psLayer) == NULL) return -1; initClass(psLayer->_class[psLayer->numclasses]); nClassId = psLayer->numclasses; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); psLayer->numclasses++; } else { nClassId = psLayer->numclasses - 1; } return nClassId; } /************************************************************************/ /* msSLDParseUomAttribute() */ /************************************************************************/ int msSLDParseUomAttribute(CPLXMLNode *node, enum MS_UNITS *sizeunits) { const struct { enum MS_UNITS unit; const char *const values[10]; } known_uoms[] = { {MS_INCHES, {"inch", "inches", NULL}}, {MS_FEET, {"foot", "feet", "http://www.opengeospatial.org/se/units/foot", NULL}}, {MS_MILES, {"mile", "miles", NULL}}, {MS_METERS, {"meter", "meters", "metre", "metres", "http://www.opengeospatial.org/se/units/metre", NULL}}, {MS_KILOMETERS, {"kilometer", "kilometers", "kilometre", "kilometres", NULL}}, {MS_DD, {"dd", NULL}}, {MS_PIXELS, {"pixel", "pixels", "px", "http://www.opengeospatial.org/se/units/pixel", NULL}}, {MS_PERCENTAGES, {"percent", "percents", "percentage", "percentages", NULL}}, {MS_NAUTICALMILES, {"nauticalmile", "nauticalmiles", "nautical_mile", "nautical_miles", NULL}}, {MS_INCHES, {NULL}}}; const char *uom = CPLGetXMLValue(node, "uom", NULL); if (uom) { for (int i = 0; known_uoms[i].values[0]; i++) for (int j = 0; known_uoms[i].values[j]; j++) if (strcmp(uom, known_uoms[i].values[j]) == 0) { // Match found *sizeunits = known_uoms[i].unit; return MS_SUCCESS; } // No match was found return MS_FAILURE; } // No uom was found *sizeunits = MS_PIXELS; return MS_SUCCESS; } /************************************************************************/ /* msSLDParseLineSymbolizer() */ /* */ /* Parses the LineSymbolizer rule and creates a class in the */ /* layer. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Example of a rule : */ /* ... */ /* */ /* */ /* */ /* center-line */ /* */ /* */ /* #0000ff */ /* 5.0 */ /* 10.0 5 5 10*/ /* */ /* */ /* */ /* ... */ /************************************************************************/ int msSLDParseLineSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, int bNewClass, const char *pszUserStyleName) { CPLXMLNode *psStroke = NULL, *psOffset = NULL; if (!psRoot || !psLayer) return MS_FAILURE; // Get uom if any, defaults to MS_PIXELS enum MS_UNITS sizeunits = MS_PIXELS; if (msSLDParseUomAttribute(psRoot, &sizeunits) != MS_SUCCESS) { msSetError(MS_WMSERR, "Invalid uom attribute value.", "msSLDParsePolygonSymbolizer()"); return MS_FAILURE; } psStroke = CPLGetXMLNode(psRoot, "Stroke"); if (psStroke) { int nClassId = getClassId(psLayer, bNewClass, pszUserStyleName); if (nClassId < 0) return MS_FAILURE; const int iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; msSLDParseStroke(psStroke, psLayer->_class[nClassId]->styles[iStyle], psLayer->map, 0); /*parse PerpendicularOffset SLD 1.1.10*/ psOffset = CPLGetXMLNode(psRoot, "PerpendicularOffset"); if (psOffset && psOffset->psChild && psOffset->psChild->pszValue) { psLayer->_class[nClassId]->styles[iStyle]->offsetx = atoi(psOffset->psChild->pszValue); psLayer->_class[nClassId]->styles[iStyle]->offsety = MS_STYLE_SINGLE_SIDED_OFFSET; } } return MS_SUCCESS; } /************************************************************************/ /* void msSLDParseStroke(CPLXMLNode *psStroke, styleObj */ /* *psStyle, int iColorParam) */ /* */ /* Parse Stroke content into a style object. */ /* The iColorParm is used to indicate which color object to use */ /* : */ /* 0 : for color */ /* 1 : outlinecolor */ /************************************************************************/ int msSLDParseStroke(CPLXMLNode *psStroke, styleObj *psStyle, mapObj *map, int iColorParam) { CPLXMLNode *psCssParam = NULL, *psGraphicFill = NULL; char *psStrkName = NULL; char *pszDashValue = NULL; if (!psStroke || !psStyle) return MS_FAILURE; /* parse css parameters */ psCssParam = CPLGetXMLNode(psStroke, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psStroke, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { psStrkName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (psStrkName) { if (strcasecmp(psStrkName, "stroke") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { switch (iColorParam) { case 0: msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_COLOR, MS_OBJ_STYLE); break; case 1: msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_OUTLINECOLOR, MS_OBJ_STYLE); break; } } } else if (strcasecmp(psStrkName, "stroke-width") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_WIDTH, MS_OBJ_STYLE); } } else if (strcasecmp(psStrkName, "stroke-dasharray") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext && psCssParam->psChild->psNext->pszValue) { int nDash = 0, i; char **aszValues = NULL; int nMaxDash; if (pszDashValue) free(pszDashValue); /* free previous if multiple stroke-dasharray attributes were found */ pszDashValue = msStrdup(psCssParam->psChild->psNext->pszValue); aszValues = msStringSplit(pszDashValue, ' ', &nDash); if (nDash > 0) { nMaxDash = nDash; if (nDash > MS_MAXPATTERNLENGTH) nMaxDash = MS_MAXPATTERNLENGTH; psStyle->patternlength = nMaxDash; for (i = 0; i < nMaxDash; i++) psStyle->pattern[i] = atof(aszValues[i]); psStyle->linecap = MS_CJC_BUTT; } msFreeCharArray(aszValues, nDash); } } else if (strcasecmp(psStrkName, "stroke-opacity") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_OPACITY, MS_OBJ_STYLE); } } } psCssParam = psCssParam->psNext; } /* parse graphic fill or stroke */ /* graphic fill and graphic stroke pare parsed the same way : */ /* TODO : It seems inconsistent to me since the only difference */ /* between them seems to be fill (fill) or not fill (stroke). And */ /* then again the fill parameter can be used inside both elements. */ psGraphicFill = CPLGetXMLNode(psStroke, "GraphicFill"); if (psGraphicFill) msSLDParseGraphicFillOrStroke(psGraphicFill, pszDashValue, psStyle, map); psGraphicFill = CPLGetXMLNode(psStroke, "GraphicStroke"); if (psGraphicFill) msSLDParseGraphicFillOrStroke(psGraphicFill, pszDashValue, psStyle, map); if (pszDashValue) free(pszDashValue); return MS_SUCCESS; } /************************************************************************/ /* int msSLDParseOgcExpression(CPLXMLNode *psRoot, styleObj *psStyle, */ /* enum MS_STYLE_BINDING_ENUM binding) */ /* */ /* Parse an OGC expression in a */ /************************************************************************/ int msSLDParseOgcExpression(CPLXMLNode *psRoot, void *psObj, int binding, enum objType objtype) { int status = MS_FAILURE; const char *ops = "Add+Sub-Mul*Div/"; styleObj *psStyle = static_cast(psObj); labelObj *psLabel = static_cast(psObj); int lbinding; expressionObj *exprBindings; int *nexprbindings; enum { MS_STYLE_BASE = 0, MS_LABEL_BASE = 100 }; switch (objtype) { case MS_OBJ_STYLE: lbinding = binding + MS_STYLE_BASE; exprBindings = psStyle->exprBindings; nexprbindings = &psStyle->nexprbindings; break; case MS_OBJ_LABEL: lbinding = binding + MS_LABEL_BASE; exprBindings = psLabel->exprBindings; nexprbindings = &psLabel->nexprbindings; break; default: return MS_FAILURE; break; } switch (psRoot->eType) { case CXT_Text: // Parse a raw value { msStringBuffer *literal = msStringBufferAlloc(); msStringBufferAppend(literal, "("); msStringBufferAppend(literal, psRoot->pszValue); msStringBufferAppend(literal, ")"); msFreeExpression(&(exprBindings[binding])); msInitExpression(&(exprBindings[binding])); exprBindings[binding].string = msStringBufferReleaseStringAndFree(literal); exprBindings[binding].type = MS_STRING; } switch (lbinding) { case MS_STYLE_BASE + MS_STYLE_BINDING_OFFSET_X: psStyle->offsetx = atoi(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_OFFSET_Y: psStyle->offsety = atoi(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_ANGLE: psStyle->angle = atof(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_SIZE: psStyle->size = atof(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_WIDTH: psStyle->width = atof(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_OPACITY: psStyle->opacity = atof(psRoot->pszValue) * 100; status = MS_SUCCESS; // Apply opacity as the alpha channel color(s) if (psStyle->opacity < 100) { int alpha = MS_NINT(psStyle->opacity * 2.55); psStyle->color.alpha = alpha; psStyle->outlinecolor.alpha = alpha; psStyle->mincolor.alpha = alpha; psStyle->maxcolor.alpha = alpha; } break; case MS_STYLE_BASE + MS_STYLE_BINDING_COLOR: if (strlen(psRoot->pszValue) == 7 && psRoot->pszValue[0] == '#') { psStyle->color.red = msHexToInt(psRoot->pszValue + 1); psStyle->color.green = msHexToInt(psRoot->pszValue + 3); psStyle->color.blue = msHexToInt(psRoot->pszValue + 5); status = MS_SUCCESS; } break; case MS_STYLE_BASE + MS_STYLE_BINDING_OUTLINECOLOR: if (strlen(psRoot->pszValue) == 7 && psRoot->pszValue[0] == '#') { psStyle->outlinecolor.red = msHexToInt(psRoot->pszValue + 1); psStyle->outlinecolor.green = msHexToInt(psRoot->pszValue + 3); psStyle->outlinecolor.blue = msHexToInt(psRoot->pszValue + 5); status = MS_SUCCESS; } break; case MS_LABEL_BASE + MS_LABEL_BINDING_SIZE: psLabel->size = atof(psRoot->pszValue); if (psLabel->size <= 0.0) { psLabel->size = 10.0; } status = MS_SUCCESS; break; case MS_LABEL_BASE + MS_LABEL_BINDING_ANGLE: psLabel->angle = atof(psRoot->pszValue); status = MS_SUCCESS; break; case MS_LABEL_BASE + MS_LABEL_BINDING_COLOR: if (strlen(psRoot->pszValue) == 7 && psRoot->pszValue[0] == '#') { psLabel->color.red = msHexToInt(psRoot->pszValue + 1); psLabel->color.green = msHexToInt(psRoot->pszValue + 3); psLabel->color.blue = msHexToInt(psRoot->pszValue + 5); status = MS_SUCCESS; } break; case MS_LABEL_BASE + MS_LABEL_BINDING_OUTLINECOLOR: if (strlen(psRoot->pszValue) == 7 && psRoot->pszValue[0] == '#') { psLabel->outlinecolor.red = msHexToInt(psRoot->pszValue + 1); psLabel->outlinecolor.green = msHexToInt(psRoot->pszValue + 3); psLabel->outlinecolor.blue = msHexToInt(psRoot->pszValue + 5); status = MS_SUCCESS; } break; default: break; } break; case CXT_Element: if (strcasecmp(psRoot->pszValue, "Literal") == 0 && psRoot->psChild) { // Parse a element status = msSLDParseOgcExpression(psRoot->psChild, psObj, binding, objtype); } else if (strcasecmp(psRoot->pszValue, "PropertyName") == 0 && psRoot->psChild) { // Parse a element msStringBuffer *property = msStringBufferAlloc(); const char *strDelim = ""; switch (lbinding) { case MS_STYLE_BASE + MS_STYLE_BINDING_COLOR: case MS_STYLE_BASE + MS_STYLE_BINDING_OUTLINECOLOR: case MS_LABEL_BASE + MS_LABEL_BINDING_COLOR: case MS_LABEL_BASE + MS_LABEL_BINDING_OUTLINECOLOR: strDelim = "\""; /* FALLTHROUGH */ default: msStringBufferAppend(property, strDelim); msStringBufferAppend(property, "["); msStringBufferAppend(property, psRoot->psChild->pszValue); msStringBufferAppend(property, "]"); msStringBufferAppend(property, strDelim); msInitExpression(&(exprBindings[binding])); exprBindings[binding].string = msStringBufferReleaseStringAndFree(property); exprBindings[binding].type = MS_EXPRESSION; (*nexprbindings)++; break; } status = MS_SUCCESS; } else if (strcasecmp(psRoot->pszValue, "Function") == 0 && psRoot->psChild && CPLGetXMLValue(psRoot, "name", NULL) && psRoot->psChild->psNext) { // Parse a element msStringBuffer *function = msStringBufferAlloc(); // Parse function name const char *funcname = CPLGetXMLValue(psRoot, "name", NULL); msStringBufferAppend(function, funcname); msStringBufferAppend(function, "("); msInitExpression(&(exprBindings[binding])); // Parse arguments const char *sep = ""; for (CPLXMLNode *argument = psRoot->psChild->psNext; argument; argument = argument->psNext) { status = msSLDParseOgcExpression(argument, psObj, binding, objtype); if (status != MS_SUCCESS) break; msStringBufferAppend(function, sep); msStringBufferAppend(function, exprBindings[binding].string); msReplaceFreeableStr(&(exprBindings[binding].string), nullptr); msInitExpression(&(exprBindings[binding])); sep = ","; } msStringBufferAppend(function, ")"); exprBindings[binding].string = msStringBufferReleaseStringAndFree(function); exprBindings[binding].type = MS_EXPRESSION; (*nexprbindings)++; status = MS_SUCCESS; } else if (strstr(ops, psRoot->pszValue) && psRoot->psChild && psRoot->psChild->psNext) { // Parse an arithmetic element , , , const char op[2] = {*(strstr(ops, psRoot->pszValue) + 3), '\0'}; msStringBuffer *expression = msStringBufferAlloc(); // Parse first operand msStringBufferAppend(expression, "("); msInitExpression(&(exprBindings[binding])); status = msSLDParseOgcExpression(psRoot->psChild, psObj, binding, objtype); // Parse second operand if (status == MS_SUCCESS) { msStringBufferAppend(expression, exprBindings[binding].string); msStringBufferAppend(expression, op); msReplaceFreeableStr(&(exprBindings[binding].string), nullptr); msInitExpression(&(exprBindings[binding])); status = msSLDParseOgcExpression(psRoot->psChild->psNext, psObj, binding, objtype); if (status == MS_SUCCESS && exprBindings[binding].string) { msStringBufferAppend(expression, exprBindings[binding].string); msStringBufferAppend(expression, ")"); msReplaceFreeableStr(&(exprBindings[binding].string), msStringBufferReleaseStringAndFree(expression)); expression = NULL; exprBindings[binding].type = MS_EXPRESSION; (*nexprbindings)++; } } if (expression != NULL) { msStringBufferFree(expression); msInitExpression(&(exprBindings[binding])); } } break; default: break; } return status; } /************************************************************************/ /* msSLDParsePolygonSymbolizer() */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Here, the CssParameter names are fill instead of stroke and */ /* fill-opacity instead of stroke-opacity. None of the other * CssParameters*/ /* in Stroke are available for filling and the default value for the fill * color in this context is 50% gray (value #808080).*/ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* The default if neither an ExternalGraphic nor a Mark is specified is to * use the default*/ /* mark of a square with a 50%-gray fill and a black outline, with a size * of 6 pixels.*/ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* The WellKnownName element gives the well-known name of the shape of the * mark.*/ /* Allowed values include at least square, circle, triangle, star, cross,*/ /* and x, though map servers may draw a different symbol instead if they * don't have a*/ /* shape for all of these. The default WellKnownName is square. Renderings * of these*/ /* marks may be made solid or hollow depending on Fill and Stroke * elements.*/ /* */ /************************************************************************/ int msSLDParsePolygonSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, int bNewClass, const char *pszUserStyleName) { CPLXMLNode *psFill, *psStroke; CPLXMLNode *psDisplacement = NULL, *psDisplacementX = NULL, *psDisplacementY = NULL; int nOffsetX = -1, nOffsetY = -1; if (!psRoot || !psLayer) return MS_FAILURE; // Get uom if any, defaults to MS_PIXELS enum MS_UNITS sizeunits = MS_PIXELS; if (msSLDParseUomAttribute(psRoot, &sizeunits) != MS_SUCCESS) { msSetError(MS_WMSERR, "Invalid uom attribute value.", "msSLDParsePolygonSymbolizer()"); return MS_FAILURE; } /*parse displacement for SLD 1.1.0*/ psDisplacement = CPLGetXMLNode(psRoot, "Displacement"); if (psDisplacement) { psDisplacementX = CPLGetXMLNode(psDisplacement, "DisplacementX"); psDisplacementY = CPLGetXMLNode(psDisplacement, "DisplacementY"); /* psCssParam->psChild->psNext->pszValue) */ if (psDisplacementX && psDisplacementX->psChild && psDisplacementX->psChild->pszValue && psDisplacementY && psDisplacementY->psChild && psDisplacementY->psChild->pszValue) { nOffsetX = atoi(psDisplacementX->psChild->pszValue); nOffsetY = atoi(psDisplacementY->psChild->pszValue); } } psFill = CPLGetXMLNode(psRoot, "Fill"); if (psFill) { const int nClassId = getClassId(psLayer, bNewClass, pszUserStyleName); if (nClassId < 0) return MS_FAILURE; const int iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; msSLDParsePolygonFill(psFill, psLayer->_class[nClassId]->styles[iStyle], psLayer->map); if (nOffsetX > 0 && nOffsetY > 0) { psLayer->_class[nClassId]->styles[iStyle]->offsetx = nOffsetX; psLayer->_class[nClassId]->styles[iStyle]->offsety = nOffsetY; } } /* stroke which corresponds to the outline in mapserver */ /* is drawn after the fill */ psStroke = CPLGetXMLNode(psRoot, "Stroke"); if (psStroke) { /* -------------------------------------------------------------------- */ /* there was a fill so add a style to the last class created */ /* by the fill */ /* -------------------------------------------------------------------- */ int nClassId; int iStyle; if (psFill && psLayer->numclasses > 0) { nClassId = psLayer->numclasses - 1; iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; } else { nClassId = getClassId(psLayer, bNewClass, pszUserStyleName); if (nClassId < 0) return MS_FAILURE; iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; } msSLDParseStroke(psStroke, psLayer->_class[nClassId]->styles[iStyle], psLayer->map, 1); if (nOffsetX > 0 && nOffsetY > 0) { psLayer->_class[nClassId]->styles[iStyle]->offsetx = nOffsetX; psLayer->_class[nClassId]->styles[iStyle]->offsety = nOffsetY; } } return MS_SUCCESS; } /************************************************************************/ /* void msSLDParsePolygonFill(CPLXMLNode *psFill, styleObj *psStyle, */ /* mapObj *map) */ /* */ /* Parse the Fill node for a polygon into a style. */ /************************************************************************/ int msSLDParsePolygonFill(CPLXMLNode *psFill, styleObj *psStyle, mapObj *map) { CPLXMLNode *psCssParam, *psGraphicFill; char *psFillName = NULL; if (!psFill || !psStyle || !map) return MS_FAILURE; /* sets the default fill color defined in the spec #808080 */ psStyle->color.red = 128; psStyle->color.green = 128; psStyle->color.blue = 128; psCssParam = CPLGetXMLNode(psFill, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psFill, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { psFillName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (psFillName) { if (strcasecmp(psFillName, "fill") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_COLOR, MS_OBJ_STYLE); } } else if (strcasecmp(psFillName, "fill-opacity") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_OPACITY, MS_OBJ_STYLE); } } } psCssParam = psCssParam->psNext; } /* graphic fill and graphic stroke pare parsed the same way : */ /* TODO : It seems inconsistent to me since the only difference */ /* between them seems to be fill (fill) or not fill (stroke). And */ /* then again the fill parameter can be used inside both elements. */ psGraphicFill = CPLGetXMLNode(psFill, "GraphicFill"); if (psGraphicFill) msSLDParseGraphicFillOrStroke(psGraphicFill, NULL, psStyle, map); psGraphicFill = CPLGetXMLNode(psFill, "GraphicStroke"); if (psGraphicFill) msSLDParseGraphicFillOrStroke(psGraphicFill, NULL, psStyle, map); return MS_SUCCESS; } /************************************************************************/ /* msSLDParseGraphicFillOrStroke */ /* */ /* Parse the GraphicFill Or GraphicStroke node : look for a */ /* Marker symbol and set the style for that symbol. */ /************************************************************************/ int msSLDParseGraphicFillOrStroke(CPLXMLNode *psRoot, char *pszDashValue_unused, styleObj *psStyle, mapObj *map) { (void)pszDashValue_unused; CPLXMLNode *psCssParam, *psGraphic, *psExternalGraphic, *psMark, *psSize, *psGap, *psInitialGap; CPLXMLNode *psWellKnownName, *psStroke, *psFill; CPLXMLNode *psDisplacement = NULL, *psDisplacementX = NULL, *psDisplacementY = NULL; CPLXMLNode *psOpacity = NULL, *psRotation = NULL; char *psName = NULL, *psValue = NULL; char *pszSymbolName = NULL; int bFilled = 0; if (!psRoot || !psStyle || !map) return MS_FAILURE; /* ==================================================================== */ /* This a definition taken from the specification (11.3.2) : */ /* Graphics can either be referenced from an external URL in a common * format (such as*/ /* GIF or SVG) or may be derived from a Mark. Multiple external URLs and * marks may be*/ /* referenced with the semantic that they all provide the equivalent * graphic in different*/ /* formats. */ /* */ /* For this reason, we only need to support one Mark and one */ /* ExtrnalGraphic ???? */ /* ==================================================================== */ psGraphic = CPLGetXMLNode(psRoot, "Graphic"); if (psGraphic) { /* extract symbol size */ psSize = CPLGetXMLNode(psGraphic, "Size"); if (psSize && psSize->psChild) { msSLDParseOgcExpression(psSize->psChild, psStyle, MS_STYLE_BINDING_SIZE, MS_OBJ_STYLE); } else { /*do not set a default for external symbols #2305*/ psExternalGraphic = CPLGetXMLNode(psGraphic, "ExternalGraphic"); if (!psExternalGraphic) psStyle->size = 6; /* default value */ } /*SLD 1.1.0 extract opacity, rotation, displacement*/ psOpacity = CPLGetXMLNode(psGraphic, "Opacity"); if (psOpacity && psOpacity->psChild) { msSLDParseOgcExpression(psOpacity->psChild, psStyle, MS_STYLE_BINDING_OPACITY, MS_OBJ_STYLE); } psRotation = CPLGetXMLNode(psGraphic, "Rotation"); if (psRotation && psRotation->psChild) { msSLDParseOgcExpression(psRotation->psChild, psStyle, MS_STYLE_BINDING_ANGLE, MS_OBJ_STYLE); } psDisplacement = CPLGetXMLNode(psGraphic, "Displacement"); if (psDisplacement && psDisplacement->psChild) { psDisplacementX = CPLGetXMLNode(psDisplacement, "DisplacementX"); if (psDisplacementX && psDisplacementX->psChild) { msSLDParseOgcExpression(psDisplacementX->psChild, psStyle, MS_STYLE_BINDING_OFFSET_X, MS_OBJ_STYLE); } psDisplacementY = CPLGetXMLNode(psDisplacement, "DisplacementY"); if (psDisplacementY && psDisplacementY->psChild) { msSLDParseOgcExpression(psDisplacementY->psChild, psStyle, MS_STYLE_BINDING_OFFSET_Y, MS_OBJ_STYLE); } } /* extract symbol */ psMark = CPLGetXMLNode(psGraphic, "Mark"); if (psMark) { pszSymbolName = NULL; psWellKnownName = CPLGetXMLNode(psMark, "WellKnownName"); if (psWellKnownName && psWellKnownName->psChild && psWellKnownName->psChild->pszValue) pszSymbolName = msStrdup(psWellKnownName->psChild->pszValue); /* default symbol is square */ if (!pszSymbolName || !*pszSymbolName || (strcasecmp(pszSymbolName, "square") != 0 && strcasecmp(pszSymbolName, "circle") != 0 && strcasecmp(pszSymbolName, "triangle") != 0 && strcasecmp(pszSymbolName, "star") != 0 && strcasecmp(pszSymbolName, "cross") != 0 && strcasecmp(pszSymbolName, "x") != 0)) { if (!pszSymbolName || !*pszSymbolName || msGetSymbolIndex(&map->symbolset, pszSymbolName, MS_FALSE) < 0) { msFree(pszSymbolName); pszSymbolName = msStrdup("square"); } } /* check if the symbol should be filled or not */ psFill = CPLGetXMLNode(psMark, "Fill"); psStroke = CPLGetXMLNode(psMark, "Stroke"); if (psFill || psStroke) { if (psFill) bFilled = 1; else bFilled = 0; if (psFill) { psCssParam = CPLGetXMLNode(psFill, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psFill, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { psName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (psName && strcasecmp(psName, "fill") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_COLOR, MS_OBJ_STYLE); } } else if (psName && strcasecmp(psName, "fill-opacity") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { psValue = psCssParam->psChild->psNext->pszValue; if (psValue) { psStyle->color.alpha = (int)(atof(psValue) * 255); } } } psCssParam = psCssParam->psNext; } } if (psStroke) { psCssParam = CPLGetXMLNode(psStroke, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psStroke, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { psName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (psName && strcasecmp(psName, "stroke") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { if (bFilled) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_OUTLINECOLOR, MS_OBJ_STYLE); } else { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_COLOR, MS_OBJ_STYLE); } } } else if (psName && strcasecmp(psName, "stroke-opacity") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { psValue = psCssParam->psChild->psNext->pszValue; if (psValue) { if (bFilled) { psStyle->outlinecolor.alpha = (int)(atof(psValue) * 255); } else { psStyle->color.alpha = (int)(atof(psValue) * 255); } } } } else if (psName && strcasecmp(psName, "stroke-width") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_WIDTH, MS_OBJ_STYLE); } } psCssParam = psCssParam->psNext; } } } /* set the default color if color is not not already set */ if ((psStyle->color.red < 0 || psStyle->color.green == -1 || psStyle->color.blue == -1) && (psStyle->outlinecolor.red == -1 || psStyle->outlinecolor.green == -1 || psStyle->outlinecolor.blue == -1)) { psStyle->color.red = 128; psStyle->color.green = 128; psStyle->color.blue = 128; } /* Get the corresponding symbol id */ psStyle->symbol = msSLDGetMarkSymbol(map, pszSymbolName, bFilled); if (psStyle->symbol > 0 && psStyle->symbol < map->symbolset.numsymbols) psStyle->symbolname = msStrdup(map->symbolset.symbol[psStyle->symbol]->name); } else { psExternalGraphic = CPLGetXMLNode(psGraphic, "ExternalGraphic"); if (psExternalGraphic) msSLDParseExternalGraphic(psExternalGraphic, psStyle, map); } msFree(pszSymbolName); } psGap = CPLGetXMLNode(psRoot, "Gap"); if (psGap && psGap->psChild && psGap->psChild->pszValue) { psStyle->gap = atof(psGap->psChild->pszValue); } psInitialGap = CPLGetXMLNode(psRoot, "InitialGap"); if (psInitialGap && psInitialGap->psChild && psInitialGap->psChild->pszValue) { psStyle->initialgap = atof(psInitialGap->psChild->pszValue); } return MS_SUCCESS; } /************************************************************************/ /* msSLDGetMarkSymbol */ /* */ /* Get a Mark symbol using the name. Mark symbols can be */ /* square, circle, triangle, star, cross, x. */ /* If the symbol does not exist add it to the symbol list. */ /************************************************************************/ int msSLDGetMarkSymbol(mapObj *map, char *pszSymbolName, int bFilled) { int nSymbolId = 0; symbolObj *psSymbol = NULL; if (!map || !pszSymbolName) return 0; if (strcasecmp(pszSymbolName, "square") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_SQUARE_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_SQUARE, MS_FALSE); } else if (strcasecmp(pszSymbolName, "circle") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_CIRCLE_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_CIRCLE, MS_FALSE); } else if (strcasecmp(pszSymbolName, "triangle") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_TRIANGLE_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_TRIANGLE, MS_FALSE); } else if (strcasecmp(pszSymbolName, "star") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_STAR_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_STAR, MS_FALSE); } else if (strcasecmp(pszSymbolName, "cross") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_CROSS_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_CROSS, MS_FALSE); } else if (strcasecmp(pszSymbolName, "x") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_X_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_X, MS_FALSE); } else { nSymbolId = msGetSymbolIndex(&map->symbolset, pszSymbolName, MS_FALSE); } if (nSymbolId <= 0) { if ((psSymbol = msGrowSymbolSet(&(map->symbolset))) == NULL) return 0; /* returns 0 for no symbol */ nSymbolId = map->symbolset.numsymbols; map->symbolset.numsymbols++; initSymbol(psSymbol); psSymbol->inmapfile = MS_TRUE; psSymbol->sizex = 1; psSymbol->sizey = 1; if (strcasecmp(pszSymbolName, "square") == 0) { if (bFilled) psSymbol->name = msStrdup(SLD_MARK_SYMBOL_SQUARE_FILLED); else psSymbol->name = msStrdup(SLD_MARK_SYMBOL_SQUARE); psSymbol->type = MS_SYMBOL_VECTOR; if (bFilled) psSymbol->filled = MS_TRUE; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; } else if (strcasecmp(pszSymbolName, "circle") == 0) { if (bFilled) psSymbol->name = msStrdup(SLD_MARK_SYMBOL_CIRCLE_FILLED); else psSymbol->name = msStrdup(SLD_MARK_SYMBOL_CIRCLE); psSymbol->type = MS_SYMBOL_ELLIPSE; if (bFilled) psSymbol->filled = MS_TRUE; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->sizex = 1; psSymbol->sizey = 1; psSymbol->numpoints++; } else if (strcasecmp(pszSymbolName, "triangle") == 0) { if (bFilled) psSymbol->name = msStrdup(SLD_MARK_SYMBOL_TRIANGLE_FILLED); else psSymbol->name = msStrdup(SLD_MARK_SYMBOL_TRIANGLE); psSymbol->type = MS_SYMBOL_VECTOR; if (bFilled) psSymbol->filled = MS_TRUE; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; } else if (strcasecmp(pszSymbolName, "star") == 0) { if (bFilled) psSymbol->name = msStrdup(SLD_MARK_SYMBOL_STAR_FILLED); else psSymbol->name = msStrdup(SLD_MARK_SYMBOL_STAR); psSymbol->type = MS_SYMBOL_VECTOR; if (bFilled) psSymbol->filled = MS_TRUE; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 0.375; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.35; psSymbol->points[psSymbol->numpoints].y = 0.375; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.65; psSymbol->points[psSymbol->numpoints].y = 0.375; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 0.375; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.75; psSymbol->points[psSymbol->numpoints].y = 0.625; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.875; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 0.75; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.125; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.25; psSymbol->points[psSymbol->numpoints].y = 0.625; psSymbol->numpoints++; } /* cross is like plus (+) since there is also X symbol ?? */ else if (strcasecmp(pszSymbolName, "cross") == 0) { /* NEVER FILL CROSS */ /* if (bFilled) */ /* psSymbol->name = msStrdup(SLD_MARK_SYMBOL_CROSS_FILLED); */ /* else */ psSymbol->name = msStrdup(SLD_MARK_SYMBOL_CROSS); psSymbol->type = MS_SYMBOL_VECTOR; /* if (bFilled) */ /* psSymbol->filled = MS_TRUE; */ psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = -99; psSymbol->points[psSymbol->numpoints].y = -99; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 0.5; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 0.5; psSymbol->numpoints++; } else if (strcasecmp(pszSymbolName, "x") == 0) { /* NEVER FILL X */ /* if (bFilled) */ /* psSymbol->name = msStrdup(SLD_MARK_SYMBOL_X_FILLED); */ /* else */ psSymbol->name = msStrdup(SLD_MARK_SYMBOL_X); psSymbol->type = MS_SYMBOL_VECTOR; /* if (bFilled) */ /* psSymbol->filled = MS_TRUE; */ psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = -99; psSymbol->points[psSymbol->numpoints].y = -99; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; } } return nSymbolId; } /************************************************************************/ /* msSLDGetGraphicSymbol */ /* */ /* Create a symbol entry for an inmap pixmap symbol. Returns */ /* the symbol id. */ /************************************************************************/ int msSLDGetGraphicSymbol(mapObj *map, char *pszFileName, char *extGraphicName, int nGap_ignored) { (void)nGap_ignored; int nSymbolId = 0; symbolObj *psSymbol = NULL; if (map && pszFileName) { if ((psSymbol = msGrowSymbolSet(&(map->symbolset))) == NULL) return 0; /* returns 0 for no symbol */ nSymbolId = map->symbolset.numsymbols; map->symbolset.numsymbols++; initSymbol(psSymbol); psSymbol->inmapfile = MS_TRUE; psSymbol->type = MS_SYMBOL_PIXMAP; psSymbol->name = msStrdup(extGraphicName); psSymbol->imagepath = msStrdup(pszFileName); psSymbol->full_pixmap_path = msStrdup(pszFileName); } return nSymbolId; } /************************************************************************/ /* msSLDParsePointSymbolizer */ /* */ /* Parse point symbolizer. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /************************************************************************/ int msSLDParsePointSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, int bNewClass, const char *pszUserStyleName) { int nClassId = 0; int iStyle = 0; if (!psRoot || !psLayer) return MS_FAILURE; nClassId = getClassId(psLayer, bNewClass, pszUserStyleName); if (nClassId < 0) return MS_FAILURE; // Get uom if any, defaults to MS_PIXELS enum MS_UNITS sizeunits = MS_PIXELS; if (msSLDParseUomAttribute(psRoot, &sizeunits) != MS_SUCCESS) { msSetError(MS_WMSERR, "Invalid uom attribute value.", "msSLDParsePolygonSymbolizer()"); return MS_FAILURE; } iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; msSLDParseGraphicFillOrStroke( psRoot, NULL, psLayer->_class[nClassId]->styles[iStyle], psLayer->map); return MS_SUCCESS; } /************************************************************************/ /* msSLDParseExternalGraphic */ /* */ /* Parse external graphic node : download the symbol referenced */ /* by the URL and create a PIXMAP inmap symbol. Only GIF and */ /* PNG are supported. */ /************************************************************************/ int msSLDParseExternalGraphic(CPLXMLNode *psExternalGraphic, styleObj *psStyle, mapObj *map) { char *pszFormat = NULL; CPLXMLNode *psURL = NULL, *psFormat = NULL, *psTmp = NULL; char *pszURL = NULL; if (!psExternalGraphic || !psStyle || !map) return MS_FAILURE; psFormat = CPLGetXMLNode(psExternalGraphic, "Format"); if (psFormat && psFormat->psChild && psFormat->psChild->pszValue) pszFormat = psFormat->psChild->pszValue; /* supports GIF and PNG and SVG */ if (pszFormat && (strcasecmp(pszFormat, "GIF") == 0 || strcasecmp(pszFormat, "image/gif") == 0 || strcasecmp(pszFormat, "PNG") == 0 || strcasecmp(pszFormat, "image/png") == 0 || strcasecmp(pszFormat, "image/svg+xml") == 0)) { /* */ psURL = CPLGetXMLNode(psExternalGraphic, "OnlineResource"); if (psURL && psURL->psChild) { psTmp = psURL->psChild; while (psTmp != NULL && psTmp->pszValue && strcasecmp(psTmp->pszValue, "xlink:href") != 0) { psTmp = psTmp->psNext; } if (psTmp && psTmp->psChild) { pszURL = (char *)psTmp->psChild->pszValue; char *symbolurl = NULL; // Handle relative URL for ExternalGraphic if (map->sldurl && !strstr(pszURL, "://")) { char *baseurl = NULL; char *relpath = NULL; symbolurl = static_cast(malloc(sizeof(char) * MS_MAXPATHLEN)); if (pszURL[0] != '/') { // Symbol file is relative to SLD file // e.g. SLD : http://example.com/path/to/sld.xml // and symbol: assets/symbol.svg // lead to: http://example.com/path/to/assets/symbol.svg baseurl = msGetPath(map->sldurl); relpath = pszURL; } else { // Symbol file is relative to the root of SLD server // e.g. SLD : http://example.com/path/to/sld.xml // and symbol: /path/to/assets/symbol.svg // lead to: http://example.com/path/to/assets/symbol.svg baseurl = msStrdup(map->sldurl); relpath = pszURL + 1; char *sep = strstr(baseurl, "://"); if (sep) sep += 3; else sep = baseurl; sep = strchr(sep, '/'); if (!sep) sep = baseurl + strlen(baseurl); sep[1] = '\0'; } msBuildPath(symbolurl, baseurl, relpath); msFree(baseurl); } else { // Absolute URL // e.g. symbol: http://example.com/path/to/assets/symbol.svg symbolurl = msStrdup(pszURL); } /* validate the ExternalGraphic parameter */ if (msValidateParameter(symbolurl, msLookupHashTable(&(map->web.validation), "sld_external_graphic"), NULL, NULL, NULL) != MS_SUCCESS) { msSetError(MS_WEBERR, "SLD ExternalGraphic OnlineResource value fails to " "validate against sld_external_graphic VALIDATION", "mapserv()"); msFree(symbolurl); return MS_FAILURE; } /*external symbols using http will be automatically downloaded. The file should be saved in a temporary directory (msAddImageSymbol) #2305*/ psStyle->symbol = msGetSymbolIndex(&map->symbolset, symbolurl, MS_TRUE); msFree(symbolurl); if (psStyle->symbol > 0 && psStyle->symbol < map->symbolset.numsymbols) psStyle->symbolname = msStrdup(map->symbolset.symbol[psStyle->symbol]->name); /* set the color parameter if not set. Does not make sense */ /* for pixmap but mapserver needs it. */ if (psStyle->color.red == -1 || psStyle->color.green || psStyle->color.blue) { psStyle->color.red = 0; psStyle->color.green = 0; psStyle->color.blue = 0; } } } } return MS_SUCCESS; } /************************************************************************/ /* msSLDParseTextSymbolizer */ /* */ /* Parse text symbolizer. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Four types of CssParameter are allowed, font-family, font-style,*/ /* fontweight,and font-size. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* The coordinates are given as two floating-point numbers in */ /* the AnchorPointX and AnchorPointY elements each with values */ /* between 0.0 and 1.0 inclusive. The bounding box of the label */ /* to be rendered is considered to be in a coorindate space */ /* from 0.0 (lowerleft corner) to 1.0 (upper-right corner), and */ /* the anchor position is specified as a point in this */ /* space. The default point is X=0, Y=0.5, which is at the */ /* middle height of the lefthand side of the label. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /************************************************************************/ int msSLDParseTextSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, int bOtherSymboliser, const char *pszUserStyleName) { int nStyleId = 0, nClassId = 0; if (!psRoot || !psLayer) return MS_FAILURE; if (!bOtherSymboliser) { if (msGrowLayerClasses(psLayer) == NULL) return MS_FAILURE; initClass(psLayer->_class[psLayer->numclasses]); nClassId = psLayer->numclasses; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); psLayer->numclasses++; msMaybeAllocateClassStyle(psLayer->_class[nClassId], 0); nStyleId = 0; } else { nClassId = psLayer->numclasses - 1; if (nClassId >= 0) /* should always be true */ nStyleId = psLayer->_class[nClassId]->numstyles - 1; } if (nStyleId >= 0 && nClassId >= 0) /* should always be true */ msSLDParseTextParams(psRoot, psLayer, psLayer->_class[nClassId]); return MS_SUCCESS; } /************************************************************************/ /* msSLDParseRasterSymbolizer */ /* */ /* Supports the ColorMap parameter in a Raster Symbolizer. In */ /* the ColorMap, only color and quantity are used here. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* SLD 1.1 */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /************************************************************************/ int msSLDParseRasterSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, const char *pszUserStyleName) { CPLXMLNode *psColorMap = NULL, *psColorEntry = NULL, *psOpacity = NULL; char *pszColor = NULL, *pszQuantity = NULL; char *pszPreviousColor = NULL, *pszPreviousQuality = NULL; colorObj sColor; char szExpression[100]; double dfOpacity = 1.0; char *pszLabel = NULL, *pszPreviousLabel = NULL; char *pch = NULL, *pchPrevious = NULL; CPLXMLNode *psNode = NULL, *psCategorize = NULL; char *pszTmp = NULL; int nValues = 0, nThresholds = 0; int i, nMaxValues = 100, nMaxThreshold = 100; if (!psRoot || !psLayer) return MS_FAILURE; psOpacity = CPLGetXMLNode(psRoot, "Opacity"); if (psOpacity) { if (psOpacity->psChild && psOpacity->psChild->pszValue) dfOpacity = atof(psOpacity->psChild->pszValue); /* values in sld goes from 0.0 (for transparent) to 1.0 (for full opacity); */ if (dfOpacity >= 0.0 && dfOpacity <= 1.0) msSetLayerOpacity(psLayer, (int)(dfOpacity * 100)); else { msSetError(MS_WMSERR, "Invalid opacity value. Values should be between 0.0 and 1.0", "msSLDParseRasterSymbolizer()"); return MS_FAILURE; } } psColorMap = CPLGetXMLNode(psRoot, "ColorMap"); if (psColorMap) { psColorEntry = CPLGetXMLNode(psColorMap, "ColorMapEntry"); if (psColorEntry) { /*SLD 1.0*/ while (psColorEntry && psColorEntry->pszValue && strcasecmp(psColorEntry->pszValue, "ColorMapEntry") == 0) { pszColor = (char *)CPLGetXMLValue(psColorEntry, "color", NULL); pszQuantity = (char *)CPLGetXMLValue(psColorEntry, "quantity", NULL); pszLabel = (char *)CPLGetXMLValue(psColorEntry, "label", NULL); if (pszColor && pszQuantity) { if (pszPreviousColor && pszPreviousQuality) { if (strlen(pszPreviousColor) == 7 && pszPreviousColor[0] == '#' && strlen(pszColor) == 7 && pszColor[0] == '#') { sColor.red = msHexToInt(pszPreviousColor + 1); sColor.green = msHexToInt(pszPreviousColor + 3); sColor.blue = msHexToInt(pszPreviousColor + 5); /* pszQuantity and pszPreviousQuality may be integer or float */ pchPrevious = strchr(pszPreviousQuality, '.'); pch = strchr(pszQuantity, '.'); if (pchPrevious == NULL && pch == NULL) { snprintf(szExpression, sizeof(szExpression), "([pixel] >= %d AND [pixel] < %d)", atoi(pszPreviousQuality), atoi(pszQuantity)); } else if (pchPrevious != NULL && pch == NULL) { snprintf(szExpression, sizeof(szExpression), "([pixel] >= %f AND [pixel] < %d)", atof(pszPreviousQuality), atoi(pszQuantity)); } else if (pchPrevious == NULL && pch != NULL) { snprintf(szExpression, sizeof(szExpression), "([pixel] >= %d AND [pixel] < %f)", atoi(pszPreviousQuality), atof(pszQuantity)); } else { snprintf(szExpression, sizeof(szExpression), "([pixel] >= %f AND [pixel] < %f)", atof(pszPreviousQuality), atof(pszQuantity)); } if (msGrowLayerClasses(psLayer) == NULL) return MS_FAILURE; else { initClass(psLayer->_class[psLayer->numclasses]); psLayer->numclasses++; const int nClassId = psLayer->numclasses - 1; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); /*set the class name using the label. If label not defined set it with the quantity*/ if (pszPreviousLabel) psLayer->_class[nClassId]->name = msStrdup(pszPreviousLabel); else psLayer->_class[nClassId]->name = msStrdup(pszPreviousQuality); msMaybeAllocateClassStyle(psLayer->_class[nClassId], 0); psLayer->_class[nClassId]->styles[0]->color.red = sColor.red; psLayer->_class[nClassId]->styles[0]->color.green = sColor.green; psLayer->_class[nClassId]->styles[0]->color.blue = sColor.blue; if (!psLayer->classitem || strcasecmp(psLayer->classitem, "[pixel]") != 0) { free(psLayer->classitem); psLayer->classitem = msStrdup("[pixel]"); } msLoadExpressionString(&psLayer->_class[nClassId]->expression, szExpression); } } else { msSetError(MS_WMSERR, "Invalid ColorMap Entry.", "msSLDParseRasterSymbolizer()"); return MS_FAILURE; } } pszPreviousColor = pszColor; pszPreviousQuality = pszQuantity; pszPreviousLabel = pszLabel; } psColorEntry = psColorEntry->psNext; } /* do the last Color Map Entry */ if (pszColor && pszQuantity) { if (strlen(pszColor) == 7 && pszColor[0] == '#') { sColor.red = msHexToInt(pszColor + 1); sColor.green = msHexToInt(pszColor + 3); sColor.blue = msHexToInt(pszColor + 5); /* pszQuantity may be integer or float */ pch = strchr(pszQuantity, '.'); if (pch == NULL) { snprintf(szExpression, sizeof(szExpression), "([pixel] = %d)", atoi(pszQuantity)); } else { snprintf(szExpression, sizeof(szExpression), "([pixel] = %f)", atof(pszQuantity)); } if (msGrowLayerClasses(psLayer) == NULL) return MS_FAILURE; else { initClass(psLayer->_class[psLayer->numclasses]); psLayer->numclasses++; const int nClassId = psLayer->numclasses - 1; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); msMaybeAllocateClassStyle(psLayer->_class[nClassId], 0); if (pszLabel) psLayer->_class[nClassId]->name = msStrdup(pszLabel); else psLayer->_class[nClassId]->name = msStrdup(pszQuantity); psLayer->_class[nClassId]->numstyles = 1; psLayer->_class[nClassId]->styles[0]->color.red = sColor.red; psLayer->_class[nClassId]->styles[0]->color.green = sColor.green; psLayer->_class[nClassId]->styles[0]->color.blue = sColor.blue; if (!psLayer->classitem || strcasecmp(psLayer->classitem, "[pixel]") != 0) { free(psLayer->classitem); psLayer->classitem = msStrdup("[pixel]"); } msLoadExpressionString(&psLayer->_class[nClassId]->expression, szExpression); } } } } else if ((psCategorize = CPLGetXMLNode(psColorMap, "Categorize"))) { char **papszValues = (char **)msSmallMalloc(sizeof(char *) * nMaxValues); char **papszThresholds = (char **)msSmallMalloc(sizeof(char *) * nMaxThreshold); psNode = CPLGetXMLNode(psCategorize, "Value"); while (psNode && psNode->pszValue && psNode->psChild && psNode->psChild->pszValue) { if (strcasecmp(psNode->pszValue, "Value") == 0) { papszValues[nValues] = psNode->psChild->pszValue; nValues++; if (nValues == nMaxValues) { nMaxValues += 100; papszValues = (char **)msSmallRealloc(papszValues, sizeof(char *) * nMaxValues); } } else if (strcasecmp(psNode->pszValue, "Threshold") == 0) { papszThresholds[nThresholds] = psNode->psChild->pszValue; nThresholds++; if (nValues == nMaxThreshold) { nMaxThreshold += 100; papszThresholds = (char **)msSmallRealloc( papszThresholds, sizeof(char *) * nMaxThreshold); } } psNode = psNode->psNext; } if (nThresholds > 0 && nValues == nThresholds + 1) { /*free existing classes*/ for (i = 0; i < psLayer->numclasses; i++) { if (psLayer->_class[i] != NULL) { psLayer->_class[i]->layer = NULL; if (freeClass(psLayer->_class[i]) == MS_SUCCESS) { msFree(psLayer->_class[i]); psLayer->_class[i] = NULL; } } } psLayer->numclasses = 0; for (i = 0; i < nValues; i++) { pszTmp = (papszValues[i]); if (pszTmp && strlen(pszTmp) == 7 && pszTmp[0] == '#') { sColor.red = msHexToInt(pszTmp + 1); sColor.green = msHexToInt(pszTmp + 3); sColor.blue = msHexToInt(pszTmp + 5); if (i == 0) { if (strchr(papszThresholds[i], '.')) snprintf(szExpression, sizeof(szExpression), "([pixel] < %f)", atof(papszThresholds[i])); else snprintf(szExpression, sizeof(szExpression), "([pixel] < %d)", atoi(papszThresholds[i])); } else if (i < nValues - 1) { if (strchr(papszThresholds[i], '.')) snprintf(szExpression, sizeof(szExpression), "([pixel] >= %f AND [pixel] < %f)", atof(papszThresholds[i - 1]), atof(papszThresholds[i])); else snprintf(szExpression, sizeof(szExpression), "([pixel] >= %d AND [pixel] < %d)", atoi(papszThresholds[i - 1]), atoi(papszThresholds[i])); } else { if (strchr(papszThresholds[i - 1], '.')) snprintf(szExpression, sizeof(szExpression), "([pixel] >= %f)", atof(papszThresholds[i - 1])); else snprintf(szExpression, sizeof(szExpression), "([pixel] >= %d)", atoi(papszThresholds[i - 1])); } if (msGrowLayerClasses(psLayer)) { initClass(psLayer->_class[psLayer->numclasses]); psLayer->numclasses++; const int nClassId = psLayer->numclasses - 1; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); msMaybeAllocateClassStyle(psLayer->_class[nClassId], 0); psLayer->_class[nClassId]->numstyles = 1; psLayer->_class[nClassId]->styles[0]->color.red = sColor.red; psLayer->_class[nClassId]->styles[0]->color.green = sColor.green; psLayer->_class[nClassId]->styles[0]->color.blue = sColor.blue; if (psLayer->classitem && strcasecmp(psLayer->classitem, "[pixel]") != 0) free(psLayer->classitem); psLayer->classitem = msStrdup("[pixel]"); msLoadExpressionString(&psLayer->_class[nClassId]->expression, szExpression); } } } } msFree(papszValues); msFree(papszThresholds); } else { msSetError(MS_WMSERR, "Invalid SLD document. msSLDParseRaster", ""); return MS_FAILURE; } } return MS_SUCCESS; } /************************************************************************/ /* msSLDParseTextParams */ /* */ /* Parse text parameters like font, placement and color. */ /************************************************************************/ int msSLDParseTextParams(CPLXMLNode *psRoot, layerObj *psLayer, classObj *psClass) { char szFontName[100]; CPLXMLNode *psLabel = NULL, *psFont = NULL; CPLXMLNode *psCssParam = NULL; char *pszName = NULL, *pszFontFamily = NULL, *pszFontStyle = NULL; char *pszFontWeight = NULL; CPLXMLNode *psLabelPlacement = NULL, *psPointPlacement = NULL, *psLinePlacement = NULL; CPLXMLNode *psFill = NULL, *psHalo = NULL, *psHaloRadius = NULL, *psHaloFill = NULL; labelObj *psLabelObj = NULL; szFontName[0] = '\0'; if (!psRoot || !psClass || !psLayer) return MS_FAILURE; if (psClass->numlabels == 0) { if (msGrowClassLabels(psClass) == NULL) return (MS_FAILURE); initLabel(psClass->labels[0]); psClass->numlabels++; } psLabelObj = psClass->labels[0]; /*set the angle by default to auto. the angle can be modified Label Placement #2806*/ psLabelObj->anglemode = MS_AUTO; /* label */ /* support literal expression and propertyname - - Bug 1857 */ psLabel = CPLGetXMLNode(psRoot, "Label"); if (psLabel) { const char *sep = ""; msStringBuffer *classtext = msStringBufferAlloc(); msStringBufferAppend(classtext, "("); for (CPLXMLNode *psTmpNode = psLabel->psChild; psTmpNode; psTmpNode = psTmpNode->psNext) { if (psTmpNode->eType == CXT_Text && psTmpNode->pszValue) { msStringBufferAppend(classtext, sep); msStringBufferAppend(classtext, "\""); msStringBufferAppend(classtext, psTmpNode->pszValue); msStringBufferAppend(classtext, "\""); sep = "+"; } else if (psTmpNode->eType == CXT_Element && strcasecmp(psTmpNode->pszValue, "Literal") == 0 && psTmpNode->psChild) { msStringBufferAppend(classtext, sep); msStringBufferAppend(classtext, "\""); msStringBufferAppend(classtext, psTmpNode->psChild->pszValue); msStringBufferAppend(classtext, "\""); sep = "+"; } else if (psTmpNode->eType == CXT_Element && strcasecmp(psTmpNode->pszValue, "PropertyName") == 0 && psTmpNode->psChild) { msStringBufferAppend(classtext, sep); msStringBufferAppend(classtext, "\"["); msStringBufferAppend(classtext, psTmpNode->psChild->pszValue); msStringBufferAppend(classtext, "]\""); sep = "+"; } else if (psTmpNode->eType == CXT_Element && strcasecmp(psTmpNode->pszValue, "Function") == 0 && psTmpNode->psChild) { msStringBufferAppend(classtext, sep); msStringBufferAppend(classtext, "tostring("); labelObj tempExpressionCollector; initLabel(&tempExpressionCollector); msSLDParseOgcExpression(psTmpNode, &tempExpressionCollector, MS_LABEL_BINDING_SIZE, MS_OBJ_LABEL); msStringBufferAppend( classtext, tempExpressionCollector.exprBindings[MS_LABEL_BINDING_SIZE].string); freeLabel(&tempExpressionCollector); msStringBufferAppend(classtext, ",\"%g\")"); sep = "+"; } } msStringBufferAppend(classtext, ")"); const char *expressionstring = msStringBufferGetString(classtext); if (strlen(expressionstring) > 2) { msLoadExpressionString(&psClass->text, (char *)expressionstring); } msStringBufferFree(classtext); { /* font */ psFont = CPLGetXMLNode(psRoot, "Font"); if (psFont) { psCssParam = CPLGetXMLNode(psFont, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psFont, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { pszName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (pszName) { if (strcasecmp(pszName, "font-family") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext && psCssParam->psChild->psNext->pszValue) pszFontFamily = psCssParam->psChild->psNext->pszValue; } /* normal, italic, oblique */ else if (strcasecmp(pszName, "font-style") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext && psCssParam->psChild->psNext->pszValue) pszFontStyle = psCssParam->psChild->psNext->pszValue; } /* normal or bold */ else if (strcasecmp(pszName, "font-weight") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext && psCssParam->psChild->psNext->pszValue) pszFontWeight = psCssParam->psChild->psNext->pszValue; } /* default is 10 pix */ else if (strcasecmp(pszName, "font-size") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psLabelObj, MS_LABEL_BINDING_SIZE, MS_OBJ_LABEL); } } } psCssParam = psCssParam->psNext; } } /* -------------------------------------------------------------------- */ /* parse the label placement. */ /* -------------------------------------------------------------------- */ psLabelPlacement = CPLGetXMLNode(psRoot, "LabelPlacement"); if (psLabelPlacement) { psPointPlacement = CPLGetXMLNode(psLabelPlacement, "PointPlacement"); psLinePlacement = CPLGetXMLNode(psLabelPlacement, "LinePlacement"); if (psPointPlacement) ParseTextPointPlacement(psPointPlacement, psClass); if (psLinePlacement) ParseTextLinePlacement(psLinePlacement, psClass); } /* -------------------------------------------------------------------- */ /* build the font name using the font font-family, font-style */ /* and font-weight. The name building uses a - between these */ /* parameters and the resulting name is compared to the list of */ /* available fonts. If the name exists, it will be used else we */ /* go to the bitmap fonts. */ /* -------------------------------------------------------------------- */ if (pszFontFamily) { snprintf(szFontName, sizeof(szFontName), "%s", pszFontFamily); if (pszFontWeight && strcasecmp(pszFontWeight, "normal") != 0) { strlcat(szFontName, "-", sizeof(szFontName)); strlcat(szFontName, pszFontWeight, sizeof(szFontName)); } if (pszFontStyle && strcasecmp(pszFontStyle, "normal") != 0) { strlcat(szFontName, "-", sizeof(szFontName)); strlcat(szFontName, pszFontStyle, sizeof(szFontName)); } if ((msLookupHashTable(&(psLayer->map->fontset.fonts), szFontName) != NULL)) { psLabelObj->font = msStrdup(szFontName); } } /* -------------------------------------------------------------------- */ /* parse the halo parameter. */ /* -------------------------------------------------------------------- */ psHalo = CPLGetXMLNode(psRoot, "Halo"); if (psHalo) { psHaloRadius = CPLGetXMLNode(psHalo, "Radius"); if (psHaloRadius && psHaloRadius->psChild && psHaloRadius->psChild->pszValue) psLabelObj->outlinewidth = atoi(psHaloRadius->psChild->pszValue); psHaloFill = CPLGetXMLNode(psHalo, "Fill"); if (psHaloFill) { psCssParam = CPLGetXMLNode(psHaloFill, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psHaloFill, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { pszName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (pszName) { if (strcasecmp(pszName, "fill") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression( psCssParam->psChild->psNext, psLabelObj, MS_LABEL_BINDING_OUTLINECOLOR, MS_OBJ_LABEL); } } } psCssParam = psCssParam->psNext; } } } /* -------------------------------------------------------------------- */ /* Parse the color */ /* -------------------------------------------------------------------- */ psFill = CPLGetXMLNode(psRoot, "Fill"); if (psFill) { psCssParam = CPLGetXMLNode(psFill, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psFill, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { pszName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (pszName) { if (strcasecmp(pszName, "fill") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psLabelObj, MS_LABEL_BINDING_COLOR, MS_OBJ_LABEL); } } } psCssParam = psCssParam->psNext; } } } } return MS_SUCCESS; } /************************************************************************/ /* ParseTextPointPlacement */ /* */ /* point placement node for the text symbolizer. */ /************************************************************************/ int ParseTextPointPlacement(CPLXMLNode *psRoot, classObj *psClass) { CPLXMLNode *psAnchor, *psAnchorX, *psAnchorY; CPLXMLNode *psDisplacement, *psDisplacementX, *psDisplacementY; CPLXMLNode *psRotation = NULL; labelObj *psLabelObj = NULL; if (!psRoot || !psClass) return MS_FAILURE; if (psClass->numlabels == 0) { if (msGrowClassLabels(psClass) == NULL) return (MS_FAILURE); initLabel(psClass->labels[0]); psClass->numlabels++; } psLabelObj = psClass->labels[0]; /* init the label with the default position */ psLabelObj->position = MS_CL; /* -------------------------------------------------------------------- */ /* parse anchor point. see function msSLDParseTextSymbolizer */ /* for documentation. */ /* -------------------------------------------------------------------- */ psAnchor = CPLGetXMLNode(psRoot, "AnchorPoint"); if (psAnchor) { psAnchorX = CPLGetXMLNode(psAnchor, "AnchorPointX"); psAnchorY = CPLGetXMLNode(psAnchor, "AnchorPointY"); /* psCssParam->psChild->psNext->pszValue) */ if (psAnchorX && psAnchorX->psChild && psAnchorX->psChild->pszValue && psAnchorY && psAnchorY->psChild && psAnchorY->psChild->pszValue) { const double dfAnchorX = atof(psAnchorX->psChild->pszValue); const double dfAnchorY = atof(psAnchorY->psChild->pszValue); if ((dfAnchorX == 0 || dfAnchorX == 0.5 || dfAnchorX == 1) && (dfAnchorY == 0 || dfAnchorY == 0.5 || dfAnchorY == 1)) { if (dfAnchorX == 0 && dfAnchorY == 0) psLabelObj->position = MS_LL; if (dfAnchorX == 0 && dfAnchorY == 0.5) psLabelObj->position = MS_CL; if (dfAnchorX == 0 && dfAnchorY == 1) psLabelObj->position = MS_UL; if (dfAnchorX == 0.5 && dfAnchorY == 0) psLabelObj->position = MS_LC; if (dfAnchorX == 0.5 && dfAnchorY == 0.5) psLabelObj->position = MS_CC; if (dfAnchorX == 0.5 && dfAnchorY == 1) psLabelObj->position = MS_UC; if (dfAnchorX == 1 && dfAnchorY == 0) psLabelObj->position = MS_LR; if (dfAnchorX == 1 && dfAnchorY == 0.5) psLabelObj->position = MS_CR; if (dfAnchorX == 1 && dfAnchorY == 1) psLabelObj->position = MS_UR; } } } /* -------------------------------------------------------------------- */ /* Parse displacement */ /* -------------------------------------------------------------------- */ psDisplacement = CPLGetXMLNode(psRoot, "Displacement"); if (psDisplacement) { psDisplacementX = CPLGetXMLNode(psDisplacement, "DisplacementX"); psDisplacementY = CPLGetXMLNode(psDisplacement, "DisplacementY"); /* psCssParam->psChild->psNext->pszValue) */ if (psDisplacementX && psDisplacementX->psChild && psDisplacementX->psChild->pszValue && psDisplacementY && psDisplacementY->psChild && psDisplacementY->psChild->pszValue) { psLabelObj->offsetx = atoi(psDisplacementX->psChild->pszValue); psLabelObj->offsety = atoi(psDisplacementY->psChild->pszValue); } } /* -------------------------------------------------------------------- */ /* parse rotation. */ /* -------------------------------------------------------------------- */ psRotation = CPLGetXMLNode(psRoot, "Rotation"); if (psRotation && psRotation->psChild) { msSLDParseOgcExpression(psRotation->psChild, psLabelObj, MS_LABEL_BINDING_ANGLE, MS_OBJ_LABEL); } return MS_SUCCESS; } /************************************************************************/ /* ParseTextLinePlacement */ /* */ /* Lineplacement node fro the text symbolizer. */ /************************************************************************/ int ParseTextLinePlacement(CPLXMLNode *psRoot, classObj *psClass) { CPLXMLNode *psOffset = NULL, *psAligned = NULL; labelObj *psLabelObj = NULL; if (!psRoot || !psClass) return MS_FAILURE; if (psClass->numlabels == 0) { if (msGrowClassLabels(psClass) == NULL) return (MS_FAILURE); initLabel(psClass->labels[0]); psClass->numlabels++; } psLabelObj = psClass->labels[0]; /*if there is a line placement, we will assume that the best setting for mapserver would be for the text to follow the line #2806*/ psLabelObj->anglemode = MS_FOLLOW; /*sld 1.1.0 has a parameter IsAligned. default value is true*/ psAligned = CPLGetXMLNode(psRoot, "IsAligned"); if (psAligned && psAligned->psChild && psAligned->psChild->pszValue && strcasecmp(psAligned->psChild->pszValue, "false") == 0) { psLabelObj->anglemode = MS_NONE; } psOffset = CPLGetXMLNode(psRoot, "PerpendicularOffset"); if (psOffset && psOffset->psChild && psOffset->psChild->pszValue) { psLabelObj->offsetx = atoi(psOffset->psChild->pszValue); psLabelObj->offsety = MS_LABEL_PERPENDICULAR_OFFSET; /*if there is a PerpendicularOffset, we will assume that the best setting for mapserver would be to use angle=0 and the the offset #2806*/ /* since sld 1.1.0 introduces the IsAligned parameter, only set the angles if the parameter is not set*/ if (!psAligned) { psLabelObj->anglemode = MS_NONE; psLabelObj->offsety = psLabelObj->offsetx; } } return MS_SUCCESS; } /************************************************************************/ /* void msSLDSetColorObject(char *psHexColor, colorObj */ /* *psColor) */ /* */ /* Utility function to extract rgb values from an hexadecimal */ /* color string (format is : #aaff08) and set it in the color */ /* object. */ /************************************************************************/ int msSLDSetColorObject(char *psHexColor, colorObj *psColor) { if (psHexColor && psColor && strlen(psHexColor) == 7 && psHexColor[0] == '#') { psColor->red = msHexToInt(psHexColor + 1); psColor->green = msHexToInt(psHexColor + 3); psColor->blue = msHexToInt(psHexColor + 5); } return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* client sld support functions */ /* -------------------------------------------------------------------- */ /************************************************************************/ /* msSLDGenerateSLD(mapObj *map, int iLayer) */ /* */ /* Return an SLD document for all layers that are on or */ /* default. The second argument should be set to -1 to generate */ /* on all layers. Or set to the layer index to generate an SLD */ /* for a specific layer. */ /* */ /* The caller should free the returned string. */ /************************************************************************/ char *msSLDGenerateSLD(mapObj *map, int iLayer, const char *pszVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char szTmp[500]; int i = 0; char *pszTmp = NULL; char *pszSLD = NULL; char *schemalocation = NULL; int sld_version = OWS_VERSION_NOTSET; sld_version = msOWSParseVersionString(pszVersion); if (sld_version == OWS_VERSION_NOTSET || (sld_version != OWS_1_0_0 && sld_version != OWS_1_1_0)) sld_version = OWS_1_0_0; if (map) { schemalocation = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); if (sld_version == OWS_1_0_0) snprintf(szTmp, sizeof(szTmp), "\n", schemalocation); else snprintf(szTmp, sizeof(szTmp), "\n", schemalocation); free(schemalocation); pszSLD = msStringConcatenate(pszSLD, szTmp); if (iLayer < 0 || iLayer > map->numlayers - 1) { for (i = 0; i < map->numlayers; i++) { pszTmp = msSLDGenerateSLDLayer(GET_LAYER(map, i), sld_version); if (pszTmp) { pszSLD = msStringConcatenate(pszSLD, pszTmp); free(pszTmp); } } } else { pszTmp = msSLDGenerateSLDLayer(GET_LAYER(map, iLayer), sld_version); if (pszTmp) { pszSLD = msStringConcatenate(pszSLD, pszTmp); free(pszTmp); } } snprintf(szTmp, sizeof(szTmp), "%s", "\n"); pszSLD = msStringConcatenate(pszSLD, szTmp); } return pszSLD; #else msSetError(MS_MISCERR, "OWS support is not available.", "msSLDGenerateSLDLayer()"); return NULL; #endif } /************************************************************************/ /* msSLDGetGraphicSLD */ /* */ /* Get an SLD for a style containing a symbol (Mark or external). */ /************************************************************************/ char *msSLDGetGraphicSLD(styleObj *psStyle, layerObj *psLayer, int bNeedMarkSybol, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) msStringBuffer *sldString = msStringBufferAlloc(); int nSymbol = -1; symbolObj *psSymbol = NULL; char szTmp[512]; char szFormat[4]; int i = 0, nLength = 0; int bColorAvailable = 0; int bGenerateDefaultSymbol = 0; char *pszSymbolName = NULL; char sNameSpace[10]; char sCssParam[30]; sCssParam[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sCssParam, "se:SvgParameter"); else strcpy(sCssParam, "CssParameter"); sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); if (psStyle && psLayer && psLayer->map) { nSymbol = -1; if (psStyle->symbol > 0) nSymbol = psStyle->symbol; else if (psStyle->symbolname) nSymbol = msGetSymbolIndex(&psLayer->map->symbolset, psStyle->symbolname, MS_FALSE); bGenerateDefaultSymbol = 0; if (bNeedMarkSybol && (nSymbol <= 0 || nSymbol >= psLayer->map->symbolset.numsymbols)) bGenerateDefaultSymbol = 1; if (nSymbol > 0 && nSymbol < psLayer->map->symbolset.numsymbols) { psSymbol = psLayer->map->symbolset.symbol[nSymbol]; if (psSymbol->type == MS_SYMBOL_VECTOR || psSymbol->type == MS_SYMBOL_ELLIPSE) { /* Mark symbol */ if (psSymbol->name) { if (strcasecmp(psSymbol->name, "square") == 0 || strcasecmp(psSymbol->name, "circle") == 0 || strcasecmp(psSymbol->name, "triangle") == 0 || strcasecmp(psSymbol->name, "star") == 0 || strcasecmp(psSymbol->name, "cross") == 0 || strcasecmp(psSymbol->name, "x") == 0) pszSymbolName = msStrdup(psSymbol->name); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_square", 22) == 0) pszSymbolName = msStrdup("square"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_triangle", 24) == 0) pszSymbolName = msStrdup("triangle"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_circle", 22) == 0) pszSymbolName = msStrdup("circle"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_star", 20) == 0) pszSymbolName = msStrdup("star"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_cross", 21) == 0) pszSymbolName = msStrdup("cross"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_x", 17) == 0) pszSymbolName = msStrdup("X"); if (pszSymbolName) { colorObj sTmpFillColor = {128, 128, 128, 255}; colorObj sTmpStrokeColor = {0, 0, 0, 255}; int hasFillColor = 0; int hasStrokeColor = 0; snprintf(szTmp, sizeof(szTmp), "<%sGraphic>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sMark>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sWellKnownName>%s\n", sNameSpace, pszSymbolName, sNameSpace); msStringBufferAppend(sldString, szTmp); if (psStyle->color.red != -1 && psStyle->color.green != -1 && psStyle->color.blue != -1) { sTmpFillColor.red = psStyle->color.red; sTmpFillColor.green = psStyle->color.green; sTmpFillColor.blue = psStyle->color.blue; sTmpFillColor.alpha = psStyle->color.alpha; hasFillColor = 1; } if (psStyle->outlinecolor.red != -1 && psStyle->outlinecolor.green != -1 && psStyle->outlinecolor.blue != -1) { sTmpStrokeColor.red = psStyle->outlinecolor.red; sTmpStrokeColor.green = psStyle->outlinecolor.green; sTmpStrokeColor.blue = psStyle->outlinecolor.blue; sTmpStrokeColor.alpha = psStyle->outlinecolor.alpha; hasStrokeColor = 1; // Make defaults implicit if (sTmpStrokeColor.red == 0 && sTmpStrokeColor.green == 0 && sTmpStrokeColor.blue == 0 && sTmpStrokeColor.alpha == 255 && psStyle->width == 1) { hasStrokeColor = 0; } } if (!hasFillColor && !hasStrokeColor) { sTmpFillColor.red = 128; sTmpFillColor.green = 128; sTmpFillColor.blue = 128; sTmpFillColor.alpha = 255; hasFillColor = 1; } if (hasFillColor) { snprintf(szTmp, sizeof(szTmp), "<%sFill>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill\">#%02x%02x%02x\n", sCssParam, sTmpFillColor.red, sTmpFillColor.green, sTmpFillColor.blue, sCssParam); msStringBufferAppend(sldString, szTmp); if (sTmpFillColor.alpha != 255 && sTmpFillColor.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill-opacity\">%.2f\n", sCssParam, (float)sTmpFillColor.alpha / 255.0, sCssParam); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } if (hasStrokeColor) { snprintf(szTmp, sizeof(szTmp), "<%sStroke>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke\">#%02x%02x%02x\n", sCssParam, sTmpStrokeColor.red, sTmpStrokeColor.green, sTmpStrokeColor.blue, sCssParam); msStringBufferAppend(sldString, szTmp); if (psStyle->width > 0) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-width\">%g\n", sCssParam, psStyle->width, sCssParam); msStringBufferAppend(sldString, szTmp); } if (sTmpStrokeColor.alpha != 255 && sTmpStrokeColor.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-opacity\">%.2f\n", sCssParam, (float)sTmpStrokeColor.alpha / 255.0, sCssParam); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); if (psStyle->size > 0) { snprintf(szTmp, sizeof(szTmp), "<%sSize>%g\n", sNameSpace, psStyle->size, sNameSpace); msStringBufferAppend(sldString, szTmp); } if (fmod(psStyle->angle, 360)) { snprintf(szTmp, sizeof(szTmp), "<%sRotation>%g\n", sNameSpace, psStyle->angle, sNameSpace); msStringBufferAppend(sldString, szTmp); } // Style opacity is already reported to alpha channel of color and // outlinecolor if (psStyle->opacity < 100) // { // snprintf(szTmp, sizeof(szTmp), "<%sOpacity>%g\n", // sNameSpace, psStyle->opacity/100.0, sNameSpace); // pszSLD = msStringConcatenate(pszSLD, szTmp); // } if (psStyle->offsetx != 0 || psStyle->offsety != 0) { snprintf(szTmp, sizeof(szTmp), "<%sDisplacement>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sDisplacementX>%g\n", sNameSpace, psStyle->offsetx, sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sDisplacementY>%g\n", sNameSpace, psStyle->offsety, sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); if (pszSymbolName) free(pszSymbolName); } } else bGenerateDefaultSymbol = 1; } else if (psSymbol->type == MS_SYMBOL_PIXMAP || psSymbol->type == MS_SYMBOL_SVG) { if (psSymbol->name) { const char *pszURL = msLookupHashTable(&(psLayer->metadata), "WMS_SLD_SYMBOL_URL"); if (!pszURL) pszURL = msLookupHashTable(&(psLayer->map->web.metadata), "WMS_SLD_SYMBOL_URL"); if (pszURL) { snprintf(szTmp, sizeof(szTmp), "<%sGraphic>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sExternalGraphic>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sOnlineResource " "xmlns:xlink=\"http://www.w3.org/1999/xlink\" " "xlink:type=\"simple\" xlink:href=\"%s%s\"/>\n", sNameSpace, pszURL, psSymbol->imagepath); msStringBufferAppend(sldString, szTmp); /* TODO : extract format from symbol */ szFormat[0] = '\0'; nLength = strlen(psSymbol->imagepath); if (nLength > 3) { for (i = 0; i <= 2; i++) szFormat[2 - i] = psSymbol->imagepath[nLength - 1 - i]; szFormat[3] = '\0'; } if (strlen(szFormat) > 0 && ((strcasecmp(szFormat, "GIF") == 0) || (strcasecmp(szFormat, "PNG") == 0))) { if (strcasecmp(szFormat, "GIF") == 0) snprintf(szTmp, sizeof(szTmp), "<%sFormat>image/gif\n", sNameSpace, sNameSpace); else snprintf(szTmp, sizeof(szTmp), "<%sFormat>image/png\n", sNameSpace, sNameSpace); } else snprintf(szTmp, sizeof(szTmp), "<%sFormat>%s\n", sNameSpace, (psSymbol->type == MS_SYMBOL_SVG) ? "image/svg+xml" : "image/gif", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); if (psStyle->size > 0) snprintf(szTmp, sizeof(szTmp), "<%sSize>%g\n", sNameSpace, psStyle->size, sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } } } } if (bGenerateDefaultSymbol) { /* generate a default square symbol */ snprintf(szTmp, sizeof(szTmp), "<%sGraphic>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sMark>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sWellKnownName>%s\n", sNameSpace, "square", sNameSpace); msStringBufferAppend(sldString, szTmp); bColorAvailable = 0; if (psStyle->color.red != -1 && psStyle->color.green != -1 && psStyle->color.blue != -1) { snprintf(szTmp, sizeof(szTmp), "<%sFill>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill\">#%02x%02x%02x\n", sCssParam, psStyle->color.red, psStyle->color.green, psStyle->color.blue, sCssParam); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); bColorAvailable = 1; } if (psStyle->outlinecolor.red != -1 && psStyle->outlinecolor.green != -1 && psStyle->outlinecolor.blue != -1) { snprintf(szTmp, sizeof(szTmp), "<%sStroke>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"Stroke\">#%02x%02x%02x\n", sCssParam, psStyle->outlinecolor.red, psStyle->outlinecolor.green, psStyle->outlinecolor.blue, sCssParam); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); bColorAvailable = 1; } if (!bColorAvailable) { /* default color */ snprintf(szTmp, sizeof(szTmp), "<%sFill>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill\">%s\n", sCssParam, "#808080", sCssParam); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); if (psStyle->size > 0) snprintf(szTmp, sizeof(szTmp), "<%sSize>%g\n", sNameSpace, psStyle->size, sNameSpace); else snprintf(szTmp, sizeof(szTmp), "<%sSize>%d\n", sNameSpace, 1, sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } } return msStringBufferReleaseStringAndFree(sldString); #else return NULL; #endif } /************************************************************************/ /* msSLDGenerateLineSLD */ /* */ /* Generate SLD for a Line layer. */ /************************************************************************/ char *msSLDGenerateLineSLD(styleObj *psStyle, layerObj *psLayer, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char *pszSLD = NULL; char szTmp[100]; char szHexColor[7]; int nSymbol = -1; int i = 0; double dfSize = 1.0; char *pszDashArray = NULL; char *pszGraphicSLD = NULL; char sCssParam[30]; char sNameSpace[10]; if (msCheckParentPointer(psLayer->map, "map") == MS_FAILURE) return NULL; sCssParam[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sCssParam, "se:SvgParameter"); else strcpy(sCssParam, "CssParameter"); sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); snprintf(szTmp, sizeof(szTmp), "<%sLineSymbolizer>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sStroke>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszGraphicSLD = msSLDGetGraphicSLD(psStyle, psLayer, 0, nVersion); if (pszGraphicSLD) { snprintf(szTmp, sizeof(szTmp), "<%sGraphicStroke>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszSLD = msStringConcatenate(pszSLD, pszGraphicSLD); if (nVersion >= OWS_1_1_0) { if (psStyle->gap > 0) { snprintf(szTmp, sizeof(szTmp), "<%sGap>%.2f\n", sNameSpace, psStyle->gap, sNameSpace); } if (psStyle->initialgap > 0) { snprintf(szTmp, sizeof(szTmp), "<%sInitialGap>%.2f\n", sNameSpace, psStyle->initialgap, sNameSpace); } } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); free(pszGraphicSLD); pszGraphicSLD = NULL; } if (psStyle->color.red != -1 && psStyle->color.green != -1 && psStyle->color.blue != -1) snprintf(szHexColor, sizeof(szHexColor), "%02x%02x%02x", psStyle->color.red, psStyle->color.green, psStyle->color.blue); else snprintf(szHexColor, sizeof(szHexColor), "%02x%02x%02x", psStyle->outlinecolor.red, psStyle->outlinecolor.green, psStyle->outlinecolor.blue); snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke\">#%s\n", sCssParam, szHexColor, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); if (psStyle->color.alpha != 255 && psStyle->color.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-opacity\">%.2f\n", sCssParam, (float)psStyle->color.alpha / 255.0, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); } nSymbol = -1; if (psStyle->symbol >= 0) nSymbol = psStyle->symbol; else if (psStyle->symbolname) nSymbol = msGetSymbolIndex(&psLayer->map->symbolset, psStyle->symbolname, MS_FALSE); if (nSymbol < 0) dfSize = 1.0; else { if (psStyle->size > 0) dfSize = psStyle->size; else if (psStyle->width > 0) dfSize = psStyle->width; else dfSize = 1; } snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-width\">%.2f\n", sCssParam, dfSize, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); /* -------------------------------------------------------------------- */ /* dash array */ /* -------------------------------------------------------------------- */ if (psStyle->patternlength > 0) { for (i = 0; i < psStyle->patternlength; i++) { snprintf(szTmp, sizeof(szTmp), "%.2f ", psStyle->pattern[i]); pszDashArray = msStringConcatenate(pszDashArray, szTmp); } // remove the final trailing space from the last pattern value msStringTrimBlanks(pszDashArray); snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-dasharray\">%s\n", sCssParam, pszDashArray, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); msFree(pszDashArray); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); return pszSLD; #else return NULL; #endif } /************************************************************************/ /* msSLDGeneratePolygonSLD */ /* */ /* Generate SLD for a Polygon layer. */ /************************************************************************/ char *msSLDGeneratePolygonSLD(styleObj *psStyle, layerObj *psLayer, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char szTmp[100]; char *pszSLD = NULL; char szHexColor[7]; double dfSize; char sCssParam[30]; char sNameSpace[10]; sCssParam[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sCssParam, "se:SvgParameter"); else strcpy(sCssParam, "CssParameter"); sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); snprintf(szTmp, sizeof(szTmp), "<%sPolygonSymbolizer>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); /* fill */ if (psStyle->color.red != -1 && psStyle->color.green != -1 && psStyle->color.blue != -1) { snprintf(szTmp, sizeof(szTmp), "<%sFill>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); char *pszGraphicSLD = msSLDGetGraphicSLD(psStyle, psLayer, 0, nVersion); if (pszGraphicSLD) { snprintf(szTmp, sizeof(szTmp), "<%sGraphicFill>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszSLD = msStringConcatenate(pszSLD, pszGraphicSLD); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); free(pszGraphicSLD); } snprintf(szHexColor, sizeof(szHexColor), "%02x%02x%02x", psStyle->color.red, psStyle->color.green, psStyle->color.blue); snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill\">#%s\n", sCssParam, szHexColor, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); if (psStyle->color.alpha != 255 && psStyle->color.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill-opacity\">%.2f\n", sCssParam, (float)psStyle->color.alpha / 255, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); } /* stroke */ if (psStyle->outlinecolor.red != -1 && psStyle->outlinecolor.green != -1 && psStyle->outlinecolor.blue != -1) { snprintf(szTmp, sizeof(szTmp), "<%sStroke>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); /* If there is a symbol to be used for stroke, the color in the */ /* style should be set to -1. Else It won't apply here. */ if (psStyle->color.red == -1 && psStyle->color.green == -1 && psStyle->color.blue == -1) { char *pszGraphicSLD = msSLDGetGraphicSLD(psStyle, psLayer, 0, nVersion); if (pszGraphicSLD) { snprintf(szTmp, sizeof(szTmp), "<%sGraphicFill>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszSLD = msStringConcatenate(pszSLD, pszGraphicSLD); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); free(pszGraphicSLD); } } snprintf(szHexColor, sizeof(szHexColor), "%02x%02x%02x", psStyle->outlinecolor.red, psStyle->outlinecolor.green, psStyle->outlinecolor.blue); snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke\">#%s\n", sCssParam, szHexColor, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); dfSize = 1.0; if (psStyle->size > 0) dfSize = psStyle->size; else if (psStyle->width > 0) dfSize = psStyle->width; snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-width\">%.2f\n", sCssParam, dfSize, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); if (psStyle->outlinecolor.alpha != 255 && psStyle->outlinecolor.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-opacity\">%.2f\n", sCssParam, psStyle->outlinecolor.alpha / 255.0, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); return pszSLD; #else return NULL; #endif } /************************************************************************/ /* msSLDGeneratePointSLD */ /* */ /* Generate SLD for a Point layer. */ /************************************************************************/ char *msSLDGeneratePointSLD(styleObj *psStyle, layerObj *psLayer, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char *pszSLD = NULL; char *pszGraphicSLD = NULL; char szTmp[100]; char sNameSpace[10]; sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); snprintf(szTmp, sizeof(szTmp), "<%sPointSymbolizer>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszGraphicSLD = msSLDGetGraphicSLD(psStyle, psLayer, 1, nVersion); if (pszGraphicSLD) { pszSLD = msStringConcatenate(pszSLD, pszGraphicSLD); free(pszGraphicSLD); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); return pszSLD; #else return NULL; #endif } /************************************************************************/ /* msSLDGenerateTextSLD */ /* */ /* Generate a TextSymboliser SLD xml based on the class's label */ /* object. */ /************************************************************************/ char *msSLDGenerateTextSLD(classObj *psClass, layerObj *psLayer, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char *pszSLD = NULL; char szTmp[1000]; char **aszFontsParts = NULL; int nFontParts = 0; char szHexColor[7]; double dfAnchorX = 0.5, dfAnchorY = 0.5; int i = 0; int lid; char sCssParam[30]; char sNameSpace[10]; labelObj *psLabelObj = NULL; sCssParam[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sCssParam, "se:SvgParameter"); else strcpy(sCssParam, "CssParameter"); sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); if (!psLayer || !psClass) return pszSLD; for (lid = 0; lid < psClass->numlabels; lid++) { char *psLabelText; expressionObj psLabelExpr; parseObj p; msInitExpression(&psLabelExpr); psLabelObj = psClass->labels[lid]; if (psLabelObj->text.string) { psLabelExpr.string = msStrdup(psLabelObj->text.string); psLabelExpr.type = psLabelObj->text.type; } else if (psClass->text.string) { psLabelExpr.string = msStrdup(psClass->text.string); psLabelExpr.type = psClass->text.type; } else if (psLayer->labelitem) { psLabelExpr.string = msStrdup(psLayer->labelitem); psLabelExpr.type = MS_STRING; } else { msFreeExpression(&psLabelExpr); continue; // Can't find text content for this