{"version":3,"file":"SwaggerV2Upgrader.mjs","sources":["../../src/converters/SwaggerV2Upgrader.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { SwaggerV2 } from \"../SwaggerV2\";\nimport { IJsonSchemaAttribute } from \"../structures/IJsonSchemaAttribute\";\nimport { OpenApiExclusiveEmender } from \"../utils/OpenApiExclusiveEmender\";\nimport { OpenApiTypeChecker } from \"../utils/OpenApiTypeChecker\";\n\nexport namespace SwaggerV2Upgrader {\n  export const convert = (input: SwaggerV2.IDocument): OpenApi.IDocument => ({\n    openapi: \"3.1.0\",\n    info: input.info,\n    components: convertComponents(input),\n    paths: input.paths\n      ? Object.fromEntries(\n          Object.entries(input.paths)\n            .filter(([_, v]) => v !== undefined)\n            .map(\n              ([key, value]) => [key, convertPathItem(input)(value)] as const,\n            ),\n        )\n      : undefined,\n    servers: input.host\n      ? [\n          {\n            url: input.host,\n          },\n        ]\n      : undefined,\n    security: input.security,\n    tags: input.tags,\n    \"x-samchon-emended-v4\": true,\n  });\n\n  /* -----------------------------------------------------------\n    OPERATORS\n  ----------------------------------------------------------- */\n  const convertPathItem =\n    (doc: SwaggerV2.IDocument) =>\n    (pathItem: SwaggerV2.IPath): OpenApi.IPath => ({\n      ...(pathItem as any),\n      ...(pathItem.get\n        ? { get: convertOperation(doc)(pathItem)(pathItem.get) }\n        : undefined),\n      ...(pathItem.put\n        ? { put: convertOperation(doc)(pathItem)(pathItem.put) }\n        : undefined),\n      ...(pathItem.post\n        ? { post: convertOperation(doc)(pathItem)(pathItem.post) }\n        : undefined),\n      ...(pathItem.delete\n        ? { delete: convertOperation(doc)(pathItem)(pathItem.delete) }\n        : undefined),\n      ...(pathItem.options\n        ? { options: convertOperation(doc)(pathItem)(pathItem.options) }\n        : undefined),\n      ...(pathItem.head\n        ? { head: convertOperation(doc)(pathItem)(pathItem.head) }\n        : undefined),\n      ...(pathItem.patch\n        ? { patch: convertOperation(doc)(pathItem)(pathItem.patch) }\n        : undefined),\n      ...(pathItem.trace\n        ? { trace: convertOperation(doc)(pathItem)(pathItem.trace) }\n        : undefined),\n    });\n\n  const convertOperation =\n    (doc: SwaggerV2.IDocument) =>\n    (pathItem: SwaggerV2.IPath) =>\n    (input: SwaggerV2.IOperation): OpenApi.IOperation => ({\n      ...input,\n      parameters:\n        pathItem.parameters !== undefined || input.parameters !== undefined\n          ? (\n              [...(pathItem.parameters ?? []), ...(input.parameters ?? [])]\n                .map((p) =>\n                  TypeChecker.isReference(p)\n                    ? doc.parameters?.[p.$ref.split(\"/\").pop() ?? \"\"]!\n                    : p,\n                )\n                .filter(\n                  (p) =>\n                    p !== undefined &&\n                    p.in !== \"body\" &&\n                    (p as SwaggerV2.IOperation.IBodyParameter).schema ===\n                      undefined,\n                ) as SwaggerV2.IOperation.IGeneralParameter[]\n            ).map(convertParameter(doc.definitions ?? {}))\n          : undefined,\n      requestBody: (() => {\n        const found: SwaggerV2.IOperation.IBodyParameter | undefined =\n          input.parameters?.find((p) => {\n            if (TypeChecker.isReference(p))\n              p = doc.parameters?.[p.$ref.split(\"/\").pop() ?? \"\"]!;\n            return (\n              (p as SwaggerV2.IOperation.IBodyParameter)?.schema !== undefined\n            );\n          }) as SwaggerV2.IOperation.IBodyParameter | undefined;\n        return found\n          ? convertRequestBody(doc.definitions ?? {})(found)\n          : undefined;\n      })(),\n      responses: input.responses\n        ? Object.fromEntries(\n            Object.entries(input.responses)\n              .filter(([_, v]) => v !== undefined)\n              .map(\n                ([key, value]) => [key, convertResponse(doc)(value)!] as const,\n              )\n              .filter(([_, v]) => v !== undefined),\n          )\n        : undefined,\n    });\n\n  const convertParameter =\n    (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n    (\n      input: SwaggerV2.IOperation.IGeneralParameter,\n    ): OpenApi.IOperation.IParameter => ({\n      name: input.name,\n      in: input.in as any,\n      description: input.description,\n      schema: convertSchema(definitions)(input),\n      required: true,\n    });\n  const convertRequestBody =\n    (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n    (\n      input: SwaggerV2.IOperation.IBodyParameter,\n    ): OpenApi.IOperation.IRequestBody => ({\n      description: input.description,\n      content: {\n        \"application/json\": {\n          schema: convertSchema(definitions)(input.schema),\n        },\n      },\n    });\n\n  const convertResponse =\n    (doc: SwaggerV2.IDocument) =>\n    (\n      input:\n        | SwaggerV2.IOperation.IResponse\n        | SwaggerV2.IJsonSchema.IReference<`#/definitions/responses/${string}`>,\n    ): OpenApi.IOperation.IResponse | undefined => {\n      if (TypeChecker.isReference(input)) {\n        const found: SwaggerV2.IOperation.IResponse | undefined =\n          doc.responses?.[input.$ref.split(\"/\").pop() ?? \"\"]!;\n        if (found === undefined) return undefined;\n        input = found;\n      }\n      return {\n        description: input.description,\n        content: input.schema\n          ? {\n              \"application/json\": {\n                schema: convertSchema(doc.definitions ?? {})(input.schema),\n                example: input.example,\n              },\n            }\n          : undefined,\n        headers: input.headers\n          ? Object.fromEntries(\n              Object.entries(input.headers)\n                .filter(([_, v]) => v !== undefined)\n                .map(\n                  ([key, value]) =>\n                    [\n                      key,\n                      {\n                        schema: convertSchema(doc.definitions ?? {})(value),\n                        in: \"header\",\n                      },\n                    ] as const,\n                ),\n            )\n          : undefined,\n      };\n    };\n\n  /* -----------------------------------------------------------\n    DEFINITIONS\n  ----------------------------------------------------------- */\n  const convertComponents = (\n    input: SwaggerV2.IDocument,\n  ): OpenApi.IComponents => ({\n    schemas: Object.fromEntries(\n      Object.entries(input.definitions ?? {})\n        .filter(([_, v]) => v !== undefined)\n        .map(([key, value]) => [\n          key,\n          convertSchema(input.definitions ?? {})(value),\n        ]),\n    ),\n    securitySchemes: input.securityDefinitions\n      ? Object.fromEntries(\n          Object.entries(input.securityDefinitions)\n            .filter(([_, v]) => v !== undefined)\n            .map(([key, value]) => [key, convertSecurityScheme(value)])\n            .filter(([_, v]) => v !== undefined),\n        )\n      : undefined,\n  });\n\n  const convertSecurityScheme = (\n    input: SwaggerV2.ISecurityDefinition,\n  ): OpenApi.ISecurityScheme => {\n    if (input.type === \"apiKey\") return input;\n    else if (input.type === \"basic\")\n      return {\n        type: \"http\",\n        scheme: \"basic\",\n        description: input.description,\n      };\n    else if (input.type === \"oauth2\")\n      if (input.flow === \"implicit\")\n        return {\n          type: \"oauth2\",\n          description: input.description,\n          flows: {\n            implicit: {\n              authorizationUrl: input.authorizationUrl,\n              scopes: input.scopes,\n            },\n          },\n        };\n      else if (input.flow === \"accessCode\")\n        return {\n          type: \"oauth2\",\n          description: input.description,\n          flows: {\n            authorizationCode: {\n              authorizationUrl: input.authorizationUrl,\n              tokenUrl: input.tokenUrl,\n              scopes: input.scopes,\n            },\n          },\n        };\n      else if (input.flow === \"password\")\n        return {\n          type: \"oauth2\",\n          description: input.description,\n          flows: {\n            password: {\n              tokenUrl: input.tokenUrl,\n              scopes: input.scopes,\n            },\n          },\n        };\n      else if (input.flow === \"application\")\n        return {\n          type: \"oauth2\",\n          description: input.description,\n          flows: {\n            clientCredentials: {\n              tokenUrl: input.tokenUrl,\n              scopes: input.scopes,\n            },\n          },\n        };\n      else return undefined!;\n    return undefined!;\n  };\n\n  export const convertSchema =\n    (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n    (input: SwaggerV2.IJsonSchema): OpenApi.IJsonSchema => {\n      const nullable: { value: boolean; default?: null } = {\n        value: false,\n        default: undefined,\n      };\n      const union: OpenApi.IJsonSchema[] = [];\n      const attribute: IJsonSchemaAttribute = {\n        title: input.title,\n        description: input.description,\n        deprecated: input.deprecated,\n        readOnly: input.readOnly,\n        example: input.example,\n        examples: input.examples\n          ? Object.fromEntries(input.examples.map((v, i) => [`v${i}`, v]))\n          : undefined,\n        ...Object.fromEntries(\n          Object.entries(input).filter(\n            ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n          ),\n        ),\n      };\n      const visit = (schema: SwaggerV2.IJsonSchema): void => {\n        // NULLABLE PROPERTY\n        if (\n          (schema as SwaggerV2.IJsonSchema.__ISignificant<any>)[\n            \"x-nullable\"\n          ] === true\n        ) {\n          nullable.value ||= true;\n          if ((schema as SwaggerV2.IJsonSchema.INumber).default === null)\n            nullable.default = null;\n        }\n        if (\n          Array.isArray((schema as SwaggerV2.IJsonSchema.INumber).enum) &&\n          (schema as SwaggerV2.IJsonSchema.INumber).enum?.length &&\n          (schema as SwaggerV2.IJsonSchema.INumber).enum?.some(\n            (e) => e === null,\n          )\n        )\n          nullable.value ||= true;\n        // UNION TYPE CASE\n        if (TypeChecker.isAnyOf(schema)) schema[\"x-anyOf\"].forEach(visit);\n        else if (TypeChecker.isOneOf(schema)) schema[\"x-oneOf\"].forEach(visit);\n        else if (TypeChecker.isAllOf(schema))\n          if (schema.allOf.length === 1) visit(schema.allOf[0]);\n          else union.push(convertAllOfSchema(definitions)(schema));\n        // ATOMIC TYPE CASE (CONSIDER ENUM VALUES)\n        else if (\n          TypeChecker.isBoolean(schema) ||\n          TypeChecker.isInteger(schema) ||\n          TypeChecker.isNumber(schema) ||\n          TypeChecker.isString(schema)\n        )\n          if (\n            schema.enum?.length &&\n            schema.enum.filter((e) => e !== null).length\n          )\n            union.push(\n              ...schema.enum\n                .filter((v) => v !== null)\n                .map((value) => ({ const: value })),\n            );\n          else if (\n            TypeChecker.isInteger(schema) ||\n            TypeChecker.isNumber(schema)\n          )\n            union.push(\n              OpenApiExclusiveEmender.emend({\n                ...schema,\n                default: (schema.default ?? undefined) satisfies\n                  | boolean\n                  | number\n                  | string\n                  | undefined as any,\n                examples: schema.examples\n                  ? Object.fromEntries(\n                      schema.examples.map((v, i) => [`v${i}`, v]),\n                    )\n                  : undefined,\n                exclusiveMinimum:\n                  typeof schema.exclusiveMinimum === \"boolean\"\n                    ? schema.exclusiveMinimum === true\n                      ? schema.minimum\n                      : undefined\n                    : schema.exclusiveMinimum,\n                exclusiveMaximum:\n                  typeof schema.exclusiveMaximum === \"boolean\"\n                    ? schema.exclusiveMaximum === true\n                      ? schema.maximum\n                      : undefined\n                    : schema.exclusiveMaximum,\n                minimum:\n                  schema.exclusiveMinimum === true ? undefined : schema.minimum,\n                maximum:\n                  schema.exclusiveMaximum === true ? undefined : schema.maximum,\n                ...{ enum: undefined },\n              }),\n            );\n          else\n            union.push({\n              ...schema,\n              default: (schema.default ?? undefined) satisfies\n                | boolean\n                | number\n                | string\n                | undefined as any,\n              examples: schema.examples\n                ? Object.fromEntries(\n                    schema.examples.map((v, i) => [`v${i}`, v]),\n                  )\n                : undefined,\n              ...{ enum: undefined },\n            });\n        // INSTANCE TYPE CASE\n        else if (TypeChecker.isArray(schema))\n          union.push({\n            ...schema,\n            items: convertSchema(definitions)(schema.items),\n            examples: schema.examples\n              ? Object.fromEntries(schema.examples.map((v, i) => [`v${i}`, v]))\n              : undefined,\n          });\n        else if (TypeChecker.isObject(schema))\n          union.push({\n            ...schema,\n            ...{\n              properties: schema.properties\n                ? Object.fromEntries(\n                    Object.entries(schema.properties)\n                      .filter(([_, v]) => v !== undefined)\n                      .map(([key, value]) => [\n                        key,\n                        convertSchema(definitions)(value),\n                      ]),\n                  )\n                : {},\n              additionalProperties: schema.additionalProperties\n                ? typeof schema.additionalProperties === \"object\" &&\n                  schema.additionalProperties !== null\n                  ? convertSchema(definitions)(schema.additionalProperties)\n                  : schema.additionalProperties\n                : undefined,\n            },\n            examples: schema.examples\n              ? Object.fromEntries(schema.examples.map((v, i) => [`v${i}`, v]))\n              : undefined,\n            required: schema.required ?? [],\n          });\n        else if (TypeChecker.isReference(schema))\n          union.push({\n            ...schema,\n            $ref: schema.$ref.replace(\n              \"#/definitions/\",\n              \"#/components/schemas/\",\n            ),\n            examples: schema.examples\n              ? Object.fromEntries(schema.examples.map((v, i) => [`v${i}`, v]))\n              : undefined,\n          });\n        else\n          union.push({\n            ...schema,\n            examples: schema.examples\n              ? Object.fromEntries(schema.examples.map((v, i) => [`v${i}`, v]))\n              : undefined,\n          });\n      };\n\n      visit(input);\n      if (\n        nullable.value === true &&\n        !union.some((e) => (e as OpenApi.IJsonSchema.INull).type === \"null\")\n      )\n        union.push({\n          type: \"null\",\n          default: nullable.default,\n        });\n      if (\n        union.length === 2 &&\n        union.filter((x) => OpenApiTypeChecker.isNull(x)).length === 1\n      ) {\n        const type: OpenApi.IJsonSchema = union.filter(\n          (x) => OpenApiTypeChecker.isNull(x) === false,\n        )[0];\n        for (const key of [\n          \"title\",\n          \"description\",\n          \"deprecated\",\n          \"example\",\n          \"examples\",\n        ] as const)\n          if (type[key] !== undefined) delete type[key];\n      }\n      return {\n        ...(union.length === 0\n          ? { type: undefined }\n          : union.length === 1\n            ? { ...union[0] }\n            : { oneOf: union.map((u) => ({ ...u, \"x-nullable\": undefined })) }),\n        ...attribute,\n        ...{ \"x-nullable\": undefined },\n      };\n    };\n\n  const convertAllOfSchema =\n    (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n    (input: SwaggerV2.IJsonSchema.IAllOf): OpenApi.IJsonSchema => {\n      const objects: Array<SwaggerV2.IJsonSchema.IObject | null> =\n        input.allOf.map((schema) => retrieveObject(definitions)(schema));\n      if (objects.some((obj) => obj === null))\n        return {\n          type: undefined,\n          ...{\n            allOf: undefined,\n          },\n        };\n      return {\n        ...input,\n        type: \"object\",\n        properties: Object.fromEntries(\n          objects\n            .map((o) => Object.entries(o?.properties ?? {}))\n            .flat()\n            .map(\n              ([key, value]) =>\n                [key, convertSchema(definitions)(value)] as const,\n            ),\n        ),\n        ...{\n          allOf: undefined,\n          required: [...new Set(objects.map((o) => o?.required ?? []).flat())],\n        },\n      };\n    };\n\n  const retrieveObject =\n    (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n    (\n      input: SwaggerV2.IJsonSchema,\n      visited: Set<SwaggerV2.IJsonSchema> = new Set(),\n    ): SwaggerV2.IJsonSchema.IObject | null => {\n      if (TypeChecker.isObject(input))\n        return input.properties !== undefined && !input.additionalProperties\n          ? input\n          : null;\n      else if (visited.has(input)) return null;\n      else visited.add(input);\n\n      if (TypeChecker.isReference(input))\n        return retrieveObject(definitions)(\n          definitions?.[input.$ref.split(\"/\").pop() ?? \"\"] ?? {},\n          visited,\n        );\n      return null;\n    };\n\n  namespace TypeChecker {\n    export const isBoolean = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IBoolean =>\n      (schema as SwaggerV2.IJsonSchema.IBoolean).type === \"boolean\";\n    export const isInteger = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IInteger =>\n      (schema as SwaggerV2.IJsonSchema.IInteger).type === \"integer\";\n    export const isNumber = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.INumber =>\n      (schema as SwaggerV2.IJsonSchema.INumber).type === \"number\";\n    export const isString = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IString =>\n      (schema as SwaggerV2.IJsonSchema.IString).type === \"string\";\n    export const isArray = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IArray =>\n      (schema as SwaggerV2.IJsonSchema.IArray).type === \"array\";\n    export const isObject = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IObject =>\n      (schema as SwaggerV2.IJsonSchema.IObject).type === \"object\";\n    export const isReference = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IReference =>\n      (schema as SwaggerV2.IJsonSchema.IReference).$ref !== undefined;\n    export const isAllOf = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IAllOf =>\n      (schema as SwaggerV2.IJsonSchema.IAllOf).allOf !== undefined;\n    export const isOneOf = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IOneOf =>\n      (schema as SwaggerV2.IJsonSchema.IOneOf)[\"x-oneOf\"] !== undefined;\n    export const isAnyOf = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.IAnyOf =>\n      (schema as SwaggerV2.IJsonSchema.IAnyOf)[\"x-anyOf\"] !== undefined;\n    export const isNullOnly = (\n      schema: SwaggerV2.IJsonSchema,\n    ): schema is SwaggerV2.IJsonSchema.INullOnly =>\n      (schema as SwaggerV2.IJsonSchema.INullOnly).type === \"null\";\n  }\n}\n"],"names":["SwaggerV2Upgrader","convert","input","openapi","info","components","convertComponents","paths","Object","fromEntries","entries","filter","_","v","undefined","map","key","value","convertPathItem","servers","host","url","security","tags","doc","pathItem","get","convertOperation","put","post","delete","options","head","patch","trace","parameters","p","TypeChecker","isReference","$ref","split","pop","in","schema","convertParameter","definitions","requestBody","found","find","convertRequestBody","responses","convertResponse","name","description","convertSchema","required","content","example","headers","schemas","securitySchemes","securityDefinitions","convertSecurityScheme","type","scheme","flow","flows","implicit","authorizationUrl","scopes","authorizationCode","tokenUrl","password","clientCredentials","nullable","default","union","attribute","title","deprecated","readOnly","examples","i","startsWith","visit","Array","isArray","enum","length","some","e","isAnyOf","forEach","isOneOf","isAllOf","allOf","push","convertAllOfSchema","isBoolean","isInteger","isNumber","isString","const","OpenApiExclusiveEmender","emend","exclusiveMinimum","minimum","exclusiveMaximum","maximum","items","isObject","properties","additionalProperties","replace","x","OpenApiTypeChecker","isNull","oneOf","u","objects","retrieveObject","obj","o","flat","Set","visited","has","add","isNullOnly"],"mappings":";;;;AAMM,IAAWA;;CAAjB,SAAiBA;IACFA,kBAAAC,UAAWC,UAA0B;QAChDC,SAAS;QACTC,MAAMF,MAAME;QACZC,YAAYC,kBAAkBJ;QAC9BK,OAAOL,MAAMK,QACTC,OAAOC,YACLD,OAAOE,QAAQR,MAAMK,OAClBI,OAAO,EAAEC,GAAGC,OAAOA,MAAMC,WACzBC,IACC,EAAEC,KAAKC,WAAW,EAACD,KAAKE,gBAAgBhB,MAAhBgB,CAAuBD,aAGrDH;QACJK,SAASjB,MAAMkB,OACX,EACE;YACEC,KAAKnB,MAAMkB;cAGfN;QACJQ,UAAUpB,MAAMoB;QAChBC,MAAMrB,MAAMqB;QACZ,wBAAwB;;IAM1B,MAAML,kBACHM,OACAC,aAAyB;WACpBA;WACAA,SAASC,MACT;YAAEA,KAAKC,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASC;YAChDZ;WACAW,SAASG,MACT;YAAEA,KAAKD,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASG;YAChDd;WACAW,SAASI,OACT;YAAEA,MAAMF,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASI;YACjDf;WACAW,SAASK,SACT;YAAEA,QAAQH,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASK;YACnDhB;WACAW,SAASM,UACT;YAAEA,SAASJ,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASM;YACpDjB;WACAW,SAASO,OACT;YAAEA,MAAML,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASO;YACjDlB;WACAW,SAASQ,QACT;YAAEA,OAAON,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASQ;YAClDnB;WACAW,SAASS,QACT;YAAEA,OAAOP,iBAAiBH,IAAjBG,CAAsBF,SAAtBE,CAAgCF,SAASS;YAClDpB;;IAGR,MAAMa,mBACHH,OACAC,YACAvB,UAA2B;WACvBA;QACHiC,YACEV,SAASU,eAAerB,aAAaZ,MAAMiC,eAAerB,YAEpD,KAAKW,SAASU,cAAc,OAASjC,MAAMiC,cAAc,KACtDpB,IAAKqB,KACJC,YAAYC,YAAYF,KACpBZ,IAAIW,aAAaC,EAAEG,KAAKC,MAAM,KAAKC,SAAS,MAC5CL,GAELzB,OACEyB,KACCA,MAAMtB,aACNsB,EAAEM,OAAO,UACRN,EAA0CO,WACzC7B,WAERC,IAAI6B,iBAAiBpB,IAAIqB,eAAe,CAAA,MAC1C/B;QACNgC,aAAa;YACX,MAAMC,QACJ7C,MAAMiC,YAAYa,KAAMZ;gBACtB,IAAIC,YAAYC,YAAYF,IAC1BA,IAAIZ,IAAIW,aAAaC,EAAEG,KAAKC,MAAM,KAAKC,SAAS;gBAClD,OACGL,GAA2CO,WAAW7B;;YAG7D,OAAOiC,QACHE,mBAAmBzB,IAAIqB,eAAe,CAAA,EAAtCI,CAA0CF,SAC1CjC;AACL,UAZY;QAaboC,WAAWhD,MAAMgD,YACb1C,OAAOC,YACLD,OAAOE,QAAQR,MAAMgD,WAClBvC,OAAO,EAAEC,GAAGC,OAAOA,MAAMC,WACzBC,IACC,EAAEC,KAAKC,WAAW,EAACD,KAAKmC,gBAAgB3B,IAAhB2B,CAAqBlC,UAE9CN,OAAO,EAAEC,GAAGC,OAAOA,MAAMC,cAE9BA;;IAGR,MAAM8B,mBACHC,eAEC3C,UAA6C;QAE7CkD,MAAMlD,MAAMkD;QACZV,IAAIxC,MAAMwC;QACVW,aAAanD,MAAMmD;QACnBV,QAAQ3C,kBAAAsD,cAAcT,YAAd7C,CAA2BE;QACnCqD,UAAU;;IAEd,MAAMN,qBACHJ,eAEC3C,UAA0C;QAE1CmD,aAAanD,MAAMmD;QACnBG,SAAS;YACP,oBAAoB;gBAClBb,QAAQ3C,kBAAAsD,cAAcT,YAAd7C,CAA2BE,MAAMyC;;;;IAKjD,MAAMQ,kBACH3B,OAECtB;QAIA,IAAImC,YAAYC,YAAYpC,QAAQ;YAClC,MAAM6C,QACJvB,IAAI0B,YAAYhD,MAAMqC,KAAKC,MAAM,KAAKC,SAAS;YACjD,IAAIM,UAAUjC,WAAW,OAAOA;YAChCZ,QAAQ6C;AACV;QACA,OAAO;YACLM,aAAanD,MAAMmD;YACnBG,SAAStD,MAAMyC,SACX;gBACE,oBAAoB;oBAClBA,QAAQ3C,kBAAAsD,cAAc9B,IAAIqB,eAAe,GAAjC7C,CAAqCE,MAAMyC;oBACnDc,SAASvD,MAAMuD;;gBAGnB3C;YACJ4C,SAASxD,MAAMwD,UACXlD,OAAOC,YACLD,OAAOE,QAAQR,MAAMwD,SAClB/C,OAAO,EAAEC,GAAGC,OAAOA,MAAMC,WACzBC,IACC,EAAEC,KAAKC,WACL,EACED,KACA;gBACE2B,QAAQ3C,kBAAAsD,cAAc9B,IAAIqB,eAAe,CAAA,EAAjC7C,CAAqCiB;gBAC7CyB,IAAI;oBAKhB5B;;;IAOV,MAAMR,oBACJJ,UAA0B;QAE1ByD,SAASnD,OAAOC,YACdD,OAAOE,QAAQR,MAAM2C,eAAe,CAAA,GACjClC,OAAO,EAAEC,GAAGC,OAAOA,MAAMC,WACzBC,IAAI,EAAEC,KAAKC,WAAW,EACrBD,KACAhB,kBAAAsD,cAAcpD,MAAM2C,eAAe,CAAA,EAAnC7C,CAAuCiB;QAG7C2C,iBAAiB1D,MAAM2D,sBACnBrD,OAAOC,YACLD,OAAOE,QAAQR,MAAM2D,qBAClBlD,OAAO,EAAEC,GAAGC,OAAOA,MAAMC,WACzBC,IAAI,EAAEC,KAAKC,WAAW,EAACD,KAAK8C,sBAAsB7C,UAClDN,OAAO,EAAEC,GAAGC,OAAOA,MAAMC,cAE9BA;;IAGN,MAAMgD,wBACJ5D;QAEA,IAAIA,MAAM6D,SAAS,UAAU,OAAO7D,YAC/B,IAAIA,MAAM6D,SAAS,SACtB,OAAO;YACLA,MAAM;YACNC,QAAQ;YACRX,aAAanD,MAAMmD;gBAElB,IAAInD,MAAM6D,SAAS,UACtB,IAAI7D,MAAM+D,SAAS,YACjB,OAAO;YACLF,MAAM;YACNV,aAAanD,MAAMmD;YACnBa,OAAO;gBACLC,UAAU;oBACRC,kBAAkBlE,MAAMkE;oBACxBC,QAAQnE,MAAMmE;;;gBAIjB,IAAInE,MAAM+D,SAAS,cACtB,OAAO;YACLF,MAAM;YACNV,aAAanD,MAAMmD;YACnBa,OAAO;gBACLI,mBAAmB;oBACjBF,kBAAkBlE,MAAMkE;oBACxBG,UAAUrE,MAAMqE;oBAChBF,QAAQnE,MAAMmE;;;gBAIjB,IAAInE,MAAM+D,SAAS,YACtB,OAAO;YACLF,MAAM;YACNV,aAAanD,MAAMmD;YACnBa,OAAO;gBACLM,UAAU;oBACRD,UAAUrE,MAAMqE;oBAChBF,QAAQnE,MAAMmE;;;gBAIjB,IAAInE,MAAM+D,SAAS,eACtB,OAAO;YACLF,MAAM;YACNV,aAAanD,MAAMmD;YACnBa,OAAO;gBACLO,mBAAmB;oBACjBF,UAAUrE,MAAMqE;oBAChBF,QAAQnE,MAAMmE;;;gBAIjB,OAAOvD;QACd,OAAOA;;IAGId,kBAAAsD,gBACVT,eACA3C;QACC,MAAMwE,WAA+C;YACnDzD,OAAO;YACP0D,SAAS7D;;QAEX,MAAM8D,QAA+B;QACrC,MAAMC,YAAkC;YACtCC,OAAO5E,MAAM4E;YACbzB,aAAanD,MAAMmD;YACnB0B,YAAY7E,MAAM6E;YAClBC,UAAU9E,MAAM8E;YAChBvB,SAASvD,MAAMuD;YACfwB,UAAU/E,MAAM+E,WACZzE,OAAOC,YAAYP,MAAM+E,SAASlE,IAAI,CAACF,GAAGqE,MAAM,EAAC,IAAIA,KAAKrE,QAC1DC;eACDN,OAAOC,YACRD,OAAOE,QAAQR,OAAOS,OACpB,EAAEK,KAAKC,WAAWD,IAAImE,WAAW,SAASlE,UAAUH;;QAI1D,MAAMsE,QAASzC;YAEb,IACGA,OACC,kBACI,MACN;gBACA+B,SAASzD,UAATyD,SAASzD,QAAU;gBACnB,IAAK0B,OAAyCgC,YAAY,MACxDD,SAASC,UAAU;AACvB;YACA,IACEU,MAAMC,QAAS3C,OAAyC4C,SACvD5C,OAAyC4C,MAAMC,UAC/C7C,OAAyC4C,MAAME,KAC7CC,KAAMA,MAAM,OAGfhB,SAASzD,UAATyD,SAASzD,QAAU;YAErB,IAAIoB,YAAYsD,QAAQhD,SAASA,OAAO,WAAWiD,QAAQR,aACtD,IAAI/C,YAAYwD,QAAQlD,SAASA,OAAO,WAAWiD,QAAQR,aAC3D,IAAI/C,YAAYyD,QAAQnD,SAC3B,IAAIA,OAAOoD,MAAMP,WAAW,GAAGJ,MAAMzC,OAAOoD,MAAM,UAC7CnB,MAAMoB,KAAKC,mBAAmBpD,YAAnBoD,CAAgCtD,eAE7C,IACHN,YAAY6D,UAAUvD,WACtBN,YAAY8D,UAAUxD,WACtBN,YAAY+D,SAASzD,WACrBN,YAAYgE,SAAS1D,SAErB,IACEA,OAAO4C,MAAMC,UACb7C,OAAO4C,KAAK5E,OAAQ+E,KAAMA,MAAM,MAAMF,QAEtCZ,MAAMoB,QACDrD,OAAO4C,KACP5E,OAAQE,KAAMA,MAAM,MACpBE,IAAKE,UAAK;gBAAQqF,OAAOrF;uBAE3B,IACHoB,YAAY8D,UAAUxD,WACtBN,YAAY+D,SAASzD,SAErBiC,MAAMoB,KACJO,wBAAwBC,MAAM;mBACzB7D;gBACHgC,SAAUhC,OAAOgC,WAAW7D;gBAK5BmE,UAAUtC,OAAOsC,WACbzE,OAAOC,YACLkC,OAAOsC,SAASlE,IAAI,CAACF,GAAGqE,MAAM,EAAC,IAAIA,KAAKrE,QAE1CC;gBACJ2F,yBACS9D,OAAO8D,qBAAqB,YAC/B9D,OAAO8D,qBAAqB,OAC1B9D,OAAO+D,UACP5F,YACF6B,OAAO8D;gBACbE,yBACShE,OAAOgE,qBAAqB,YAC/BhE,OAAOgE,qBAAqB,OAC1BhE,OAAOiE,UACP9F,YACF6B,OAAOgE;gBACbD,SACE/D,OAAO8D,qBAAqB,OAAO3F,YAAY6B,OAAO+D;gBACxDE,SACEjE,OAAOgE,qBAAqB,OAAO7F,YAAY6B,OAAOiE;mBACrD;oBAAErB,MAAMzE;;sBAIf8D,MAAMoB,KAAK;mBACNrD;gBACHgC,SAAUhC,OAAOgC,WAAW7D;gBAK5BmE,UAAUtC,OAAOsC,WACbzE,OAAOC,YACLkC,OAAOsC,SAASlE,IAAI,CAACF,GAAGqE,MAAM,EAAC,IAAIA,KAAKrE,QAE1CC;mBACD;oBAAEyE,MAAMzE;;qBAGZ,IAAIuB,YAAYiD,QAAQ3C,SAC3BiC,MAAMoB,KAAK;mBACNrD;gBACHkE,OAAO7G,kBAAAsD,cAAcT,YAAd7C,CAA2B2C,OAAOkE;gBACzC5B,UAAUtC,OAAOsC,WACbzE,OAAOC,YAAYkC,OAAOsC,SAASlE,IAAI,CAACF,GAAGqE,MAAM,EAAC,IAAIA,KAAKrE,QAC3DC;qBAEH,IAAIuB,YAAYyE,SAASnE,SAC5BiC,MAAMoB,KAAK;mBACNrD;mBACA;oBACDoE,YAAYpE,OAAOoE,aACfvG,OAAOC,YACLD,OAAOE,QAAQiC,OAAOoE,YACnBpG,OAAO,EAAEC,GAAGC,OAAOA,MAAMC,WACzBC,IAAI,EAAEC,KAAKC,WAAW,EACrBD,KACAhB,kBAAAsD,cAAcT,YAAd7C,CAA2BiB,aAGjC,CAAA;oBACJ+F,sBAAsBrE,OAAOqE,8BAClBrE,OAAOqE,yBAAyB,YACvCrE,OAAOqE,yBAAyB,OAC9BhH,kBAAAsD,cAAcT,YAAd7C,CAA2B2C,OAAOqE,wBAClCrE,OAAOqE,uBACTlG;;gBAENmE,UAAUtC,OAAOsC,WACbzE,OAAOC,YAAYkC,OAAOsC,SAASlE,IAAI,CAACF,GAAGqE,MAAM,EAAC,IAAIA,KAAKrE,QAC3DC;gBACJyC,UAAUZ,OAAOY,YAAY;qBAE5B,IAAIlB,YAAYC,YAAYK,SAC/BiC,MAAMoB,KAAK;mBACNrD;gBACHJ,MAAMI,OAAOJ,KAAK0E,QAChB,kBACA;gBAEFhC,UAAUtC,OAAOsC,WACbzE,OAAOC,YAAYkC,OAAOsC,SAASlE,IAAI,CAACF,GAAGqE,MAAM,EAAC,IAAIA,KAAKrE,QAC3DC;qBAGN8D,MAAMoB,KAAK;mBACNrD;gBACHsC,UAAUtC,OAAOsC,WACbzE,OAAOC,YAAYkC,OAAOsC,SAASlE,IAAI,CAACF,GAAGqE,MAAM,EAAC,IAAIA,KAAKrE,QAC3DC;;;QAIVsE,MAAMlF;QACN,IACEwE,SAASzD,UAAU,SAClB2D,MAAMa,KAAMC,KAAOA,EAAgC3B,SAAS,SAE7Da,MAAMoB,KAAK;YACTjC,MAAM;YACNY,SAASD,SAASC;;QAEtB,IACEC,MAAMY,WAAW,KACjBZ,MAAMjE,OAAQuG,KAAMC,mBAAmBC,OAAOF,IAAI1B,WAAW,GAC7D;YACA,MAAMzB,OAA4Ba,MAAMjE,OACrCuG,KAAMC,mBAAmBC,OAAOF,OAAO,OACxC;YACF,KAAK,MAAMlG,OAAO,EAChB,SACA,eACA,cACA,WACA,cAEA,IAAI+C,KAAK/C,SAASF,kBAAkBiD,KAAK/C;AAC7C;QACA,OAAO;eACD4D,MAAMY,WAAW,IACjB;gBAAEzB,MAAMjD;gBACR8D,MAAMY,WAAW,IACf;mBAAKZ,MAAM;gBACX;gBAAEyC,OAAOzC,MAAM7D,IAAKuG,MAAC;uBAAWA;oBAAG,cAAcxG;;;eACpD+D;eACA;gBAAE,cAAc/D;;;;IAIzB,MAAMmF,qBACHpD,eACA3C;QACC,MAAMqH,UACJrH,MAAM6F,MAAMhF,IAAK4B,UAAW6E,eAAe3E,YAAf2E,CAA4B7E;QAC1D,IAAI4E,QAAQ9B,KAAMgC,OAAQA,QAAQ,OAChC,OAAO;YACL1D,MAAMjD;eACH;gBACDiF,OAAOjF;;;QAGb,OAAO;eACFZ;YACH6D,MAAM;YACNgD,YAAYvG,OAAOC,YACjB8G,QACGxG,IAAK2G,KAAMlH,OAAOE,QAAQgH,GAAGX,cAAc,KAC3CY,OACA5G,IACC,EAAEC,KAAKC,WACL,EAACD,KAAKhB,kBAAAsD,cAAcT,YAAd7C,CAA2BiB;eAGtC;gBACD8E,OAAOjF;gBACPyC,UAAU,KAAI,IAAIqE,IAAIL,QAAQxG,IAAK2G,KAAMA,GAAGnE,YAAY,IAAIoE;;;;IAKpE,MAAMH,iBACH3E,eACD,CACE3C,OACA2H,UAAsC,IAAID;QAE1C,IAAIvF,YAAYyE,SAAS5G,QACvB,OAAOA,MAAM6G,eAAejG,cAAcZ,MAAM8G,uBAC5C9G,QACA,WACD,IAAI2H,QAAQC,IAAI5H,QAAQ,OAAO,WAC/B2H,QAAQE,IAAI7H;QAEjB,IAAImC,YAAYC,YAAYpC,QAC1B,OAAOsH,eAAe3E,YAAf2E,CACL3E,cAAc3C,MAAMqC,KAAKC,MAAM,KAAKC,SAAS,OAAO,CAAA,GACpDoF;QAEJ,OAAO;;IAGX,IAAUxF;KAAV,SAAUA;QACKA,YAAA6D,YACXvD,UAECA,OAA0CoB,SAAS;QACzC1B,YAAA8D,YACXxD,UAECA,OAA0CoB,SAAS;QACzC1B,YAAA+D,WACXzD,UAECA,OAAyCoB,SAAS;QACxC1B,YAAAgE,WACX1D,UAECA,OAAyCoB,SAAS;QACxC1B,YAAAiD,UACX3C,UAECA,OAAwCoB,SAAS;QACvC1B,YAAAyE,WACXnE,UAECA,OAAyCoB,SAAS;QACxC1B,YAAAC,cACXK,UAECA,OAA4CJ,SAASzB;QAC3CuB,YAAAyD,UACXnD,UAECA,OAAwCoD,UAAUjF;QACxCuB,YAAAwD,UACXlD,UAECA,OAAwC,eAAe7B;QAC7CuB,YAAAsD,UACXhD,UAECA,OAAwC,eAAe7B;QAC7CuB,YAAA2F,aACXrF,UAECA,OAA2CoB,SAAS;AACxD,MA7CD,CAAU1B,gBAAAA,cAAW,CAAA;AA8CtB,EAjjBD,CAAiBrC,sBAAAA,oBAAiB,CAAA;;"}