office-open 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"schemas-BKyaDGmp.mjs","names":["docxSchemaJson","pptxSchemaJson","xlsxSchemaJson","buildStub"],"sources":["../schemas/docx.schema.json","../schemas/pptx.schema.json","../schemas/xlsx.schema.json","../src/schemas/schemas.ts","../src/schemas/entries.ts","../src/schemas/slice.ts","../src/schemas/skeleton.ts"],"sourcesContent":["","","","/**\n * The committed draft-07 schemas and their ajv validators.\n *\n * @module\n */\nimport { Ajv, type ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nimport docxSchemaJson from \"../../schemas/docx.schema.json\";\nimport pptxSchemaJson from \"../../schemas/pptx.schema.json\";\nimport xlsxSchemaJson from \"../../schemas/xlsx.schema.json\";\n\n/** Draft-07 JSON Schema describing a format's root options object. */\nexport type JsonSchema = { readonly [key: string]: unknown };\n\nexport const docxSchema = docxSchemaJson as unknown as JsonSchema;\nexport const pptxSchema = pptxSchemaJson as unknown as JsonSchema;\nexport const xlsxSchema = xlsxSchemaJson as unknown as JsonSchema;\n\nexport const SCHEMAS = {\n docx: docxSchema,\n pptx: pptxSchema,\n xlsx: xlsxSchema,\n} as const;\n\nexport type DocumentType = \"docx\" | \"pptx\" | \"xlsx\";\n\nconst validators = new Map<DocumentType, ValidateFunction>();\n\nfunction getValidator(type: DocumentType): ValidateFunction {\n let validate = validators.get(type);\n if (!validate) {\n const ajv = new Ajv({ allErrors: true, allowUnionTypes: true });\n addFormats(ajv);\n validate = ajv.compile(SCHEMAS[type]);\n validators.set(type, validate);\n }\n return validate;\n}\n\n/** Max validation issues surfaced in one error message. */\nconst MAX_REPORTED_ERRORS = 5;\n\n/**\n * Validate document options against the full format schema.\n * Aggregates up to five `instancePath`-qualified issues so callers (and LLMs)\n * can fix several problems per iteration instead of one.\n */\nexport function validateDocumentInput(type: DocumentType, data: unknown): Record<string, unknown> {\n const validate = getValidator(type);\n if (!validate(data)) {\n const errors = validate.errors ?? [];\n const lines = errors.slice(0, MAX_REPORTED_ERRORS).map((error) => {\n const path = (error.instancePath ?? \"\").replaceAll(\"/\", \".\").replace(/^\\./, \"\");\n const message = error.message ?? \"invalid input\";\n return path ? `at \"${path}\": ${message}` : message;\n });\n const more =\n errors.length > MAX_REPORTED_ERRORS ? ` (+${errors.length - MAX_REPORTED_ERRORS} more)` : \"\";\n throw new Error(\n `Invalid ${type} options: ${lines.length > 0 ? lines.join(\"; \") : \"invalid input\"}${more}`,\n );\n }\n return data as Record<string, unknown>;\n}\n","/**\n * Entry catalog for schema slicing and lookup.\n *\n * The catalog is the single source of truth for two concerns:\n * 1. the recommended lookup index (`office-open schema index`)\n * 2. the stub boundary during closure traversal — any catalog member that\n * is NOT requested collapses to an expandable stub instead of being\n * walked, which keeps slices small (a full DocumentOptions closure\n * covers ~440 of 442 definitions).\n *\n * An entry is a domain root a user would construct independently: big enough\n * that stubbing it saves real tokens. Small helper types (BookmarkOptions,\n * SimpleFieldOptions, …) are deliberately NOT cataloged — they always expand\n * inside any slice, so they never need a second lookup.\n *\n * @module\n */\n\nimport type { DocumentType } from \"./schemas\";\n\n/** One cataloged lookup entry. */\nexport interface SchemaEntry {\n /** Definition name in the format's schema `definitions` (the TS type name). */\n name: string;\n /** Coarse domain grouping used by `office-open schema index` output. */\n domain: string;\n /** One-line summary (hand-written; schema descriptions may be missing). */\n summary: string;\n}\n\n/** Root definition of each format's options tree. */\nexport const SCHEMA_ROOTS: Record<DocumentType, string> = {\n docx: \"DocumentOptions\",\n pptx: \"PresentationOptions\",\n xlsx: \"WorkbookOptions\",\n};\n\nconst DOCX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"DocumentOptions\",\n domain: \"document\",\n summary: \"Root document options (sections, styles, numbering, settings)\",\n },\n {\n name: \"AppPropertiesOptions\",\n domain: \"document\",\n summary: \"Core + app metadata (title, creator, dates)\",\n },\n { name: \"SettingsOptions\", domain: \"document\", summary: \"w:settings document behavior flags\" },\n {\n name: \"FeaturesOptions\",\n domain: \"document\",\n summary: \"Track changes, comments visibility, update fields\",\n },\n {\n name: \"CompatibilityOptions\",\n domain: \"document\",\n summary: \"Legacy Word compatibility settings\",\n },\n {\n name: \"DocumentBackgroundOptions\",\n domain: \"document\",\n summary: \"Page background (color or image)\",\n },\n {\n name: \"MailMergeOptions\",\n domain: \"document\",\n summary: \"Mail merge envelope (dataSource, fields)\",\n },\n { name: \"BibliographyOptions\", domain: \"document\", summary: \"Bibliography + citation sources\" },\n {\n name: \"SectionOptions\",\n domain: \"structure\",\n summary: \"One section: properties, headers/footers, children\",\n },\n {\n name: \"SectionPropertiesOptions\",\n domain: \"structure\",\n summary: \"Page size, margins, columns, grid\",\n },\n {\n name: \"HeaderFooterGroup<HeaderFooterReference>\",\n domain: \"structure\",\n summary: \"Even/first/default header+footer set (quote the name in shells)\",\n },\n {\n name: \"ParagraphOptions\",\n domain: \"text\",\n summary: \"Block paragraph (heading, alignment, spacing, runs)\",\n },\n { name: \"RunOptions\", domain: \"text\", summary: \"Text run (font, color, size, emphasis)\" },\n {\n name: \"ParagraphRunOptions\",\n domain: \"text\",\n summary: \"Run options including child-run wrappers (breaks, tabs, fields)\",\n },\n { name: \"HyperlinkOptions\", domain: \"text\", summary: \"Hyperlink with child runs\" },\n { name: \"MathInput\", domain: \"text\", summary: \"OMML math equation tree\" },\n { name: \"TableOptions\", domain: \"tables\", summary: \"Table (rows, width, borders, layout)\" },\n {\n name: \"TableRowOptions\",\n domain: \"tables\",\n summary: \"Table row (cells, height, header repeat)\",\n },\n {\n name: \"TableCellOptions\",\n domain: \"tables\",\n summary: \"Table cell (span, shading, vertical align)\",\n },\n {\n name: \"TableStyleOptions\",\n domain: \"tables\",\n summary: \"Table style banding + conditional formats\",\n },\n {\n name: \"PictureOptions\",\n domain: \"media\",\n summary: \"Inline/anchored image (data, size, altText)\",\n },\n { name: \"ChartOptions\", domain: \"media\", summary: \"Chart (type, series, axes, legend)\" },\n {\n name: \"ChartSpaceOptions\",\n domain: \"media\",\n summary: \"Full chartSpace envelope wrapping chart options\",\n },\n {\n name: \"SmartArtOptions\",\n domain: \"media\",\n summary: \"Diagram nodes + layout/style/color references\",\n },\n {\n name: \"GroupOptions\",\n domain: \"media\",\n summary: \"Drawing group container (children, transforms)\",\n },\n {\n name: \"ShapeOptions\",\n domain: \"media\",\n summary: \"Floating text box / shape with drawing anchor\",\n },\n {\n name: \"SdtRunOptions\",\n domain: \"media\",\n summary: \"Structured document tag wrapping run content\",\n },\n { name: \"StylesOptions\", domain: \"styles\", summary: \"Default + paragraph/character/link styles\" },\n {\n name: \"StyleDefinitionOptions\",\n domain: \"styles\",\n summary: \"Base style fields shared by style kinds\",\n },\n { name: \"ParagraphStyleOptions\", domain: \"styles\", summary: \"Paragraph style definition\" },\n { name: \"CharacterStyleOptions\", domain: \"styles\", summary: \"Character (run) style definition\" },\n {\n name: \"NumberingOptions\",\n domain: \"styles\",\n summary: \"Bullet/numbering definitions and references\",\n },\n { name: \"CommentsOptions\", domain: \"annotations\", summary: \"Comments collection\" },\n {\n name: \"CommentOptions\",\n domain: \"annotations\",\n summary: \"One comment (author, children, date)\",\n },\n {\n name: \"FootnotePropertiesOptions\",\n domain: \"annotations\",\n summary: \"Footnotes section options\",\n },\n { name: \"EndnotePropertiesOptions\", domain: \"annotations\", summary: \"Endnotes section options\" },\n];\n\nconst PPTX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"PresentationOptions\",\n domain: \"presentation\",\n summary: \"Root presentation options (slides, size, masters)\",\n },\n { name: \"AppPropertiesOptions\", domain: \"presentation\", summary: \"Core + app metadata\" },\n { name: \"ShowOptions\", domain: \"presentation\", summary: \"Slide show settings\" },\n {\n name: \"CustomShowOptions\",\n domain: \"presentation\",\n summary: \"Custom slide show (name, slide list)\",\n },\n {\n name: \"PrintPropertiesOptions\",\n domain: \"presentation\",\n summary: \"Handouts/notes printing settings\",\n },\n { name: \"SlideOptions\", domain: \"slides\", summary: \"One slide (children, background, notes)\" },\n { name: \"BackgroundOptions\", domain: \"slides\", summary: \"Slide background fill\" },\n {\n name: \"SlideHeaderFooterOptions\",\n domain: \"slides\",\n summary: \"Slide header/footer/slide-number placeholders\",\n },\n {\n name: \"TransitionOptions\",\n domain: \"slides\",\n summary: \"Slide transition (type, duration, triggers)\",\n },\n { name: \"SlideAnimation\", domain: \"slides\", summary: \"Slide animation timeline root\" },\n {\n name: \"AnimationOptions\",\n domain: \"slides\",\n summary: \"Animation effect (target, effect, timing)\",\n },\n {\n name: \"MasterDefinition\",\n domain: \"masters\",\n summary: \"Slide master definition (placeholders, styles)\",\n },\n {\n name: \"ThemeOptions\",\n domain: \"masters\",\n summary: \"Theme (color scheme, fonts, format scheme)\",\n },\n { name: \"NotesMasterOptions\", domain: \"masters\", summary: \"Notes master options\" },\n { name: \"NotesSlideOptions\", domain: \"masters\", summary: \"Notes slide content\" },\n { name: \"HandoutMasterOptions\", domain: \"masters\", summary: \"Handout master options\" },\n {\n name: \"ShapeOptions\",\n domain: \"shapes\",\n summary: \"Auto shape (geometry, fill, outline, textBody)\",\n },\n { name: \"LineShapeOptions\", domain: \"shapes\", summary: \"Straight line shape\" },\n { name: \"ConnectorOptions\", domain: \"shapes\", summary: \"Connector with optional endpoints\" },\n { name: \"GroupOptions\", domain: \"shapes\", summary: \"Group container (children, transforms)\" },\n {\n name: \"TextBodyOptions\",\n domain: \"shapes\",\n summary: \"Shape text body (paragraphs, list styles)\",\n },\n { name: \"BulletOptions\", domain: \"shapes\", summary: \"Paragraph bullet character/numbering\" },\n { name: \"TextListStyleOptions\", domain: \"shapes\", summary: \"List style per outline level\" },\n { name: \"PictureOptions\", domain: \"media\", summary: \"Image (data, size, style, crop)\" },\n { name: \"TableOptions\", domain: \"media\", summary: \"Table (rows, first-row/banding flags)\" },\n { name: \"ChartOptions\", domain: \"media\", summary: \"Chart (type, series, axes, legend)\" },\n {\n name: \"SmartArtOptions\",\n domain: \"media\",\n summary: \"Diagram nodes + layout/style/color references\",\n },\n { name: \"VideoFrameOptions\", domain: \"media\", summary: \"Video frame (data, poster, trim)\" },\n { name: \"AudioFrameOptions\", domain: \"media\", summary: \"Audio frame (data, icon, playback)\" },\n { name: \"OleOptions\", domain: \"media\", summary: \"OLE object embedding\" },\n];\n\nconst XLSX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"WorkbookOptions\",\n domain: \"workbook\",\n summary: \"Root workbook options (worksheets, properties)\",\n },\n { name: \"AppPropertiesOptions\", domain: \"workbook\", summary: \"Core + app metadata\" },\n {\n name: \"WorkbookPropertiesOptions\",\n domain: \"workbook\",\n summary: \"Workbook flags (date1904, iterateCalc)\",\n },\n {\n name: \"WorkbookProtectionOptions\",\n domain: \"workbook\",\n summary: \"Workbook structure/window protection\",\n },\n {\n name: \"CalculationPropertiesOptions\",\n domain: \"workbook\",\n summary: \"Calculation mode and iteration\",\n },\n { name: \"DefinedNameOptions\", domain: \"workbook\", summary: \"Named range/formula\" },\n {\n name: \"WorksheetOptions\",\n domain: \"sheets\",\n summary: \"One worksheet (rows, columns, merges, views)\",\n },\n { name: \"ChartsheetOptions\", domain: \"sheets\", summary: \"Chart sheet hosting one chart\" },\n { name: \"SheetProtectionOptions\", domain: \"sheets\", summary: \"Sheet protection flags\" },\n { name: \"SheetViewOptions\", domain: \"sheets\", summary: \"Sheet view (zoom, selection, pane)\" },\n {\n name: \"HeaderFooterOptions\",\n domain: \"sheets\",\n summary: \"Print header/footer (odd/even/first)\",\n },\n {\n name: \"PageSetupOptions\",\n domain: \"sheets\",\n summary: \"Print page setup (orientation, scale, paper)\",\n },\n { name: \"PageMarginsOptions\", domain: \"sheets\", summary: \"Print page margins\" },\n { name: \"PrintOptions\", domain: \"sheets\", summary: \"Print gridlines/headings/order\" },\n { name: \"RowOptions\", domain: \"data\", summary: \"Row (cells, height, style)\" },\n { name: \"CellOptions\", domain: \"data\", summary: \"Cell (value, style, formula)\" },\n { name: \"RichTextOptions\", domain: \"data\", summary: \"Cell rich text runs\" },\n { name: \"CommentOptions\", domain: \"data\", summary: \"Cell comment\" },\n { name: \"HyperlinkOptions\", domain: \"data\", summary: \"Cell hyperlink\" },\n { name: \"ColumnOptions\", domain: \"data\", summary: \"Column (width, style, custom)\" },\n {\n name: \"StyleOptions\",\n domain: \"style\",\n summary: \"Cell style (font, fill, border, alignment, numFmt)\",\n },\n { name: \"FontOptions\", domain: \"style\", summary: \"Font (name, size, color, emphasis)\" },\n { name: \"FillOptions\", domain: \"style\", summary: \"Pattern or gradient fill\" },\n { name: \"BorderOptions\", domain: \"style\", summary: \"Border sides and diagonals\" },\n { name: \"AlignmentOptions\", domain: \"style\", summary: \"Text alignment and wrap\" },\n { name: \"AutoFilterOptions\", domain: \"features\", summary: \"Auto filter range and columns\" },\n { name: \"DataValidationOptions\", domain: \"features\", summary: \"Cell input validation rules\" },\n { name: \"ConditionalFormatOptions\", domain: \"features\", summary: \"Conditional formatting rules\" },\n { name: \"TableOptions\", domain: \"features\", summary: \"Worksheet table (range, columns, style)\" },\n { name: \"PivotTableOptions\", domain: \"features\", summary: \"Pivot table definition\" },\n { name: \"WorksheetChartOptions\", domain: \"features\", summary: \"Anchored chart on a worksheet\" },\n { name: \"PictureOptions\", domain: \"media\", summary: \"Anchored image\" },\n { name: \"ShapeOptions\", domain: \"media\", summary: \"Anchored shape\" },\n { name: \"ConnectorOptions\", domain: \"media\", summary: \"Anchored connector\" },\n { name: \"GroupOptions\", domain: \"media\", summary: \"Anchored group container\" },\n { name: \"ThemeOptions\", domain: \"media\", summary: \"Workbook theme\" },\n];\n\n/** Cataloged lookup entries per format. */\nexport const SCHEMA_ENTRIES: Readonly<Record<DocumentType, readonly SchemaEntry[]>> = {\n docx: DOCX_ENTRIES,\n pptx: PPTX_ENTRIES,\n xlsx: XLSX_ENTRIES,\n};\n\n/** Definition names that act as stub boundaries when not requested. */\nexport function entryNames(type: DocumentType): ReadonlySet<string> {\n return new Set(SCHEMA_ENTRIES[type].map((entry) => entry.name));\n}\n","/**\n * Schema slicing — extract an on-demand sub-schema by definition name.\n *\n * A full format schema (docx: 442 definitions, ~675 KB) is far too large to\n * hand to an LLM in one piece. `sliceSchema` walks the `$ref` dependency\n * closure of the requested definitions and returns only that subgraph.\n * Cataloged entry names (see entries.ts) act as stub boundaries: any entry\n * that is requested expands fully; any entry merely encountered collapses to\n * an empty-schema stub that names the follow-up lookup — recursive\n * disclosure, the same pattern Agent Skills use for reference files.\n *\n * The slice is a pure subgraph extraction: field names, descriptions, and\n * enums are kept verbatim; the source schema is never mutated.\n *\n * @module\n */\n\nimport { entryNames } from \"./entries\";\nimport { SCHEMAS, type DocumentType, type JsonSchema } from \"./schemas\";\n\n/** Error thrown for unknown definition names; carries did-you-mean suggestions. */\nexport class UnknownDefinitionError extends Error {\n readonly suggestions: readonly string[];\n constructor(names: readonly string[], suggestions: readonly string[]) {\n super(`Unknown definition(s): ${names.join(\", \")}`);\n this.name = \"UnknownDefinitionError\";\n this.suggestions = suggestions;\n }\n}\n\n/** Definition names referenced (directly or transitively) by one definition. */\nfunction refsOf(def: unknown): string[] {\n const refs = JSON.stringify(def)?.match(/#\\/definitions\\/([A-Za-z0-9_%.$-]+)/g) ?? [];\n return [...new Set(refs.map((r) => decodeURIComponent(r.slice(14))))];\n}\n\n/**\n * Build the empty-schema stub that replaces a non-requested entry.\n * No `type` keyword: boundary definitions may legitimately be scalars\n * (UniversalMeasure strings, enums), and `type: \"object\"` would wrongly\n * reject those values.\n */\nfunction buildStub(\n name: string,\n original: Record<string, unknown>,\n format: DocumentType | undefined,\n): Record<string, unknown> {\n const description = typeof original.description === \"string\" ? `${original.description}\\n\\n` : \"\";\n return {\n title: `${name} (stub)`,\n description:\n `${description}` +\n `\"${name}\" is not expanded in this slice (a stub accepts any value). ` +\n (format\n ? `Full fields: run \\`office-open schema slice ${format} ${name}\\` or call the office-open-schema-lookup tool with { type: \"${format}\", definitions: [\"${name}\"] }.`\n : `Look up \"${name}\" on its own to get its full fields.`),\n $comment: `office-open-stub:${name}`,\n };\n}\n\n/**\n * Extract the `$ref` closure of `definitions` from `schema`.\n *\n * Cataloged entries that were not requested become stubs, which keeps the\n * slice proportional to the request instead of the whole schema. The result\n * is a standalone draft-07 schema: when a single definition is requested it\n * is also wired as the root `$ref` so `ajv.compile(slice)` validates that\n * fragment directly.\n */\nexport function sliceSchema(\n schema: JsonSchema,\n definitions: readonly string[],\n format?: DocumentType,\n): JsonSchema {\n const all = schema.definitions as Record<string, Record<string, unknown>> | undefined;\n if (!all) throw new Error(\"schema has no definitions\");\n\n const unknown = definitions.filter((name) => !(name in all));\n if (unknown.length > 0)\n throw new UnknownDefinitionError(unknown, suggestNames(Object.keys(all), unknown[0]));\n\n const stubs = format ? entryNames(format) : new Set<string>();\n const requested = new Set(definitions);\n\n const expanded = new Set<string>();\n const stubbed = new Set<string>();\n const queue = [...definitions];\n while (queue.length > 0) {\n const name = queue.pop()!;\n if (expanded.has(name) || stubbed.has(name)) continue;\n if (stubs.has(name) && !requested.has(name)) {\n stubbed.add(name);\n continue;\n }\n expanded.add(name);\n for (const ref of refsOf(all[name])) {\n if (ref in all) queue.push(ref);\n }\n }\n\n const out: Record<string, unknown> = {};\n for (const name of expanded) out[name] = structuredClone(all[name]);\n for (const name of stubbed) out[name] = buildStub(name, all[name], format);\n\n const result: Record<string, unknown> = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: `office-open ${format ?? \"\"} schema slice: ${definitions.join(\", \")}`.trim(),\n description:\n \"Sub-schema extracted on demand. Definitions marked as stubs accept any value — \" +\n \"look one up by name to expand it. The full schema ships with the package.\",\n definitions: out,\n };\n if (definitions.length === 1) result.$ref = `#/definitions/${definitions[0]}`;\n return result;\n}\n\n/** Slice a format's schema by definition name (stub guidance names the format). */\nexport function sliceDocumentSchema(\n type: DocumentType,\n definitions: readonly string[],\n): JsonSchema {\n return sliceSchema(SCHEMAS[type], definitions, type);\n}\n\n/** Throw {@link UnknownDefinitionError} for names missing from the format's schema. */\nexport function assertKnownDefinitions(type: DocumentType, definitions: readonly string[]): void {\n const all = SCHEMAS[type].definitions as Record<string, unknown>;\n const unknown = definitions.filter((name) => !(name in all));\n if (unknown.length > 0) {\n throw new UnknownDefinitionError(unknown, suggestNames(Object.keys(all), unknown[0]));\n }\n}\n\n/** Up to three close candidates for an unknown name (substring match, then edit distance). */\nfunction suggestNames(candidates: readonly string[], query: string): string[] {\n const lower = query.toLowerCase();\n const contains = candidates.filter(\n (c) => c.toLowerCase().includes(lower) || lower.includes(c.toLowerCase()),\n );\n if (contains.length > 0) return contains.slice(0, 3);\n return candidates.filter((c) => levenshtein(c.toLowerCase(), lower) <= 3).slice(0, 3);\n}\n\n/** Classic Levenshtein distance, bounded to short strings. */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (Math.abs(m - n) > 3) return 4;\n let prev = Array.from({ length: n + 1 }, (_, i) => i);\n for (let i = 1; i <= m; i++) {\n const curr = [i];\n for (let j = 1; j <= n; j++) {\n curr[j] = Math.min(\n prev[j]! + 1,\n curr[j - 1]! + 1,\n prev[j - 1]! + (a[i - 1] === b[j - 1] ? 0 : 1),\n );\n }\n prev = curr;\n }\n return prev[n]!;\n}\n","/**\n * Skeleton schemas for the generate tools' `inputSchema`.\n *\n * The full format schema (docx: ~675 KB) is far beyond what any provider\n * accepts in a tool definition. The skeleton is derived at runtime from the\n * real schema so it can never drift from it: top-level fields stay verbatim,\n * the section/slide/worksheet chain expands one level, tagged-union wrapper\n * keys (the `{ paragraph: {...} }` / `{ shape: {...} }` convention) expand\n * into a scannable key list, and everything deeper becomes a stub that names\n * the definition to look up via the schema-lookup tool. The output is fully\n * inlined — no `$ref`/`definitions` — for maximum provider compatibility.\n *\n * A skeleton deliberately accepts more than the full schema (stubs allow any\n * value); the authoritative ajv validation runs inside the tool's `execute`.\n *\n * @module\n */\n\nimport { SCHEMAS, type DocumentType, type JsonSchema } from \"./schemas\";\n\n/** Definitions expanded in the skeleton, outermost first. */\nconst SKELETON_SPINE: Record<DocumentType, readonly string[]> = {\n docx: [\"DocumentOptions\", \"SectionOptions\"],\n pptx: [\"PresentationOptions\", \"SlideOptions\"],\n xlsx: [\"WorkbookOptions\", \"WorksheetOptions\", \"RowOptions\", \"CellOptions\"],\n};\n\ntype Node = Record<string, unknown>;\n\nfunction definitionsOf(type: DocumentType): Record<string, Node> {\n return SCHEMAS[type].definitions as Record<string, Node>;\n}\n\n/** A tagged-union wrapper: every branch is `{ title, properties: {<key>: …}, required: [<key>] }`. */\nfunction isWrapperUnion(def: Node | undefined): boolean {\n const branches = def?.anyOf;\n if (!Array.isArray(branches) || branches.length === 0) return false;\n return branches.every((branch) => {\n const b = branch as Node;\n const required = b.required as string[] | undefined;\n const properties = b.properties as Record<string, unknown> | undefined;\n return (\n typeof b.title === \"string\" &&\n Array.isArray(required) &&\n required.length === 1 &&\n properties !== undefined &&\n Object.keys(properties).length === 1\n );\n });\n}\n\nfunction buildStub(name: string): Node {\n return {\n description: `\"${name}\" stub — fetch its fields with the office-open-schema-lookup tool.`,\n $comment: `office-open-stub:${name}`,\n };\n}\n\n/** Collapse an inline (non-$ref) object schema that is too large to be self-explanatory. */\nfunction collapseInline(node: Node, format: DocumentType, context: string): Node {\n const description = typeof node.description === \"string\" ? `${node.description}\\n\\n` : \"\";\n return {\n type: \"object\",\n description:\n `${description}Collapsed inline object (${context}) — call the office-open-schema-lookup tool ` +\n `with { type: \"${format}\" } for details.`,\n };\n}\n\nfunction convertProperty(\n prop: Node,\n format: DocumentType,\n spine: readonly string[],\n visited: ReadonlySet<string>,\n): Node {\n const ref = typeof prop.$ref === \"string\" ? prop.$ref : undefined;\n if (ref) {\n const name = decodeURIComponent(ref.slice(\"#/definitions/\".length));\n const target = definitionsOf(format)[name];\n if (visited.has(name)) return buildStub(name);\n if (spine.includes(name)) {\n return convertDefinition(name, target, format, new Set([...visited, name]));\n }\n if (isWrapperUnion(target)) {\n // visited must thread through wrapper expansion: unions can reference\n // themselves (SectionChild.sdt.children → SectionChild).\n return convertWrapperUnion(target, format, new Set([...visited, name]));\n }\n return buildStub(name);\n }\n\n if (Array.isArray(prop.anyOf) || Array.isArray(prop.oneOf)) {\n const key = Array.isArray(prop.anyOf) ? \"anyOf\" : \"oneOf\";\n const branches = (prop[key] as Node[]).map((branch) =>\n convertProperty(branch, format, spine, visited),\n );\n const out: Node = { [key]: branches };\n if (typeof prop.description === \"string\") out.description = prop.description;\n // A wrapper key list (titled branches) is core skeleton information;\n // any other oversized union collapses to a lookup pointer.\n const isWrapperList = branches.some((branch) => branch.title !== undefined);\n if (!isWrapperList && JSON.stringify(out).length >= 400) {\n return collapseInline(prop, format, \"inline union\");\n }\n return out;\n }\n\n if (prop.type === \"array\" && prop.items && typeof prop.items === \"object\") {\n return {\n type: \"array\",\n ...(typeof prop.description === \"string\" ? { description: prop.description } : {}),\n items: convertProperty(prop.items as Node, format, spine, visited),\n };\n }\n\n // Scalars, enums, and small inline objects pass through untouched — but a\n // $ref must never escape into this $ref-less skeleton, so inline schemas\n // that reference other definitions are recursed through their containers\n // first and then run through the same size gate.\n const clone = structuredClone(prop) as Node;\n const text = JSON.stringify(clone);\n if (text.includes(\"#/definitions/\")) {\n if (clone.properties && typeof clone.properties === \"object\") {\n clone.properties = Object.fromEntries(\n Object.entries(clone.properties as Record<string, Node>).map(([key, value]) => [\n key,\n convertProperty(value, format, spine, visited),\n ]),\n );\n }\n if (clone.items && typeof clone.items === \"object\") {\n clone.items = convertProperty(clone.items as Node, format, spine, visited);\n }\n }\n return JSON.stringify(clone).length < 400\n ? clone\n : collapseInline(prop, format, \"large inline object\");\n}\n\nfunction convertWrapperUnion(def: Node, format: DocumentType, visited: ReadonlySet<string>): Node {\n const out: Node = {};\n if (typeof def.description === \"string\") out.description = def.description;\n out.anyOf = (def.anyOf as Node[]).map((branch) => {\n const b = branch as Node;\n const properties = b.properties as Record<string, Node>;\n const key = Object.keys(properties)[0]!;\n const skeletonBranch: Node = {\n title: b.title,\n type: \"object\",\n properties: { [key]: convertProperty(properties[key]!, format, [], visited) },\n required: b.required,\n };\n if (typeof b.description === \"string\") skeletonBranch.description = b.description;\n return skeletonBranch;\n });\n return out;\n}\n\nfunction convertDefinition(\n name: string,\n def: Node,\n format: DocumentType,\n visited: ReadonlySet<string>,\n): Node {\n const spine = SKELETON_SPINE[format].slice(SKELETON_SPINE[format].indexOf(name) + 1);\n const out: Node = {};\n if (typeof def.description === \"string\") out.description = def.description;\n if (typeof def.type === \"string\") out.type = def.type;\n const properties = def.properties as Record<string, Node> | undefined;\n if (properties) {\n const converted: Record<string, Node> = {};\n for (const [key, value] of Object.entries(properties)) {\n converted[key] = convertProperty(value, format, spine, visited);\n }\n out.properties = converted;\n }\n if (Array.isArray(def.required)) out.required = structuredClone(def.required);\n return out;\n}\n\nconst skeletonCache = new Map<DocumentType, JsonSchema>();\n\n/** Derive (and memoize) the skeleton input schema for a format. */\nexport function getSkeletonSchema(type: DocumentType): JsonSchema {\n let skeleton = skeletonCache.get(type);\n if (!skeleton) {\n const [root] = SKELETON_SPINE[type];\n if (!root) throw new Error(`no skeleton spine for ${type}`);\n const visited = new Set<string>([root]);\n skeleton = convertDefinition(root, definitionsOf(type)[root]!, type, visited) as JsonSchema;\n skeletonCache.set(type, skeleton);\n }\n return skeleton;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}