@promster/metrics
Version:
Metrics utilities used by all other server integrations
1 lines • 30.1 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","names":["Prometheus","asArray","defaultOptions","getMetrics","Prometheus","defaultOptions","defaultLabels","asArray","defaultOptions","getMetrics","Prometheus","defaultOptions","Prometheus","UrlValueParser","url","#startTime","#endTime"],"sources":["../src/environment/kubernetes.ts","../src/environment/skip-metrics-in-environment.ts","../src/client/client.ts","../src/create-gc-metrics/create-gc-metrics.ts","../src/create-gc-observer/create-gc-observer.ts","../src/create-graphql-metrics/create-graphql-metrics.ts","../src/create-http-metrics/create-http-metrics.ts","../src/end-measurement-from/end-measurement-from.ts","../src/sort-labels/sort-labels.ts","../src/create-request-recorder/create-request-recorder.ts","../src/normalizers/method/method.ts","../src/normalizers/path/path.ts","../src/normalizers/status-code/status-code.ts","../src/normalizers/index.ts","../src/summary/summary.ts","../src/timing/timing.ts"],"sourcesContent":["const isRunningInKubernetes = () =>\n Boolean(process.env.KUBERNETES_SERVICE_HOST);\n\nexport { isRunningInKubernetes };\n","import type { TOptionalPromsterOptions } from '@promster/types';\n\nimport { isRunningInKubernetes } from './kubernetes';\n\ntype TSkipMetricsInEnvironmentOptions = {\n detectKubernetes?: TOptionalPromsterOptions['detectKubernetes'];\n};\n\nconst skipMetricsInEnvironment = (options: TSkipMetricsInEnvironmentOptions) =>\n options.detectKubernetes === true && !isRunningInKubernetes();\n\nexport { skipMetricsInEnvironment };\n","import { once } from 'es-toolkit/function';\nimport type { PrometheusContentType } from 'prom-client';\nimport * as Prometheus from 'prom-client';\n\nimport { skipMetricsInEnvironment } from '../environment';\n\n// NOTE:\n// This is the `globalRegistry` provided by the `prom-client`\n// We could create multiple registries with `new Prometheus.registry()`.\nconst defaultRegister = Prometheus.register;\n\ninterface TClientOptions extends Prometheus.DefaultMetricsCollectorConfiguration<PrometheusContentType> {\n detectKubernetes?: boolean;\n prefix?: string;\n}\n\nconst configure = once((options: TClientOptions) => {\n const shouldSkipMetricsInEnvironment = skipMetricsInEnvironment(options);\n\n if (!shouldSkipMetricsInEnvironment) {\n Prometheus.collectDefaultMetrics(options);\n }\n});\n\nexport { Prometheus, defaultRegister, configure };\n","import type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricNames: {\n up: ['nodejs_up'],\n },\n gcCollectionInterval: 6000,\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n up: asArray(options.metricNames.up).map(\n (nameOfUpMetric: string) =>\n new Prometheus.Gauge({\n name: `${options.metricPrefix}${nameOfUpMetric}`,\n help: '1 = nodejs server is up, 0 = nodejs server is not up',\n }),\n ),\n});\n\nconst createGcMetrics = (options: TDefaultedPromsterOptions): TGcMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const gcMetrics = getMetrics(defaultedOptions);\n\n return gcMetrics;\n};\n\ncreateGcMetrics.defaultOptions = defaultOptions;\n\nexport { createGcMetrics };\n","import { gcStats } from '@chainsafe/prometheus-gc-stats';\nimport type { TDefaultedPromsterOptions, TGcMetrics } from '@promster/types';\nimport { once } from 'es-toolkit/function';\n\nimport { defaultRegister } from '../client/client';\n\nconst defaultOptions = {\n disableGcMetrics: false,\n};\n\nconst createGcObserver = once(\n (_metrics: TGcMetrics, options: TDefaultedPromsterOptions) => () => {\n gcStats(defaultRegister, {\n collectionInterval: options.gcCollectionInterval,\n prefix: options.metricPrefix,\n });\n },\n);\n\n// @ts-expect-error\ncreateGcObserver.defaultOptions = defaultOptions;\n\nexport { createGcObserver };\n","import type {\n TDefaultedPromsterOptions,\n TGraphQlMetrics,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst defaultGraphQlPercentiles = [0.5, 0.9, 0.95, 0.98, 0.99];\n\nconst defaultLabels = ['operation_name'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveGraphQlParseDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlParseDurationHistogram');\nconst shouldObserveGraphQlValidationDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlValidationDurationHistogram');\nconst shouldObserveGraphQlResolveFieldDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlResolveFieldDurationHistogram');\nconst shouldObserveGraphQlRequestDurationAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlRequestDurationHistogram');\nconst shouldObserveGraphQlErrorsTotalAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('graphQlErrorsTotal');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: [\n 'graphQlParseDurationHistogram',\n 'graphQlValidationDurationHistogram',\n 'graphQlResolveFieldDurationHistogram',\n 'graphQlRequestDurationHistogram',\n 'graphQlErrorsTotal',\n ],\n metricNames: {\n graphQlParseDuration: ['graphql_parse_duration_seconds'],\n graphQlValidationDuration: ['graphql_validation_duration_seconds'],\n graphQlResolveFieldDuration: ['graphql_resolve_field_duration_seconds'],\n graphQlRequestDuration: ['graphql_request_duration_seconds'],\n graphQlErrorsTotal: ['graphql_errors_total'],\n },\n metricPercentiles: {\n graphQlParseDuration: defaultGraphQlPercentiles,\n graphQlValidationDuration: defaultGraphQlPercentiles,\n graphQlResolveFieldDuration: defaultGraphQlPercentiles,\n graphQlRequestDuration: defaultGraphQlPercentiles,\n graphQlErrorsTotal: defaultGraphQlPercentiles,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n graphQlParseDuration: shouldObserveGraphQlParseDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlParseDuration).map(\n (nameOfGraphQlParseDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlParseDuration}`,\n help: 'The GraphQL request parse time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlParseDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlValidationDuration: shouldObserveGraphQlValidationDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlValidationDuration).map(\n (nameOfGraphQlValidationDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlValidationDuration}`,\n help: 'The GraphQL request validation time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlValidationDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlResolveFieldDuration:\n shouldObserveGraphQlResolveFieldDurationAsHistogram(options)\n ? asArray(options.metricNames.graphQlResolveFieldDuration).map(\n (nameOfGraphQlResolveFieldDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlResolveFieldDuration}`,\n help: 'The GraphQL field resolving time in seconds.',\n labelNames: defaultLabels\n .concat(['field_name'])\n .concat(options.labels)\n .toSorted(),\n buckets:\n options.metricPercentiles?.graphQlResolveFieldDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlRequestDuration: shouldObserveGraphQlRequestDurationAsHistogram(\n options,\n )\n ? asArray(options.metricNames.graphQlRequestDuration).map(\n (nameOfGraphQlRequestDuration: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfGraphQlRequestDuration}`,\n help: 'The GraphQL request duration time in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricPercentiles?.graphQlRequestDuration ||\n defaultGraphQlPercentiles,\n }),\n )\n : undefined,\n\n graphQlErrorsTotal: shouldObserveGraphQlErrorsTotalAsCounter(options)\n ? asArray(options.metricNames.graphQlErrorsTotal).map(\n (nameOfGraphQlErrorsCount: string) =>\n new Prometheus.Counter({\n name: `${options.metricPrefix}${nameOfGraphQlErrorsCount}`,\n help: 'Count of errors while parsing, validating, or executing a GraphQL operation.',\n labelNames: defaultLabels\n .concat(['phase'])\n .concat(options.labels)\n .toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createGraphQlMetrics = (\n options: TDefaultedPromsterOptions,\n): TGraphQlMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n return metrics;\n};\n\ncreateGraphQlMetrics.defaultOptions = defaultOptions;\n\nexport { createGraphQlMetrics };\n","import type { TDefaultedPromsterOptions, THttpMetrics } from '@promster/types';\nimport merge from 'merge-options';\n\nimport { configure, Prometheus } from '../client';\n\nconst defaultHttpRequestDurationPercentileInSeconds = [\n 0.5, 0.9, 0.95, 0.98, 0.99,\n];\nconst defaultHttpRequestDurationInSeconds = [\n 0.05, 0.1, 0.3, 0.5, 0.8, 1, 1.5, 2, 3, 10,\n];\nconst defaultHttpContentLengthInBytes = [\n 100000, 200000, 500000, 1000000, 1500000, 2000000, 3000000, 5000000, 10000000,\n];\n\nconst defaultLabels = ['path', 'status_code', 'method'];\nconst asArray = (maybeArray: Readonly<string[] | string>) =>\n Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n\nconst shouldObserveHttpRequestsAsSummary = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsSummary');\nconst shouldObserveHttpRequestsAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsHistogram');\nconst shouldObserveHttpRequestsAsCounter = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpRequestsTotal');\nconst shouldObserveHttpContentLengthAsHistogram = (\n options: TDefaultedPromsterOptions,\n) => options.metricTypes.includes('httpContentLengthHistogram');\n\nconst defaultOptions = {\n getLabelValues: () => ({}),\n labels: [],\n metricPrefix: '',\n metricTypes: ['httpRequestsTotal', 'httpRequestsHistogram'],\n metricNames: {\n httpRequestsTotal: ['http_requests_total'],\n httpRequestDurationPerPercentileInSeconds: [\n 'http_request_duration_per_percentile_seconds',\n ],\n httpRequestDurationInSeconds: ['http_request_duration_seconds'],\n httpRequestContentLengthInBytes: ['http_request_content_length_bytes'],\n httpResponseContentLengthInBytes: ['http_response_content_length_bytes'],\n },\n metricBuckets: {\n httpRequestContentLengthInBytes: defaultHttpContentLengthInBytes,\n httpRequestDurationInSeconds: defaultHttpRequestDurationInSeconds,\n },\n metricPercentiles: {\n httpRequestDurationPerPercentileInSeconds:\n defaultHttpRequestDurationPercentileInSeconds,\n httpResponseContentLengthInBytes: defaultHttpContentLengthInBytes,\n },\n};\n\nconst getMetrics = (options: TDefaultedPromsterOptions) => ({\n httpRequestContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpRequestContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP request content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n\n httpResponseContentLengthInBytes: shouldObserveHttpContentLengthAsHistogram(\n options,\n )\n ? asArray(options.metricNames.httpResponseContentLengthInBytes).map(\n (nameOfHttpContentLengthMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpContentLengthMetric}`,\n help: 'The HTTP response content length in bytes.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpResponseContentLengthInBytes ||\n defaultHttpContentLengthInBytes,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestLatencyMetricsInSeconds = (\n options: TDefaultedPromsterOptions,\n) => ({\n httpRequestDurationPerPercentileInSeconds: shouldObserveHttpRequestsAsSummary(\n options,\n )\n ? asArray(\n options.metricNames.httpRequestDurationPerPercentileInSeconds,\n ).map(\n (nameOfHttpRequestDurationPerPercentileInSeconds: string) =>\n new Prometheus.Summary({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationPerPercentileInSeconds}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n percentiles:\n options.metricPercentiles\n ?.httpRequestDurationPerPercentileInSeconds ||\n defaultHttpRequestDurationPercentileInSeconds,\n }),\n )\n : undefined,\n\n httpRequestDurationInSeconds: shouldObserveHttpRequestsAsHistogram(options)\n ? asArray(options.metricNames.httpRequestDurationInSeconds).map(\n (nameOfHttpRequestDurationInSecondsMetric: string) =>\n new Prometheus.Histogram({\n name: `${options.metricPrefix}${nameOfHttpRequestDurationInSecondsMetric}`,\n help: 'The HTTP request latencies in seconds.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n buckets:\n options.metricBuckets?.httpRequestDurationInSeconds ||\n defaultHttpRequestDurationInSeconds,\n }),\n )\n : undefined,\n});\n\nconst getHttpRequestCounterMetric = (options: TDefaultedPromsterOptions) => ({\n httpRequestsTotal: shouldObserveHttpRequestsAsCounter(options)\n ? asArray(options.metricNames.httpRequestsTotal).map(\n (nameOfHttpRequestsTotalMetric: string) =>\n new Prometheus.Counter({\n name: `${options.metricPrefix}${nameOfHttpRequestsTotalMetric}`,\n help: 'The total HTTP requests.',\n labelNames: defaultLabels.concat(options.labels).toSorted(),\n }),\n )\n : undefined,\n});\n\nconst createHttpMetrics = (\n options: TDefaultedPromsterOptions,\n): THttpMetrics => {\n const defaultedOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n\n configure({\n prefix: defaultedOptions.metricPrefix,\n });\n\n const metrics = getMetrics(defaultedOptions);\n\n const httpRequestLatencyMetricsInSeconds =\n getHttpRequestLatencyMetricsInSeconds(defaultedOptions);\n const httpRequestCounterMetric =\n getHttpRequestCounterMetric(defaultedOptions);\n\n return Object.assign(\n {},\n metrics,\n httpRequestLatencyMetricsInSeconds,\n httpRequestCounterMetric,\n );\n};\n\ncreateHttpMetrics.defaultOptions = defaultOptions;\n\nexport { createHttpMetrics };\n","const NS_PER_SEC = 1e9;\n\nfunction endMeasurementFrom(start: [number, number]) {\n const [seconds, nanoseconds] = process.hrtime(start);\n\n return {\n durationS: (seconds * NS_PER_SEC + nanoseconds) / NS_PER_SEC,\n };\n}\n\nexport { endMeasurementFrom };\n","import type { TLabelValues } from '@promster/types';\n\nfunction sortLabels(unsortedLabels: TLabelValues): TLabelValues {\n return Object.keys(unsortedLabels)\n .toSorted((a, b) => {\n if (a < b) {\n return -1;\n }\n\n if (a > b) {\n return 1;\n }\n\n return 0;\n })\n .reduce<TLabelValues>((sortedLabels, labelName) => {\n sortedLabels[labelName] = unsortedLabels[labelName];\n return sortedLabels;\n }, {});\n}\n\nexport { sortLabels };\n","import type {\n TDefaultedPromsterOptions,\n THttpMetrics,\n TLabelValues,\n TOptionalPromsterOptions,\n} from '@promster/types';\nimport merge from 'merge-options';\n\nimport { endMeasurementFrom } from '../end-measurement-from';\nimport { skipMetricsInEnvironment } from '../environment';\nimport { sortLabels } from '../sort-labels';\nimport type { Timing } from '../timing';\n\ntype TRecordingOptions = {\n labels: TLabelValues;\n requestContentLength?: number;\n responseContentLength?: number;\n};\n\ntype TLegacyTiming = [number, number];\nexport type TRequestRecorder = (\n _timing: Timing | TLegacyTiming,\n _recordingOptions: TRecordingOptions,\n) => void;\n\nconst defaultOptions: TOptionalPromsterOptions = {\n detectKubernetes: false,\n};\n\nfunction isTiming(timing: Timing | TLegacyTiming): timing is Timing {\n return !Array.isArray(timing);\n}\n\nconst createRequestRecorder = (\n metrics: THttpMetrics,\n options: TOptionalPromsterOptions = defaultOptions,\n): TRequestRecorder => {\n const defaultedRecorderOptions: TDefaultedPromsterOptions = merge(\n defaultOptions,\n options,\n );\n const shouldSkipMetricsByEnvironment = skipMetricsInEnvironment(\n defaultedRecorderOptions,\n );\n\n return (\n timing: Timing | TLegacyTiming,\n recordingOptions: TRecordingOptions,\n ) => {\n const durationS = isTiming(timing)\n ? timing.end().value().seconds\n : endMeasurementFrom(timing).durationS;\n\n const labels = sortLabels(recordingOptions.labels);\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationInSeconds) {\n for (const httpRequestDurationInSecondsMetricType of metrics.httpRequestDurationInSeconds) {\n httpRequestDurationInSecondsMetricType.observe(labels, durationS);\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestDurationPerPercentileInSeconds) {\n for (const httpRequestDurationPerPercentileInSecondsMetricType of metrics.httpRequestDurationPerPercentileInSeconds) {\n httpRequestDurationPerPercentileInSecondsMetricType.observe(\n labels,\n durationS,\n );\n }\n }\n }\n\n if (!shouldSkipMetricsByEnvironment && durationS !== undefined) {\n if (metrics.httpRequestsTotal) {\n for (const httpRequestsTotalMetricType of metrics.httpRequestsTotal) {\n httpRequestsTotalMetricType.inc(labels);\n }\n }\n }\n\n if (recordingOptions.requestContentLength) {\n if (metrics.httpRequestContentLengthInBytes) {\n for (const httpRequestContentLengthInBytesMetricType of metrics.httpRequestContentLengthInBytes) {\n httpRequestContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.requestContentLength,\n );\n }\n }\n }\n\n if (recordingOptions.responseContentLength) {\n if (metrics.httpResponseContentLengthInBytes) {\n for (const httpResponseContentLengthInBytesMetricType of metrics.httpResponseContentLengthInBytes) {\n httpResponseContentLengthInBytesMetricType.observe(\n labels,\n recordingOptions.responseContentLength,\n );\n }\n }\n }\n };\n};\n\ncreateRequestRecorder.defaultOptions = defaultOptions;\n\nexport { createRequestRecorder, sortLabels, endMeasurementFrom };\n","const normalizeMethod = (method: string): string => method.toLowerCase();\n\nexport { normalizeMethod };\n","import url from 'node:url';\n\nimport UrlValueParser from 'url-value-parser';\n\nconst urlValueParser = new UrlValueParser();\n\nconst normalizePath = (path: string): string => {\n const parsedPathname = url.parse(path).pathname;\n\n if (!parsedPathname) {\n return '';\n }\n\n return urlValueParser.replacePathValues(parsedPathname, '#val');\n};\n\nexport { normalizePath };\n","const normalizeStatusCode = (statusCode: number): number => statusCode;\n\nexport { normalizeStatusCode };\n","import { normalizeMethod } from './method';\nimport { normalizePath } from './path';\nimport { normalizeStatusCode } from './status-code';\n\nconst defaultNormalizers = {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n};\n\nexport {\n normalizeStatusCode,\n normalizePath,\n normalizeMethod,\n defaultNormalizers,\n};\n","import { defaultRegister } from '../client';\n\nconst getSummary = async () => defaultRegister.metrics();\nconst getContentType = () => defaultRegister.contentType;\n\nexport { getSummary, getContentType };\n","class Timing {\n static NS_PER_SEC = BigInt(1e9);\n\n #startTime?: bigint;\n #endTime?: bigint;\n\n constructor() {\n this.reset();\n }\n\n value() {\n const startTime = this.#startTime;\n const endTime = this.#endTime;\n\n if (!endTime || !startTime) {\n return { seconds: undefined };\n }\n\n return { seconds: Number(endTime - startTime) / Number(Timing.NS_PER_SEC) };\n }\n\n reset() {\n this.#startTime = process.hrtime.bigint();\n this.#endTime = undefined;\n\n return this;\n }\n\n end() {\n this.#endTime = process.hrtime.bigint();\n\n return this;\n }\n}\n\nconst timing = {\n start() {\n return new Timing();\n },\n};\n\nexport default timing;\nexport { Timing };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAM,8BACJ,QAAQ,QAAQ,IAAI,uBAAuB;;;ACO7C,MAAM,4BAA4B,YAChC,QAAQ,qBAAqB,QAAQ,CAAC,sBAAsB;;;ACA9D,MAAM,kBAAkBA,YAAW;AAOnC,MAAM,aAAA,GAAA,oBAAA,KAAA,EAAkB,YAA4B;CAGlD,IAAI,CAFmC,yBAAyB,OAE9B,GAChC,YAAW,sBAAsB,OAAO;AAE5C,CAAC;;;ACjBD,MAAMC,aAAW,eACf,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAEtD,MAAMC,mBAAiB;CACrB,uBAAuB,CAAC;CACxB,QAAQ,CAAC;CACT,cAAc;CACd,aAAa,EACX,IAAI,CAAC,WAAW,EAClB;CACA,sBAAsB;AACxB;AAEA,MAAMC,gBAAc,aAAwC,EAC1D,IAAIF,UAAQ,QAAQ,YAAY,EAAE,CAAC,CAAC,KACjC,mBACC,IAAIG,YAAW,MAAM;CACnB,MAAM,GAAG,QAAQ,eAAe;CAChC,MAAM;AACR,CAAC,CACL,EACF;AAEA,MAAM,mBAAmB,YAAmD;CAC1E,MAAM,oBAAA,GAAA,cAAA,QAAA,CACJF,kBACA,OACF;CAEA,UAAU,EACR,QAAQ,iBAAiB,aAC3B,CAAC;CAID,OAFkBC,aAAW,gBAEd;AACjB;AAEA,gBAAgB,iBAAiBD;;;ACrCjC,MAAMG,mBAAiB,EACrB,kBAAkB,MACpB;AAEA,MAAM,oBAAA,GAAA,oBAAA,KAAA,EACH,UAAsB,kBAA6C;CAClE,CAAA,GAAA,+BAAA,QAAA,CAAQ,iBAAiB;EACvB,oBAAoB,QAAQ;EAC5B,QAAQ,QAAQ;CAClB,CAAC;AACH,CACF;AAGA,iBAAiB,iBAAiBA;;;ACZlC,MAAM,4BAA4B;CAAC;CAAK;CAAK;CAAM;CAAM;AAAI;AAE7D,MAAMC,kBAAgB,CAAC,gBAAgB;AACvC,MAAMC,aAAW,eACf,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAEtD,MAAM,gDACJ,YACG,QAAQ,YAAY,SAAS,+BAA+B;AACjE,MAAM,qDACJ,YACG,QAAQ,YAAY,SAAS,oCAAoC;AACtE,MAAM,uDACJ,YACG,QAAQ,YAAY,SAAS,sCAAsC;AACxE,MAAM,kDACJ,YACG,QAAQ,YAAY,SAAS,iCAAiC;AACnE,MAAM,4CACJ,YACG,QAAQ,YAAY,SAAS,oBAAoB;AAEtD,MAAMC,mBAAiB;CACrB,uBAAuB,CAAC;CACxB,QAAQ,CAAC;CACT,cAAc;CACd,aAAa;EACX;EACA;EACA;EACA;EACA;CACF;CACA,aAAa;EACX,sBAAsB,CAAC,gCAAgC;EACvD,2BAA2B,CAAC,qCAAqC;EACjE,6BAA6B,CAAC,wCAAwC;EACtE,wBAAwB,CAAC,kCAAkC;EAC3D,oBAAoB,CAAC,sBAAsB;CAC7C;CACA,mBAAmB;EACjB,sBAAsB;EACtB,2BAA2B;EAC3B,6BAA6B;EAC7B,wBAAwB;EACxB,oBAAoB;CACtB;AACF;AAEA,MAAMC,gBAAc,aAAwC;CAC1D,sBAAsB,6CAA6C,OAAO,IACtEF,UAAQ,QAAQ,YAAY,oBAAoB,CAAC,CAAC,KAC/C,+BACC,IAAIG,YAAW,UAAU;EACvB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAYJ,gBAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS;EAC1D,SACE,QAAQ,mBAAmB,wBAC3B;CACJ,CAAC,CACL,IACA,KAAA;CAEJ,2BAA2B,kDACzB,OACF,IACIC,UAAQ,QAAQ,YAAY,yBAAyB,CAAC,CAAC,KACpD,oCACC,IAAIG,YAAW,UAAU;EACvB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAYJ,gBAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS;EAC1D,SACE,QAAQ,mBAAmB,6BAC3B;CACJ,CAAC,CACL,IACA,KAAA;CAEJ,6BACE,oDAAoD,OAAO,IACvDC,UAAQ,QAAQ,YAAY,2BAA2B,CAAC,CAAC,KACtD,sCACC,IAAIG,YAAW,UAAU;EACvB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAYJ,gBACT,OAAO,CAAC,YAAY,CAAC,CAAC,CACtB,OAAO,QAAQ,MAAM,CAAC,CACtB,SAAS;EACZ,SACE,QAAQ,mBAAmB,+BAC3B;CACJ,CAAC,CACL,IACA,KAAA;CAEN,wBAAwB,+CACtB,OACF,IACIC,UAAQ,QAAQ,YAAY,sBAAsB,CAAC,CAAC,KACjD,iCACC,IAAIG,YAAW,UAAU;EACvB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAYJ,gBAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS;EAC1D,SACE,QAAQ,mBAAmB,0BAC3B;CACJ,CAAC,CACL,IACA,KAAA;CAEJ,oBAAoB,yCAAyC,OAAO,IAChEC,UAAQ,QAAQ,YAAY,kBAAkB,CAAC,CAAC,KAC7C,6BACC,IAAIG,YAAW,QAAQ;EACrB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAYJ,gBACT,OAAO,CAAC,OAAO,CAAC,CAAC,CACjB,OAAO,QAAQ,MAAM,CAAC,CACtB,SAAS;CACd,CAAC,CACL,IACA,KAAA;AACN;AAEA,MAAM,wBACJ,YACoB;CACpB,MAAM,oBAAA,GAAA,cAAA,QAAA,CACJE,kBACA,OACF;CAEA,UAAU,EACR,QAAQ,iBAAiB,aAC3B,CAAC;CAID,OAFgBC,aAAW,gBAEd;AACf;AAEA,qBAAqB,iBAAiBD;;;ACrJtC,MAAM,gDAAgD;CACpD;CAAK;CAAK;CAAM;CAAM;AACxB;AACA,MAAM,sCAAsC;CAC1C;CAAM;CAAK;CAAK;CAAK;CAAK;CAAG;CAAK;CAAG;CAAG;AAC1C;AACA,MAAM,kCAAkC;CACtC;CAAQ;CAAQ;CAAQ;CAAS;CAAS;CAAS;CAAS;CAAS;AACvE;AAEA,MAAM,gBAAgB;CAAC;CAAQ;CAAe;AAAQ;AACtD,MAAM,WAAW,eACf,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAEtD,MAAM,sCACJ,YACG,QAAQ,YAAY,SAAS,qBAAqB;AACvD,MAAM,wCACJ,YACG,QAAQ,YAAY,SAAS,uBAAuB;AACzD,MAAM,sCACJ,YACG,QAAQ,YAAY,SAAS,mBAAmB;AACrD,MAAM,6CACJ,YACG,QAAQ,YAAY,SAAS,4BAA4B;AAE9D,MAAMG,mBAAiB;CACrB,uBAAuB,CAAC;CACxB,QAAQ,CAAC;CACT,cAAc;CACd,aAAa,CAAC,qBAAqB,uBAAuB;CAC1D,aAAa;EACX,mBAAmB,CAAC,qBAAqB;EACzC,2CAA2C,CACzC,8CACF;EACA,8BAA8B,CAAC,+BAA+B;EAC9D,iCAAiC,CAAC,mCAAmC;EACrE,kCAAkC,CAAC,oCAAoC;CACzE;CACA,eAAe;EACb,iCAAiC;EACjC,8BAA8B;CAChC;CACA,mBAAmB;EACjB,2CACE;EACF,kCAAkC;CACpC;AACF;AAEA,MAAM,cAAc,aAAwC;CAC1D,iCAAiC,0CAC/B,OACF,IACI,QAAQ,QAAQ,YAAY,+BAA+B,CAAC,CAAC,KAC1D,kCACC,IAAIC,YAAW,UAAU;EACvB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAY,cAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS;EAC1D,SACE,QAAQ,eAAe,mCACvB;CACJ,CAAC,CACL,IACA,KAAA;CAEJ,kCAAkC,0CAChC,OACF,IACI,QAAQ,QAAQ,YAAY,gCAAgC,CAAC,CAAC,KAC3D,kCACC,IAAIA,YAAW,UAAU;EACvB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAY,cAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS;EAC1D,SACE,QAAQ,eAAe,oCACvB;CACJ,CAAC,CACL,IACA,KAAA;AACN;AAEA,MAAM,yCACJ,aACI;CACJ,2CAA2C,mCACzC,OACF,IACI,QACE,QAAQ,YAAY,yCACtB,CAAC,CAAC,KACC,oDACC,IAAIA,YAAW,QAAQ;EACrB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAY,cAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS;EAC1D,aACE,QAAQ,mBACJ,6CACJ;CACJ,CAAC,CACL,IACA,KAAA;CAEJ,8BAA8B,qCAAqC,OAAO,IACtE,QAAQ,QAAQ,YAAY,4BAA4B,CAAC,CAAC,KACvD,6CACC,IAAIA,YAAW,UAAU;EACvB,MAAM,GAAG,QAAQ,eAAe;EAChC,MAAM;EACN,YAAY,cAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS;EAC1D,SACE,QAAQ,eAAe,gCACvB;CACJ,CAAC,CACL,IACA,KAAA;AACN;AAEA,MAAM,+BAA+B,aAAwC,EAC3E,mBAAmB,mCAAmC,OAAO,IACzD,QAAQ,QAAQ,YAAY,iBAAiB,CAAC,CAAC,KAC5C,kCACC,IAAIA,YAAW,QAAQ;CACrB,MAAM,GAAG,QAAQ,eAAe;CAChC,MAAM;CACN,YAAY,cAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS;AAC5D,CAAC,CACL,IACA,KAAA,EACN;AAEA,MAAM,qBACJ,YACiB;CACjB,MAAM,oBAAA,GAAA,cAAA,QAAA,CACJD,kBACA,OACF;CAEA,UAAU,EACR,QAAQ,iBAAiB,aAC3B,CAAC;CAED,MAAM,UAAU,WAAW,gBAAgB;CAE3C,MAAM,qCACJ,sCAAsC,gBAAgB;CACxD,MAAM,2BACJ,4BAA4B,gBAAgB;CAE9C,OAAO,OAAO,OACZ,CAAC,GACD,SACA,oCACA,wBACF;AACF;AAEA,kBAAkB,iBAAiBA;;;ACxKnC,MAAM,aAAa;AAEnB,SAAS,mBAAmB,OAAyB;CACnD,MAAM,CAAC,SAAS,eAAe,QAAQ,OAAO,KAAK;CAEnD,OAAO,EACL,YAAY,UAAU,aAAa,eAAe,WACpD;AACF;;;ACNA,SAAS,WAAW,gBAA4C;CAC9D,OAAO,OAAO,KAAK,cAAc,CAAC,CAC/B,UAAU,GAAG,MAAM;EAClB,IAAI,IAAI,GACN,OAAO;EAGT,IAAI,IAAI,GACN,OAAO;EAGT,OAAO;CACT,CAAC,CAAC,CACD,QAAsB,cAAc,cAAc;EACjD,aAAa,aAAa,eAAe;EACzC,OAAO;CACT,GAAG,CAAC,CAAC;AACT;;;ACMA,MAAM,iBAA2C,EAC/C,kBAAkB,MACpB;AAEA,SAAS,SAAS,QAAkD;CAClE,OAAO,CAAC,MAAM,QAAQ,MAAM;AAC9B;AAEA,MAAM,yBACJ,SACA,UAAoC,mBACf;CAKrB,MAAM,iCAAiC,0BAAA,GAAA,cAAA,QAAA,CAHrC,gBACA,OAGuB,CACzB;CAEA,QACE,QACA,qBACG;EACH,MAAM,YAAY,SAAS,MAAM,IAC7B,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,UACrB,mBAAmB,MAAM,CAAC,CAAC;EAE/B,MAAM,SAAS,WAAW,iBAAiB,MAAM;EAEjD,IAAI,CAAC,kCAAkC,cAAc,KAAA;OAC/C,QAAQ,8BACV,KAAK,MAAM,0CAA0C,QAAQ,8BAC3D,uCAAuC,QAAQ,QAAQ,SAAS;EAAA;EAKtE,IAAI,CAAC,kCAAkC,cAAc,KAAA;OAC/C,QAAQ,2CACV,KAAK,MAAM,uDAAuD,QAAQ,2CACxE,oDAAoD,QAClD,QACA,SACF;EAAA;EAKN,IAAI,CAAC,kCAAkC,cAAc,KAAA;OAC/C,QAAQ,mBACV,KAAK,MAAM,+BAA+B,QAAQ,mBAChD,4BAA4B,IAAI,MAAM;EAAA;EAK5C,IAAI,iBAAiB;OACf,QAAQ,iCACV,KAAK,MAAM,6CAA6C,QAAQ,iCAC9D,0CAA0C,QACxC,QACA,iBAAiB,oBACnB;EAAA;EAKN,IAAI,iBAAiB;OACf,QAAQ,kCACV,KAAK,MAAM,8CAA8C,QAAQ,kCAC/D,2CAA2C,QACzC,QACA,iBAAiB,qBACnB;EAAA;CAIR;AACF;AAEA,sBAAsB,iBAAiB;;;AC1GvC,MAAM,mBAAmB,WAA2B,OAAO,YAAY;;;ACIvE,MAAM,iBAAiB,IAAIE,iBAAAA,QAAe;AAE1C,MAAM,iBAAiB,SAAyB;CAC9C,MAAM,iBAAiBC,SAAAA,QAAI,MAAM,IAAI,CAAC,CAAC;CAEvC,IAAI,CAAC,gBACH,OAAO;CAGT,OAAO,eAAe,kBAAkB,gBAAgB,MAAM;AAChE;;;ACdA,MAAM,uBAAuB,eAA+B;;;ACI5D,MAAM,qBAAqB;CACzB;CACA;CACA;AACF;;;ACNA,MAAM,aAAa,YAAY,gBAAgB,QAAQ;AACvD,MAAM,uBAAuB,gBAAgB;;;ACH7C,IAAM,SAAN,MAAM,OAAO;CACX,OAAO,aAAa,OAAO,GAAG;CAE9B;CACA;CAEA,cAAc;EACZ,KAAK,MAAM;CACb;CAEA,QAAQ;EACN,MAAM,YAAY,KAAKC;EACvB,MAAM,UAAU,KAAKC;EAErB,IAAI,CAAC,WAAW,CAAC,WACf,OAAO,EAAE,SAAS,KAAA,EAAU;EAG9B,OAAO,EAAE,SAAS,OAAO,UAAU,SAAS,IAAI,OAAO,OAAO,UAAU,EAAE;CAC5E;CAEA,QAAQ;EACN,KAAKD,aAAa,QAAQ,OAAO,OAAO;EACxC,KAAKC,WAAW,KAAA;EAEhB,OAAO;CACT;CAEA,MAAM;EACJ,KAAKA,WAAW,QAAQ,OAAO,OAAO;EAEtC,OAAO;CACT;AACF;AAEA,MAAM,SAAS,EACb,QAAQ;CACN,OAAO,IAAI,OAAO;AACpB,EACF"}