@trdrs/quickcharts 1.3.0 → 2.0.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.
Files changed (85) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/README.md +209 -200
  3. package/dist/adapters/rest.d.ts +3 -3
  4. package/dist/adapters/rest.js +2 -2
  5. package/dist/adapters/rest.js.map +1 -1
  6. package/dist/{ar-G7MVXRE4.js → ar-KSXQ2USS.js} +20 -20
  7. package/dist/ar-KSXQ2USS.js.map +1 -0
  8. package/dist/{assets-ySndlUS3.d.ts → assets-DOuBBsOp.d.ts} +50 -50
  9. package/dist/{ca_ES-EUSRU4VG.js → ca_ES-JG4FM55E.js} +20 -20
  10. package/dist/ca_ES-JG4FM55E.js.map +1 -0
  11. package/dist/{chunk-AA7XKXH4.js → chunk-6S6TO2N6.js} +33 -33
  12. package/dist/chunk-6S6TO2N6.js.map +1 -0
  13. package/dist/{chunk-KFBQSPNA.js → chunk-D3S26ARP.js} +2 -2
  14. package/dist/chunk-D3S26ARP.js.map +1 -0
  15. package/dist/{chunk-AKXIFHQN.js → chunk-KLPTCWA2.js} +1 -1
  16. package/dist/{chunk-AKXIFHQN.js.map → chunk-KLPTCWA2.js.map} +1 -1
  17. package/dist/{de-2SVTG25S.js → de-VSW2LHNF.js} +20 -20
  18. package/dist/de-VSW2LHNF.js.map +1 -0
  19. package/dist/drawings.d.ts +16 -16
  20. package/dist/drawings.js +12 -12
  21. package/dist/{es-UDHZM4W7.js → es-5ZXIPVOB.js} +20 -20
  22. package/dist/es-5ZXIPVOB.js.map +1 -0
  23. package/dist/feature-manifest.json +3 -3
  24. package/dist/{fr-35VN4G4S.js → fr-4F6DAWGD.js} +20 -20
  25. package/dist/fr-4F6DAWGD.js.map +1 -0
  26. package/dist/{he_IL-JPZMCURP.js → he_IL-B7PBQUEV.js} +20 -20
  27. package/dist/he_IL-B7PBQUEV.js.map +1 -0
  28. package/dist/{id_ID-XSTFHHJQ.js → id_ID-CYJRMXPC.js} +20 -20
  29. package/dist/id_ID-CYJRMXPC.js.map +1 -0
  30. package/dist/index.d.ts +167 -163
  31. package/dist/index.js +248 -237
  32. package/dist/index.js.map +1 -1
  33. package/dist/{it-EIY6JESQ.js → it-KTX4SG5P.js} +20 -20
  34. package/dist/it-KTX4SG5P.js.map +1 -0
  35. package/dist/{ja-42N4XRCW.js → ja-V7OURU5D.js} +20 -20
  36. package/dist/ja-V7OURU5D.js.map +1 -0
  37. package/dist/{ko-3VRPTIP3.js → ko-2RNEBYVE.js} +20 -20
  38. package/dist/ko-2RNEBYVE.js.map +1 -0
  39. package/dist/{ms_MY-SKN7O6M5.js → ms_MY-EY235E7Q.js} +20 -20
  40. package/dist/ms_MY-EY235E7Q.js.map +1 -0
  41. package/dist/{pl-TYARHCLT.js → pl-ADNVRP55.js} +20 -20
  42. package/dist/pl-ADNVRP55.js.map +1 -0
  43. package/dist/{pt-72IIFLL4.js → pt-OL2DR3DO.js} +20 -20
  44. package/dist/pt-OL2DR3DO.js.map +1 -0
  45. package/dist/quickcharts.css +97 -96
  46. package/dist/{resources-Ch8eA1Mw.d.ts → resources-Le6flcEn.d.ts} +3 -3
  47. package/dist/rest-openapi.json +11 -11
  48. package/dist/{ru-TPH4F7IB.js → ru-V6YFEPAF.js} +20 -20
  49. package/dist/ru-V6YFEPAF.js.map +1 -0
  50. package/dist/{sv-DC5RS67Z.js → sv-TORXQVE7.js} +20 -20
  51. package/dist/sv-TORXQVE7.js.map +1 -0
  52. package/dist/{th-I6H6AOZ3.js → th-K6SJSYSY.js} +20 -20
  53. package/dist/th-K6SJSYSY.js.map +1 -0
  54. package/dist/theme-manifest.json +10 -10
  55. package/dist/{tr-7FSUVCNW.js → tr-4AEM66KW.js} +20 -20
  56. package/dist/tr-4AEM66KW.js.map +1 -0
  57. package/dist/{vi-DLRPHLLH.js → vi-YU5XCEUU.js} +20 -20
  58. package/dist/vi-YU5XCEUU.js.map +1 -0
  59. package/dist/{zh-ZXIQBBEP.js → zh-QXKRYHU5.js} +20 -20
  60. package/dist/zh-QXKRYHU5.js.map +1 -0
  61. package/dist/{zh_TW-TYNUJU7U.js → zh_TW-AYPDKG4Q.js} +20 -20
  62. package/dist/zh_TW-AYPDKG4Q.js.map +1 -0
  63. package/package.json +1 -1
  64. package/dist/ar-G7MVXRE4.js.map +0 -1
  65. package/dist/ca_ES-EUSRU4VG.js.map +0 -1
  66. package/dist/chunk-AA7XKXH4.js.map +0 -1
  67. package/dist/chunk-KFBQSPNA.js.map +0 -1
  68. package/dist/de-2SVTG25S.js.map +0 -1
  69. package/dist/es-UDHZM4W7.js.map +0 -1
  70. package/dist/fr-35VN4G4S.js.map +0 -1
  71. package/dist/he_IL-JPZMCURP.js.map +0 -1
  72. package/dist/id_ID-XSTFHHJQ.js.map +0 -1
  73. package/dist/it-EIY6JESQ.js.map +0 -1
  74. package/dist/ja-42N4XRCW.js.map +0 -1
  75. package/dist/ko-3VRPTIP3.js.map +0 -1
  76. package/dist/ms_MY-SKN7O6M5.js.map +0 -1
  77. package/dist/pl-TYARHCLT.js.map +0 -1
  78. package/dist/pt-72IIFLL4.js.map +0 -1
  79. package/dist/ru-TPH4F7IB.js.map +0 -1
  80. package/dist/sv-DC5RS67Z.js.map +0 -1
  81. package/dist/th-I6H6AOZ3.js.map +0 -1
  82. package/dist/tr-7FSUVCNW.js.map +0 -1
  83. package/dist/vi-DLRPHLLH.js.map +0 -1
  84. package/dist/zh-ZXIQBBEP.js.map +0 -1
  85. package/dist/zh_TW-TYNUJU7U.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import { C as ChartSaveLoadAdapter } from '../resources-Ch8eA1Mw.js';
1
+ import { C as ChartSaveLoadAdapter } from '../resources-Le6flcEn.js';
2
2
 
3
3
  /** The three template collections. */
4
- type RestTemplateKind = 'study' | 'drawing' | 'palette';
4
+ type RestTemplateKind = 'indicator' | 'drawing' | 'palette';
5
5
  /** Which collection a request addresses. Templates are three collections rather than one, so the
6
6
  * kind is part of the address rather than a field inside it. */
7
7
  type RestCollection = {
@@ -80,7 +80,7 @@ interface RestDrawingsMeta extends RestResourceRef {
80
80
  interface RestDrawingsBody {
81
81
  content: string;
82
82
  }
83
- /** A template's listing row. `tool` scopes a drawing template to its tool; study and palette
83
+ /** A template's listing row. `tool` scopes a drawing template to its tool; indicator and palette
84
84
  * templates carry none. */
85
85
  interface RestTemplateMeta extends RestResourceRef {
86
86
  name: string;
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  ResourceAbortError
3
- } from "../chunk-KFBQSPNA.js";
3
+ } from "../chunk-D3S26ARP.js";
4
4
  import {
5
5
  DRAWING_DOCUMENT_VERSION,
6
6
  drawingContextKey,
7
7
  parseDrawingDocument
8
- } from "../chunk-AKXIFHQN.js";
8
+ } from "../chunk-KLPTCWA2.js";
9
9
 
10
10
  // src/adapters/rest/wire.ts
11
11
  var REST_IF_MATCH_HEADER = "if-match";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/rest/wire.ts","../../src/adapters/rest/index.ts"],"sourcesContent":["// THE PUBLIC REST WIRE CONTRACT for saved chart resources: the paths, the payloads and the\n// conditional-write rule a service implements so that `createRestSaveLoadAdapter` can drive it.\n//\n// This module is the contract's one source. The types below are what a service's handlers return\n// and what `./index` reads back; the path helpers are what it asks for. `./openapi` renders the\n// same facts as an OpenAPI document, which the build writes to `dist/rest-openapi.json`, so the\n// schema a service author reads and the requests the adapter makes cannot drift apart.\n//\n// Four rules the contract enforces:\n// - Every path is RELATIVE to a base URL the host owns. Nothing here names an origin, a service,\n// a credential or a header a host has not asked for.\n// - Identity and version travel in the BODY: every row carries a stable `id` and an opaque\n// `revision`. A reader quotes the revision it read back in `If-Match` on its next write, and a\n// service compares it for equality alone. Minting it as an ETag value, a counter or a content\n// hash is the service's choice.\n// - A write against a revision the service has moved past is 409 with the ref that stands now,\n// never a silent overwrite. An unknown id is 404. A conditional route reached with no\n// `If-Match` is 428.\n// - Bodies the chart writes are OPAQUE text to the service. It stores and returns `content`\n// without parsing it, so a chart's formats stay the chart's own.\nimport type { DrawingResourceContext } from '../../drawings/document'\n\n/** The contract's own version, which the published OpenAPI document carries as its `info.version`.\n * A later shape arrives as a later number rather than as a widened old one. */\nexport const REST_WIRE_VERSION = 1\n\n/** The three template collections. */\nexport type RestTemplateKind = 'study' | 'drawing' | 'palette'\n\nexport const REST_TEMPLATE_KINDS: readonly RestTemplateKind[] = ['study', 'drawing', 'palette']\n\n/** Which collection a request addresses. Templates are three collections rather than one, so the\n * kind is part of the address rather than a field inside it. */\nexport type RestCollection = { family: 'charts' | 'layouts' | 'drawings' } | { family: 'templates'; kind: RestTemplateKind }\n\n/** The header a conditional write states its revision in. */\nexport const REST_IF_MATCH_HEADER = 'if-match'\n\n/** The statuses the contract gives meaning to. Anything else is a failure the adapter raises. */\nexport const REST_STATUS = {\n /** The id is unknown, deleted, or another principal's. */\n notFound: 404,\n /** The quoted revision is not the one that stands; the body carries the one that is. */\n conflict: 409,\n /** A conditional route was reached with no `If-Match`. The adapter always sends one. */\n revisionRequired: 428,\n} as const\n\n/** A row's identity plus the exact version a reader saw. */\nexport interface RestResourceRef {\n id: string\n /** Opaque: compared for equality, never parsed or ordered. */\n revision: string\n}\n\n/** A listing: metadata only, so a picker paints without fetching content. `items` is the same key\n * in every family, so one reader serves all four. */\nexport interface RestListResponse<Meta> {\n items: Meta[]\n}\n\n/** A read: the ref the document stands at, and the document. */\nexport interface RestLoadResponse<Body> extends RestResourceRef {\n body: Body\n}\n\n/** A create, update or delete that landed: the ref the service now holds (for a delete, the one it\n * removed), and the listing row the write produced where the service computes one. */\nexport interface RestWriteResponse<Meta> extends RestResourceRef {\n meta?: Meta\n}\n\n/** The 409 body: the ref that stands now, so the caller reloads it and re-decides. */\nexport interface RestConflictBody {\n error: 'conflict'\n current: RestResourceRef\n}\n\n/** The 404 body. */\nexport interface RestNotFoundBody {\n error: 'not_found'\n}\n\n/** The 428 body. */\nexport interface RestRevisionRequiredBody {\n error: 'revision_required'\n}\n\n/** A saved chart's listing row. `updatedAt` is ms since epoch, stamped by the service. */\nexport interface RestChartMeta extends RestResourceRef {\n name: string\n symbol: string\n timeframe: string\n updatedAt: number\n}\n\n/** A saved chart. `content` is the chart's serialized state, opaque to the service. */\nexport interface RestChartBody {\n name: string\n symbol: string\n timeframe: string\n content: string\n}\n\n/** A saved multi-chart layout's listing row. `symbol` and `timeframe` are the active chart's when the\n * layout was last saved; a service that does not keep them leaves them out. */\nexport interface RestLayoutMeta extends RestResourceRef {\n name: string\n symbol?: string\n timeframe?: string\n updatedAt: number\n}\n\nexport interface RestLayoutBody {\n name: string\n symbol?: string\n timeframe?: string\n content: string\n}\n\n/** A drawings document's listing row. One context holds at most one document, so the collection\n * answers zero rows or one. */\nexport interface RestDrawingsMeta extends RestResourceRef {\n updatedAt: number\n}\n\n/** A drawings document, as the service stores it: the document's own JSON, as opaque text. */\nexport interface RestDrawingsBody {\n content: string\n}\n\n/** A template's listing row. `tool` scopes a drawing template to its tool; study and palette\n * templates carry none. */\nexport interface RestTemplateMeta extends RestResourceRef {\n name: string\n tool?: string\n updatedAt: number\n}\n\nexport interface RestTemplateBody {\n name: string\n tool?: string\n content: string\n}\n\n/** A collection's path, relative to the host's base URL. */\nexport function restCollectionPath(collection: RestCollection): string {\n return collection.family === 'templates' ? `/templates/${encodeURIComponent(collection.kind)}` : `/${collection.family}`\n}\n\n/** One row's path, relative to the host's base URL. */\nexport function restItemPath(collection: RestCollection, id: string): string {\n return `${restCollectionPath(collection)}/${encodeURIComponent(id)}`\n}\n\n/** The drawing-resource context as one opaque token for the `context` query parameter. Each part is\n * percent-encoded before the join, with the dot separator itself encoded (percent-encoding leaves an\n * unreserved dot alone), so no layout or chart id can spell another context's token, and the kind\n * leads, so a symbol-global document and a layout-shared one never collide. The service\n * keys rows by it and never parses it. */\nexport function restDrawingContextToken(context: DrawingResourceContext): string {\n const parts: string[] = [String(context.version), context.kind]\n if (context.kind === 'chart-local') parts.push(context.layoutId, context.chartId)\n else if (context.kind === 'layout-shared') parts.push(context.layoutId)\n return parts.map((part) => encodeURIComponent(part).replace(/\\./g, '%2E')).join('.')\n}\n\n/** The drawings collection's query: the symbol it belongs to, and the context token. Both are\n * required, because a drawings collection with no context would name every document at once. */\nexport function restDrawingsQuery(context: DrawingResourceContext): string {\n return `symbol=${encodeURIComponent(context.symbol)}&context=${encodeURIComponent(restDrawingContextToken(context))}`\n}","// `@trdrs/quickcharts/adapters/rest` — the optional save/load adapter over the public wire contract in\n// `./wire`.\n//\n// It is a SEPARATE entrypoint because the chart makes no network request of its own. A consumer who\n// never imports this module ships none of it, and a consumer who does hands it two things: where\n// its service lives, and how to reach it.\n//\n// createRestSaveLoadAdapter({ baseUrl, request })\n//\n// `request` is the whole transport. `globalThis.fetch` fits it, and so does a host's own wrapper\n// around one. That is the point: authorization, cookies, CORS, tenancy, retries, timeouts and\n// telemetry are decisions with consequences the chart cannot weigh, so this module holds no\n// credential, no token store, no header policy, no retry and no default origin. The only headers it\n// sets are the two the contract itself needs: the media type of a body it is sending, and the\n// revision a conditional write is quoting.\n//\n// Every refusal the contract defines becomes the core port's typed outcome: 404 is `not-found` (and\n// a null from a load), 409 is `conflict` carrying the ref that stands. Everything else is a\n// `RestSaveLoadError` the caller can inspect and decide about, because a transport failure is not a\n// resource outcome and answering one as an empty list or a missing row would be a lie the next save\n// acts on. An aborted call rejects with the contract's `AbortError`, and nothing lands.\nimport { DRAWING_DOCUMENT_VERSION, drawingContextKey, parseDrawingDocument, type DrawingResourceContext, type DrawingsBody } from '../../drawings/document'\nimport {\n ResourceAbortError,\n type ChartBody,\n type ChartMeta,\n type ChartSaveLoadAdapter,\n type DrawingsMeta,\n type LayoutBody,\n type LayoutMeta,\n type ResourceRef,\n type ResourceStore,\n type TemplateBody,\n type TemplateKind,\n type TemplateMeta,\n type WriteOutcome,\n} from '../../resources'\nimport {\n REST_IF_MATCH_HEADER,\n REST_STATUS,\n restCollectionPath,\n restDrawingsQuery,\n restItemPath,\n type RestChartBody,\n type RestChartMeta,\n type RestCollection,\n type RestConflictBody,\n type RestDrawingsBody,\n type RestDrawingsMeta,\n type RestLayoutBody,\n type RestLayoutMeta,\n type RestListResponse,\n type RestLoadResponse,\n type RestResourceRef,\n type RestTemplateBody,\n type RestTemplateMeta,\n type RestWriteResponse,\n} from './wire'\n\n/** The wire contract, as types a service implementer writes their handlers against. They are what\n * the adapter sends and reads, so a service typed by them and an adapter driving it cannot drift.\n * The paths, the statuses and the schema document are in `./wire` and `dist/rest-openapi.json`. */\nexport type {\n RestChartBody,\n RestChartMeta,\n RestCollection,\n RestConflictBody,\n RestDrawingsBody,\n RestDrawingsMeta,\n RestLayoutBody,\n RestLayoutMeta,\n RestListResponse,\n RestLoadResponse,\n RestNotFoundBody,\n RestResourceRef,\n RestRevisionRequiredBody,\n RestTemplateBody,\n RestTemplateKind,\n RestTemplateMeta,\n RestWriteResponse,\n} from './wire'\n\n/** What the adapter asks a request function to do. Deliberately the subset of `RequestInit` the\n * contract needs, so a host implementing this by hand implements four fields rather than thirty,\n * and a plain `fetch` accepts it unchanged. */\nexport interface RestRequestInit {\n method: string\n headers: Record<string, string>\n /** The JSON payload, on a create and an update; absent on a read and a delete. */\n body?: string\n signal?: AbortSignal\n}\n\n/** What the adapter reads back. The subset of a `Response` the contract needs, so a host may return\n * a real `Response` or its own object of the same shape. */\nexport interface RestResponse {\n readonly status: number\n text(): Promise<string>\n}\n\n/** The host's transport. `fetch` satisfies it; so does a wrapper that adds the host's authorization,\n * its base headers, its retries or its telemetry. The adapter calls it and reads what it answers,\n * and does nothing else with the network. */\nexport type RestRequest = (url: string, init: RestRequestInit) => Promise<RestResponse>\n\nexport interface RestSaveLoadOptions {\n /** Where the host mounts the wire contract's routes. Every path is appended to it, so an origin,\n * a path prefix, or a bare path are all fine. There is no default: the chart does not know where\n * a host's service lives, and guessing would be a request nobody asked for. */\n baseUrl: string\n /** How a request is made. Required, for the same reason. */\n request: RestRequest\n}\n\n/** A request the service answered in a way the contract does not define: a status with no meaning\n * here (`http`), or a body that is not the shape the route promises (`invalid-payload`). It carries\n * what the caller needs to decide: which request, and what came back. */\nexport class RestSaveLoadError extends Error {\n override readonly name = 'RestSaveLoadError'\n readonly reason: 'http' | 'invalid-payload'\n readonly status: number\n readonly method: string\n readonly url: string\n constructor(init: { reason: 'http' | 'invalid-payload'; status: number; method: string; url: string; detail: string }) {\n super(`${init.method} ${init.url}: ${init.detail}`)\n this.reason = init.reason\n this.status = init.status\n this.method = init.method\n this.url = init.url\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null\n\n/** A ref the service stated, or null when it stated something else. Both fields are required and\n * both are strings: a numeric revision that arrived as a number is not this contract's ref, and\n * reading one loosely is how a client starts comparing revisions it cannot compare. */\nconst refOf = (value: unknown): ResourceRef | null => {\n if (!isRecord(value)) return null\n const { id, revision } = value as Partial<RestResourceRef>\n return typeof id === 'string' && id !== '' && typeof revision === 'string' ? { id, revision } : null\n}\n\n/** A layout's listing facts, carried only where they were stated: a service that keeps none answers\n * rows without them, and a row without them is a row the listing names by its time instead. */\nconst listingFacts = (from: { symbol?: string; timeframe?: string }): { symbol?: string; timeframe?: string } => ({\n ...(typeof from.symbol === 'string' ? { symbol: from.symbol } : {}),\n ...(typeof from.timeframe === 'string' ? { timeframe: from.timeframe } : {}),\n})\n\n/** The base URL with no trailing slash, so `${base}/charts` never doubles one. */\nconst trimBase = (baseUrl: string): string => baseUrl.replace(/\\/+$/, '')\n\nexport function createRestSaveLoadAdapter(options: RestSaveLoadOptions): ChartSaveLoadAdapter {\n const base = trimBase(options.baseUrl)\n const request = options.request\n\n /** One call: the abort check, the two contract headers, the host's request, and the status and\n * text it answered. Reading the status is each verb's own job, because what a 404 means differs\n * between a load (nothing there) and an update (the row is gone). */\n async function call(deps: { method: string; path: string; body?: unknown; ref?: ResourceRef; signal?: AbortSignal }): Promise<{ status: number; text: string }> {\n if (deps.signal?.aborted) throw new ResourceAbortError()\n const url = `${base}${deps.path}`\n const headers: Record<string, string> = {}\n if (deps.body !== undefined) headers['content-type'] = 'application/json'\n if (deps.ref) headers[REST_IF_MATCH_HEADER] = deps.ref.revision\n const init: RestRequestInit = { method: deps.method, headers }\n if (deps.body !== undefined) init.body = JSON.stringify(deps.body)\n if (deps.signal) init.signal = deps.signal\n const response = await request(url, init)\n const text = await response.text()\n return { status: response.status, text }\n }\n\n /** The JSON a 2xx carried, held to being an object. A body that is not one is the route's promise\n * broken, which is a failure to report rather than an empty answer to act on. */\n function payload(method: string, url: string, answer: { status: number; text: string }): Record<string, unknown> {\n let parsed: unknown = null\n try {\n parsed = answer.text === '' ? null : JSON.parse(answer.text)\n } catch {\n parsed = null\n }\n if (!isRecord(parsed))\n throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method, url, detail: 'the response is not a JSON object' })\n return parsed\n }\n\n /** A non-2xx the caller did not name: raised with its status, so a host can tell a 401 from a 503\n * and decide (sign in again, back off, tell the trader) rather than see an empty chart. */\n const httpError = (method: string, url: string, status: number): RestSaveLoadError =>\n new RestSaveLoadError({ reason: 'http', status, method, url, detail: `unexpected status ${status}` })\n\n /** One family over one collection. `metaOf` and `bodyOf` read the wire rows; `wireOf` writes the\n * body. The five verbs share the transport and the refusal mapping. */\n function store<Meta, Body, WireMeta, WireBody>(deps: {\n collection: RestCollection\n /** The collection's query, for a family whose collection is scoped (drawings). */\n query?: string\n metaOf: (row: WireMeta) => Meta\n bodyOf: (wire: WireBody, answer: { status: number; text: string }, url: string) => Body\n wireOf: (body: Body) => WireBody\n }): ResourceStore<Meta, Body> {\n const collectionPath = deps.query ? `${restCollectionPath(deps.collection)}?${deps.query}` : restCollectionPath(deps.collection)\n const itemPath = (id: string): string => restItemPath(deps.collection, id)\n\n /** A write's answer as the port's outcome: the ref it landed at, the ref that beat it, or the\n * absence it found. */\n const written = <T>(method: string, path: string, answer: { status: number; text: string }, carriesMeta: boolean): WriteOutcome<T> => {\n const url = `${base}${path}`\n if (answer.status === REST_STATUS.notFound) return { kind: 'not-found' }\n if (answer.status === REST_STATUS.conflict) {\n const conflict = payload(method, url, answer) as Partial<RestConflictBody>\n const current = refOf(conflict.current)\n if (!current) throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method, url, detail: 'the conflict states no current ref' })\n return { kind: 'conflict', current }\n }\n if (answer.status < 200 || answer.status >= 300) throw httpError(method, url, answer.status)\n const body = payload(method, url, answer) as Partial<RestWriteResponse<WireMeta>>\n const ref = refOf(body)\n if (!ref) throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method, url, detail: 'the write states no ref' })\n const outcome: WriteOutcome<T> = { kind: 'ok', ref }\n // A delete answers a ref alone; only a create or an update carries the stored row's meta.\n if (carriesMeta && body.meta !== undefined) outcome.value = deps.metaOf(body.meta) as unknown as T\n return outcome\n }\n\n return {\n async list(signal) {\n const answer = await call({ method: 'GET', path: collectionPath, signal })\n const url = `${base}${collectionPath}`\n if (answer.status < 200 || answer.status >= 300) throw httpError('GET', url, answer.status)\n const body = payload('GET', url, answer) as Partial<RestListResponse<WireMeta>>\n if (!Array.isArray(body.items)) throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method: 'GET', url, detail: 'the listing states no items array' })\n return body.items.map(deps.metaOf)\n },\n async load(id, signal) {\n const path = itemPath(id)\n const url = `${base}${path}`\n const answer = await call({ method: 'GET', path, signal })\n if (answer.status === REST_STATUS.notFound) return null\n if (answer.status < 200 || answer.status >= 300) throw httpError('GET', url, answer.status)\n const body = payload('GET', url, answer) as Partial<RestLoadResponse<WireBody>>\n const ref = refOf(body)\n if (!ref || body.body === undefined || !isRecord(body.body))\n throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method: 'GET', url, detail: 'the read states no ref and body' })\n return { ref, body: deps.bodyOf(body.body, answer, url) }\n },\n async create(body, signal) {\n const answer = await call({ method: 'POST', path: collectionPath, body: deps.wireOf(body), signal })\n return written<Meta>('POST', collectionPath, answer, true)\n },\n async update(ref, body, signal) {\n const path = itemPath(ref.id)\n const answer = await call({ method: 'PUT', path, body: deps.wireOf(body), ref, signal })\n return written<Meta>('PUT', path, answer, true)\n },\n async remove(ref, signal) {\n const path = itemPath(ref.id)\n const answer = await call({ method: 'DELETE', path, ref, signal })\n return written<void>('DELETE', path, answer, false)\n },\n }\n }\n\n const drawingStores = new Map<string, ResourceStore<DrawingsMeta, DrawingsBody>>()\n const templateStores = new Map<TemplateKind, ResourceStore<TemplateMeta, TemplateBody>>()\n\n return {\n charts: store<ChartMeta, ChartBody, RestChartMeta, RestChartBody>({\n collection: { family: 'charts' },\n metaOf: (r) => ({ id: r.id, revision: r.revision, name: r.name, symbol: r.symbol, timeframe: r.timeframe, updatedAt: r.updatedAt }),\n bodyOf: (w) => ({ name: w.name, symbol: w.symbol, timeframe: w.timeframe, content: w.content }),\n wireOf: (b) => ({ name: b.name, symbol: b.symbol, timeframe: b.timeframe, content: b.content }),\n }),\n layouts: store<LayoutMeta, LayoutBody, RestLayoutMeta, RestLayoutBody>({\n collection: { family: 'layouts' },\n metaOf: (r) => ({ id: r.id, revision: r.revision, name: r.name, ...listingFacts(r), updatedAt: r.updatedAt }),\n bodyOf: (w) => ({ name: w.name, ...listingFacts(w), content: w.content }),\n wireOf: (b) => ({ name: b.name, ...listingFacts(b), content: b.content }),\n }),\n drawings(context: DrawingResourceContext) {\n const key = drawingContextKey(context)\n let held = drawingStores.get(key)\n if (!held) {\n held = store<DrawingsMeta, DrawingsBody, RestDrawingsMeta, RestDrawingsBody>({\n collection: { family: 'drawings' },\n query: restDrawingsQuery(context),\n metaOf: (r) => ({ id: r.id, revision: r.revision, updatedAt: r.updatedAt }),\n // The document is the one body the chart itself reads, so this is where a stored row is\n // proved to be a document FOR THIS CONTEXT before the chart sees one. A row that is not\n // is refused rather than read as an empty document: an empty read is followed by a save,\n // and that save would replace the row it misread.\n bodyOf: (w, answer, url) => documentOf(w.content, context, answer.status, url),\n wireOf: (b) => ({ content: JSON.stringify(b) }),\n })\n drawingStores.set(key, held)\n }\n return held\n },\n templates(kind: TemplateKind) {\n let held = templateStores.get(kind)\n if (!held) {\n held = store<TemplateMeta, TemplateBody, RestTemplateMeta, RestTemplateBody>({\n collection: { family: 'templates', kind },\n metaOf: (r) => ({ id: r.id, revision: r.revision, name: r.name, ...(r.tool === undefined ? {} : { tool: r.tool }), updatedAt: r.updatedAt }),\n bodyOf: (w) => ({ name: w.name, ...(w.tool === undefined ? {} : { tool: w.tool }), content: w.content }),\n wireOf: (b) => ({ name: b.name, ...(b.tool === undefined ? {} : { tool: b.tool }), content: b.content }),\n })\n templateStores.set(kind, held)\n }\n return held\n },\n }\n}\n\n/** The stored text as this context's document, or a refusal. `parseDrawingDocument` is total and\n * answers an empty document for anything it cannot read, so the two cases it cannot distinguish\n * are separated here first: text that is not a document at all, and a document written for another\n * context. */\nfunction documentOf(content: string, context: DrawingResourceContext, status: number, url: string): DrawingsBody {\n const refuse = (detail: string): RestSaveLoadError => new RestSaveLoadError({ reason: 'invalid-payload', status, method: 'GET', url, detail })\n let raw: unknown = null\n try {\n raw = JSON.parse(content)\n } catch {\n throw refuse('the stored drawings row is not JSON')\n }\n if (!isRecord(raw)) throw refuse('the stored drawings row is not a drawings document')\n if (raw.version !== DRAWING_DOCUMENT_VERSION) throw refuse(`the stored drawings row is not a version-${String(DRAWING_DOCUMENT_VERSION)} document`)\n if (isRecord(raw.context) && drawingContextKey(raw.context as unknown as DrawingResourceContext) !== drawingContextKey(context))\n throw refuse('the stored drawings row is another context\\'s document')\n return parseDrawingDocument(raw, context)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/adapters/rest/wire.ts","../../src/adapters/rest/index.ts"],"sourcesContent":["// THE PUBLIC REST WIRE CONTRACT for saved chart resources: the paths, the payloads and the\n// conditional-write rule a service implements so that `createRestSaveLoadAdapter` can drive it.\n//\n// This module is the contract's one source. The types below are what a service's handlers return\n// and what `./index` reads back; the path helpers are what it asks for. `./openapi` renders the\n// same facts as an OpenAPI document, which the build writes to `dist/rest-openapi.json`, so the\n// schema a service author reads and the requests the adapter makes cannot drift apart.\n//\n// Four rules the contract enforces:\n// - Every path is RELATIVE to a base URL the host owns. Nothing here names an origin, a service,\n// a credential or a header a host has not asked for.\n// - Identity and version travel in the BODY: every row carries a stable `id` and an opaque\n// `revision`. A reader quotes the revision it read back in `If-Match` on its next write, and a\n// service compares it for equality alone. Minting it as an ETag value, a counter or a content\n// hash is the service's choice.\n// - A write against a revision the service has moved past is 409 with the ref that stands now,\n// never a silent overwrite. An unknown id is 404. A conditional route reached with no\n// `If-Match` is 428.\n// - Bodies the chart writes are OPAQUE text to the service. It stores and returns `content`\n// without parsing it, so a chart's formats stay the chart's own.\nimport type { DrawingResourceContext } from '../../drawings/document'\n\n/** The contract's own version, which the published OpenAPI document carries as its `info.version`.\n * A later shape arrives as a later number rather than as a widened old one. */\nexport const REST_WIRE_VERSION = 2\n\n/** The three template collections. */\nexport type RestTemplateKind = 'indicator' | 'drawing' | 'palette'\n\nexport const REST_TEMPLATE_KINDS: readonly RestTemplateKind[] = ['indicator', 'drawing', 'palette']\n\n/** Which collection a request addresses. Templates are three collections rather than one, so the\n * kind is part of the address rather than a field inside it. */\nexport type RestCollection = { family: 'charts' | 'layouts' | 'drawings' } | { family: 'templates'; kind: RestTemplateKind }\n\n/** The header a conditional write states its revision in. */\nexport const REST_IF_MATCH_HEADER = 'if-match'\n\n/** The statuses the contract gives meaning to. Anything else is a failure the adapter raises. */\nexport const REST_STATUS = {\n /** The id is unknown, deleted, or another principal's. */\n notFound: 404,\n /** The quoted revision is not the one that stands; the body carries the one that is. */\n conflict: 409,\n /** A conditional route was reached with no `If-Match`. The adapter always sends one. */\n revisionRequired: 428,\n} as const\n\n/** A row's identity plus the exact version a reader saw. */\nexport interface RestResourceRef {\n id: string\n /** Opaque: compared for equality, never parsed or ordered. */\n revision: string\n}\n\n/** A listing: metadata only, so a picker paints without fetching content. `items` is the same key\n * in every family, so one reader serves all four. */\nexport interface RestListResponse<Meta> {\n items: Meta[]\n}\n\n/** A read: the ref the document stands at, and the document. */\nexport interface RestLoadResponse<Body> extends RestResourceRef {\n body: Body\n}\n\n/** A create, update or delete that landed: the ref the service now holds (for a delete, the one it\n * removed), and the listing row the write produced where the service computes one. */\nexport interface RestWriteResponse<Meta> extends RestResourceRef {\n meta?: Meta\n}\n\n/** The 409 body: the ref that stands now, so the caller reloads it and re-decides. */\nexport interface RestConflictBody {\n error: 'conflict'\n current: RestResourceRef\n}\n\n/** The 404 body. */\nexport interface RestNotFoundBody {\n error: 'not_found'\n}\n\n/** The 428 body. */\nexport interface RestRevisionRequiredBody {\n error: 'revision_required'\n}\n\n/** A saved chart's listing row. `updatedAt` is ms since epoch, stamped by the service. */\nexport interface RestChartMeta extends RestResourceRef {\n name: string\n symbol: string\n timeframe: string\n updatedAt: number\n}\n\n/** A saved chart. `content` is the chart's serialized state, opaque to the service. */\nexport interface RestChartBody {\n name: string\n symbol: string\n timeframe: string\n content: string\n}\n\n/** A saved multi-chart layout's listing row. `symbol` and `timeframe` are the active chart's when the\n * layout was last saved; a service that does not keep them leaves them out. */\nexport interface RestLayoutMeta extends RestResourceRef {\n name: string\n symbol?: string\n timeframe?: string\n updatedAt: number\n}\n\nexport interface RestLayoutBody {\n name: string\n symbol?: string\n timeframe?: string\n content: string\n}\n\n/** A drawings document's listing row. One context holds at most one document, so the collection\n * answers zero rows or one. */\nexport interface RestDrawingsMeta extends RestResourceRef {\n updatedAt: number\n}\n\n/** A drawings document, as the service stores it: the document's own JSON, as opaque text. */\nexport interface RestDrawingsBody {\n content: string\n}\n\n/** A template's listing row. `tool` scopes a drawing template to its tool; indicator and palette\n * templates carry none. */\nexport interface RestTemplateMeta extends RestResourceRef {\n name: string\n tool?: string\n updatedAt: number\n}\n\nexport interface RestTemplateBody {\n name: string\n tool?: string\n content: string\n}\n\n/** A collection's path, relative to the host's base URL. */\nexport function restCollectionPath(collection: RestCollection): string {\n return collection.family === 'templates' ? `/templates/${encodeURIComponent(collection.kind)}` : `/${collection.family}`\n}\n\n/** One row's path, relative to the host's base URL. */\nexport function restItemPath(collection: RestCollection, id: string): string {\n return `${restCollectionPath(collection)}/${encodeURIComponent(id)}`\n}\n\n/** The drawing-resource context as one opaque token for the `context` query parameter. Each part is\n * percent-encoded before the join, with the dot separator itself encoded (percent-encoding leaves an\n * unreserved dot alone), so no layout or chart id can spell another context's token, and the kind\n * leads, so a symbol-global document and a layout-shared one never collide. The service\n * keys rows by it and never parses it. */\nexport function restDrawingContextToken(context: DrawingResourceContext): string {\n const parts: string[] = [String(context.version), context.kind]\n if (context.kind === 'chart-local') parts.push(context.layoutId, context.chartId)\n else if (context.kind === 'layout-shared') parts.push(context.layoutId)\n return parts.map((part) => encodeURIComponent(part).replace(/\\./g, '%2E')).join('.')\n}\n\n/** The drawings collection's query: the symbol it belongs to, and the context token. Both are\n * required, because a drawings collection with no context would name every document at once. */\nexport function restDrawingsQuery(context: DrawingResourceContext): string {\n return `symbol=${encodeURIComponent(context.symbol)}&context=${encodeURIComponent(restDrawingContextToken(context))}`\n}","// `@trdrs/quickcharts/adapters/rest` — the optional save/load adapter over the public wire contract in\n// `./wire`.\n//\n// It is a SEPARATE entrypoint because the chart makes no network request of its own. A consumer who\n// never imports this module ships none of it, and a consumer who does hands it two things: where\n// its service lives, and how to reach it.\n//\n// createRestSaveLoadAdapter({ baseUrl, request })\n//\n// `request` is the whole transport. `globalThis.fetch` fits it, and so does a host's own wrapper\n// around one. That is the point: authorization, cookies, CORS, tenancy, retries, timeouts and\n// telemetry are decisions with consequences the chart cannot weigh, so this module holds no\n// credential, no token store, no header policy, no retry and no default origin. The only headers it\n// sets are the two the contract itself needs: the media type of a body it is sending, and the\n// revision a conditional write is quoting.\n//\n// Every refusal the contract defines becomes the core port's typed outcome: 404 is `not-found` (and\n// a null from a load), 409 is `conflict` carrying the ref that stands. Everything else is a\n// `RestSaveLoadError` the caller can inspect and decide about, because a transport failure is not a\n// resource outcome and answering one as an empty list or a missing row would be a lie the next save\n// acts on. An aborted call rejects with the contract's `AbortError`, and nothing lands.\nimport { DRAWING_DOCUMENT_VERSION, drawingContextKey, parseDrawingDocument, type DrawingResourceContext, type DrawingsBody } from '../../drawings/document'\nimport {\n ResourceAbortError,\n type ChartBody,\n type ChartMeta,\n type ChartSaveLoadAdapter,\n type DrawingsMeta,\n type LayoutBody,\n type LayoutMeta,\n type ResourceRef,\n type ResourceStore,\n type TemplateBody,\n type TemplateKind,\n type TemplateMeta,\n type WriteOutcome,\n} from '../../resources'\nimport {\n REST_IF_MATCH_HEADER,\n REST_STATUS,\n restCollectionPath,\n restDrawingsQuery,\n restItemPath,\n type RestChartBody,\n type RestChartMeta,\n type RestCollection,\n type RestConflictBody,\n type RestDrawingsBody,\n type RestDrawingsMeta,\n type RestLayoutBody,\n type RestLayoutMeta,\n type RestListResponse,\n type RestLoadResponse,\n type RestResourceRef,\n type RestTemplateBody,\n type RestTemplateMeta,\n type RestWriteResponse,\n} from './wire'\n\n/** The wire contract, as types a service implementer writes their handlers against. They are what\n * the adapter sends and reads, so a service typed by them and an adapter driving it cannot drift.\n * The paths, the statuses and the schema document are in `./wire` and `dist/rest-openapi.json`. */\nexport type {\n RestChartBody,\n RestChartMeta,\n RestCollection,\n RestConflictBody,\n RestDrawingsBody,\n RestDrawingsMeta,\n RestLayoutBody,\n RestLayoutMeta,\n RestListResponse,\n RestLoadResponse,\n RestNotFoundBody,\n RestResourceRef,\n RestRevisionRequiredBody,\n RestTemplateBody,\n RestTemplateKind,\n RestTemplateMeta,\n RestWriteResponse,\n} from './wire'\n\n/** What the adapter asks a request function to do. Deliberately the subset of `RequestInit` the\n * contract needs, so a host implementing this by hand implements four fields rather than thirty,\n * and a plain `fetch` accepts it unchanged. */\nexport interface RestRequestInit {\n method: string\n headers: Record<string, string>\n /** The JSON payload, on a create and an update; absent on a read and a delete. */\n body?: string\n signal?: AbortSignal\n}\n\n/** What the adapter reads back. The subset of a `Response` the contract needs, so a host may return\n * a real `Response` or its own object of the same shape. */\nexport interface RestResponse {\n readonly status: number\n text(): Promise<string>\n}\n\n/** The host's transport. `fetch` satisfies it; so does a wrapper that adds the host's authorization,\n * its base headers, its retries or its telemetry. The adapter calls it and reads what it answers,\n * and does nothing else with the network. */\nexport type RestRequest = (url: string, init: RestRequestInit) => Promise<RestResponse>\n\nexport interface RestSaveLoadOptions {\n /** Where the host mounts the wire contract's routes. Every path is appended to it, so an origin,\n * a path prefix, or a bare path are all fine. There is no default: the chart does not know where\n * a host's service lives, and guessing would be a request nobody asked for. */\n baseUrl: string\n /** How a request is made. Required, for the same reason. */\n request: RestRequest\n}\n\n/** A request the service answered in a way the contract does not define: a status with no meaning\n * here (`http`), or a body that is not the shape the route promises (`invalid-payload`). It carries\n * what the caller needs to decide: which request, and what came back. */\nexport class RestSaveLoadError extends Error {\n override readonly name = 'RestSaveLoadError'\n readonly reason: 'http' | 'invalid-payload'\n readonly status: number\n readonly method: string\n readonly url: string\n constructor(init: { reason: 'http' | 'invalid-payload'; status: number; method: string; url: string; detail: string }) {\n super(`${init.method} ${init.url}: ${init.detail}`)\n this.reason = init.reason\n this.status = init.status\n this.method = init.method\n this.url = init.url\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null\n\n/** A ref the service stated, or null when it stated something else. Both fields are required and\n * both are strings: a numeric revision that arrived as a number is not this contract's ref, and\n * reading one loosely is how a client starts comparing revisions it cannot compare. */\nconst refOf = (value: unknown): ResourceRef | null => {\n if (!isRecord(value)) return null\n const { id, revision } = value as Partial<RestResourceRef>\n return typeof id === 'string' && id !== '' && typeof revision === 'string' ? { id, revision } : null\n}\n\n/** A layout's listing facts, carried only where they were stated: a service that keeps none answers\n * rows without them, and a row without them is a row the listing names by its time instead. */\nconst listingFacts = (from: { symbol?: string; timeframe?: string }): { symbol?: string; timeframe?: string } => ({\n ...(typeof from.symbol === 'string' ? { symbol: from.symbol } : {}),\n ...(typeof from.timeframe === 'string' ? { timeframe: from.timeframe } : {}),\n})\n\n/** The base URL with no trailing slash, so `${base}/charts` never doubles one. */\nconst trimBase = (baseUrl: string): string => baseUrl.replace(/\\/+$/, '')\n\nexport function createRestSaveLoadAdapter(options: RestSaveLoadOptions): ChartSaveLoadAdapter {\n const base = trimBase(options.baseUrl)\n const request = options.request\n\n /** One call: the abort check, the two contract headers, the host's request, and the status and\n * text it answered. Reading the status is each verb's own job, because what a 404 means differs\n * between a load (nothing there) and an update (the row is gone). */\n async function call(deps: { method: string; path: string; body?: unknown; ref?: ResourceRef; signal?: AbortSignal }): Promise<{ status: number; text: string }> {\n if (deps.signal?.aborted) throw new ResourceAbortError()\n const url = `${base}${deps.path}`\n const headers: Record<string, string> = {}\n if (deps.body !== undefined) headers['content-type'] = 'application/json'\n if (deps.ref) headers[REST_IF_MATCH_HEADER] = deps.ref.revision\n const init: RestRequestInit = { method: deps.method, headers }\n if (deps.body !== undefined) init.body = JSON.stringify(deps.body)\n if (deps.signal) init.signal = deps.signal\n const response = await request(url, init)\n const text = await response.text()\n return { status: response.status, text }\n }\n\n /** The JSON a 2xx carried, held to being an object. A body that is not one is the route's promise\n * broken, which is a failure to report rather than an empty answer to act on. */\n function payload(method: string, url: string, answer: { status: number; text: string }): Record<string, unknown> {\n let parsed: unknown = null\n try {\n parsed = answer.text === '' ? null : JSON.parse(answer.text)\n } catch {\n parsed = null\n }\n if (!isRecord(parsed))\n throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method, url, detail: 'the response is not a JSON object' })\n return parsed\n }\n\n /** A non-2xx the caller did not name: raised with its status, so a host can tell a 401 from a 503\n * and decide (sign in again, back off, tell the viewer) rather than see an empty chart. */\n const httpError = (method: string, url: string, status: number): RestSaveLoadError =>\n new RestSaveLoadError({ reason: 'http', status, method, url, detail: `unexpected status ${status}` })\n\n /** One family over one collection. `metaOf` and `bodyOf` read the wire rows; `wireOf` writes the\n * body. The five verbs share the transport and the refusal mapping. */\n function store<Meta, Body, WireMeta, WireBody>(deps: {\n collection: RestCollection\n /** The collection's query, for a family whose collection is scoped (drawings). */\n query?: string\n metaOf: (row: WireMeta) => Meta\n bodyOf: (wire: WireBody, answer: { status: number; text: string }, url: string) => Body\n wireOf: (body: Body) => WireBody\n }): ResourceStore<Meta, Body> {\n const collectionPath = deps.query ? `${restCollectionPath(deps.collection)}?${deps.query}` : restCollectionPath(deps.collection)\n const itemPath = (id: string): string => restItemPath(deps.collection, id)\n\n /** A write's answer as the port's outcome: the ref it landed at, the ref that beat it, or the\n * absence it found. */\n const written = <T>(method: string, path: string, answer: { status: number; text: string }, carriesMeta: boolean): WriteOutcome<T> => {\n const url = `${base}${path}`\n if (answer.status === REST_STATUS.notFound) return { kind: 'not-found' }\n if (answer.status === REST_STATUS.conflict) {\n const conflict = payload(method, url, answer) as Partial<RestConflictBody>\n const current = refOf(conflict.current)\n if (!current) throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method, url, detail: 'the conflict states no current ref' })\n return { kind: 'conflict', current }\n }\n if (answer.status < 200 || answer.status >= 300) throw httpError(method, url, answer.status)\n const body = payload(method, url, answer) as Partial<RestWriteResponse<WireMeta>>\n const ref = refOf(body)\n if (!ref) throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method, url, detail: 'the write states no ref' })\n const outcome: WriteOutcome<T> = { kind: 'ok', ref }\n // A delete answers a ref alone; only a create or an update carries the stored row's meta.\n if (carriesMeta && body.meta !== undefined) outcome.value = deps.metaOf(body.meta) as unknown as T\n return outcome\n }\n\n return {\n async list(signal) {\n const answer = await call({ method: 'GET', path: collectionPath, signal })\n const url = `${base}${collectionPath}`\n if (answer.status < 200 || answer.status >= 300) throw httpError('GET', url, answer.status)\n const body = payload('GET', url, answer) as Partial<RestListResponse<WireMeta>>\n if (!Array.isArray(body.items)) throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method: 'GET', url, detail: 'the listing states no items array' })\n return body.items.map(deps.metaOf)\n },\n async load(id, signal) {\n const path = itemPath(id)\n const url = `${base}${path}`\n const answer = await call({ method: 'GET', path, signal })\n if (answer.status === REST_STATUS.notFound) return null\n if (answer.status < 200 || answer.status >= 300) throw httpError('GET', url, answer.status)\n const body = payload('GET', url, answer) as Partial<RestLoadResponse<WireBody>>\n const ref = refOf(body)\n if (!ref || body.body === undefined || !isRecord(body.body))\n throw new RestSaveLoadError({ reason: 'invalid-payload', status: answer.status, method: 'GET', url, detail: 'the read states no ref and body' })\n return { ref, body: deps.bodyOf(body.body, answer, url) }\n },\n async create(body, signal) {\n const answer = await call({ method: 'POST', path: collectionPath, body: deps.wireOf(body), signal })\n return written<Meta>('POST', collectionPath, answer, true)\n },\n async update(ref, body, signal) {\n const path = itemPath(ref.id)\n const answer = await call({ method: 'PUT', path, body: deps.wireOf(body), ref, signal })\n return written<Meta>('PUT', path, answer, true)\n },\n async remove(ref, signal) {\n const path = itemPath(ref.id)\n const answer = await call({ method: 'DELETE', path, ref, signal })\n return written<void>('DELETE', path, answer, false)\n },\n }\n }\n\n const drawingStores = new Map<string, ResourceStore<DrawingsMeta, DrawingsBody>>()\n const templateStores = new Map<TemplateKind, ResourceStore<TemplateMeta, TemplateBody>>()\n\n return {\n charts: store<ChartMeta, ChartBody, RestChartMeta, RestChartBody>({\n collection: { family: 'charts' },\n metaOf: (r) => ({ id: r.id, revision: r.revision, name: r.name, symbol: r.symbol, timeframe: r.timeframe, updatedAt: r.updatedAt }),\n bodyOf: (w) => ({ name: w.name, symbol: w.symbol, timeframe: w.timeframe, content: w.content }),\n wireOf: (b) => ({ name: b.name, symbol: b.symbol, timeframe: b.timeframe, content: b.content }),\n }),\n layouts: store<LayoutMeta, LayoutBody, RestLayoutMeta, RestLayoutBody>({\n collection: { family: 'layouts' },\n metaOf: (r) => ({ id: r.id, revision: r.revision, name: r.name, ...listingFacts(r), updatedAt: r.updatedAt }),\n bodyOf: (w) => ({ name: w.name, ...listingFacts(w), content: w.content }),\n wireOf: (b) => ({ name: b.name, ...listingFacts(b), content: b.content }),\n }),\n drawings(context: DrawingResourceContext) {\n const key = drawingContextKey(context)\n let held = drawingStores.get(key)\n if (!held) {\n held = store<DrawingsMeta, DrawingsBody, RestDrawingsMeta, RestDrawingsBody>({\n collection: { family: 'drawings' },\n query: restDrawingsQuery(context),\n metaOf: (r) => ({ id: r.id, revision: r.revision, updatedAt: r.updatedAt }),\n // The document is the one body the chart itself reads, so this is where a stored row is\n // proved to be a document FOR THIS CONTEXT before the chart sees one. A row that is not\n // is refused rather than read as an empty document: an empty read is followed by a save,\n // and that save would replace the row it misread.\n bodyOf: (w, answer, url) => documentOf(w.content, context, answer.status, url),\n wireOf: (b) => ({ content: JSON.stringify(b) }),\n })\n drawingStores.set(key, held)\n }\n return held\n },\n templates(kind: TemplateKind) {\n let held = templateStores.get(kind)\n if (!held) {\n held = store<TemplateMeta, TemplateBody, RestTemplateMeta, RestTemplateBody>({\n collection: { family: 'templates', kind },\n metaOf: (r) => ({ id: r.id, revision: r.revision, name: r.name, ...(r.tool === undefined ? {} : { tool: r.tool }), updatedAt: r.updatedAt }),\n bodyOf: (w) => ({ name: w.name, ...(w.tool === undefined ? {} : { tool: w.tool }), content: w.content }),\n wireOf: (b) => ({ name: b.name, ...(b.tool === undefined ? {} : { tool: b.tool }), content: b.content }),\n })\n templateStores.set(kind, held)\n }\n return held\n },\n }\n}\n\n/** The stored text as this context's document, or a refusal. `parseDrawingDocument` is total and\n * answers an empty document for anything it cannot read, so the two cases it cannot distinguish\n * are separated here first: text that is not a document at all, and a document written for another\n * context. */\nfunction documentOf(content: string, context: DrawingResourceContext, status: number, url: string): DrawingsBody {\n const refuse = (detail: string): RestSaveLoadError => new RestSaveLoadError({ reason: 'invalid-payload', status, method: 'GET', url, detail })\n let raw: unknown = null\n try {\n raw = JSON.parse(content)\n } catch {\n throw refuse('the stored drawings row is not JSON')\n }\n if (!isRecord(raw)) throw refuse('the stored drawings row is not a drawings document')\n if (raw.version !== DRAWING_DOCUMENT_VERSION) throw refuse(`the stored drawings row is not a version-${String(DRAWING_DOCUMENT_VERSION)} document`)\n if (isRecord(raw.context) && drawingContextKey(raw.context as unknown as DrawingResourceContext) !== drawingContextKey(context))\n throw refuse('the stored drawings row is another context\\'s document')\n return parseDrawingDocument(raw, context)\n}\n"],"mappings":"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","names":[]}
@@ -6,8 +6,8 @@ var legend = {
6
6
  "legend.close": "C",
7
7
  "legend.change": "{change} ({percent}%)",
8
8
  "legend.indicatorSettings": "\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0645\u0624\u0634\u0631",
9
- "legend.showRows": "Show study rows",
10
- "legend.hideRows": "Hide study rows",
9
+ "legend.showRows": "\u0625\u0638\u0647\u0627\u0631 \u0635\u0641\u0648\u0641 \u0627\u0644\u0645\u0624\u0634\u0631\u0627\u062A",
10
+ "legend.hideRows": "\u0625\u062E\u0641\u0627\u0621 \u0635\u0641\u0648\u0641 \u0627\u0644\u0645\u0624\u0634\u0631\u0627\u062A",
11
11
  "legend.restorePane": "\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0644\u0648\u062D\u0629",
12
12
  "legend.collapsePane": "\u0637\u064A \u0627\u0644\u0644\u0648\u062D\u0629",
13
13
  "legend.maximizePane": "\u062A\u0643\u0628\u064A\u0631 \u0627\u0644\u0644\u0648\u062D\u0629",
@@ -160,11 +160,11 @@ var replay = {
160
160
  "replay.speed": "Replay speed",
161
161
  "replay.updatesPerSecond": { zero: "{count} updates per second", one: "{count} update per second", two: "{count} updates per second", few: "{count} updates per second", many: "{count} updates per second", other: "{count} updates per second" },
162
162
  "replay.oneUpdatePerSeconds": { zero: "1 update per {count} seconds", one: "1 update per {count} second", two: "1 update per {count} seconds", few: "1 update per {count} seconds", many: "1 update per {count} seconds", other: "1 update per {count} seconds" },
163
- "replay.interval": "Update interval",
164
- "replay.intervalHelp": "How much time each replay update advances. Finer than the chart interval, each bar forms from real finer bars.",
165
- "replay.intervalNone": "No finer interval for this chart interval",
163
+ "replay.timeframe": "Update timeframe",
164
+ "replay.timeframeHelp": "How much time each replay update advances. Finer than the chart timeframe, each bar forms from real finer bars.",
165
+ "replay.timeframeNone": "No finer timeframe for this chart timeframe",
166
166
  "replay.auto": "\u062A\u0644\u0642\u0627\u0626\u064A",
167
- "replay.autoSelectInterval": "Auto select interval"
167
+ "replay.autoSelectTimeframe": "Auto select timeframe"
168
168
  };
169
169
 
170
170
  // src/i18n/ar/inputs.ts
@@ -243,17 +243,17 @@ var layouts = {
243
243
  "layouts.arrangement": "Chart arrangement",
244
244
  "layouts.syncInLayout": "Sync in layout",
245
245
  "layouts.syncSymbol": "Symbol",
246
- "layouts.syncInterval": "Interval",
246
+ "layouts.syncTimeframe": "\u0627\u0644\u0625\u0637\u0627\u0631 \u0627\u0644\u0632\u0645\u0646\u064A",
247
247
  "layouts.syncCrosshair": "Crosshair",
248
248
  "layouts.syncTime": "Time",
249
249
  "layouts.syncDateRange": "Date range",
250
250
  "layouts.syncSymbolTip": "Symbol changes on all charts within the layout",
251
- "layouts.syncIntervalTip": "Interval changes on all charts within the layout",
251
+ "layouts.syncTimeframeTip": "\u064A\u062A\u063A\u064A\u0631 \u0627\u0644\u0625\u0637\u0627\u0631 \u0627\u0644\u0632\u0645\u0646\u064A \u0641\u064A \u062C\u0645\u064A\u0639 \u0627\u0644\u0631\u0633\u0648\u0645 \u0627\u0644\u0628\u064A\u0627\u0646\u064A\u0629 \u0636\u0645\u0646 \u0627\u0644\u062A\u062E\u0637\u064A\u0637",
252
252
  "layouts.syncCrosshairTip": "Crosshair is synced across all charts within the layout",
253
253
  "layouts.syncTimeTip": "When a chart is clicked, all charts within the layout display the same point of time",
254
254
  "layouts.syncDateRangeTip": "Date range changes on all charts within the layout",
255
255
  "layouts.syncSymbolToggle": "Sync symbol",
256
- "layouts.syncIntervalToggle": "Sync interval",
256
+ "layouts.syncTimeframeToggle": "\u0645\u0632\u0627\u0645\u0646\u0629 \u0627\u0644\u0625\u0637\u0627\u0631 \u0627\u0644\u0632\u0645\u0646\u064A",
257
257
  "layouts.syncCrosshairToggle": "Sync crosshair",
258
258
  "layouts.syncTimeToggle": "Sync time",
259
259
  "layouts.syncDateRangeToggle": "Sync date range",
@@ -285,7 +285,7 @@ var layouts = {
285
285
  "layouts.loading": "Loading",
286
286
  "layouts.emptyNone": "No saved layouts yet.",
287
287
  "layouts.openLayoutRow": "Open layout\u2026",
288
- "layouts.listingFacts": "{symbol}, {interval}",
288
+ "layouts.listingFacts": "{symbol}, {timeframe}",
289
289
  "layouts.listingDated": "{facts} ({date})",
290
290
  "layouts.dialogTitle": "Layouts",
291
291
  "layouts.search": "Search",
@@ -414,7 +414,7 @@ var range = {
414
414
  "range.oneYear": "\u0633\u0646\u0629 \u0648\u0627\u062D\u062F\u0629",
415
415
  "range.fiveYears": "5 \u0633\u0646\u0648\u0627\u062A",
416
416
  "range.all": "\u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
417
- "range.tip": "{range} \xB7 \u0623\u0634\u0631\u0637\u0629 {interval}",
417
+ "range.tip": "{range} \xB7 \u0623\u0634\u0631\u0637\u0629 {timeframe}",
418
418
  "range.zoomIn": "\u062A\u0643\u0628\u064A\u0631",
419
419
  "range.zoomOut": "\u062A\u0635\u063A\u064A\u0631",
420
420
  "range.scrollLeft": "\u0627\u0644\u062A\u0645\u0631\u064A\u0631 \u064A\u0633\u0627\u0631\u0627\u064B",
@@ -580,7 +580,7 @@ var drawing = {
580
580
  "drawing.more": "More",
581
581
  "drawing.moreActions": "More drawing actions",
582
582
  "drawing.visualOrder": "Visual order",
583
- "drawing.visibilityOnIntervals": "Visibility on intervals",
583
+ "drawing.visibilityOnTimeframes": "Visibility on timeframes",
584
584
  "drawing.clone": "Clone",
585
585
  "drawing.copy": "Copy",
586
586
  "drawing.modifierControl": "Ctrl",
@@ -602,10 +602,10 @@ var drawing = {
602
602
  "drawing.sendToBack": "Send to back",
603
603
  "drawing.bringForward": "Bring forward",
604
604
  "drawing.sendBackward": "Send backward",
605
- "drawing.visCurrentAndAbove": "Current interval and above",
606
- "drawing.visCurrentAndBelow": "Current interval and below",
607
- "drawing.visCurrentOnly": "Current interval only",
608
- "drawing.visAll": "All intervals",
605
+ "drawing.visCurrentAndAbove": "Current timeframe and above",
606
+ "drawing.visCurrentAndBelow": "Current timeframe and below",
607
+ "drawing.visCurrentOnly": "Current timeframe only",
608
+ "drawing.visAll": "All timeframes",
609
609
  "drawing.saveTemplate": "Save drawing template",
610
610
  "drawing.templateName": "Template name",
611
611
  "drawing.save": "Save",
@@ -764,7 +764,7 @@ var drawing = {
764
764
  "drawing.unitDays": "Days",
765
765
  "drawing.unitWeeks": "Weeks",
766
766
  "drawing.unitMonths": "Months",
767
- "drawing.intervalPinnedNote": "A drawing stays on at least one interval, so it can always be reached again.",
767
+ "drawing.timeframePinnedNote": "A drawing stays on at least one timeframe, so it can always be reached again.",
768
768
  "drawing.colorSwatch": "Color {hex}",
769
769
  "drawing.customColor": "Custom color",
770
770
  "drawing.saturationValue": "Saturation and brightness",
@@ -858,7 +858,7 @@ var command = {
858
858
  "command.drawingBringForward": "Bring drawing forward",
859
859
  "command.drawingSendBackward": "Send drawing backward",
860
860
  "command.drawingHideSelected": "Hide drawing",
861
- "command.drawingVisibility": "Drawing visibility on intervals",
861
+ "command.drawingVisibility": "Drawing visibility on timeframes",
862
862
  "command.drawingSettings": "Drawing settings",
863
863
  "command.drawingCommitEdit": "Apply drawing settings",
864
864
  "command.drawingPlaceImage": "Place image",
@@ -882,7 +882,7 @@ var command = {
882
882
  "command.replayStepBack": "Step back",
883
883
  "command.replayGoLive": "Replay to the live edge",
884
884
  "command.replaySpeed": "Replay speed",
885
- "command.replayInterval": "Replay update interval",
885
+ "command.replayTimeframe": "Replay update timeframe",
886
886
  "command.timeframeSet": "Timeframe",
887
887
  "command.subsessionRegular": "Regular hours",
888
888
  "command.subsessionExtended": "Extended hours",
@@ -1025,4 +1025,4 @@ var ar_default = dict;
1025
1025
  export {
1026
1026
  ar_default as default
1027
1027
  };
1028
- //# sourceMappingURL=ar-G7MVXRE4.js.map
1028
+ //# sourceMappingURL=ar-KSXQ2USS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/ar/legend.ts","../src/i18n/ar/tools.ts","../src/i18n/ar/menu.ts","../src/i18n/ar/replay.ts","../src/i18n/ar/inputs.ts","../src/i18n/ar/session.ts","../src/i18n/ar/layouts.ts","../src/i18n/ar/host.ts","../src/i18n/ar/indicators.ts","../src/i18n/ar/timeframe.ts","../src/i18n/ar/timezone.ts","../src/i18n/ar/range.ts","../src/i18n/ar/status.ts","../src/i18n/ar/search.ts","../src/i18n/ar/drawing.ts","../src/i18n/ar/command.ts","../src/i18n/ar/chrome.ts","../src/i18n/ar/history.ts","../src/i18n/ar/picker.ts","../src/i18n/ar/settings.ts","../src/i18n/ar/toast.ts","../src/i18n/ar/index.ts"],"sourcesContent":["import type { Translation } from '../runtime'\nimport type { legend as source } from '../en/legend'\n\nexport const legend: Translation<typeof source> = {\n 'legend.open': 'O',\n 'legend.high': 'H',\n 'legend.low': 'L',\n 'legend.close': 'C',\n 'legend.change': '{change} ({percent}%)',\n 'legend.indicatorSettings': 'إعدادات المؤشر',\n 'legend.showRows': 'إظهار صفوف المؤشرات',\n 'legend.hideRows': 'إخفاء صفوف المؤشرات',\n 'legend.restorePane': 'استعادة اللوحة',\n 'legend.collapsePane': 'طي اللوحة',\n 'legend.maximizePane': 'تكبير اللوحة',\n 'legend.showIndicator': 'إظهار المؤشر',\n 'legend.hideIndicator': 'إخفاء المؤشر',\n 'legend.scaleNormal': 'عادي',\n 'legend.scaleLog': 'لوغ',\n 'legend.scalePercent': '%',\n 'legend.scaleIndexed': '100',\n 'legend.changeSymbol': 'تغيير الرمز',\n 'legend.removeCompare': 'إزالة المقارنة',\n 'legend.removeIndicator': 'Remove indicator',\n}\n","import type { Translation } from '../runtime'\nimport type { tools as source } from '../en/tools'\n\nexport const tools: Translation<typeof source> = {\n 'tool.trend_line': 'خط الاتجاه',\n 'tool.ray': 'شعاع',\n 'tool.info_line': 'خط معلومات',\n 'tool.extended': 'خط ممتد',\n 'tool.trend_angle': 'زاوية الاتجاه',\n 'tool.horizontal_line': 'خط أفقي',\n 'tool.horizontal_ray': 'شعاع أفقي',\n 'tool.vertical_line': 'خط عمودي',\n 'tool.cross_line': 'خط متقاطع',\n 'tool.arrow': 'سهم',\n 'tool.rectangle': 'مستطيل',\n 'tool.rotated_rectangle': 'مستطيل مُدار',\n 'tool.ellipse': 'قطع ناقص',\n 'tool.circle': 'دائرة',\n 'tool.triangle': 'مثلث',\n 'tool.arc': 'قوس',\n 'tool.curve': 'منحنى',\n 'tool.double_curve': 'منحنى مزدوج',\n 'tool.regression_trend': 'اتجاه الانحدار',\n 'tool.parallel_channel': 'قناة متوازية',\n 'tool.flat_top_bottom': 'قمة/قاعدة مستوية',\n 'tool.disjoint_channel': 'قناة منفصلة',\n 'tool.fib_retracement': 'تصحيح فيبوناتشي',\n 'tool.fib_trend_ext': 'امتداد فيبوناتشي بحسب الاتجاه',\n 'tool.fib_channel': 'قناة فيبوناتشي',\n 'tool.fib_timezone': 'مناطق فيبوناتشي الزمنية',\n 'tool.fib_speed_resist_fan': 'مروحة مقاومة السرعة لفيبوناتشي',\n 'tool.fib_trend_time': 'زمن فيبوناتشي بحسب الاتجاه',\n 'tool.fib_circles': 'دوائر فيبوناتشي',\n 'tool.fib_spiral': 'حلزون فيبوناتشي',\n 'tool.fib_speed_resist_arcs': 'أقواس مقاومة السرعة لفيبوناتشي',\n 'tool.fib_wedge': 'وتد فيبوناتشي',\n 'tool.pitchfan': 'مروحة الشوكة',\n 'tool.pitchfork': 'شوكة',\n 'tool.schiff_pitchfork': 'شوكة شيف',\n 'tool.schiff_pitchfork_modified': 'شوكة شيف المعدلة',\n 'tool.inside_pitchfork': 'الشوكة الداخلية',\n 'tool.gannbox': 'صندوق جان',\n 'tool.gannbox_square': 'مربع جان',\n 'tool.gannbox_fixed': 'مربع جان الثابت',\n 'tool.gannbox_fan': 'مروحة جان',\n 'tool.xabcd_pattern': 'نموذج XABCD',\n 'tool.cypher_pattern': 'نموذج سايفر',\n 'tool.abcd_pattern': 'نموذج ABCD',\n 'tool.three_drives': 'نموذج الدفعات الثلاث',\n 'tool.triangle_pattern': 'نموذج المثلث',\n 'tool.head_and_shoulders': 'الرأس والكتفين',\n 'tool.elliott_impulse_wave': 'موجة إليوت الدافعة (12345)',\n 'tool.elliott_correction': 'تصحيح إليوت (ABC)',\n 'tool.elliott_triangle_wave': 'مثلث إليوت (ABCDE)',\n 'tool.elliott_double_combo': 'تركيب إليوت المزدوج (WXY)',\n 'tool.elliott_triple_combo': 'تركيب إليوت الثلاثي (WXYXZ)',\n 'tool.cyclic_lines': 'خطوط دورية',\n 'tool.time_cycles': 'الدورات الزمنية',\n 'tool.sine_line': 'خط جيبي',\n 'tool.long_position': 'مركز شراء',\n 'tool.short_position': 'مركز بيع',\n 'tool.forecast': 'توقع المركز',\n 'tool.sector': 'قطاع دائري',\n 'tool.bars_pattern': 'نموذج الأشرطة',\n 'tool.ghost_feed': 'بيانات وهمية',\n 'tool.anchored_vwap': 'VWAP مثبّت',\n 'tool.fixed_range_volume_profile': 'مخطط الحجم لنطاق ثابت',\n 'tool.anchored_volume_profile': 'مخطط الحجم المثبّت',\n 'tool.image': 'صورة',\n 'tool.content_card': 'بطاقة محتوى',\n 'tool.emoji': 'رمز تعبيري',\n 'tool.sticker': 'ملصق',\n 'tool.icon': 'أيقونة',\n 'tool.text': 'نص',\n 'tool.note': 'ملاحظة',\n 'tool.comment': 'تعليق',\n 'tool.callout': 'مربع إشارة',\n 'tool.price_label': 'ملصق السعر',\n 'tool.arrow_up': 'علامة سهم للأعلى',\n 'tool.arrow_down': 'علامة سهم للأسفل',\n 'tool.arrow_marker': 'مُعلِّم سهمي',\n 'tool.flag': 'علامة راية',\n 'tool.price_note': 'ملاحظة السعر',\n 'tool.pin': 'تثبيت',\n 'tool.signpost': 'لوحة إرشادية',\n 'tool.table': 'جدول',\n 'tool.brush': 'فرشاة',\n 'tool.highlighter': 'قلم تحديد',\n 'tool.path': 'مسار',\n 'tool.polyline': 'خط متعدد',\n 'tool.price_range': 'نطاق السعر',\n 'tool.date_range': 'نطاق التاريخ',\n 'tool.date_and_price_range': 'نطاق التاريخ والسعر',\n 'tool.measure': 'قياس',\n}\n","import type { Translation } from '../runtime'\nimport type { menu as source } from '../en/menu'\n\nexport const menu: Translation<typeof source> = {\n 'menu.resetView': 'إعادة تعيين عرض الرسم البياني',\n 'menu.copyPrice': 'نسخ السعر {price}',\n 'menu.paste': 'لصق',\n 'menu.removeIndicators': { zero: 'حذف {count} مؤشر', one: 'حذف {count} مؤشر', two: 'حذف {count} مؤشرين', few: 'حذف {count} مؤشرات', many: 'حذف {count} مؤشراً', other: 'حذف {count} مؤشر' },\n 'menu.removeDrawings': { zero: 'حذف {count} رسم', one: 'حذف {count} رسم', two: 'حذف {count} رسمين', few: 'حذف {count} رسوم', many: 'حذف {count} رسماً', other: 'حذف {count} رسم' },\n 'menu.settings': 'الإعدادات…',\n}\n","import type { Translation } from '../runtime'\nimport type { replay as source } from '../en/replay'\n\nexport const replay: Translation<typeof source> = {\n 'replay.watermark': 'Replay',\n 'replay.selectBar': 'Select bar',\n 'replay.selectDate': 'Select date',\n 'replay.selectStartingPoint': 'Select starting point',\n 'replay.startBar': 'Bar',\n 'replay.startDate': 'Date…',\n 'replay.startFirst': 'First available date',\n 'replay.startRandom': 'Random bar',\n 'replay.startDateField': 'Replay start date',\n 'replay.startTimeField': 'Replay start time (UTC, optional)',\n 'replay.dateMask': 'YYYY-MM-DD',\n 'replay.timeMask': 'HH:MM',\n 'replay.previousMonth': 'Previous month',\n 'replay.nextMonth': 'Next month',\n 'replay.cancel': 'Cancel',\n 'replay.select': 'Select',\n 'replay.weekdayMon': 'Mo',\n 'replay.weekdayTue': 'Tu',\n 'replay.weekdayWed': 'We',\n 'replay.weekdayThu': 'Th',\n 'replay.weekdayFri': 'Fr',\n 'replay.weekdaySat': 'Sa',\n 'replay.weekdaySun': 'Su',\n 'replay.stepBack': 'الرجوع شريطاً واحداً',\n 'replay.play': 'تشغيل',\n 'replay.pause': 'إيقاف مؤقت',\n 'replay.stepForward': 'التقدم شريطاً واحداً',\n 'replay.goLiveTitle': 'الانتقال إلى الحد المباشر',\n 'replay.exit': 'إنهاء إعادة التشغيل',\n 'replay.speed': 'Replay speed',\n 'replay.updatesPerSecond': { zero: '{count} updates per second', one: '{count} update per second', two: '{count} updates per second', few: '{count} updates per second', many: '{count} updates per second', other: '{count} updates per second' },\n 'replay.oneUpdatePerSeconds': { zero: '1 update per {count} seconds', one: '1 update per {count} second', two: '1 update per {count} seconds', few: '1 update per {count} seconds', many: '1 update per {count} seconds', other: '1 update per {count} seconds' },\n 'replay.timeframe': 'Update timeframe',\n 'replay.timeframeHelp': 'How much time each replay update advances. Finer than the chart timeframe, each bar forms from real finer bars.',\n 'replay.timeframeNone': 'No finer timeframe for this chart timeframe',\n 'replay.auto': 'تلقائي',\n 'replay.autoSelectTimeframe': 'Auto select timeframe',\n}\n","import type { Translation } from '../runtime'\nimport type { inputs as source } from '../en/inputs'\n\nexport const inputs: Translation<typeof source> = {\n 'inputs.cancel': 'إلغاء',\n 'inputs.apply': 'تطبيق',\n}\n","import type { Translation } from '../runtime'\nimport type { session as source } from '../en/session'\n\nexport const session: Translation<typeof source> = {\n 'session.pre': 'ما قبل السوق',\n 'session.open': 'السوق مفتوح',\n 'session.extended': 'Extended hours',\n 'session.after': 'ما بعد السوق',\n 'session.closed': 'السوق مغلق',\n}\n","import type { Translation } from '../runtime'\nimport type { layouts as source } from '../en/layouts'\n\nexport const layouts: Translation<typeof source> = {\n 'layout.s': 'رسم بياني واحد',\n 'layout.2h': 'عمودان',\n 'layout.2v': 'صفّان',\n 'layout.3h': '3 أعمدة',\n 'layout.3v': '3 صفوف',\n 'layout.3s': 'كبير يساراً، 2 متراكبة يميناً',\n 'layout.3r': '2 متراكبة يساراً، كبير يميناً',\n 'layout.2_1': '2 أعلى، 1 أسفل',\n 'layout.1_2': '1 أعلى، 2 أسفل',\n 'layout.4': 'شبكة 2 × 2',\n 'layout.4v': '4 صفوف',\n 'layout.4h': '4 أعمدة',\n 'layout.4s': 'كبير يساراً، 3 متراكبة يميناً',\n 'layout.4s_l': '3 متراكبة يساراً، كبير يميناً',\n 'layout.1_3': '1 أعلى، 3 أسفل',\n 'layout.3_1': '3 أعلى، 1 أسفل',\n 'layout.2_2_l': 'عمودان، 2 متراكبة يميناً',\n 'layout.2_2_r': '2 متراكبة يساراً، عمودان',\n 'layout.2_2': '2 أعلى، صفّان بعرض كامل أسفل',\n 'layout.1_4': '1 أعلى، 4 أسفل',\n 'layout.5h': '5 أعمدة',\n 'layout.5v': '5 صفوف',\n 'layout.5s': 'كبير يساراً، 4 متراكبة يميناً',\n 'layout.5s_l': '4 متراكبة يساراً، كبير يميناً',\n 'layout.2_3': '2 أعلى، 3 أسفل',\n 'layout.3_2': '3 أعلى، 2 أسفل',\n 'layout.4_1': '4 أعلى، 1 أسفل',\n 'layout.2_3_l': 'عمودان، 3 متراكبة يميناً',\n 'layout.2_3_r': '3 متراكبة يساراً، عمودان',\n 'layout.6': 'شبكة 3 × 2',\n 'layout.6h': '6 أعمدة',\n 'layout.6v': '6 صفوف',\n 'layout.6c': 'شبكة 2 × 3',\n 'layout.2_4': '2 أعلى، 4 أسفل',\n 'layout.4_2': '4 أعلى، 2 أسفل',\n 'layout.4_3': '4 أعلى، 3 أسفل',\n 'layout.7h': '7 أعمدة',\n 'layout.7s': 'كبير يساراً، 6 متراكبة يميناً',\n 'layout.8': 'شبكة 4 × 2',\n 'layout.8c': 'شبكة 2 × 4',\n 'layout.8h': '8 أعمدة',\n 'layout.8v': '8 صفوف',\n 'layout.9s': 'شبكة 3 × 3',\n 'layout.5_4': '5 أعلى، 4 أسفل',\n 'layout.9h': '9 أعمدة',\n 'layout.9v': '9 صفوف',\n 'layout.10c5': 'شبكة 5 × 2',\n 'layout.10h': '10 أعمدة',\n 'layout.10v': '10 صفوف',\n 'layout.12c6': 'شبكة 6 × 2',\n 'layout.12c4': 'شبكة 4 × 3',\n 'layout.12h': '12 عموداً',\n 'layout.14c7': 'شبكة 7 × 2',\n 'layout.16c8': 'شبكة 8 × 2',\n 'layout.16c4': 'شبكة 4 × 4',\n 'layouts.setup': 'Layout setup',\n 'layouts.arrangement': 'Chart arrangement',\n 'layouts.syncInLayout': 'Sync in layout',\n 'layouts.syncSymbol': 'Symbol',\n 'layouts.syncTimeframe': 'الإطار الزمني',\n 'layouts.syncCrosshair': 'Crosshair',\n 'layouts.syncTime': 'Time',\n 'layouts.syncDateRange': 'Date range',\n 'layouts.syncSymbolTip': 'Symbol changes on all charts within the layout',\n 'layouts.syncTimeframeTip': 'يتغير الإطار الزمني في جميع الرسوم البيانية ضمن التخطيط',\n 'layouts.syncCrosshairTip': 'Crosshair is synced across all charts within the layout',\n 'layouts.syncTimeTip': 'When a chart is clicked, all charts within the layout display the same point of time',\n 'layouts.syncDateRangeTip': 'Date range changes on all charts within the layout',\n 'layouts.syncSymbolToggle': 'Sync symbol',\n 'layouts.syncTimeframeToggle': 'مزامنة الإطار الزمني',\n 'layouts.syncCrosshairToggle': 'Sync crosshair',\n 'layouts.syncTimeToggle': 'Sync time',\n 'layouts.syncDateRangeToggle': 'Sync date range',\n 'layouts.unnamed': 'Unnamed',\n 'layouts.unsavedChanges': 'Unsaved changes',\n 'layouts.allSaved': 'All changes saved',\n 'layouts.notSaving': 'Not saving until this is restored',\n 'layouts.manage': 'Manage layouts',\n 'layouts.saveLayout': 'Save layout',\n 'layouts.hintSave': '{modifier} + S',\n 'layouts.hintOpen': 'Dot',\n 'layouts.save': 'Save',\n 'layouts.autosave': 'Autosave',\n 'layouts.rename': 'Rename',\n 'layouts.copyOfName': '{name} copy',\n 'layouts.saveNewTitle': 'Save New Chart Layout',\n 'layouts.saveNewLabel': 'Enter a new chart layout name:',\n 'layouts.copyTitle': 'Make copy of chart layout',\n 'layouts.renameTitle': 'Rename chart layout',\n 'layouts.createTitle': 'Create layout',\n 'layouts.newLayoutName': 'New layout name',\n 'layouts.createPlaceholder': 'My layout',\n 'layouts.create': 'Create',\n 'layouts.makeCopyRow': 'Make a copy…',\n 'layouts.renameRow': 'Rename…',\n 'layouts.downloadDataRow': 'Download chart data',\n 'layouts.createNewRow': 'Create new layout…',\n 'layouts.recentlyUsed': 'Recently used',\n 'layouts.loading': 'Loading',\n 'layouts.emptyNone': 'No saved layouts yet.',\n 'layouts.openLayoutRow': 'Open layout…',\n 'layouts.listingFacts': '{symbol}, {timeframe}',\n 'layouts.listingDated': '{facts} ({date})',\n 'layouts.dialogTitle': 'Layouts',\n 'layouts.search': 'Search',\n 'layouts.columnName': 'Layout name',\n 'layouts.sortBy': 'Sort by layout name, date changed',\n 'layouts.sortNameAsc': 'Layout name (A to Z)',\n 'layouts.sortNameDesc': 'Layout name (Z to A)',\n 'layouts.sortModifiedAsc': 'Date modified (oldest first)',\n 'layouts.sortModifiedDesc': 'Date modified (newest first)',\n 'layouts.favorite': 'Add to favorites',\n 'layouts.unfavorite': 'Remove from favorites',\n 'layouts.noMatches': 'Nothing matches.',\n 'layouts.delete': 'Delete',\n 'layouts.deleteNamed': 'Delete {name}',\n 'layouts.deleteConfirm': 'Delete this chart layout?',\n 'layouts.deleteConfirmBody': 'Doing this will permanently delete your \"{name}\" layout.',\n 'layouts.cancel': 'Cancel',\n 'layouts.close': 'Close',\n 'layouts.errList': 'Could not load your saved layouts.',\n}\n","import type { Translation } from '../runtime'\nimport type { host as source } from '../en/host'\n\nexport const host: Translation<typeof source> = {\n 'host.noVolume': 'لا يوفر هذا المصدر بيانات الحجم',\n 'host.saveConflict': 'Saved elsewhere since you opened it. Load the newer version before saving.',\n 'host.saveNotFound': 'This was deleted elsewhere. Save it again as new.',\n 'host.loadInvalid': 'This could not be opened. Nothing on screen changed.',\n 'host.loadUnavailable': 'Your saved work could not be reached. Nothing on screen changed.',\n 'host.loadNotRestored': 'This could not be opened, and what was on screen could not be put back. The chart is not saving until you open a saved chart or layout. Save a copy first to keep what is on screen.',\n 'host.notSaving': 'The chart is not saving. Open a saved chart or layout to start from a known state. Saving a copy keeps what is on screen, but the chart still will not save.',\n}\n","import type { Translation } from '../runtime'\nimport type { indicators as source } from '../en/indicators'\n\nexport const indicators: Translation<typeof source> = {\n 'indicator.smaName': 'Simple Moving Average',\n 'indicator.smaDescription': 'Smoothed average over a fixed window',\n 'indicator.emaName': 'Exponential Moving Average',\n 'indicator.emaDescription': 'Recency-weighted moving average',\n 'indicator.hmaName': 'Hull Moving Average',\n 'indicator.hmaDescription': 'Low-lag weighted moving average',\n 'indicator.vwmaName': 'Volume Weighted MA',\n 'indicator.vwmaDescription': 'Moving average weighted by volume',\n 'indicator.bollingerName': 'Bollinger Bands',\n 'indicator.bollingerDescription': 'SMA envelope at two standard deviations',\n 'indicator.donchianName': 'Donchian Channels',\n 'indicator.donchianDescription': 'Rolling highest-high and lowest-low channel',\n 'indicator.keltnerName': 'Keltner Channels',\n 'indicator.keltnerDescription': 'EMA midline with ATR-scaled bands',\n 'indicator.supertrendName': 'Supertrend',\n 'indicator.supertrendDescription': 'ATR trend band that flips with direction',\n 'indicator.psarName': 'Parabolic SAR',\n 'indicator.psarDescription': 'Stop-and-reverse trailing dots',\n 'indicator.rsiName': 'Relative Strength Index',\n 'indicator.rsiDescription': 'Momentum oscillator from 0 to 100',\n 'indicator.macdName': 'MACD',\n 'indicator.macdDescription': 'Moving Average Convergence Divergence',\n 'indicator.stochasticName': 'Stochastic Oscillator',\n 'indicator.stochasticDescription': '%K and %D momentum from 0 to 100',\n 'indicator.stochrsiName': 'Stochastic RSI',\n 'indicator.stochrsiDescription': 'Stochastic applied to the RSI series',\n 'indicator.adxName': 'Average Directional Index',\n 'indicator.adxDescription': 'Trend strength with +DI and -DI',\n 'indicator.atrName': 'Average True Range',\n 'indicator.atrDescription': 'Volatility: Wilder\\'s true-range average',\n 'indicator.cciName': 'Commodity Channel Index',\n 'indicator.cciDescription': 'Deviation from the typical-price average',\n 'indicator.williamsName': 'Williams %R',\n 'indicator.williamsDescription': 'Overbought and oversold momentum from -100 to 0',\n 'indicator.rocName': 'Rate of Change',\n 'indicator.rocDescription': 'Percent change over the period',\n 'indicator.momentumName': 'Momentum',\n 'indicator.momentumDescription': 'Price difference over the period',\n 'indicator.volumeName': 'Volume',\n 'indicator.volumeDescription': 'Per-bar traded volume histogram',\n 'indicator.vwapName': 'Volume Weighted Avg Price',\n 'indicator.vwapDescription': 'Cumulative volume-weighted average price',\n 'indicator.obvName': 'On-Balance Volume',\n 'indicator.obvDescription': 'Cumulative volume by close direction',\n 'indicator.mfiName': 'Money Flow Index',\n 'indicator.mfiDescription': 'Volume-weighted RSI from 0 to 100',\n}\n","import type { Translation } from '../runtime'\nimport type { timeframe as source } from '../en/timeframe'\n\nexport const timeframe: Translation<typeof source> = {\n 'timeframe.title': 'الإطار الزمني',\n 'timeframe.all': 'كل الأطر الزمنية',\n 'timeframe.unitTicks': 'نقاط',\n 'timeframe.unitSeconds': 'ثوان',\n 'timeframe.unitMinutes': 'دقائق',\n 'timeframe.unitHours': 'ساعات',\n 'timeframe.unitDays': 'أيام',\n 'timeframe.unitWeeks': 'أسابيع',\n 'timeframe.unitMonths': 'أشهر',\n 'timeframe.countTicks': { zero: '{count} نقطة', one: '{count} نقطة', two: '{count} نقطتين', few: '{count} نقاط', many: '{count} نقطة', other: '{count} نقطة' },\n 'timeframe.countSeconds': { zero: '{count} ثانية', one: '{count} ثانية', two: '{count} ثانيتين', few: '{count} ثوان', many: '{count} ثانية', other: '{count} ثانية' },\n 'timeframe.countMinutes': { zero: '{count} دقيقة', one: '{count} دقيقة', two: '{count} دقيقتين', few: '{count} دقائق', many: '{count} دقيقة', other: '{count} دقيقة' },\n 'timeframe.countHours': { zero: '{count} ساعة', one: '{count} ساعة', two: '{count} ساعتين', few: '{count} ساعات', many: '{count} ساعة', other: '{count} ساعة' },\n 'timeframe.countDays': { zero: '{count} يوم', one: '{count} يوم', two: '{count} يومين', few: '{count} أيام', many: '{count} يوماً', other: '{count} يوم' },\n 'timeframe.countWeeks': { zero: '{count} أسبوع', one: '{count} أسبوع', two: '{count} أسبوعين', few: '{count} أسابيع', many: '{count} أسبوعاً', other: '{count} أسبوع' },\n 'timeframe.countMonths': { zero: '{count} شهر', one: '{count} شهر', two: '{count} شهرين', few: '{count} أشهر', many: '{count} شهراً', other: '{count} شهر' },\n 'timeframe.delete': 'حذف {timeframe}',\n 'timeframe.save': 'حفظ {timeframe}',\n 'timeframe.exists': '{timeframe} موجود بالفعل',\n 'timeframe.custom': 'إطار زمني مخصص',\n 'timeframe.customCount': 'عدد الإطار الزمني المخصص',\n 'timeframe.customUnit': 'وحدة الإطار الزمني المخصص',\n 'timeframe.addCustom': 'إضافة إطار زمني مخصص',\n 'timeframe.increment': 'زيادة',\n 'timeframe.decrement': 'إنقاص',\n}\n","import type { Translation } from '../runtime'\nimport type { timezone as source } from '../en/timezone'\n\nexport const timezone: Translation<typeof source> = {\n 'timezone.title': 'المنطقة الزمنية للرسم البياني',\n 'timezone.exchange': 'البورصة',\n}\n","import type { Translation } from '../runtime'\nimport type { range as source } from '../en/range'\n\nexport const range: Translation<typeof source> = {\n 'range.oneDay': 'يوم واحد',\n 'range.fiveDays': '5 أيام',\n 'range.oneMonth': 'شهر واحد',\n 'range.threeMonths': '3 أشهر',\n 'range.sixMonths': '6 أشهر',\n 'range.yearToDate': 'من بداية العام',\n 'range.oneYear': 'سنة واحدة',\n 'range.fiveYears': '5 سنوات',\n 'range.all': 'كل البيانات',\n 'range.tip': '{range} · أشرطة {timeframe}',\n 'range.zoomIn': 'تكبير',\n 'range.zoomOut': 'تصغير',\n 'range.scrollLeft': 'التمرير يساراً',\n 'range.scrollRight': 'التمرير يميناً',\n 'range.reset': 'إعادة تعيين عرض الرسم البياني',\n 'range.maximizeChart': 'Maximize chart',\n 'range.restoreChart': 'Restore chart',\n}\n","import type { Translation } from '../runtime'\nimport type { status as source } from '../en/status'\n\nexport const status: Translation<typeof source> = {\n 'status.title': 'حالة السوق',\n 'status.unknownTitle': 'الجلسة غير معروفة',\n 'status.unknown': 'لم تُحدَّد جلسة التداول لهذا الرمز بعد.',\n 'status.endOfDayTitle': 'End of day',\n 'status.endOfDay': 'Prices update once a day, after the session closes.',\n 'status.delayed': 'Prices are delayed.',\n 'status.delayedPair': '{status} {delay}',\n 'status.continuousTitle': 'مفتوح على مدار الساعة',\n 'status.continuous': 'This market trades around the clock and never closes.',\n 'status.open': 'السوق مفتوح للتداول العادي.',\n 'status.openCloses': 'السوق مفتوح للتداول العادي. يُغلق بعد {until}.',\n 'status.extended': 'Market is open for extended-hours trading.',\n 'status.extendedRegular': 'Market is open for extended-hours trading. Regular hours start in {until}.',\n 'status.extendedCloses': 'Market is open for extended-hours trading. Closes in {until}.',\n 'status.pre': 'السوق مفتوح للتداول قبل الافتتاح.',\n 'status.preRegular': 'السوق مفتوح للتداول قبل الافتتاح. تبدأ الساعات العادية بعد {until}.',\n 'status.after': 'السوق مفتوح للتداول بعد الإغلاق.',\n 'status.afterEnds': 'السوق مفتوح للتداول بعد الإغلاق. ينتهي بعد {until}.',\n 'status.closed': 'السوق مغلق.',\n 'status.closedPre': 'السوق مغلق. يبدأ التداول قبل الافتتاح بعد {until}.',\n 'status.closedOpens': 'السوق مغلق. يفتح بعد {until}.',\n 'status.exchangeTimezone': 'المنطقة الزمنية للبورصة: {zone}',\n 'status.durationDays': { zero: '{count} يوم', one: '{count} يوم', two: '{count} يومين', few: '{count} أيام', many: '{count} يوماً', other: '{count} يوم' },\n 'status.durationHours': { zero: '{count} ساعة', one: '{count} ساعة', two: '{count} ساعتين', few: '{count} ساعات', many: '{count} ساعة', other: '{count} ساعة' },\n 'status.durationMinutes': { zero: '{count} دقيقة', one: '{count} دقيقة', two: '{count} دقيقتين', few: '{count} دقائق', many: '{count} دقيقة', other: '{count} دقيقة' },\n 'status.durationPair': '{major} {minor}',\n}\n","import type { Translation } from '../runtime'\nimport type { search as source } from '../en/search'\n\nexport const search: Translation<typeof source> = {\n 'search.title': 'البحث عن رمز',\n 'search.compareTitle': 'مقارنة الرموز',\n 'search.changeSymbolTitle': 'تغيير الرمز',\n 'search.placeholder': 'Search symbol',\n 'search.clear': 'مسح',\n 'search.close': 'Close',\n 'search.noMatches': 'No symbols match your criteria',\n 'search.loadingMore': 'Loading more',\n 'search.failed': 'Search failed.',\n 'search.results': 'Symbols',\n 'search.samePercent': 'نفس مقياس %',\n 'search.newScale': 'مقياس سعر جديد',\n 'search.newPane': 'لوحة جديدة',\n 'search.added': 'الرموز المضافة',\n 'search.recent': 'الرموز الأخيرة',\n 'search.addedMark': '{symbol} على الرسم البياني. انقر للإزالة.',\n 'search.compareEmpty': 'No symbols here yet. Why not add some?',\n 'search.allClasses': 'All',\n 'search.classFilter': 'Asset class',\n 'search.opDivision': 'قسمة',\n 'search.opSubtraction': 'طرح',\n 'search.opAddition': 'جمع',\n 'search.opMultiplication': 'ضرب',\n 'search.opExponentiation': 'أس',\n 'search.opReciprocal': 'مقلوب',\n 'search.opsHide': 'إخفاء عوامل السبريد',\n 'search.opsShow': 'إظهار عوامل السبريد',\n 'search.ops': 'Spread operators',\n}\n","import type { Translation } from '../runtime'\nimport type { drawing as source } from '../en/drawing'\n\nexport const drawing: Translation<typeof source> = {\n 'drawing.toolbar': 'Drawing tools',\n 'drawing.groupTrend': 'Trend tools',\n 'drawing.groupFibGann': 'Fibonacci & Gann',\n 'drawing.groupPatterns': 'Patterns',\n 'drawing.groupForecast': 'Forecast & measure',\n 'drawing.groupGlyphs': 'Emojis & stickers',\n 'drawing.shapes': 'Shapes',\n 'drawing.textNotes': 'Text & notes',\n 'drawing.groupMenu': '{group} menu',\n 'drawing.sectionLines': 'Lines',\n 'drawing.sectionChannels': 'Channels',\n 'drawing.sectionPitchforks': 'Pitchforks',\n 'drawing.sectionFibonacci': 'Fibonacci',\n 'drawing.sectionGann': 'Gann',\n 'drawing.sectionChartPatterns': 'Chart patterns',\n 'drawing.sectionElliott': 'Elliott waves',\n 'drawing.sectionCycles': 'Cycles',\n 'drawing.sectionForecasting': 'Forecasting',\n 'drawing.sectionVolumeBased': 'Volume based',\n 'drawing.sectionMeasures': 'Measures',\n 'drawing.sectionBrushes': 'Brushes',\n 'drawing.sectionArrows': 'Arrows',\n 'drawing.sectionContent': 'Content',\n 'drawing.sectionGlyphs': 'Emojis, stickers, icons',\n 'drawing.cursor': 'Cursor',\n 'drawing.cursorMenu': 'Cursor menu',\n 'drawing.cursorCross': 'Cross',\n 'drawing.cursorDot': 'Dot',\n 'drawing.cursorArrow': 'Arrow',\n 'drawing.cursorEraser': 'Eraser',\n 'drawing.measure': 'Measure',\n 'drawing.zoomIn': 'Zoom in',\n 'drawing.magnet': 'Magnet',\n 'drawing.magnetMenu': 'Magnet menu',\n 'drawing.magnetWeak': 'Weak magnet',\n 'drawing.magnetStrong': 'Strong magnet',\n 'drawing.stayInDrawingMode': 'Stay in drawing mode',\n 'drawing.lockAll': 'Lock all drawings',\n 'drawing.unlockAll': 'Unlock all drawings',\n 'drawing.hideMenu': 'Hide menu',\n 'drawing.hideDrawings': 'Hide drawings',\n 'drawing.showDrawings': 'Show drawings',\n 'drawing.hideIndicators': 'Hide indicators',\n 'drawing.showIndicators': 'Show indicators',\n 'drawing.hideAll': 'Hide all',\n 'drawing.showAll': 'Show all',\n 'drawing.syncLabel': 'Sync drawings across the layout',\n 'drawing.syncOnHelp': 'New drawings are replicated to all charts in the layout and shown when the same ticker is selected',\n 'drawing.syncOffHelp': 'New drawings stay on the chart that drew them',\n 'drawing.removeMenu': 'Remove menu',\n 'drawing.removeDrawings': 'Remove drawings',\n 'drawing.countDrawings': { zero: '{count} drawings', one: '{count} drawing', two: '{count} drawings', few: '{count} drawings', many: '{count} drawings', other: '{count} drawings' },\n 'drawing.countIndicators': { zero: '{count} indicators', one: '{count} indicator', two: '{count} indicators', few: '{count} indicators', many: '{count} indicators', other: '{count} indicators' },\n 'drawing.removeItems': 'Remove {items}',\n 'drawing.removeBoth': 'Remove {drawings} & {indicators}',\n 'drawing.nothingToRemove': 'Nothing to remove',\n 'drawing.alwaysRemoveLocked': 'Always remove locked drawings',\n 'drawing.favTools': 'Favorite drawing tools',\n 'drawing.favToolsBar': 'Favorite drawing tools toolbar',\n 'drawing.favAdd': 'Add {tool} to favorites',\n 'drawing.favRemove': 'Remove {tool} from favorites',\n 'drawing.moveToolbar': 'Move toolbar',\n 'drawing.moveFavoritesToolbar': 'Move favorites toolbar',\n 'drawing.settingsBar': 'Selected drawing',\n 'drawing.templates': 'Templates',\n 'drawing.drawingTemplates': 'Drawing templates',\n 'drawing.saveTemplateAs': 'Save drawing template as...',\n 'drawing.applyDefaultTemplate': 'Apply default drawing template',\n 'drawing.removeTemplateNamed': 'Remove template {name}',\n 'drawing.remove': 'Remove',\n 'drawing.addRowShort': '+ Row',\n 'drawing.addColumnShort': '+ Col',\n 'drawing.drawingColor': 'Drawing color',\n 'drawing.backgroundColor': 'Background color',\n 'drawing.thickness': 'Thickness',\n 'drawing.lineThickness': 'Line thickness',\n 'drawing.thicknessValue': 'Thickness {n}px',\n 'drawing.lineStyle': 'Line style',\n 'drawing.lineStyleValue': 'Line style {name}',\n 'drawing.lineSolid': 'Line',\n 'drawing.lineDashed': 'Dashed line',\n 'drawing.lineDotted': 'Dotted line',\n 'drawing.settings': 'Settings',\n 'drawing.drawingSettings': 'Drawing settings',\n 'drawing.lock': 'Lock',\n 'drawing.unlock': 'Unlock',\n 'drawing.lockDrawing': 'Lock drawing',\n 'drawing.unlockDrawing': 'Unlock drawing',\n 'drawing.deleteDrawing': 'Delete drawing',\n 'drawing.more': 'More',\n 'drawing.moreActions': 'More drawing actions',\n 'drawing.visualOrder': 'Visual order',\n 'drawing.visibilityOnTimeframes': 'Visibility on timeframes',\n 'drawing.clone': 'Clone',\n 'drawing.copy': 'Copy',\n 'drawing.modifierControl': 'Ctrl',\n 'drawing.modifierCommand': 'Cmd',\n 'drawing.hintClone': '{modifier} + Drag',\n 'drawing.hintCopy': '{modifier} + C',\n 'drawing.hintPaste': '{modifier} + V',\n 'drawing.deleteWithKey': 'Delete (Del)',\n 'drawing.statusDrawingsHidden': 'Drawings hidden',\n 'drawing.statusDrawingsShown': 'Drawings shown',\n 'drawing.statusIndicatorsHidden': 'Indicators hidden',\n 'drawing.statusIndicatorsShown': 'Indicators shown',\n 'drawing.statusAllHidden': 'Drawings and indicators hidden',\n 'drawing.statusAllShown': 'Drawings and indicators shown',\n 'drawing.statusAllLocked': 'All drawings locked',\n 'drawing.statusAllUnlocked': 'All drawings unlocked',\n 'drawing.hide': 'Hide',\n 'drawing.bringToFront': 'Bring to front',\n 'drawing.sendToBack': 'Send to back',\n 'drawing.bringForward': 'Bring forward',\n 'drawing.sendBackward': 'Send backward',\n 'drawing.visCurrentAndAbove': 'Current timeframe and above',\n 'drawing.visCurrentAndBelow': 'Current timeframe and below',\n 'drawing.visCurrentOnly': 'Current timeframe only',\n 'drawing.visAll': 'All timeframes',\n 'drawing.saveTemplate': 'Save drawing template',\n 'drawing.templateName': 'Template name',\n 'drawing.save': 'Save',\n 'drawing.deleteTemplateTitle': 'Delete this template?',\n 'drawing.deleteTemplateBody': 'Doing this will permanently delete your \"{name}\" drawing template.',\n 'drawing.settingsTitle': '{tool} settings',\n 'drawing.tabInputs': 'Inputs',\n 'drawing.tabStyle': 'Style',\n 'drawing.tabText': 'Text',\n 'drawing.tabTable': 'Table',\n 'drawing.tabCoordinates': 'Coordinates',\n 'drawing.tabVisibility': 'Visibility',\n 'drawing.template': 'Template',\n 'drawing.saveAs': 'Save as...',\n 'drawing.applyDefaults': 'Apply defaults',\n 'drawing.cancel': 'Cancel',\n 'drawing.ok': 'Ok',\n 'drawing.delete': 'Delete',\n 'drawing.close': 'Close',\n 'drawing.color': 'Color',\n 'drawing.rowLine': 'Line',\n 'drawing.background': 'Background',\n 'drawing.border': 'Border',\n 'drawing.profitColor': 'Target zone color',\n 'drawing.stopColor': 'Stop zone color',\n 'drawing.textColor': 'Text color',\n 'drawing.fontSize': 'Font size',\n 'drawing.size': 'Size',\n 'drawing.width': 'Width',\n 'drawing.opacity': 'Opacity',\n 'drawing.transparency': 'Transparency',\n 'drawing.label': 'Label',\n 'drawing.labels': 'Labels',\n 'drawing.left': 'Left',\n 'drawing.center': 'Center',\n 'drawing.right': 'Right',\n 'drawing.up': 'Up',\n 'drawing.down': 'Down',\n 'drawing.rowVisible': '{name} visible',\n 'drawing.leftEnd': 'Left end',\n 'drawing.rightEnd': 'Right end',\n 'drawing.lineEndNormal': 'Normal',\n 'drawing.lineEndArrow': 'Arrow',\n 'drawing.increase': 'Increase',\n 'drawing.decrease': 'Decrease',\n 'drawing.rangeFrom': 'From',\n 'drawing.rangeTo': 'To',\n 'drawing.pickColor': 'Pick a color',\n 'drawing.extend': 'Extend',\n 'drawing.extendNone': 'Don\\'t extend',\n 'drawing.extendLeft': 'Extend left',\n 'drawing.extendRight': 'Extend right',\n 'drawing.extendBoth': 'Extend both',\n 'drawing.extendLines': 'Extend lines',\n 'drawing.middlePoint': 'Middle point',\n 'drawing.middleLine': 'Middle line',\n 'drawing.priceLabel': 'Price label',\n 'drawing.priceLabels': 'Price labels',\n 'drawing.timeLabel': 'Time label',\n 'drawing.rowStyle': 'Style',\n 'drawing.variantOriginal': 'Original',\n 'drawing.variantSchiff': 'Schiff',\n 'drawing.variantModifiedSchiff': 'Modified Schiff',\n 'drawing.variantInside': 'Inside',\n 'drawing.sectionStats': 'Stats',\n 'drawing.priceChange': 'Price change',\n 'drawing.percentChange': 'Percent change',\n 'drawing.bars': 'Bars',\n 'drawing.dateTimeRange': 'Date/time range',\n 'drawing.volume': 'Volume',\n 'drawing.sectionInfo': 'Info',\n 'drawing.priceRange': 'Price range',\n 'drawing.barsRange': 'Bars range',\n 'drawing.angle': 'Angle',\n 'drawing.statsPosition': 'Stats position',\n 'drawing.direction': 'Direction',\n 'drawing.prices': 'Prices',\n 'drawing.levels': 'Levels',\n 'drawing.reverse': 'Reverse',\n 'drawing.fullCircles': 'Full circles',\n 'drawing.coeffsAsPercents': 'Coeffs as percents',\n 'drawing.glyph': 'Glyph',\n 'drawing.image': 'Image',\n 'drawing.replaceEllipsis': 'Replace...',\n 'drawing.chooseEllipsis': 'Choose...',\n 'drawing.link': 'Link',\n 'drawing.rowsLayout': 'Rows layout',\n 'drawing.rowsByNumber': 'Number of rows',\n 'drawing.ticksPerRow': 'Ticks per row',\n 'drawing.rowSize': 'Row size',\n 'drawing.upDown': 'Up/Down',\n 'drawing.total': 'Total',\n 'drawing.delta': 'Delta',\n 'drawing.valueAreaVolume': 'Value area volume',\n 'drawing.widthPercent': 'Width %',\n 'drawing.placement': 'Placement',\n 'drawing.upDownVolume': 'Up/Down volume',\n 'drawing.valueAreaUpDown': 'Value area up/down',\n 'drawing.pointOfControl': 'Point of control',\n 'drawing.valueAreaHigh': 'Value area high',\n 'drawing.valueAreaLow': 'Value area low',\n 'drawing.developingPoc': 'Developing PoC',\n 'drawing.developingVa': 'Developing VA',\n 'drawing.source': 'Source',\n 'drawing.mode': 'Mode',\n 'drawing.modeLineOpen': 'Line (Open)',\n 'drawing.modeLineHigh': 'Line (High)',\n 'drawing.modeLineLow': 'Line (Low)',\n 'drawing.modeLineClose': 'Line (Close)',\n 'drawing.modeLineHl2': 'Line (HL2)',\n 'drawing.mirrored': 'Mirrored',\n 'drawing.flipped': 'Flipped',\n 'drawing.target': 'Target',\n 'drawing.success': 'Success',\n 'drawing.failure': 'Failure',\n 'drawing.avgHl': 'Avg HL',\n 'drawing.variance': 'Variance',\n 'drawing.body': 'Body',\n 'drawing.borders': 'Borders',\n 'drawing.drawBorders': 'Draw borders',\n 'drawing.wick': 'Wick',\n 'drawing.drawWicks': 'Draw wicks',\n 'drawing.sectionDeviation': 'Deviation',\n 'drawing.upper': 'Upper',\n 'drawing.lower': 'Lower',\n 'drawing.useUpperDeviation': 'Use upper deviation',\n 'drawing.useLowerDeviation': 'Use lower deviation',\n 'drawing.risk': 'Risk',\n 'drawing.accountSize': 'Account size',\n 'drawing.lotSize': 'Lot size',\n 'drawing.leverage': 'Leverage',\n 'drawing.compactStatsMode': 'Compact stats mode',\n 'drawing.levelVisible': 'Level {value} visible',\n 'drawing.levelText': 'Level {value} text',\n 'drawing.removeLevel': 'Remove level {value}',\n 'drawing.addLevel': 'Add level',\n 'drawing.weight': 'Weight',\n 'drawing.bold': 'Bold',\n 'drawing.italic': 'Italic',\n 'drawing.addText': 'Add text',\n 'drawing.alignment': 'Alignment',\n 'drawing.textPlaceholder': 'Text',\n 'drawing.textEditor': 'Drawing text',\n 'drawing.headerRow': 'Header row',\n 'drawing.tableCell': 'Cell {row},{col}',\n 'drawing.addRow': 'Add row',\n 'drawing.removeRow': 'Remove row',\n 'drawing.addColumn': 'Add column',\n 'drawing.removeColumn': 'Remove column',\n 'drawing.coordBar': '#{n} (bar)',\n 'drawing.coordPriceBar': '#{n} (price, bar)',\n 'drawing.unitTicks': 'Ticks',\n 'drawing.unitSeconds': 'Seconds',\n 'drawing.unitMinutes': 'Minutes',\n 'drawing.unitHours': 'Hours',\n 'drawing.unitDays': 'Days',\n 'drawing.unitWeeks': 'Weeks',\n 'drawing.unitMonths': 'Months',\n 'drawing.timeframePinnedNote': 'A drawing stays on at least one timeframe, so it can always be reached again.',\n 'drawing.colorSwatch': 'Color {hex}',\n 'drawing.customColor': 'Custom color',\n 'drawing.saturationValue': 'Saturation and brightness',\n 'drawing.hue': 'Hue',\n 'drawing.hexColor': 'Hex color',\n 'drawing.add': 'Add',\n 'drawing.glyphPicker': 'Glyph picker',\n 'drawing.kindEmojis': 'Emojis',\n 'drawing.kindStickers': 'Stickers',\n 'drawing.kindIcons': 'Icons',\n 'drawing.recentlyUsed': 'Recently used',\n 'drawing.recentGlyph': 'Recent {glyph}',\n 'drawing.stickersSoon': 'No sticker set is installed.',\n 'drawing.glyphCatSmileys': 'Smileys & People',\n 'drawing.glyphCatNature': 'Animals & Nature',\n 'drawing.glyphCatFood': 'Food & Drink',\n 'drawing.glyphCatActivity': 'Activity',\n 'drawing.glyphCatTravel': 'Travel & Places',\n 'drawing.glyphCatObjects': 'Objects',\n 'drawing.glyphCatSymbols': 'Symbols',\n 'drawing.glyphCatFlags': 'Flags',\n 'drawing.glyphCatIconArrows': 'Arrows',\n 'drawing.glyphCatIconCurrency': 'Currency',\n 'drawing.glyphCatIconGestures': 'Gestures and smileys',\n 'drawing.glyphCatIconNature': 'Nature',\n 'drawing.glyphCatIconSpecial': 'Special',\n 'drawing.glyphCatIconSymbols': 'Symbols and flags',\n 'drawing.imageReading': 'Reading...',\n 'drawing.chooseImage': 'Choose image',\n 'drawing.imageFormats': 'JPG or PNG',\n 'drawing.imageMaxSize': 'Max size 2MB',\n 'drawing.imageDimensions': '{width} x {height}',\n 'drawing.imageErrorType': 'That file is not a JPG or PNG. Pick one of those two formats.',\n 'drawing.imageErrorSize': 'That image is {size}. The limit is 2MB.',\n 'drawing.imageErrorRead': 'That file could not be read. Try picking it again.',\n 'drawing.imageErrorDecode': 'That image could not be opened. It may be damaged.',\n}\n","import type { Translation } from '../runtime'\nimport type { command as source } from '../en/command'\n\nexport const command: Translation<typeof source> = {\n 'command.extension': 'Host command',\n 'command.viewReset': 'Reset view',\n 'command.viewGoLive': 'Go to the live edge',\n 'command.viewZoomIn': 'Zoom in',\n 'command.viewZoomOut': 'Zoom out',\n 'command.viewScrollLeft': 'Scroll back',\n 'command.viewScrollRight': 'Scroll forward',\n 'command.priceCopy': 'Copy price',\n 'command.symbolSet': 'Change symbol',\n 'command.styleCandles': 'Candles',\n 'command.styleHollow': 'Hollow candles',\n 'command.styleBars': 'Bars',\n 'command.styleLine': 'Line',\n 'command.styleArea': 'Area',\n 'command.styleBaseline': 'Baseline',\n 'command.styleStepline': 'Step line',\n 'command.appearanceApply': 'Chart appearance',\n 'command.appearanceReset': 'Reset defaults',\n 'command.scaleNormal': 'Regular price scale',\n 'command.scaleLog': 'Logarithmic price scale',\n 'command.scalePercent': 'Percentage price scale',\n 'command.scaleIndexed': 'Indexed price scale',\n 'command.historyUndo': 'Undo',\n 'command.historyRedo': 'Redo',\n 'command.indicatorAdd': 'Add indicator',\n 'command.indicatorUpdate': 'Update indicator',\n 'command.indicatorsRemoveAll': 'Remove indicators',\n 'command.indicatorRemove': 'Remove indicator',\n 'command.indicatorHide': 'Hide indicator',\n 'command.indicatorShow': 'Show indicator',\n 'command.drawingsRemoveAll': 'Remove drawings',\n 'command.drawingDeleteSelected': 'Delete selected drawing',\n 'command.drawingArm': 'Drawing tool',\n 'command.drawingCursor': 'Cursor mode',\n 'command.drawingMagnet': 'Magnet',\n 'command.drawingStayInMode': 'Stay in drawing mode',\n 'command.drawingLockAll': 'Lock all drawings',\n 'command.drawingHide': 'Hide drawings or indicators',\n 'command.drawingSync': 'Sync drawings across the layout',\n 'command.drawingRemoveLockedPolicy': 'Always remove locked drawings',\n 'command.drawingFavorite': 'Favorite drawing tool',\n 'command.drawingFavoritesBar': 'Favorite drawing tools toolbar',\n 'command.drawingStyle': 'Drawing style',\n 'command.drawingProps': 'Drawing properties',\n 'command.drawingLock': 'Lock drawing',\n 'command.drawingClone': 'Clone drawing',\n 'command.drawingCopy': 'Copy drawing',\n 'command.drawingPaste': 'Paste drawing',\n 'command.drawingBringToFront': 'Bring drawing to front',\n 'command.drawingSendToBack': 'Send drawing to back',\n 'command.drawingBringForward': 'Bring drawing forward',\n 'command.drawingSendBackward': 'Send drawing backward',\n 'command.drawingHideSelected': 'Hide drawing',\n 'command.drawingVisibility': 'Drawing visibility on timeframes',\n 'command.drawingSettings': 'Drawing settings',\n 'command.drawingCommitEdit': 'Apply drawing settings',\n 'command.drawingPlaceImage': 'Place image',\n 'command.drawingTemplateApply': 'Apply drawing template',\n 'command.drawingTemplateSave': 'Save drawing template',\n 'command.drawingTemplateRemove': 'Remove drawing template',\n 'command.drawingTableAddRow': 'Add table row',\n 'command.drawingTableAddColumn': 'Add table column',\n 'command.drawingCancel': 'Cancel drawing',\n 'command.compareOpen': 'Compare or add symbol',\n 'command.compareAdd': 'Add comparison',\n 'command.compareRemove': 'Remove comparison',\n 'command.compareVisible': 'Show or hide a comparison',\n 'command.compareChangeSymbol': 'Change compared symbol',\n 'command.replayStart': 'Start bar replay',\n 'command.replayStartFirst': 'Start bar replay at the first available date',\n 'command.replayExit': 'Exit bar replay',\n 'command.replayPlay': 'Play replay',\n 'command.replayPause': 'Pause replay',\n 'command.replayStepForward': 'Step forward',\n 'command.replayStepBack': 'Step back',\n 'command.replayGoLive': 'Replay to the live edge',\n 'command.replaySpeed': 'Replay speed',\n 'command.replayTimeframe': 'Replay update timeframe',\n 'command.timeframeSet': 'Timeframe',\n 'command.subsessionRegular': 'Regular hours',\n 'command.subsessionExtended': 'Extended hours',\n 'command.rangeSet': 'Date range',\n 'command.timezoneSet': 'Timezone',\n 'command.themeLight': 'Light theme',\n 'command.themeDark': 'Dark theme',\n 'command.themeToggle': 'Switch theme',\n 'command.themeSet': 'Set theme',\n 'command.localeSet': 'Language',\n 'command.fullscreenEnter': 'Fullscreen',\n 'command.fullscreenExit': 'Exit fullscreen',\n 'command.fullscreenToggle': 'Toggle fullscreen',\n 'command.imageCapture': 'Capture image',\n 'command.imageDownload': 'Download image',\n 'command.dataDownload': 'Download chart data',\n 'command.imageCopy': 'Copy image',\n 'command.layoutArrangement': 'Layout',\n 'command.layoutActive': 'Active chart',\n 'command.layoutSync': 'Chart synchronization',\n 'command.layoutActivateNext': 'Next chart in layout',\n 'command.layoutActivatePrevious': 'Previous chart in layout',\n 'command.layoutMaximize': 'Maximize or restore the active chart',\n 'command.layoutSave': 'Save layout',\n 'command.layoutRename': 'Rename layout',\n 'command.layoutLoad': 'Open layout',\n 'command.layoutOpen': 'Open layout…',\n 'command.layoutDelete': 'Delete layout',\n 'command.layoutCreate': 'Create new layout',\n 'command.layoutAutosave': 'Autosave layout',\n}\n","import type { Translation } from '../runtime'\nimport type { chrome as source } from '../en/chrome'\n\nexport const chrome: Translation<typeof source> = {\n 'chrome.topBar': 'Chart toolbar',\n 'chrome.bottomBar': 'Chart footer',\n 'chrome.symbolSearch': 'Search symbol',\n 'chrome.compare': 'Compare or add symbol',\n 'chrome.chartStyle': 'Chart style',\n 'chrome.indicators': 'Indicators',\n 'chrome.replay': 'Bar replay',\n 'chrome.replayChip': 'Replay',\n 'chrome.image': 'Chart image',\n 'chrome.session': 'Trading session',\n 'chrome.sessionsHeading': 'Sessions',\n 'chrome.navigation': 'Chart navigation',\n 'chrome.activeChart': '{symbol}, {timeframe}',\n}\n","import type { Translation } from '../runtime'\nimport type { history as source } from '../en/history'\n\nexport const history: Translation<typeof source> = {\n 'history.undoNamed': 'Undo {change}',\n 'history.redoNamed': 'Redo {change}',\n 'history.changeSymbol': 'symbol change',\n 'history.changeTimeframe': 'timeframe change',\n 'history.changeChartStyle': 'chart style change',\n 'history.changePriceScale': 'price scale change',\n 'history.changeAppearance': 'appearance change',\n 'history.changeAddCompare': 'add comparison',\n 'history.changeRemoveCompare': 'remove comparison',\n 'history.changeCompare': 'comparison change',\n 'history.changeAddIndicator': 'add indicator',\n 'history.changeRemoveIndicator': 'remove indicator',\n 'history.changeIndicator': 'indicator change',\n 'history.changeAddDrawing': 'add drawing',\n 'history.changeRemoveDrawing': 'remove drawing',\n 'history.changeDrawing': 'drawing change',\n}\n","import type { Translation } from '../runtime'\nimport type { picker as source } from '../en/picker'\n\nexport const picker: Translation<typeof source> = {\n 'picker.title': 'Indicators',\n 'picker.search': 'Search indicators',\n 'picker.noMatches': 'No matching indicators.',\n 'picker.collections': 'Indicator collections',\n 'picker.personal': 'Personal',\n 'picker.builtin': 'Built-in',\n 'picker.favorites': 'Favorites',\n 'picker.thousands': ' K',\n 'picker.name': 'Name',\n 'picker.author': 'Author',\n 'picker.favorite': 'Favorite {name}',\n 'picker.unfavorite': 'Unfavorite {name}',\n 'picker.loading': 'Loading indicators…',\n 'picker.unavailable': 'Indicator content is unavailable. Try again.',\n 'picker.actionFailed': 'The action could not be completed. Try again.',\n 'picker.add': 'Add {name}',\n 'picker.notPermitted': '{name} is not available here',\n}\n","import type { Translation } from '../runtime'\nimport type { settings as source } from '../en/settings'\n\nexport const settings: Translation<typeof source> = {\n 'settings.menu': 'Chart settings',\n 'settings.sectionAppearance': 'Appearance',\n 'settings.background': 'Background',\n 'settings.upCandles': 'Up candles',\n 'settings.downCandles': 'Down candles',\n 'settings.upBorders': 'Up borders',\n 'settings.downBorders': 'Down borders',\n 'settings.upWicks': 'Up wicks',\n 'settings.downWicks': 'Down wicks',\n 'settings.sectionDisplay': 'Display',\n 'settings.gridLines': 'Grid lines',\n 'settings.sessionShading': 'Session shading',\n 'settings.sectionScale': 'Price scale',\n 'settings.sectionTheme': 'Theme',\n 'settings.indicatorTitle': '{name} settings',\n 'settings.tabInputs': 'Inputs',\n 'settings.tabStyle': 'Style',\n 'settings.tabVisibility': 'Visibility',\n 'settings.plots': 'Plots',\n 'settings.levels': 'Levels',\n 'settings.fills': 'Fills',\n 'settings.colorOf': '{name} color',\n 'settings.lineWidthOf': '{name} line width',\n 'settings.lineStyleOf': '{name} line style',\n 'settings.visibleOf': 'Show {name}',\n 'settings.lineStyleSolid': 'Solid',\n 'settings.lineStyleDashed': 'Dashed',\n 'settings.lineStyleDotted': 'Dotted',\n 'settings.precision': 'Precision',\n 'settings.precisionDefault': 'Default',\n 'settings.labelsOnPriceScale': 'Labels on price scale',\n 'settings.showIndicator': 'Show this indicator',\n}\n","import type { Translation } from '../runtime'\nimport type { toast as source } from '../en/toast'\n\nexport const toast: Translation<typeof source> = {\n 'toast.dismiss': 'Dismiss',\n 'toast.feedUnavailable': 'No data for {symbol} from this feed.',\n 'toast.feedNoData': 'No data for {symbol} yet.',\n 'toast.imageCopyFallback': 'Could not copy the image. Saved a file instead.',\n 'toast.imageFailed': 'Could not capture the chart image.',\n 'toast.indicatorsNotCarried': { zero: '{count} indicators in this saved chart are not available here and were left out.', one: '{count} indicator in this saved chart is not available here and was left out.', two: '{count} indicators in this saved chart are not available here and were left out.', few: '{count} indicators in this saved chart are not available here and were left out.', many: '{count} indicators in this saved chart are not available here and were left out.', other: '{count} indicators in this saved chart are not available here and were left out.' },\n}\n","import type { Translation } from '../runtime'\nimport type { en } from '../en'\nimport { legend } from './legend'\nimport { tools } from './tools'\nimport { menu } from './menu'\nimport { replay } from './replay'\nimport { inputs } from './inputs'\nimport { session } from './session'\nimport { layouts } from './layouts'\nimport { host } from './host'\nimport { indicators } from './indicators'\nimport { timeframe } from './timeframe'\nimport { timezone } from './timezone'\nimport { range } from './range'\nimport { status } from './status'\nimport { search } from './search'\nimport { drawing } from './drawing'\nimport { command } from './command'\nimport { chrome } from './chrome'\nimport { history } from './history'\nimport { picker } from './picker'\nimport { settings } from './settings'\nimport { toast } from './toast'\n\nconst dict: Translation<typeof en> = { ...legend, ...tools, ...menu, ...replay, ...inputs, ...session, ...layouts, ...host, ...indicators, ...timeframe, ...timezone, ...range, ...status, ...search, ...drawing, ...command, ...chrome, ...history, ...picker, ...settings, ...toast }\nexport default dict\n"],"mappings":";AAGO,IAAM,SAAqC;AAAA,EAChD,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,4BAA4B;AAAA,EAC5B,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,0BAA0B;AAC5B;;;ACrBO,IAAM,QAAoC;AAAA,EAC/C,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,8BAA8B;AAAA,EAC9B,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,EACzB,kCAAkC;AAAA,EAClC,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,8BAA8B;AAAA,EAC9B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,mCAAmC;AAAA,EACnC,gCAAgC;AAAA,EAChC,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,6BAA6B;AAAA,EAC7B,gBAAgB;AAClB;;;AC3FO,IAAM,OAAmC;AAAA,EAC9C,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,yBAAyB,EAAE,MAAM,uDAAoB,KAAK,uDAAoB,KAAK,mEAAsB,KAAK,mEAAsB,MAAM,mEAAsB,OAAO,sDAAmB;AAAA,EAC1L,uBAAuB,EAAE,MAAM,iDAAmB,KAAK,iDAAmB,KAAK,6DAAqB,KAAK,uDAAoB,MAAM,6DAAqB,OAAO,gDAAkB;AAAA,EACjL,iBAAiB;AACnB;;;ACPO,IAAM,SAAqC;AAAA,EAChD,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,8BAA8B;AAAA,EAC9B,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,2BAA2B,EAAE,MAAM,8BAA8B,KAAK,6BAA6B,KAAK,8BAA8B,KAAK,8BAA8B,MAAM,8BAA8B,OAAO,6BAA6B;AAAA,EACjP,8BAA8B,EAAE,MAAM,gCAAgC,KAAK,+BAA+B,KAAK,gCAAgC,KAAK,gCAAgC,MAAM,gCAAgC,OAAO,+BAA+B;AAAA,EAChQ,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,8BAA8B;AAChC;;;ACtCO,IAAM,SAAqC;AAAA,EAChD,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;;;ACHO,IAAM,UAAsC;AAAA,EACjD,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,kBAAkB;AACpB;;;ACNO,IAAM,UAAsC;AAAA,EACjD,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,0BAA0B;AAAA,EAC1B,+BAA+B;AAAA,EAC/B,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,4BAA4B;AAAA,EAC5B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,mBAAmB;AACrB;;;AC1HO,IAAM,OAAmC;AAAA,EAC9C,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,kBAAkB;AACpB;;;ACRO,IAAM,aAAyC;AAAA,EACpD,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,kCAAkC;AAAA,EAClC,0BAA0B;AAAA,EAC1B,iCAAiC;AAAA,EACjC,yBAAyB;AAAA,EACzB,gCAAgC;AAAA,EAChC,4BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,4BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,0BAA0B;AAAA,EAC1B,iCAAiC;AAAA,EACjC,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,iCAAiC;AAAA,EACjC,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,+BAA+B;AAAA,EAC/B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,4BAA4B;AAC9B;;;AC/CO,IAAM,YAAwC;AAAA,EACnD,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,wBAAwB,EAAE,MAAM,oCAAgB,KAAK,oCAAgB,KAAK,gDAAkB,KAAK,oCAAgB,MAAM,oCAAgB,OAAO,mCAAe;AAAA,EAC7J,0BAA0B,EAAE,MAAM,0CAAiB,KAAK,0CAAiB,KAAK,sDAAmB,KAAK,oCAAgB,MAAM,0CAAiB,OAAO,yCAAgB;AAAA,EACpK,0BAA0B,EAAE,MAAM,0CAAiB,KAAK,0CAAiB,KAAK,sDAAmB,KAAK,0CAAiB,MAAM,0CAAiB,OAAO,yCAAgB;AAAA,EACrK,wBAAwB,EAAE,MAAM,oCAAgB,KAAK,oCAAgB,KAAK,gDAAkB,KAAK,0CAAiB,MAAM,oCAAgB,OAAO,mCAAe;AAAA,EAC9J,uBAAuB,EAAE,MAAM,8BAAe,KAAK,8BAAe,KAAK,0CAAiB,KAAK,oCAAgB,MAAM,0CAAiB,OAAO,6BAAc;AAAA,EACzJ,wBAAwB,EAAE,MAAM,0CAAiB,KAAK,0CAAiB,KAAK,sDAAmB,KAAK,gDAAkB,MAAM,sDAAmB,OAAO,yCAAgB;AAAA,EACtK,yBAAyB,EAAE,MAAM,8BAAe,KAAK,8BAAe,KAAK,0CAAiB,KAAK,oCAAgB,MAAM,0CAAiB,OAAO,6BAAc;AAAA,EAC3J,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AACzB;;;AC1BO,IAAM,WAAuC;AAAA,EAClD,kBAAkB;AAAA,EAClB,qBAAqB;AACvB;;;ACHO,IAAM,QAAoC;AAAA,EAC/C,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,sBAAsB;AACxB;;;AClBO,IAAM,SAAqC;AAAA,EAChD,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,uBAAuB,EAAE,MAAM,8BAAe,KAAK,8BAAe,KAAK,0CAAiB,KAAK,oCAAgB,MAAM,0CAAiB,OAAO,6BAAc;AAAA,EACzJ,wBAAwB,EAAE,MAAM,oCAAgB,KAAK,oCAAgB,KAAK,gDAAkB,KAAK,0CAAiB,MAAM,oCAAgB,OAAO,mCAAe;AAAA,EAC9J,0BAA0B,EAAE,MAAM,0CAAiB,KAAK,0CAAiB,KAAK,sDAAmB,KAAK,0CAAiB,MAAM,0CAAiB,OAAO,yCAAgB;AAAA,EACrK,uBAAuB;AACzB;;;AC3BO,IAAM,SAAqC;AAAA,EAChD,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,cAAc;AAChB;;;AC7BO,IAAM,UAAsC;AAAA,EACjD,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,gCAAgC;AAAA,EAChC,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,8BAA8B;AAAA,EAC9B,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,yBAAyB,EAAE,MAAM,oBAAoB,KAAK,mBAAmB,KAAK,oBAAoB,KAAK,oBAAoB,MAAM,oBAAoB,OAAO,mBAAmB;AAAA,EACnL,2BAA2B,EAAE,MAAM,sBAAsB,KAAK,qBAAqB,KAAK,sBAAsB,KAAK,sBAAsB,MAAM,sBAAsB,OAAO,qBAAqB;AAAA,EACjM,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,8BAA8B;AAAA,EAC9B,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,gCAAgC;AAAA,EAChC,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,kCAAkC;AAAA,EAClC,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,kCAAkC;AAAA,EAClC,iCAAiC;AAAA,EACjC,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,8BAA8B;AAAA,EAC9B,8BAA8B;AAAA,EAC9B,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,8BAA8B;AAAA,EAC9B,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,EACzB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,iCAAiC;AAAA,EACjC,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,yBAAyB;AAAA,EACzB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,+BAA+B;AAAA,EAC/B,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,gCAAgC;AAAA,EAChC,gCAAgC;AAAA,EAChC,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,4BAA4B;AAC9B;;;AC1TO,IAAM,UAAsC;AAAA,EACjD,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,iCAAiC;AAAA,EACjC,sBAAsB;AAAA,EACtB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,2BAA2B;AAAA,EAC3B,+BAA+B;AAAA,EAC/B,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,+BAA+B;AAAA,EAC/B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,gCAAgC;AAAA,EAChC,+BAA+B;AAAA,EAC/B,iCAAiC;AAAA,EACjC,8BAA8B;AAAA,EAC9B,iCAAiC;AAAA,EACjC,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,yBAAyB;AAAA,EACzB,0BAA0B;AAAA,EAC1B,+BAA+B;AAAA,EAC/B,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,kCAAkC;AAAA,EAClC,0BAA0B;AAAA,EAC1B,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,0BAA0B;AAC5B;;;AC7GO,IAAM,SAAqC;AAAA,EAChD,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,sBAAsB;AACxB;;;ACdO,IAAM,UAAsC;AAAA,EACjD,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,+BAA+B;AAAA,EAC/B,yBAAyB;AAAA,EACzB,8BAA8B;AAAA,EAC9B,iCAAiC;AAAA,EACjC,2BAA2B;AAAA,EAC3B,4BAA4B;AAAA,EAC5B,+BAA+B;AAAA,EAC/B,yBAAyB;AAC3B;;;ACjBO,IAAM,SAAqC;AAAA,EAChD,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,cAAc;AAAA,EACd,uBAAuB;AACzB;;;AClBO,IAAM,WAAuC;AAAA,EAClD,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,0BAA0B;AAC5B;;;ACjCO,IAAM,QAAoC;AAAA,EAC/C,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,8BAA8B,EAAE,MAAM,oFAAoF,KAAK,iFAAiF,KAAK,oFAAoF,KAAK,oFAAoF,MAAM,oFAAoF,OAAO,mFAAmF;AACxjB;;;ACcA,IAAM,OAA+B,EAAE,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM;AACtR,IAAO,aAAQ;","names":[]}